mirror of
https://github.com/torvalds/linux.git
synced 2024-11-10 22:21:40 +00:00
btrfs: don't go readonly on existing qgroup items
btrfs_drop_snapshot() leaves subvolume qgroup items on disk after completion. This can cause problems with snapshot creation. If a new snapshot tries to claim the deleted subvolumes id, btrfs will get -EEXIST from add_qgroup_item() and go read-only. The following commands will reproduce this problem (assume btrfs is on /dev/sda and is mounted at /btrfs) mkfs.btrfs -f /dev/sda mount -t btrfs /dev/sda /btrfs/ btrfs quota enable /btrfs/ btrfs su sna /btrfs/ /btrfs/snap btrfs su de /btrfs/snap sleep 45 umount /btrfs/ mount -t btrfs /dev/sda /btrfs/ We can fix this by catching -EEXIST in add_qgroup_item() and initializing the existing items. We have the problem of orphaned relation items being on disk from an old snapshot but that is outside the scope of this patch. Signed-off-by: Mark Fasheh <mfasheh@suse.de> Signed-off-by: Chris Mason <clm@fb.com>
This commit is contained in:
parent
b7831b20f3
commit
0b4699dcb6
@ -551,9 +551,15 @@ static int add_qgroup_item(struct btrfs_trans_handle *trans,
|
||||
key.type = BTRFS_QGROUP_INFO_KEY;
|
||||
key.offset = qgroupid;
|
||||
|
||||
/*
|
||||
* Avoid a transaction abort by catching -EEXIST here. In that
|
||||
* case, we proceed by re-initializing the existing structure
|
||||
* on disk.
|
||||
*/
|
||||
|
||||
ret = btrfs_insert_empty_item(trans, quota_root, path, &key,
|
||||
sizeof(*qgroup_info));
|
||||
if (ret)
|
||||
if (ret && ret != -EEXIST)
|
||||
goto out;
|
||||
|
||||
leaf = path->nodes[0];
|
||||
@ -572,7 +578,7 @@ static int add_qgroup_item(struct btrfs_trans_handle *trans,
|
||||
key.type = BTRFS_QGROUP_LIMIT_KEY;
|
||||
ret = btrfs_insert_empty_item(trans, quota_root, path, &key,
|
||||
sizeof(*qgroup_limit));
|
||||
if (ret)
|
||||
if (ret && ret != -EEXIST)
|
||||
goto out;
|
||||
|
||||
leaf = path->nodes[0];
|
||||
|
Loading…
Reference in New Issue
Block a user