Re: [PATCH 1/2] ceph: introduce 'ceph.all' virtual xattr

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 16-07-21 20:25:37, Yan, Zheng wrote:
> On Thu, Jul 21, 2016 at 8:17 PM, Venky Shankar <vshankar@xxxxxxxxxx> wrote:
> > 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 <vshankar@xxxxxxxxxx>
> > ---
> >  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),
> > --
> 
> ceph.dir.layout is still hidden?

I left that as hidden as ceph.all returns stripe_unit, count etc. (only keys)

Should we make ceph.dir.layout unhidden and hide stripe_unit etc as we get that from the layout itself?

> 
> 
> 
> > 2.1.4
> >
> > --
> > To unsubscribe from this list: send the line "unsubscribe ceph-devel" in
> > the body of a message to majordomo@xxxxxxxxxxxxxxx
> > More majordomo info at  http://vger.kernel.org/majordomo-info.html

-- 
Venky
#overclk [freenode, oftc]
--
To unsubscribe from this list: send the line "unsubscribe ceph-devel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [CEPH Users]     [Ceph Large]     [Information on CEPH]     [Linux BTRFS]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]
  Powered by Linux