From patchwork Thu Jul 21 12:17:29 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Venky Shankar X-Patchwork-Id: 9241543 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 05223602F0 for ; Thu, 21 Jul 2016 12:17:49 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id EABF327C0B for ; Thu, 21 Jul 2016 12:17:48 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id DDA3C26242; Thu, 21 Jul 2016 12:17:48 +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.9 required=2.0 tests=BAYES_00,RCVD_IN_DNSWL_HI 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 7D75926242 for ; Thu, 21 Jul 2016 12:17:48 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752051AbcGUMRq (ORCPT ); Thu, 21 Jul 2016 08:17:46 -0400 Received: from mail-pf0-f172.google.com ([209.85.192.172]:35447 "EHLO mail-pf0-f172.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752038AbcGUMRp (ORCPT ); Thu, 21 Jul 2016 08:17:45 -0400 Received: by mail-pf0-f172.google.com with SMTP id x72so30025711pfd.2 for ; Thu, 21 Jul 2016 05:17:45 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=3ElXdX7nj0ZWCBWnf1zrNDoXQpCza6voJFgSj1Y2mvQ=; b=G/1fJl1I6qcYDmEiFFSTniPt9V08hX6VoSjGVSp0MACeSo9La9VML3ezDefV/05OW9 nTsfwAeepggtPv19ax9AmzO93WS6k/rnrAQ+vvV0C/0o+yz8pFOuqxiLrMmZQK8fJvUN aGRzcgEiw6TUGBKyT/HSTnbR5Bln/4HAozW09BirgsP7DUNm2I0oPsGd0TXDrgm3YTWq GVotmZ3kurcZlrfnRgAse3m7CTumDlMEewLGgwiXTdKJTpCmnf5SP+nfxbB8qi/jJcsn qtvptbGKoX25fGnYViDOtm8e5OaErZqSspn/aEXiH7zP2I2dfrH/IEc/1UKOji6bhhF3 nKBQ== X-Gm-Message-State: ALyK8tIUfOsBjDfysda4pL4jAipHMGx60aP5mEIZaz2k1iACbAmdK/Z3xBjBheQV0xJ/9kVT X-Received: by 10.98.112.196 with SMTP id l187mr72879512pfc.59.1469103465019; Thu, 21 Jul 2016 05:17:45 -0700 (PDT) Received: from octopus.ceph.octopus.net ([117.202.96.145]) by smtp.gmail.com with ESMTPSA id k29sm12025908pfb.2.2016.07.21.05.17.41 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Thu, 21 Jul 2016 05:17:43 -0700 (PDT) From: Venky Shankar To: ceph-devel@vger.kernel.org Cc: zyan@redhat.com Subject: [PATCH 1/2] ceph: introduce 'ceph.all' virtual xattr Date: Thu, 21 Jul 2016 17:47:29 +0530 Message-Id: <1469103450-5255-2-git-send-email-vshankar@redhat.com> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1469103450-5255-1-git-send-email-vshankar@redhat.com> References: <1469083758-2153-1-git-send-email-vshankar@redhat.com> <1469103450-5255-1-git-send-email-vshankar@redhat.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 As of now listing extended attributes result in ceph dump all of it's internal xattrs thereby confusing tools such as rsync and the likes. This functionality would be removed in the subsequent patch, but there needs to be a way to examine ceph's internal xattr. Remembering all internal xattrs is cumbersome and error prone, so, we provide a virtual xattr to fetch a list of ceph's internal xattr, obviously excluding itself. Signed-off-by: Venky Shankar --- fs/ceph/xattr.c | 56 +++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 55 insertions(+), 1 deletion(-) diff --git a/fs/ceph/xattr.c b/fs/ceph/xattr.c index 4870b29..019f784 100644 --- a/fs/ceph/xattr.c +++ b/fs/ceph/xattr.c @@ -204,7 +204,45 @@ static size_t ceph_vxattrcb_dir_rctime(struct ceph_inode_info *ci, char *val, (long)ci->i_rctime.tv_nsec); } +static struct ceph_vxattr *ceph_inode_vxattrs(struct inode *inode); +static size_t ceph_vxattrs_name_size(struct ceph_vxattr *vxattrs); +/* list all ceph internal xattrs */ +static size_t ceph_vxattrcb_list_all(struct ceph_inode_info *ci, char *val, + size_t size) +{ + struct inode *inode = &ci->vfs_inode; + struct ceph_vxattr *vxattr; + struct ceph_vxattr *vxattrs = ceph_inode_vxattrs(inode); + u32 len, namelen; + int err = 0; + + if (!vxattrs) + goto out; + + namelen = ceph_vxattrs_name_size(vxattrs); + + err = -ERANGE; + if (size && (namelen > size)) + goto out; + err = namelen; + if (size == 0) + goto out; + + /* fill up buffer with virtual xattrs */ + for (err = 0, vxattr = vxattrs; vxattr->name; vxattr++) { + if (!vxattr->hidden && !(vxattr->exists_cb + && !vxattr->exists_cb(ci))) { + len = snprintf(val + err, size - err, "%s", vxattr->name); + err += len + 1; + } + } + + out: + return err; +} + +#define CEPH_XATTR_LIST_INTERNAL XATTR_CEPH_PREFIX"all" #define CEPH_XATTR_NAME(_type, _name) XATTR_CEPH_PREFIX #_type "." #_name #define CEPH_XATTR_NAME2(_type, _name, _name2) \ XATTR_CEPH_PREFIX #_type "." #_name "." #_name2 @@ -224,7 +262,7 @@ static size_t ceph_vxattrcb_dir_rctime(struct ceph_inode_info *ci, char *val, .name_size = sizeof (CEPH_XATTR_NAME2(_type, _name, _field)), \ .getxattr_cb = ceph_vxattrcb_ ## _name ## _ ## _field, \ .readonly = false, \ - .hidden = true, \ + .hidden = false, \ .exists_cb = ceph_vxattrcb_layout_exists, \ } @@ -237,6 +275,14 @@ static struct ceph_vxattr ceph_dir_vxattrs[] = { .hidden = true, .exists_cb = ceph_vxattrcb_layout_exists, }, + { + .name = CEPH_XATTR_LIST_INTERNAL, + .name_size = sizeof(CEPH_XATTR_LIST_INTERNAL), + .getxattr_cb = ceph_vxattrcb_list_all, + .readonly = true, + .hidden = true, + .exists_cb = NULL, + }, XATTR_LAYOUT_FIELD(dir, layout, stripe_unit), XATTR_LAYOUT_FIELD(dir, layout, stripe_count), XATTR_LAYOUT_FIELD(dir, layout, object_size), @@ -264,6 +310,14 @@ static struct ceph_vxattr ceph_file_vxattrs[] = { .hidden = true, .exists_cb = ceph_vxattrcb_layout_exists, }, + { + .name = CEPH_XATTR_LIST_INTERNAL, + .name_size = sizeof(CEPH_XATTR_LIST_INTERNAL), + .getxattr_cb = ceph_vxattrcb_list_all, + .readonly = true, + .hidden = true, + .exists_cb = NULL, + }, XATTR_LAYOUT_FIELD(file, layout, stripe_unit), XATTR_LAYOUT_FIELD(file, layout, stripe_count), XATTR_LAYOUT_FIELD(file, layout, object_size),