From patchwork Fri Sep 7 21:14:06 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alex Elder X-Patchwork-Id: 1425171 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 A77D73FC71 for ; Fri, 7 Sep 2012 21:14:10 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756930Ab2IGVOJ (ORCPT ); Fri, 7 Sep 2012 17:14:09 -0400 Received: from mail-ie0-f174.google.com ([209.85.223.174]:38161 "EHLO mail-ie0-f174.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1756453Ab2IGVOI (ORCPT ); Fri, 7 Sep 2012 17:14:08 -0400 Received: by mail-ie0-f174.google.com with SMTP id e11so40763iej.19 for ; Fri, 07 Sep 2012 14:14:08 -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=dPLUBPDWQG7AGBQ2ohV5asJD1ypYzOX3Xlb1BBpRQKo=; b=gnqFXKlXGSZtMHpjyOukaT12lREE3snGqkZXuiwBRMUORg1pcrM5eXsPslqKEMHWY5 xa54m9s98SaJlYxvNpAy5Z+FyE1QTSZqzcD9LKI1tp70plu3JPI1myPRCTPp0k3wpMA6 REyEeFMsJhkIUyHDjzXNn/1M0/Z9jGV/qBN9EoWkMJd/IKM558gSl1awtAxkBZJFOcrW KTzXv5qlGZzt2qp8s+MvwhVebuxVZ2qdKnezntum1WR2Ja+xJRC9mlESS116tjSOG/Sv QXH1go1Q0HcyO21OupyF1oQ/UwnuXSIi3qSOzDR7Y9cnKNITLrx1v2IMCQCWNRwHM7uO RUcA== Received: by 10.50.188.134 with SMTP id ga6mr530916igc.51.1347052448174; Fri, 07 Sep 2012 14:14:08 -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 p8sm455882igl.16.2012.09.07.14.14.06 (version=SSLv3 cipher=OTHER); Fri, 07 Sep 2012 14:14:07 -0700 (PDT) Message-ID: <504A639E.7080503@inktank.com> Date: Fri, 07 Sep 2012 16:14:06 -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 6/9] rbd: get snapshot name for a v2 image References: <504A6273.7030807@inktank.com> In-Reply-To: <504A6273.7030807@inktank.com> X-Gm-Message-State: ALoCoQlIW0x7SQD6fUt0s5setpTfbzujlRjyKMqg7qmpaoZTvVQE7jzCOI5t96tLOXSS4MBst+NV Sender: ceph-devel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: ceph-devel@vger.kernel.org Define rbd_dev_v2_snap_name() to fetch the name for a particular snapshot in a format 2 rbd image. Define rbd_dev_v2_snap_info() to to be a wrapper for getting the name, size, and features for a particular snapshot, using an interface that matches the equivalent function for version 1 images. Define rbd_dev_snap_info() wrapper function and use it to call the appropriate function for getting the snapshot name, size, and features, dependent on the rbd image format. Signed-off-by: Alex Elder Reviewed-by: Josh Durgin --- drivers/block/rbd.c | 78 ++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 77 insertions(+), 1 deletion(-) return PTR_ERR(snap_name); diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c index 8ff84fd..c6922a1 100644 --- a/drivers/block/rbd.c +++ b/drivers/block/rbd.c @@ -2313,6 +2313,82 @@ out: return 0; } +static char *rbd_dev_v2_snap_name(struct rbd_device *rbd_dev, u32 which) +{ + size_t size; + void *reply_buf; + __le64 snap_id; + int ret; + void *p; + void *end; + size_t snap_name_len; + char *snap_name; + + size = sizeof (__le32) + RBD_MAX_SNAP_NAME_LEN; + reply_buf = kmalloc(size, GFP_KERNEL); + if (!reply_buf) + return ERR_PTR(-ENOMEM); + + snap_id = cpu_to_le64(rbd_dev->header.snapc->snaps[which]); + ret = rbd_req_sync_exec(rbd_dev, rbd_dev->header_name, + "rbd", "get_snapshot_name", + (char *) &snap_id, sizeof (snap_id), + reply_buf, size, + CEPH_OSD_FLAG_READ, NULL); + dout("%s: rbd_req_sync_exec returned %d\n", __func__, ret); + if (ret < 0) + goto out; + + p = reply_buf; + end = (char *) reply_buf + size; + snap_name_len = 0; + snap_name = ceph_extract_encoded_string(&p, end, &snap_name_len, + GFP_KERNEL); + if (IS_ERR(snap_name)) { + ret = PTR_ERR(snap_name); + goto out; + } else + dout(" snap_id 0x%016llx snap_name = %s\n", + (unsigned long long) le64_to_cpu(snap_id), snap_name); + kfree(reply_buf); + + return snap_name; +out: + kfree(reply_buf); + + return ERR_PTR(ret); +} + +static char *rbd_dev_v2_snap_info(struct rbd_device *rbd_dev, u32 which, + u64 *snap_size, u64 *snap_features) +{ + __le64 snap_id; + u8 order; + int ret; + + snap_id = rbd_dev->header.snapc->snaps[which]; + ret = _rbd_dev_v2_snap_size(rbd_dev, snap_id, &order, snap_size); + if (ret) + return ERR_PTR(ret); + ret = _rbd_dev_v2_snap_features(rbd_dev, snap_id, snap_features); + if (ret) + return ERR_PTR(ret); + + return rbd_dev_v2_snap_name(rbd_dev, which); +} + +static char *rbd_dev_snap_info(struct rbd_device *rbd_dev, u32 which, + u64 *snap_size, u64 *snap_features) +{ + if (rbd_dev->image_format == 1) + return rbd_dev_v1_snap_info(rbd_dev, which, + snap_size, snap_features); + if (rbd_dev->image_format == 2) + return rbd_dev_v2_snap_info(rbd_dev, which, + snap_size, snap_features); + return ERR_PTR(-EINVAL); +} + /* * Scan the rbd device's current snapshot list and compare it to the * newly-received snapshot context. Remove any existing snapshots @@ -2366,7 +2442,7 @@ static int rbd_dev_snaps_update(struct rbd_device *rbd_dev) continue; } - snap_name = rbd_dev_v1_snap_info(rbd_dev, index, + snap_name = rbd_dev_snap_info(rbd_dev, index, &snap_size, &snap_features); if (IS_ERR(snap_name))