]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
filestore: fix collection attrs
authorSage Weil <sage@newdream.net>
Thu, 9 Oct 2008 05:05:35 +0000 (22:05 -0700)
committerSage Weil <sage@newdream.net>
Thu, 9 Oct 2008 17:14:04 +0000 (10:14 -0700)
Need to prepend user.ceph. to attr names...

src/os/FileStore.cc
src/os/FileStore.h

index dfb8ee5c2637843fdfc75e3088e56d29c4017146..c639186deadc54547753e6acc6b20475ed3cbb00 100644 (file)
@@ -1554,7 +1554,9 @@ int FileStore::collection_getattr(coll_t c, const char *name,
   else {
     char fn[200];
     get_cdir(c, fn);
-    r = do_getxattr(fn, name, value, size);   
+    char n[200];
+    get_attrname(name, n);
+    r = do_getxattr(fn, n, value, size);   
   }
   return r < 0 ? -errno:r;
 }
@@ -1565,13 +1567,24 @@ int FileStore::collection_getattr(coll_t c, const char *name, bufferlist& bl)
   if (fake_attrs) 
     r = attrs.collection_getattr(c, name, bl);
   else {
-    char fn[200];
-    get_cdir(c, fn);
-    r = do_getxattr(fn, name, NULL, 0);
-    if (r > 0) {
-      bl.push_back(buffer::create(r));
-      r = do_getxattr(fn, name, bl.c_str(), r);
-    }
+    buffer::ptr bp;
+    r = collection_getattr(c, name, bp);
+    bl.push_back(bp);
+  }
+  return r;
+}
+
+int FileStore::collection_getattr(coll_t c, const char *name, buffer::ptr& bp)
+{
+  int r;
+  char fn[200];
+  get_cdir(c, fn);
+  char n[200];
+  get_attrname(name, n);
+  r = do_getxattr(fn, n, NULL, 0);
+  if (r > 0) {
+    bp = buffer::create(r);
+    r = do_getxattr(fn, n, bp.c_str(), r);
   }
   return r < 0 ? -errno:r;
 }
@@ -1585,19 +1598,14 @@ int FileStore::collection_getattrs(coll_t cid, map<string,bufferptr>& aset)
     char fn[100];
     get_cdir(cid, fn);
     
-    char val[1000];
     char names[1000];
     int num = do_listxattr(fn, names, 1000);
     
     char *name = names;
     for (int i=0; i<num; i++) {
       dout(0) << "getattrs " << cid << " getting " << (i+1) << "/" << num << " '" << names << "'" << dendl;
-      int l = do_getxattr(fn, name, val, 1000);
-      dout(0) << "getattrs " << cid << " getting " << (i+1) << "/" << num << " '" << names << "' = " << l << " bytes" << dendl;
-      if (parse_attrname(&name)) {
-       aset[name] = buffer::create(l);
-       memcpy(aset[name].c_str(), val, l);
-      }
+      if (parse_attrname(&name))
+       collection_getattr(cid, name, aset[name]);
       name += strlen(name) + 1;
     }
     r = 0;
@@ -1615,7 +1623,9 @@ int FileStore::_collection_setattr(coll_t c, const char *name,
   else {
     char fn[200];
     get_cdir(c, fn);
-    r = do_setxattr(fn, name, value, size);
+    char n[200];
+    get_attrname(name, n);
+    r = do_setxattr(fn, n, value, size);
   }
   return r < 0 ? -errno:r;
 }
@@ -1628,7 +1638,9 @@ int FileStore::_collection_rmattr(coll_t c, const char *name)
   else {
     char fn[200];
     get_cdir(c, fn);
-    r = do_removexattr(fn, name);
+    char n[200];
+    get_attrname(name, n);
+    r = do_removexattr(fn, n);
   }
   return r < 0 ? -errno:r;
 }
@@ -1646,7 +1658,9 @@ int FileStore::_collection_setattrs(coll_t cid, map<string,bufferptr>& aset)
     for (map<string,bufferptr>::iterator p = aset.begin();
         p != aset.end();
        ++p) {
-      r = do_setxattr(fn, p->first.c_str(), p->second.c_str(), p->second.length());
+      char n[200];
+      get_attrname(p->first.c_str(), n);
+      r = do_setxattr(fn, n, p->second.c_str(), p->second.length());
       if (r < 0) break;
     }
   }
@@ -1670,10 +1684,6 @@ int FileStore::list_collections(vector<coll_t>& ls)
 
   struct dirent *de;
   while ((de = ::readdir(dir)) != 0) {
-    // parse
-    if (strlen(de->d_name) != 16)
-      continue;
-    errno = 0;
     coll_t c;
     if (parse_coll(de->d_name, c))
       ls.push_back(c);
index 07da843e35a8486bc3551575c8b442406e765cd8..5295a2e9fd8836f5ebc1de7337a41a8fbfc805ca 100644 (file)
@@ -123,6 +123,7 @@ class FileStore : public JournalingObjectStore {
   int _rmattr(coll_t cid, pobject_t oid, const char *name);
 
   int collection_getattr(coll_t c, const char *name, void *value, size_t size);
+  int collection_getattr(coll_t c, const char *name, buffer::ptr& bp);
   int collection_getattr(coll_t c, const char *name, bufferlist& bl);
   int collection_getattrs(coll_t cid, map<string,bufferptr> &aset);