Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 61295eb8 authored by Chris Mason's avatar Chris Mason
Browse files

Btrfs: Add drop inode func to avoid data=ordered deadlock

parent 8c416c9e
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -1144,6 +1144,7 @@ int btrfs_check_free_space(struct btrfs_root *root, u64 num_required,
int btrfs_page_mkwrite(struct vm_area_struct *vma, struct page *page);
int btrfs_readpage(struct file *file, struct page *page);
void btrfs_delete_inode(struct inode *inode);
void btrfs_drop_inode(struct inode *inode);
void btrfs_read_locked_inode(struct inode *inode);
int btrfs_write_inode(struct inode *inode, int wait);
void btrfs_dirty_inode(struct inode *inode);
+19 −0
Original line number Diff line number Diff line
@@ -990,6 +990,25 @@ static int btrfs_setattr(struct dentry *dentry, struct iattr *attr)
fail:
	return err;
}

void btrfs_drop_inode(struct inode *inode)
{
	struct btrfs_trans_handle *trans;
	struct btrfs_root *root = BTRFS_I(inode)->root;

	if (!BTRFS_I(inode)->ordered_trans) {
		generic_drop_inode(inode);
		return;
	}
	/* nasty, but it prevents a deadlock with data=ordered by preventing
	 * a commit until after this inode is done
	 */
	trans = btrfs_start_transaction(root, 1);
	generic_drop_inode(inode);
	/* note, the inode is now untouchable */
	btrfs_end_transaction(trans, root);
}

void btrfs_delete_inode(struct inode *inode)
{
	struct btrfs_trans_handle *trans;
+1 −0
Original line number Diff line number Diff line
@@ -425,6 +425,7 @@ static struct file_system_type btrfs_fs_type = {

static struct super_operations btrfs_super_ops = {
	.delete_inode	= btrfs_delete_inode,
	.drop_inode	= btrfs_drop_inode,
	.put_super	= btrfs_put_super,
	.read_inode	= btrfs_read_locked_inode,
	.write_super	= btrfs_write_super,