Skip to content

Commit

Permalink
Btrfs: avoid ENOSPC errors in btrfs_dirty_inode
Browse files Browse the repository at this point in the history
btrfs_dirty_inode tries to sneak in without much waiting or
space reservation, mostly for performance reasons.  This
usually works well but can cause problems when there are
many many writers.

When btrfs_update_inode fails with ENOSPC, we fallback
to a slower btrfs_start_transaction call that will reserve
some space.

Signed-off-by: Chris Mason <chris.mason@oracle.com>
  • Loading branch information
Chris Mason committed May 26, 2010
1 parent 3f7c579 commit 94b6044
Showing 1 changed file with 11 additions and 3 deletions.
14 changes: 11 additions & 3 deletions fs/btrfs/inode.c
Original file line number Diff line number Diff line change
Expand Up @@ -4308,10 +4308,18 @@ void btrfs_dirty_inode(struct inode *inode)
btrfs_set_trans_block_group(trans, inode);

ret = btrfs_update_inode(trans, root, inode);
if (ret)
printk(KERN_ERR"btrfs: fail to dirty inode %lu error %d\n",
inode->i_ino, ret);
if (ret && ret == -ENOSPC) {
/* whoops, lets try again with the full transaction */
btrfs_end_transaction(trans, root);
trans = btrfs_start_transaction(root, 1);
btrfs_set_trans_block_group(trans, inode);

ret = btrfs_update_inode(trans, root, inode);
if (ret) {
printk(KERN_ERR"btrfs: fail to dirty inode %lu error %d\n",
inode->i_ino, ret);
}
}
btrfs_end_transaction(trans, root);
}

Expand Down

0 comments on commit 94b6044

Please sign in to comment.