btrfs-progs: move seen_fsid to utils.c
authorMisono, Tomohiro <misono.tomohiro@jp.fujitsu.com>
Wed, 27 Sep 2017 02:02:19 +0000 (11:02 +0900)
committerDavid Sterba <dsterba@suse.com>
Fri, 6 Oct 2017 11:23:28 +0000 (13:23 +0200)
Move is_seen_fsid()/add_seen_fsid()/free_seen_fsid() to common functions.
This will be used for 'subvol delete --commit-after'.

Signed-off-by: Tomohiro Misono <misono.tomohiro@jp.fujitsu.com>
Reviewed-by: Qu Wenruo <quwenruo.btrfs@gmx.com>
Signed-off-by: David Sterba <dsterba@suse.com>
cmds-filesystem.c
utils.c
utils.h

index dec0f26..6208fb1 100644 (file)
@@ -30,7 +30,6 @@
 
 #include "kerncompat.h"
 #include "ctree.h"
-#include "ioctl.h"
 #include "utils.h"
 #include "volumes.h"
 #include "commands.h"
  * for btrfs fi show, we maintain a hash of fsids we've already printed.
  * This way we don't print dups if a given FS is mounted more than once.
  */
-#define SEEN_FSID_HASH_SIZE 256
-
-struct seen_fsid {
-       u8 fsid[BTRFS_FSID_SIZE];
-       struct seen_fsid *next;
-};
-
 static struct seen_fsid *seen_fsid_hash[SEEN_FSID_HASH_SIZE] = {NULL,};
 
-static int is_seen_fsid(u8 *fsid)
-{
-       u8 hash = fsid[0];
-       int slot = hash % SEEN_FSID_HASH_SIZE;
-       struct seen_fsid *seen = seen_fsid_hash[slot];
-
-       while (seen) {
-               if (memcmp(seen->fsid, fsid, BTRFS_FSID_SIZE) == 0)
-                       return 1;
-
-               seen = seen->next;
-       }
-
-       return 0;
-}
-
-static int add_seen_fsid(u8 *fsid)
-{
-       u8 hash = fsid[0];
-       int slot = hash % SEEN_FSID_HASH_SIZE;
-       struct seen_fsid *seen = seen_fsid_hash[slot];
-       struct seen_fsid *alloc;
-
-       if (!seen)
-               goto insert;
-
-       while (1) {
-               if (memcmp(seen->fsid, fsid, BTRFS_FSID_SIZE) == 0)
-                       return -EEXIST;
-
-               if (!seen->next)
-                       break;
-
-               seen = seen->next;
-       }
-
-insert:
-
-       alloc = malloc(sizeof(*alloc));
-       if (!alloc)
-               return -ENOMEM;
-
-       alloc->next = NULL;
-       memcpy(alloc->fsid, fsid, BTRFS_FSID_SIZE);
-
-       if (seen)
-               seen->next = alloc;
-       else
-               seen_fsid_hash[slot] = alloc;
-
-       return 0;
-}
-
-static void free_seen_fsid(void)
-{
-       int slot;
-       struct seen_fsid *seen;
-       struct seen_fsid *next;
-
-       for (slot = 0; slot < SEEN_FSID_HASH_SIZE; slot++) {
-               seen = seen_fsid_hash[slot];
-               while (seen) {
-                       next = seen->next;
-                       free(seen);
-                       seen = next;
-               }
-               seen_fsid_hash[slot] = NULL;
-       }
-}
-
 static const char * const filesystem_cmd_group_usage[] = {
        "btrfs filesystem [<group>] <command> [<args>]",
        NULL
@@ -355,7 +277,7 @@ static void print_one_uuid(struct btrfs_fs_devices *fs_devices,
        u64 devs_found = 0;
        u64 total;
 
-       if (add_seen_fsid(fs_devices->fsid))
+       if (add_seen_fsid(fs_devices->fsid, seen_fsid_hash))
                return;
 
        uuid_unparse(fs_devices->fsid, uuidbuf);
@@ -402,7 +324,7 @@ static int print_one_fs(struct btrfs_ioctl_fs_info_args *fs_info,
        struct btrfs_ioctl_dev_info_args *tmp_dev_info;
        int ret;
 
-       ret = add_seen_fsid(fs_info->fsid);
+       ret = add_seen_fsid(fs_info->fsid, seen_fsid_hash);
        if (ret == -EEXIST)
                return 0;
        else if (ret)
@@ -474,7 +396,7 @@ static int btrfs_scan_kernel(void *search, unsigned unit_mode)
                        goto out;
 
                /* skip all fs already shown as mounted fs */
-               if (is_seen_fsid(fs_info_arg.fsid))
+               if (is_seen_fsid(fs_info_arg.fsid, seen_fsid_hash))
                        continue;
 
                ret = get_label_mounted(mnt->mnt_dir, label);
@@ -676,7 +598,7 @@ static int search_umounted_fs_uuids(struct list_head *all_uuids,
                }
 
                /* skip all fs already shown as mounted fs */
-               if (is_seen_fsid(cur_fs->fsid))
+               if (is_seen_fsid(cur_fs->fsid, seen_fsid_hash))
                        continue;
 
                fs_copy = calloc(1, sizeof(*fs_copy));
@@ -908,7 +830,7 @@ devs_only:
                free_fs_devices(fs_devices);
        }
 out:
-       free_seen_fsid();
+       free_seen_fsid(seen_fsid_hash);
        return ret;
 }
 
diff --git a/utils.c b/utils.c
index 39629a7..3db8bdd 100644 (file)
--- a/utils.c
+++ b/utils.c
@@ -1788,6 +1788,75 @@ out:
        return ret;
 }
 
+int is_seen_fsid(u8 *fsid, struct seen_fsid *seen_fsid_hash[])
+{
+       u8 hash = fsid[0];
+       int slot = hash % SEEN_FSID_HASH_SIZE;
+       struct seen_fsid *seen = seen_fsid_hash[slot];
+
+       while (seen) {
+               if (memcmp(seen->fsid, fsid, BTRFS_FSID_SIZE) == 0)
+                       return 1;
+
+               seen = seen->next;
+       }
+
+       return 0;
+}
+
+int add_seen_fsid(u8 *fsid, struct seen_fsid *seen_fsid_hash[])
+{
+       u8 hash = fsid[0];
+       int slot = hash % SEEN_FSID_HASH_SIZE;
+       struct seen_fsid *seen = seen_fsid_hash[slot];
+       struct seen_fsid *alloc;
+
+       if (!seen)
+               goto insert;
+
+       while (1) {
+               if (memcmp(seen->fsid, fsid, BTRFS_FSID_SIZE) == 0)
+                       return -EEXIST;
+
+               if (!seen->next)
+                       break;
+
+               seen = seen->next;
+       }
+
+insert:
+       alloc = malloc(sizeof(*alloc));
+       if (!alloc)
+               return -ENOMEM;
+
+       alloc->next = NULL;
+       memcpy(alloc->fsid, fsid, BTRFS_FSID_SIZE);
+
+       if (seen)
+               seen->next = alloc;
+       else
+               seen_fsid_hash[slot] = alloc;
+
+       return 0;
+}
+
+void free_seen_fsid(struct seen_fsid *seen_fsid_hash[])
+{
+       int slot;
+       struct seen_fsid *seen;
+       struct seen_fsid *next;
+
+       for (slot = 0; slot < SEEN_FSID_HASH_SIZE; slot++) {
+               seen = seen_fsid_hash[slot];
+               while (seen) {
+                       next = seen->next;
+                       free(seen);
+                       seen = next;
+               }
+               seen_fsid_hash[slot] = NULL;
+       }
+}
+
 static int group_profile_devs_min(u64 flag)
 {
        switch (flag & BTRFS_BLOCK_GROUP_PROFILE_MASK) {
diff --git a/utils.h b/utils.h
index b3aabe1..7e9d5ac 100644 (file)
--- a/utils.h
+++ b/utils.h
@@ -28,6 +28,7 @@
 #include "btrfs-list.h"
 #include "sizes.h"
 #include "messages.h"
+#include "ioctl.h"
 
 #define BTRFS_SCAN_MOUNTED     (1ULL << 0)
 #define BTRFS_SCAN_LBLKID      (1ULL << 1)
@@ -68,6 +69,12 @@ void units_set_base(unsigned *units, unsigned base);
 #define        PREP_DEVICE_DISCARD     (1U << 1)
 #define        PREP_DEVICE_VERBOSE     (1U << 2)
 
+#define SEEN_FSID_HASH_SIZE 256
+struct seen_fsid {
+       u8 fsid[BTRFS_FSID_SIZE];
+       struct seen_fsid *next;
+};
+
 int btrfs_make_root_dir(struct btrfs_trans_handle *trans,
                        struct btrfs_root *root, u64 objectid);
 int btrfs_prepare_device(int fd, const char *file, u64 *block_count_ret,
@@ -101,6 +108,11 @@ void close_file_or_dir(int fd, DIR *dirstream);
 int get_fs_info(const char *path, struct btrfs_ioctl_fs_info_args *fi_args,
                struct btrfs_ioctl_dev_info_args **di_ret);
 int get_fsid(const char *path, u8 *fsid, int silent);
+
+int is_seen_fsid(u8 *fsid, struct seen_fsid *seen_fsid_hash[]);
+int add_seen_fsid(u8 *fsid, struct seen_fsid *seen_fsid_hash[]);
+void free_seen_fsid(struct seen_fsid *seen_fsid_hash[]);
+
 int get_label(const char *btrfs_dev, char *label);
 int set_label(const char *btrfs_dev, const char *label);