From e6de789065c2c575200c8c3e08a4a4b286b193a9 Mon Sep 17 00:00:00 2001 From: Jun Yang Date: Thu, 29 Sep 2022 11:54:06 +0800 Subject: [PATCH] xfsdump: add patches to fix failed cases of xfstest Signed-off-by: Jun Yang (cherry picked from commit 22dd2d77472d29a286cb979371d9ab07a2e29938) --- ...rt-xfsdump-handle-bind-mount-targets.patch | 71 ++++++++++++ ...xfsdump-intercept-bind-mount-targets.patch | 105 ++++++++++++++++++ xfsdump.spec | 7 +- 3 files changed, 182 insertions(+), 1 deletion(-) create mode 100644 0001-xfsdump-Revert-xfsdump-handle-bind-mount-targets.patch create mode 100644 0002-xfsdump-intercept-bind-mount-targets.patch diff --git a/0001-xfsdump-Revert-xfsdump-handle-bind-mount-targets.patch b/0001-xfsdump-Revert-xfsdump-handle-bind-mount-targets.patch new file mode 100644 index 0000000..36eed79 --- /dev/null +++ b/0001-xfsdump-Revert-xfsdump-handle-bind-mount-targets.patch @@ -0,0 +1,71 @@ +From 3b71c7f1f5a1dd45712d7de1139290d0a8cf03c4 Mon Sep 17 00:00:00 2001 +From: Gao Xiang +Date: Thu, 3 Feb 2022 12:42:30 -0500 +Subject: [PATCH] xfsdump: Revert "xfsdump: handle bind mount targets" + +Bind mount mntpnts will be forbided in the next commits +instead since it's not the real rootdir. + +This cannot be reverted cleanly due to several cleanup +patches, but the logic is reverted equivalently. + +This reverts commit 25195ebf107dc81b1b7cea1476764950e1d6cc9d. + +Fixes: 25195ebf107d ("xfsdump: handle bind mount targets") +Cc: Eric Sandeen +Signed-off-by: Gao Xiang +Reviewed-by: Eric Sandeen +Signed-off-by: Eric Sandeen +--- + dump/content.c | 21 ++------------------- + 1 file changed, 2 insertions(+), 19 deletions(-) + +diff --git a/dump/content.c b/dump/content.c +index 75b7922..a1a114c 100644 +--- a/dump/content.c ++++ b/dump/content.c +@@ -1382,17 +1382,10 @@ baseuuidbypass: + } + + /* figure out the ino for the root directory of the fs +- * and get its struct xfs_bstat for inomap_build(). This could +- * be a bind mount; don't ask for the mount point inode, +- * find the actual lowest inode number in the filesystem. ++ * and get its xfs_bstat_t for inomap_build() + */ + { + stat64_t rootstat; +- xfs_ino_t lastino = 0; +- int ocount = 0; +- struct xfs_fsop_bulkreq bulkreq; +- +- /* Get the inode of the mount point */ + rval = fstat64(sc_fsfd, &rootstat); + if (rval) { + mlog(MLOG_NORMAL, _( +@@ -1404,21 +1397,11 @@ baseuuidbypass: + (struct xfs_bstat *)calloc(1, sizeof(struct xfs_bstat)); + assert(sc_rootxfsstatp); + +- /* Get the first valid (i.e. root) inode in this fs */ +- bulkreq.lastip = (__u64 *)&lastino; +- bulkreq.icount = 1; +- bulkreq.ubuffer = sc_rootxfsstatp; +- bulkreq.ocount = &ocount; +- if (ioctl(sc_fsfd, XFS_IOC_FSBULKSTAT, &bulkreq) < 0) { ++ if (bigstat_one(sc_fsfd, rootstat.st_ino, sc_rootxfsstatp) < 0) { + mlog(MLOG_ERROR, + _("failed to get bulkstat information for root inode\n")); + return BOOL_FALSE; + } +- +- if (sc_rootxfsstatp->bs_ino != rootstat.st_ino) +- mlog (MLOG_NORMAL | MLOG_NOTE, +- _("root ino %lld differs from mount dir ino %lld, bind mount?\n"), +- sc_rootxfsstatp->bs_ino, rootstat.st_ino); + } + + /* alloc a file system handle, to be used with the jdm_open() +-- +2.35.3 + diff --git a/0002-xfsdump-intercept-bind-mount-targets.patch b/0002-xfsdump-intercept-bind-mount-targets.patch new file mode 100644 index 0000000..7b00d6e --- /dev/null +++ b/0002-xfsdump-intercept-bind-mount-targets.patch @@ -0,0 +1,105 @@ +From 0717c1cdfeaedc98df8af97b5ab110830e176a5b Mon Sep 17 00:00:00 2001 +From: Gao Xiang +Date: Thu, 3 Feb 2022 12:42:30 -0500 +Subject: [PATCH] xfsdump: intercept bind mount targets + +It's a bit strange pointing at some non-root bind mount target and +then actually dumping from the actual root dir instead. + +Therefore, instead of searching for the root dir of the filesystem, +just intercept all bind mount targets by checking whose ino # of +".." is itself with getdents. + +Fixes: 25195ebf107d ("xfsdump: handle bind mount targets") +Cc: Eric Sandeen +Signed-off-by: Gao Xiang +[sandeen: add explanatory comment to new function] +Reviewed-by: Eric Sandeen +Signed-off-by: Eric Sandeen +--- + dump/content.c | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 62 insertions(+) + +diff --git a/dump/content.c b/dump/content.c +index a1a114c..6188b25 100644 +--- a/dump/content.c ++++ b/dump/content.c +@@ -511,6 +511,60 @@ static bool_t create_inv_session( + ix_t subtreecnt, + size_t strmix); + ++/* ++ * Verify that we are asked to dump from the root of the filesystem; ++ * test this by checking whether the inode number we've been given matches ++ * the inode number for this directory's ".." ++ */ ++static bool_t ++check_rootdir(int fd, ++ xfs_ino_t ino) ++{ ++ struct dirent *gdp; ++ size_t gdsz; ++ bool_t found = BOOL_FALSE; ++ ++ gdsz = sizeof(struct dirent) + NAME_MAX + 1; ++ if (gdsz < GETDENTSBUF_SZ_MIN) ++ gdsz = GETDENTSBUF_SZ_MIN; ++ gdp = (struct dirent *)calloc(1, gdsz); ++ assert(gdp); ++ ++ while (1) { ++ struct dirent *p; ++ int nread; ++ ++ nread = getdents_wrap(fd, (char *)gdp, gdsz); ++ /* ++ * negative count indicates something very bad happened; ++ * try to gracefully end this dir. ++ */ ++ if (nread < 0) { ++ mlog(MLOG_NORMAL | MLOG_WARNING, ++_("unable to read dirents for directory ino %llu: %s\n"), ++ ino, strerror(errno)); ++ break; ++ } ++ ++ /* no more directory entries: break; */ ++ if (!nread) ++ break; ++ ++ for (p = gdp; nread > 0; ++ nread -= (int)p->d_reclen, ++ assert(nread >= 0), ++ p = (struct dirent *)((char *)p + p->d_reclen)) { ++ if (!strcmp(p->d_name, "..")) { ++ if (p->d_ino == ino) ++ found = BOOL_TRUE; ++ break; ++ } ++ } ++ } ++ free(gdp); ++ return found; ++} ++ + bool_t + content_init(int argc, + char *argv[], +@@ -1393,6 +1447,14 @@ baseuuidbypass: + mntpnt); + return BOOL_FALSE; + } ++ ++ if (!check_rootdir(sc_fsfd, rootstat.st_ino)) { ++ mlog(MLOG_ERROR, ++_("%s is not the root of the filesystem (bind mount?) - use primary mountpoint\n"), ++ mntpnt); ++ return BOOL_FALSE; ++ } ++ + sc_rootxfsstatp = + (struct xfs_bstat *)calloc(1, sizeof(struct xfs_bstat)); + assert(sc_rootxfsstatp); +-- +2.35.3 + diff --git a/xfsdump.spec b/xfsdump.spec index be4adb6..4478049 100644 --- a/xfsdump.spec +++ b/xfsdump.spec @@ -1,10 +1,12 @@ Name: xfsdump Version: 3.1.9 -Release: 2 +Release: 3 Summary: Tools create and restore for the XFS filesystem License: GPLv2 URL: http://xfs.org Source0: http://kernel.org/pub/linux/utils/fs/xfs/%{name}/%{name}-%{version}.tar.xz +Patch01: 0001-xfsdump-Revert-xfsdump-handle-bind-mount-targets.patch +Patch02: 0002-xfsdump-intercept-bind-mount-targets.patch BuildRequires: libtool, gettext, gawk BuildRequires: xfsprogs-devel, ncurses-devel, libuuid-devel, libattr-devel @@ -48,6 +50,9 @@ mkdir -p %{buildroot}/%{_sharedstatedir}/xfsdump/inventory %changelog +* Thu Sep 29 2022 Jun Yang - 3.1.9-3 +- Add patches to fix failed cases of xfstest xfs/544,545 + * Fri Jul 30 2021 chenyanpanHW - 3.1.9-2 - DESC: delete -S git from %autosetup, and delete BuildRequires git