Message ID | 20250318073545.3518707-5-yi.zhang@huaweicloud.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | fallocate: introduce FALLOC_FL_WRITE_ZEROES flag | expand |
On Tue, Mar 18, 2025 at 03:35:39PM +0800, Zhang Yi wrote: > diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h > index 5d280c7fba65..836738ab1fa6 100644 > --- a/include/linux/blkdev.h > +++ b/include/linux/blkdev.h > @@ -1344,6 +1344,11 @@ static inline unsigned int bdev_write_zeroes_sectors(struct block_device *bdev) > return bdev_limits(bdev)->max_write_zeroes_sectors; > } > > +static inline bool bdev_unmap_write_zeroes(struct block_device *bdev) > +{ > + return bdev_limits(bdev)->features & BLK_FEAT_WRITE_ZEROES_UNMAP; This helper has an odd name. In doubt stick to the name of the flag instead of reordering the words. Also no core block code should be added in an nvmet patch, this needs to go into the first patch.
diff --git a/drivers/nvme/target/io-cmd-bdev.c b/drivers/nvme/target/io-cmd-bdev.c index 83be0657e6df..0e8b35732492 100644 --- a/drivers/nvme/target/io-cmd-bdev.c +++ b/drivers/nvme/target/io-cmd-bdev.c @@ -46,6 +46,10 @@ void nvmet_bdev_set_limits(struct block_device *bdev, struct nvme_id_ns *id) id->npda = id->npdg; /* NOWS = Namespace Optimal Write Size */ id->nows = to0based(bdev_io_opt(bdev) / bdev_logical_block_size(bdev)); + + /* Set WZDS and DRB if device supports unmapped write zeroes */ + if (bdev_unmap_write_zeroes(bdev)) + id->dlfeat = (1 << 3) | 0x1; } void nvmet_bdev_ns_disable(struct nvmet_ns *ns) diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h index 5d280c7fba65..836738ab1fa6 100644 --- a/include/linux/blkdev.h +++ b/include/linux/blkdev.h @@ -1344,6 +1344,11 @@ static inline unsigned int bdev_write_zeroes_sectors(struct block_device *bdev) return bdev_limits(bdev)->max_write_zeroes_sectors; } +static inline bool bdev_unmap_write_zeroes(struct block_device *bdev) +{ + return bdev_limits(bdev)->features & BLK_FEAT_WRITE_ZEROES_UNMAP; +} + static inline bool bdev_nonrot(struct block_device *bdev) { return blk_queue_nonrot(bdev_get_queue(bdev));