fsnotify: move fsnotify_nameremove() hook out of d_delete()
authorAmir Goldstein <amir73il@gmail.com>
Sun, 26 May 2019 14:34:10 +0000 (17:34 +0300)
committerJan Kara <jack@suse.cz>
Thu, 20 Jun 2019 12:47:44 +0000 (14:47 +0200)
d_delete() was piggy backed for the fsnotify_nameremove() hook when
in fact not all callers of d_delete() care about fsnotify events.

For all callers of d_delete() that may be interested in fsnotify events,
we made sure to call one of fsnotify_{unlink,rmdir}() hooks before
calling d_delete().

Now we can move the fsnotify_nameremove() call from d_delete() to the
fsnotify_{unlink,rmdir}() hooks.

Two explicit calls to fsnotify_nameremove() from nfs/afs sillyrename
are also removed. This will cause a change of behavior - nfs/afs will
NOT generate an fsnotify delete event when renaming over a positive
dentry.  This change is desirable, because it is consistent with the
behavior of all other filesystems.

Signed-off-by: Amir Goldstein <amir73il@gmail.com>
Signed-off-by: Jan Kara <jack@suse.cz>
fs/afs/dir_silly.c
fs/dcache.c
fs/nfs/unlink.c
include/linux/fsnotify.h

index 057b8d3..361088a 100644 (file)
@@ -60,11 +60,6 @@ static int afs_do_silly_rename(struct afs_vnode *dvnode, struct afs_vnode *vnode
                if (test_bit(AFS_VNODE_DIR_VALID, &dvnode->flags))
                        afs_edit_dir_add(dvnode, &new->d_name,
                                         &vnode->fid, afs_edit_dir_for_silly_1);
-
-               /* vfs_unlink and the like do not issue this when a file is
-                * sillyrenamed, so do it here.
-                */
-               fsnotify_nameremove(old, 0);
        }
 
        kfree(scb);
index c435398..f41121e 100644 (file)
@@ -2372,7 +2372,6 @@ EXPORT_SYMBOL(d_hash_and_lookup);
 void d_delete(struct dentry * dentry)
 {
        struct inode *inode = dentry->d_inode;
-       int isdir = d_is_dir(dentry);
 
        spin_lock(&inode->i_lock);
        spin_lock(&dentry->d_lock);
@@ -2387,7 +2386,6 @@ void d_delete(struct dentry * dentry)
                spin_unlock(&dentry->d_lock);
                spin_unlock(&inode->i_lock);
        }
-       fsnotify_nameremove(dentry, isdir);
 }
 EXPORT_SYMBOL(d_delete);
 
index 52d5339..0effeee 100644 (file)
@@ -396,12 +396,6 @@ nfs_complete_sillyrename(struct rpc_task *task, struct nfs_renamedata *data)
                nfs_cancel_async_unlink(dentry);
                return;
        }
-
-       /*
-        * vfs_unlink and the like do not issue this when a file is
-        * sillyrenamed, so do it here.
-        */
-       fsnotify_nameremove(dentry, 0);
 }
 
 #define SILLYNAME_PREFIX ".nfs"
index 7f23edd..0145073 100644 (file)
@@ -199,6 +199,7 @@ static inline void fsnotify_unlink(struct inode *dir, struct dentry *dentry)
        WARN_ON_ONCE(d_is_negative(dentry));
 
        /* TODO: call fsnotify_dirent() */
+       fsnotify_nameremove(dentry, 0);
 }
 
 /*
@@ -222,6 +223,7 @@ static inline void fsnotify_rmdir(struct inode *dir, struct dentry *dentry)
        WARN_ON_ONCE(d_is_negative(dentry));
 
        /* TODO: call fsnotify_dirent() */
+       fsnotify_nameremove(dentry, 1);
 }
 
 /*