• Jim Somerville's avatar
    inotify: remove broken mask checks causing unmount to be EINVAL · 676a0675
    Jim Somerville authored
    Running the command:
    
    	inotifywait -e unmount /mnt/disk
    
    immediately aborts with a -EINVAL return code.  This is however a valid
    parameter.  This abort occurs only if unmount is the sole event
    parameter.  If other event parameters are supplied, then the unmount
    event wait will work.
    
    The problem was introduced by commit 44b350fc ("inotify: Fix mask
    checks").  In that commit, it states:
    
    	The mask checks in inotify_update_existing_watch() and
    	inotify_new_watch() are useless because inotify_arg_to_mask()
    	sets FS_IN_IGNORED and FS_EVENT_ON_CHILD bits anyway.
    
    But instead of removing the useless checks, it did this:
    
    	        mask = inotify_arg_to_mask(arg);
    	-       if (unlikely(!mask))
    	+       if (unlikely(!(mask & IN_ALL_EVENTS)))
    	                return -EINVAL;
    
    The problem is that IN_ALL_EVENTS doesn't include IN_UNMOUNT, and other
    parts of the code keep IN_UNMOUNT separate from IN_ALL_EVENTS.  So the
    check should be:
    
    	if (unlikely(!(mask & (IN_ALL_EVENTS | IN_UNMOUNT))))
    
    But inotify_arg_to_mask(arg) always sets the IN_UNMOUNT bit in the mask
    anyway, so the check is always going to pass and thus should simply be
    removed.  Also note that inotify_arg_to_mask completely controls what
    mask bits get set from arg, there's no way for invalid bits to get
    enabled there.
    
    Lets fix it by simply removing the useless broken checks.
    Signed-off-by: default avatarJim Somerville <Jim.Somerville@windriver.com>
    Signed-off-by: default avatarPaul Gortmaker <paul.gortmaker@windriver.com>
    Cc: Jerome Marchand <jmarchan@redhat.com>
    Cc: John McCutchan <john@johnmccutchan.com>
    Cc: Robert Love <rlove@rlove.org>
    Cc: Eric Paris <eparis@parisplace.org>
    Cc: <stable@vger.kernel.org>		[2.6.37+]
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    676a0675
inotify_user.c 21.8 KB