mirror of
https://github.com/kdave/btrfs-progs
synced 2025-04-27 05:27:56 +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 "kerncompat.h"
|
||||||
#include "ctree.h"
|
#include "ctree.h"
|
||||||
#include "ioctl.h"
|
|
||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
#include "volumes.h"
|
#include "volumes.h"
|
||||||
#include "commands.h"
|
#include "commands.h"
|
||||||
@ -43,85 +42,8 @@
|
|||||||
* for btrfs fi show, we maintain a hash of fsids we've already printed.
|
* 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.
|
* 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 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[] = {
|
static const char * const filesystem_cmd_group_usage[] = {
|
||||||
"btrfs filesystem [<group>] <command> [<args>]",
|
"btrfs filesystem [<group>] <command> [<args>]",
|
||||||
NULL
|
NULL
|
||||||
@ -355,7 +277,7 @@ static void print_one_uuid(struct btrfs_fs_devices *fs_devices,
|
|||||||
u64 devs_found = 0;
|
u64 devs_found = 0;
|
||||||
u64 total;
|
u64 total;
|
||||||
|
|
||||||
if (add_seen_fsid(fs_devices->fsid))
|
if (add_seen_fsid(fs_devices->fsid, seen_fsid_hash))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
uuid_unparse(fs_devices->fsid, uuidbuf);
|
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;
|
struct btrfs_ioctl_dev_info_args *tmp_dev_info;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
ret = add_seen_fsid(fs_info->fsid);
|
ret = add_seen_fsid(fs_info->fsid, seen_fsid_hash);
|
||||||
if (ret == -EEXIST)
|
if (ret == -EEXIST)
|
||||||
return 0;
|
return 0;
|
||||||
else if (ret)
|
else if (ret)
|
||||||
@ -474,7 +396,7 @@ static int btrfs_scan_kernel(void *search, unsigned unit_mode)
|
|||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
/* skip all fs already shown as mounted fs */
|
/* 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;
|
continue;
|
||||||
|
|
||||||
ret = get_label_mounted(mnt->mnt_dir, label);
|
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 */
|
/* 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;
|
continue;
|
||||||
|
|
||||||
fs_copy = calloc(1, sizeof(*fs_copy));
|
fs_copy = calloc(1, sizeof(*fs_copy));
|
||||||
@ -908,7 +830,7 @@ devs_only:
|
|||||||
free_fs_devices(fs_devices);
|
free_fs_devices(fs_devices);
|
||||||
}
|
}
|
||||||
out:
|
out:
|
||||||
free_seen_fsid();
|
free_seen_fsid(seen_fsid_hash);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
69
utils.c
69
utils.c
@ -1788,6 +1788,75 @@ out:
|
|||||||
return ret;
|
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)
|
static int group_profile_devs_min(u64 flag)
|
||||||
{
|
{
|
||||||
switch (flag & BTRFS_BLOCK_GROUP_PROFILE_MASK) {
|
switch (flag & BTRFS_BLOCK_GROUP_PROFILE_MASK) {
|
||||||
|
12
utils.h
12
utils.h
@ -28,6 +28,7 @@
|
|||||||
#include "btrfs-list.h"
|
#include "btrfs-list.h"
|
||||||
#include "sizes.h"
|
#include "sizes.h"
|
||||||
#include "messages.h"
|
#include "messages.h"
|
||||||
|
#include "ioctl.h"
|
||||||
|
|
||||||
#define BTRFS_SCAN_MOUNTED (1ULL << 0)
|
#define BTRFS_SCAN_MOUNTED (1ULL << 0)
|
||||||
#define BTRFS_SCAN_LBLKID (1ULL << 1)
|
#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_DISCARD (1U << 1)
|
||||||
#define PREP_DEVICE_VERBOSE (1U << 2)
|
#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,
|
int btrfs_make_root_dir(struct btrfs_trans_handle *trans,
|
||||||
struct btrfs_root *root, u64 objectid);
|
struct btrfs_root *root, u64 objectid);
|
||||||
int btrfs_prepare_device(int fd, const char *file, u64 *block_count_ret,
|
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,
|
int get_fs_info(const char *path, struct btrfs_ioctl_fs_info_args *fi_args,
|
||||||
struct btrfs_ioctl_dev_info_args **di_ret);
|
struct btrfs_ioctl_dev_info_args **di_ret);
|
||||||
int get_fsid(const char *path, u8 *fsid, int silent);
|
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 get_label(const char *btrfs_dev, char *label);
|
||||||
int set_label(const char *btrfs_dev, const char *label);
|
int set_label(const char *btrfs_dev, const char *label);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user