From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752485Ab0H0EdX (ORCPT ); Fri, 27 Aug 2010 00:33:23 -0400 Received: from smtp110.sbc.mail.gq1.yahoo.com ([67.195.14.95]:30346 "HELO smtp110.sbc.mail.gq1.yahoo.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with SMTP id S1753094Ab0H0EdO (ORCPT ); Fri, 27 Aug 2010 00:33:14 -0400 X-Yahoo-SMTP: fzDSGlOswBCWnIOrNw7KwwK1j9PqyNbe5PtLKiS4dDU.UNl_t6bdEZu9tTLW X-YMail-OSG: g0OKWOsVM1nrxmeYAB5eQHyGAgALI4ns4BJjsHlYXnLgEhP nmvWrC4G31ql77DfNg1OJn1INaL9ywE425DELTJQsQ71GE5JnoS6uc9bnSbL JjxRFWmPQWXHo6dbf2leLc0n4KDUdLEdDvxaNFO6peUDpk4VvxRsDeRlleyu l7HhmyZ5KeNCRkNypn8Wm5zJdaV3XZwwtxoxziXC1raJ52eBGzbVefZDlUID 3ugOrYHHxmswOwu5uZ1dFE5orUf.rlbhfTTSeNOzszZcQFMwuKixKdQyAUPD x6dM7KTc0YxYGTYztM8GJk8QB8QOxCdpeEACMLUVgVaton_n4AbTJTJZw.4_ Xkh5kpjyk6ReS1CATag-- X-Yahoo-Newman-Property: ymail-3 From: "Nicholas A. Bellinger" To: linux-scsi , linux-kernel Cc: Christoph Hellwig , Tejun Heo , FUJITA Tomonori , Mike Christie , Hannes Reinecke , James Bottomley , Nicholas Bellinger Subject: [PATCH 3/4] tcm: Add WriteCache and DPOFUA emulation bits to MODE_SENSE Date: Thu, 26 Aug 2010 21:33:11 -0700 Message-Id: <1282883591-10872-1-git-send-email-nab@linux-iscsi.org> X-Mailer: git-send-email 1.5.6.5 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Nicholas Bellinger This patch updates transport_generic_emulate_modesense() and it's local mode page callers to report WriteCacheEnabled=1 and DPOFUA=1 for TYPE_DISK with a supporting capable struct se_device and TCM struct se_subsystem_api structure. Note that this patch will return DPOFUA=1 bit capable in the TYPE_DISK specific area when emulate_write_cache=1 and emulate_fua_write=1 device configfs attributes have been set. Signed-off-by: Nicholas A. Bellinger --- drivers/target/target_core_transport.c | 32 ++++++++++++++++++++++++++------ 1 files changed, 26 insertions(+), 6 deletions(-) diff --git a/drivers/target/target_core_transport.c b/drivers/target/target_core_transport.c index 076faa5..a81b402 100644 --- a/drivers/target/target_core_transport.c +++ b/drivers/target/target_core_transport.c @@ -4933,13 +4933,12 @@ static int transport_modesense_control(struct se_device *dev, unsigned char *p) return 12; } -static int transport_modesense_caching(unsigned char *p) +static int transport_modesense_caching(struct se_device *dev, unsigned char *p) { p[0] = 0x08; p[1] = 0x12; -#if 0 - p[2] = 0x04; /* Write Cache Enable */ -#endif + if (DEV_ATTRIB(dev)->emulate_write_cache > 0) + p[2] = 0x04; /* Write Cache Enable */ p[12] = 0x20; /* Disabled Read Ahead */ return 20; @@ -4972,6 +4971,19 @@ static void transport_modesense_write_protect( } } +static void transport_modesense_dpofua( + unsigned char *buf, + int type) +{ + switch (type) { + case TYPE_DISK: + buf[0] |= 0x10; /* DPOFUA bit */ + break; + default: + break; + } +} + int transport_generic_emulate_modesense( struct se_cmd *cmd, unsigned char *cdb, @@ -4991,7 +5003,7 @@ int transport_generic_emulate_modesense( length = transport_modesense_rwrecovery(&buf[offset]); break; case 0x08: - length = transport_modesense_caching(&buf[offset]); + length = transport_modesense_caching(dev, &buf[offset]); break; case 0x0a: length = transport_modesense_control(dev, &buf[offset]); @@ -5003,7 +5015,7 @@ int transport_generic_emulate_modesense( #endif case 0x3f: length = transport_modesense_rwrecovery(&buf[offset]); - length += transport_modesense_caching(&buf[offset+length]); + length += transport_modesense_caching(dev, &buf[offset+length]); length += transport_modesense_control(dev, &buf[offset+length]); #if 0 length += transport_modesense_devicecaps(&buf[offset+length]); @@ -5026,6 +5038,10 @@ int transport_generic_emulate_modesense( (cmd->se_deve->lun_flags & TRANSPORT_LUNFLAGS_READ_ONLY))) transport_modesense_write_protect(&buf[3], type); + if ((DEV_ATTRIB(dev)->emulate_write_cache > 0) && + (DEV_ATTRIB(dev)->emulate_fua_write > 0)) + transport_modesense_dpofua(&buf[3], type); + if ((offset + 2) > cmd->data_length) offset = cmd->data_length; @@ -5038,6 +5054,10 @@ int transport_generic_emulate_modesense( (cmd->se_deve->lun_flags & TRANSPORT_LUNFLAGS_READ_ONLY))) transport_modesense_write_protect(&buf[2], type); + if ((DEV_ATTRIB(dev)->emulate_write_cache > 0) && + (DEV_ATTRIB(dev)->emulate_fua_write > 0)) + transport_modesense_dpofua(&buf[2], type); + if ((offset + 1) > cmd->data_length) offset = cmd->data_length; } -- 1.5.6.5