From: "Martin K. Petersen" <martin.petersen@oracle.com>
To: linux-scsi@vger.kernel.org
Cc: "Martin K. Petersen" <martin.petersen@oracle.com>
Subject: [PATCH 10/14] scsi: sd: Move WRITE_ZEROES configuration to a separate function
Date: Wed, 2 Mar 2022 00:35:55 -0500 [thread overview]
Message-ID: <20220302053559.32147-11-martin.petersen@oracle.com> (raw)
In-Reply-To: <20220302053559.32147-1-martin.petersen@oracle.com>
In preparation for adding support for the WRITE SAME(16) NDOB flag,
move configuration of the WRITE_ZEROES operation to a separate
function. This is done to facilitate fetching all VPD pages before
choosing the appropriate zeroing method for a given device.
The deferred configuration also allows us to mirror the discard
behavior and permit the user to revert a device to the kernel default
configuration by echoing "default" to the sysfs file.
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
---
drivers/scsi/sd.c | 56 +++++++++++++++++++++++++++++++++--------------
drivers/scsi/sd.h | 7 ++++--
2 files changed, 44 insertions(+), 19 deletions(-)
diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c
index eae5c81ae515..ee4f4aea5f0f 100644
--- a/drivers/scsi/sd.c
+++ b/drivers/scsi/sd.c
@@ -101,6 +101,7 @@ MODULE_ALIAS_SCSI_DEVICE(TYPE_ZBC);
#define SD_MINORS 16
static void sd_config_discard(struct scsi_disk *, enum sd_lbp_mode);
+static void sd_config_write_zeroes(struct scsi_disk *, enum sd_zeroing_mode);
static void sd_config_write_same(struct scsi_disk *);
static int sd_revalidate_disk(struct gendisk *);
static void sd_unlock_native_capacity(struct gendisk *disk);
@@ -428,10 +429,12 @@ static DEVICE_ATTR_RW(provisioning_mode);
/* sysfs_match_string() requires dense arrays */
static const char *zeroing_mode[] = {
+ [SD_ZERO_DEFAULT] = "default",
[SD_ZERO_WRITE] = "write",
[SD_ZERO_WS] = "writesame",
[SD_ZERO_WS16_UNMAP] = "writesame_16_unmap",
[SD_ZERO_WS10_UNMAP] = "writesame_10_unmap",
+ [SD_ZERO_DISABLE] = "disabled",
};
static ssize_t
@@ -457,7 +460,12 @@ zeroing_mode_store(struct device *dev, struct device_attribute *attr,
if (mode < 0)
return -EINVAL;
- sdkp->zeroing_mode = mode;
+ if (mode == SD_ZERO_DEFAULT)
+ sdkp->zeroing_override = false;
+ else
+ sdkp->zeroing_override = true;
+
+ sd_config_write_zeroes(sdkp, mode);
return count;
}
@@ -1049,6 +1057,31 @@ static blk_status_t sd_setup_write_same10_cmnd(struct scsi_cmnd *cmd,
return scsi_alloc_sgtables(cmd);
}
+static void sd_config_write_zeroes(struct scsi_disk *sdkp,
+ enum sd_zeroing_mode mode)
+{
+ struct request_queue *q = sdkp->disk->queue;
+ unsigned int logical_block_size = sdkp->device->sector_size;
+
+ if (mode == SD_ZERO_DEFAULT && !sdkp->zeroing_override) {
+ if (sdkp->lbprz && sdkp->lbpws)
+ mode = SD_ZERO_WS16_UNMAP;
+ else if (sdkp->lbprz && sdkp->lbpws10)
+ mode = SD_ZERO_WS10_UNMAP;
+ else if (sdkp->max_ws_blocks)
+ mode = SD_ZERO_WS;
+ else
+ mode = SD_ZERO_WRITE;
+ }
+
+ if (mode == SD_ZERO_DISABLE)
+ sdkp->zeroing_override = true;
+
+ sdkp->zeroing_mode = mode;
+ blk_queue_max_write_zeroes_sectors(q, sdkp->max_ws_blocks *
+ (logical_block_size >> 9));
+}
+
static blk_status_t sd_setup_write_zeroes_cmnd(struct scsi_cmnd *cmd)
{
struct request *rq = scsi_cmd_to_rq(cmd);
@@ -1079,12 +1112,11 @@ static blk_status_t sd_setup_write_zeroes_cmnd(struct scsi_cmnd *cmd)
static void sd_config_write_same(struct scsi_disk *sdkp)
{
- struct request_queue *q = sdkp->disk->queue;
unsigned int logical_block_size = sdkp->device->sector_size;
if (sdkp->device->no_write_same) {
sdkp->max_ws_blocks = 0;
- goto out;
+ return;
}
/* Some devices can not handle block counts above 0xffff despite
@@ -1103,15 +1135,6 @@ static void sd_config_write_same(struct scsi_disk *sdkp)
sdkp->max_ws_blocks = 0;
}
- if (sdkp->lbprz && sdkp->lbpws)
- sdkp->zeroing_mode = SD_ZERO_WS16_UNMAP;
- else if (sdkp->lbprz && sdkp->lbpws10)
- sdkp->zeroing_mode = SD_ZERO_WS10_UNMAP;
- else if (sdkp->max_ws_blocks)
- sdkp->zeroing_mode = SD_ZERO_WS;
- else
- sdkp->zeroing_mode = SD_ZERO_WRITE;
-
if (sdkp->max_ws_blocks &&
sdkp->physical_block_size > logical_block_size) {
/*
@@ -1131,10 +1154,6 @@ static void sd_config_write_same(struct scsi_disk *sdkp)
bytes_to_logical(sdkp->device,
sdkp->physical_block_size));
}
-
-out:
- blk_queue_max_write_zeroes_sectors(q, sdkp->max_ws_blocks *
- (logical_block_size >> 9));
}
static blk_status_t sd_setup_flush_cmnd(struct scsi_cmnd *cmd)
@@ -2126,6 +2145,8 @@ static int sd_done(struct scsi_cmnd *SCpnt)
case WRITE_SAME:
if (SCpnt->cmnd[1] & 8) { /* UNMAP */
sd_config_discard(sdkp, SD_LBP_DISABLE);
+ sd_config_write_zeroes(sdkp,
+ SD_ZERO_DISABLE);
} else {
sdkp->device->no_write_same = 1;
sd_config_write_same(sdkp);
@@ -3352,7 +3373,9 @@ static int sd_revalidate_disk(struct gendisk *disk)
sd_read_write_same(sdkp, buffer);
sd_read_security(sdkp, buffer);
sd_read_cpr(sdkp);
+ sd_config_write_same(sdkp);
sd_config_discard(sdkp, SD_LBP_DEFAULT);
+ sd_config_write_zeroes(sdkp, SD_ZERO_DEFAULT);
}
/*
@@ -3398,7 +3421,6 @@ static int sd_revalidate_disk(struct gendisk *disk)
sdkp->first_scan = 0;
set_capacity_and_notify(disk, logical_to_sectors(sdp, sdkp->capacity));
- sd_config_write_same(sdkp);
kfree(buffer);
/*
diff --git a/drivers/scsi/sd.h b/drivers/scsi/sd.h
index 57a8241163c5..e0ee4215a3b4 100644
--- a/drivers/scsi/sd.h
+++ b/drivers/scsi/sd.h
@@ -61,11 +61,13 @@ enum sd_lbp_mode {
SD_LBP_DISABLE, /* Discard disabled due to failed cmd */
};
-enum {
- SD_ZERO_WRITE = 0, /* Use WRITE(10/16) command */
+enum sd_zeroing_mode {
+ SD_ZERO_DEFAULT = 0, /* Default mode based on what device reports */
+ SD_ZERO_WRITE, /* Use WRITE(10/16) command */
SD_ZERO_WS, /* Use WRITE SAME(10/16) command */
SD_ZERO_WS16_UNMAP, /* Use WRITE SAME(16) with UNMAP */
SD_ZERO_WS10_UNMAP, /* Use WRITE SAME(10) with UNMAP */
+ SD_ZERO_DISABLE, /* Write Zeroes disabled due to failed cmd */
};
struct scsi_disk {
@@ -111,6 +113,7 @@ struct scsi_disk {
u8 nr_actuators; /* Number of actuators */
bool lblvpd;
bool provisioning_override;
+ bool zeroing_override;
unsigned ATO : 1; /* state of disk ATO bit */
unsigned cache_override : 1; /* temp override of WCE,RCD */
unsigned WCE : 1; /* state of disk WCE bit */
--
2.32.0
next prev parent reply other threads:[~2022-03-02 5:36 UTC|newest]
Thread overview: 75+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-03-02 5:35 SCSI discovery update Martin K. Petersen
2022-03-02 5:35 ` [PATCH 01/14] scsi: mpt3sas: Use cached ATA Information VPD page Martin K. Petersen
2022-03-02 9:47 ` Christoph Hellwig
2022-03-02 14:18 ` Johannes Thumshirn
2022-04-20 12:06 ` Hannes Reinecke
2022-05-03 0:51 ` Martin K. Petersen
2022-03-02 5:35 ` [PATCH 02/14] scsi: core: Query VPD size before getting full page Martin K. Petersen
2022-03-02 9:48 ` Christoph Hellwig
2022-03-02 14:25 ` Johannes Thumshirn
2022-03-04 3:42 ` Martin K. Petersen
2022-03-03 0:30 ` Bart Van Assche
2022-03-04 3:28 ` Martin K. Petersen
2022-03-02 5:35 ` [PATCH 03/14] scsi: core: Do not truncate INQUIRY data on modern devices Martin K. Petersen
2022-03-02 9:49 ` Christoph Hellwig
2022-03-02 14:27 ` Johannes Thumshirn
2022-03-03 0:14 ` Bart Van Assche
2022-03-04 3:40 ` Martin K. Petersen
2022-03-02 5:35 ` [PATCH 04/14] scsi: core: Pick suitable allocation length in scsi_report_opcode() Martin K. Petersen
2022-03-02 9:49 ` Christoph Hellwig
2022-03-02 14:29 ` Johannes Thumshirn
2022-03-03 0:39 ` Bart Van Assche
2022-04-20 12:06 ` Hannes Reinecke
2022-03-02 5:35 ` [PATCH 05/14] scsi: core: Cache VPD pages b0, b1, b2 Martin K. Petersen
2022-03-02 9:50 ` Christoph Hellwig
2022-03-02 14:30 ` Johannes Thumshirn
2022-03-03 1:30 ` Bart Van Assche
2022-04-20 12:07 ` Hannes Reinecke
2022-03-02 5:35 ` [PATCH 06/14] scsi: sd: Use cached ATA Information VPD page Martin K. Petersen
2022-03-02 9:50 ` Christoph Hellwig
2022-03-03 0:40 ` Bart Van Assche
2022-03-04 9:29 ` Johannes Thumshirn
2022-03-02 5:35 ` [PATCH 07/14] scsi: sd: Switch to using scsi_device VPD pages Martin K. Petersen
2022-03-02 9:51 ` Christoph Hellwig
2022-03-03 0:42 ` Bart Van Assche
2022-03-04 9:29 ` Johannes Thumshirn
2022-03-02 5:35 ` [PATCH 08/14] scsi: sd: Optimal I/O size should be a multiple of reported granularity Martin K. Petersen
2022-03-02 9:51 ` Christoph Hellwig
2022-03-03 20:17 ` Bart Van Assche
2022-03-04 3:45 ` Martin K. Petersen
2022-03-04 5:06 ` Bart Van Assche
2022-03-02 5:35 ` [PATCH 09/14] scsi: sd: Fix discard errors during revalidate Martin K. Petersen
2022-03-02 9:52 ` Christoph Hellwig
2022-03-03 21:06 ` Bart Van Assche
2022-03-04 3:55 ` Martin K. Petersen
2022-03-06 0:35 ` Bart Van Assche
2022-03-02 5:35 ` Martin K. Petersen [this message]
2022-03-02 9:53 ` [PATCH 10/14] scsi: sd: Move WRITE_ZEROES configuration to a separate function Christoph Hellwig
2022-03-03 0:52 ` Bart Van Assche
2022-07-18 16:51 ` regression next-20220714: mkfs.ext4 on multipath device over scsi disks causes 'lifelock' in block layer Benjamin Block
2022-07-19 2:23 ` Martin K. Petersen
2022-07-19 11:37 ` Benjamin Block
2022-07-21 2:29 ` Martin K. Petersen
2022-07-21 13:25 ` Benjamin Block
2022-03-02 5:35 ` [PATCH 11/14] scsi: sd: Implement support for NDOB flag in WRITE SAME(16) Martin K. Petersen
2022-03-02 9:54 ` Christoph Hellwig
2022-03-03 1:29 ` Bart Van Assche
2022-03-04 9:32 ` Johannes Thumshirn
2022-03-02 5:35 ` [PATCH 12/14] scsi: sd: sd_read_cpr() requires VPD pages Martin K. Petersen
2022-03-02 9:54 ` Christoph Hellwig
2022-03-02 10:45 ` Damien Le Moal
2022-04-06 1:29 ` Damien Le Moal
2022-04-07 2:19 ` Martin K. Petersen
2022-04-07 2:36 ` Damien Le Moal
2022-04-07 2:48 ` Martin K. Petersen
2022-03-03 20:13 ` Bart Van Assche
2022-03-04 9:33 ` Johannes Thumshirn
2022-03-02 5:35 ` [PATCH 13/14] scsi: sd: Reorganize DIF/DIX code to avoid calling revalidate twice Martin K. Petersen
2022-03-02 9:57 ` Christoph Hellwig
2022-03-04 9:36 ` Johannes Thumshirn
2022-03-02 5:35 ` [PATCH 14/14] scsi: sd: Enable modern protocol features on more devices Martin K. Petersen
2022-03-02 9:58 ` Christoph Hellwig
2022-03-03 1:25 ` Bart Van Assche
2022-03-04 9:38 ` Johannes Thumshirn
2022-03-03 6:09 ` SCSI discovery update Douglas Gilbert
2022-03-04 3:26 ` Martin K. Petersen
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20220302053559.32147-11-martin.petersen@oracle.com \
--to=martin.petersen@oracle.com \
--cc=linux-scsi@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.