diff mbox

[v3] scsi: sd: add new match array for cache_type

Message ID 20180123144439.GA15247@localhost.didichuxing.com (mailing list archive)
State Changes Requested
Headers show

Commit Message

weiping zhang Jan. 23, 2018, 2:44 p.m. UTC
add user friendly command strings sd_wr_cache to enable/disable
write&read cache. user can enable both write and read cache by one of
the following commands:

echo w1r1 > cache_type
echo "write back" > cache_type

sd_wr_cache[] = {"w0r1", "w0r0", "w1r1", "w1r0"};
for sd_wr_cache 0 means disable, 1 means enable.

Encoding                          | WCE RCD | Write_cache Read_cache
--------------------------------------------------------------------
write through              / w0r1 | 0   0   | off         on
none                       / w0r0 | 0   1   | off         off
write back                 / w1r1 | 1   0   | on          on
write back, no read (daft) / w1r0 | 1   1   | on          off

Signed-off-by: weiping zhang <zhangweiping@didichuxing.com>
---
 drivers/scsi/sd.c | 21 +++++++++++++++++++--
 1 file changed, 19 insertions(+), 2 deletions(-)

Comments

Martin K. Petersen Jan. 31, 2018, 3:22 a.m. UTC | #1
Weiping,

> add user friendly command strings sd_wr_cache to enable/disable
> write&read cache. user can enable both write and read cache by one of
> the following commands:

I remain unconvinced that introducing redundant option strings is a
benefit.

These shorthand forms may seem obvious to you, but not to everyone
else. Adding to the murkiness is that fact that write cache must be
*enabled* and read cache *disabled* in the protocol. The fact that the
??rN and RCD columns below contain inverse values just emphasizes that
point that "0" and "1" are not a particularly good interface either.

It is also confusing that the existing longhand forms will be printed
when the user subsequently queries the state instead of what they used
to toggle it.


This, however, is pretty much what I was looking for:

> Encoding                          | WCE RCD | Write_cache Read_cache
> --------------------------------------------------------------------
> write through              / w0r1 | 0   0   | off         on
> none                       / w0r0 | 0   1   | off         off
> write back                 / w1r1 | 1   0   | on          on
> write back, no read (daft) / w1r0 | 1   1   | on          off

Please drop the w?r? options and submit a patch with this table and a
note about the "temporary" prefix. Put it in
Documentation/scsi/sd-parameters.txt or something to that effect.

Bonus points for also documenting the remaining sd sysfs attributes and
their options.

Thanks!
Weiping Zhang Feb. 1, 2018, 2:15 p.m. UTC | #2
2018-01-31 11:22 GMT+08:00 Martin K. Petersen <martin.petersen@oracle.com>:
>
> Weiping,
>
>> add user friendly command strings sd_wr_cache to enable/disable
>> write&read cache. user can enable both write and read cache by one of
>> the following commands:
>
> I remain unconvinced that introducing redundant option strings is a
> benefit.
>
> These shorthand forms may seem obvious to you, but not to everyone
> else. Adding to the murkiness is that fact that write cache must be
> *enabled* and read cache *disabled* in the protocol. The fact that the
> ??rN and RCD columns below contain inverse values just emphasizes that
> point that "0" and "1" are not a particularly good interface either.
>
> It is also confusing that the existing longhand forms will be printed
> when the user subsequently queries the state instead of what they used
> to toggle it.
>
Yes, indeed.
>
> This, however, is pretty much what I was looking for:
>
>> Encoding                          | WCE RCD | Write_cache Read_cache
>> --------------------------------------------------------------------
>> write through              / w0r1 | 0   0   | off         on
>> none                       / w0r0 | 0   1   | off         off
>> write back                 / w1r1 | 1   0   | on          on
>> write back, no read (daft) / w1r0 | 1   1   | on          off
>
> Please drop the w?r? options and submit a patch with this table and a
> note about the "temporary" prefix. Put it in
> Documentation/scsi/sd-parameters.txt or something to that effect.
>
It's ok for me.
> Bonus points for also documenting the remaining sd sysfs attributes and
> their options.
I'll try.

Thanks
>
> Thanks!
>
> --
> Martin K. Petersen      Oracle Linux Engineering
diff mbox

Patch

diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c
index a028ab3..ce2fda5 100644
--- a/drivers/scsi/sd.c
+++ b/drivers/scsi/sd.c
@@ -134,10 +134,20 @@  static DEFINE_MUTEX(sd_ref_mutex);
 static struct kmem_cache *sd_cdb_cache;
 static mempool_t *sd_cdb_pool;
 
+/*
+ * Encoding                          | WCE RCD | Write_cache Read_cache
+ * --------------------------------------------------------------------
+ * write through              / w0r1 | 0   0   | off         on
+ * none                       / w0r0 | 0   1   | off         off
+ * write back                 / w1r1 | 1   0   | on          on
+ * write back, no read (daft) / w1r0 | 1   1   | on          off
+ */
 static const char *sd_cache_types[] = {
 	"write through", "none", "write back",
 	"write back, no read (daft)"
 };
+/* 0:disable, 1:enable */
+static const char * const sd_wr_cache[] = {"w0r1", "w0r0", "w1r1", "w1r0"};
 
 static void sd_set_flush_flag(struct scsi_disk *sdkp)
 {
@@ -172,6 +182,10 @@  cache_type_store(struct device *dev, struct device_attribute *attr,
 		 * it's not worth the risk */
 		return -EINVAL;
 
+	/*
+	 * for "temporary", we only change request_queue's flag, not send
+	 * any command to disk, so actually disk'cache dosen't changed yet.
+	 */
 	if (strncmp(buf, temp, sizeof(temp) - 1) == 0) {
 		buf += sizeof(temp) - 1;
 		sdkp->cache_override = 1;
@@ -180,8 +194,11 @@  cache_type_store(struct device *dev, struct device_attribute *attr,
 	}
 
 	ct = sysfs_match_string(sd_cache_types, buf);
-	if (ct < 0)
-		return -EINVAL;
+	if (ct < 0) {
+		ct = sysfs_match_string(sd_wr_cache, buf);
+		if (ct < 0)
+			return -EINVAL;
+	}
 
 	rcd = ct & 0x01 ? 1 : 0;
 	wce = (ct & 0x02) && !sdkp->write_prot ? 1 : 0;