Skip to content

Commit 2ebc8d6

Browse files
chrboeaxboe
authored andcommitted
drbd: always set BLK_FEAT_STABLE_WRITES
DRBD requires stable pages because it may read the same bio data multiple times for local disk I/O and network transmission, and in some cases for calculating checksums. The BLK_FEAT_STABLE_WRITES flag is set when the device is first created, but blk_set_stacking_limits() clears it whenever a backing device is attached. In some cases the flag may be inherited from the backing device, but we want it to be enabled at all times. Unconditionally re-enable BLK_FEAT_STABLE_WRITES in drbd_reconsider_queue_parameters() after the queue parameter negotiations. Also, document why we want this flag enabled in the first place. Fixes: 1a02f3a ("block: move the stable_writes flag to queue_limits") Signed-off-by: Christoph Böhmwalder <christoph.boehmwalder@linbit.com> Reviewed-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Jens Axboe <axboe@kernel.dk>
1 parent 192c015 commit 2ebc8d6

2 files changed

Lines changed: 19 additions & 4 deletions

File tree

drivers/block/drbd/drbd_main.c

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2659,9 +2659,6 @@ enum drbd_ret_code drbd_create_device(struct drbd_config_context *adm_ctx, unsig
26592659
* connect.
26602660
*/
26612661
.max_hw_sectors = DRBD_MAX_BIO_SIZE_SAFE >> 8,
2662-
.features = BLK_FEAT_WRITE_CACHE | BLK_FEAT_FUA |
2663-
BLK_FEAT_ROTATIONAL |
2664-
BLK_FEAT_STABLE_WRITES,
26652662
};
26662663

26672664
device = minor_to_device(minor);

drivers/block/drbd/drbd_nl.c

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1296,6 +1296,8 @@ void drbd_reconsider_queue_parameters(struct drbd_device *device,
12961296
lim.max_segments = drbd_backing_dev_max_segments(device);
12971297
} else {
12981298
lim.max_segments = BLK_MAX_SEGMENTS;
1299+
lim.features = BLK_FEAT_WRITE_CACHE | BLK_FEAT_FUA |
1300+
BLK_FEAT_ROTATIONAL | BLK_FEAT_STABLE_WRITES;
12991301
}
13001302

13011303
lim.max_hw_sectors = new >> SECTOR_SHIFT;
@@ -1318,8 +1320,24 @@ void drbd_reconsider_queue_parameters(struct drbd_device *device,
13181320
lim.max_hw_discard_sectors = 0;
13191321
}
13201322

1321-
if (bdev)
1323+
if (bdev) {
13221324
blk_stack_limits(&lim, &b->limits, 0);
1325+
/*
1326+
* blk_set_stacking_limits() cleared the features, and
1327+
* blk_stack_limits() may or may not have inherited
1328+
* BLK_FEAT_STABLE_WRITES from the backing device.
1329+
*
1330+
* DRBD always requires stable writes because:
1331+
* 1. The same bio data is read for both local disk I/O and
1332+
* network transmission. If the page changes mid-flight,
1333+
* the local and remote copies could diverge.
1334+
* 2. When data integrity is enabled, DRBD calculates a
1335+
* checksum before sending the data. If the page changes
1336+
* between checksum calculation and transmission, the
1337+
* receiver will detect a checksum mismatch.
1338+
*/
1339+
lim.features |= BLK_FEAT_STABLE_WRITES;
1340+
}
13231341

13241342
/*
13251343
* If we can handle "zeroes" efficiently on the protocol, we want to do

0 commit comments

Comments
 (0)