mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2026-05-22 02:27:36 +03:00
vdev_disk: disable flushes if device does not support it
If the underlying device doesn't have a write-back cache, the kernel will just return a successful response. This doesn't hurt anything, but it's extra work on the IO taskqs that are unnecessary. So, detect this when we open the device for the first time. Sponsored-by: Klara, Inc. Sponsored-by: Wasabi Technology, Inc. Reviewed-by: Alexander Motin <mav@FreeBSD.org> Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Rob Norris <rob.norris@klarasystems.com> Closes #16148
This commit is contained in:
@@ -94,6 +94,33 @@ blk_queue_set_write_cache(struct request_queue *q, bool wc, bool fua)
|
||||
#endif
|
||||
}
|
||||
|
||||
/*
|
||||
* Detect if a device has a write cache. Used to set the intial value for the
|
||||
* vdev nowritecache flag.
|
||||
*
|
||||
* 4.10: QUEUE_FLAG_WC added. Initialised by the driver, but can be changed
|
||||
* later by the operator. If not set, kernel will return flush requests
|
||||
* immediately without doing anything.
|
||||
* 6.6: QUEUE_FLAG_HW_WC added. Initialised by the driver, can't be changed.
|
||||
* Only controls if the operator is allowed to change _WC. Initial version
|
||||
* buggy; aliased to QUEUE_FLAG_FUA, so unuseable.
|
||||
* 6.6.10, 6.7: QUEUE_FLAG_HW_WC fixed.
|
||||
*
|
||||
* Older than 4.10 we just assume write cache, and let the normal flush fail
|
||||
* detection apply.
|
||||
*/
|
||||
static inline boolean_t
|
||||
zfs_bdev_has_write_cache(struct block_device *bdev)
|
||||
{
|
||||
#if defined(QUEUE_FLAG_HW_WC) && QUEUE_FLAG_HW_WC != QUEUE_FLAG_FUA
|
||||
return (test_bit(QUEUE_FLAG_HW_WC, &bdev_get_queue(bdev)->queue_flags));
|
||||
#elif defined(QUEUE_FLAG_WC)
|
||||
return (test_bit(QUEUE_FLAG_WC, &bdev_get_queue(bdev)->queue_flags));
|
||||
#else
|
||||
return (B_TRUE);
|
||||
#endif
|
||||
}
|
||||
|
||||
static inline void
|
||||
blk_queue_set_read_ahead(struct request_queue *q, unsigned long ra_pages)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user