]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
Merge pull request #42001 from mchangir/mds-implement-new-getvxattr-rpc
authorVenky Shankar <vshankar@redhat.com>
Mon, 7 Mar 2022 05:02:57 +0000 (10:32 +0530)
committerGitHub <noreply@github.com>
Mon, 7 Mar 2022 05:02:57 +0000 (10:32 +0530)
mds,client: add new getvxattr op

Reviewed-by: Venky Shankar <vshankar@redhat.com>
1  2 
src/client/Client.cc
src/client/Client.h
src/include/ceph_fs.h
src/mds/Server.cc
src/mds/Server.h

index 0c0f902fd73a9325e2fc6dc8a577f2da92dc27db,62641da537c6858110a4599948d9072b37a6c50f..24eb491348b415f72d82ab2df2511332417830b2
@@@ -7454,9 -7441,56 +7454,57 @@@ int Client::_getattr(Inode *in, int mas
    return res;
  }
  
+ int Client::_getvxattr(
+   Inode *in,
+   const UserPerm& perms,
+   const char *xattr_name,
+   ssize_t size,
+   void *value,
+   mds_rank_t rank)
+ {
+   if (!xattr_name || strlen(xattr_name) <= 0 || strlen(xattr_name) > 255) {
+     return -CEPHFS_ENODATA;
+   }
+   MetaRequest *req = new MetaRequest(CEPH_MDS_OP_GETVXATTR);
+   filepath path;
+   in->make_nosnap_relative_path(path);
+   req->set_filepath(path);
+   req->set_inode(in);
+   req->set_string2(xattr_name);
+   bufferlist bl;
+   int res = make_request(req, perms, nullptr, nullptr, rank, &bl);
+   ldout(cct, 10) << __func__ << " result=" << res << dendl;
+   if (res < 0) {
+     return res;
+   }
+   std::string buf;
+   auto p = bl.cbegin();
+   DECODE_START(1, p);
+   decode(buf, p);
+   DECODE_FINISH(p);
+   ssize_t len = buf.length();
+   res = len; // refer to man getxattr(2) for output buffer size == 0
+   if (size > 0) {
+     if (len > size) {
+       res = -CEPHFS_ERANGE; // insufficient output buffer space
+     } else {
+       memcpy(value, buf.c_str(), len);
+     }
+   }
+   return res;
+ }
  int Client::_do_setattr(Inode *in, struct ceph_statx *stx, int mask,
 -                      const UserPerm& perms, InodeRef *inp)
 +                      const UserPerm& perms, InodeRef *inp,
 +                      std::vector<uint8_t>* aux)
  {
    int issued = in->caps_issued();
    union ceph_mds_request_args args;
Simple merge
Simple merge
Simple merge
Simple merge