Commit 6a7e17b2 authored by John Garry's avatar John Garry Committed by Jens Axboe
Browse files

block: Add common atomic writes enable flag



Currently only stacked devices need to explicitly enable atomic writes by
setting BLK_FEAT_ATOMIC_WRITES_STACKED flag.

This does not work well for device mapper stacking devices, as there many
sets of limits are stacked and what is the 'bottom' and 'top' device can
swapped. This means that BLK_FEAT_ATOMIC_WRITES_STACKED needs to be set
for many queue limits, which is messy.

Generalize enabling atomic writes enabling by ensuring that all devices
must explicitly set a flag - that includes NVMe, SCSI sd, and md raid.

Signed-off-by: default avatarJohn Garry <john.g.garry@oracle.com>
Reviewed-by: default avatarMike Snitzer <snitzer@kernel.org>
Link: https://lore.kernel.org/r/20250116170301.474130-2-john.g.garry@oracle.com


Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent 63492a2d
Loading
Loading
Loading
Loading
+4 −2
Original line number Diff line number Diff line
@@ -175,6 +175,9 @@ static void blk_validate_atomic_write_limits(struct queue_limits *lim)
{
	unsigned int boundary_sectors;

	if (!(lim->features & BLK_FEAT_ATOMIC_WRITES))
		goto unsupported;

	if (!lim->atomic_write_hw_max)
		goto unsupported;

@@ -611,7 +614,7 @@ static bool blk_stack_atomic_writes_head(struct queue_limits *t,
static void blk_stack_atomic_writes_limits(struct queue_limits *t,
				struct queue_limits *b, sector_t start)
{
	if (!(t->features & BLK_FEAT_ATOMIC_WRITES_STACKED))
	if (!(b->features & BLK_FEAT_ATOMIC_WRITES))
		goto unsupported;

	if (!b->atomic_write_hw_unit_min)
@@ -639,7 +642,6 @@ static void blk_stack_atomic_writes_limits(struct queue_limits *t,
	t->atomic_write_hw_unit_max = 0;
	t->atomic_write_hw_unit_min = 0;
	t->atomic_write_hw_boundary = 0;
	t->features &= ~BLK_FEAT_ATOMIC_WRITES_STACKED;
}

/**
+1 −1
Original line number Diff line number Diff line
@@ -384,7 +384,7 @@ static int raid0_set_limits(struct mddev *mddev)
	lim.max_write_zeroes_sectors = mddev->chunk_sectors;
	lim.io_min = mddev->chunk_sectors << 9;
	lim.io_opt = lim.io_min * mddev->raid_disks;
	lim.features |= BLK_FEAT_ATOMIC_WRITES_STACKED;
	lim.features |= BLK_FEAT_ATOMIC_WRITES;
	err = mddev_stack_rdev_limits(mddev, &lim, MDDEV_STACK_INTEGRITY);
	if (err) {
		queue_limits_cancel_update(mddev->gendisk->queue);
+1 −1
Original line number Diff line number Diff line
@@ -3217,7 +3217,7 @@ static int raid1_set_limits(struct mddev *mddev)

	md_init_stacking_limits(&lim);
	lim.max_write_zeroes_sectors = 0;
	lim.features |= BLK_FEAT_ATOMIC_WRITES_STACKED;
	lim.features |= BLK_FEAT_ATOMIC_WRITES;
	err = mddev_stack_rdev_limits(mddev, &lim, MDDEV_STACK_INTEGRITY);
	if (err) {
		queue_limits_cancel_update(mddev->gendisk->queue);
+1 −1
Original line number Diff line number Diff line
@@ -4018,7 +4018,7 @@ static int raid10_set_queue_limits(struct mddev *mddev)
	lim.max_write_zeroes_sectors = 0;
	lim.io_min = mddev->chunk_sectors << 9;
	lim.io_opt = lim.io_min * raid10_nr_stripes(conf);
	lim.features |= BLK_FEAT_ATOMIC_WRITES_STACKED;
	lim.features |= BLK_FEAT_ATOMIC_WRITES;
	err = mddev_stack_rdev_limits(mddev, &lim, MDDEV_STACK_INTEGRITY);
	if (err) {
		queue_limits_cancel_update(mddev->gendisk->queue);
+1 −0
Original line number Diff line number Diff line
@@ -2002,6 +2002,7 @@ static void nvme_update_atomic_write_disk_info(struct nvme_ns *ns,
	lim->atomic_write_hw_boundary = boundary;
	lim->atomic_write_hw_unit_min = bs;
	lim->atomic_write_hw_unit_max = rounddown_pow_of_two(atomic_bs);
	lim->features |= BLK_FEAT_ATOMIC_WRITES;
}

static u32 nvme_max_drv_segments(struct nvme_ctrl *ctrl)
Loading