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: linux-xfs@vger.kernel.org
Subject: [PATCH 2/4] xfs_scrub: improve thread scheduling repair items during phase 4
Date: Thu, 25 May 2023 18:48:01 -0700	[thread overview]
Message-ID: <168506072779.3744428.14221328041885064782.stgit@frogsfrogsfrogs> (raw)
In-Reply-To: <168506072752.3744428.6237393655315422413.stgit@frogsfrogsfrogs>

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

As it stands, xfs_scrub doesn't do a good job of scheduling repair items
during phase 4.  The repair lists are sharded by AG, and one repair
worker is started for each per-AG repair list.  Consequently, if one AG
requires considerably more work than the others (e.g. inodes are not
spread evenly among the AGs) then phase 4 can stall waiting for that one
worker thread when there's still plenty of CPU power available.

While our initial assumptions were that repairs would be vanishingly
scarce, the reality is that "repairs" can be triggered for optimizations
like gaps in the xattr structures, or clearing the inode reflink flag on
inodes that no longer share data.  In real world testing scenarios, the
lack of balance leads to complaints about excessive runtime of
xfs_scrub.

To fix these balance problems, we replace the per-AG repair item lists
in the scrub context with a single repair item list.  Phase 4 will be
redesigned as follows:

The repair worker will grab a repair item from the main list, try to
repair it, record whether the repair attempt made any progress, and
requeue the item if it was not fully fixed.  A separate repair scheduler
function starts the repair workers, and waits for them all to complete.
Requeued repairs are merged back into the main repair list.  If we made
any forward progress, we'll start another round of repairs with the
repair workers.  Phase 4 retains the behavior that if the pool stops
making forward progress, it will try all the repairs one last time,
serially.

To facilitate this new design, phase 2 will queue repairs of space
metadata items directly to the main list.  Phase 3's worker threads will
queue repair items to per-thread lists and splice those lists into the
main list at the end.

On a filesystem crafted to put all the inodes in a single AG, this
restores xfs_scrub's ability to parallelize repairs.  There seems to be
a slight performance hit for the evenly-spread case, but avoiding a
performance cliff due to an unbalanced fs is more important here.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
---
 include/list.h    |   14 +++
 scrub/phase1.c    |    8 +-
 scrub/phase2.c    |   23 +++++
 scrub/phase3.c    |  106 ++++++++++++++++---------
 scrub/phase4.c    |  226 ++++++++++++++++++++++++++++++++++++++---------------
 scrub/repair.c    |  135 +++++++++++++++++---------------
 scrub/repair.h    |   37 +++++++--
 scrub/xfs_scrub.h |    2 
 8 files changed, 377 insertions(+), 174 deletions(-)


diff --git a/include/list.h b/include/list.h
index dab4e23bd10..b1e2d49c8f3 100644
--- a/include/list.h
+++ b/include/list.h
@@ -152,6 +152,20 @@ static inline void list_splice_init(struct list_head *list,
 #define list_first_entry(ptr, type, member) \
 	list_entry((ptr)->next, type, member)
 
+/**
+ * list_first_entry_or_null - get the first element from a list
+ * @ptr:	the list head to take the element from.
+ * @type:	the type of the struct this is embedded in.
+ * @member:	the name of the list_head within the struct.
+ *
+ * Note that if the list is empty, it returns NULL.
+ */
+#define list_first_entry_or_null(ptr, type, member) ({ \
+	struct list_head *head__ = (ptr); \
+	struct list_head *pos__ = head__->next; \
+	pos__ != head__ ? list_entry(pos__, type, member) : NULL; \
+})
+
 #define container_of(ptr, type, member) ({			\
 	const typeof( ((type *)0)->member ) *__mptr = (ptr);	\
 	(type *)( (char *)__mptr - offsetof(type,member) );})
diff --git a/scrub/phase1.c b/scrub/phase1.c
index 09edd05625a..97b4386096e 100644
--- a/scrub/phase1.c
+++ b/scrub/phase1.c
@@ -89,7 +89,8 @@ scrub_cleanup(
 	if (error)
 		return error;
 
-	action_lists_free(&ctx->action_lists);
+	action_list_free(&ctx->action_list);
+
 	if (ctx->fshandle)
 		free_handle(ctx->fshandle, ctx->fshandle_len);
 	if (ctx->rtdev)
@@ -185,10 +186,9 @@ _("Not an XFS filesystem."));
 		return error;
 	}
 
-	error = action_lists_alloc(ctx->mnt.fsgeom.agcount,
-			&ctx->action_lists);
+	error = action_list_alloc(&ctx->action_list);
 	if (error) {
-		str_liberror(ctx, error, _("allocating action lists"));
+		str_liberror(ctx, error, _("allocating repair list"));
 		return error;
 	}
 
diff --git a/scrub/phase2.c b/scrub/phase2.c
index 8fe9cd4c831..a40545f6daf 100644
--- a/scrub/phase2.c
+++ b/scrub/phase2.c
@@ -50,6 +50,25 @@ warn_repair_difficulties(
 	str_info(ctx, descr, _("Filesystem might not be repairable."));
 }
 
+/* Add a scrub item that needs more work to fs metadata repair list. */
+static int
+defer_fs_repair(
+	struct scrub_ctx	*ctx,
+	const struct scrub_item	*sri)
+{
+	struct action_item	*aitem = NULL;
+	int			error;
+
+	error = repair_item_to_action_item(ctx, sri, &aitem);
+	if (error || !aitem)
+		return error;
+
+	pthread_mutex_lock(&ctx->lock);
+	action_list_add(ctx->action_list, aitem);
+	pthread_mutex_unlock(&ctx->lock);
+	return 0;
+}
+
 /* Scrub each AG's metadata btrees. */
 static void
 scan_ag_metadata(
@@ -108,7 +127,7 @@ scan_ag_metadata(
 		goto err;
 
 	/* Everything else gets fixed during phase 4. */
-	ret = repair_item_defer(ctx, &sri);
+	ret = defer_fs_repair(ctx, &sri);
 	if (ret)
 		goto err;
 	return;
@@ -144,7 +163,7 @@ scan_metafile(
 	difficulty = repair_item_difficulty(&sri);
 	warn_repair_difficulties(ctx, difficulty, xfrog_scrubbers[type].descr);
 
-	ret = repair_item_defer(ctx, &sri);
+	ret = defer_fs_repair(ctx, &sri);
 	if (ret) {
 		sctl->aborted = true;
 		goto out;
diff --git a/scrub/phase3.c b/scrub/phase3.c
index 93f503818f5..ad2723f9ae3 100644
--- a/scrub/phase3.c
+++ b/scrub/phase3.c
@@ -10,6 +10,7 @@
 #include "list.h"
 #include "libfrog/paths.h"
 #include "libfrog/workqueue.h"
+#include "libfrog/ptvar.h"
 #include "xfs_scrub.h"
 #include "common.h"
 #include "counter.h"
@@ -26,8 +27,8 @@ struct scrub_inode_ctx {
 	/* Number of inodes scanned. */
 	struct ptcounter	*icount;
 
-	/* per-AG locks to protect the repair lists */
-	pthread_mutex_t		*locks;
+	/* Per-thread lists of file repair items. */
+	struct ptvar		*repair_ptlists;
 
 	/* Set to true to abort all threads. */
 	bool			aborted;
@@ -51,28 +52,28 @@ report_close_error(
 	str_errno(ctx, descr);
 }
 
-/*
- * Defer all the repairs until phase 4, being careful about locking since the
- * inode scrub threads are not per-AG.
- */
+/* Defer all the repairs until phase 4. */
 static int
 defer_inode_repair(
 	struct scrub_inode_ctx		*ictx,
-	const struct xfs_bulkstat	*bstat,
-	struct scrub_item		*sri)
+	const struct scrub_item		*sri)
 {
+	struct action_list		*alist;
 	struct action_item		*aitem = NULL;
-	xfs_agnumber_t			agno;
 	int				ret;
 
 	ret = repair_item_to_action_item(ictx->ctx, sri, &aitem);
 	if (ret || !aitem)
 		return ret;
 
-	agno = cvt_ino_to_agno(&ictx->ctx->mnt, bstat->bs_ino);
-	pthread_mutex_lock(&ictx->locks[agno]);
-	action_list_add(&ictx->ctx->action_lists[agno], aitem);
-	pthread_mutex_unlock(&ictx->locks[agno]);
+	alist = ptvar_get(ictx->repair_ptlists, &ret);
+	if (ret) {
+		str_liberror(ictx->ctx, ret,
+ _("getting per-thread inode repair list"));
+		return ret;
+	}
+
+	action_list_add(alist, aitem);
 	return 0;
 }
 
@@ -81,8 +82,7 @@ static int
 try_inode_repair(
 	struct scrub_inode_ctx		*ictx,
 	struct scrub_item		*sri,
-	int				fd,
-	const struct xfs_bulkstat	*bstat)
+	int				fd)
 {
 	/*
 	 * If at the start of phase 3 we already had ag/rt metadata repairs
@@ -149,7 +149,7 @@ scrub_inode(
 	if (error)
 		goto out;
 
-	error = try_inode_repair(ictx, &sri, fd, bstat);
+	error = try_inode_repair(ictx, &sri, fd);
 	if (error)
 		goto out;
 
@@ -161,7 +161,7 @@ scrub_inode(
 	if (error)
 		goto out;
 
-	error = try_inode_repair(ictx, &sri, fd, bstat);
+	error = try_inode_repair(ictx, &sri, fd);
 	if (error)
 		goto out;
 
@@ -178,7 +178,7 @@ scrub_inode(
 		goto out;
 
 	/* Try to repair the file while it's open. */
-	error = try_inode_repair(ictx, &sri, fd, bstat);
+	error = try_inode_repair(ictx, &sri, fd);
 	if (error)
 		goto out;
 
@@ -195,7 +195,7 @@ scrub_inode(
 	progress_add(1);
 
 	if (!error && !ictx->aborted)
-		error = defer_inode_repair(ictx, bstat, &sri);
+		error = defer_inode_repair(ictx, &sri);
 
 	if (fd >= 0) {
 		int	err2;
@@ -212,6 +212,33 @@ scrub_inode(
 	return error;
 }
 
+/*
+ * Collect all the inode repairs in the file repair list.  No need for locks
+ * here, since we're single-threaded.
+ */
+static int
+collect_repairs(
+	struct ptvar		*ptv,
+	void			*data,
+	void			*foreach_arg)
+{
+	struct scrub_ctx	*ctx = foreach_arg;
+	struct action_list	*alist = data;
+
+	action_list_merge(ctx->action_list, alist);
+	return 0;
+}
+
+/* Initialize this per-thread file repair item list. */
+static void
+action_ptlist_init(
+	void			*priv)
+{
+	struct action_list	*alist = priv;
+
+	action_list_init(alist);
+}
+
 /* Verify all the inodes in a filesystem. */
 int
 phase3_func(
@@ -222,17 +249,18 @@ phase3_func(
 	xfs_agnumber_t		agno;
 	int			err;
 
+	err = -ptvar_alloc(scrub_nproc(ctx), sizeof(struct action_list),
+			action_ptlist_init, &ictx.repair_ptlists);
+	if (err) {
+		str_liberror(ctx, err,
+	_("creating per-thread file repair item lists"));
+		return err;
+	}
+
 	err = ptcounter_alloc(scrub_nproc(ctx), &ictx.icount);
 	if (err) {
 		str_liberror(ctx, err, _("creating scanned inode counter"));
-		return err;
-	}
-
-	ictx.locks = calloc(ctx->mnt.fsgeom.agcount, sizeof(pthread_mutex_t));
-	if (!ictx.locks) {
-		str_errno(ctx, _("creating per-AG repair list locks"));
-		err = ENOMEM;
-		goto out_ptcounter;
+		goto out_ptvar;
 	}
 
 	/*
@@ -241,9 +269,7 @@ phase3_func(
 	 * to repair the space metadata.
 	 */
 	for (agno = 0; agno < ctx->mnt.fsgeom.agcount; agno++) {
-		pthread_mutex_init(&ictx.locks[agno], NULL);
-
-		if (!action_list_empty(&ctx->action_lists[agno]))
+		if (!action_list_empty(ctx->action_list))
 			ictx.always_defer_repairs = true;
 	}
 
@@ -251,22 +277,30 @@ phase3_func(
 	if (!err && ictx.aborted)
 		err = ECANCELED;
 	if (err)
-		goto out_locks;
+		goto out_ptcounter;
+
+	/*
+	 * Combine all of the file repair items into the main repair list.
+	 * We don't need locks here since we're the only thread running now.
+	 */
+	err = -ptvar_foreach(ictx.repair_ptlists, collect_repairs, ctx);
+	if (err) {
+		str_liberror(ctx, err, _("collecting inode repair lists"));
+		goto out_ptcounter;
+	}
 
 	scrub_report_preen_triggers(ctx);
 	err = ptcounter_value(ictx.icount, &val);
 	if (err) {
 		str_liberror(ctx, err, _("summing scanned inode counter"));
-		goto out_locks;
+		goto out_ptcounter;
 	}
 
 	ctx->inodes_checked = val;
-out_locks:
-	for (agno = 0; agno < ctx->mnt.fsgeom.agcount; agno++)
-		pthread_mutex_destroy(&ictx.locks[agno]);
-	free(ictx.locks);
 out_ptcounter:
 	ptcounter_free(ictx.icount);
+out_ptvar:
+	ptvar_free(ictx.repair_ptlists);
 	return err;
 }
 
diff --git a/scrub/phase4.c b/scrub/phase4.c
index b3491f27312..61405dacec4 100644
--- a/scrub/phase4.c
+++ b/scrub/phase4.c
@@ -17,57 +17,166 @@
 #include "scrub.h"
 #include "repair.h"
 #include "vfs.h"
+#include "atomic.h"
 
 /* Phase 4: Repair filesystem. */
 
-/* Fix all the problems in our per-AG list. */
+struct repair_list_schedule {
+	struct action_list		*repair_list;
+
+	/* Action items that we could not resolve and want to try again. */
+	struct action_list		requeue_list;
+
+	pthread_mutex_t			lock;
+
+	/* Workers use this to signal the scheduler when all work is done. */
+	pthread_cond_t			done;
+
+	/* Number of workers that are still running. */
+	unsigned int			workers;
+
+	/* Or should we all abort? */
+	bool				aborted;
+
+	/* Did we make any progress this round? */
+	bool				made_progress;
+};
+
+/* Try to repair as many things on our list as we can. */
 static void
-repair_ag(
+repair_list_worker(
 	struct workqueue		*wq,
 	xfs_agnumber_t			agno,
 	void				*priv)
 {
+	struct repair_list_schedule	*rls = priv;
 	struct scrub_ctx		*ctx = (struct scrub_ctx *)wq->wq_ctx;
-	bool				*aborted = priv;
-	struct action_list		*alist;
-	unsigned long long		unfixed;
-	unsigned long long		new_unfixed;
-	unsigned int			flags = 0;
-	int				ret;
-
-	alist = &ctx->action_lists[agno];
-	unfixed = action_list_length(alist);
-
-	/* Repair anything broken until we fail to make progress. */
-	do {
-		ret = action_list_process(ctx, alist, flags);
+
+	pthread_mutex_lock(&rls->lock);
+	while (!rls->aborted) {
+		struct action_item	*aitem;
+		enum tryrepair_outcome	outcome;
+		int			ret;
+
+		aitem = action_list_pop(rls->repair_list);
+		if (!aitem)
+			break;
+
+		pthread_mutex_unlock(&rls->lock);
+		ret = action_item_try_repair(ctx, aitem, &outcome);
+		pthread_mutex_lock(&rls->lock);
+
 		if (ret) {
-			*aborted = true;
-			return;
+			rls->aborted = true;
+			free(aitem);
+			break;
 		}
-		new_unfixed = action_list_length(alist);
-		if (new_unfixed == unfixed)
+
+		switch (outcome) {
+		case TR_REQUEUE:
+			/*
+			 * Partial progress.  Make a note of that and requeue
+			 * this item for the next round.
+			 */
+			rls->made_progress = true;
+			action_list_add(&rls->requeue_list, aitem);
+			break;
+		case TR_NOPROGRESS:
+			/*
+			 * No progress.  Requeue this item for a later round,
+			 * which could happen if something else makes progress.
+			 */
+			action_list_add(&rls->requeue_list, aitem);
 			break;
-		unfixed = new_unfixed;
-		if (*aborted)
-			return;
-	} while (unfixed > 0);
-
-	/* Try once more, but this time complain if we can't fix things. */
-	flags |= XRM_FINAL_WARNING;
-	ret = action_list_process(ctx, alist, flags);
-	if (ret)
-		*aborted = true;
+		case TR_REPAIRED:
+			/* Item is clean.  Free it. */
+			free(aitem);
+			break;
+		}
+	}
+
+	rls->workers--;
+	if (rls->workers == 0)
+		pthread_cond_broadcast(&rls->done);
+	pthread_mutex_unlock(&rls->lock);
+}
+
+/*
+ * Schedule repair list workers.  Returns 1 if we made progress, 0 if we
+ * did not, or -1 if we need to abort everything.
+ */
+static int
+repair_list_schedule(
+	struct scrub_ctx		*ctx,
+	struct workqueue		*wq,
+	struct action_list		*repair_list)
+{
+	struct repair_list_schedule	rls = {
+		.lock			= PTHREAD_MUTEX_INITIALIZER,
+		.done			= PTHREAD_COND_INITIALIZER,
+		.repair_list		= repair_list,
+	};
+	unsigned int			i;
+	unsigned int			nr_workers = scrub_nproc(ctx);
+	bool				made_any_progress = false;
+	int				ret = 0;
+
+	if (action_list_empty(repair_list))
+		return 0;
+
+	action_list_init(&rls.requeue_list);
+
+	/*
+	 * Use the workers to run through the entire repair list once.  Requeue
+	 * anything that did not make progress, and keep trying as long as the
+	 * workers made any kind of progress.
+	 */
+	do {
+		rls.made_progress = false;
+
+		/* Start all the worker threads. */
+		for (i = 0; i < nr_workers; i++) {
+			pthread_mutex_lock(&rls.lock);
+			rls.workers++;
+			pthread_mutex_unlock(&rls.lock);
+
+			ret = -workqueue_add(wq, repair_list_worker, 0, &rls);
+			if (ret) {
+				str_liberror(ctx, ret,
+ _("queueing repair list worker"));
+				pthread_mutex_lock(&rls.lock);
+				rls.workers--;
+				pthread_mutex_unlock(&rls.lock);
+				break;
+			}
+		}
+
+		/* Wait for all worker functions to return. */
+		pthread_mutex_lock(&rls.lock);
+		if (rls.workers > 0)
+			pthread_cond_wait(&rls.done, &rls.lock);
+		pthread_mutex_unlock(&rls.lock);
+
+		action_list_merge(repair_list, &rls.requeue_list);
+
+		if (ret || rls.aborted)
+			return -1;
+		if (rls.made_progress)
+			made_any_progress = true;
+	} while (rls.made_progress && !action_list_empty(repair_list));
+
+	if (made_any_progress)
+	       return 1;
+	return 0;
 }
 
-/* Process all the action items. */
+/* Process both repair lists. */
 static int
 repair_everything(
 	struct scrub_ctx		*ctx)
 {
 	struct workqueue		wq;
-	xfs_agnumber_t			agno;
-	bool				aborted = false;
+	int				fixed_anything;
 	int				ret;
 
 	ret = -workqueue_create(&wq, (struct xfs_mount *)ctx,
@@ -76,41 +185,32 @@ repair_everything(
 		str_liberror(ctx, ret, _("creating repair workqueue"));
 		return ret;
 	}
-	for (agno = 0; !aborted && agno < ctx->mnt.fsgeom.agcount; agno++) {
-		if (action_list_length(&ctx->action_lists[agno]) == 0)
-			continue;
 
-		ret = -workqueue_add(&wq, repair_ag, agno, &aborted);
-		if (ret) {
-			str_liberror(ctx, ret, _("queueing repair work"));
+	/*
+	 * Try to fix everything on the space metadata repair list and then the
+	 * file repair list until we stop making progress.  These repairs can
+	 * be threaded, if the user desires.
+	 */
+	do {
+		fixed_anything = 0;
+
+		ret = repair_list_schedule(ctx, &wq, ctx->action_list);
+		if (ret < 0)
 			break;
-		}
-	}
+		if (ret == 1)
+			fixed_anything++;
+	} while (fixed_anything > 0);
 
 	ret = -workqueue_terminate(&wq);
 	if (ret)
 		str_liberror(ctx, ret, _("finishing repair work"));
 	workqueue_destroy(&wq);
 
-	if (aborted)
-		return ECANCELED;
+	if (ret < 0)
+		return ret;
 
-	return 0;
-}
-
-/* Decide if we have any repair work to do. */
-static inline bool
-have_action_items(
-	struct scrub_ctx	*ctx)
-{
-	xfs_agnumber_t		agno;
-
-	for (agno = 0; agno < ctx->mnt.fsgeom.agcount; agno++) {
-		if (action_list_length(&ctx->action_lists[agno]) > 0)
-			return true;
-	}
-
-	return false;
+	/* Repair everything serially.  Last chance to fix things. */
+	return action_list_process(ctx, ctx->action_list, XRM_FINAL_WARNING);
 }
 
 /* Trim the unused areas of the filesystem if the caller asked us to. */
@@ -132,7 +232,7 @@ phase4_func(
 	struct scrub_item	sri;
 	int			ret;
 
-	if (!have_action_items(ctx))
+	if (action_list_empty(ctx->action_list))
 		goto maybe_trim;
 
 	/*
@@ -190,12 +290,12 @@ phase4_estimate(
 	unsigned int		*nr_threads,
 	int			*rshift)
 {
-	xfs_agnumber_t		agno;
-	unsigned long long	need_fixing = 0;
+	unsigned long long	need_fixing;
 
-	for (agno = 0; agno < ctx->mnt.fsgeom.agcount; agno++)
-		need_fixing += action_list_length(&ctx->action_lists[agno]);
+	/* Everything on the repair list plus FSTRIM. */
+	need_fixing = action_list_length(ctx->action_list);
 	need_fixing++;
+
 	*items = need_fixing;
 	*nr_threads = scrub_nproc(ctx) + 1;
 	*rshift = 0;
diff --git a/scrub/repair.c b/scrub/repair.c
index b49f2c7a8e1..b1395275160 100644
--- a/scrub/repair.c
+++ b/scrub/repair.c
@@ -396,58 +396,41 @@ repair_item_difficulty(
 	return ret;
 }
 
-/*
- * Allocate a certain number of repair lists for the scrub context.  Returns
- * zero or a positive error number.
- */
+/* Create a new repair action list. */
 int
-action_lists_alloc(
-	size_t				nr,
-	struct action_list		**listsp)
+action_list_alloc(
+	struct action_list		**listp)
 {
-	struct action_list		*lists;
-	xfs_agnumber_t			agno;
+	struct action_list		*alist;
 
-	lists = calloc(nr, sizeof(struct action_list));
-	if (!lists)
+	alist = malloc(sizeof(struct action_list));
+	if (!alist)
 		return errno;
 
-	for (agno = 0; agno < nr; agno++)
-		action_list_init(&lists[agno]);
-	*listsp = lists;
-
+	action_list_init(alist);
+	*listp = alist;
 	return 0;
 }
 
-/* Discard repair list contents. */
+/* Free the repair lists. */
 void
-action_list_discard(
-	struct action_list		*alist)
+action_list_free(
+	struct action_list		**listp)
 {
+	struct action_list		*alist = *listp;
 	struct action_item		*aitem;
 	struct action_item		*n;
 
+	if (!(*listp))
+		return;
+
 	list_for_each_entry_safe(aitem, n, &alist->list, list) {
 		list_del(&aitem->list);
 		free(aitem);
 	}
-}
 
-/* Free the repair lists. */
-void
-action_lists_free(
-	struct action_list		**listsp)
-{
-	free(*listsp);
-	*listsp = NULL;
-}
-
-/* Initialize repair list */
-void
-action_list_init(
-	struct action_list		*alist)
-{
-	INIT_LIST_HEAD(&alist->list);
+	free(alist);
+	*listp = NULL;
 }
 
 /* Number of pending repairs in this list. */
@@ -464,7 +447,23 @@ action_list_length(
 	return ret;
 }
 
-/* Add to the list of repairs. */
+/* Remove the first action item from the action list. */
+struct action_item *
+action_list_pop(
+	struct action_list		*alist)
+{
+	struct action_item		*aitem;
+
+	aitem = list_first_entry_or_null(&alist->list, struct action_item,
+			list);
+	if (!aitem)
+		return NULL;
+
+	list_del_init(&aitem->list);
+	return aitem;
+}
+
+/* Add an action item to the end of a list. */
 void
 action_list_add(
 	struct action_list		*alist,
@@ -473,6 +472,46 @@ action_list_add(
 	list_add_tail(&aitem->list, &alist->list);
 }
 
+/*
+ * Try to repair a filesystem object and let the caller know what it should do
+ * with the action item.  The caller must be able to requeue action items, so
+ * we don't complain if repairs are not totally successful.
+ */
+int
+action_item_try_repair(
+	struct scrub_ctx	*ctx,
+	struct action_item	*aitem,
+	enum tryrepair_outcome	*outcome)
+{
+	struct scrub_item	*sri = &aitem->sri;
+	unsigned int		before, after;
+	int			ret;
+
+	before = repair_item_count_needsrepair(sri);
+
+	ret = repair_item(ctx, sri, 0);
+	if (ret)
+		return ret;
+
+	after = repair_item_count_needsrepair(sri);
+	if (after > 0) {
+		/*
+		 * The kernel did not complete all of the repairs requested.
+		 * If it made some progress we'll requeue; otherwise, let the
+		 * caller know that nothing got fixed.
+		 */
+		if (before != after)
+			*outcome = TR_REQUEUE;
+		else
+			*outcome = TR_NOPROGRESS;
+		return 0;
+	}
+
+	/* Repairs complete. */
+	*outcome = TR_REPAIRED;
+	return 0;
+}
+
 /* Repair everything on this list. */
 int
 action_list_process(
@@ -676,29 +715,3 @@ repair_item_to_action_item(
 	*aitemp = aitem;
 	return 0;
 }
-
-/* Defer all the repairs until phase 4. */
-int
-repair_item_defer(
-	struct scrub_ctx	*ctx,
-	const struct scrub_item	*sri)
-{
-	struct action_item	*aitem = NULL;
-	unsigned int		agno;
-	int			error;
-
-	error = repair_item_to_action_item(ctx, sri, &aitem);
-	if (error || !aitem)
-		return error;
-
-	if (sri->sri_agno != -1U)
-		agno = sri->sri_agno;
-	else if (sri->sri_ino != -1ULL && sri->sri_gen != -1U)
-		agno = cvt_ino_to_agno(&ctx->mnt, sri->sri_ino);
-	else
-		agno = 0;
-	ASSERT(agno < ctx->mnt.fsgeom.agcount);
-
-	action_list_add(&ctx->action_lists[agno], aitem);
-	return 0;
-}
diff --git a/scrub/repair.h b/scrub/repair.h
index 185e539d53c..2ca00bef64a 100644
--- a/scrub/repair.h
+++ b/scrub/repair.h
@@ -12,19 +12,43 @@ struct action_list {
 
 struct action_item;
 
-int action_lists_alloc(size_t nr, struct action_list **listsp);
-void action_lists_free(struct action_list **listsp);
+int action_list_alloc(struct action_list **listp);
+void action_list_free(struct action_list **listp);
+static inline void action_list_init(struct action_list *alist)
+{
+	INIT_LIST_HEAD(&alist->list);
+}
 
-void action_list_init(struct action_list *alist);
+unsigned long long action_list_length(struct action_list *alist);
+
+/* Move all the items of @src to the tail of @dst, and reinitialize @src. */
+static inline void
+action_list_merge(
+	struct action_list	*dst,
+	struct action_list	*src)
+{
+	list_splice_tail_init(&src->list, &dst->list);
+}
+
+struct action_item *action_list_pop(struct action_list *alist);
+void action_list_add(struct action_list *alist, struct action_item *aitem);
 
 static inline bool action_list_empty(const struct action_list *alist)
 {
 	return list_empty(&alist->list);
 }
 
-unsigned long long action_list_length(struct action_list *alist);
-void action_list_add(struct action_list *dest, struct action_item *item);
-void action_list_discard(struct action_list *alist);
+enum tryrepair_outcome {
+	/* No progress was made on repairs at all. */
+	TR_NOPROGRESS = 0,
+	/* Some progress was made on repairs; try again soon. */
+	TR_REQUEUE,
+	/* Repairs completely successful. */
+	TR_REPAIRED,
+};
+
+int action_item_try_repair(struct scrub_ctx *ctx, struct action_item *aitem,
+		enum tryrepair_outcome *outcome);
 
 void repair_item_mustfix(struct scrub_item *sri, struct scrub_item *fix_now);
 
@@ -56,7 +80,6 @@ int repair_item(struct scrub_ctx *ctx, struct scrub_item *sri,
 		unsigned int repair_flags);
 int repair_item_to_action_item(struct scrub_ctx *ctx,
 		const struct scrub_item *sri, struct action_item **aitemp);
-int repair_item_defer(struct scrub_ctx *ctx, const struct scrub_item *sri);
 
 static inline unsigned int
 repair_item_count_needsrepair(
diff --git a/scrub/xfs_scrub.h b/scrub/xfs_scrub.h
index 1df3191e85c..96a6aa06eac 100644
--- a/scrub/xfs_scrub.h
+++ b/scrub/xfs_scrub.h
@@ -71,7 +71,7 @@ struct scrub_ctx {
 
 	/* Mutable scrub state; use lock. */
 	pthread_mutex_t		lock;
-	struct action_list	*action_lists;
+	struct action_list	*action_list;
 	unsigned long long	max_errors;
 	unsigned long long	runtime_errors;
 	unsigned long long	corruptions_found;


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

Thread overview: 385+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-05-26  0:00 [MEGAPATCHSET v25 1/2] xfs: online repair, part 1 Darrick J. Wong
2023-05-26  0:28 ` [PATCHSET 0/7] xfs: fix ranged queries and integer overflows in GETFSMAP Darrick J. Wong
2023-05-26  0:41   ` [PATCH 1/7] xfs: fix interval filtering in multi-step fsmap queries Darrick J. Wong
2023-05-26  0:41   ` [PATCH 2/7] xfs: fix integer overflows in the fsmap rtbitmap and logdev backends Darrick J. Wong
2023-05-26  0:41   ` [PATCH 3/7] xfs: fix getfsmap reporting past the last rt extent Darrick J. Wong
2023-05-26  0:42   ` [PATCH 4/7] xfs: clean up the rtbitmap fsmap backend Darrick J. Wong
2023-05-26  0:42   ` [PATCH 5/7] xfs: fix logdev fsmap query result filtering Darrick J. Wong
2023-05-26  0:42   ` [PATCH 6/7] xfs: validate fsmap offsets specified in the query keys Darrick J. Wong
2023-05-26  0:42   ` [PATCH 7/7] xfs: fix xfs_btree_query_range callers to initialize btree rec fully Darrick J. Wong
2023-06-04 17:56   ` [PATCHSET 0/7] xfs: fix ranged queries and integer overflows in GETFSMAP Darrick J. Wong
2023-06-04 23:02     ` Dave Chinner
2023-06-20  2:09   ` Dave Chinner
2023-06-30  0:00     ` Darrick J. Wong
2023-05-26  0:28 ` [PATCHSET v25.0 0/9] xfs: fix online repair block reaping Darrick J. Wong
2023-05-26  0:43   ` [PATCH 1/9] xfs: cull repair code that will never get used Darrick J. Wong
2023-05-26  0:43   ` [PATCH 2/9] xfs: move the post-repair block reaping code to a separate file Darrick J. Wong
2023-05-26  0:43   ` [PATCH 3/9] xfs: only invalidate blocks if we're going to free them Darrick J. Wong
2023-05-26  0:44   ` [PATCH 4/9] xfs: only allow reaping of per-AG blocks in xrep_reap_extents Darrick J. Wong
2023-05-26  0:44   ` [PATCH 5/9] xfs: use deferred frees to reap old btree blocks Darrick J. Wong
2023-06-20  3:08     ` Dave Chinner
2023-06-20  4:27       ` Darrick J. Wong
2023-05-26  0:44   ` [PATCH 6/9] xfs: rearrange xrep_reap_block to make future code flow easier Darrick J. Wong
2023-05-26  0:44   ` [PATCH 7/9] xfs: ignore stale buffers when scanning the buffer cache Darrick J. Wong
2023-06-20  3:24     ` Dave Chinner
2023-06-20  4:44       ` Darrick J. Wong
2023-06-20  6:01         ` Dave Chinner
2023-07-05 23:17           ` Darrick J. Wong
2023-07-09 23:15             ` Dave Chinner
2023-07-09 23:32               ` Darrick J. Wong
2023-07-10 22:07                 ` Dave Chinner
2023-05-26  0:45   ` [PATCH 8/9] xfs: reap large AG metadata extents when possible Darrick J. Wong
2023-06-20  5:47     ` Dave Chinner
2023-07-07 21:50       ` Darrick J. Wong
2023-05-26  0:45   ` [PATCH 9/9] xfs: use per-AG bitmaps to reap unused AG metadata blocks during repair Darrick J. Wong
2023-05-26  0:28 ` [PATCHSET v25.0 0/6] xfs: prepare repair for bulk loading Darrick J. Wong
2023-05-26  0:45   ` [PATCH 1/6] xfs: force all buffers to be written during btree bulk load Darrick J. Wong
2023-06-21  2:05     ` Dave Chinner
2023-07-05 23:37       ` Darrick J. Wong
2023-05-26  0:45   ` [PATCH 2/6] xfs: implement block reservation accounting for btrees we're staging Darrick J. Wong
2023-05-26  0:46   ` [PATCH 3/6] xfs: log EFIs for all btree blocks being used to stage a btree Darrick J. Wong
2023-05-26  0:46   ` [PATCH 4/6] xfs: add debug knobs to control btree bulk load slack factors Darrick J. Wong
2023-05-26  0:46   ` [PATCH 5/6] xfs: move btree bulkload record initialization to ->get_record implementations Darrick J. Wong
2023-05-26  0:46   ` [PATCH 6/6] xfs: constrain dirty buffers while formatting a staged btree Darrick J. Wong
2023-05-26  0:28 ` [PATCHSET v25.0 0/7] xfs: stage repair information in pageable memory Darrick J. Wong
2023-05-26  0:47   ` [PATCH 1/7] xfs: create a big array data structure Darrick J. Wong
2023-05-26  1:34     ` Kent Overstreet
2023-05-26  3:19       ` Darrick J. Wong
2023-06-22  2:55     ` Dave Chinner
2023-07-05 23:48       ` Darrick J. Wong
2023-05-26  0:47   ` [PATCH 2/7] xfs: enable sorting of xfile-backed arrays Darrick J. Wong
2023-05-26  0:47   ` [PATCH 3/7] xfs: convert xfarray insertion sort to heapsort using scratchpad memory Darrick J. Wong
2023-05-26  0:47   ` [PATCH 4/7] xfs: teach xfile to pass back direct-map pages to caller Darrick J. Wong
2023-05-26  0:48   ` [PATCH 5/7] xfs: speed up xfarray sort by sorting xfile page contents directly Darrick J. Wong
2023-05-26  0:48   ` [PATCH 6/7] xfs: cache pages used for xfarray quicksort convergence Darrick J. Wong
2023-05-26  0:48   ` [PATCH 7/7] xfs: improve xfarray quicksort pivot Darrick J. Wong
2023-06-22  2:58   ` [PATCHSET v25.0 0/7] xfs: stage repair information in pageable memory Dave Chinner
2023-05-26  0:29 ` [PATCHSET v25.0 0/4] xfs: online scrubbing of realtime summary files Darrick J. Wong
2023-05-26  0:48   ` [PATCH 1/4] xfs: get our own reference to inodes that we want to scrub Darrick J. Wong
2023-05-26  0:49   ` [PATCH 2/4] xfs: wrap ilock/iunlock operations on sc->ip Darrick J. Wong
2023-05-26  0:49   ` [PATCH 3/4] xfs: move the realtime summary file scrubber to a separate source file Darrick J. Wong
2023-05-26  0:49   ` [PATCH 4/4] xfs: implement online scrubbing of rtsummary info Darrick J. Wong
2023-06-22  3:11   ` [PATCHSET v25.0 0/4] xfs: online scrubbing of realtime summary files Dave Chinner
2023-05-26  0:29 ` [PATCHSET v25.0 0/2] xfs: miscellaneous repair tweaks Darrick J. Wong
2023-05-26  0:50   ` [PATCH 1/2] xfs: always rescan allegedly healthy per-ag metadata after repair Darrick J. Wong
2023-05-26  0:50   ` [PATCH 2/2] xfs: allow the user to cancel repairs before we start writing Darrick J. Wong
2023-06-22  3:13   ` [PATCHSET v25.0 0/2] xfs: miscellaneous repair tweaks Dave Chinner
2023-05-26  0:29 ` [PATCHSET v25.0 0/2] xfs: force rebuilding of metadata Darrick J. Wong
2023-05-26  0:50   ` [PATCH 1/2] xfs: don't complain about unfixed metadata when repairs were injected Darrick J. Wong
2023-05-26  0:50   ` [PATCH 2/2] xfs: allow userspace to rebuild metadata structures Darrick J. Wong
2023-06-22  3:17     ` Dave Chinner
2023-07-05 23:52       ` Darrick J. Wong
2023-06-22  3:18   ` [PATCHSET v25.0 0/2] xfs: force rebuilding of metadata Dave Chinner
2023-05-26  0:29 ` [PATCHSET v25.0 0/5] xfs: online repair of AG btrees Darrick J. Wong
2023-05-26  0:51   ` [PATCH 1/5] xfs: clear pagf_agflreset when repairing the AGFL Darrick J. Wong
2023-05-26  0:51   ` [PATCH 2/5] xfs: repair free space btrees Darrick J. Wong
2023-05-26  0:51   ` [PATCH 3/5] xfs: rewrite xfs_icache_inode_is_allocated Darrick J. Wong
2023-06-22  4:04     ` Dave Chinner
2023-07-06  0:37       ` Darrick J. Wong
2023-07-09 23:05         ` Dave Chinner
2023-07-09 23:23           ` Darrick J. Wong
2023-05-26  0:51   ` [PATCH 4/5] xfs: repair inode btrees Darrick J. Wong
2023-05-26  0:52   ` [PATCH 5/5] xfs: repair refcount btrees Darrick J. Wong
2023-06-28  0:08   ` [PATCHSET v25.0 0/5] xfs: online repair of AG btrees Dave Chinner
2023-05-26  0:30 ` [PATCHSET v25.0 0/6] xfs: online repair of inodes and forks Darrick J. Wong
2023-05-26  0:52   ` [PATCH 1/6] xfs: disable online repair quota helpers when quota not enabled Darrick J. Wong
2023-05-26  0:52   ` [PATCH 2/6] xfs: try to attach dquots to files before repairing them Darrick J. Wong
2023-05-26  0:52   ` [PATCH 3/6] xfs: repair inode records Darrick J. Wong
2023-05-26  0:53   ` [PATCH 4/6] xfs: zap broken inode forks Darrick J. Wong
2023-05-26  0:53   ` [PATCH 5/6] xfs: abort directory parent scrub scans if we encounter a zapped directory Darrick J. Wong
2023-05-26  0:53   ` [PATCH 6/6] xfs: repair obviously broken inode modes Darrick J. Wong
2023-05-26  0:30 ` [PATCHSET v25.0 0/5] xfs: online repair of file fork mappings Darrick J. Wong
2023-05-26  0:53   ` [PATCH 1/5] xfs: reintroduce reaping of file metadata blocks to xrep_reap_extents Darrick J. Wong
2023-05-26  0:54   ` [PATCH 2/5] xfs: repair inode fork block mapping data structures Darrick J. Wong
2023-05-26  0:54   ` [PATCH 3/5] xfs: refactor repair forcing tests into a repair.c helper Darrick J. Wong
2023-05-26  0:54   ` [PATCH 4/5] xfs: create a ranged query function for refcount btrees Darrick J. Wong
2023-05-26  0:54   ` [PATCH 5/5] xfs: repair problems in CoW forks Darrick J. Wong
2023-05-26  0:30 ` [PATCHSET v25.0 0/4] xfs: online repair of quota and rt metadata files Darrick J. Wong
2023-05-26  0:55   ` [PATCH 1/4] xfs: repair the inode core and forks of a metadata inode Darrick J. Wong
2023-05-26  0:55   ` [PATCH 2/4] xfs: create a new inode fork block unmap helper Darrick J. Wong
2023-05-26  0:55   ` [PATCH 3/4] xfs: online repair of realtime bitmaps Darrick J. Wong
2023-05-26  0:56   ` [PATCH 4/4] xfs: repair quotas Darrick J. Wong
2023-05-26  0:31 ` [PATCHSET v25.0 0/4] xfs: live inode scans for online fsck Darrick J. Wong
2023-05-26  0:56   ` [PATCH 1/4] xfs: speed up xfs_iwalk_adjust_start a little bit Darrick J. Wong
2023-05-26  0:56   ` [PATCH 2/4] xfs: implement live inode scan for scrub Darrick J. Wong
2023-05-26  0:56   ` [PATCH 3/4] xfs: allow scrub to hook metadata updates in other writers Darrick J. Wong
2023-05-26  0:57   ` [PATCH 4/4] xfs: allow blocking notifier chains with filesystem hooks Darrick J. Wong
2023-05-26  0:31 ` [PATCHSET v25.0 0/7] xfs: online repair of quota counters Darrick J. Wong
2023-05-26  0:57   ` [PATCH 1/7] xfs: stagger the starting AG of scrub iscans to reduce contention Darrick J. Wong
2023-05-26  0:57   ` [PATCH 2/7] xfs: cache a bunch of inodes for repair scans Darrick J. Wong
2023-05-26  0:57   ` [PATCH 3/7] xfs: report the health of quota counts Darrick J. Wong
2023-05-26  0:58   ` [PATCH 4/7] xfs: implement live quotacheck inode scan Darrick J. Wong
2023-05-26  0:58   ` [PATCH 5/7] xfs: track quota updates during live quotacheck Darrick J. Wong
2023-05-26  0:58   ` [PATCH 6/7] xfs: repair cannot update the summary counters when logging quota flags Darrick J. Wong
2023-05-26  0:58   ` [PATCH 7/7] xfs: repair dquots based on live quotacheck results Darrick J. Wong
2023-05-26  0:31 ` [PATCHSET v25.0 0/5] xfs: online repair of file link counts Darrick J. Wong
2023-05-26  0:59   ` [PATCH 1/5] xfs: report health of inode " Darrick J. Wong
2023-05-26  0:59   ` [PATCH 2/5] xfs: teach scrub to check file nlinks Darrick J. Wong
2023-05-26  0:59   ` [PATCH 3/5] xfs: track directory entry updates during live nlinks fsck Darrick J. Wong
2023-05-26  0:59   ` [PATCH 4/5] xfs: create a predicate to determine if two xfs_names are the same Darrick J. Wong
2023-05-26  1:00   ` [PATCH 5/5] xfs: teach repair to fix file nlinks Darrick J. Wong
2023-05-26  0:31 ` [PATCHSET v25.0 00/11] xfs: report corruption to the health trackers Darrick J. Wong
2023-05-26  1:00   ` [PATCH 01/11] xfs: separate the marking of sick and checked metadata Darrick J. Wong
2023-05-26  1:00   ` [PATCH 02/11] xfs: report fs corruption errors to the health tracking system Darrick J. Wong
2023-05-26  1:00   ` [PATCH 03/11] xfs: report ag header " Darrick J. Wong
2023-05-26  1:01   ` [PATCH 04/11] xfs: report block map " Darrick J. Wong
2023-05-26  1:01   ` [PATCH 05/11] xfs: report btree block corruption errors to the health system Darrick J. Wong
2023-05-26  1:01   ` [PATCH 06/11] xfs: report dir/attr " Darrick J. Wong
2023-05-26  1:01   ` [PATCH 07/11] xfs: report symlink " Darrick J. Wong
2023-05-26  1:02   ` [PATCH 08/11] xfs: report inode " Darrick J. Wong
2023-05-26  1:02   ` [PATCH 09/11] xfs: report quota block " Darrick J. Wong
2023-05-26  1:02   ` [PATCH 10/11] xfs: report realtime metadata " Darrick J. Wong
2023-05-26  1:03   ` [PATCH 11/11] xfs: report XFS_IS_CORRUPT " Darrick J. Wong
2023-05-26  0:32 ` [PATCHSET v25.0 0/3] xfs: indirect health reporting Darrick J. Wong
2023-05-26  1:03   ` [PATCH 1/3] xfs: add secondary and indirect classes to the health tracking system Darrick J. Wong
2023-05-26  1:03   ` [PATCH 2/3] xfs: remember sick inodes that get inactivated Darrick J. Wong
2023-05-26  1:03   ` [PATCH 3/3] xfs: update health status if we get a clean bill of health Darrick J. Wong
2023-05-26  0:32 ` [PATCHSET v25.0 0/3] xfs: online repair for fs summary counters Darrick J. Wong
2023-05-26  1:04   ` [PATCH 1/3] fs: distinguish between user initiated freeze and kernel initiated freeze Darrick J. Wong
2023-05-26  1:04   ` [PATCH 2/3] xfs: stabilize fs summary counters for online fsck Darrick J. Wong
2023-05-26  1:04   ` [PATCH 3/3] xfs: repair summary counters Darrick J. Wong
2023-05-26  0:32 ` [PATCHSET v25.0 0/9] xfs: support in-memory btrees Darrick J. Wong
2023-05-26  1:04   ` [PATCH 1/9] xfs: dump xfiles for debugging purposes Darrick J. Wong
2023-05-26  1:05   ` [PATCH 2/9] xfs: teach buftargs to maintain their own buffer hashtable Darrick J. Wong
2023-05-26  1:05   ` [PATCH 3/9] xfs: create buftarg helpers to abstract block_device operations Darrick J. Wong
2023-05-26  1:05   ` [PATCH 4/9] xfs: make GFP_ usage consistent when allocating buftargs Darrick J. Wong
2023-05-26  1:05   ` [PATCH 5/9] xfs: support in-memory buffer cache targets Darrick J. Wong
2023-05-26  1:06   ` [PATCH 6/9] xfs: consolidate btree block freeing tracepoints Darrick J. Wong
2023-05-26  1:06   ` [PATCH 7/9] xfs: consolidate btree block allocation tracepoints Darrick J. Wong
2023-05-26  1:06   ` [PATCH 8/9] xfs: support in-memory btrees Darrick J. Wong
2023-05-26  1:06   ` [PATCH 9/9] xfs: connect in-memory btrees to xfiles Darrick J. Wong
2023-05-26  0:32 ` [PATCHSET v25.0 0/4] xfs: online repair of rmap btrees Darrick J. Wong
2023-05-26  1:07   ` [PATCH 1/4] xfs: create a helper to decide if a file mapping targets the rt volume Darrick J. Wong
2023-05-26  1:07   ` [PATCH 2/4] xfs: repair the rmapbt Darrick J. Wong
2023-05-26  1:07   ` [PATCH 3/4] xfs: create a shadow rmap btree during rmap repair Darrick J. Wong
2023-05-26  1:07   ` [PATCH 4/4] xfs: hook live rmap operations during a repair operation Darrick J. Wong
2023-05-26  0:33 ` [PATCHSET v25.0 0/9] xfs: move btree geometry to ops struct Darrick J. Wong
2023-05-26  1:08   ` [PATCH 1/9] xfs: set the btree cursor bc_ops in xfs_btree_alloc_cursor Darrick J. Wong
2023-05-26  1:08   ` [PATCH 2/9] xfs: encode the default bc_flags in the btree ops structure Darrick J. Wong
2023-05-26  1:08   ` [PATCH 3/9] xfs: export some of the btree ops structures Darrick J. Wong
2023-05-26  1:09   ` [PATCH 4/9] xfs: initialize btree blocks using btree_ops structure Darrick J. Wong
2023-05-26  1:09   ` [PATCH 5/9] xfs: rename btree block/buffer init functions Darrick J. Wong
2023-05-26  1:09   ` [PATCH 6/9] xfs: btree convert xfs_btree_init_block to xfs_btree_init_buf calls Darrick J. Wong
2023-05-26  1:09   ` [PATCH 7/9] xfs: remove the unnecessary daddr paramter to _init_block Darrick J. Wong
2023-05-26  1:10   ` [PATCH 8/9] xfs: set btree block buffer ops in _init_buf Darrick J. Wong
2023-05-26  1:10   ` [PATCH 9/9] xfs: remove unnecessary fields in xfbtree_config Darrick J. Wong
2023-05-26  0:33 ` [PATCHSET v25.0 0/4] xfs: reduce refcount repair memory usage Darrick J. Wong
2023-05-26  1:10   ` [PATCH 1/4] xfs: move lru refs to the btree ops structure Darrick J. Wong
2023-05-26  1:10   ` [PATCH 2/4] xfs: define an in-memory btree for storing refcount bag info during repairs Darrick J. Wong
2023-05-26  1:11   ` [PATCH 3/4] xfs: create refcount bag structure for btree repairs Darrick J. Wong
2023-05-26  1:11   ` [PATCH 4/4] xfs: port refcount repair to the new refcount bag structure Darrick J. Wong
2023-05-26  0:33 ` [PATCHSET v25.0 0/3] xfs: bmap log intent cleanups Darrick J. Wong
2023-05-26  1:11   ` [PATCH 1/3] xfs: split tracepoint classes for deferred items Darrick J. Wong
2023-05-26  1:11   ` [PATCH 2/3] xfs: clean up bmap log intent item tracepoint callsites Darrick J. Wong
2023-05-26  1:12   ` [PATCH 3/3] xfs: remove xfs_trans_set_bmap_flags Darrick J. Wong
2023-05-26  0:33 ` [PATCHSET v25.0 0/4] xfs: widen BUI formats to support realtime Darrick J. Wong
2023-05-26  1:12   ` [PATCH 1/4] xfs: fix xfs_bunmapi to allow unmapping of partial rt extents Darrick J. Wong
2023-05-26  1:12   ` [PATCH 2/4] xfs: hoist freeing of rt data fork extent mappings Darrick J. Wong
2023-05-26  1:12   ` [PATCH 3/4] xfs: add a realtime flag to the bmap update log redo items Darrick J. Wong
2023-05-26  1:13   ` [PATCH 4/4] xfs: support recovering bmap intent items targetting realtime extents Darrick J. Wong
2023-05-26  0:34 ` [PATCHSET v25.0 0/2] xfs: support attrfork and unwritten BUIs Darrick J. Wong
2023-05-26  1:13   ` [PATCH 1/2] xfs: support deferred bmap updates on the attr fork Darrick J. Wong
2023-05-26  1:13   ` [PATCH 2/2] xfs: xfs_bmap_finish_one should map unwritten extents properly Darrick J. Wong
2023-05-26  0:34 ` [PATCHSET v25.0 0/3] xfs: clean up symbolic link code Darrick J. Wong
2023-05-26  1:13   ` [PATCH 1/3] xfs: move xfs_symlink_remote.c declarations to xfs_symlink_remote.h Darrick J. Wong
2023-05-26  1:14   ` [PATCH 2/3] xfs: move remote symlink target read function to libxfs Darrick J. Wong
2023-05-26  1:14   ` [PATCH 3/3] xfs: move symlink target write " Darrick J. Wong
2023-05-26  0:34 ` [PATCHSET v25.0 00/25] xfs: atomic file updates Darrick J. Wong
2023-05-26  1:14   ` [PATCH 01/25] xfs: add a libxfs header file for staging new ioctls Darrick J. Wong
2023-05-26  1:14   ` [PATCH 02/25] xfs: introduce new file range exchange ioctl Darrick J. Wong
2023-05-26  1:15   ` [PATCH 03/25] xfs: move inode lease breaking functions to xfs_inode.c Darrick J. Wong
2023-05-26  1:15   ` [PATCH 04/25] xfs: move xfs_iops.c declarations out of xfs_inode.h Darrick J. Wong
2023-05-26  1:15   ` [PATCH 05/25] xfs: declare xfs_file.c symbols in xfs_file.h Darrick J. Wong
2023-05-26  1:16   ` [PATCH 06/25] xfs: create a new helper to return a file's allocation unit Darrick J. Wong
2023-05-26  1:16   ` [PATCH 07/25] xfs: refactor non-power-of-two alignment checks Darrick J. Wong
2023-05-26  1:16   ` [PATCH 08/25] xfs: parameterize all the incompat log feature helpers Darrick J. Wong
2023-05-26  1:16   ` [PATCH 09/25] xfs: create a log incompat flag for atomic extent swapping Darrick J. Wong
2023-05-26  1:17   ` [PATCH 10/25] xfs: introduce a swap-extent log intent item Darrick J. Wong
2023-05-26  1:17   ` [PATCH 11/25] xfs: create deferred log items for extent swapping Darrick J. Wong
2023-05-26  1:17   ` [PATCH 12/25] xfs: enable xlog users to toggle atomic " Darrick J. Wong
2023-05-26  1:17   ` [PATCH 13/25] xfs: bind the xfs-specific extent swape code to the vfs-generic file exchange code Darrick J. Wong
2023-05-26  1:18   ` [PATCH 14/25] xfs: add error injection to test swapext recovery Darrick J. Wong
2023-05-26  1:18   ` [PATCH 15/25] xfs: port xfs_swap_extents_rmap to our new code Darrick J. Wong
2023-05-26  1:18   ` [PATCH 16/25] xfs: consolidate all of the xfs_swap_extent_forks code Darrick J. Wong
2023-05-26  1:19   ` [PATCH 17/25] xfs: port xfs_swap_extent_forks to use xfs_swapext_req Darrick J. Wong
2023-05-26  1:26   ` [PATCH 18/25] xfs: allow xfs_swap_range to use older extent swap algorithms Darrick J. Wong
2023-05-26  1:26   ` [PATCH 19/25] xfs: remove old swap extents implementation Darrick J. Wong
2023-05-26  1:27   ` [PATCH 20/25] xfs: condense extended attributes after an atomic swap Darrick J. Wong
2023-05-26  1:27   ` [PATCH 21/25] xfs: condense directories " Darrick J. Wong
2023-05-26  1:27   ` [PATCH 22/25] xfs: condense symbolic links " Darrick J. Wong
2023-05-26  1:28   ` [PATCH 23/25] xfs: make atomic extent swapping support realtime files Darrick J. Wong
2023-05-26  1:28   ` [PATCH 24/25] xfs: support non-power-of-two rtextsize with exchange-range Darrick J. Wong
2023-05-26  1:28   ` [PATCH 25/25] xfs: enable atomic swapext feature Darrick J. Wong
2023-05-26  0:34 ` [PATCHSET v25.0 0/4] xfs: create temporary files for online repair Darrick J. Wong
2023-05-26  1:28   ` [PATCH 1/4] xfs: hide private inodes from bulkstat and handle functions Darrick J. Wong
2023-05-26  1:29   ` [PATCH 2/4] xfs: create temporary files and directories for online repair Darrick J. Wong
2023-05-26  1:29   ` [PATCH 3/4] xfs: refactor stale buffer scanning for repairs Darrick J. Wong
2023-05-26  1:29   ` [PATCH 4/4] xfs: add the ability to reap entire inode forks Darrick J. Wong
2023-05-26  0:35 ` [PATCHSET v25.0 0/3] xfs: online repair of realtime summaries Darrick J. Wong
2023-05-26  1:29   ` [PATCH 1/3] xfs: support preallocating and copying content into temporary files Darrick J. Wong
2023-05-26  1:30   ` [PATCH 2/3] xfs: teach the tempfile to support atomic extent swapping Darrick J. Wong
2023-05-26  1:30   ` [PATCH 3/3] xfs: online repair of realtime summaries Darrick J. Wong
2023-05-26  0:35 ` [PATCHSET v25.0 0/9] xfs: set and validate dir/attr block owners Darrick J. Wong
2023-05-26  1:30   ` [PATCH 1/9] xfs: add an explicit owner field to xfs_da_args Darrick J. Wong
2023-05-26  1:30   ` [PATCH 2/9] xfs: use the xfs_da_args owner field to set new dir/attr block owner Darrick J. Wong
2023-05-26  1:31   ` [PATCH 3/9] xfs: validate attr leaf buffer owners Darrick J. Wong
2023-05-26  1:31   ` [PATCH 4/9] xfs: validate attr remote value " Darrick J. Wong
2023-05-26  1:31   ` [PATCH 5/9] xfs: validate dabtree node " Darrick J. Wong
2023-05-26  1:31   ` [PATCH 6/9] xfs: validate directory leaf " Darrick J. Wong
2023-05-26  1:32   ` [PATCH 7/9] xfs: validate explicit directory data " Darrick J. Wong
2023-05-26  1:32   ` [PATCH 8/9] xfs: validate explicit directory block " Darrick J. Wong
2023-05-26  1:32   ` [PATCH 9/9] xfs: validate explicit directory free block owners Darrick J. Wong
2023-05-26  0:35 ` [PATCHSET v25.0 0/5] xfs: online repair of extended attributes Darrick J. Wong
2023-05-26  1:32   ` [PATCH 1/5] xfs: create a blob array data structure Darrick J. Wong
2023-05-26  1:33   ` [PATCH 2/5] xfs: use atomic extent swapping to fix user file fork data Darrick J. Wong
2023-05-26  1:33   ` [PATCH 3/5] xfs: repair extended attributes Darrick J. Wong
2023-05-26  1:33   ` [PATCH 4/5] xfs: scrub should set preen if attr leaf has holes Darrick J. Wong
2023-05-26  1:33   ` [PATCH 5/5] xfs: flag empty xattr leaf blocks for optimization Darrick J. Wong
2023-05-26  0:35 ` [PATCHSET v25.0 0/7] xfs: online repair of directories Darrick J. Wong
2023-05-26  1:34   ` [PATCH 1/7] xfs: use i_prev_unlinked to distinguish inodes that are not on the unlinked list Darrick J. Wong
2023-05-26  1:34   ` [PATCH 2/7] xfs: ensure unlinked list state is consistent with nlink during scrub Darrick J. Wong
2023-05-26  1:34   ` [PATCH 3/7] xfs: update the unlinked list when repairing link counts Darrick J. Wong
2023-05-26  1:35   ` [PATCH 4/7] xfs: online repair of directories Darrick J. Wong
2023-05-26  1:35   ` [PATCH 5/7] xfs: scan the filesystem to repair a directory dotdot entry Darrick J. Wong
2023-05-26  1:35   ` [PATCH 6/7] xfs: online repair of parent pointers Darrick J. Wong
2023-05-26  1:35   ` [PATCH 7/7] xfs: ask the dentry cache if it knows the parent of a directory Darrick J. Wong
2023-05-26  0:36 ` [PATCHSET v25.0 0/3] xfs: move orphan files to lost and found Darrick J. Wong
2023-05-26  1:36   ` [PATCH 1/3] xfs: move orphan files to the orphanage Darrick J. Wong
2023-05-26  1:36   ` [PATCH 2/3] xfs: move files to orphanage instead of letting nlinks drop to zero Darrick J. Wong
2023-05-26  1:36   ` [PATCH 3/3] xfs: ensure dentry consistency when the orphanage adopts a file Darrick J. Wong
2023-05-26  0:36 ` [PATCHSET v25.0 0/1] xfs: online repair of symbolic links Darrick J. Wong
2023-05-26  1:36   ` [PATCH 1/1] " Darrick J. Wong
2023-05-26  0:36 ` [PATCHSET v25.0 0/1] xfs: online repair of parent pointers Darrick J. Wong
2023-05-26  1:37   ` [PATCH 1/1] xfs: create an xattr iteration function for scrub Darrick J. Wong
2023-05-26  0:36 ` [PATCHSET v25.0 0/3] xfs: online fsck of iunlink buckets Darrick J. Wong
2023-05-26  1:37   ` [PATCH 1/3] xfs: check AGI unlinked inode buckets Darrick J. Wong
2023-05-26  1:37   ` [PATCH 2/3] xfs: hoist AGI repair context to a heap object Darrick J. Wong
2023-05-26  1:37   ` [PATCH 3/3] xfs: repair AGI unlinked inode bucket lists Darrick J. Wong
2023-05-26  0:37 ` [PATCHSET v25.0 0/3] xfs: cache xfile pages for better performance Darrick J. Wong
2023-05-26  1:38   ` [PATCH 1/3] xfs: map xfile pages directly into xfs_buf Darrick J. Wong
2023-05-26  1:38   ` [PATCH 2/3] xfs: use b_offset to support direct-mapping pages when blocksize < pagesize Darrick J. Wong
2023-05-26  1:38   ` [PATCH 3/3] xfile: implement write caching Darrick J. Wong
2023-05-26  0:37 ` [PATCHSET v25.0 0/3] xfs: inode-related repair fixes Darrick J. Wong
2023-05-26  1:38   ` [PATCH 1/3] xfs: check unused nlink fields in the ondisk inode Darrick J. Wong
2023-05-26  1:39   ` [PATCH 2/3] xfs: try to avoid allocating from sick inode clusters Darrick J. Wong
2023-05-26  1:39   ` [PATCH 3/3] xfs: pin inodes that would otherwise overflow link count Darrick J. Wong
2023-05-26  0:37 ` [PATCHSET v25.0 0/4] xfs: relax AGF locks during fstrim Darrick J. Wong
2023-05-26  1:39   ` [PATCH 1/4] xfs: hoist data device FITRIM AG iteration to a separate function Darrick J. Wong
2023-05-26  1:39   ` [PATCH 2/4] xfs: separate the xfs_trim_perag looping code Darrick J. Wong
2023-05-26  1:40   ` [PATCH 3/4] xfs: fix severe performance problems when fstrimming a subset of an AG Darrick J. Wong
2023-05-26  1:40   ` [PATCH 4/4] xfs: relax the AGF lock while we're doing a large fstrim Darrick J. Wong
2023-05-26  0:38 ` [PATCHSET v25.0 0/7] xfs_scrub: fixes to the repair code Darrick J. Wong
2023-05-26  1:40   ` [PATCH 1/7] xfs_scrub: flush stdout after printing to it Darrick J. Wong
2023-05-26  1:41   ` [PATCH 2/7] xfs_scrub: don't report media errors for space with unknowable owner Darrick J. Wong
2023-05-26  1:41   ` [PATCH 3/7] xfs_scrub: remove ALP_* flags namespace Darrick J. Wong
2023-05-26  1:41   ` [PATCH 4/7] xfs_scrub: move repair functions to repair.c Darrick J. Wong
2023-05-26  1:41   ` [PATCH 5/7] xfs_scrub: log when a repair was unnecessary Darrick J. Wong
2023-05-26  1:42   ` [PATCH 6/7] xfs_scrub: require primary superblock repairs to complete before proceeding Darrick J. Wong
2023-05-26  1:42   ` [PATCH 7/7] xfs_scrub: actually try to fix summary counters ahead of repairs Darrick J. Wong
2023-06-08 13:22   ` [PATCHSET v25.0 0/7] xfs_scrub: fixes to the repair code Shiyang Ruan
2023-06-08 14:56     ` Darrick J. Wong
2023-06-09  3:22       ` Shiyang Ruan
2023-07-13  5:12         ` Darrick J. Wong
2023-05-26  0:38 ` [PATCHSET v25.0 0/6] xfs_scrub: improve warnings about difficult repairs Darrick J. Wong
2023-05-26  1:42   ` [PATCH 1/6] xfs_scrub: collapse trivial superblock scrub helpers Darrick J. Wong
2023-05-26  1:42   ` [PATCH 2/6] xfs_scrub: get rid of trivial fs metadata scanner helpers Darrick J. Wong
2023-05-26  1:43   ` [PATCH 3/6] xfs_scrub: split up the mustfix repairs and difficulty assessment functions Darrick J. Wong
2023-05-26  1:43   ` [PATCH 4/6] xfs_scrub: add missing repair types to the mustfix and difficulty assessment Darrick J. Wong
2023-05-26  1:43   ` [PATCH 5/6] xfs_scrub: any inconsistency in metadata should trigger difficulty warnings Darrick J. Wong
2023-05-26  1:43   ` [PATCH 6/6] xfs_scrub: warn about difficult repairs to rt and quota metadata Darrick J. Wong
2023-05-26  0:38 ` [PATCHSET v25.0 0/9] xfs_scrub: track data dependencies for repairs Darrick J. Wong
2023-05-26  1:44   ` [PATCH 1/9] xfs_scrub: track repair items by principal, not by individual repairs Darrick J. Wong
2023-05-26  1:44   ` [PATCH 2/9] xfs_scrub: use repair_item to direct repair activities Darrick J. Wong
2023-05-26  1:44   ` [PATCH 3/9] xfs_scrub: remove action lists from phaseX code Darrick J. Wong
2023-05-26  1:44   ` [PATCH 4/9] xfs_scrub: remove scrub_metadata_file Darrick J. Wong
2023-05-26  1:45   ` [PATCH 5/9] xfs_scrub: boost the repair priority of dependencies of damaged items Darrick J. Wong
2023-05-26  1:45   ` [PATCH 6/9] xfs_scrub: clean up repair_item_difficulty a little Darrick J. Wong
2023-05-26  1:45   ` [PATCH 7/9] xfs_scrub: check dependencies of a scrub type before repairing Darrick J. Wong
2023-05-26  1:45   ` [PATCH 8/9] xfs_scrub: retry incomplete repairs Darrick J. Wong
2023-05-26  1:46   ` [PATCH 9/9] xfs_scrub: remove unused action_list fields Darrick J. Wong
2023-05-26  0:38 ` [PATCHSET v25.0 0/5] xfs_scrub: use scrub_item to track check progress Darrick J. Wong
2023-05-26  1:46   ` [PATCH 1/5] xfs_scrub: start tracking scrub state in scrub_item Darrick J. Wong
2023-05-26  1:46   ` [PATCH 2/5] xfs_scrub: remove enum check_outcome Darrick J. Wong
2023-05-26  1:46   ` [PATCH 3/5] xfs_scrub: refactor scrub_meta_type out of existence Darrick J. Wong
2023-05-26  1:47   ` [PATCH 4/5] xfs_scrub: hoist repair retry loop to repair_item_class Darrick J. Wong
2023-05-26  1:47   ` [PATCH 5/5] xfs_scrub: hoist scrub retry loop to scrub_item_check_file Darrick J. Wong
2023-05-26  0:39 ` [PATCHSET v25.0 0/4] xfs_scrub: improve scheduling of repair items Darrick J. Wong
2023-05-26  1:47   ` [PATCH 1/4] libfrog: enhance ptvar to support initializer functions Darrick J. Wong
2023-05-26  1:48   ` Darrick J. Wong [this message]
2023-05-26  1:48   ` [PATCH 3/4] xfs_scrub: recheck entire metadata objects after corruption repairs Darrick J. Wong
2023-05-26  1:48   ` [PATCH 4/4] xfs_scrub: try to repair space metadata before file metadata Darrick J. Wong
2023-05-26  0:39 ` [PATCHSET v25.0 0/8] xfs_scrub: move fstrim to a separate phase Darrick J. Wong
2023-05-26  1:48   ` [PATCH 1/8] xfs_scrub: move FITRIM to phase 8 Darrick J. Wong
2023-05-26  1:49   ` [PATCH 2/8] xfs_scrub: ignore phase 8 if the user disabled fstrim Darrick J. Wong
2023-05-26  1:49   ` [PATCH 3/8] xfs_scrub: collapse trim_filesystem Darrick J. Wong
2023-05-26  1:49   ` [PATCH 4/8] xfs_scrub: fix the work estimation for phase 8 Darrick J. Wong
2023-05-26  1:49   ` [PATCH 5/8] xfs_scrub: report FITRIM errors properly Darrick J. Wong
2023-05-26  1:50   ` [PATCH 6/8] xfs_scrub: don't call FITRIM after runtime errors Darrick J. Wong
2023-05-26  1:50   ` [PATCH 7/8] xfs_scrub: don't trim the first agbno of each AG for better performance Darrick J. Wong
2023-05-26  1:50   ` [PATCH 8/8] xfs_scrub: improve progress meter for phase 8 fstrimming Darrick J. Wong
2023-05-26  0:39 ` [PATCHSET v25.0 0/7] xfs_scrub: use free space histograms to reduce fstrim runtime Darrick J. Wong
2023-05-26  1:50   ` [PATCH 1/7] libfrog: hoist free space histogram code Darrick J. Wong
2023-05-26  1:51   ` [PATCH 2/7] libfrog: print wider columns for free space histogram Darrick J. Wong
2023-05-26  1:51   ` [PATCH 3/7] libfrog: print cdf of free space buckets Darrick J. Wong
2023-05-26  1:51   ` [PATCH 4/7] xfs_scrub: don't close stdout when closing the progress bar Darrick J. Wong
2023-05-26  1:51   ` [PATCH 5/7] xfs_scrub: remove pointless spacemap.c arguments Darrick J. Wong
2023-05-26  1:52   ` [PATCH 6/7] xfs_scrub: collect free space histograms during phase 7 Darrick J. Wong
2023-05-26  1:52   ` [PATCH 7/7] xfs_scrub: tune fstrim minlen parameter based on free space histograms Darrick J. Wong
2023-05-26  0:39 ` [PATCHSET v25.0 0/5] xfs_scrub: fixes for systemd services Darrick J. Wong
2023-05-26  1:52   ` [PATCH 1/5] debian: install scrub services with dh_installsystemd Darrick J. Wong
2023-11-07  8:35     ` Christoph Hellwig
2023-05-26  1:52   ` [PATCH 2/5] xfs_scrub_all: escape service names consistently Darrick J. Wong
2023-11-07  8:37     ` Christoph Hellwig
2023-05-26  1:53   ` [PATCH 3/5] xfs_scrub: fix pathname escaping across all service definitions Darrick J. Wong
2023-11-07  8:38     ` Christoph Hellwig
2023-05-26  1:53   ` [PATCH 4/5] xfs_scrub_fail: fix sendmail detection Darrick J. Wong
2023-11-07  8:39     ` Christoph Hellwig
2023-05-26  1:53   ` [PATCH 5/5] xfs_scrub_fail: return the failure status of the mailer program Darrick J. Wong
2023-11-07  8:39     ` Christoph Hellwig
2023-05-26  0:40 ` [PATCHSET v25.0 0/4] xfs_scrub_all: fixes for systemd services Darrick J. Wong
2023-05-26  1:54   ` [PATCH 1/4] xfs_scrub_all: fix argument passing when invoking xfs_scrub manually Darrick J. Wong
2023-11-07  8:39     ` Christoph Hellwig
2023-05-26  1:54   ` [PATCH 2/4] xfs_scrub_all: survive systemd restarts when waiting for services Darrick J. Wong
2023-11-07  8:40     ` Christoph Hellwig
2023-05-26  1:54   ` [PATCH 3/4] xfs_scrub_all: simplify cleanup of run_killable Darrick J. Wong
2023-11-07  8:41     ` Christoph Hellwig
2023-05-26  1:54   ` [PATCH 4/4] xfs_scrub_all: fix termination signal handling Darrick J. Wong
2023-11-07  8:41     ` Christoph Hellwig
2023-05-26  0:40 ` [PATCHSET v25.0 0/5] xfs_scrub: tighten security of systemd services Darrick J. Wong
2023-05-26  1:55   ` [PATCH 1/5] xfs_scrub: allow auxiliary pathnames for sandboxing Darrick J. Wong
2023-11-07  8:48     ` Christoph Hellwig
2023-11-07 18:35       ` Darrick J. Wong
2023-11-08  7:22         ` Christoph Hellwig
2023-11-08  7:24           ` Christoph Hellwig
2023-11-08  7:44           ` Darrick J. Wong
2023-11-08  7:46             ` Darrick J. Wong
2023-11-08  7:49             ` Christoph Hellwig
2023-11-09  0:50               ` Darrick J. Wong
2023-05-26  1:55   ` [PATCH 2/5] xfs_scrub.service: reduce CPU usage to 60% when possible Darrick J. Wong
2023-11-07  8:50     ` Christoph Hellwig
2023-11-07 17:00       ` Darrick J. Wong
2023-05-26  1:55   ` [PATCH 3/5] xfs_scrub: tighten up the security on the background systemd service Darrick J. Wong
2023-11-07  8:52     ` Christoph Hellwig
2023-11-09  0:32       ` Darrick J. Wong
2023-05-26  1:55   ` [PATCH 4/5] xfs_scrub_fail: " Darrick J. Wong
2023-05-26  1:56   ` [PATCH 5/5] xfs_scrub_all: " Darrick J. Wong
2023-05-26  0:40 ` [PATCHSET v25.0 0/6] xfs_scrub_all: automatic media scan service Darrick J. Wong
2023-05-26  1:56   ` [PATCH 1/6] xfs_scrub_all: only use the xfs_scrub@ systemd services in service mode Darrick J. Wong
2023-05-26  1:56   ` [PATCH 2/6] xfs_scrub_all: remove journalctl background process Darrick J. Wong
2023-05-26  1:56   ` [PATCH 3/6] xfs_scrub_all: support metadata+media scans of all filesystems Darrick J. Wong
2023-05-26  1:57   ` [PATCH 4/6] xfs_scrub_all: enable periodic file data scrubs automatically Darrick J. Wong
2023-05-26  1:57   ` [PATCH 5/6] xfs_scrub_all: trigger automatic media scans once per month Darrick J. Wong
2023-05-26  1:57   ` [PATCH 6/6] xfs_scrub_all: failure reporting for the xfs_scrub_all job Darrick J. Wong
2023-05-26  0:40 ` [PATCHSET v25.0 0/5] xfs_scrub_all: improve systemd handling Darrick J. Wong
2023-05-26  1:57   ` [PATCH 1/5] xfs_scrub_all: encapsulate all the subprocess code in an object Darrick J. Wong
2023-05-26  1:58   ` [PATCH 2/5] xfs_scrub_all: encapsulate all the systemctl " Darrick J. Wong
2023-05-26  1:58   ` [PATCH 3/5] xfs_scrub_all: add CLI option for easier debugging Darrick J. Wong
2023-05-26  1:58   ` [PATCH 4/5] xfs_scrub_all: convert systemctl calls to dbus Darrick J. Wong
2023-05-26  1:58   ` [PATCH 5/5] xfs_scrub_all: implement retry and backoff for dbus calls Darrick J. Wong
2023-05-26  0:41 ` [PATCHSET v25.0 0/3] xfs_scrub: automatic optimization by default Darrick J. Wong
2023-05-26  1:59   ` [PATCH 1/3] xfs_scrub: automatic downgrades to dry-run mode in service mode Darrick J. Wong
2023-05-26  1:59   ` [PATCH 2/3] xfs_scrub: add an optimization-only mode Darrick J. Wong
2023-05-26  1:59   ` [PATCH 3/3] debian: enable xfs_scrub systemd services by default Darrick J. Wong
  -- strict thread matches above, loose matches on Subject: below --
2023-12-31 19:47 [PATCHSET v29.0 30/40] xfs_scrub: improve scheduling of repair items Darrick J. Wong
2023-12-31 22:44 ` [PATCH 2/4] xfs_scrub: improve thread scheduling repair items during phase 4 Darrick J. Wong
2024-01-05  5:08   ` Christoph Hellwig
2022-12-30 22:18 [PATCHSET v24.0 0/4] xfs_scrub: improve scheduling of repair items Darrick J. Wong
2022-12-30 22:18 ` [PATCH 2/4] xfs_scrub: improve thread scheduling repair items during phase 4 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=168506072779.3744428.14221328041885064782.stgit@frogsfrogsfrogs \
    --to=djwong@kernel.org \
    --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.