Commit 81928136 authored by John Garry's avatar John Garry Committed by Long Li
Browse files

fs: xfs: Support setting FMODE_CAN_ATOMIC_WRITE

maillist inclusion
category: feature
bugzilla: https://gitee.com/openeuler/kernel/issues/I9VTE3
CVE: NA

Reference: https://lore.kernel.org/all/20240326133813.3224593-1-john.g.garry@oracle.com/



--------------------------------

For when an inode is enabled for atomic writes, set FMODE_CAN_ATOMIC_WRITE
flag. We check for direct I/O and also check that the bdev can actually
support atomic writes.

We rely on the block layer to reject atomic writes which exceed the bdev
request_queue limits, so don't bother checking any such thing here.

Signed-off-by: default avatarJohn Garry <john.g.garry@oracle.com>
Signed-off-by: default avatarLong Li <leo.lilong@huawei.com>
parent 64ef3f61
Loading
Loading
Loading
Loading
+21 −0
Original line number Diff line number Diff line
@@ -1187,6 +1187,25 @@ xfs_file_remap_range(
	return remapped > 0 ? remapped : ret;
}

static bool xfs_file_open_can_atomicwrite(
	struct inode		*inode,
	struct file		*file)
{
	struct xfs_inode	*ip = XFS_I(inode);
	struct xfs_buftarg	*target = xfs_inode_buftarg(ip);

	if (!(file->f_flags & O_DIRECT))
		return false;

	if (!xfs_inode_atomicwrites(ip))
		return false;

	if (!bdev_can_atomic_write(target->bt_bdev))
		return false;

	return true;
}

STATIC int
xfs_file_open(
	struct inode	*inode,
@@ -1197,6 +1216,8 @@ xfs_file_open(
	if (xfs_is_shutdown(XFS_M(inode->i_sb)))
		return -EIO;
	file->f_mode |= FMODE_NOWAIT | FMODE_BUF_RASYNC;
	if (xfs_file_open_can_atomicwrite(inode, file))
		file->f_mode |= FMODE_CAN_ATOMIC_WRITE;
	return 0;
}