forked from Minki/linux
\n
-----BEGIN PGP SIGNATURE----- iQEzBAABCAAdFiEEq1nRK9aeMoq1VSgcnJ2qBz9kQNkFAmHz0QsACgkQnJ2qBz9k QNkN+AgA6XqWHKYyElfgJFt1UqaoNMz/Faz9H/+PKiBNSTf6/+67D+V7DFz6jJrv dDwHNzfDg9kR+pbAAPwhl2jfnQoUlsr019Hrqa5HpWlj5geVpbdunYUzS2WOkwqD /m+brcLgPdKb2uIysj6wOh9B7wa8V9ksl3EjQvvwaHaU0p1YLUqidVXucYvs8DUo bgXNaj9GmeysxnmU+aILotWuuXH2vOP4Q2Uk4qz3rN6xW9eEXtpQ4y7gWBp/GA8y Ia8FtFdQdvlSDOJYMdPOTBu5RB7gY9ElrapvVaWNYtCWI/jRv666nZsLaERYNhLN uUsG4MWjYbOqW5XqFDbSOwbDqvMh5Q== =mEFA -----END PGP SIGNATURE----- Merge tag 'fsnotify_for_v5.17-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/jack/linux-fs Pull fsnotify fixes from Jan Kara: "Fixes for userspace breakage caused by fsnotify changes ~3 years ago and one fanotify cleanup" * tag 'fsnotify_for_v5.17-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/jack/linux-fs: fsnotify: fix fsnotify hooks in pseudo filesystems fsnotify: invalidate dcache before IN_DELETE event fanotify: remove variable set but not used
This commit is contained in:
commit
4897e722b5
@ -3152,10 +3152,8 @@ static noinline int btrfs_ioctl_snap_destroy(struct file *file,
|
||||
btrfs_inode_lock(inode, 0);
|
||||
err = btrfs_delete_subvolume(dir, dentry);
|
||||
btrfs_inode_unlock(inode, 0);
|
||||
if (!err) {
|
||||
fsnotify_rmdir(dir, dentry);
|
||||
d_delete(dentry);
|
||||
}
|
||||
if (!err)
|
||||
d_delete_notify(dir, dentry);
|
||||
|
||||
out_dput:
|
||||
dput(dentry);
|
||||
|
@ -1780,8 +1780,8 @@ void configfs_unregister_group(struct config_group *group)
|
||||
configfs_detach_group(&group->cg_item);
|
||||
d_inode(dentry)->i_flags |= S_DEAD;
|
||||
dont_mount(dentry);
|
||||
d_drop(dentry);
|
||||
fsnotify_rmdir(d_inode(parent), dentry);
|
||||
d_delete(dentry);
|
||||
inode_unlock(d_inode(parent));
|
||||
|
||||
dput(dentry);
|
||||
@ -1922,10 +1922,10 @@ void configfs_unregister_subsystem(struct configfs_subsystem *subsys)
|
||||
configfs_detach_group(&group->cg_item);
|
||||
d_inode(dentry)->i_flags |= S_DEAD;
|
||||
dont_mount(dentry);
|
||||
fsnotify_rmdir(d_inode(root), dentry);
|
||||
inode_unlock(d_inode(dentry));
|
||||
|
||||
d_delete(dentry);
|
||||
d_drop(dentry);
|
||||
fsnotify_rmdir(d_inode(root), dentry);
|
||||
|
||||
inode_unlock(d_inode(root));
|
||||
|
||||
|
@ -621,8 +621,8 @@ void devpts_pty_kill(struct dentry *dentry)
|
||||
|
||||
dentry->d_fsdata = NULL;
|
||||
drop_nlink(dentry->d_inode);
|
||||
fsnotify_unlink(d_inode(dentry->d_parent), dentry);
|
||||
d_drop(dentry);
|
||||
fsnotify_unlink(d_inode(dentry->d_parent), dentry);
|
||||
dput(dentry); /* d_alloc_name() in devpts_pty_new() */
|
||||
}
|
||||
|
||||
|
10
fs/namei.c
10
fs/namei.c
@ -4024,13 +4024,12 @@ int vfs_rmdir(struct user_namespace *mnt_userns, struct inode *dir,
|
||||
dentry->d_inode->i_flags |= S_DEAD;
|
||||
dont_mount(dentry);
|
||||
detach_mounts(dentry);
|
||||
fsnotify_rmdir(dir, dentry);
|
||||
|
||||
out:
|
||||
inode_unlock(dentry->d_inode);
|
||||
dput(dentry);
|
||||
if (!error)
|
||||
d_delete(dentry);
|
||||
d_delete_notify(dir, dentry);
|
||||
return error;
|
||||
}
|
||||
EXPORT_SYMBOL(vfs_rmdir);
|
||||
@ -4152,7 +4151,6 @@ int vfs_unlink(struct user_namespace *mnt_userns, struct inode *dir,
|
||||
if (!error) {
|
||||
dont_mount(dentry);
|
||||
detach_mounts(dentry);
|
||||
fsnotify_unlink(dir, dentry);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -4160,9 +4158,11 @@ out:
|
||||
inode_unlock(target);
|
||||
|
||||
/* We don't d_delete() NFS sillyrenamed files--they still exist. */
|
||||
if (!error && !(dentry->d_flags & DCACHE_NFSFS_RENAMED)) {
|
||||
if (!error && dentry->d_flags & DCACHE_NFSFS_RENAMED) {
|
||||
fsnotify_unlink(dir, dentry);
|
||||
} else if (!error) {
|
||||
fsnotify_link_count(target);
|
||||
d_delete(dentry);
|
||||
d_delete_notify(dir, dentry);
|
||||
}
|
||||
|
||||
return error;
|
||||
|
@ -1247,7 +1247,8 @@ static void nfsdfs_remove_file(struct inode *dir, struct dentry *dentry)
|
||||
clear_ncl(d_inode(dentry));
|
||||
dget(dentry);
|
||||
ret = simple_unlink(dir, dentry);
|
||||
d_delete(dentry);
|
||||
d_drop(dentry);
|
||||
fsnotify_unlink(dir, dentry);
|
||||
dput(dentry);
|
||||
WARN_ON_ONCE(ret);
|
||||
}
|
||||
@ -1338,8 +1339,8 @@ void nfsd_client_rmdir(struct dentry *dentry)
|
||||
dget(dentry);
|
||||
ret = simple_rmdir(dir, dentry);
|
||||
WARN_ON_ONCE(ret);
|
||||
d_drop(dentry);
|
||||
fsnotify_rmdir(dir, dentry);
|
||||
d_delete(dentry);
|
||||
dput(dentry);
|
||||
inode_unlock(dir);
|
||||
}
|
||||
|
@ -158,7 +158,6 @@ static size_t fanotify_event_len(unsigned int info_mode,
|
||||
struct fanotify_event *event)
|
||||
{
|
||||
size_t event_len = FAN_EVENT_METADATA_LEN;
|
||||
struct fanotify_info *info;
|
||||
int fh_len;
|
||||
int dot_len = 0;
|
||||
|
||||
@ -168,8 +167,6 @@ static size_t fanotify_event_len(unsigned int info_mode,
|
||||
if (fanotify_is_error_event(event->mask))
|
||||
event_len += FANOTIFY_ERROR_INFO_LEN;
|
||||
|
||||
info = fanotify_event_info(event);
|
||||
|
||||
if (fanotify_event_has_any_dir_fh(event)) {
|
||||
event_len += fanotify_dir_name_info_len(event);
|
||||
} else if ((info_mode & FAN_REPORT_NAME) &&
|
||||
|
@ -224,6 +224,43 @@ static inline void fsnotify_link(struct inode *dir, struct inode *inode,
|
||||
dir, &new_dentry->d_name, 0);
|
||||
}
|
||||
|
||||
/*
|
||||
* fsnotify_delete - @dentry was unlinked and unhashed
|
||||
*
|
||||
* Caller must make sure that dentry->d_name is stable.
|
||||
*
|
||||
* Note: unlike fsnotify_unlink(), we have to pass also the unlinked inode
|
||||
* as this may be called after d_delete() and old_dentry may be negative.
|
||||
*/
|
||||
static inline void fsnotify_delete(struct inode *dir, struct inode *inode,
|
||||
struct dentry *dentry)
|
||||
{
|
||||
__u32 mask = FS_DELETE;
|
||||
|
||||
if (S_ISDIR(inode->i_mode))
|
||||
mask |= FS_ISDIR;
|
||||
|
||||
fsnotify_name(mask, inode, FSNOTIFY_EVENT_INODE, dir, &dentry->d_name,
|
||||
0);
|
||||
}
|
||||
|
||||
/**
|
||||
* d_delete_notify - delete a dentry and call fsnotify_delete()
|
||||
* @dentry: The dentry to delete
|
||||
*
|
||||
* This helper is used to guaranty that the unlinked inode cannot be found
|
||||
* by lookup of this name after fsnotify_delete() event has been delivered.
|
||||
*/
|
||||
static inline void d_delete_notify(struct inode *dir, struct dentry *dentry)
|
||||
{
|
||||
struct inode *inode = d_inode(dentry);
|
||||
|
||||
ihold(inode);
|
||||
d_delete(dentry);
|
||||
fsnotify_delete(dir, inode, dentry);
|
||||
iput(inode);
|
||||
}
|
||||
|
||||
/*
|
||||
* fsnotify_unlink - 'name' was unlinked
|
||||
*
|
||||
@ -231,10 +268,10 @@ static inline void fsnotify_link(struct inode *dir, struct inode *inode,
|
||||
*/
|
||||
static inline void fsnotify_unlink(struct inode *dir, struct dentry *dentry)
|
||||
{
|
||||
/* Expected to be called before d_delete() */
|
||||
WARN_ON_ONCE(d_is_negative(dentry));
|
||||
if (WARN_ON_ONCE(d_is_negative(dentry)))
|
||||
return;
|
||||
|
||||
fsnotify_dirent(dir, dentry, FS_DELETE);
|
||||
fsnotify_delete(dir, d_inode(dentry), dentry);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -258,10 +295,10 @@ static inline void fsnotify_mkdir(struct inode *dir, struct dentry *dentry)
|
||||
*/
|
||||
static inline void fsnotify_rmdir(struct inode *dir, struct dentry *dentry)
|
||||
{
|
||||
/* Expected to be called before d_delete() */
|
||||
WARN_ON_ONCE(d_is_negative(dentry));
|
||||
if (WARN_ON_ONCE(d_is_negative(dentry)))
|
||||
return;
|
||||
|
||||
fsnotify_dirent(dir, dentry, FS_DELETE | FS_ISDIR);
|
||||
fsnotify_delete(dir, d_inode(dentry), dentry);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -600,9 +600,9 @@ static int __rpc_rmdir(struct inode *dir, struct dentry *dentry)
|
||||
|
||||
dget(dentry);
|
||||
ret = simple_rmdir(dir, dentry);
|
||||
d_drop(dentry);
|
||||
if (!ret)
|
||||
fsnotify_rmdir(dir, dentry);
|
||||
d_delete(dentry);
|
||||
dput(dentry);
|
||||
return ret;
|
||||
}
|
||||
@ -613,9 +613,9 @@ static int __rpc_unlink(struct inode *dir, struct dentry *dentry)
|
||||
|
||||
dget(dentry);
|
||||
ret = simple_unlink(dir, dentry);
|
||||
d_drop(dentry);
|
||||
if (!ret)
|
||||
fsnotify_unlink(dir, dentry);
|
||||
d_delete(dentry);
|
||||
dput(dentry);
|
||||
return ret;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user