diff options
author | Lennart Poettering <lennart@poettering.net> | 2015-11-13 18:07:39 +0100 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2015-11-13 19:50:52 +0100 |
commit | 08c77cf3987b52d0380b3d7d239ba254447692ee (patch) | |
tree | 6f91c12899feecda9252cd70d5c775d0cdeae2ed | |
parent | 0af20ea2ee2af2bcf2258e7a8e1a13181a6a75d6 (diff) |
btrfs: properly handle the case when a subvol has no parent
Don't be confused by subvols without parent. This is after all how the
root subvol is set up.
-rw-r--r-- | src/basic/btrfs-util.c | 31 |
1 files changed, 20 insertions, 11 deletions
diff --git a/src/basic/btrfs-util.c b/src/basic/btrfs-util.c index 290fabdeff..8c2d76b8aa 100644 --- a/src/basic/btrfs-util.c +++ b/src/basic/btrfs-util.c @@ -1423,12 +1423,16 @@ static int copy_quota_hierarchy(int fd, uint64_t old_subvol_id, uint64_t new_sub return n_old_qgroups; r = btrfs_subvol_get_parent(fd, old_subvol_id, &old_parent_id); - if (r < 0) + if (r == -ENXIO) + /* We have no parent, hence nothing to copy. */ + n_old_parent_qgroups = 0; + else if (r < 0) return r; - - n_old_parent_qgroups = btrfs_qgroup_find_parents(fd, old_parent_id, &old_parent_qgroups); - if (n_old_parent_qgroups < 0) - return n_old_parent_qgroups; + else { + n_old_parent_qgroups = btrfs_qgroup_find_parents(fd, old_parent_id, &old_parent_qgroups); + if (n_old_parent_qgroups < 0) + return n_old_parent_qgroups; + } for (i = 0; i < n_old_qgroups; i++) { uint64_t id; @@ -1885,14 +1889,19 @@ int btrfs_subvol_auto_qgroup_fd(int fd, uint64_t subvol_id, bool insert_intermed if (n > 0) /* already parent qgroups set up, let's bail */ return 0; + qgroups = mfree(qgroups); + r = btrfs_subvol_get_parent(fd, subvol_id, &parent_subvol); - if (r < 0) + if (r == -ENXIO) + /* No parent, hence no qgroup memberships */ + n = 0; + else if (r < 0) return r; - - qgroups = mfree(qgroups); - n = btrfs_qgroup_find_parents(fd, parent_subvol, &qgroups); - if (n < 0) - return n; + else { + n = btrfs_qgroup_find_parents(fd, parent_subvol, &qgroups); + if (n < 0) + return n; + } if (insert_intermediary_qgroup) { uint64_t lowest = 256, new_qgroupid; |