From patchwork Mon Nov 18 13:38:08 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ilya Dryomov X-Patchwork-Id: 11249751 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id C371F1599 for ; Mon, 18 Nov 2019 13:38:33 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id A439520726 for ; Mon, 18 Nov 2019 13:38:33 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="EmrGq0iB" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727022AbfKRNic (ORCPT ); Mon, 18 Nov 2019 08:38:32 -0500 Received: from mail-wm1-f65.google.com ([209.85.128.65]:54217 "EHLO mail-wm1-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726830AbfKRNic (ORCPT ); Mon, 18 Nov 2019 08:38:32 -0500 Received: by mail-wm1-f65.google.com with SMTP id u18so17461772wmc.3 for ; Mon, 18 Nov 2019 05:38:30 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=vNOtyDS0dpOhdWQGv2GOfd5c8Sz2KUKGGLWqicusc8o=; b=EmrGq0iB4yUygFr/1Kbrw0dAxxTyfmfHEvqG+Z9tw5yDNmYa0RHKqyhPosdA/fMpjc uAMRfT/1JPSaFrnQABWwB29SiwN2ubQAvJFlhX1U5F8JnEIAXt1oQjSgOVZYhPJXniVY YkRlF3M/6ugX64zpkA19DI6E722//MWsLgkDTxzVfNUrtW2GNOEZl7ITlHd8XIJIt/K8 02GC3V3T60/NYalOgBVeql4dJ4VPHK9HYBNeXkUgmFeaZf08KTWZ/kRo18fWS3ttrmRt x0BZgHXX9l22WSebNvNn2wHcBrO9q467/AuZRyKzDVQT2q1/9xqG+B4X1BvO7FPwm/UE R+SQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=vNOtyDS0dpOhdWQGv2GOfd5c8Sz2KUKGGLWqicusc8o=; b=Hfu02j+FdZcuzyCR/mh1Q/Wk8p1MGJUcOSFJXn1/E4/tANmH/FLIq2X2UUXR+YlhzI 2UWeIzQ5xqTexp+jqQZoN6tIYmNfSJwYaYQ01RDLEKWyaBtZ5fvuK5oD6LSuEVROFalJ bH3bMXZTh4n3sKQnxJMeptBNpKnt8dIBlOOccs8jQtQSsGq/p8wO7SA2HM9Q3WpZyCXr jt3Dpn81AAcfzar2KVGPrI84N0AsOrhJq7Wrasfi4SE28JyUwMPI3Ix+swCrum9ZUHWB UkxZhfL+GMXQacMzIXpumCMiouXICtv66cIZt5edob8JXG45wtBQeSgjBOjL7qHmbsCS xHUA== X-Gm-Message-State: APjAAAUMtSwJgkKOqLGoHpHoxw/dTNq62k6LcW3vBLpNQC5DU8YsX3W6 O6pJshzcZXwQWBygC59Xl6Oy2Jvs X-Google-Smtp-Source: APXvYqyNwCc2jYJs7zgu9GdDzIZWSav6e09Bc0cFDM2LX9Cqv0TPazLhwRblXdb812HhtbqRPz5+8A== X-Received: by 2002:a7b:c632:: with SMTP id p18mr29566663wmk.73.1574084309352; Mon, 18 Nov 2019 05:38:29 -0800 (PST) Received: from kwango.local (ip-94-112-128-92.net.upcbroadband.cz. [94.112.128.92]) by smtp.gmail.com with ESMTPSA id t133sm24670242wmb.1.2019.11.18.05.38.28 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 18 Nov 2019 05:38:28 -0800 (PST) From: Ilya Dryomov To: ceph-devel@vger.kernel.org Subject: [PATCH 1/9] rbd: introduce rbd_is_snap() Date: Mon, 18 Nov 2019 14:38:08 +0100 Message-Id: <20191118133816.3963-2-idryomov@gmail.com> X-Mailer: git-send-email 2.19.2 In-Reply-To: <20191118133816.3963-1-idryomov@gmail.com> References: <20191118133816.3963-1-idryomov@gmail.com> MIME-Version: 1.0 Sender: ceph-devel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: ceph-devel@vger.kernel.org Signed-off-by: Ilya Dryomov Reviewed-by: Dongsheng Yang --- drivers/block/rbd.c | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c index 2aaa56e4cec9..cf2a7d094890 100644 --- a/drivers/block/rbd.c +++ b/drivers/block/rbd.c @@ -514,6 +514,11 @@ static int minor_to_rbd_dev_id(int minor) return minor >> RBD_SINGLE_MAJOR_PART_SHIFT; } +static bool rbd_is_snap(struct rbd_device *rbd_dev) +{ + return rbd_dev->spec->snap_id != CEPH_NOSNAP; +} + static bool __rbd_is_lock_owner(struct rbd_device *rbd_dev) { lockdep_assert_held(&rbd_dev->lock_rwsem); @@ -696,7 +701,7 @@ static int rbd_ioctl_set_ro(struct rbd_device *rbd_dev, unsigned long arg) return -EFAULT; /* Snapshots can't be marked read-write */ - if (rbd_dev->spec->snap_id != CEPH_NOSNAP && !ro) + if (rbd_is_snap(rbd_dev) && !ro) return -EROFS; /* Let blkdev_roset() handle it */ @@ -3538,7 +3543,7 @@ static bool need_exclusive_lock(struct rbd_img_request *img_req) if (!(rbd_dev->header.features & RBD_FEATURE_EXCLUSIVE_LOCK)) return false; - if (rbd_dev->spec->snap_id != CEPH_NOSNAP) + if (rbd_is_snap(rbd_dev)) return false; rbd_assert(!test_bit(IMG_REQ_CHILD, &img_req->flags)); @@ -4809,7 +4814,7 @@ static void rbd_queue_workfn(struct work_struct *work) goto err_rq; } - if (op_type != OBJ_OP_READ && rbd_dev->spec->snap_id != CEPH_NOSNAP) { + if (op_type != OBJ_OP_READ && rbd_is_snap(rbd_dev)) { rbd_warn(rbd_dev, "%s on read-only snapshot", obj_op_name(op_type)); result = -EIO; @@ -4824,7 +4829,7 @@ static void rbd_queue_workfn(struct work_struct *work) */ if (!test_bit(RBD_DEV_FLAG_EXISTS, &rbd_dev->flags)) { dout("request for non-existent snapshot"); - rbd_assert(rbd_dev->spec->snap_id != CEPH_NOSNAP); + rbd_assert(rbd_is_snap(rbd_dev)); result = -ENXIO; goto err_rq; } @@ -5067,7 +5072,7 @@ static int rbd_dev_refresh(struct rbd_device *rbd_dev) goto out; } - if (rbd_dev->spec->snap_id == CEPH_NOSNAP) { + if (!rbd_is_snap(rbd_dev)) { rbd_dev->mapping.size = rbd_dev->header.image_size; } else { /* validate mapped snapshot's EXISTS flag */ @@ -6656,7 +6661,7 @@ static int rbd_add_acquire_lock(struct rbd_device *rbd_dev) return -EINVAL; } - if (rbd_dev->spec->snap_id != CEPH_NOSNAP) + if (rbd_is_snap(rbd_dev)) return 0; rbd_assert(!rbd_is_lock_owner(rbd_dev)); @@ -7027,7 +7032,7 @@ static int rbd_dev_image_probe(struct rbd_device *rbd_dev, int depth) if (ret) goto err_out_probe; - if (rbd_dev->spec->snap_id != CEPH_NOSNAP && + if (rbd_is_snap(rbd_dev) && (rbd_dev->header.features & RBD_FEATURE_OBJECT_MAP)) { ret = rbd_object_map_load(rbd_dev); if (ret) @@ -7116,7 +7121,7 @@ static ssize_t do_rbd_add(struct bus_type *bus, } /* If we are mapping a snapshot it must be marked read-only */ - if (rbd_dev->spec->snap_id != CEPH_NOSNAP) + if (rbd_is_snap(rbd_dev)) rbd_dev->opts->read_only = true; if (rbd_dev->opts->alloc_size > rbd_dev->layout.object_size) { From patchwork Mon Nov 18 13:38:09 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ilya Dryomov X-Patchwork-Id: 11249749 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 0030F1599 for ; Mon, 18 Nov 2019 13:38:33 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id D2E5520726 for ; Mon, 18 Nov 2019 13:38:32 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="lmwUmOxI" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726992AbfKRNic (ORCPT ); Mon, 18 Nov 2019 08:38:32 -0500 Received: from mail-wm1-f66.google.com ([209.85.128.66]:51393 "EHLO mail-wm1-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726627AbfKRNib (ORCPT ); Mon, 18 Nov 2019 08:38:31 -0500 Received: by mail-wm1-f66.google.com with SMTP id q70so17408524wme.1 for ; Mon, 18 Nov 2019 05:38:31 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=L3iBl88RH0m5yJZUDU8PaXLBX7yDxnnVlnvkkfsp37w=; b=lmwUmOxIcyV7xWleokJDeu+/c4VgeqnEcNdZkI42dvOPuBlpaEC3REJs9P91s0owqv QTpsxyles5p3pH2V4ZYpbXEWLMuUp90N3/PHpp9/BH3RAWZTVM1bV1AcOFagK/XLUwO6 zWbElYBsZoX3BSPOrVrdWnWixvoSw70yxVGJur9agZBPaLP4+K18SH1kjlSHmEsHNJAG dn53V1TATbwal3SuX/O6gpLurXeZVqTJsr6mbnBK6SyGRfalHtw80V4lUlZdcsE3S/iD /ycldmu117lLLAjtRh2PWHbklcbQzsPyzXlp1peBuxHamaiqdyTCEvW8F/3i1zTwsmX1 HYeg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=L3iBl88RH0m5yJZUDU8PaXLBX7yDxnnVlnvkkfsp37w=; b=rCNE1/HQDA4XY7JmuWmb1NESuD+hZbbzmHQh5N7YMjVQIFwh907GtrcqoqyDNmyjrg 38p7VZ3qdqG9Hirb/qEJNamiid/EWg6/CVwYF+f/C2fFcGYIu/rMAkL3KmnaZCl1IIq7 tZweiT6Jf+XwG9VUyxT83zCiUoANYh/Mc2oEl6apj3gIjVRR9QbED9Z8zspw0yy6jA+U 5pKxsVk+Nap/LmSKX0yneYJzSW/GljXlWvdxYJZ5Lsn6o3XBJ03ewJjRxDgAJrLu/d3C zpvMrksG0h1Jl2x4buE4kxjNiC9Cb3kSIJhwjO6owre3N5q1SxD3TbdsvuWPI8FTMczw iETQ== X-Gm-Message-State: APjAAAXMUftgNA1NjWBaRVROoBSL2e33fu1SLFSpnb67NcZic7kj0A5v uYQkNl3RGsqLjykfM6oyjhH8VRGC X-Google-Smtp-Source: APXvYqwjF2jBXHB6ejDMnrUhkRobZIYyRRxR9ZJAvaRxMzdNeelWodkwMSjc43R68rvQIhg8GnQZiw== X-Received: by 2002:a05:600c:2307:: with SMTP id 7mr30790207wmo.154.1574084310161; Mon, 18 Nov 2019 05:38:30 -0800 (PST) Received: from kwango.local (ip-94-112-128-92.net.upcbroadband.cz. [94.112.128.92]) by smtp.gmail.com with ESMTPSA id t133sm24670242wmb.1.2019.11.18.05.38.29 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 18 Nov 2019 05:38:29 -0800 (PST) From: Ilya Dryomov To: ceph-devel@vger.kernel.org Subject: [PATCH 2/9] rbd: introduce RBD_DEV_FLAG_READONLY Date: Mon, 18 Nov 2019 14:38:09 +0100 Message-Id: <20191118133816.3963-3-idryomov@gmail.com> X-Mailer: git-send-email 2.19.2 In-Reply-To: <20191118133816.3963-1-idryomov@gmail.com> References: <20191118133816.3963-1-idryomov@gmail.com> MIME-Version: 1.0 Sender: ceph-devel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: ceph-devel@vger.kernel.org rbd_dev->opts is not available for parent images, making checking rbd_dev->opts->read_only in various places (rbd_dev_image_probe(), need_exclusive_lock(), use_object_map() in the following patches) harder than it needs to be. Keeping rbd_dev_image_probe() in mind, move the initialization in do_rbd_add() up. snap_id isn't filled in at that point, so replace rbd_is_snap() with a snap_name comparison. Signed-off-by: Ilya Dryomov Reviewed-by: Dongsheng Yang --- drivers/block/rbd.c | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c index cf2a7d094890..330d2789f373 100644 --- a/drivers/block/rbd.c +++ b/drivers/block/rbd.c @@ -464,6 +464,7 @@ struct rbd_device { enum rbd_dev_flags { RBD_DEV_FLAG_EXISTS, /* mapped snapshot has not been deleted */ RBD_DEV_FLAG_REMOVING, /* this mapping is being removed */ + RBD_DEV_FLAG_READONLY, /* -o ro or snapshot */ }; static DEFINE_MUTEX(client_mutex); /* Serialize client creation */ @@ -514,6 +515,11 @@ static int minor_to_rbd_dev_id(int minor) return minor >> RBD_SINGLE_MAJOR_PART_SHIFT; } +static bool rbd_is_ro(struct rbd_device *rbd_dev) +{ + return test_bit(RBD_DEV_FLAG_READONLY, &rbd_dev->flags); +} + static bool rbd_is_snap(struct rbd_device *rbd_dev) { return rbd_dev->spec->snap_id != CEPH_NOSNAP; @@ -6867,6 +6873,8 @@ static int rbd_dev_probe_parent(struct rbd_device *rbd_dev, int depth) __rbd_get_client(rbd_dev->rbd_client); rbd_spec_get(rbd_dev->parent_spec); + __set_bit(RBD_DEV_FLAG_READONLY, &parent->flags); + ret = rbd_dev_image_probe(parent, depth); if (ret < 0) goto out_err; @@ -6918,7 +6926,7 @@ static int rbd_dev_device_setup(struct rbd_device *rbd_dev) goto err_out_blkdev; set_capacity(rbd_dev->disk, rbd_dev->mapping.size / SECTOR_SIZE); - set_disk_ro(rbd_dev->disk, rbd_dev->opts->read_only); + set_disk_ro(rbd_dev->disk, rbd_is_ro(rbd_dev)); ret = dev_set_name(&rbd_dev->dev, "%d", rbd_dev->dev_id); if (ret) @@ -7107,6 +7115,11 @@ static ssize_t do_rbd_add(struct bus_type *bus, ctx.rbd_spec = NULL; /* rbd_dev now owns this */ ctx.rbd_opts = NULL; /* rbd_dev now owns this */ + /* if we are mapping a snapshot it will be a read-only mapping */ + if (rbd_dev->opts->read_only || + strcmp(rbd_dev->spec->snap_name, RBD_SNAP_HEAD_NAME)) + __set_bit(RBD_DEV_FLAG_READONLY, &rbd_dev->flags); + rbd_dev->config_info = kstrdup(buf, GFP_KERNEL); if (!rbd_dev->config_info) { rc = -ENOMEM; @@ -7120,10 +7133,6 @@ static ssize_t do_rbd_add(struct bus_type *bus, goto err_out_rbd_dev; } - /* If we are mapping a snapshot it must be marked read-only */ - if (rbd_is_snap(rbd_dev)) - rbd_dev->opts->read_only = true; - if (rbd_dev->opts->alloc_size > rbd_dev->layout.object_size) { rbd_warn(rbd_dev, "alloc_size adjusted to %u", rbd_dev->layout.object_size); From patchwork Mon Nov 18 13:38:10 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ilya Dryomov X-Patchwork-Id: 11249753 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 1342E1593 for ; Mon, 18 Nov 2019 13:38:34 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id E7E3B20726 for ; Mon, 18 Nov 2019 13:38:33 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="b9mXIRha" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727082AbfKRNid (ORCPT ); Mon, 18 Nov 2019 08:38:33 -0500 Received: from mail-wr1-f65.google.com ([209.85.221.65]:42905 "EHLO mail-wr1-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726627AbfKRNic (ORCPT ); Mon, 18 Nov 2019 08:38:32 -0500 Received: by mail-wr1-f65.google.com with SMTP id a15so19517555wrf.9 for ; Mon, 18 Nov 2019 05:38:32 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=DVnn3LT8HfKAn3otZMw1YLXrFkmCYdTRUb1AiySCKGs=; b=b9mXIRhaUJvYBW3ITSriLeo8fiMP/XMr9W3b71lEQ0ArHtAJAUIphbq45wN9dRRJcf 9t2FNXsLxbg6lXcEn8Ai0rIlrTbdzXOswOE5a/iOLcu2rs2stJ+QMR4Ln6Khjx3WqOfo 3AA2B5/XIixUL2Mr8Xy7oT7Yq727dLYtYjLtrRt5lHsUGGhdK18z9dpjLugervzxo0s7 +fnbiovtwRJhjGtey+w5Iydc18oRmnuJjUJ6pbbo9LcsJoCc675kqpk5udRu755oYqx0 E9H9FIrOKkqzqxWnFitngMFaB2mTnKE00CILmp3O655/KjNqqpTtV/kvAPpoyuwf9pbS bfMQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=DVnn3LT8HfKAn3otZMw1YLXrFkmCYdTRUb1AiySCKGs=; b=bWho5mB6pf2uDSWDtQz5gnL7a/tDNKU9LPF+/fP2S2qgu7ZcZhzohZSsEvF0ZEpjFY 5a7/o1FTal8z51cBk/fJ5hoDdkM27hLTysIz9RN2MsS2vKKql42TqFoLT7GDjH+mW7a8 KQbSpwed6TGJZqjA42PnUwHKEvepA8SgTRJreVireHmxheER5/HNVbci0CgkEDsXKHzp T1cc+YE9UalD8NY8WFF0AIoRCBFdN1i+z7+vqtrs1bcG1rHWDCKlve41j8YlQjVVOq53 b965FRP3Udie3bZ2AEebGTvK/OZ/nBjEt44EwAnQj5+t1kGQqE1fN5UMQfQYHfwGdATh 9m1Q== X-Gm-Message-State: APjAAAVZqcIuQmYkB7I3DzkQFU5PFhOQwhs2q9C7Lkf0P4/ey1beEL7D HA18Pqx43WYGalRzpKY803uOTtQ8 X-Google-Smtp-Source: APXvYqzZz5Ycf5q5Z/+i3gQct/yXyx40Zr8f8LQJwyHCWemuiO/NJTuzIQlWVldgEqbWEEc+oTOJBA== X-Received: by 2002:a5d:538d:: with SMTP id d13mr32234603wrv.304.1574084311319; Mon, 18 Nov 2019 05:38:31 -0800 (PST) Received: from kwango.local (ip-94-112-128-92.net.upcbroadband.cz. [94.112.128.92]) by smtp.gmail.com with ESMTPSA id t133sm24670242wmb.1.2019.11.18.05.38.30 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 18 Nov 2019 05:38:30 -0800 (PST) From: Ilya Dryomov To: ceph-devel@vger.kernel.org Subject: [PATCH 3/9] rbd: treat images mapped read-only seriously Date: Mon, 18 Nov 2019 14:38:10 +0100 Message-Id: <20191118133816.3963-4-idryomov@gmail.com> X-Mailer: git-send-email 2.19.2 In-Reply-To: <20191118133816.3963-1-idryomov@gmail.com> References: <20191118133816.3963-1-idryomov@gmail.com> MIME-Version: 1.0 Sender: ceph-devel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: ceph-devel@vger.kernel.org Even though -o ro/-o read_only/--read-only options are very old, we have never really treated them seriously (on par with snapshots). As a first step, fail writes to images mapped read-only just like we do for snapshots. We need this check in rbd because the block layer basically ignores read-only setting, see commit a32e236eb93e ("Partially revert "block: fail op_is_write() requests to read-only partitions""). Signed-off-by: Ilya Dryomov Reviewed-by: Dongsheng Yang --- drivers/block/rbd.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c index 330d2789f373..842b92ef2c06 100644 --- a/drivers/block/rbd.c +++ b/drivers/block/rbd.c @@ -4820,11 +4820,14 @@ static void rbd_queue_workfn(struct work_struct *work) goto err_rq; } - if (op_type != OBJ_OP_READ && rbd_is_snap(rbd_dev)) { - rbd_warn(rbd_dev, "%s on read-only snapshot", - obj_op_name(op_type)); - result = -EIO; - goto err; + if (op_type != OBJ_OP_READ) { + if (rbd_is_ro(rbd_dev)) { + rbd_warn(rbd_dev, "%s on read-only mapping", + obj_op_name(op_type)); + result = -EIO; + goto err; + } + rbd_assert(!rbd_is_snap(rbd_dev)); } /* From patchwork Mon Nov 18 13:38:11 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ilya Dryomov X-Patchwork-Id: 11249755 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id D81371599 for ; Mon, 18 Nov 2019 13:38:36 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id B8FD920726 for ; Mon, 18 Nov 2019 13:38:36 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="ssOO63Nr" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727122AbfKRNig (ORCPT ); Mon, 18 Nov 2019 08:38:36 -0500 Received: from mail-wm1-f68.google.com ([209.85.128.68]:36542 "EHLO mail-wm1-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727088AbfKRNif (ORCPT ); Mon, 18 Nov 2019 08:38:35 -0500 Received: by mail-wm1-f68.google.com with SMTP id c22so18877743wmd.1 for ; Mon, 18 Nov 2019 05:38:33 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=URgUTKUr4PFsmMgcE/I1boUSGJvMsmUQCFb58LW+Sj4=; b=ssOO63NrhxtAgAbp2VgeFWl6j3FNJtYtlPF/TtHK9kfBLk4imXCVRBRt2vgSEEesdd G4b8mZ0wWglm62yf9SItPjlTdJDZFE/LZdgJvpNs4ecuw4UT1hduCm/V2UZN2Rbb8NkO S/tGc7aBx+DGLhHJSYCjZ1i9vFrwFBMXbySGX6mmwjDo8oP14a2YNZ7e4Gyxqgyr8ShO ZhJKAM+EPMv4WWMJ3LuoGISL4FJVU5MIskTU1Y2uYBJVL792dnNv2Q7fxS9mRizK8SaJ +4CwTL7wOPkqRtOM2O+xo7ZJs89r3o26T0HdfMPpRYBgjZStlLKQIgCRtVO1BI8oqZEz WXpA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=URgUTKUr4PFsmMgcE/I1boUSGJvMsmUQCFb58LW+Sj4=; b=dHC+EEhUpHsuflZHjKWQsG2GS3gTRB6kt4qFdEdqm0OpiDv2TPnLZRsNMSFVFTuL4P 9ez8QbdIfQ88xEUXrKIqCxR8kkT6gI9fhJUHOkFNFKQ4Dw60sQpE9WDUmy+Q8ExdGLfs DrazwYqZVGywWL9zrOeAaFwXkrlqlCiy9sOaYO5OCjLXrBQ1iAGDbMzW/MtN0gHRzj+R hn3JQqes0SzLDCzJYXI3pMQ2CSvpibahstU5va9pjQZrG5zB8xYzlUskHEv3g67en3OQ wPfkczU+xcLSANCA8GDL9RKmNSFXmi7cW61XaaGd2iHFdiqgW1Y+DjoUeufpCvUisY6F t0YQ== X-Gm-Message-State: APjAAAUffP76DKs102pLZD3ESGvw6FeRlaCRbEsSYj7hPsZ2oj6ns9yx BYDoIQbSPn7MbEHOoqfbgssMWMC/ X-Google-Smtp-Source: APXvYqx702WZoWpWM7PfJbiT4zbKaacDtzgBJ5SP+uVZJVBRHFXmQATA8tTEXkJ2Dx62kOVzdMnrJA== X-Received: by 2002:a7b:c95a:: with SMTP id i26mr30771802wml.41.1574084312230; Mon, 18 Nov 2019 05:38:32 -0800 (PST) Received: from kwango.local (ip-94-112-128-92.net.upcbroadband.cz. [94.112.128.92]) by smtp.gmail.com with ESMTPSA id t133sm24670242wmb.1.2019.11.18.05.38.31 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 18 Nov 2019 05:38:31 -0800 (PST) From: Ilya Dryomov To: ceph-devel@vger.kernel.org Subject: [PATCH 4/9] rbd: disallow read-write partitions on images mapped read-only Date: Mon, 18 Nov 2019 14:38:11 +0100 Message-Id: <20191118133816.3963-5-idryomov@gmail.com> X-Mailer: git-send-email 2.19.2 In-Reply-To: <20191118133816.3963-1-idryomov@gmail.com> References: <20191118133816.3963-1-idryomov@gmail.com> MIME-Version: 1.0 Sender: ceph-devel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: ceph-devel@vger.kernel.org If an image is mapped read-only, don't allow setting its partition(s) to read-write via BLKROSET: with the previous patch all writes to such images are failed anyway. If an image is mapped read-write, its partition(s) can be set to read-only (and back to read-write) as before. Note that at the rbd level the image will remain writeable: anything sent down by the block layer will be executed, including any write from internal kernel users. Signed-off-by: Ilya Dryomov Reviewed-by: Dongsheng Yang --- drivers/block/rbd.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c index 842b92ef2c06..979203cd934c 100644 --- a/drivers/block/rbd.c +++ b/drivers/block/rbd.c @@ -706,9 +706,16 @@ static int rbd_ioctl_set_ro(struct rbd_device *rbd_dev, unsigned long arg) if (get_user(ro, (int __user *)arg)) return -EFAULT; - /* Snapshots can't be marked read-write */ - if (rbd_is_snap(rbd_dev) && !ro) - return -EROFS; + /* + * Both images mapped read-only and snapshots can't be marked + * read-write. + */ + if (!ro) { + if (rbd_is_ro(rbd_dev)) + return -EROFS; + + rbd_assert(!rbd_is_snap(rbd_dev)); + } /* Let blkdev_roset() handle it */ return -ENOTTY; From patchwork Mon Nov 18 13:38:12 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ilya Dryomov X-Patchwork-Id: 11249757 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id A437D1593 for ; Mon, 18 Nov 2019 13:38:37 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 83D5720726 for ; Mon, 18 Nov 2019 13:38:37 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="H24JrVxv" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727110AbfKRNig (ORCPT ); Mon, 18 Nov 2019 08:38:36 -0500 Received: from mail-wr1-f67.google.com ([209.85.221.67]:36872 "EHLO mail-wr1-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726627AbfKRNie (ORCPT ); Mon, 18 Nov 2019 08:38:34 -0500 Received: by mail-wr1-f67.google.com with SMTP id t1so19516347wrv.4 for ; Mon, 18 Nov 2019 05:38:34 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=NF9NCOiEjVY37tjt3beWLkGdWem+1qOnCPXXKFY7H5c=; b=H24JrVxvl/fZLaMmUf8hU3a8WI+lOvdCemjTpmpZEu+nPjMIdGKJlce+8KLqInV9KE 8IvPYRd+VyuVI1xCEVcsItqmoYag3WMkphWIsLyKgxJVjxw0X652ZCcdg/ih7Qvnb4ow PD9wWITw2je2l7O2xFKhCgSRbXwS2t5JHf7DrNs6YfxaKqa2RmYA1ntUtfFGj9wmHwuU Nj4VVkJxpWx1g3k5lI/vbaPx1t/oId1w3oUK3pWYhXR8ycxyZCL6rkqct1TMdWDAz3m3 EThk2/cY+1kO2uZrfNJjWsgcEaD4R4320nXbiZb4VKnZnKGifn60jX6b5cG9N615eH4Y 5CmA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=NF9NCOiEjVY37tjt3beWLkGdWem+1qOnCPXXKFY7H5c=; b=XOWJxmX+lf75iBPqaEo11+YmB+2TI87MRBiA2iiW863rVkQT/osl5CBYZ/wQvsggRP gwp2Q+4f32LswVQEve34dq+YZTqLToZDfS5008o91oL0t75ahjHrPQ2ArZ+D2OHavtJi RJdamK1JjlSomyDmGaD6BBYXfdBN6uOA14kTlsBBalEIkHJS9wrM4+1+pgvd/DiQvtOT J8csVdST1FLqk0s/0Ri27E1pSsGrVptqFwbijp1vwIPFvUZsML9TYSq7ZR4rMNOmkCQZ yeJAlhEAf1817BNoDblnZ3/1JoO6/b/pHPo1mYmQvjVN/Te61Fen2/Jy4D0ucKD5sWpz mImQ== X-Gm-Message-State: APjAAAUFPxB4CDh0bYCO3Dry2YGTLCENAKWpDCkMnJC6RZXPSZJofS1e 5RKbNEZl7J6WAwrb1IdjAJZ2zUho X-Google-Smtp-Source: APXvYqyrs10YUN4a1hqACUdN/DOoLBE5TlLwtdC1Q/Evc9qzxyD/sLmpLwmqCJ3w6M/Ad22VOxIjTw== X-Received: by 2002:adf:b199:: with SMTP id q25mr32278397wra.320.1574084313161; Mon, 18 Nov 2019 05:38:33 -0800 (PST) Received: from kwango.local (ip-94-112-128-92.net.upcbroadband.cz. [94.112.128.92]) by smtp.gmail.com with ESMTPSA id t133sm24670242wmb.1.2019.11.18.05.38.32 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 18 Nov 2019 05:38:32 -0800 (PST) From: Ilya Dryomov To: ceph-devel@vger.kernel.org Subject: [PATCH 5/9] rbd: don't acquire exclusive lock for read-only mappings Date: Mon, 18 Nov 2019 14:38:12 +0100 Message-Id: <20191118133816.3963-6-idryomov@gmail.com> X-Mailer: git-send-email 2.19.2 In-Reply-To: <20191118133816.3963-1-idryomov@gmail.com> References: <20191118133816.3963-1-idryomov@gmail.com> MIME-Version: 1.0 Sender: ceph-devel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: ceph-devel@vger.kernel.org A read-only mapping should be usable with read-only OSD caps, so neither the header lock nor the object map lock can be acquired. Unfortunately, this means that images mapped read-only lose the advantage of the object map. Snapshots, however, can take advantage of the object map without any exclusionary locks, so if the object map is desired, snapshot the image and map the snapshot instead of the image. Signed-off-by: Ilya Dryomov Reviewed-by: Dongsheng Yang --- drivers/block/rbd.c | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c index 979203cd934c..aaa359561356 100644 --- a/drivers/block/rbd.c +++ b/drivers/block/rbd.c @@ -1833,6 +1833,17 @@ static u8 rbd_object_map_get(struct rbd_device *rbd_dev, u64 objno) static bool use_object_map(struct rbd_device *rbd_dev) { + /* + * An image mapped read-only can't use the object map -- it isn't + * loaded because the header lock isn't acquired. Someone else can + * write to the image and update the object map behind our back. + * + * A snapshot can't be written to, so using the object map is always + * safe. + */ + if (!rbd_is_snap(rbd_dev) && rbd_is_ro(rbd_dev)) + return false; + return ((rbd_dev->header.features & RBD_FEATURE_OBJECT_MAP) && !(rbd_dev->object_map_flags & RBD_FLAG_OBJECT_MAP_INVALID)); } @@ -3556,7 +3567,7 @@ static bool need_exclusive_lock(struct rbd_img_request *img_req) if (!(rbd_dev->header.features & RBD_FEATURE_EXCLUSIVE_LOCK)) return false; - if (rbd_is_snap(rbd_dev)) + if (rbd_is_ro(rbd_dev)) return false; rbd_assert(!test_bit(IMG_REQ_CHILD, &img_req->flags)); @@ -6677,7 +6688,7 @@ static int rbd_add_acquire_lock(struct rbd_device *rbd_dev) return -EINVAL; } - if (rbd_is_snap(rbd_dev)) + if (rbd_is_ro(rbd_dev)) return 0; rbd_assert(!rbd_is_lock_owner(rbd_dev)); From patchwork Mon Nov 18 13:38:13 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ilya Dryomov X-Patchwork-Id: 11249765 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id AB32B184E for ; Mon, 18 Nov 2019 13:38:42 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 8B9CF20726 for ; Mon, 18 Nov 2019 13:38:42 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="rdfnSX9N" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727161AbfKRNii (ORCPT ); Mon, 18 Nov 2019 08:38:38 -0500 Received: from mail-wm1-f67.google.com ([209.85.128.67]:39020 "EHLO mail-wm1-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727104AbfKRNih (ORCPT ); Mon, 18 Nov 2019 08:38:37 -0500 Received: by mail-wm1-f67.google.com with SMTP id t26so18888427wmi.4 for ; Mon, 18 Nov 2019 05:38:35 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=Gw4mcEr0n1YygCP5aT+WAGi6UtUpy1PoZH9RmvLRcf8=; b=rdfnSX9NDT3/I5YvnK9lo2oODXOPDHEkepxyJQjB3G/mvEQrtdwikDzytTcl+EjgFb 37x8WhrTfOQsz1hfoMVyPum/lC+2LVbQV+Cx+4oUsQztEb4dngUExSsv6G32URbYcrg1 IAw1TR2VMTFCy4caG/0ZVWPI9zLYL1fa5Ras9HC3jIwtSc3Id3kxrGETTe2HToN3+Cg+ uwo597w6YSw7H7EMFW4cXjOy3857Ppv1N1m5Mk9QKvJ3J4HdWVtmXWvj3fOSyrGmaym4 FBJMnCXfNhQa6W23ExQsikjcpXJTP7ngbhOCFW1KlV0HhXsDRB2ryU241EGV2WNgHtuT kwQw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=Gw4mcEr0n1YygCP5aT+WAGi6UtUpy1PoZH9RmvLRcf8=; b=kfRZdvCEe4i739MduxIsf0seYeWCwCRdPNEM0tEpGf6WBb30nXcIQM5K9EAhebj3y3 9ENW+sFcz0RRh/wa7do5xbxdr8mVkwIW7lm8m7RcLH58kFMF6iXWNu0t7Cd6QbF9ljHz 9I2L9+cU5BrX7pXOQSyXaT9B2dOFFO21OoZhI3JAUgSojIlmovaYkTu3fDNYgxlAerEK DzNLDJrER9nXH7CbKM9OHHiK6xx0PGkhGwJ+0bC6ynqHQrffyflujj4alht+fgXEnec+ umrg08Me62I00vOc3TjJQ18/Px28PYw4PIqKz7x+nE3lD5/PIhWAc3xvUYckvJ2iGqw/ xQEw== X-Gm-Message-State: APjAAAWxL+/mnZfWuJbp8Our9qm5uCknq7+n13NFrpSTTgcmLEguvdoN lmZGKrBtXhmGkKjVy/c8MvZl/eeP X-Google-Smtp-Source: APXvYqzswQOc7KAnk1L1x2pqAEx3Ggt1k99RCo1tarvgQ2my7fwBJU9GLXTl9mGcaoR+bc5USWCXzA== X-Received: by 2002:a1c:a9cb:: with SMTP id s194mr31087038wme.92.1574084314181; Mon, 18 Nov 2019 05:38:34 -0800 (PST) Received: from kwango.local (ip-94-112-128-92.net.upcbroadband.cz. [94.112.128.92]) by smtp.gmail.com with ESMTPSA id t133sm24670242wmb.1.2019.11.18.05.38.33 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 18 Nov 2019 05:38:33 -0800 (PST) From: Ilya Dryomov To: ceph-devel@vger.kernel.org Subject: [PATCH 6/9] rbd: don't establish watch for read-only mappings Date: Mon, 18 Nov 2019 14:38:13 +0100 Message-Id: <20191118133816.3963-7-idryomov@gmail.com> X-Mailer: git-send-email 2.19.2 In-Reply-To: <20191118133816.3963-1-idryomov@gmail.com> References: <20191118133816.3963-1-idryomov@gmail.com> MIME-Version: 1.0 Sender: ceph-devel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: ceph-devel@vger.kernel.org With exclusive lock out of the way, watch is the only thing left that prevents a read-only mapping from being used with read-only OSD caps. Signed-off-by: Ilya Dryomov Reviewed-by: Dongsheng Yang --- drivers/block/rbd.c | 41 +++++++++++++++++++++++++++-------------- 1 file changed, 27 insertions(+), 14 deletions(-) diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c index aaa359561356..bfff195e8e23 100644 --- a/drivers/block/rbd.c +++ b/drivers/block/rbd.c @@ -6985,6 +6985,24 @@ static int rbd_dev_header_name(struct rbd_device *rbd_dev) return ret; } +static void rbd_print_dne(struct rbd_device *rbd_dev, bool is_snap) +{ + if (!is_snap) { + pr_info("image %s/%s%s%s does not exist\n", + rbd_dev->spec->pool_name, + rbd_dev->spec->pool_ns ?: "", + rbd_dev->spec->pool_ns ? "/" : "", + rbd_dev->spec->image_name); + } else { + pr_info("snap %s/%s%s%s@%s does not exist\n", + rbd_dev->spec->pool_name, + rbd_dev->spec->pool_ns ?: "", + rbd_dev->spec->pool_ns ? "/" : "", + rbd_dev->spec->image_name, + rbd_dev->spec->snap_name); + } +} + static void rbd_dev_image_release(struct rbd_device *rbd_dev) { rbd_dev_unprobe(rbd_dev); @@ -7003,6 +7021,7 @@ static void rbd_dev_image_release(struct rbd_device *rbd_dev) */ static int rbd_dev_image_probe(struct rbd_device *rbd_dev, int depth) { + bool need_watch = !depth && !rbd_is_ro(rbd_dev); int ret; /* @@ -7019,22 +7038,21 @@ static int rbd_dev_image_probe(struct rbd_device *rbd_dev, int depth) if (ret) goto err_out_format; - if (!depth) { + if (need_watch) { ret = rbd_register_watch(rbd_dev); if (ret) { if (ret == -ENOENT) - pr_info("image %s/%s%s%s does not exist\n", - rbd_dev->spec->pool_name, - rbd_dev->spec->pool_ns ?: "", - rbd_dev->spec->pool_ns ? "/" : "", - rbd_dev->spec->image_name); + rbd_print_dne(rbd_dev, false); goto err_out_format; } } ret = rbd_dev_header_info(rbd_dev); - if (ret) + if (ret) { + if (ret == -ENOENT && !need_watch) + rbd_print_dne(rbd_dev, false); goto err_out_watch; + } /* * If this image is the one being mapped, we have pool name and @@ -7048,12 +7066,7 @@ static int rbd_dev_image_probe(struct rbd_device *rbd_dev, int depth) ret = rbd_spec_fill_names(rbd_dev); if (ret) { if (ret == -ENOENT) - pr_info("snap %s/%s%s%s@%s does not exist\n", - rbd_dev->spec->pool_name, - rbd_dev->spec->pool_ns ?: "", - rbd_dev->spec->pool_ns ? "/" : "", - rbd_dev->spec->image_name, - rbd_dev->spec->snap_name); + rbd_print_dne(rbd_dev, true); goto err_out_probe; } @@ -7085,7 +7098,7 @@ static int rbd_dev_image_probe(struct rbd_device *rbd_dev, int depth) err_out_probe: rbd_dev_unprobe(rbd_dev); err_out_watch: - if (!depth) + if (need_watch) rbd_unregister_watch(rbd_dev); err_out_format: rbd_dev->image_format = 0; From patchwork Mon Nov 18 13:38:14 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ilya Dryomov X-Patchwork-Id: 11249759 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 2387C184E for ; Mon, 18 Nov 2019 13:38:38 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 0475220726 for ; Mon, 18 Nov 2019 13:38:38 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="NiDKLn5E" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727143AbfKRNih (ORCPT ); Mon, 18 Nov 2019 08:38:37 -0500 Received: from mail-wr1-f68.google.com ([209.85.221.68]:41525 "EHLO mail-wr1-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727116AbfKRNih (ORCPT ); Mon, 18 Nov 2019 08:38:37 -0500 Received: by mail-wr1-f68.google.com with SMTP id b18so18080156wrj.8 for ; Mon, 18 Nov 2019 05:38:35 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=8wVtUNfAxf4ws8vN+2mG/0+RfbKXt8lofWvUcvct5i4=; b=NiDKLn5EjrPBp8toseUUl0tCT+E/Um00W8Ac6ZOxIGYKQ7fsA3/O29fzcei6CjoC3d GhftGGJ8RWRxZFdqd7iTUgaQZfaCtMDqTGBGA0nMkKFZjI19LRNOZP68CMYz4Ddv36Uc romCJ55i4ZNt/R1uaMmj/v/w4wN1jkaWu1u8pvGE/dgYE/B/s+udQN5NU8ZM7YndF7S2 UWYs9grwSx/mMDMUT+OUNVtkyPPDQv7R6cqfyUOZlIKsh2LgxnWtdvurAlkmZOgfY3BG zxyBa/1KLkJhWlmraBPXeXC9Ys4UEeji1HT2+k4Jn2XsANWw0Qe4UacWgYkHvvQ2EIME +XJQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=8wVtUNfAxf4ws8vN+2mG/0+RfbKXt8lofWvUcvct5i4=; b=OItrkp21taFG74GbnLJklsH0N5w0ama6RZmuw9Ek3KnPga230zGj6sbYCvj3mGOT0k cCStr5AM7DWhiB+Mk65iq6On1iYsg4H/XVAodwenU9nPOQU+cq7H3uFPlqCg6YzjBiGK qRHOEMxSbkxIZa2nzW6Th3FU0c3vdZdGsmqWr8lyuWF6ZY2f2f2orz5rdcTMYejn80EI RSrEEmsK4sp/oHlNdKKD7efmVG4+mk+HFJhMI081ECum08Su738nSHfAZYtbilwzdMpz oWHNmrsb1SJnmSqjMqDp3Mzg5U7Mb5vi9cR2vZvLCzO2WVhuq7Ca8srCAGcaIsboK6/u EGXw== X-Gm-Message-State: APjAAAX6o4fdacVGJNzR4cw6nA4u8nksY2V+3SEJaz2qpQmDWCSA6dwE iCWjs3ESTzSjsE7FH+T1OeIOh0B+ X-Google-Smtp-Source: APXvYqzz/hBGP1+3MMV/P5jvmS78xd+FFc9JRkT60fK6JOhVrK+sjZKlnlWDdS4FiV5n/jcGpn5fgg== X-Received: by 2002:adf:e40e:: with SMTP id g14mr32141649wrm.264.1574084315050; Mon, 18 Nov 2019 05:38:35 -0800 (PST) Received: from kwango.local (ip-94-112-128-92.net.upcbroadband.cz. [94.112.128.92]) by smtp.gmail.com with ESMTPSA id t133sm24670242wmb.1.2019.11.18.05.38.34 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 18 Nov 2019 05:38:34 -0800 (PST) From: Ilya Dryomov To: ceph-devel@vger.kernel.org Subject: [PATCH 7/9] rbd: remove snapshot existence validation code Date: Mon, 18 Nov 2019 14:38:14 +0100 Message-Id: <20191118133816.3963-8-idryomov@gmail.com> X-Mailer: git-send-email 2.19.2 In-Reply-To: <20191118133816.3963-1-idryomov@gmail.com> References: <20191118133816.3963-1-idryomov@gmail.com> MIME-Version: 1.0 Sender: ceph-devel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: ceph-devel@vger.kernel.org RBD_DEV_FLAG_EXISTS check in rbd_queue_workfn() is racy and leads to inconsistent behaviour. If the object (or its snapshot) isn't there, the OSD returns ENOENT. A read submitted before the snapshot removal notification is processed would be zero-filled and ended with status OK, while future reads would be failed with IOERR. It also doesn't handle a case when an image that is mapped read-only is removed. On top of this, because watch is no longer established for read-only mappings, we no longer get notifications, so rbd_exists_validate() is effectively dead code. While failing requests rather than returning zeros is a good thing, RBD_DEV_FLAG_EXISTS is not it. Signed-off-by: Ilya Dryomov Reviewed-by: Dongsheng Yang --- drivers/block/rbd.c | 42 +++--------------------------------------- 1 file changed, 3 insertions(+), 39 deletions(-) diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c index bfff195e8e23..aba60e37b058 100644 --- a/drivers/block/rbd.c +++ b/drivers/block/rbd.c @@ -462,7 +462,7 @@ struct rbd_device { * by rbd_dev->lock */ enum rbd_dev_flags { - RBD_DEV_FLAG_EXISTS, /* mapped snapshot has not been deleted */ + RBD_DEV_FLAG_EXISTS, /* rbd_dev_device_setup() ran */ RBD_DEV_FLAG_REMOVING, /* this mapping is being removed */ RBD_DEV_FLAG_READONLY, /* -o ro or snapshot */ }; @@ -4848,19 +4848,6 @@ static void rbd_queue_workfn(struct work_struct *work) rbd_assert(!rbd_is_snap(rbd_dev)); } - /* - * Quit early if the mapped snapshot no longer exists. It's - * still possible the snapshot will have disappeared by the - * time our request arrives at the osd, but there's no sense in - * sending it if we already know. - */ - if (!test_bit(RBD_DEV_FLAG_EXISTS, &rbd_dev->flags)) { - dout("request for non-existent snapshot"); - rbd_assert(rbd_is_snap(rbd_dev)); - result = -ENXIO; - goto err_rq; - } - if (offset && length > U64_MAX - offset + 1) { rbd_warn(rbd_dev, "bad request range (%llu~%llu)", offset, length); @@ -5040,25 +5027,6 @@ static int rbd_dev_v1_header_info(struct rbd_device *rbd_dev) return ret; } -/* - * Clear the rbd device's EXISTS flag if the snapshot it's mapped to - * has disappeared from the (just updated) snapshot context. - */ -static void rbd_exists_validate(struct rbd_device *rbd_dev) -{ - u64 snap_id; - - if (!test_bit(RBD_DEV_FLAG_EXISTS, &rbd_dev->flags)) - return; - - snap_id = rbd_dev->spec->snap_id; - if (snap_id == CEPH_NOSNAP) - return; - - if (rbd_dev_snap_index(rbd_dev, snap_id) == BAD_SNAP_INDEX) - clear_bit(RBD_DEV_FLAG_EXISTS, &rbd_dev->flags); -} - static void rbd_dev_update_size(struct rbd_device *rbd_dev) { sector_t size; @@ -5099,12 +5067,8 @@ static int rbd_dev_refresh(struct rbd_device *rbd_dev) goto out; } - if (!rbd_is_snap(rbd_dev)) { - rbd_dev->mapping.size = rbd_dev->header.image_size; - } else { - /* validate mapped snapshot's EXISTS flag */ - rbd_exists_validate(rbd_dev); - } + rbd_assert(!rbd_is_snap(rbd_dev)); + rbd_dev->mapping.size = rbd_dev->header.image_size; out: up_write(&rbd_dev->header_rwsem); From patchwork Mon Nov 18 13:38:15 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ilya Dryomov X-Patchwork-Id: 11249763 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 487E51593 for ; Mon, 18 Nov 2019 13:38:42 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 28B4620862 for ; Mon, 18 Nov 2019 13:38:42 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="Alz8pSD8" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727168AbfKRNil (ORCPT ); Mon, 18 Nov 2019 08:38:41 -0500 Received: from mail-wr1-f68.google.com ([209.85.221.68]:36141 "EHLO mail-wr1-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727088AbfKRNii (ORCPT ); Mon, 18 Nov 2019 08:38:38 -0500 Received: by mail-wr1-f68.google.com with SMTP id r10so19529934wrx.3 for ; Mon, 18 Nov 2019 05:38:37 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=GsWqfzpunClOrNTrCyg12HyaYUqVXl804urV/ExLfpE=; b=Alz8pSD81Bi93JKR9VEDtJ1YYANYp22sOrlNKpknoKiWXZNJTR6YGC3tG+nzyUZkCc AUVOPyl9CQGjs8/1NZutQftS5HCUxsBqSnWmD8kEPlqBUlQUsLlBhamxEEANrzpAUqAm w2bUg6wLzOKURs1oGH/oqMsm162WVdw/Ib7nhWualvBfQfFLYxOYb/xTEWd/lVkes+nC Gl2Jbmh5W2nVI/rJAL6SmtuiiNFYwV8c3W5YSrO3H/jm+70yoYCsspDOgJ8Smu/DIvKU p1L4bOYcUGq0iX2NVvZe8Ft3clNZ6+9JnZJ6cLWQZshIMkKemufbmNfUACy1VevhmucH MiOg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=GsWqfzpunClOrNTrCyg12HyaYUqVXl804urV/ExLfpE=; b=NxFxn7tbvEquqbqDG5mUpXwdJtJeykI6r5PD8MZ5OcV7pKMetzv85u/c0iUuA0Pyng 5HF+m0Zm/9/uSWJMpMy/vDEkLWXtCmGT6nIlh8WqwVDA6YRcle4g1c40nVXxqvEHWIRv uqlUKzC8FTm3qttckEcGrALZvPPbpogjGHnCmfOon9vwWDcKS9diRsQUJTshE0oluXqt wu2ZX+OxT3MtXci05Etz8HlmZ/n1fKhY6YampuLTFxt2h6mLpmC/0O6Qm2eqIwNgF42X OsphTsmRCJBBHol4kBCXD9OlM3IwLoVxVTS7WfmOUXYQoqB9mldAJZTECNNX2oJTvdg5 a45A== X-Gm-Message-State: APjAAAW5qw9KkrHGKqzcczmPM490zqDTYtULqUM3zRSFeb4Q2KHkUfBA aEQl/22yYr8z3vS/G1lHedzfXlhw X-Google-Smtp-Source: APXvYqw+YbT+yT8i+aCVPZB55dOprZNcGUYHQF7OlkLSCgSLVfSaluCvdwv37hoFq5s/45CKbWiN9g== X-Received: by 2002:a5d:6350:: with SMTP id b16mr21427448wrw.357.1574084316175; Mon, 18 Nov 2019 05:38:36 -0800 (PST) Received: from kwango.local (ip-94-112-128-92.net.upcbroadband.cz. [94.112.128.92]) by smtp.gmail.com with ESMTPSA id t133sm24670242wmb.1.2019.11.18.05.38.35 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 18 Nov 2019 05:38:35 -0800 (PST) From: Ilya Dryomov To: ceph-devel@vger.kernel.org Subject: [PATCH 8/9] rbd: don't query snapshot features Date: Mon, 18 Nov 2019 14:38:15 +0100 Message-Id: <20191118133816.3963-9-idryomov@gmail.com> X-Mailer: git-send-email 2.19.2 In-Reply-To: <20191118133816.3963-1-idryomov@gmail.com> References: <20191118133816.3963-1-idryomov@gmail.com> MIME-Version: 1.0 Sender: ceph-devel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: ceph-devel@vger.kernel.org Since infernalis, ceph.git commit 281f87f9ee52 ("cls_rbd: get_features on snapshots returns HEAD image features"), querying and checking that is pointless. Userspace support for manipulating image features after image creation came also in infernalis, so a snapshot with a different set of features wasn't ever possible. Signed-off-by: Ilya Dryomov Reviewed-by: Dongsheng Yang --- drivers/block/rbd.c | 38 +------------------------------------- 1 file changed, 1 insertion(+), 37 deletions(-) diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c index aba60e37b058..935b66808e40 100644 --- a/drivers/block/rbd.c +++ b/drivers/block/rbd.c @@ -377,7 +377,6 @@ struct rbd_client_id { struct rbd_mapping { u64 size; - u64 features; }; /* @@ -644,8 +643,6 @@ static const char *rbd_dev_v2_snap_name(struct rbd_device *rbd_dev, u64 snap_id); static int _rbd_dev_v2_snap_size(struct rbd_device *rbd_dev, u64 snap_id, u8 *order, u64 *snap_size); -static int _rbd_dev_v2_snap_features(struct rbd_device *rbd_dev, u64 snap_id, - u64 *snap_features); static int rbd_dev_v2_get_flags(struct rbd_device *rbd_dev); static void rbd_obj_handle_request(struct rbd_obj_request *obj_req, int result); @@ -1303,51 +1300,23 @@ static int rbd_snap_size(struct rbd_device *rbd_dev, u64 snap_id, return 0; } -static int rbd_snap_features(struct rbd_device *rbd_dev, u64 snap_id, - u64 *snap_features) -{ - rbd_assert(rbd_image_format_valid(rbd_dev->image_format)); - if (snap_id == CEPH_NOSNAP) { - *snap_features = rbd_dev->header.features; - } else if (rbd_dev->image_format == 1) { - *snap_features = 0; /* No features for format 1 */ - } else { - u64 features = 0; - int ret; - - ret = _rbd_dev_v2_snap_features(rbd_dev, snap_id, &features); - if (ret) - return ret; - - *snap_features = features; - } - return 0; -} - static int rbd_dev_mapping_set(struct rbd_device *rbd_dev) { u64 snap_id = rbd_dev->spec->snap_id; u64 size = 0; - u64 features = 0; int ret; ret = rbd_snap_size(rbd_dev, snap_id, &size); - if (ret) - return ret; - ret = rbd_snap_features(rbd_dev, snap_id, &features); if (ret) return ret; rbd_dev->mapping.size = size; - rbd_dev->mapping.features = features; - return 0; } static void rbd_dev_mapping_clear(struct rbd_device *rbd_dev) { rbd_dev->mapping.size = 0; - rbd_dev->mapping.features = 0; } static void zero_bvec(struct bio_vec *bv) @@ -5190,17 +5159,12 @@ static ssize_t rbd_size_show(struct device *dev, (unsigned long long)rbd_dev->mapping.size); } -/* - * Note this shows the features for whatever's mapped, which is not - * necessarily the base image. - */ static ssize_t rbd_features_show(struct device *dev, struct device_attribute *attr, char *buf) { struct rbd_device *rbd_dev = dev_to_rbd_dev(dev); - return sprintf(buf, "0x%016llx\n", - (unsigned long long)rbd_dev->mapping.features); + return sprintf(buf, "0x%016llx\n", rbd_dev->header.features); } static ssize_t rbd_major_show(struct device *dev, From patchwork Mon Nov 18 13:38:16 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ilya Dryomov X-Patchwork-Id: 11249761 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 9781A1593 for ; Mon, 18 Nov 2019 13:38:41 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 77A8020726 for ; Mon, 18 Nov 2019 13:38:41 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="pmCjHdy3" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727164AbfKRNik (ORCPT ); Mon, 18 Nov 2019 08:38:40 -0500 Received: from mail-wr1-f67.google.com ([209.85.221.67]:45340 "EHLO mail-wr1-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727151AbfKRNij (ORCPT ); Mon, 18 Nov 2019 08:38:39 -0500 Received: by mail-wr1-f67.google.com with SMTP id z10so19491399wrs.12 for ; Mon, 18 Nov 2019 05:38:37 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=9Oc+58vsWsnrZXoHwoX4dmW9FbrC0g6lB0P1EQYRzOM=; b=pmCjHdy3vRKjomMy6hw7Du4unRlx6J/hteQyl2uonXpoG9LWsdsMiznxi/6oTSCyOV s+je24G2G9wLL5z9tbVN4fK2HW0esaZwjX41TJpxwxF7vLQO1JGSPnKxTfTUAm4Obfi5 zQUdLwyMxhf/vudM/8PJCGOEW5mreVUom0vAGaIX4WnZ/YA5Lx5CnlXSS1bsm/X/GpMF M28ehpUaaN2mHJFMAmsJ0RXGFze0i9AKkdlwQDFqi5+myzwanQjMLvfJWHMGykmg0iI9 KS8T0Zzvu2jl729tFqMLKY0WdLo42B4veYcJnxBYXEUEg6f3WrKk9Q3wGVp1MgkzfhKe Mhug== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=9Oc+58vsWsnrZXoHwoX4dmW9FbrC0g6lB0P1EQYRzOM=; b=lzPhi+67Cd6RHX/hTZ/mMVUtPWOlrHC8pvBfFoUlaiAk8jsbenRbKPXC+65tWZwQJM g0aR+8twB6II1UphMTeibNnxJVnGAzvIJQCzXb99TzA9rpxWIzbHei36NCUbFQv3UfCF Vn3SruhG8w1DIaaSOBN61Rr9JCBIl1erxn+EYz5z+aT7FH9/czfjQMCpbge7nfCRB9l5 Xk3VVjEVSLvxMhPisZCoJR68qG/o0jizPmlxmOqQWuF+mUkLhOpZqXOKqTglHYbkiwHY dWW9BHVyIGPrzPX8l/XmFssxZE0Nd7c87n63hq2ShhJMgGRjKgtuK7oQQUh8RHyGIXqr hxvA== X-Gm-Message-State: APjAAAX/XyfkyvkfwkkCKq+Aqh6Wdfw5RcCdRUjjhsgJhVWK9wxFGRaU CThOxZhUQG1+x5X14d9UnydB9lC7 X-Google-Smtp-Source: APXvYqyPqBuhFDY1S6VPZXfJBFTfmMehw5+uI/k8A4mxnhIfh/YL1JcLxApDWgjWgvhEJ5CL6plA/A== X-Received: by 2002:adf:fa4a:: with SMTP id y10mr21389379wrr.177.1574084317015; Mon, 18 Nov 2019 05:38:37 -0800 (PST) Received: from kwango.local (ip-94-112-128-92.net.upcbroadband.cz. [94.112.128.92]) by smtp.gmail.com with ESMTPSA id t133sm24670242wmb.1.2019.11.18.05.38.36 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 18 Nov 2019 05:38:36 -0800 (PST) From: Ilya Dryomov To: ceph-devel@vger.kernel.org Subject: [PATCH 9/9] rbd: ask for a weaker incompat mask for read-only mappings Date: Mon, 18 Nov 2019 14:38:16 +0100 Message-Id: <20191118133816.3963-10-idryomov@gmail.com> X-Mailer: git-send-email 2.19.2 In-Reply-To: <20191118133816.3963-1-idryomov@gmail.com> References: <20191118133816.3963-1-idryomov@gmail.com> MIME-Version: 1.0 Sender: ceph-devel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: ceph-devel@vger.kernel.org For a read-only mapping, ask for a set of features that make the image only unreadable, rather than both unreadable and unwritable by a client that doesn't understand them. As of today, the difference between them for krbd is journaling (JOURNALING) and live migration (MIGRATING). get_features method supports read_only parameter since hammer, ceph.git commit 6176ec5fde2a ("librbd: differentiate between R/O vs R/W RBD features"). Signed-off-by: Ilya Dryomov Reviewed-by: Dongsheng Yang --- drivers/block/rbd.c | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c index 935b66808e40..b3167247c90a 100644 --- a/drivers/block/rbd.c +++ b/drivers/block/rbd.c @@ -5652,9 +5652,12 @@ static int rbd_dev_v2_object_prefix(struct rbd_device *rbd_dev) } static int _rbd_dev_v2_snap_features(struct rbd_device *rbd_dev, u64 snap_id, - u64 *snap_features) + bool read_only, u64 *snap_features) { - __le64 snapid = cpu_to_le64(snap_id); + struct { + __le64 snap_id; + u8 read_only; + } features_in; struct { __le64 features; __le64 incompat; @@ -5662,9 +5665,12 @@ static int _rbd_dev_v2_snap_features(struct rbd_device *rbd_dev, u64 snap_id, u64 unsup; int ret; + features_in.snap_id = cpu_to_le64(snap_id); + features_in.read_only = read_only; + ret = rbd_obj_method_sync(rbd_dev, &rbd_dev->header_oid, &rbd_dev->header_oloc, "get_features", - &snapid, sizeof(snapid), + &features_in, sizeof(features_in), &features_buf, sizeof(features_buf)); dout("%s: rbd_obj_method_sync returned %d\n", __func__, ret); if (ret < 0) @@ -5692,7 +5698,8 @@ static int _rbd_dev_v2_snap_features(struct rbd_device *rbd_dev, u64 snap_id, static int rbd_dev_v2_features(struct rbd_device *rbd_dev) { return _rbd_dev_v2_snap_features(rbd_dev, CEPH_NOSNAP, - &rbd_dev->header.features); + rbd_is_ro(rbd_dev), + &rbd_dev->header.features); } /*