From patchwork Wed Aug 24 13:18:40 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ilya Dryomov X-Patchwork-Id: 9297709 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id BA18D60757 for ; Wed, 24 Aug 2016 13:20:26 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id AB79C28FE6 for ; Wed, 24 Aug 2016 13:20:26 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id A060A28FEB; Wed, 24 Aug 2016 13:20:26 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.8 required=2.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED, DKIM_SIGNED, FREEMAIL_FROM, RCVD_IN_DNSWL_HI, T_DKIM_INVALID autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 2F41F28FE6 for ; Wed, 24 Aug 2016 13:20:26 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755095AbcHXNUF (ORCPT ); Wed, 24 Aug 2016 09:20:05 -0400 Received: from mail-yw0-f194.google.com ([209.85.161.194]:33619 "EHLO mail-yw0-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754119AbcHXNT6 (ORCPT ); Wed, 24 Aug 2016 09:19:58 -0400 Received: by mail-yw0-f194.google.com with SMTP id z8so793955ywa.0 for ; Wed, 24 Aug 2016 06:19:09 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:subject:date:message-id:in-reply-to:references; bh=GF81v/lU+FFfRgud0F0cI/E6WBHwnpPnbHnr5Zxd0x8=; b=Obco2eYCE79Uly7rb2FbGvtVIZVE6GdprOBOlg8zzcWwO9/Q6yK5LeLOxI4VD9Wnsl ewi7ykMN/mQosdb+C6tRpOl5F5NKpQvEcBbEtkB9C/LZ0HlS+86jM9IQ48/VgJgsGBTJ vLgmdTZB2coGUiiTnfgHkNHL3lbkJQj3hcVGdSqsu+ZKf1y6m2V/59ApJYwV26Pzsjwg GVOJJscpFG5ISQmoJ13Fx0IBTdekKHkG4KIWzuuf7/Aza03IDWozgUxdS5ewgCpg1/rt XdDOj5a48KEhVa9H9x7Yz1p3Td+UDbv+zrxG6fFrSoFFKitNNwWau3QZIGtx22p0k1wE k01Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references; bh=GF81v/lU+FFfRgud0F0cI/E6WBHwnpPnbHnr5Zxd0x8=; b=Rs0cj37Fq7I/5MHR06ee1BQ5usp1o3ONvUHAxyks0cNfg5wDobLFPRbEg7Durmy8XS DRYKm8AjIhXad3dX1lij8HUguuS14WusuPZd+zVA/Y11vu1ZdHZjNaIiATB1RNri2oSJ tAG/1JKTQ9iER7lMsoI5GnB2MgmGcGrV2Kg0avJ/Xs9vnQafHYo2EYJ6J9e45CUGfCjQ AhF/ZhkLpN68mCIdB+1GffENJFMAxxQq07kd+GJ+CMsW0AedgWQkM7Ap8zf2sk60cmmT uwSEy61m7GC/tDGrfGOhtyOBFYyVp0J0ngBYdxkEjX7oSI63N7enLAyptrciREzqGm89 BBfg== X-Gm-Message-State: AE9vXwP1mCKlthkLh5fskYA7IWPhxbP78L3PKkvbDQSV+hqXC5GY/i+ShWv3j4wOJE6NRQ== X-Received: by 10.13.204.22 with SMTP id o22mr2316925ywd.7.1472044748433; Wed, 24 Aug 2016 06:19:08 -0700 (PDT) Received: from dhcp-1-219.brq.redhat.com (nat-pool-brq-t.redhat.com. [213.175.37.10]) by smtp.gmail.com with ESMTPSA id e197sm5371294ywa.16.2016.08.24.06.19.07 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 24 Aug 2016 06:19:08 -0700 (PDT) From: Ilya Dryomov To: ceph-devel@vger.kernel.org Subject: [PATCH 16/16] rbd: add force close option Date: Wed, 24 Aug 2016 15:18:40 +0200 Message-Id: <1472044720-29116-17-git-send-email-idryomov@gmail.com> X-Mailer: git-send-email 2.4.3 In-Reply-To: <1472044720-29116-1-git-send-email-idryomov@gmail.com> References: <1472044720-29116-1-git-send-email-idryomov@gmail.com> Sender: ceph-devel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: ceph-devel@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP From: Mike Christie This adds a force close option, so we can force the unmapping of a rbd device that is open. If a path/device is blacklisted, apps like multipathd can map a new device and then unmap the old one. The unmapping cleanup would then be handled by the generic hotunplug code paths in multipahd like is done for iSCSI, FC/FCOE, SAS, etc. Signed-off-by: Mike Christie Signed-off-by: Ilya Dryomov --- Documentation/ABI/testing/sysfs-bus-rbd | 10 +++++++--- drivers/block/rbd.c | 35 ++++++++++++++++++++++++--------- 2 files changed, 33 insertions(+), 12 deletions(-) diff --git a/Documentation/ABI/testing/sysfs-bus-rbd b/Documentation/ABI/testing/sysfs-bus-rbd index 6dccbf82fcf4..f208ac58d613 100644 --- a/Documentation/ABI/testing/sysfs-bus-rbd +++ b/Documentation/ABI/testing/sysfs-bus-rbd @@ -6,7 +6,7 @@ Description: Being used for adding and removing rbd block devices. -Usage: [snap name] +Usage: [] $ echo "192.168.0.1 name=admin rbd foo" > /sys/bus/rbd/add @@ -14,9 +14,13 @@ The snapshot name can be "-" or omitted to map the image read/write. A will be assigned for any registered block device. If snapshot is used, it will be mapped read-only. -Removal of a device: +Usage: [force] - $ echo > /sys/bus/rbd/remove + $ echo 2 > /sys/bus/rbd/remove + +Optional "force" argument which when passed will wait for running requests and +then unmap the image. Requests sent to the driver after initiating the removal +will be failed. (August 2016, since 4.9.) What: /sys/bus/rbd/add_single_major Date: December 2013 diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c index 8ff2dc872008..35fc1da6c83d 100644 --- a/drivers/block/rbd.c +++ b/drivers/block/rbd.c @@ -6347,18 +6347,26 @@ static ssize_t do_rbd_remove(struct bus_type *bus, struct rbd_device *rbd_dev = NULL; struct list_head *tmp; int dev_id; - unsigned long ul; + char opt_buf[6]; bool already = false; + bool force = false; int ret; - ret = kstrtoul(buf, 10, &ul); - if (ret) - return ret; - - /* convert to int; abort if we lost anything in the conversion */ - dev_id = (int)ul; - if (dev_id != ul) + dev_id = -1; + opt_buf[0] = '\0'; + sscanf(buf, "%d %5s", &dev_id, opt_buf); + if (dev_id < 0) { + pr_err("dev_id out of range\n"); return -EINVAL; + } + if (opt_buf[0] != '\0') { + if (!strcmp(opt_buf, "force")) { + force = true; + } else { + pr_err("bad remove option at '%s'\n", opt_buf); + return -EINVAL; + } + } ret = -ENOENT; spin_lock(&rbd_dev_list_lock); @@ -6371,7 +6379,7 @@ static ssize_t do_rbd_remove(struct bus_type *bus, } if (!ret) { spin_lock_irq(&rbd_dev->lock); - if (rbd_dev->open_count) + if (rbd_dev->open_count && !force) ret = -EBUSY; else already = test_and_set_bit(RBD_DEV_FLAG_REMOVING, @@ -6382,6 +6390,15 @@ static ssize_t do_rbd_remove(struct bus_type *bus, if (ret < 0 || already) return ret; + if (force) { + /* + * Prevent new IO from being queued and wait for existing + * IO to complete/fail. + */ + blk_mq_freeze_queue(rbd_dev->disk->queue); + blk_set_queue_dying(rbd_dev->disk->queue); + } + down_write(&rbd_dev->lock_rwsem); if (__rbd_is_lock_owner(rbd_dev)) rbd_unlock(rbd_dev);