Message ID | 20191217152505.44650-1-josef@toxicpanda.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | src/fssum: skip subvolumes when building a sum | expand |
On Tue, Dec 17, 2019 at 3:25 PM Josef Bacik <josef@toxicpanda.com> wrote: > > With the snapshot/subvolume support added to fsstress I've been seeing > random failures with our send/receive related tests. This is because > fssum is summing the path with the subvolumes for our test fs'es that > are generated by fsstress. But with send/receive it skips subvolumes, > which makes the sums mismatch. Fix this by skipping directories that do > not match our st_dev, which is how we differentiate subvolumes in btrfs. > > Signed-off-by: Josef Bacik <josef@toxicpanda.com> Looks good, thanks. Reviewed-by: Filipe Manana <fdmanana@suse.com> > --- > src/fssum.c | 11 +++++++++++ > 1 file changed, 11 insertions(+) > > diff --git a/src/fssum.c b/src/fssum.c > index 6ba0a95c..a243839a 100644 > --- a/src/fssum.c > +++ b/src/fssum.c > @@ -517,6 +517,12 @@ sum(int dirfd, int level, sum_t *dircs, char *path_prefix, char *path_in) > int excl; > sum_file_data_t sum_file_data = flags[FLAG_STRUCTURE] ? > sum_file_data_strict : sum_file_data_permissive; > + struct stat64 dir_st; > + > + if (fstat64(dirfd, &dir_st)) { > + perror("fstat"); > + exit(-1); > + } > > d = fdopendir(dirfd); > if (!d) { > @@ -570,6 +576,11 @@ sum(int dirfd, int level, sum_t *dircs, char *path_prefix, char *path_in) > path_prefix, path, strerror(errno)); > exit(-1); > } > + > + /* We are crossing into a different subvol, skip this subtree. */ > + if (st.st_dev != dir_st.st_dev) > + goto next; > + > sum_add_u64(&meta, level); > sum_add(&meta, namelist[i], strlen(namelist[i])); > if (!S_ISDIR(st.st_mode)) > -- > 2.23.0 >
diff --git a/src/fssum.c b/src/fssum.c index 6ba0a95c..a243839a 100644 --- a/src/fssum.c +++ b/src/fssum.c @@ -517,6 +517,12 @@ sum(int dirfd, int level, sum_t *dircs, char *path_prefix, char *path_in) int excl; sum_file_data_t sum_file_data = flags[FLAG_STRUCTURE] ? sum_file_data_strict : sum_file_data_permissive; + struct stat64 dir_st; + + if (fstat64(dirfd, &dir_st)) { + perror("fstat"); + exit(-1); + } d = fdopendir(dirfd); if (!d) { @@ -570,6 +576,11 @@ sum(int dirfd, int level, sum_t *dircs, char *path_prefix, char *path_in) path_prefix, path, strerror(errno)); exit(-1); } + + /* We are crossing into a different subvol, skip this subtree. */ + if (st.st_dev != dir_st.st_dev) + goto next; + sum_add_u64(&meta, level); sum_add(&meta, namelist[i], strlen(namelist[i])); if (!S_ISDIR(st.st_mode))
With the snapshot/subvolume support added to fsstress I've been seeing random failures with our send/receive related tests. This is because fssum is summing the path with the subvolumes for our test fs'es that are generated by fsstress. But with send/receive it skips subvolumes, which makes the sums mismatch. Fix this by skipping directories that do not match our st_dev, which is how we differentiate subvolumes in btrfs. Signed-off-by: Josef Bacik <josef@toxicpanda.com> --- src/fssum.c | 11 +++++++++++ 1 file changed, 11 insertions(+)