Message ID | 20210525022539.119661-12-damien.lemoal@wdc.com (mailing list archive) |
---|---|
State | Superseded, archived |
Delegated to: | Mike Snitzer |
Headers | show |
Series | dm: Improve zoned block device support | expand |
On 5/24/21 9:25 PM, Damien Le Moal wrote: > Zone append BIOs (REQ_OP_ZONE_APPEND) always specify the start sector > of the zone to be written instead of the actual sector location to > write. The write location is determined by the device and returned to > the host upon completion of the operation. This interface, while simple > and efficient for writing into sequential zones of a zoned block > device, is incompatible with the use of sector values to calculate a > cypher block IV. All data written in a zone end up using the same IV > values corresponding to the first sectors of the zone, but read > operation will specify any sector within the zone resulting in an IV > mismatch between encryption and decryption. > > To solve this problem, report to DM core that zone append operations are > not supported. This result in the zone append operations being emulated > using regular write operations. > > Reported-by: Shin'ichiro Kawasaki <shinichiro.kawasaki@wdc.com> > Signed-off-by: Damien Le Moal <damien.lemoal@wdc.com> > Reviewed-by: Hannes Reinecke <hare@suse.de> > --- > drivers/md/dm-crypt.c | 24 +++++++++++++++++++----- > 1 file changed, 19 insertions(+), 5 deletions(-) > > diff --git a/drivers/md/dm-crypt.c b/drivers/md/dm-crypt.c > index f410ceee51d7..50f4cbd600d5 100644 > --- a/drivers/md/dm-crypt.c > +++ b/drivers/md/dm-crypt.c > @@ -3280,14 +3280,28 @@ static int crypt_ctr(struct dm_target *ti, unsigned int argc, char **argv) > } > cc->start = tmpll; > > - /* > - * For zoned block devices, we need to preserve the issuer write > - * ordering. To do so, disable write workqueues and force inline > - * encryption completion. > - */ > if (bdev_is_zoned(cc->dev->bdev)) { > + /* > + * For zoned block devices, we need to preserve the issuer write > + * ordering. To do so, disable write workqueues and force inline > + * encryption completion. > + */ > set_bit(DM_CRYPT_NO_WRITE_WORKQUEUE, &cc->flags); > set_bit(DM_CRYPT_WRITE_INLINE, &cc->flags); > + > + /* > + * All zone append writes to a zone of a zoned block device will > + * have the same BIO sector, the start of the zone. When the > + * cypher IV mode uses sector values, all data targeting a > + * zone will be encrypted using the first sector numbers of the > + * zone. This will not result in write errors but will > + * cause most reads to fail as reads will use the sector values > + * for the actual data locations, resulting in IV mismatch. > + * To avoid this problem, ask DM core to emulate zone append > + * operations with regular writes. > + */ > + DMDEBUG("Zone append operations will be emulated"); > + ti->emulate_zone_append = true; > } > > if (crypt_integrity_aead(cc) || cc->integrity_iv_size) { > Reviewed-by: Himanshu Madhani <himanshu.madhani@oracle.com>
diff --git a/drivers/md/dm-crypt.c b/drivers/md/dm-crypt.c index f410ceee51d7..50f4cbd600d5 100644 --- a/drivers/md/dm-crypt.c +++ b/drivers/md/dm-crypt.c @@ -3280,14 +3280,28 @@ static int crypt_ctr(struct dm_target *ti, unsigned int argc, char **argv) } cc->start = tmpll; - /* - * For zoned block devices, we need to preserve the issuer write - * ordering. To do so, disable write workqueues and force inline - * encryption completion. - */ if (bdev_is_zoned(cc->dev->bdev)) { + /* + * For zoned block devices, we need to preserve the issuer write + * ordering. To do so, disable write workqueues and force inline + * encryption completion. + */ set_bit(DM_CRYPT_NO_WRITE_WORKQUEUE, &cc->flags); set_bit(DM_CRYPT_WRITE_INLINE, &cc->flags); + + /* + * All zone append writes to a zone of a zoned block device will + * have the same BIO sector, the start of the zone. When the + * cypher IV mode uses sector values, all data targeting a + * zone will be encrypted using the first sector numbers of the + * zone. This will not result in write errors but will + * cause most reads to fail as reads will use the sector values + * for the actual data locations, resulting in IV mismatch. + * To avoid this problem, ask DM core to emulate zone append + * operations with regular writes. + */ + DMDEBUG("Zone append operations will be emulated"); + ti->emulate_zone_append = true; } if (crypt_integrity_aead(cc) || cc->integrity_iv_size) {