• NeilBrown's avatar
    vfs: generate FS_CREATE before FS_OPEN when ->atomic_open used. · 7d1cf5e6
    NeilBrown authored
    When a file is opened and created with open(..., O_CREAT) we get
    both the CREATE and OPEN fsnotify events and would expect them in that
    order.   For most filesystems we get them in that order because
    open_last_lookups() calls fsnofify_create() and then do_open() (from
    path_openat()) calls vfs_open()->do_dentry_open() which calls
    fsnotify_open().
    
    However when ->atomic_open is used, the
       do_dentry_open() -> fsnotify_open()
    call happens from finish_open() which is called from the ->atomic_open
    handler in lookup_open() which is called *before* open_last_lookups()
    calls fsnotify_create.  So we get the "open" notification before
    "create" - which is backwards.  ltp testcase inotify02 tests this and
    reports the inconsistency.
    
    This patch lifts the fsnotify_open() call out of do_dentry_open() and
    places it higher up the call stack.  There are three callers of
    do_dentry_open().
    
    For vfs_open() and kernel_file_open() the fsnotify_open() is placed
    directly in that caller so there should be no behavioural change.
    
    For finish_open() there are two cases:
     - finish_open is used in ->atomic_open handlers.  For these we add a
       call to fsnotify_open() at open_last_lookups() if FMODE_OPENED is
       set - which means do_dentry_open() has been called.
     - finish_open is used in ->tmpfile() handlers.  For these a similar
       call to fsnotify_open() is added to vfs_tmpfile()
    
    With this patch NFSv3 is restored to its previous behaviour (before
    ->atomic_open support was added) of generating CREATE notifications
    before OPEN, and NFSv4 now has that same correct ordering that is has
    not had before.  I haven't tested other filesystems.
    
    Fixes: 7c6c5249 ("NFS: add atomic_open for NFSv3 to handle O_TRUNC correctly.")
    Reported-by: default avatarJames Clark <james.clark@arm.com>
    Closes: https://lore.kernel.org/all/01c3bf2e-eb1f-4b7f-a54f-d2a05dd3d8c8@arm.comSigned-off-by: default avatarNeilBrown <neilb@suse.de>
    Link: https://lore.kernel.org/r/171817619547.14261.975798725161704336@noble.neil.brown.name
    Fixes: 7b8c9d7b ("fsnotify: move fsnotify_open() hook into do_dentry_open()")
    Tested-by: default avatarJames Clark <james.clark@arm.com>
    Signed-off-by: default avatarJan Kara <jack@suse.cz>
    Link: https://lore.kernel.org/r/20240617162303.1596-2-jack@suse.czReviewed-by: default avatarAmir Goldstein <amir73il@gmail.com>
    Signed-off-by: default avatarChristian Brauner <brauner@kernel.org>
    7d1cf5e6
namei.c 140 KB