public inbox for linux-xfs@vger.kernel.org
 help / color / mirror / Atom feed
From: Jeff Layton <jlayton@kernel.org>
To: "Darrick J. Wong" <djwong@kernel.org>, hch@lst.de
Cc: linux-xfs@vger.kernel.org, linux-fsdevel@vger.kernel.org
Subject: Re: [PATCH v31.0.1 1/1] xfs: introduce new file range commit ioctls
Date: Sat, 24 Aug 2024 08:11:38 -0400	[thread overview]
Message-ID: <9517bd6324bd0125d2b1b38cc0d5dbfe06fc34dd.camel@kernel.org> (raw)
In-Reply-To: <20240824062927.GU865349@frogsfrogsfrogs>

On Fri, 2024-08-23 at 23:29 -0700, Darrick J. Wong wrote:
> From: Darrick J. Wong <djwong@kernel.org>
> 
> This patch introduces two more new ioctls to manage atomic updates to
> file contents -- XFS_IOC_START_COMMIT and XFS_IOC_COMMIT_RANGE.  The
> commit mechanism here is exactly the same as what XFS_IOC_EXCHANGE_RANGE
> does, but with the additional requirement that file2 cannot have changed
> since some sampling point.  The start-commit ioctl performs the sampling
> of file attributes.
> 
> Note: This patch currently samples i_ctime during START_COMMIT and
> checks that it hasn't changed during COMMIT_RANGE.  This isn't entirely
> safe in kernels prior to 6.12 because ctime only had coarse grained
> granularity and very fast updates could collide with a COMMIT_RANGE.
> With the multi-granularity ctime introduced by Jeff Layton, it's now
> possible to update ctime such that this does not happen.
> 
> Signed-off-by: Darrick J. Wong <djwong@kernel.org>
> ---
>  fs/xfs/libxfs/xfs_fs.h |   26 +++++++++
>  fs/xfs/xfs_exchrange.c |  143 ++++++++++++++++++++++++++++++++++++++++++++++++
>  fs/xfs/xfs_exchrange.h |   16 +++++
>  fs/xfs/xfs_ioctl.c     |    4 +
>  fs/xfs/xfs_trace.h     |   57 +++++++++++++++++++
>  5 files changed, 243 insertions(+), 3 deletions(-)
> 
> diff --git a/fs/xfs/libxfs/xfs_fs.h b/fs/xfs/libxfs/xfs_fs.h
> index 454b63ef72016..c85c8077fac39 100644
> --- a/fs/xfs/libxfs/xfs_fs.h
> +++ b/fs/xfs/libxfs/xfs_fs.h
> @@ -825,6 +825,30 @@ struct xfs_exchange_range {
>  	__u64		flags;		/* see XFS_EXCHANGE_RANGE_* below */
>  };
>  
> +/*
> + * Using the same definition of file2 as struct xfs_exchange_range, commit the
> + * contents of file1 into file2 if file2 has the same inode number, mtime, and
> + * ctime as the arguments provided to the call.  The old contents of file2 will
> + * be moved to file1.
> + *
> + * Returns -EBUSY if there isn't an exact match for the file2 fields.
> + *
> + * Filesystems must be able to restart and complete the operation even after
> + * the system goes down.
> + */
> +struct xfs_commit_range {
> +	__s32		file1_fd;
> +	__u32		pad;		/* must be zeroes */
> +	__u64		file1_offset;	/* file1 offset, bytes */
> +	__u64		file2_offset;	/* file2 offset, bytes */
> +	__u64		length;		/* bytes to exchange */
> +
> +	__u64		flags;		/* see XFS_EXCHANGE_RANGE_* below */
> +
> +	/* opaque file2 metadata for freshness checks */
> +	__u64		file2_freshness[6];
> +};
> +
>  /*
>   * Exchange file data all the way to the ends of both files, and then exchange
>   * the file sizes.  This flag can be used to replace a file's contents with a
> @@ -997,6 +1021,8 @@ struct xfs_getparents_by_handle {
>  #define XFS_IOC_BULKSTAT	     _IOR ('X', 127, struct xfs_bulkstat_req)
>  #define XFS_IOC_INUMBERS	     _IOR ('X', 128, struct xfs_inumbers_req)
>  #define XFS_IOC_EXCHANGE_RANGE	     _IOW ('X', 129, struct xfs_exchange_range)
> +#define XFS_IOC_START_COMMIT	     _IOR ('X', 130, struct xfs_commit_range)
> +#define XFS_IOC_COMMIT_RANGE	     _IOW ('X', 131, struct xfs_commit_range)
>  /*	XFS_IOC_GETFSUUID ---------- deprecated 140	 */
>  
>  
> diff --git a/fs/xfs/xfs_exchrange.c b/fs/xfs/xfs_exchrange.c
> index c8a655c92c92f..d0889190ab7ff 100644
> --- a/fs/xfs/xfs_exchrange.c
> +++ b/fs/xfs/xfs_exchrange.c
> @@ -72,6 +72,34 @@ xfs_exchrange_estimate(
>  	return error;
>  }
>  
> +/*
> + * Check that file2's metadata agree with the snapshot that we took for the
> + * range commit request.
> + *
> + * This should be called after the filesystem has locked /all/ inode metadata
> + * against modification.
> + */
> +STATIC int
> +xfs_exchrange_check_freshness(
> +	const struct xfs_exchrange	*fxr,
> +	struct xfs_inode		*ip2)
> +{
> +	struct inode			*inode2 = VFS_I(ip2);
> +	struct timespec64		ctime = inode_get_ctime(inode2);
> +	struct timespec64		mtime = inode_get_mtime(inode2);
> +
> +	trace_xfs_exchrange_freshness(fxr, ip2);
> +
> +	/* Check that file2 hasn't otherwise been modified. */
> +	if (fxr->file2_ino != ip2->i_ino ||
> +	    fxr->file2_gen != inode2->i_generation ||
> +	    !timespec64_equal(&fxr->file2_ctime, &ctime) ||
> +	    !timespec64_equal(&fxr->file2_mtime, &mtime))
> +		return -EBUSY;
> +
> +	return 0;
> +}
> +
>  #define QRETRY_IP1	(0x1)
>  #define QRETRY_IP2	(0x2)
>  
> @@ -607,6 +635,12 @@ xfs_exchrange_prep(
>  	if (error || fxr->length == 0)
>  		return error;
>  
> +	if (fxr->flags & __XFS_EXCHANGE_RANGE_CHECK_FRESH2) {
> +		error = xfs_exchrange_check_freshness(fxr, ip2);
> +		if (error)
> +			return error;
> +	}
> +
>  	/* Attach dquots to both inodes before changing block maps. */
>  	error = xfs_qm_dqattach(ip2);
>  	if (error)
> @@ -719,7 +753,8 @@ xfs_exchange_range(
>  	if (fxr->file1->f_path.mnt != fxr->file2->f_path.mnt)
>  		return -EXDEV;
>  
> -	if (fxr->flags & ~XFS_EXCHANGE_RANGE_ALL_FLAGS)
> +	if (fxr->flags & ~(XFS_EXCHANGE_RANGE_ALL_FLAGS |
> +			 __XFS_EXCHANGE_RANGE_CHECK_FRESH2))
>  		return -EINVAL;
>  
>  	/* Userspace requests only honored for regular files. */
> @@ -802,3 +837,109 @@ xfs_ioc_exchange_range(
>  	fdput(file1);
>  	return error;
>  }
> +
> +/* Opaque freshness blob for XFS_IOC_COMMIT_RANGE */
> +struct xfs_commit_range_fresh {
> +	xfs_fsid_t	fsid;		/* m_fixedfsid */
> +	__u64		file2_ino;	/* inode number */
> +	__s64		file2_mtime;	/* modification time */
> +	__s64		file2_ctime;	/* change time */
> +	__s32		file2_mtime_nsec; /* mod time, nsec */
> +	__s32		file2_ctime_nsec; /* change time, nsec */
> +	__u32		file2_gen;	/* inode generation */
> +	__u32		magic;		/* zero */
> +};
> +#define XCR_FRESH_MAGIC	0x444F524B	/* DORK */
> +
> +/* Set up a commitrange operation by sampling file2's write-related attrs */
> +long
> +xfs_ioc_start_commit(
> +	struct file			*file,
> +	struct xfs_commit_range __user	*argp)
> +{
> +	struct xfs_commit_range		args = { };
> +	struct timespec64		ts;
> +	struct xfs_commit_range_fresh	*kern_f;
> +	struct xfs_commit_range_fresh	__user *user_f;
> +	struct inode			*inode2 = file_inode(file);
> +	struct xfs_inode		*ip2 = XFS_I(inode2);
> +	const unsigned int		lockflags = XFS_IOLOCK_SHARED |
> +						    XFS_MMAPLOCK_SHARED |
> +						    XFS_ILOCK_SHARED;
> +
> +	BUILD_BUG_ON(sizeof(struct xfs_commit_range_fresh) !=
> +		     sizeof(args.file2_freshness));
> +
> +	kern_f = (struct xfs_commit_range_fresh *)&args.file2_freshness;
> +
> +	memcpy(&kern_f->fsid, ip2->i_mount->m_fixedfsid, sizeof(xfs_fsid_t));
> +
> +	xfs_ilock(ip2, lockflags);
> +	ts = inode_get_ctime(inode2);
> +	kern_f->file2_ctime		= ts.tv_sec;
> +	kern_f->file2_ctime_nsec	= ts.tv_nsec;
> +	ts = inode_get_mtime(inode2);
> +	kern_f->file2_mtime		= ts.tv_sec;
> +	kern_f->file2_mtime_nsec	= ts.tv_nsec;
> +	kern_f->file2_ino		= ip2->i_ino;
> +	kern_f->file2_gen		= inode2->i_generation;
> +	kern_f->magic			= XCR_FRESH_MAGIC;
> +	xfs_iunlock(ip2, lockflags);
> +
> +	user_f = (struct xfs_commit_range_fresh __user *)&argp->file2_freshness;
> +	if (copy_to_user(user_f, kern_f, sizeof(*kern_f)))
> +		return -EFAULT;
> +
> +	return 0;
> +}
> +
> +/*
> + * Exchange file1 and file2 contents if file2 has not been written since the
> + * start commit operation.
> + */
> +long
> +xfs_ioc_commit_range(
> +	struct file			*file,
> +	struct xfs_commit_range __user	*argp)
> +{
> +	struct xfs_exchrange		fxr = {
> +		.file2			= file,
> +	};
> +	struct xfs_commit_range		args;
> +	struct xfs_commit_range_fresh	*kern_f;
> +	struct xfs_inode		*ip2 = XFS_I(file_inode(file));
> +	struct xfs_mount		*mp = ip2->i_mount;
> +	struct fd			file1;
> +	int				error;
> +
> +	kern_f = (struct xfs_commit_range_fresh *)&args.file2_freshness;
> +
> +	if (copy_from_user(&args, argp, sizeof(args)))
> +		return -EFAULT;
> +	if (args.flags & ~XFS_EXCHANGE_RANGE_ALL_FLAGS)
> +		return -EINVAL;
> +	if (kern_f->magic != XCR_FRESH_MAGIC)
> +		return -EBUSY;
> +	if (memcmp(&kern_f->fsid, mp->m_fixedfsid, sizeof(xfs_fsid_t)))
> +		return -EBUSY;
> +
> +	fxr.file1_offset	= args.file1_offset;
> +	fxr.file2_offset	= args.file2_offset;
> +	fxr.length		= args.length;
> +	fxr.flags		= args.flags | __XFS_EXCHANGE_RANGE_CHECK_FRESH2;
> +	fxr.file2_ino		= kern_f->file2_ino;
> +	fxr.file2_gen		= kern_f->file2_gen;
> +	fxr.file2_mtime.tv_sec	= kern_f->file2_mtime;
> +	fxr.file2_mtime.tv_nsec	= kern_f->file2_mtime_nsec;
> +	fxr.file2_ctime.tv_sec	= kern_f->file2_ctime;
> +	fxr.file2_ctime.tv_nsec	= kern_f->file2_ctime_nsec;
> +
> +	file1 = fdget(args.file1_fd);
> +	if (!file1.file)
> +		return -EBADF;
> +	fxr.file1 = file1.file;
> +
> +	error = xfs_exchange_range(&fxr);
> +	fdput(file1);
> +	return error;
> +}
> diff --git a/fs/xfs/xfs_exchrange.h b/fs/xfs/xfs_exchrange.h
> index 039abcca546e8..bc1298aba806b 100644
> --- a/fs/xfs/xfs_exchrange.h
> +++ b/fs/xfs/xfs_exchrange.h
> @@ -10,8 +10,12 @@
>  #define __XFS_EXCHANGE_RANGE_UPD_CMTIME1	(1ULL << 63)
>  #define __XFS_EXCHANGE_RANGE_UPD_CMTIME2	(1ULL << 62)
>  
> +/* Freshness check required */
> +#define __XFS_EXCHANGE_RANGE_CHECK_FRESH2	(1ULL << 61)
> +
>  #define XFS_EXCHANGE_RANGE_PRIV_FLAGS	(__XFS_EXCHANGE_RANGE_UPD_CMTIME1 | \
> -					 __XFS_EXCHANGE_RANGE_UPD_CMTIME2)
> +					 __XFS_EXCHANGE_RANGE_UPD_CMTIME2 | \
> +					 __XFS_EXCHANGE_RANGE_CHECK_FRESH2)
>  
>  struct xfs_exchrange {
>  	struct file		*file1;
> @@ -22,10 +26,20 @@ struct xfs_exchrange {
>  	u64			length;
>  
>  	u64			flags;	/* XFS_EXCHANGE_RANGE flags */
> +
> +	/* file2 metadata for freshness checks */
> +	u64			file2_ino;
> +	struct timespec64	file2_mtime;
> +	struct timespec64	file2_ctime;
> +	u32			file2_gen;
>  };
>  
>  long xfs_ioc_exchange_range(struct file *file,
>  		struct xfs_exchange_range __user *argp);
> +long xfs_ioc_start_commit(struct file *file,
> +		struct xfs_commit_range __user *argp);
> +long xfs_ioc_commit_range(struct file *file,
> +		struct xfs_commit_range __user	*argp);
>  
>  struct xfs_exchmaps_req;
>  
> diff --git a/fs/xfs/xfs_ioctl.c b/fs/xfs/xfs_ioctl.c
> index 6b13666d4e963..90b3ee21e7fe6 100644
> --- a/fs/xfs/xfs_ioctl.c
> +++ b/fs/xfs/xfs_ioctl.c
> @@ -1518,6 +1518,10 @@ xfs_file_ioctl(
>  
>  	case XFS_IOC_EXCHANGE_RANGE:
>  		return xfs_ioc_exchange_range(filp, arg);
> +	case XFS_IOC_START_COMMIT:
> +		return xfs_ioc_start_commit(filp, arg);
> +	case XFS_IOC_COMMIT_RANGE:
> +		return xfs_ioc_commit_range(filp, arg);
>  
>  	default:
>  		return -ENOTTY;
> diff --git a/fs/xfs/xfs_trace.h b/fs/xfs/xfs_trace.h
> index 180ce697305a9..4cf0fa71ba9ce 100644
> --- a/fs/xfs/xfs_trace.h
> +++ b/fs/xfs/xfs_trace.h
> @@ -4926,7 +4926,8 @@ DEFINE_INODE_ERROR_EVENT(xfs_exchrange_error);
>  	{ XFS_EXCHANGE_RANGE_DRY_RUN,		"DRY_RUN" }, \
>  	{ XFS_EXCHANGE_RANGE_FILE1_WRITTEN,	"F1_WRITTEN" }, \
>  	{ __XFS_EXCHANGE_RANGE_UPD_CMTIME1,	"CMTIME1" }, \
> -	{ __XFS_EXCHANGE_RANGE_UPD_CMTIME2,	"CMTIME2" }
> +	{ __XFS_EXCHANGE_RANGE_UPD_CMTIME2,	"CMTIME2" }, \
> +	{ __XFS_EXCHANGE_RANGE_CHECK_FRESH2,	"FRESH2" }
>  
>  /* file exchange-range tracepoint class */
>  DECLARE_EVENT_CLASS(xfs_exchrange_class,
> @@ -4986,6 +4987,60 @@ DEFINE_EXCHRANGE_EVENT(xfs_exchrange_prep);
>  DEFINE_EXCHRANGE_EVENT(xfs_exchrange_flush);
>  DEFINE_EXCHRANGE_EVENT(xfs_exchrange_mappings);
>  
> +TRACE_EVENT(xfs_exchrange_freshness,
> +	TP_PROTO(const struct xfs_exchrange *fxr, struct xfs_inode *ip2),
> +	TP_ARGS(fxr, ip2),
> +	TP_STRUCT__entry(
> +		__field(dev_t, dev)
> +		__field(xfs_ino_t, ip2_ino)
> +		__field(long long, ip2_mtime)
> +		__field(long long, ip2_ctime)
> +		__field(int, ip2_mtime_nsec)
> +		__field(int, ip2_ctime_nsec)
> +
> +		__field(xfs_ino_t, file2_ino)
> +		__field(long long, file2_mtime)
> +		__field(long long, file2_ctime)
> +		__field(int, file2_mtime_nsec)
> +		__field(int, file2_ctime_nsec)
> +	),
> +	TP_fast_assign(
> +		struct timespec64	ts64;
> +		struct inode		*inode2 = VFS_I(ip2);
> +
> +		__entry->dev = inode2->i_sb->s_dev;
> +		__entry->ip2_ino = ip2->i_ino;
> +
> +		ts64 = inode_get_ctime(inode2);
> +		__entry->ip2_ctime = ts64.tv_sec;
> +		__entry->ip2_ctime_nsec = ts64.tv_nsec;
> +
> +		ts64 = inode_get_mtime(inode2);
> +		__entry->ip2_mtime = ts64.tv_sec;
> +		__entry->ip2_mtime_nsec = ts64.tv_nsec;
> +
> +		__entry->file2_ino = fxr->file2_ino;
> +		__entry->file2_mtime = fxr->file2_mtime.tv_sec;
> +		__entry->file2_ctime = fxr->file2_ctime.tv_sec;
> +		__entry->file2_mtime_nsec = fxr->file2_mtime.tv_nsec;
> +		__entry->file2_ctime_nsec = fxr->file2_ctime.tv_nsec;
> +	),
> +	TP_printk("dev %d:%d "
> +		  "ino 0x%llx mtime %lld:%d ctime %lld:%d -> "
> +		  "file 0x%llx mtime %lld:%d ctime %lld:%d",
> +		  MAJOR(__entry->dev), MINOR(__entry->dev),
> +		  __entry->ip2_ino,
> +		  __entry->ip2_mtime,
> +		  __entry->ip2_mtime_nsec,
> +		  __entry->ip2_ctime,
> +		  __entry->ip2_ctime_nsec,
> +		  __entry->file2_ino,
> +		  __entry->file2_mtime,
> +		  __entry->file2_mtime_nsec,
> +		  __entry->file2_ctime,
> +		  __entry->file2_ctime_nsec)
> +);
> +
>  TRACE_EVENT(xfs_exchmaps_overhead,
>  	TP_PROTO(struct xfs_mount *mp, unsigned long long bmbt_blocks,
>  		 unsigned long long rmapbt_blocks),

Acked-by: Jeff Layton <jlayton@kernel.org>

  reply	other threads:[~2024-08-24 12:11 UTC|newest]

Thread overview: 270+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-08-22 23:52 [PATCHBOMB 6.12] xfs: metadata directories and realtime groups Darrick J. Wong
2024-08-22 23:56 ` [PATCHSET v4.0 01/10] xfs: various bug fixes for 6.11 Darrick J. Wong
2024-08-22 23:59   ` [PATCH 1/9] xfs: fix di_onlink checking for V1/V2 inodes Darrick J. Wong
2024-08-22 23:59   ` [PATCH 2/9] xfs: fix folio dirtying for XFILE_ALLOC callers Darrick J. Wong
2024-08-22 23:59   ` [PATCH 3/9] xfs: xfs_finobt_count_blocks() walks the wrong btree Darrick J. Wong
2024-08-22 23:59   ` [PATCH 4/9] xfs: don't bother reporting blocks trimmed via FITRIM Darrick J. Wong
2024-08-23  0:00   ` [PATCH 5/9] xfs: Fix the owner setting issue for rmap query in xfs fsmap Darrick J. Wong
2024-08-23  4:10     ` Christoph Hellwig
2024-08-23  0:00   ` [PATCH 6/9] xfs: use XFS_BUF_DADDR_NULL for daddrs in getfsmap code Darrick J. Wong
2024-08-23  4:10     ` Christoph Hellwig
2024-08-23  0:00   ` [PATCH 7/9] xfs: Fix missing interval for missing_owner in xfs fsmap Darrick J. Wong
2024-08-26  3:58     ` Zizhi Wo
2024-08-23  0:00   ` [PATCH 8/9] xfs: take m_growlock when running growfsrt Darrick J. Wong
2024-08-23  4:08     ` Christoph Hellwig
2024-08-23  0:01   ` [PATCH 9/9] xfs: reset rootdir extent size hint after growfsrt Darrick J. Wong
2024-08-23  4:09     ` Christoph Hellwig
2024-08-23  4:09   ` [PATCHSET v4.0 01/10] xfs: various bug fixes for 6.11 Christoph Hellwig
2024-08-22 23:56 ` [PATCHSET v31.0 02/10] xfs: atomic file content commits Darrick J. Wong
2024-08-23  0:01   ` [PATCH 1/1] xfs: introduce new file range commit ioctls Darrick J. Wong
2024-08-23  4:12     ` Christoph Hellwig
2024-08-23 13:20       ` Jeff Layton
2024-08-23 17:41         ` Darrick J. Wong
2024-08-23 19:15           ` Jeff Layton
2024-08-24  3:29           ` Christoph Hellwig
2024-08-24  4:46             ` Darrick J. Wong
2024-08-24  4:48               ` Christoph Hellwig
2024-08-24  6:29     ` [PATCH v31.0.1 " Darrick J. Wong
2024-08-24 12:11       ` Jeff Layton [this message]
2024-08-25  4:52       ` Christoph Hellwig
2024-08-22 23:56 ` [PATCHSET v4.0 03/10] xfs: cleanups before adding metadata directories Darrick J. Wong
2024-08-23  0:01   ` [PATCH 1/3] xfs: validate inumber in xfs_iget Darrick J. Wong
2024-08-23  0:01   ` [PATCH 2/3] xfs: match on the global RT inode numbers in xfs_is_metadata_inode Darrick J. Wong
2024-08-23  0:02   ` [PATCH 3/3] xfs: pass the icreate args object to xfs_dialloc Darrick J. Wong
2024-08-23  4:13     ` Christoph Hellwig
2024-08-22 23:57 ` [PATCHSET v4.0 04/10] xfs: metadata inode directories Darrick J. Wong
2024-08-23  0:02   ` [PATCH 01/26] xfs: define the on-disk format for the metadir feature Darrick J. Wong
2024-08-23  4:30     ` Christoph Hellwig
2024-08-23  0:02   ` [PATCH 02/26] xfs: refactor loading quota inodes in the regular case Darrick J. Wong
2024-08-23  4:31     ` Christoph Hellwig
2024-08-23 17:51       ` Darrick J. Wong
2024-08-23  0:02   ` [PATCH 03/26] xfs: iget for metadata inodes Darrick J. Wong
2024-08-23  4:35     ` Christoph Hellwig
2024-08-23 17:53       ` Darrick J. Wong
2024-08-23  0:03   ` [PATCH 04/26] xfs: load metadata directory root at mount time Darrick J. Wong
2024-08-23  4:35     ` Christoph Hellwig
2024-08-23  0:03   ` [PATCH 05/26] xfs: enforce metadata inode flag Darrick J. Wong
2024-08-23  4:38     ` Christoph Hellwig
2024-08-23 17:55       ` Darrick J. Wong
2024-08-23  0:03   ` [PATCH 06/26] xfs: read and write metadata inode directory tree Darrick J. Wong
2024-08-23  4:39     ` Christoph Hellwig
2024-08-23  0:03   ` [PATCH 07/26] xfs: disable the agi rotor for metadata inodes Darrick J. Wong
2024-08-23  4:39     ` Christoph Hellwig
2024-08-23  0:04   ` [PATCH 08/26] xfs: hide metadata inodes from everyone because they are special Darrick J. Wong
2024-08-23  4:40     ` Christoph Hellwig
2024-08-26  0:41     ` Dave Chinner
2024-08-26 17:33       ` Darrick J. Wong
2024-08-23  0:04   ` [PATCH 09/26] xfs: advertise metadata directory feature Darrick J. Wong
2024-08-23  4:40     ` Christoph Hellwig
2024-08-23  0:04   ` [PATCH 10/26] xfs: allow bulkstat to return metadata directories Darrick J. Wong
2024-08-23  4:41     ` Christoph Hellwig
2024-08-23  0:05   ` [PATCH 11/26] xfs: don't count metadata directory files to quota Darrick J. Wong
2024-08-23  4:42     ` Christoph Hellwig
2024-08-26  0:47     ` Dave Chinner
2024-08-26 17:57       ` Darrick J. Wong
2024-08-23  0:05   ` [PATCH 12/26] xfs: mark quota inodes as metadata files Darrick J. Wong
2024-08-23  4:42     ` Christoph Hellwig
2024-08-23  0:05   ` [PATCH 13/26] xfs: adjust xfs_bmap_add_attrfork for metadir Darrick J. Wong
2024-08-23  4:42     ` Christoph Hellwig
2024-08-23  0:05   ` [PATCH 14/26] xfs: record health problems with the metadata directory Darrick J. Wong
2024-08-23  4:43     ` Christoph Hellwig
2024-08-23  0:06   ` [PATCH 15/26] xfs: refactor directory tree root predicates Darrick J. Wong
2024-08-23  4:48     ` Christoph Hellwig
2024-08-23  0:06   ` [PATCH 16/26] xfs: do not count metadata directory files when doing online quotacheck Darrick J. Wong
2024-08-23  4:48     ` Christoph Hellwig
2024-08-23  0:06   ` [PATCH 17/26] xfs: don't fail repairs on metadata files with no attr fork Darrick J. Wong
2024-08-23  4:49     ` Christoph Hellwig
2024-08-23  0:06   ` [PATCH 18/26] xfs: metadata files can have xattrs if metadir is enabled Darrick J. Wong
2024-08-23  4:50     ` Christoph Hellwig
2024-08-23 18:00       ` Darrick J. Wong
2024-08-23  0:07   ` [PATCH 19/26] xfs: adjust parent pointer scrubber for sb-rooted metadata files Darrick J. Wong
2024-08-23  4:50     ` Christoph Hellwig
2024-08-23  0:07   ` [PATCH 20/26] xfs: fix di_metatype field of inodes that won't load Darrick J. Wong
2024-08-23  4:51     ` Christoph Hellwig
2024-08-23  0:07   ` [PATCH 21/26] xfs: scrub metadata directories Darrick J. Wong
2024-08-23  4:53     ` Christoph Hellwig
2024-08-23  0:07   ` [PATCH 22/26] xfs: check the metadata directory inumber in superblocks Darrick J. Wong
2024-08-23  4:53     ` Christoph Hellwig
2024-08-23  0:08   ` [PATCH 23/26] xfs: move repair temporary files to the metadata directory tree Darrick J. Wong
2024-08-23  4:54     ` Christoph Hellwig
2024-08-23  0:08   ` [PATCH 24/26] xfs: check metadata directory file path connectivity Darrick J. Wong
2024-08-23  4:55     ` Christoph Hellwig
2024-08-23  0:08   ` [PATCH 25/26] xfs: confirm dotdot target before replacing it during a repair Darrick J. Wong
2024-08-23  4:55     ` Christoph Hellwig
2024-08-23  0:08   ` [PATCH 26/26] xfs: repair metadata directory file path connectivity Darrick J. Wong
2024-08-23  4:56     ` Christoph Hellwig
2024-08-22 23:57 ` [PATCHSET v4.0 05/10] xfs: clean up the rtbitmap code Darrick J. Wong
2024-08-23  0:09   ` [PATCH 01/12] xfs: remove xfs_validate_rtextents Darrick J. Wong
2024-08-23  0:09   ` [PATCH 02/12] xfs: factor out a xfs_validate_rt_geometry helper Darrick J. Wong
2024-08-23  0:09   ` [PATCH 03/12] xfs: make the RT rsum_cache mandatory Darrick J. Wong
2024-08-23  0:09   ` [PATCH 04/12] xfs: remove the limit argument to xfs_rtfind_back Darrick J. Wong
2024-08-23  0:10   ` [PATCH 05/12] xfs: assert a valid limit in xfs_rtfind_forw Darrick J. Wong
2024-08-23  0:10   ` [PATCH 06/12] xfs: add bounds checking to xfs_rt{bitmap,summary}_read_buf Darrick J. Wong
2024-08-23  0:10   ` [PATCH 07/12] xfs: cleanup the calling convention for xfs_rtpick_extent Darrick J. Wong
2024-08-23  0:11   ` [PATCH 08/12] xfs: push the calls to xfs_rtallocate_range out to xfs_bmap_rtalloc Darrick J. Wong
2024-08-23  0:11   ` [PATCH 09/12] xfs: factor out a xfs_growfs_rt_bmblock helper Darrick J. Wong
2024-08-23  0:11   ` [PATCH 10/12] xfs: factor out a xfs_last_rt_bmblock helper Darrick J. Wong
2024-08-23  0:11   ` [PATCH 11/12] xfs: factor out rtbitmap/summary initialization helpers Darrick J. Wong
2024-08-23  0:12   ` [PATCH 12/12] xfs: push transaction join out of xfs_rtbitmap_lock and xfs_rtgroup_lock Darrick J. Wong
2024-08-22 23:57 ` [PATCHSET v4.0 06/10] xfs: fixes and cleanups for the realtime allocator Darrick J. Wong
2024-08-23  0:12   ` [PATCH 01/10] xfs: use the recalculated transaction reservation in xfs_growfs_rt_bmblock Darrick J. Wong
2024-08-23  0:12   ` [PATCH 02/10] xfs: ensure rtx mask/shift are correct after growfs Darrick J. Wong
2024-08-23  0:12   ` [PATCH 03/10] xfs: don't return too-short extents from xfs_rtallocate_extent_block Darrick J. Wong
2024-08-23  4:57     ` Christoph Hellwig
2024-08-23  0:13   ` [PATCH 04/10] xfs: don't scan off the end of the rt volume in xfs_rtallocate_extent_block Darrick J. Wong
2024-08-23  4:57     ` Christoph Hellwig
2024-08-23  0:13   ` [PATCH 05/10] xfs: refactor aligning bestlen to prod Darrick J. Wong
2024-08-23  4:58     ` Christoph Hellwig
2024-08-23  0:13   ` [PATCH 06/10] xfs: clean up xfs_rtallocate_extent_exact a bit Darrick J. Wong
2024-08-23  4:58     ` Christoph Hellwig
2024-08-23  0:13   ` [PATCH 07/10] xfs: reduce excessive clamping of maxlen in xfs_rtallocate_extent_near Darrick J. Wong
2024-08-23  4:59     ` Christoph Hellwig
2024-08-23  0:14   ` [PATCH 08/10] xfs: fix broken variable-sized allocation detection in xfs_rtallocate_extent_block Darrick J. Wong
2024-08-23  4:59     ` Christoph Hellwig
2024-08-23  0:14   ` [PATCH 09/10] xfs: remove xfs_rtb_to_rtxrem Darrick J. Wong
2024-08-23  0:14   ` [PATCH 10/10] xfs: simplify xfs_rtalloc_query_range Darrick J. Wong
2024-08-22 23:57 ` [PATCHSET v4.0 07/10] xfs: create incore rt allocation groups Darrick J. Wong
2024-08-23  0:14   ` [PATCH 01/24] xfs: clean up the ISVALID macro in xfs_bmap_adjacent Darrick J. Wong
2024-08-23  0:15   ` [PATCH 02/24] xfs: factor out a xfs_rtallocate helper Darrick J. Wong
2024-08-23  0:15   ` [PATCH 03/24] xfs: rework the rtalloc fallback handling Darrick J. Wong
2024-08-23  0:15   ` [PATCH 04/24] xfs: factor out a xfs_rtallocate_align helper Darrick J. Wong
2024-08-23  0:15   ` [PATCH 05/24] xfs: make the rtalloc start hint a xfs_rtblock_t Darrick J. Wong
2024-08-23  0:16   ` [PATCH 06/24] xfs: add xchk_setup_nothing and xchk_nothing helpers Darrick J. Wong
2024-08-23  5:00     ` Christoph Hellwig
2024-08-23  0:16   ` [PATCH 07/24] xfs: remove xfs_{rtbitmap,rtsummary}_wordcount Darrick J. Wong
2024-08-23  0:16   ` [PATCH 08/24] xfs: replace m_rsumsize with m_rsumblocks Darrick J. Wong
2024-08-23  0:17   ` [PATCH 09/24] xfs: rearrange xfs_fsmap.c a little bit Darrick J. Wong
2024-08-23  5:01     ` Christoph Hellwig
2024-08-23  0:17   ` [PATCH 10/24] xfs: move xfs_ioc_getfsmap out of xfs_ioctl.c Darrick J. Wong
2024-08-23  5:01     ` Christoph Hellwig
2024-08-23  0:17   ` [PATCH 11/24] xfs: create incore realtime group structures Darrick J. Wong
2024-08-23  5:01     ` Christoph Hellwig
2024-08-25 23:56     ` Dave Chinner
2024-08-26 19:14       ` Darrick J. Wong
2024-08-27  0:57         ` Dave Chinner
2024-08-27  1:55           ` Darrick J. Wong
2024-08-27  3:00             ` Dave Chinner
2024-08-27  4:44             ` Christoph Hellwig
2024-08-27  4:38           ` Christoph Hellwig
2024-08-27  5:17             ` Darrick J. Wong
2024-08-27  5:18               ` Christoph Hellwig
2024-08-27  4:27         ` Christoph Hellwig
2024-08-27  5:19           ` Darrick J. Wong
2024-08-23  0:17   ` [PATCH 12/24] xfs: define locking primitives for realtime groups Darrick J. Wong
2024-08-23  5:02     ` Christoph Hellwig
2024-08-23  0:18   ` [PATCH 13/24] xfs: add a lockdep class key for rtgroup inodes Darrick J. Wong
2024-08-23  5:02     ` Christoph Hellwig
2024-08-25 23:58     ` Dave Chinner
2024-08-26 21:38       ` Darrick J. Wong
2024-08-27  0:58         ` Dave Chinner
2024-08-27  1:56           ` Darrick J. Wong
2024-08-27  3:00             ` Dave Chinner
2024-08-23  0:18   ` [PATCH 14/24] xfs: support caching rtgroup metadata inodes Darrick J. Wong
2024-08-23  5:02     ` Christoph Hellwig
2024-08-26  1:41     ` Dave Chinner
2024-08-26 18:37       ` Darrick J. Wong
2024-08-27  1:05         ` Dave Chinner
2024-08-27  2:01           ` Darrick J. Wong
2024-08-23  0:18   ` [PATCH 15/24] xfs: add rtgroup-based realtime scrubbing context management Darrick J. Wong
2024-08-23  5:03     ` Christoph Hellwig
2024-08-23  0:18   ` [PATCH 16/24] xfs: move RT bitmap and summary information to the rtgroup Darrick J. Wong
2024-08-26  1:58     ` Dave Chinner
2024-08-23  0:19   ` [PATCH 17/24] xfs: remove XFS_ILOCK_RT* Darrick J. Wong
2024-08-23  5:04     ` Christoph Hellwig
2024-08-23  0:19   ` [PATCH 18/24] xfs: calculate RT bitmap and summary blocks based on sb_rextents Darrick J. Wong
2024-08-23  0:19   ` [PATCH 19/24] xfs: factor out a xfs_growfs_rt_alloc_fake_mount helper Darrick J. Wong
2024-08-23  0:19   ` [PATCH 20/24] xfs: use xfs_growfs_rt_alloc_fake_mount in xfs_growfs_rt_alloc_blocks Darrick J. Wong
2024-08-23  0:20   ` [PATCH 21/24] xfs: factor out a xfs_growfs_check_rtgeom helper Darrick J. Wong
2024-08-26  2:06     ` Dave Chinner
2024-08-26 18:27       ` Darrick J. Wong
2024-08-27  1:29         ` Dave Chinner
2024-08-27  4:27           ` Darrick J. Wong
2024-08-27 22:16             ` Dave Chinner
2024-08-23  0:20   ` [PATCH 22/24] xfs: refactor xfs_rtbitmap_blockcount Darrick J. Wong
2024-08-23  0:20   ` [PATCH 23/24] xfs: refactor xfs_rtsummary_blockcount Darrick J. Wong
2024-08-23  0:20   ` [PATCH 24/24] xfs: make RT extent numbers relative to the rtgroup Darrick J. Wong
2024-08-22 23:58 ` [PATCHSET v4.0 08/10] xfs: preparation for realtime allocation groups Darrick J. Wong
2024-08-23  0:21   ` [PATCH 1/1] iomap: add a merge boundary flag Darrick J. Wong
2024-08-22 23:58 ` [PATCHSET v4.0 09/10] xfs: shard the realtime section Darrick J. Wong
2024-08-23  0:21   ` [PATCH 01/26] xfs: define the format of rt groups Darrick J. Wong
2024-08-23  5:11     ` Christoph Hellwig
2024-08-23 18:12       ` Darrick J. Wong
2024-08-23  0:21   ` [PATCH 02/26] xfs: check the realtime superblock at mount time Darrick J. Wong
2024-08-23  5:11     ` Christoph Hellwig
2024-08-23  0:21   ` [PATCH 03/26] xfs: update realtime super every time we update the primary fs super Darrick J. Wong
2024-08-23  5:12     ` Christoph Hellwig
2024-08-23  0:22   ` [PATCH 04/26] xfs: export realtime group geometry via XFS_FSOP_GEOM Darrick J. Wong
2024-08-23  5:12     ` Christoph Hellwig
2024-08-23  0:22   ` [PATCH 05/26] xfs: check that rtblock extents do not break rtsupers or rtgroups Darrick J. Wong
2024-08-23  5:13     ` Christoph Hellwig
2024-08-23  0:22   ` [PATCH 06/26] xfs: add a helper to prevent bmap merges across rtgroup boundaries Darrick J. Wong
2024-08-23  0:22   ` [PATCH 07/26] xfs: add frextents to the lazysbcounters when rtgroups enabled Darrick J. Wong
2024-08-23  5:13     ` Christoph Hellwig
2024-08-23  0:23   ` [PATCH 08/26] xfs: convert sick_map loops to use ARRAY_SIZE Darrick J. Wong
2024-08-23  5:14     ` Christoph Hellwig
2024-08-23  0:23   ` [PATCH 09/26] xfs: record rt group metadata errors in the health system Darrick J. Wong
2024-08-23  5:14     ` Christoph Hellwig
2024-08-23  0:23   ` [PATCH 10/26] xfs: export the geometry of realtime groups to userspace Darrick J. Wong
2024-08-23  5:14     ` Christoph Hellwig
2024-08-23  0:24   ` [PATCH 11/26] xfs: add block headers to realtime bitmap and summary blocks Darrick J. Wong
2024-08-23  5:15     ` Christoph Hellwig
2024-08-23  0:24   ` [PATCH 12/26] xfs: encode the rtbitmap in big endian format Darrick J. Wong
2024-08-23  5:15     ` Christoph Hellwig
2024-08-23  0:24   ` [PATCH 13/26] xfs: encode the rtsummary " Darrick J. Wong
2024-08-23  5:15     ` Christoph Hellwig
2024-08-23  0:24   ` [PATCH 14/26] xfs: grow the realtime section when realtime groups are enabled Darrick J. Wong
2024-08-23  5:16     ` Christoph Hellwig
2024-08-23  0:25   ` [PATCH 15/26] xfs: store rtgroup information with a bmap intent Darrick J. Wong
2024-08-23  5:16     ` Christoph Hellwig
2024-08-23  0:25   ` [PATCH 16/26] xfs: force swapext to a realtime file to use the file content exchange ioctl Darrick J. Wong
2024-08-23  5:17     ` Christoph Hellwig
2024-08-23  0:25   ` [PATCH 17/26] xfs: support logging EFIs for realtime extents Darrick J. Wong
2024-08-23  5:17     ` Christoph Hellwig
2024-08-26  4:33     ` Dave Chinner
2024-08-26 19:38       ` Darrick J. Wong
2024-08-27  1:36         ` Dave Chinner
2024-08-23  0:25   ` [PATCH 18/26] xfs: support error injection when freeing rt extents Darrick J. Wong
2024-08-23  5:18     ` Christoph Hellwig
2024-08-23  0:26   ` [PATCH 19/26] xfs: use realtime EFI to free extents when rtgroups are enabled Darrick J. Wong
2024-08-23  5:18     ` Christoph Hellwig
2024-08-23  0:26   ` [PATCH 20/26] xfs: don't merge ioends across RTGs Darrick J. Wong
2024-08-23  0:26   ` [PATCH 21/26] xfs: make the RT allocator rtgroup aware Darrick J. Wong
2024-08-26  4:56     ` Dave Chinner
2024-08-26 19:40       ` Darrick J. Wong
2024-08-27  1:56         ` Dave Chinner
2024-08-27  2:16           ` Darrick J. Wong
2024-08-27  5:00             ` Christoph Hellwig
2024-08-27  5:00         ` Christoph Hellwig
2024-08-27  4:59       ` Christoph Hellwig
2024-08-23  0:26   ` [PATCH 22/26] xfs: don't coalesce file mappings that cross rtgroup boundaries in scrub Darrick J. Wong
2024-08-23  5:19     ` Christoph Hellwig
2024-08-23  0:27   ` [PATCH 23/26] xfs: scrub the realtime group superblock Darrick J. Wong
2024-08-23  5:19     ` Christoph Hellwig
2024-08-23  0:27   ` [PATCH 24/26] xfs: repair " Darrick J. Wong
2024-08-23  5:19     ` Christoph Hellwig
2024-08-23  0:27   ` [PATCH 25/26] xfs: scrub metadir paths for rtgroup metadata Darrick J. Wong
2024-08-23  5:20     ` Christoph Hellwig
2024-08-23  0:27   ` [PATCH 26/26] xfs: mask off the rtbitmap and summary inodes when metadir in use Darrick J. Wong
2024-08-23  5:20     ` Christoph Hellwig
2024-08-22 23:58 ` [PATCHSET v4.0 10/10] xfs: store quota files in the metadir Darrick J. Wong
2024-08-23  0:28   ` [PATCH 1/6] xfs: refactor xfs_qm_destroy_quotainos Darrick J. Wong
2024-08-23  5:51     ` Christoph Hellwig
2024-08-23  0:28   ` [PATCH 2/6] xfs: use metadir for quota inodes Darrick J. Wong
2024-08-23  5:53     ` Christoph Hellwig
2024-08-23 18:20       ` Darrick J. Wong
2024-08-23  0:28   ` [PATCH 3/6] xfs: scrub quota file metapaths Darrick J. Wong
2024-08-23  5:53     ` Christoph Hellwig
2024-08-23  0:28   ` [PATCH 4/6] xfs: persist quota flags with metadir Darrick J. Wong
2024-08-23  5:54     ` Christoph Hellwig
2024-08-23 18:23       ` Darrick J. Wong
2024-08-26  9:42     ` Dave Chinner
2024-08-26 18:15       ` Darrick J. Wong
2024-08-23  0:29   ` [PATCH 5/6] xfs: update sb field checks when metadir is turned on Darrick J. Wong
2024-08-23  5:55     ` Christoph Hellwig
2024-08-26  9:52     ` Dave Chinner
2024-08-26 18:07       ` Darrick J. Wong
2024-08-27  2:16         ` Dave Chinner
2024-08-27  3:16           ` Darrick J. Wong
2024-08-23  0:29   ` [PATCH 6/6] xfs: enable metadata directory feature Darrick J. Wong
2024-08-23  5:58     ` Christoph Hellwig
2024-08-23 18:26       ` 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=9517bd6324bd0125d2b1b38cc0d5dbfe06fc34dd.camel@kernel.org \
    --to=jlayton@kernel.org \
    --cc=djwong@kernel.org \
    --cc=hch@lst.de \
    --cc=linux-fsdevel@vger.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox