Skip to content

Commit

Permalink
fsnotify: move fsnotify_nameremove() hook out of d_delete()
Browse files Browse the repository at this point in the history
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 <[email protected]>
Signed-off-by: Jan Kara <[email protected]>
  • Loading branch information
amir73il authored and jankara committed Jun 20, 2019
1 parent 6146e78 commit 4924646
Show file tree
Hide file tree
Showing 4 changed files with 2 additions and 13 deletions.
5 changes: 0 additions & 5 deletions fs/afs/dir_silly.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
2 changes: 0 additions & 2 deletions fs/dcache.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -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);

Expand Down
6 changes: 0 additions & 6 deletions fs/nfs/unlink.c
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down
2 changes: 2 additions & 0 deletions include/linux/fsnotify.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}

/*
Expand All @@ -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);
}

/*
Expand Down

0 comments on commit 4924646

Please sign in to comment.