On 2017/09/26 22:08, Qu Wenruo wrote: > > > On 2017年09月26日 13:45, Misono, Tomohiro wrote: >> 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'. > > It is already quite good, good enough for the fix. > > However just a small point can be further enhanced, commended below. > >> >> Signed-off-by: Tomohiro Misono <misono.tomoh...@jp.fujitsu.com> >> --- >> cmds-filesystem.c | 4 ++-- >> utils.c | 6 +++++- >> utils.h | 5 ++++- >> 3 files changed, 11 insertions(+), 4 deletions(-) >> >> diff --git a/cmds-filesystem.c b/cmds-filesystem.c >> index c7dae40..4bbff43 100644 >> --- a/cmds-filesystem.c >> +++ b/cmds-filesystem.c >> @@ -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) >> diff --git a/utils.c b/utils.c >> index f91d41e..bdfbfe0 100644 >> --- a/utils.c >> +++ b/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; >> @@ -1832,6 +1833,8 @@ insert: >> >> alloc->next = NULL; >> memcpy(alloc->fsid, fsid, BTRFS_FSID_SIZE); >> + alloc->fd = fd; >> + alloc->dirstream = dirstream; >> >> if (seen) >> seen->next = alloc; >> @@ -1851,6 +1854,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; >> } >> diff --git a/utils.h b/utils.h >> index da34e6c..bac7688 100644 >> --- a/utils.h >> +++ b/utils.h >> @@ -107,9 +107,12 @@ int get_fsid(const char *path, u8 *fsid, int silent); >> struct seen_fsid { >> u8 fsid[BTRFS_FSID_SIZE]; >> struct seen_fsid *next; >> + int fd; > > Will it be possible that the final fd recorded here is invalid or some > other reason that we failed to execute SYNC ioctl on that fd, but can > succeeded with other fd? > > In that case, a list of fd will help. > > Thanks, > Qu > Hello,
I think fd will not be invalidated unless user does because open is succeeded. Also, if SYNC is failed for one fd, it would fail for other fds too. So, I think there is no need to keep several fds. What do you think? By the way, thanks for reviewing whole patches and comments. I will splits the cleanup for the fourth patch. Regards, Tomohiro >> + DIR *dirstream; >> }; >> 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); >> > > -- To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html