]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
os/FileStore: add _fgetattr(), _fgetattrs() helpers
authorSage Weil <sage@inktank.com>
Sat, 27 Oct 2012 21:47:22 +0000 (14:47 -0700)
committerSage Weil <sage@inktank.com>
Mon, 5 Nov 2012 08:13:52 +0000 (00:13 -0800)
Introduce new fd-based getattr[s] helpers.

Signed-off-by: Sage Weil <sage@inktank.com>
src/os/FileStore.cc
src/os/FileStore.h

index cd41cf1d38487218415d81512de6a931962e2f5b..9f354507e0c41b8471c5b9f25403f17821566077 100644 (file)
@@ -3623,6 +3623,81 @@ int FileStore::snapshot(const string& name)
 // -------------------------------
 // attributes
 
+int FileStore::_fgetattr(int fd, const char *name, bufferptr& bp)
+{
+  char val[100];
+  int l = chain_fgetxattr(fd, name, val, sizeof(val));
+  if (l >= 0) {
+    bp = buffer::create(l);
+    memcpy(bp.c_str(), val, l);
+  } else if (l == -ERANGE) {
+    l = chain_fgetxattr(fd, name, 0, 0);
+    if (l > 0) {
+      bp = buffer::create(l);
+      l = chain_fgetxattr(fd, name, bp.c_str(), l);
+    }
+  }
+  assert(!m_filestore_fail_eio || l != -EIO);
+  return l;
+}
+
+int FileStore::_fgetattrs(int fd, map<string,bufferptr>& aset, bool user_only)
+{
+  // get attr list
+  char names1[100];
+  int len = chain_flistxattr(fd, names1, sizeof(names1)-1);
+  char *names2 = 0;
+  char *name = 0;
+  if (len == -ERANGE) {
+    len = chain_flistxattr(fd, 0, 0);
+    if (len < 0) {
+      assert(!m_filestore_fail_eio || len != -EIO);
+      return len;
+    }
+    dout(10) << " -ERANGE, len is " << len << dendl;
+    names2 = new char[len+1];
+    len = chain_flistxattr(fd, names2, len);
+    dout(10) << " -ERANGE, got " << len << dendl;
+    if (len < 0) {
+      assert(!m_filestore_fail_eio || len != -EIO);
+      return len;
+    }
+    name = names2;
+  } else if (len < 0) {
+    assert(!m_filestore_fail_eio || len != -EIO);
+    return len;
+  } else {
+    name = names1;
+  }
+  name[len] = 0;
+
+  char *end = name + len;
+  while (name < end) {
+    char *attrname = name;
+    if (parse_attrname(&name)) {
+      char *set_name = name;
+      bool can_get = true;
+      if (user_only) {
+       if (*set_name =='_')
+         set_name++;
+       else
+         can_get = false;
+      }
+      if (*set_name && can_get) {
+        dout(20) << "fgetattrs " << fd << " getting '" << name << "'" << dendl;
+        int r = _fgetattr(fd, attrname, aset[set_name]);
+        if (r < 0)
+         return r;
+      }
+    }
+    name += strlen(name) + 1;
+  }
+
+  delete[] names2;
+  return 0;
+}
+
+
 // low-level attr helpers
 int FileStore::_getattr(coll_t cid, const hobject_t& oid, const char *name, bufferptr& bp)
 {
index faa0cd04d52c78ebec69a0f8d9b315969fcfb170..2d14ed2482c3ada76d8dd7c1a045c39fd58906ce 100644 (file)
@@ -380,6 +380,9 @@ public:
   int _do_copy_range(int from, int to, uint64_t srcoff, uint64_t len, uint64_t dstoff);
   int _remove(coll_t cid, const hobject_t& oid, const SequencerPosition &spos);
 
+  int _fgetattr(int fd, const char *name, bufferptr& bp);
+  int _fgetattrs(int fd, map<string,bufferptr>& aset, bool user_only);
+
   void _start_sync();
 
   void start_sync();