From patchwork Fri Sep 7 21:13:37 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alex Elder X-Patchwork-Id: 1425141 Return-Path: X-Original-To: patchwork-ceph-devel@patchwork.kernel.org Delivered-To: patchwork-process-083081@patchwork1.kernel.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by patchwork1.kernel.org (Postfix) with ESMTP id 3F7233FC71 for ; Fri, 7 Sep 2012 21:13:41 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1757072Ab2IGVNk (ORCPT ); Fri, 7 Sep 2012 17:13:40 -0400 Received: from mail-iy0-f174.google.com ([209.85.210.174]:59251 "EHLO mail-iy0-f174.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1756189Ab2IGVNj (ORCPT ); Fri, 7 Sep 2012 17:13:39 -0400 Received: by mail-iy0-f174.google.com with SMTP id k25so21774iah.19 for ; Fri, 07 Sep 2012 14:13:39 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=message-id:date:from:user-agent:mime-version:to:subject:references :in-reply-to:content-type:content-transfer-encoding :x-gm-message-state; bh=yhEzsxFWKH/ArJ3w/jjxjS1/EJVemQycyn+fIO88m7o=; b=DzprHqwXi3yPf/FIbJ6v9RxZ/vp7QyYvUEzgS6kEQf3zPqmlgoq/khE5yx0XhLEm8v zCe12VAXvPM9Ce7yfg2M6vbwTdOqZxckV/bogtwMvG03gFxBR6dBp0QMlpyGyfiN3/zy okTWKN8CbozK9UeP66/ohwOhQS9eg907Ma0U9qG9dfJGViKP/u4KAhaODEnD6C+YS9BD chiW0mGKi5VmG32J6X/TPYkP/FtlduDzzJ6kEVvQCqzLrB6w8nH5rrdxN2XMsF3U7sUZ uIhIJimTqKLynwh6/E7d423aGtWOqBGGq1ItKA4LXLj6wl9IMMJWYUuWBw2OZXSW2mn4 s5qw== Received: by 10.42.129.207 with SMTP id r15mr8526659ics.42.1347052419372; Fri, 07 Sep 2012 14:13:39 -0700 (PDT) Received: from [172.22.22.4] (c-71-195-31-37.hsd1.mn.comcast.net. [71.195.31.37]) by mx.google.com with ESMTPS id ho1sm515150igc.3.2012.09.07.14.13.37 (version=SSLv3 cipher=OTHER); Fri, 07 Sep 2012 14:13:38 -0700 (PDT) Message-ID: <504A6381.30604@inktank.com> Date: Fri, 07 Sep 2012 16:13:37 -0500 From: Alex Elder User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:15.0) Gecko/20120827 Thunderbird/15.0 MIME-Version: 1.0 To: ceph-devel@vger.kernel.org Subject: [PATCH 3/9] rbd: get the object prefix for a v2 rbd image References: <504A6273.7030807@inktank.com> In-Reply-To: <504A6273.7030807@inktank.com> X-Gm-Message-State: ALoCoQlz7Kl36D5z2r5rrIex+CC5NW/EcgXfiAKHbVnKPAXQM8iKSidAOEDwjFj3fwJ5kkAUrHNA Sender: ceph-devel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: ceph-devel@vger.kernel.org The object prefix of an rbd format 2 image is fetched from the server using a "get_object_prefix" method. Signed-off-by: Alex Elder Reviewed-by: Josh Durgin --- drivers/block/rbd.c | 47 ++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 46 insertions(+), 1 deletion(-) * newly-received snapshot context. Remove any existing snapshots @@ -2690,6 +2727,12 @@ static int rbd_dev_v2_probe(struct rbd_device *rbd_dev) ret = rbd_dev_v2_image_size(rbd_dev); if (ret < 0) goto out_err; + + /* Get the object prefix (a.k.a. block_name) for the image */ + + ret = rbd_dev_v2_object_prefix(rbd_dev); + if (ret < 0) + goto out_err; rbd_dev->image_format = 2; dout("discovered version 2 image, header name is %s\n", @@ -2699,6 +2742,8 @@ static int rbd_dev_v2_probe(struct rbd_device *rbd_dev) out_err: kfree(rbd_dev->header_name); rbd_dev->header_name = NULL; + kfree(rbd_dev->header.object_prefix); + rbd_dev->header.object_prefix = NULL; return ret; } diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c index 24d12e3..36e848a 100644 --- a/drivers/block/rbd.c +++ b/drivers/block/rbd.c @@ -66,7 +66,8 @@ #define RBD_SNAP_HEAD_NAME "-" -#define RBD_IMAGE_ID_LEN_MAX 64 +#define RBD_IMAGE_ID_LEN_MAX 64 +#define RBD_OBJ_PREFIX_LEN_MAX 64 /* * An RBD device name will be "rbd#", where the "rbd" comes from @@ -2163,6 +2164,42 @@ static int rbd_dev_v2_image_size(struct rbd_device *rbd_dev) &rbd_dev->header.image_size); } +static int rbd_dev_v2_object_prefix(struct rbd_device *rbd_dev) +{ + void *reply_buf; + int ret; + void *p; + + reply_buf = kzalloc(RBD_OBJ_PREFIX_LEN_MAX, GFP_KERNEL); + if (!reply_buf) + return -ENOMEM; + + ret = rbd_req_sync_exec(rbd_dev, rbd_dev->header_name, + "rbd", "get_object_prefix", + NULL, 0, + reply_buf, RBD_OBJ_PREFIX_LEN_MAX, + CEPH_OSD_FLAG_READ, NULL); + dout("%s: rbd_req_sync_exec returned %d\n", __func__, ret); + if (ret < 0) + goto out; + + p = reply_buf; + rbd_dev->header.object_prefix = ceph_extract_encoded_string(&p, + p + RBD_OBJ_PREFIX_LEN_MAX, + NULL, GFP_NOIO); + + if (IS_ERR(rbd_dev->header.object_prefix)) { + ret = PTR_ERR(rbd_dev->header.object_prefix); + rbd_dev->header.object_prefix = NULL; + } else + dout(" object_prefix = %s\n", rbd_dev->header.object_prefix); + +out: + kfree(reply_buf); + + return ret; +} + /* * Scan the rbd device's current snapshot list and compare it to the