All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Darrick J. Wong" <djwong@kernel.org>
To: djwong@kernel.org, cem@kernel.org
Cc: Allison Henderson <allison.henderson@oracle.com>,
	linux-xfs@vger.kernel.org, allison.henderson@oracle.com,
	catherine.hoang@oracle.com
Subject: [PATCH 17/30] xfs_io: adapt parent command to new parent pointer ioctls
Date: Thu, 25 May 2023 19:26:15 -0700	[thread overview]
Message-ID: <168506078119.3749421.12166603001052436745.stgit@frogsfrogsfrogs> (raw)
In-Reply-To: <168506077876.3749421.7883085669588003826.stgit@frogsfrogsfrogs>

From: Darrick J. Wong <djwong@kernel.org>

For ages, xfs_io has had a totally useless 'parent' command that enabled
callers to walk the parents or print the directory tree path of an open
file.  This code used the ioctl interface presented by SGI's version of
parent pointers that was never merged.  Rework the code in here to use
the new ioctl interfaces that we've settled upon.  Get rid of the old
parent pointer checking code since xfs_repair/xfs_scrub will take care
of that.

(This originally was in the "xfsprogs: implement the upper half of
parent pointers" megapatch.)

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
Reviewed-by: Allison Henderson <allison.henderson@oracle.com>
---
 io/parent.c       |  470 ++++++++++++++---------------------------------------
 man/man8/xfs_io.8 |   21 +-
 2 files changed, 133 insertions(+), 358 deletions(-)


diff --git a/io/parent.c b/io/parent.c
index 8f63607ffec..65fd892bffc 100644
--- a/io/parent.c
+++ b/io/parent.c
@@ -7,365 +7,112 @@
 #include "command.h"
 #include "input.h"
 #include "libfrog/paths.h"
-#include "parent.h"
+#include "libfrog/getparents.h"
 #include "handle.h"
-#include "jdm.h"
 #include "init.h"
 #include "io.h"
 
-#define PARENTBUF_SZ		16384
-#define BSTATBUF_SZ		16384
-
 static cmdinfo_t parent_cmd;
-static int verbose_flag;
-static int err_status;
-static __u64 inodes_checked;
 static char *mntpt;
 
-/*
- * check out a parent entry to see if the values seem valid
- */
-static void
-check_parent_entry(struct xfs_bstat *bstatp, parent_t *parent)
+static int
+pptr_print(
+	const struct parent_rec	*rec,
+	void			*arg)
 {
-	int sts;
-	char fullpath[PATH_MAX];
-	struct stat statbuf;
-	char *str;
-
-	sprintf(fullpath, _("%s%s"), mntpt, parent->p_name);
-
-	sts = lstat(fullpath, &statbuf);
-	if (sts != 0) {
-		fprintf(stderr,
-			_("inode-path for inode: %llu is incorrect - path \"%s\" non-existent\n"),
-			(unsigned long long) bstatp->bs_ino, fullpath);
-		if (verbose_flag) {
-			fprintf(stderr,
-				_("path \"%s\" does not stat for inode: %llu; err = %s\n"),
-				fullpath,
-			       (unsigned long long) bstatp->bs_ino,
-				strerror(errno));
-		}
-		err_status++;
-		return;
-	} else {
-		if (verbose_flag > 1) {
-			printf(_("path \"%s\" found\n"), fullpath);
-		}
-	}
-
-	if (statbuf.st_ino != bstatp->bs_ino) {
-		fprintf(stderr,
-			_("inode-path for inode: %llu is incorrect - wrong inode#\n"),
-		       (unsigned long long) bstatp->bs_ino);
-		if (verbose_flag) {
-			fprintf(stderr,
-				_("ino mismatch for path \"%s\" %llu vs %llu\n"),
-				fullpath,
-				(unsigned long long)statbuf.st_ino,
-				(unsigned long long)bstatp->bs_ino);
-		}
-		err_status++;
-		return;
-	} else if (verbose_flag > 1) {
-		printf(_("inode number match: %llu\n"),
-			(unsigned long long)statbuf.st_ino);
-	}
+	const char		*name = (char *)rec->p_name;
+	unsigned int		namelen;
 
-	/* get parent path */
-	str = strrchr(fullpath, '/');
-	*str = '\0';
-	sts = stat(fullpath, &statbuf);
-	if (sts != 0) {
-		fprintf(stderr,
-			_("parent path \"%s\" does not stat: %s\n"),
-			fullpath,
-			strerror(errno));
-		err_status++;
-		return;
-	} else {
-		if (parent->p_ino != statbuf.st_ino) {
-			fprintf(stderr,
-				_("inode-path for inode: %llu is incorrect - wrong parent inode#\n"),
-			       (unsigned long long) bstatp->bs_ino);
-			if (verbose_flag) {
-				fprintf(stderr,
-					_("ino mismatch for path \"%s\" %llu vs %llu\n"),
-					fullpath,
-					(unsigned long long)parent->p_ino,
-					(unsigned long long)statbuf.st_ino);
-			}
-			err_status++;
-			return;
-		} else {
-			if (verbose_flag > 1) {
-			       printf(_("parent ino match for %llu\n"),
-				       (unsigned long long) parent->p_ino);
-			}
-		}
+	if (rec->p_flags & PARENT_IS_ROOT) {
+		printf(_("Root directory.\n"));
+		return 0;
 	}
-}
-
-static void
-check_parents(parent_t *parentbuf, size_t *parentbuf_size,
-	     jdm_fshandle_t *fshandlep, struct xfs_bstat *statp)
-{
-	int error, i;
-	__u32 count;
-	parent_t *entryp;
-
-	do {
-		error = jdm_parentpaths(fshandlep, statp, parentbuf, *parentbuf_size, &count);
-
-		if (error == ERANGE) {
-			*parentbuf_size *= 2;
-			parentbuf = (parent_t *)realloc(parentbuf, *parentbuf_size);
-		} else if (error) {
-			fprintf(stderr, _("parentpaths failed for ino %llu: %s\n"),
-			       (unsigned long long) statp->bs_ino,
-				strerror(errno));
-			err_status++;
-			break;
-		}
-	} while (error == ERANGE);
-
 
-	if (count == 0) {
-		/* no links for inode - something wrong here */
-	       fprintf(stderr, _("inode-path for inode: %llu is missing\n"),
-			       (unsigned long long) statp->bs_ino);
-		err_status++;
-	}
+	namelen = strlen(name);
+	printf(_("p_ino     = %llu\n"), (unsigned long long)rec->p_ino);
+	printf(_("p_gen     = %u\n"), (unsigned int)rec->p_gen);
+	printf(_("p_namelen = %u\n"), namelen);
+	printf(_("p_name    = \"%s\"\n\n"), rec->p_name);
 
-	entryp = parentbuf;
-	for (i = 0; i < count; i++) {
-		check_parent_entry(statp, entryp);
-		entryp = (parent_t*) (((char*)entryp) + entryp->p_reclen);
-	}
+	return 0;
 }
 
 static int
-do_bulkstat(parent_t *parentbuf, size_t *parentbuf_size,
-	    struct xfs_bstat *bstatbuf, int fsfd, jdm_fshandle_t *fshandlep)
+print_parents(
+	struct xfs_handle	*handle)
 {
-	__s32 buflenout;
-	__u64 lastino = 0;
-	struct xfs_bstat *p;
-	struct xfs_bstat *endp;
-	struct xfs_fsop_bulkreq bulkreq;
-	struct stat mntstat;
-
-	if (stat(mntpt, &mntstat)) {
-		fprintf(stderr, _("can't stat mount point \"%s\": %s\n"),
-			mntpt, strerror(errno));
-		return 1;
-	}
-
-	bulkreq.lastip  = &lastino;
-	bulkreq.icount  = BSTATBUF_SZ;
-	bulkreq.ubuffer = (void *)bstatbuf;
-	bulkreq.ocount  = &buflenout;
-
-	while (xfsctl(mntpt, fsfd, XFS_IOC_FSBULKSTAT, &bulkreq) == 0) {
-		if (*(bulkreq.ocount) == 0) {
-			return 0;
-		}
-		for (p = bstatbuf, endp = bstatbuf + *bulkreq.ocount; p < endp; p++) {
-
-			/* inode being modified, get synced data with iget */
-			if ( (!p->bs_nlink || !p->bs_mode) && p->bs_ino != 0 ) {
-
-				if (xfsctl(mntpt, fsfd, XFS_IOC_FSBULKSTAT_SINGLE, &bulkreq) < 0) {
-				    fprintf(stderr,
-					  _("failed to get bulkstat information for inode %llu\n"),
-					 (unsigned long long) p->bs_ino);
-				    continue;
-				}
-				if (!p->bs_nlink || !p->bs_mode || !p->bs_ino) {
-				    fprintf(stderr,
-					  _("failed to get valid bulkstat information for inode %llu\n"),
-					 (unsigned long long) p->bs_ino);
-				    continue;
-				}
-			}
-
-			/* skip root */
-			if (p->bs_ino == mntstat.st_ino) {
-				continue;
-			}
-
-			if (verbose_flag > 1) {
-			       printf(_("checking inode %llu\n"),
-				       (unsigned long long) p->bs_ino);
-			}
-
-			/* print dotted progress */
-			if ((inodes_checked % 100) == 0 && verbose_flag == 1) {
-				printf("."); fflush(stdout);
-			}
-			inodes_checked++;
-
-			check_parents(parentbuf, parentbuf_size, fshandlep, p);
-		}
+	int			ret;
 
-	}/*while*/
+	if (handle)
+		ret = handle_walk_parents(handle, sizeof(*handle), pptr_print,
+				NULL);
+	else
+		ret = fd_walk_parents(file->fd, pptr_print, NULL);
+	if (ret)
+		fprintf(stderr, "%s: %s\n", file->name, strerror(ret));
 
-	fprintf(stderr, _("syssgi bulkstat failed: %s\n"), strerror(errno));
-	return 1;
+	return 0;
 }
 
 static int
-parent_check(void)
+path_print(
+	const char		*mntpt,
+	const struct path_list	*path,
+	void			*arg)
 {
-	int fsfd;
-	jdm_fshandle_t *fshandlep;
-	parent_t *parentbuf;
-	size_t parentbuf_size = PARENTBUF_SZ;
-	struct xfs_bstat *bstatbuf;
-
-	err_status = 0;
-	inodes_checked = 0;
-
-	sync();
-
-        fsfd = file->fd;
-
-	fshandlep = jdm_getfshandle(mntpt);
-	if (fshandlep == NULL) {
-		fprintf(stderr, _("unable to open \"%s\" for jdm: %s\n"),
-		      mntpt,
-		      strerror(errno));
-		return 1;
-	}
+	char			buf[PATH_MAX];
+	size_t			len = PATH_MAX;
+	int			mntpt_len = strlen(mntpt);
+	int			ret;
 
-	/* allocate buffers */
-        bstatbuf = (struct xfs_bstat *)calloc(BSTATBUF_SZ, sizeof(struct xfs_bstat));
-	parentbuf = (parent_t *)malloc(parentbuf_size);
-	if (!bstatbuf || !parentbuf) {
-		fprintf(stderr, _("unable to allocate buffers: %s\n"),
-			strerror(errno));
-		err_status = 1;
-		goto out;
-	}
-
-	if (do_bulkstat(parentbuf, &parentbuf_size, bstatbuf, fsfd, fshandlep) != 0)
-		err_status++;
+	/* Trim trailing slashes from the mountpoint */
+	while (mntpt_len > 0 && mntpt[mntpt_len - 1] == '/')
+		mntpt_len--;
 
-	if (err_status > 0)
-		fprintf(stderr, _("num errors: %d\n"), err_status);
-	else
-		printf(_("succeeded checking %llu inodes\n"),
-			(unsigned long long) inodes_checked);
+	ret = snprintf(buf, len, "%.*s", mntpt_len, mntpt);
+	if (ret != mntpt_len)
+		return ENAMETOOLONG;
 
-out:
-	free(bstatbuf);
-	free(parentbuf);
-	free(fshandlep);
-	return err_status;
-}
+	ret = path_list_to_string(path, buf + ret, len - ret);
+	if (ret < 0)
+		return ENAMETOOLONG;
 
-static void
-print_parent_entry(parent_t *parent, int fullpath)
-{
-       printf(_("p_ino    = %llu\n"),  (unsigned long long) parent->p_ino);
-	printf(_("p_gen    = %u\n"),	parent->p_gen);
-	printf(_("p_reclen = %u\n"),	parent->p_reclen);
-	if (fullpath)
-		printf(_("p_name   = \"%s%s\"\n"), mntpt, parent->p_name);
-	else
-		printf(_("p_name   = \"%s\"\n"), parent->p_name);
+	printf("%s\n", buf);
+	return 0;
 }
 
 static int
-parent_list(int fullpath)
+print_paths(
+	struct xfs_handle	*handle)
 {
-	void *handlep = NULL;
-	size_t handlen;
-	int error, i;
-	int retval = 1;
-	__u32 count;
-	parent_t *entryp;
-	parent_t *parentbuf = NULL;
-	char *path = file->name;
-	int pb_size = PARENTBUF_SZ;
+	int			ret;
 
-	/* XXXX for linux libhandle version - to set libhandle fsfd cache */
-	{
-		void *fshandle;
-		size_t fshlen;
-
-		if (path_to_fshandle(mntpt, &fshandle, &fshlen) != 0) {
-			fprintf(stderr, _("%s: failed path_to_fshandle \"%s\": %s\n"),
-				progname, path, strerror(errno));
-			goto error;
-		}
-		free_handle(fshandle, fshlen);
-	}
-
-	if (path_to_handle(path, &handlep, &handlen) != 0) {
-		fprintf(stderr, _("%s: path_to_handle failed for \"%s\"\n"), progname, path);
-		goto error;
-	}
-
-	do {
-		parentbuf = (parent_t *)realloc(parentbuf, pb_size);
-		if (!parentbuf) {
-			fprintf(stderr, _("%s: unable to allocate parent buffer: %s\n"),
-				progname, strerror(errno));
-			goto error;
-		}
-
-		if (fullpath) {
-			error = parentpaths_by_handle(handlep,
-						       handlen,
-						       parentbuf,
-						       pb_size,
-						       &count);
-		} else {
-			error = parents_by_handle(handlep,
-						   handlen,
-						   parentbuf,
-						   pb_size,
-						   &count);
-		}
-		if (error == ERANGE) {
-			pb_size *= 2;
-		} else if (error) {
-			fprintf(stderr, _("%s: %s call failed for \"%s\": %s\n"),
-				progname, fullpath ? "parentpaths" : "parents",
-				path, strerror(errno));
-			goto error;
-		}
-	} while (error == ERANGE);
-
-	if (count == 0) {
-		/* no links for inode - something wrong here */
-		fprintf(stderr, _("%s: inode-path is missing\n"), progname);
-		goto error;
-	}
-
-	entryp = parentbuf;
-	for (i = 0; i < count; i++) {
-		print_parent_entry(entryp, fullpath);
-		entryp = (parent_t*) (((char*)entryp) + entryp->p_reclen);
-	}
-
-	retval = 0;
-error:
-	free(handlep);
-	free(parentbuf);
-	return retval;
+	if (handle)
+		ret = handle_walk_parent_paths(handle, sizeof(*handle),
+				path_print, NULL);
+	else
+		ret = fd_walk_parent_paths(file->fd, path_print, NULL);
+	if (ret)
+		fprintf(stderr, "%s: %s\n", file->name, strerror(ret));
+	return 0;
 }
 
 static int
-parent_f(int argc, char **argv)
+parent_f(
+	int			argc,
+	char			**argv)
 {
-	int c;
-	int listpath_flag = 0;
-	int check_flag = 0;
-	fs_path_t *fs;
-	static int tab_init;
+	struct xfs_handle	handle;
+	void			*hanp = NULL;
+	size_t			hlen;
+	struct fs_path		*fs;
+	char			*p;
+	uint64_t		ino = 0;
+	uint32_t		gen = 0;
+	int			c;
+	int			listpath_flag = 0;
+	int			ret;
+	static int		tab_init;
 
 	if (!tab_init) {
 		tab_init = 1;
@@ -380,46 +127,74 @@ parent_f(int argc, char **argv)
 	}
 	mntpt = fs->fs_dir;
 
-	verbose_flag = 0;
-
-	while ((c = getopt(argc, argv, "cpv")) != EOF) {
+	while ((c = getopt(argc, argv, "p")) != EOF) {
 		switch (c) {
-		case 'c':
-			check_flag = 1;
-			break;
 		case 'p':
 			listpath_flag = 1;
 			break;
-		case 'v':
-			verbose_flag++;
-			break;
 		default:
 			return command_usage(&parent_cmd);
 		}
 	}
 
-	if (!check_flag && !listpath_flag) /* default case */
-		exitcode = parent_list(listpath_flag);
-	else {
-		if (listpath_flag)
-			exitcode = parent_list(listpath_flag);
-		if (check_flag)
-			exitcode = parent_check();
+	/*
+	 * Always initialize the fshandle table because we need it for
+	 * the ppaths functions to work.
+	 */
+	ret = path_to_fshandle((char *)mntpt, &hanp, &hlen);
+	if (ret) {
+		perror(mntpt);
+		return 0;
 	}
 
+	if (optind + 2 == argc) {
+		ino = strtoull(argv[optind], &p, 0);
+		if (*p != '\0' || ino == 0) {
+			fprintf(stderr,
+				_("Bad inode number '%s'.\n"),
+				argv[optind]);
+			return 0;
+		}
+		gen = strtoul(argv[optind + 1], &p, 0);
+		if (*p != '\0') {
+			fprintf(stderr,
+				_("Bad generation number '%s'.\n"),
+				argv[optind + 1]);
+			return 0;
+		}
+
+		memcpy(&handle, hanp, sizeof(handle));
+		handle.ha_fid.fid_len = sizeof(xfs_fid_t) -
+				sizeof(handle.ha_fid.fid_len);
+		handle.ha_fid.fid_pad = 0;
+		handle.ha_fid.fid_ino = ino;
+		handle.ha_fid.fid_gen = gen;
+
+	} else if (optind != argc) {
+		return command_usage(&parent_cmd);
+	}
+
+	if (listpath_flag)
+		exitcode = print_paths(ino ? &handle : NULL);
+	else
+		exitcode = print_parents(ino ? &handle : NULL);
+
+	if (hanp)
+		free_handle(hanp, hlen);
+
 	return 0;
 }
 
 static void
 parent_help(void)
 {
-	printf(_(
+printf(_(
 "\n"
 " list the current file's parents and their filenames\n"
 "\n"
-" -c -- check the current file's file system for parent consistency\n"
-" -p -- list the current file's parents and their full paths\n"
-" -v -- verbose mode\n"
+" -p -- list the current file's paths up to the root\n"
+"\n"
+"If ino and gen are supplied, use them instead.\n"
 "\n"));
 }
 
@@ -430,11 +205,10 @@ parent_init(void)
 	parent_cmd.cfunc = parent_f;
 	parent_cmd.argmin = 0;
 	parent_cmd.argmax = -1;
-	parent_cmd.args = _("[-cpv]");
+	parent_cmd.args = _("[-p] [ino gen]");
 	parent_cmd.flags = CMD_NOMAP_OK;
-	parent_cmd.oneline = _("print or check parent inodes");
+	parent_cmd.oneline = _("print parent inodes");
 	parent_cmd.help = parent_help;
 
-	if (expert)
-		add_command(&parent_cmd);
+	add_command(&parent_cmd);
 }
diff --git a/man/man8/xfs_io.8 b/man/man8/xfs_io.8
index ac214ab4405..8b2ad588ebc 100644
--- a/man/man8/xfs_io.8
+++ b/man/man8/xfs_io.8
@@ -1013,25 +1013,26 @@ and
 options behave as described above, in
 .B chproj.
 .TP
-.BR parent " [ " \-cpv " ]"
+.BR parent " [ " \-p " ] [" " ino gen " "]"
 By default this command prints out the parent inode numbers,
 inode generation numbers and basenames of all the hardlinks which
 point to the inode of the current file.
+
+If the optional
+.B ino
+and
+.B gen
+parameters are provided, they will be used to create a file handle on the same
+filesystem as the open file.
+The parents of the file represented by the handle will be reported instead of
+the open file.
+
 .RS 1.0i
 .PD 0
 .TP 0.4i
 .B \-p
 the output is similar to the default output except pathnames up to
 the mount-point are printed out instead of the component name.
-.TP
-.B \-c
-the file's filesystem will check all the parent attributes for consistency.
-.TP
-.B \-v
-verbose output will be printed.
-.RE
-.IP
-.B [NOTE: Not currently operational on Linux.]
 .RE
 .PD
 .TP


  parent reply	other threads:[~2023-05-26  2:26 UTC|newest]

Thread overview: 134+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-05-26  0:07 [RFC MEGAPATCHSET v12 1/2] xfs: parent pointers and online repair part 2 Darrick J. Wong
2023-05-26  2:00 ` [PATCHSET RFC v12.0 00/11] fstests: adjust tests for xfs parent pointers Darrick J. Wong
2023-05-26  2:02   ` [PATCH 01/11] xfs/206: filter out the parent= status from mkfs Darrick J. Wong
2023-05-26  2:02   ` [PATCH 02/11] xfs/122: update for parent pointers Darrick J. Wong
2023-05-26  2:02   ` [PATCH 03/11] populate: create hardlinks " Darrick J. Wong
2023-05-26  2:03   ` [PATCH 04/11] xfs/021: adapt golden output files " Darrick J. Wong
2023-05-26  2:03   ` [PATCH 05/11] generic/050: adapt " Darrick J. Wong
2023-05-26  2:03   ` [PATCH 06/11] xfs/018: disable parent pointers for this test Darrick J. Wong
2023-05-26 20:01     ` Zorro Lang
2023-06-02  1:06       ` Darrick J. Wong
2023-06-02 10:27         ` Zorro Lang
2023-06-02 14:29           ` Darrick J. Wong
2023-05-26  2:03   ` [PATCH 07/11] xfs/306: fix formatting failures with parent pointers Darrick J. Wong
2023-05-26  2:04   ` [PATCH 08/11] common: add helpers for parent pointer tests Darrick J. Wong
2023-05-26  2:04   ` [PATCH 09/11] xfs: add parent pointer test Darrick J. Wong
2023-05-26  2:04   ` [PATCH 10/11] xfs: add multi link " Darrick J. Wong
2023-05-26  2:04   ` [PATCH 11/11] xfs: add parent pointer inject test Darrick J. Wong
2023-05-26  2:00 ` [PATCHSET v12.0 0/7] xfs: retain ILOCK during directory updates Darrick J. Wong
2023-05-26  2:05   ` [PATCH 1/7] xfs: Increase XFS_DEFER_OPS_NR_INODES to 5 Darrick J. Wong
2023-05-26  2:05   ` [PATCH 2/7] xfs: Increase XFS_QM_TRANS_MAXDQS " Darrick J. Wong
2023-05-26  2:05   ` [PATCH 3/7] xfs: Hold inode locks in xfs_ialloc Darrick J. Wong
2023-05-26  2:06   ` [PATCH 4/7] xfs: Hold inode locks in xfs_trans_alloc_dir Darrick J. Wong
2023-05-26  2:06   ` [PATCH 5/7] xfs: Hold inode locks in xfs_rename Darrick J. Wong
2023-05-26  2:06   ` [PATCH 6/7] xfs: don't pick up IOLOCK during rmapbt repair scan Darrick J. Wong
2023-05-26  2:06   ` [PATCH 7/7] xfs: unlock new repair tempfiles after creation Darrick J. Wong
2023-05-26  2:00 ` [PATCHSET v12.0 00/12] xfs: name-value xattr lookups Darrick J. Wong
2023-05-26  2:07   ` [PATCH 01/12] xfs: check opcode and iovec count match in xlog_recover_attri_commit_pass2 Darrick J. Wong
2023-05-26  2:07   ` [PATCH 02/12] xfs: make xfs_attr_set require XFS_DA_OP_REMOVE Darrick J. Wong
2023-05-26  2:07   ` [PATCH 03/12] xfs: allow xattr matching on name and value for local/sf attrs Darrick J. Wong
2023-05-26  2:07   ` [PATCH 04/12] xfs: preserve NVLOOKUP in xfs_attr_set Darrick J. Wong
2023-05-26  2:08   ` [PATCH 05/12] xfs: restructure xfs_attr_complete_op a bit Darrick J. Wong
2023-05-26  2:08   ` [PATCH 06/12] xfs: use helpers to extract xattr op from opflags Darrick J. Wong
2023-05-26  2:08   ` [PATCH 07/12] xfs: validate recovered name buffers when recovering xattr items Darrick J. Wong
2023-05-26  2:08   ` [PATCH 08/12] xfs: always set args->value in xfs_attri_item_recover Darrick J. Wong
2023-05-26  2:09   ` [PATCH 09/12] xfs: use local variables for name and value length in _attri_commit_pass2 Darrick J. Wong
2023-05-26  2:09   ` [PATCH 10/12] xfs: log NVLOOKUP xattr removal operations Darrick J. Wong
2023-05-26  2:09   ` [PATCH 11/12] xfs: log NVLOOKUP xattr setting operations Darrick J. Wong
2023-05-26  2:09   ` [PATCH 12/12] xfs: log NVLOOKUP xattr nvreplace operations Darrick J. Wong
2023-05-26  2:00 ` [PATCHSET v12.0 00/18] xfs: Parent Pointers Darrick J. Wong
2023-05-26  2:10   ` [PATCH 01/18] xfs: add parent pointer support to attribute code Darrick J. Wong
2023-05-26  2:10   ` [PATCH 02/18] xfs: define parent pointer ondisk extended attribute format Darrick J. Wong
2023-05-26  2:10   ` [PATCH 03/18] xfs: add parent pointer validator functions Darrick J. Wong
2023-05-26  2:10   ` [PATCH 04/18] xfs: extend transaction reservations for parent attributes Darrick J. Wong
2023-05-26  2:11   ` [PATCH 05/18] xfs: parent pointer attribute creation Darrick J. Wong
2023-05-26  2:11   ` [PATCH 06/18] xfs: add parent attributes to link Darrick J. Wong
2023-05-26  2:11   ` [PATCH 07/18] xfs: add parent attributes to symlink Darrick J. Wong
2023-05-26  2:11   ` [PATCH 08/18] xfs: remove parent pointers in unlink Darrick J. Wong
2023-05-26  2:12   ` [PATCH 09/18] xfs: Indent xfs_rename Darrick J. Wong
2023-05-26  2:12   ` [PATCH 10/18] xfs: Add parent pointers to rename Darrick J. Wong
2023-05-26  2:12   ` [PATCH 11/18] xfs: Add parent pointers to xfs_cross_rename Darrick J. Wong
2023-05-26  2:13   ` [PATCH 12/18] xfs: Filter XFS_ATTR_PARENT for getfattr Darrick J. Wong
2023-05-26  2:13   ` [PATCH 13/18] xfs: pass the attr value to put_listent when possible Darrick J. Wong
2023-05-26  2:13   ` [PATCH 14/18] xfs: Add parent pointer ioctl Darrick J. Wong
2023-05-26  2:13   ` [PATCH 15/18] xfs: fix unit conversion error in xfs_log_calc_max_attrsetm_res Darrick J. Wong
2023-05-26  2:14   ` [PATCH 16/18] xfs: drop compatibility minimum log size computations for reflink Darrick J. Wong
2023-05-26  2:14   ` [PATCH 17/18] xfs: don't remove the attr fork when parent pointers are enabled Darrick J. Wong
2023-05-26  2:14   ` [PATCH 18/18] xfs: Add the parent pointer support to the superblock version 5 Darrick J. Wong
2023-05-26  2:01 ` [PATCHSET v12.0 00/17] xfs: fsck for parent pointers Darrick J. Wong
2023-05-26  2:14   ` [PATCH 01/17] xfs: check dirents have " Darrick J. Wong
2023-05-26  2:15   ` [PATCH 02/17] xfs: deferred scrub of dirents Darrick J. Wong
2023-05-26  2:15   ` [PATCH 03/17] xfs: scrub parent pointers Darrick J. Wong
2023-05-26  2:15   ` [PATCH 04/17] xfs: deferred scrub of " Darrick J. Wong
2023-05-26  2:15   ` [PATCH 05/17] xfs: add raw parent pointer apis to support repair Darrick J. Wong
2023-05-26  2:16   ` [PATCH 06/17] xfs: set child file owner in xfs_da_args when changing parent pointers Darrick J. Wong
2023-05-26  2:16   ` [PATCH 07/17] xfs: salvage parent pointers when rebuilding xattr structures Darrick J. Wong
2023-05-26  2:16   ` [PATCH 08/17] xfs: teach the adoption code about parent pointers Darrick J. Wong
2023-05-26  2:16   ` [PATCH 09/17] xfs: replace namebuf with parent pointer in directory repair Darrick J. Wong
2023-05-26  2:17   ` [PATCH 10/17] xfs: repair directories by scanning directory parent pointers Darrick J. Wong
2023-05-26  2:17   ` [PATCH 11/17] xfs: implement live updates for directory repairs Darrick J. Wong
2023-05-26  2:17   ` [PATCH 12/17] xfs: replay unlocked parent pointer updates that accrue during xattr repair Darrick J. Wong
2023-05-26  2:17   ` [PATCH 13/17] xfs: replace namebuf with parent pointer in parent pointer repair Darrick J. Wong
2023-05-26  2:18   ` [PATCH 14/17] xfs: repair directory parent pointers by scanning for dirents Darrick J. Wong
2023-05-26  2:18   ` [PATCH 15/17] xfs: implement live updates for parent pointer repairs Darrick J. Wong
2023-05-26  2:18   ` [PATCH 16/17] xfs: remove pointless unlocked assertion Darrick J. Wong
2023-05-26  2:18   ` [PATCH 17/17] xfs: actually rebuild the parent pointer xattrs Darrick J. Wong
2023-05-26  2:01 ` [PATCHSET v12.0 0/1] xfsprogs: retain ILOCK during directory updates Darrick J. Wong
2023-05-26  2:19   ` [PATCH 1/1] xfs: Increase XFS_DEFER_OPS_NR_INODES to 5 Darrick J. Wong
2023-05-26  2:01 ` [PATCHSET v12.0 00/10] xfsprogs: name-value xattr lookups Darrick J. Wong
2023-05-26  2:19   ` [PATCH 01/10] xfs: make xfs_attr_set require XFS_DA_OP_REMOVE Darrick J. Wong
2023-05-26  2:19   ` [PATCH 02/10] xfs: allow xattr matching on name and value for local/sf attrs Darrick J. Wong
2023-05-26  2:20   ` [PATCH 03/10] xfs: preserve NVLOOKUP in xfs_attr_set Darrick J. Wong
2023-05-26  2:20   ` [PATCH 04/10] xfs: restructure xfs_attr_complete_op a bit Darrick J. Wong
2023-05-26  2:20   ` [PATCH 05/10] xfs: use helpers to extract xattr op from opflags Darrick J. Wong
2023-05-26  2:20   ` [PATCH 06/10] xfs: log NVLOOKUP xattr removal operations Darrick J. Wong
2023-05-26  2:21   ` [PATCH 07/10] xfs: log NVLOOKUP xattr setting operations Darrick J. Wong
2023-05-26  2:21   ` [PATCH 08/10] xfs: log NVLOOKUP xattr nvreplace operations Darrick J. Wong
2023-05-26  2:21   ` [PATCH 09/10] xfs_logprint: dump new attr log item fields Darrick J. Wong
2023-05-26  2:21   ` [PATCH 10/10] xfs_logprint: print missing attri header fields Darrick J. Wong
2023-05-26  2:01 ` [PATCHSET v12.0 00/30] xfsprogs: Parent Pointers Darrick J. Wong
2023-05-26  2:22   ` [PATCH 01/30] xfs: add parent pointer support to attribute code Darrick J. Wong
2023-05-26  2:22   ` [PATCH 02/30] xfs: define parent pointer ondisk extended attribute format Darrick J. Wong
2023-05-26  2:22   ` [PATCH 03/30] xfs: add parent pointer validator functions Darrick J. Wong
2023-05-26  2:22   ` [PATCH 04/30] xfs: extend transaction reservations for parent attributes Darrick J. Wong
2023-05-26  2:23   ` [PATCH 05/30] xfs: parent pointer attribute creation Darrick J. Wong
2023-05-26  2:23   ` [PATCH 06/30] xfs: add parent attributes to link Darrick J. Wong
2023-05-26  2:23   ` [PATCH 07/30] xfs: add parent attributes to symlink Darrick J. Wong
2023-05-26  2:23   ` [PATCH 08/30] xfs: remove parent pointers in unlink Darrick J. Wong
2023-05-26  2:24   ` [PATCH 09/30] xfs: Add parent pointers to rename Darrick J. Wong
2023-05-26  2:24   ` [PATCH 10/30] xfs: pass the attr value to put_listent when possible Darrick J. Wong
2023-05-26  2:24   ` [PATCH 11/30] xfs: Add parent pointer ioctl Darrick J. Wong
2023-05-26  2:24   ` [PATCH 12/30] xfs: fix unit conversion error in xfs_log_calc_max_attrsetm_res Darrick J. Wong
2023-05-26  2:25   ` [PATCH 13/30] xfs: drop compatibility minimum log size computations for reflink Darrick J. Wong
2023-05-26  2:25   ` [PATCH 14/30] xfs: don't remove the attr fork when parent pointers are enabled Darrick J. Wong
2023-05-26  2:25   ` [PATCH 15/30] xfs: Add the parent pointer support to the superblock version 5 Darrick J. Wong
2023-05-26  2:26   ` [PATCH 16/30] libfrog: add parent pointer support code Darrick J. Wong
2023-05-26  2:26   ` Darrick J. Wong [this message]
2023-05-26  2:26   ` [PATCH 18/30] xfs_io: Add i, n and f flags to parent command Darrick J. Wong
2023-05-26  2:26   ` [PATCH 19/30] xfs_logprint: decode parent pointers in ATTRI items fully Darrick J. Wong
2023-05-26  2:27   ` [PATCH 20/30] xfs_spaceman: report file paths Darrick J. Wong
2023-05-26  2:27   ` [PATCH 21/30] xfs_scrub: use parent pointers when possible to report file operations Darrick J. Wong
2023-05-26  2:27   ` [PATCH 22/30] xfs_db: report parent bit on xattrs Darrick J. Wong
2023-05-26  2:27   ` [PATCH 23/30] xfs_db: report parent pointers embedded in xattrs Darrick J. Wong
2023-05-26  2:28   ` [PATCH 24/30] xfs_db: obfuscate dirent and parent pointer names consistently Darrick J. Wong
2023-05-26  2:28   ` [PATCH 25/30] libxfs: export attr3_leaf_hdr_from_disk via libxfs_api_defs.h Darrick J. Wong
2023-05-26  2:28   ` [PATCH 26/30] xfs_db: add a parents command to list the parents of a file Darrick J. Wong
2023-05-26  2:28   ` [PATCH 27/30] libxfs: create new files with attr forks if necessary Darrick J. Wong
2023-05-26  2:29   ` [PATCH 28/30] xfsprogs: Fix default superblock attr bits Darrick J. Wong
2023-05-26  2:29   ` [PATCH 29/30] mkfs: Add parent pointers during protofile creation Darrick J. Wong
2023-05-26  2:29   ` [PATCH 30/30] mkfs: enable formatting with parent pointers Darrick J. Wong
2023-05-26  2:02 ` [PATCHSET v12.0 00/14] xfsprogs: fsck for " Darrick J. Wong
2023-05-26  2:29   ` [PATCH 01/14] xfs: create a blob array data structure Darrick J. Wong
2023-05-26  2:30   ` [PATCH 02/14] xfs: check dirents have parent pointers Darrick J. Wong
2023-05-26  2:30   ` [PATCH 03/14] xfs: add raw parent pointer apis to support repair Darrick J. Wong
2023-05-26  2:30   ` [PATCH 04/14] xfs: set child file owner in xfs_da_args when changing parent pointers Darrick J. Wong
2023-05-26  2:30   ` [PATCH 05/14] xfs: remove pointless unlocked assertion Darrick J. Wong
2023-05-26  2:31   ` [PATCH 06/14] xfs_repair: add parent pointers when messing with /lost+found Darrick J. Wong
2023-05-26  2:31   ` [PATCH 07/14] xfs_repair: build a parent pointer index Darrick J. Wong
2023-05-26  2:31   ` [PATCH 08/14] xfs_repair: move the global dirent name store to a separate object Darrick J. Wong
2023-05-26  2:31   ` [PATCH 09/14] xfs_repair: deduplicate strings stored in string blob Darrick J. Wong
2023-05-26  2:32   ` [PATCH 10/14] xfs_repair: check parent pointers Darrick J. Wong
2023-05-26  2:32   ` [PATCH 11/14] xfs_repair: dump garbage parent pointer attributes Darrick J. Wong
2023-05-26  2:32   ` [PATCH 12/14] xfs_repair: update ondisk parent pointer records Darrick J. Wong
2023-05-26  2:33   ` [PATCH 13/14] xfs_repair: wipe ondisk parent pointers when there are none Darrick J. Wong
2023-05-26  2:33   ` [PATCH 14/14] xfs_scrub: use parent pointers to report lost file data Darrick J. Wong

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=168506078119.3749421.12166603001052436745.stgit@frogsfrogsfrogs \
    --to=djwong@kernel.org \
    --cc=allison.henderson@oracle.com \
    --cc=catherine.hoang@oracle.com \
    --cc=cem@kernel.org \
    --cc=linux-xfs@vger.kernel.org \
    /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
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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.