mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/kdave/btrfs-progs.git
synced 2024-12-05 01:54:19 +08:00
btrfs-progs: change seen_fsid to hold fd and DIR
Change seen_fsid to hold fd and DIR in order to keep access to each fs. 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
836aa5202a
commit
26908f6146
@ -277,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, seen_fsid_hash))
|
||||
if (add_seen_fsid(fs_devices->fsid, seen_fsid_hash, -1, NULL))
|
||||
return;
|
||||
|
||||
uuid_unparse(fs_devices->fsid, uuidbuf);
|
||||
@ -324,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, seen_fsid_hash);
|
||||
ret = add_seen_fsid(fs_info->fsid, seen_fsid_hash, -1, NULL);
|
||||
if (ret == -EEXIST)
|
||||
return 0;
|
||||
else if (ret)
|
||||
|
6
utils.c
6
utils.c
@ -1804,7 +1804,8 @@ int is_seen_fsid(u8 *fsid, struct seen_fsid *seen_fsid_hash[])
|
||||
return 0;
|
||||
}
|
||||
|
||||
int add_seen_fsid(u8 *fsid, struct seen_fsid *seen_fsid_hash[])
|
||||
int add_seen_fsid(u8 *fsid, struct seen_fsid *seen_fsid_hash[],
|
||||
int fd, DIR *dirstream)
|
||||
{
|
||||
u8 hash = fsid[0];
|
||||
int slot = hash % SEEN_FSID_HASH_SIZE;
|
||||
@ -1831,6 +1832,8 @@ insert:
|
||||
|
||||
alloc->next = NULL;
|
||||
memcpy(alloc->fsid, fsid, BTRFS_FSID_SIZE);
|
||||
alloc->fd = fd;
|
||||
alloc->dirstream = dirstream;
|
||||
|
||||
if (seen)
|
||||
seen->next = alloc;
|
||||
@ -1850,6 +1853,7 @@ void free_seen_fsid(struct seen_fsid *seen_fsid_hash[])
|
||||
seen = seen_fsid_hash[slot];
|
||||
while (seen) {
|
||||
next = seen->next;
|
||||
close_file_or_dir(seen->fd, seen->dirstream);
|
||||
free(seen);
|
||||
seen = next;
|
||||
}
|
||||
|
5
utils.h
5
utils.h
@ -73,6 +73,8 @@ void units_set_base(unsigned *units, unsigned base);
|
||||
struct seen_fsid {
|
||||
u8 fsid[BTRFS_FSID_SIZE];
|
||||
struct seen_fsid *next;
|
||||
DIR *dirstream;
|
||||
int fd;
|
||||
};
|
||||
|
||||
int btrfs_make_root_dir(struct btrfs_trans_handle *trans,
|
||||
@ -110,7 +112,8 @@ int get_fs_info(const char *path, struct btrfs_ioctl_fs_info_args *fi_args,
|
||||
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[]);
|
||||
int add_seen_fsid(u8 *fsid, struct seen_fsid *seen_fsid_hash[],
|
||||
int fd, DIR *dirstream);
|
||||
void free_seen_fsid(struct seen_fsid *seen_fsid_hash[]);
|
||||
|
||||
int get_label(const char *btrfs_dev, char *label);
|
||||
|
Loading…
Reference in New Issue
Block a user