From patchwork Thu Jun 18 09:43:42 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Hannes Reinecke X-Patchwork-Id: 6634761 Return-Path: X-Original-To: patchwork-linux-scsi@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork1.web.kernel.org (Postfix) with ESMTP id 215049F1C1 for ; Thu, 18 Jun 2015 09:44:05 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 4556820771 for ; Thu, 18 Jun 2015 09:44:04 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 289992075A for ; Thu, 18 Jun 2015 09:44:03 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754509AbbFRJoB (ORCPT ); Thu, 18 Jun 2015 05:44:01 -0400 Received: from cantor2.suse.de ([195.135.220.15]:54796 "EHLO mx2.suse.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754527AbbFRJnv (ORCPT ); Thu, 18 Jun 2015 05:43:51 -0400 X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay1.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 29237ADDF; Thu, 18 Jun 2015 09:43:44 +0000 (UTC) From: Hannes Reinecke To: Nic Bellinger Cc: target-devel@vger.kernel.org, linux-scsi@vger.kernel.org, Christoph Hellwig , Ewan Milne , Hannes Reinecke Subject: [PATCH 8/8] target: display 'write_protect' attribute for demo-mode LUNs Date: Thu, 18 Jun 2015 11:43:42 +0200 Message-Id: <1434620622-65391-9-git-send-email-hare@suse.de> X-Mailer: git-send-email 1.8.5.2 In-Reply-To: <1434620622-65391-1-git-send-email-hare@suse.de> References: <1434620622-65391-1-git-send-email-hare@suse.de> Sender: linux-scsi-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-scsi@vger.kernel.org X-Spam-Status: No, score=-7.2 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_HI, RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP When LUNs are mapped with a demo-mode initiator we're missing the 'write_protect' attribute to set a LUN read-only. Signed-off-by: Hannes Reinecke --- drivers/target/target_core_device.c | 27 ++++++++++++++++++ drivers/target/target_core_fabric_configfs.c | 42 ++++++++++++++++++++++++++++ drivers/target/target_core_internal.h | 1 + 3 files changed, 70 insertions(+) diff --git a/drivers/target/target_core_device.c b/drivers/target/target_core_device.c index 88d6070..3e17070 100644 --- a/drivers/target/target_core_device.c +++ b/drivers/target/target_core_device.c @@ -271,6 +271,33 @@ void core_update_device_list_access( mutex_unlock(&nacl->lun_entry_mutex); } +void core_update_lun_access( + struct se_lun *lun, + u32 lun_access) +{ + struct se_dev_entry *deve; + + if (lun_access == TRANSPORT_LUNFLAGS_READ_ONLY) { + lun->lun_access &= ~TRANSPORT_LUNFLAGS_READ_WRITE; + lun->lun_access |= TRANSPORT_LUNFLAGS_READ_ONLY; + } else { + lun->lun_access &= ~TRANSPORT_LUNFLAGS_READ_ONLY; + lun->lun_access |= TRANSPORT_LUNFLAGS_READ_WRITE; + } + + spin_lock_bh(&lun->lun_deve_lock); + list_for_each_entry(deve, &lun->lun_deve_list, lun_link) { + if (lun_access & TRANSPORT_LUNFLAGS_READ_WRITE) { + deve->lun_flags &= ~TRANSPORT_LUNFLAGS_READ_ONLY; + deve->lun_flags |= TRANSPORT_LUNFLAGS_READ_WRITE; + } else { + deve->lun_flags &= ~TRANSPORT_LUNFLAGS_READ_WRITE; + deve->lun_flags |= TRANSPORT_LUNFLAGS_READ_ONLY; + } + } + spin_unlock_bh(&lun->lun_deve_lock); +} + /* * Called with rcu_read_lock or nacl->device_list_lock held. */ diff --git a/drivers/target/target_core_fabric_configfs.c b/drivers/target/target_core_fabric_configfs.c index 6cfee59..299b4b5 100644 --- a/drivers/target/target_core_fabric_configfs.c +++ b/drivers/target/target_core_fabric_configfs.c @@ -726,12 +726,54 @@ static ssize_t target_fabric_port_store_attr_alua_tg_pt_write_md( TCM_PORT_ATTR(alua_tg_pt_write_md, S_IRUGO | S_IWUSR); +static ssize_t target_fabric_port_show_attr_write_protect( + struct se_lun *lun, + char *page) +{ + ssize_t len = 0; + + if (!lun || !lun->lun_se_dev) + return -ENODEV; + + len = sprintf(page, "%d\n", + (lun->lun_access & TRANSPORT_LUNFLAGS_READ_ONLY) ? 1 : 0); + + return len; +} + +static ssize_t target_fabric_port_store_attr_write_protect( + struct se_lun *lun, + const char *page, + size_t count) +{ + unsigned long op; + int ret; + + if (!lun || !lun->lun_se_dev) + return -ENODEV; + + ret = kstrtoul(page, 0, &op); + if (ret) + return ret; + + if ((op != 1) && (op != 0)) + return -EINVAL; + + core_update_lun_access(lun, (op) ? + TRANSPORT_LUNFLAGS_READ_ONLY : + TRANSPORT_LUNFLAGS_READ_WRITE); + + return count; + +} +TCM_PORT_ATTR(write_protect, S_IRUGO | S_IWUSR); static struct configfs_attribute *target_fabric_port_attrs[] = { &target_fabric_port_alua_tg_pt_gp.attr, &target_fabric_port_alua_tg_pt_offline.attr, &target_fabric_port_alua_tg_pt_status.attr, &target_fabric_port_alua_tg_pt_write_md.attr, + &target_fabric_port_write_protect.attr, NULL, }; diff --git a/drivers/target/target_core_internal.h b/drivers/target/target_core_internal.h index 5111789..69a57a4 100644 --- a/drivers/target/target_core_internal.h +++ b/drivers/target/target_core_internal.h @@ -36,6 +36,7 @@ void core_clear_lun_from_tpg(struct se_lun *, struct se_portal_group *); int core_dev_add_lun(struct se_portal_group *, struct se_device *, struct se_lun *lun); void core_dev_del_lun(struct se_portal_group *, struct se_lun *); +void core_update_lun_access(struct se_lun *, u32); struct se_lun_acl *core_dev_init_initiator_node_lun_acl(struct se_portal_group *, struct se_node_acl *, u64, int *); int core_dev_add_initiator_node_lun_acl(struct se_portal_group *,