All of lore.kernel.org
 help / color / mirror / Atom feed
From: Gao Xiang <hsiangkao@redhat.com>
To: linux-xfs@vger.kernel.org
Cc: "Darrick J. Wong" <darrick.wong@oracle.com>,
	Gao Xiang <hsiangkao@redhat.com>,
	Eric Sandeen <sandeen@redhat.com>
Subject: [PATCH v2 2/2] xfsdump: intercept bind mount targets
Date: Tue,  3 Nov 2020 10:33:15 +0800	[thread overview]
Message-ID: <20201103023315.786103-2-hsiangkao@redhat.com> (raw)
In-Reply-To: <20201103023315.786103-1-hsiangkao@redhat.com>

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>
---
changes since v1:
 just intercept bind mount targets suggested by Eric on IRC instead,
 and no need to use XFS_BULK_IREQ_SPECIAL_ROOT since the xfs header
 files and the kernel on my laptop don't support it, plus
 xfsdump/xfsrestore are not part of xfsprogs, so a bit hard to
 sync and make full use of that elegantly.

 dump/content.c | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 62 insertions(+)

diff --git a/dump/content.c b/dump/content.c
index c11d9b4..7a55b92 100644
--- a/dump/content.c
+++ b/dump/content.c
@@ -511,6 +511,61 @@ 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;
+
+	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));
+			/* !!! curtis looked at this, and pointed out that
+			 * we could take some recovery action here. if the
+			 * errno is appropriate, lseek64 to the value of
+			 * doff field of the last dirent successfully
+			 * obtained, and contiue the loop.
+			 */
+			nread = 0; /* pretend we are done */
+		}
+
+		/* 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, "..") && p->d_ino == ino) {
+				mlog(MLOG_DEBUG, "FOUND: name %s d_ino %llu\n",
+				     p->d_name, ino);
+				free(gdp);
+				return BOOL_TRUE;
+			}
+		}
+	}
+	free(gdp);
+	return BOOL_FALSE;
+}
+
 bool_t
 content_init(int argc,
 	      char *argv[],
@@ -1393,6 +1448,13 @@ baseuuidbypass:
 			      mntpnt);
 			return BOOL_FALSE;
 		}
+
+		if (!check_rootdir(sc_fsfd, rootstat.st_ino)) {
+			mlog(MLOG_ERROR,
+"oops, seems to be a bind mount, please use the actual mountpoint instead\n");
+			return BOOL_FALSE;
+		}
+
 		sc_rootxfsstatp =
 			(struct xfs_bstat *)calloc(1, sizeof(struct xfs_bstat));
 		assert(sc_rootxfsstatp);
-- 
2.18.1


  reply	other threads:[~2020-11-03  2:34 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 ` Gao Xiang [this message]
2020-11-03 15:03   ` [PATCH v2 2/2] xfsdump: intercept bind mount targets 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
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=20201103023315.786103-2-hsiangkao@redhat.com \
    --to=hsiangkao@redhat.com \
    --cc=darrick.wong@oracle.com \
    --cc=linux-xfs@vger.kernel.org \
    --cc=sandeen@redhat.com \
    --subject='Re: [PATCH v2 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.