summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMisono, Tomohiro <misono.tomohiro@jp.fujitsu.com>2017-09-27 11:02:19 +0900
committerDavid Sterba <dsterba@suse.com>2017-10-06 13:23:28 +0200
commit836aa5202a4fa2ca34a5705c8808c7f7f1d40a8b (patch)
tree1cadb503ecc21ae7aafdbb5582bdf78228487d5d
parent448763c64a68bef4b4ba0956c477db55b005862b (diff)
btrfs-progs: move seen_fsid to utils.c
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>
-rw-r--r--cmds-filesystem.c88
-rw-r--r--utils.c69
-rw-r--r--utils.h12
3 files changed, 86 insertions, 83 deletions
diff --git a/cmds-filesystem.c b/cmds-filesystem.c
index dec0f26b..6208fb18 100644
--- a/cmds-filesystem.c
+++ b/cmds-filesystem.c
@@ -30,7 +30,6 @@
#include "kerncompat.h"
#include "ctree.h"
-#include "ioctl.h"
#include "utils.h"
#include "volumes.h"
#include "commands.h"
@@ -43,85 +42,8 @@
* 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 39629a79..3db8bdd1 100644
--- 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 b3aabe14..7e9d5ac6 100644
--- 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);