Skip to content

Commit 5062af3

Browse files
committed
Btrfs: fix number of transaction units for renames with whiteout
When we do a rename with the whiteout flag, we need to create the whiteout inode, which in the worst case requires 5 transaction units (1 inode item, 1 inode ref, 2 dir items and 1 xattr if selinux is enabled). So bump the number of transaction units from 11 to 16 if the whiteout flag is set. Signed-off-by: Filipe Manana <[email protected]>
1 parent 376e5a5 commit 5062af3

File tree

1 file changed

+8
-1
lines changed

1 file changed

+8
-1
lines changed

fs/btrfs/inode.c

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9668,6 +9668,7 @@ static int btrfs_rename(struct inode *old_dir, struct dentry *old_dentry,
96689668
unsigned int flags)
96699669
{
96709670
struct btrfs_trans_handle *trans;
9671+
unsigned int trans_num_items;
96719672
struct btrfs_root *root = BTRFS_I(old_dir)->root;
96729673
struct btrfs_root *dest = BTRFS_I(new_dir)->root;
96739674
struct inode *new_inode = d_inode(new_dentry);
@@ -9730,8 +9731,14 @@ static int btrfs_rename(struct inode *old_dir, struct dentry *old_dentry,
97309731
* would require 5 item modifications, so we'll assume they are normal
97319732
* inodes. So 5 * 2 is 10, plus 1 for the new link, so 11 total items
97329733
* should cover the worst case number of items we'll modify.
9734+
* If our rename has the whiteout flag, we need more 5 units for the
9735+
* new inode (1 inode item, 1 inode ref, 2 dir items and 1 xattr item
9736+
* when selinux is enabled).
97339737
*/
9734-
trans = btrfs_start_transaction(root, 11);
9738+
trans_num_items = 11;
9739+
if (flags & RENAME_WHITEOUT)
9740+
trans_num_items += 5;
9741+
trans = btrfs_start_transaction(root, trans_num_items);
97359742
if (IS_ERR(trans)) {
97369743
ret = PTR_ERR(trans);
97379744
goto out_notrans;

0 commit comments

Comments
 (0)