summaryrefslogtreecommitdiff
path: root/cmds-subvolume.c
diff options
context:
space:
mode:
authorZhao Lei <zhaolei@cn.fujitsu.com>2015-08-26 22:03:37 +0800
committerDavid Sterba <dsterba@suse.com>2015-09-01 14:02:49 +0200
commit601c5e1b234fa13bbbed89bce3201f81340ff15d (patch)
treed9b744a43f1e9345e3e8cdbed35c30fd38e8afb0 /cmds-subvolume.c
parent298746b9583cf9b70efa5de03a366076e45cfcff (diff)
btrfs-progs: Simplify memory allocation for enumerate_dead_subvols
No need prepare memory for enumerate_dead_subvols() in caller, and pass additional argument for allocated length. Just do every thing inside enumerate_dead_subvols(), it will not increase malloc count, but make code simple. Signed-off-by: Zhao Lei <zhaolei@cn.fujitsu.com> Signed-off-by: David Sterba <dsterba@suse.com>
Diffstat (limited to 'cmds-subvolume.c')
-rw-r--r--cmds-subvolume.c17
1 files changed, 6 insertions, 11 deletions
diff --git a/cmds-subvolume.c b/cmds-subvolume.c
index d2e37bb..b4785da 100644
--- a/cmds-subvolume.c
+++ b/cmds-subvolume.c
@@ -1165,12 +1165,13 @@ again:
* Enumerate all dead subvolumes that exist in the filesystem.
* Fill @ids and reallocate to bigger size if needed.
*/
-static int enumerate_dead_subvols(int fd, int count, u64 **ids)
+static int enumerate_dead_subvols(int fd, u64 **ids)
{
int ret;
struct btrfs_ioctl_search_args args;
struct btrfs_ioctl_search_key *sk = &args.key;
int idx = 0;
+ int count = 0;
memset(&args, 0, sizeof(args));
@@ -1185,6 +1186,7 @@ static int enumerate_dead_subvols(int fd, int count, u64 **ids)
sk->max_transid = (u64)-1;
sk->nr_items = 4096;
+ *ids = NULL;
while (1) {
struct btrfs_ioctl_search_header *sh;
unsigned long off;
@@ -1203,8 +1205,6 @@ static int enumerate_dead_subvols(int fd, int count, u64 **ids)
off += sizeof(*sh);
if (sh->type == BTRFS_ORPHAN_ITEM_KEY) {
- (*ids)[idx] = sh->offset;
- idx++;
if (idx >= count) {
u64 *newids;
@@ -1214,6 +1214,8 @@ static int enumerate_dead_subvols(int fd, int count, u64 **ids)
return -ENOMEM;
*ids = newids;
}
+ (*ids)[idx] = sh->offset;
+ idx++;
}
off += sh->len;
@@ -1280,14 +1282,7 @@ static int cmd_subvol_sync(int argc, char **argv)
id_count = argc - optind;
if (!id_count) {
- id_count = SUBVOL_ID_BATCH;
- ids = (u64*)malloc(id_count * sizeof(u64));
- if (!ids) {
- fprintf(stderr, "ERROR: not enough memory\n");
- ret = 1;
- goto out;
- }
- id_count = enumerate_dead_subvols(fd, id_count, &ids);
+ id_count = enumerate_dead_subvols(fd, &ids);
if (id_count < 0) {
fprintf(stderr, "ERROR: can't enumerate dead subvolumes: %s\n",
strerror(-id_count));