mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-15 23:25:07 +00:00
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 <fdmanana@suse.com>
This commit is contained in:
parent
376e5a57bf
commit
5062af35c3
1 changed files with 8 additions and 1 deletions
|
@ -9668,6 +9668,7 @@ static int btrfs_rename(struct inode *old_dir, struct dentry *old_dentry,
|
||||||
unsigned int flags)
|
unsigned int flags)
|
||||||
{
|
{
|
||||||
struct btrfs_trans_handle *trans;
|
struct btrfs_trans_handle *trans;
|
||||||
|
unsigned int trans_num_items;
|
||||||
struct btrfs_root *root = BTRFS_I(old_dir)->root;
|
struct btrfs_root *root = BTRFS_I(old_dir)->root;
|
||||||
struct btrfs_root *dest = BTRFS_I(new_dir)->root;
|
struct btrfs_root *dest = BTRFS_I(new_dir)->root;
|
||||||
struct inode *new_inode = d_inode(new_dentry);
|
struct inode *new_inode = d_inode(new_dentry);
|
||||||
|
@ -9730,8 +9731,14 @@ static int btrfs_rename(struct inode *old_dir, struct dentry *old_dentry,
|
||||||
* would require 5 item modifications, so we'll assume they are normal
|
* would require 5 item modifications, so we'll assume they are normal
|
||||||
* inodes. So 5 * 2 is 10, plus 1 for the new link, so 11 total items
|
* inodes. So 5 * 2 is 10, plus 1 for the new link, so 11 total items
|
||||||
* should cover the worst case number of items we'll modify.
|
* should cover the worst case number of items we'll modify.
|
||||||
|
* If our rename has the whiteout flag, we need more 5 units for the
|
||||||
|
* new inode (1 inode item, 1 inode ref, 2 dir items and 1 xattr item
|
||||||
|
* when selinux is enabled).
|
||||||
*/
|
*/
|
||||||
trans = btrfs_start_transaction(root, 11);
|
trans_num_items = 11;
|
||||||
|
if (flags & RENAME_WHITEOUT)
|
||||||
|
trans_num_items += 5;
|
||||||
|
trans = btrfs_start_transaction(root, trans_num_items);
|
||||||
if (IS_ERR(trans)) {
|
if (IS_ERR(trans)) {
|
||||||
ret = PTR_ERR(trans);
|
ret = PTR_ERR(trans);
|
||||||
goto out_notrans;
|
goto out_notrans;
|
||||||
|
|
Loading…
Reference in a new issue