mirror of
https://github.com/kdave/btrfs-progs
synced 2025-02-25 22:40:38 +00:00
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>
This commit is contained in:
parent
448763c64a
commit
836aa5202a
@ -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;
|
||||
}
|
||||
|
||||
|
69
utils.c
69
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) {
|
||||
|
12
utils.h
12
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);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user