fsnotify: move fsnotify_nameremove() hook out of d_delete()
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>
This commit is contained in:
Родитель
6146e78c03
Коммит
49246466a9
|
@ -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))
|
if (test_bit(AFS_VNODE_DIR_VALID, &dvnode->flags))
|
||||||
afs_edit_dir_add(dvnode, &new->d_name,
|
afs_edit_dir_add(dvnode, &new->d_name,
|
||||||
&vnode->fid, afs_edit_dir_for_silly_1);
|
&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);
|
kfree(scb);
|
||||||
|
|
|
@ -2372,7 +2372,6 @@ EXPORT_SYMBOL(d_hash_and_lookup);
|
||||||
void d_delete(struct dentry * dentry)
|
void d_delete(struct dentry * dentry)
|
||||||
{
|
{
|
||||||
struct inode *inode = dentry->d_inode;
|
struct inode *inode = dentry->d_inode;
|
||||||
int isdir = d_is_dir(dentry);
|
|
||||||
|
|
||||||
spin_lock(&inode->i_lock);
|
spin_lock(&inode->i_lock);
|
||||||
spin_lock(&dentry->d_lock);
|
spin_lock(&dentry->d_lock);
|
||||||
|
@ -2387,7 +2386,6 @@ void d_delete(struct dentry * dentry)
|
||||||
spin_unlock(&dentry->d_lock);
|
spin_unlock(&dentry->d_lock);
|
||||||
spin_unlock(&inode->i_lock);
|
spin_unlock(&inode->i_lock);
|
||||||
}
|
}
|
||||||
fsnotify_nameremove(dentry, isdir);
|
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(d_delete);
|
EXPORT_SYMBOL(d_delete);
|
||||||
|
|
||||||
|
|
|
@ -396,12 +396,6 @@ nfs_complete_sillyrename(struct rpc_task *task, struct nfs_renamedata *data)
|
||||||
nfs_cancel_async_unlink(dentry);
|
nfs_cancel_async_unlink(dentry);
|
||||||
return;
|
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"
|
#define SILLYNAME_PREFIX ".nfs"
|
||||||
|
|
|
@ -199,6 +199,7 @@ static inline void fsnotify_unlink(struct inode *dir, struct dentry *dentry)
|
||||||
WARN_ON_ONCE(d_is_negative(dentry));
|
WARN_ON_ONCE(d_is_negative(dentry));
|
||||||
|
|
||||||
/* TODO: call fsnotify_dirent() */
|
/* 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));
|
WARN_ON_ONCE(d_is_negative(dentry));
|
||||||
|
|
||||||
/* TODO: call fsnotify_dirent() */
|
/* TODO: call fsnotify_dirent() */
|
||||||
|
fsnotify_nameremove(dentry, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Загрузка…
Ссылка в новой задаче