From: Eric Sandeen <sandeen@sandeen.net> To: Masayoshi Mizuma <msys.mizuma@gmail.com>, Gao Xiang <hsiangkao@redhat.com> Cc: linux-xfs@vger.kernel.org, "Darrick J. Wong" <darrick.wong@oracle.com>, Eric Sandeen <sandeen@redhat.com> Subject: Re: [PATCH v3 2/2] xfsdump: intercept bind mount targets Date: Mon, 20 Dec 2021 13:58:39 -0600 [thread overview] Message-ID: <080cd926-2c97-636a-1e72-25d00adf9068@sandeen.net> (raw) In-Reply-To: <YcCoyZcKnOTz1Waa@gabell> On 12/20/21 10:01 AM, Masayoshi Mizuma wrote: > On Tue, Nov 03, 2020 at 11:33:28PM +0800, Gao Xiang wrote: >> 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 <sandeen@redhat.com> >> Signed-off-by: Gao Xiang <hsiangkao@redhat.com> > > Hi, > > This patch works for the filesystem which the inode number of the > root directory is different from the root inode number of the > filesystem without the bind mount. > > Please feel free to add: > > Tested-by: Masayoshi Mizuma <m.mizuma@jp.fujitsu.com> Great, thank you for the test results. -Eric > The log with the both of the patch: > > # xfs_io -i -c 'bulkstat_single root' /test/MNT1 | awk '/bs_ino = /{print $3}' > 128 > # stat --printf="%i\n" /test/MNT1 > 1024 > # xfsdump -L session -M test -f /tmp/2176346.dump /test/MNT1 > xfsdump: using file dump (drive_simple) strategy > xfsdump: version 3.1.9 (dump format 3.0) - type ^C for status and control > xfsdump: level 0 dump of localhost:/test/MNT1 > xfsdump: dump date: Mon Dec 20 10:38:27 2021 > xfsdump: session id: edec5c99-062b-41b8-a0c2-6c3c87d7ce75 > xfsdump: session label: "session" > xfsdump: ino map phase 1: constructing initial dump list > xfsdump: ino map phase 2: skipping (no pruning necessary) > xfsdump: ino map phase 3: skipping (only one dump stream) > xfsdump: ino map construction complete > xfsdump: estimated dump size: 532800 bytes > xfsdump: /var/lib/xfsdump/inventory created > xfsdump: creating dump session media file 0 (media 0, file 0) > xfsdump: dumping ino map > xfsdump: dumping directories > xfsdump: dumping non-directory files > xfsdump: ending media file > xfsdump: media file size 1061824 bytes > xfsdump: dump size (non-dir files) : 0 bytes > xfsdump: dump complete: 3 seconds elapsed > xfsdump: Dump Summary: > xfsdump: stream 0 /tmp/2176346.dump OK (success) > xfsdump: Dump Status: SUCCESS > > Thanks! > Masa > >> --- >> changes since v2 (Eric): >> - error out the case where the directory cannot be read; >> - In any case, stop as soon as we have found ".."; >> - update the mountpoint error message and use i18n instead; >> >> dump/content.c | 57 ++++++++++++++++++++++++++++++++++++++++++++++++++ >> 1 file changed, 57 insertions(+) >> >> diff --git a/dump/content.c b/dump/content.c >> index c11d9b4..c248e74 100644 >> --- a/dump/content.c >> +++ b/dump/content.c >> @@ -511,6 +511,55 @@ static bool_t create_inv_session( >> ix_t subtreecnt, >> size_t strmix); >> >> +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 +1442,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.18.1 >> >
next prev parent reply other threads:[~2021-12-20 19:58 UTC|newest] Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top 2020-11-03 2:33 [PATCH v2 1/2] xfsdump: Revert "xfsdump: handle bind mount targets" Gao Xiang 2020-11-03 2:33 ` [PATCH v2 2/2] xfsdump: intercept bind mount targets Gao Xiang 2020-11-03 15:03 ` Eric Sandeen 2020-11-03 15:18 ` Gao Xiang 2020-11-03 15:33 ` [PATCH v3 " Gao Xiang 2021-06-03 20:53 ` Eric Sandeen 2021-09-27 15:07 ` Bill O'Donnell 2021-12-20 16:01 ` Masayoshi Mizuma 2021-12-20 19:58 ` Eric Sandeen [this message] 2021-06-03 20:29 ` [PATCH v2 1/2] xfsdump: Revert "xfsdump: handle bind mount targets" Eric Sandeen 2021-09-27 15:05 ` Bill O'Donnell
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=080cd926-2c97-636a-1e72-25d00adf9068@sandeen.net \ --to=sandeen@sandeen.net \ --cc=darrick.wong@oracle.com \ --cc=hsiangkao@redhat.com \ --cc=linux-xfs@vger.kernel.org \ --cc=msys.mizuma@gmail.com \ --cc=sandeen@redhat.com \ --subject='Re: [PATCH v3 2/2] xfsdump: intercept bind mount targets' \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: link
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.