mirror of
https://github.com/torvalds/linux.git
synced 2024-11-23 04:31:50 +00:00
bcachefs: Fix for 'missing subvolume' error
Subvolumes, including their root inodes, get deleted asynchronously after an unlink. But we still need to ensure that we tell the VFS the inode has been deleted, otherwise VFS writeback could fire after asynchronous deletion has finished, and try to write to an inode/subvolume that no longer exists. Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
This commit is contained in:
parent
56cc033dfc
commit
2d33036ca9
@ -442,19 +442,27 @@ int __bch2_unlink(struct inode *vdir, struct dentry *dentry,
|
||||
bch2_trans_init(&trans, c, 4, 1024);
|
||||
|
||||
ret = commit_do(&trans, NULL, NULL,
|
||||
BTREE_INSERT_NOFAIL,
|
||||
bch2_unlink_trans(&trans,
|
||||
inode_inum(dir), &dir_u,
|
||||
&inode_u, &dentry->d_name,
|
||||
deleting_snapshot));
|
||||
BTREE_INSERT_NOFAIL,
|
||||
bch2_unlink_trans(&trans,
|
||||
inode_inum(dir), &dir_u,
|
||||
&inode_u, &dentry->d_name,
|
||||
deleting_snapshot));
|
||||
if (unlikely(ret))
|
||||
goto err;
|
||||
|
||||
if (likely(!ret)) {
|
||||
bch2_inode_update_after_write(&trans, dir, &dir_u,
|
||||
ATTR_MTIME|ATTR_CTIME);
|
||||
bch2_inode_update_after_write(&trans, inode, &inode_u,
|
||||
ATTR_MTIME);
|
||||
bch2_inode_update_after_write(&trans, dir, &dir_u,
|
||||
ATTR_MTIME|ATTR_CTIME);
|
||||
bch2_inode_update_after_write(&trans, inode, &inode_u,
|
||||
ATTR_MTIME);
|
||||
|
||||
if (inode_u.bi_subvol) {
|
||||
/*
|
||||
* Subvolume deletion is asynchronous, but we still want to tell
|
||||
* the VFS that it's been deleted here:
|
||||
*/
|
||||
set_nlink(&inode->v, 0);
|
||||
}
|
||||
|
||||
err:
|
||||
bch2_trans_exit(&trans);
|
||||
bch2_unlock_inodes(INODE_UPDATE_LOCK, dir, inode);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user