bcachefs: unlock parent dir if entry is not found in subvolume deletion
Parent dir is locked by user_path_locked_at() before validating the required dentry. It should be unlocked if we can not perform the deletion. This fixes the problem: $ bcachefs subvolume delete not-exist-entry BCH_IOCTL_SUBVOLUME_DESTROY ioctl error: No such file or directory $ bcachefs subvolume delete not-exist-entry the second will stuck because the parent dir is locked in the previous deletion. Signed-off-by: Guoyu Ou <benogy@gmail.com> Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
This commit is contained in:
parent
eba38cc757
commit
6bb3f7f4c3
@ -455,6 +455,7 @@ static long bch2_ioctl_subvolume_destroy(struct bch_fs *c, struct file *filp,
|
||||
if (IS_ERR(victim))
|
||||
return PTR_ERR(victim);
|
||||
|
||||
dir = d_inode(path.dentry);
|
||||
if (victim->d_sb->s_fs_info != c) {
|
||||
ret = -EXDEV;
|
||||
goto err;
|
||||
@ -463,14 +464,13 @@ static long bch2_ioctl_subvolume_destroy(struct bch_fs *c, struct file *filp,
|
||||
ret = -ENOENT;
|
||||
goto err;
|
||||
}
|
||||
dir = d_inode(path.dentry);
|
||||
ret = __bch2_unlink(dir, victim, true);
|
||||
if (!ret) {
|
||||
fsnotify_rmdir(dir, victim);
|
||||
d_delete(victim);
|
||||
}
|
||||
inode_unlock(dir);
|
||||
err:
|
||||
inode_unlock(dir);
|
||||
dput(victim);
|
||||
path_put(&path);
|
||||
return ret;
|
||||
|
Loading…
Reference in New Issue
Block a user