src/fssum: skip subvolumes when building a sum
authorJosef Bacik <josef@toxicpanda.com>
Tue, 17 Dec 2019 15:25:05 +0000 (10:25 -0500)
committerEryu Guan <guaneryu@gmail.com>
Sun, 29 Dec 2019 17:53:56 +0000 (01:53 +0800)
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>
Reviewed-by: Filipe Manana <fdmanana@suse.com>
Signed-off-by: Eryu Guan <guaneryu@gmail.com>
src/fssum.c

index 6ba0a95c3d700e29a16513d2eccfd81f87258d5f..a243839a0be937bb384300906c86214884edaa87 100644 (file)
@@ -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))