]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
os: getattr to bufferptr
authorSage Weil <sage@newdream.net>
Tue, 1 Jul 2008 21:51:27 +0000 (14:51 -0700)
committerSage Weil <sage@newdream.net>
Tue, 1 Jul 2008 21:51:27 +0000 (14:51 -0700)
src/ebofs/Ebofs.cc
src/ebofs/Ebofs.h
src/os/Fake.h
src/os/FileStore.cc
src/os/FileStore.h
src/os/ObjectStore.h

index 9a2ff7cb9761ccb8937bb8e505163581ab13bec5..245ae8e6f016263d1d959f4d9344d1875da6a653 100644 (file)
@@ -3245,6 +3245,13 @@ int Ebofs::getattr(coll_t cid, pobject_t oid, const char *name, void *value, siz
   ebofs_lock.Unlock();
   return r;
 }
+int Ebofs::getattr(coll_t cid, pobject_t oid, const char *name, bufferptr& bp)
+{
+  ebofs_lock.Lock();
+  int r = _getattr(oid, name, bp);
+  ebofs_lock.Unlock();
+  return r;
+}
 
 int Ebofs::_getattr(pobject_t oid, const char *name, void *value, size_t size)
 {
@@ -3257,7 +3264,7 @@ int Ebofs::_getattr(pobject_t oid, const char *name, void *value, size_t size)
   int r = 0;
   if (on->attr.count(n) == 0) {
     dout(10) << "_getattr " << oid << " '" << name << "' dne" << dendl;
-    r = -1;
+    r = -ENODATA;
   } else {
     r = MIN( on->attr[n].length(), size );
     dout(10) << "_getattr " << oid << " '" << name << "' got len " << r << dendl;
@@ -3266,6 +3273,26 @@ int Ebofs::_getattr(pobject_t oid, const char *name, void *value, size_t size)
   put_onode(on);
   return r;
 }
+int Ebofs::_getattr(pobject_t oid, const char *name, bufferptr& bp)
+{
+  dout(8) << "_getattr " << oid << " '" << name << "'" << dendl;
+
+  Onode *on = get_onode(oid);
+  if (!on) return -ENOENT;
+
+  string n(name);
+  int r = 0;
+  if (on->attr.count(n) == 0) {
+    dout(10) << "_getattr " << oid << " '" << name << "' dne" << dendl;
+    r = -ENODATA;
+  } else {
+    bp = on->attr[n];
+    r = bp.length();
+    dout(10) << "_getattr " << oid << " '" << name << "' got len " << r << dendl;
+  }
+  put_onode(on);
+  return r;
+}
 
 int Ebofs::getattrs(coll_t cid, pobject_t oid, map<string,bufferptr> &aset)
 {
index 945487ece4884dea6639cbff94132bff980e14b2..a387b65428e726b736d156c8e74c9be393c70e22 100644 (file)
@@ -279,6 +279,7 @@ protected:
   int setattr(coll_t cid, pobject_t oid, const char *name, const void *value, size_t size, Context *onsafe=0);
   int setattrs(coll_t cid, pobject_t oid, map<string,bufferptr>& attrset, Context *onsafe=0);
   int getattr(coll_t cid, pobject_t oid, const char *name, void *value, size_t size);
+  int getattr(coll_t cid, pobject_t oid, const char *name, bufferptr& bp);
   int getattrs(coll_t cid, pobject_t oid, map<string,bufferptr> &aset);
   int rmattr(coll_t cid, pobject_t oid, const char *name, Context *onsafe=0);
   int listattr(coll_t cid, pobject_t oid, vector<string>& attrs);
@@ -329,6 +330,7 @@ private:
   int _is_cached(pobject_t oid, __u64 off, size_t len);
   int _stat(pobject_t oid, struct stat *st);
   int _getattr(pobject_t oid, const char *name, void *value, size_t size);
+  int _getattr(pobject_t oid, const char *name, bufferptr& bp);
   int _getattrs(pobject_t oid, map<string,bufferptr> &aset);
   int _get_object_collections(pobject_t oid, set<coll_t>& ls);
 
index b0b68d5c9deca84304fdef9980d5edd6c976b52d..3ac968de109771821f83c1b13adea2e78db4522a 100644 (file)
@@ -130,7 +130,15 @@ class FakeAttrs {
         bl.copy(0, l, (char*)value);
         return l;
       }
-      return -1;
+      return -ENODATA;
+    }
+    int getattr(const char *name, bufferptr &bp) {
+      string n = name;
+      if (attrs.count(n)) {
+       bp = attrs[n];
+       return bp.length();
+      }
+      return -ENODATA;
     }
     int getattrs(map<string,bufferptr>& aset) {
       aset = attrs;
@@ -192,6 +200,12 @@ class FakeAttrs {
     faker_lock.Unlock();
     return r;
   }
+  int getattr(coll_t cid, pobject_t oid, const char *name, bufferptr& bp) {
+    faker_lock.Lock();
+    int r = fakeoattrs[oid].getattr(name, bp);
+    faker_lock.Unlock();
+    return r;
+  }
   int getattrs(coll_t cid, pobject_t oid, map<string,bufferptr>& aset) {
     faker_lock.Lock();
     int r = fakeoattrs[oid].getattrs(aset);
index db2cace557a415ac4794b682da7262f93eabca71..5f280bea2bb52814012ff73b39a1cf1a5f5f78de 100644 (file)
@@ -1158,7 +1158,7 @@ int FileStore::setattr(coll_t cid, pobject_t oid, const char *name,
   return r < 0 ? -errno:r;
 }
 
-int FileStore::setattrs(coll_t cid, pobject_t oid, map<string,bufferptr>& aset) 
+int FileStore::setattrs(coll_t cid, pobject_t oid, map<string,bufferptr>& aset, Context *onsafe
 {
   int r;
   if (fake_attrs) 
@@ -1180,7 +1180,9 @@ int FileStore::setattrs(coll_t cid, pobject_t oid, map<string,bufferptr>& aset)
     }
   }
   if (r >= 0)
-    journal_setattrs(cid, oid, aset, 0);
+    journal_setattrs(cid, oid, aset, onsafe);
+  else
+    delete onsafe;
   return r < 0 ? -errno:r;
 }
 
@@ -1201,6 +1203,27 @@ int FileStore::getattr(coll_t cid, pobject_t oid, const char *name,
   return r < 0 ? -errno:r;
 }
 
+int FileStore::getattr(coll_t cid, pobject_t oid, const char *name, bufferptr &bp)
+{
+  int r;
+  if (fake_attrs) 
+    r = attrs.getattr(cid, oid, name, bp);
+  else {
+    char fn[100];
+    get_coname(cid, oid, fn);
+    char n[40];
+    get_attrname(name, n);
+    r = do_getxattr(fn, n, 0, 0);
+    if (r > 0) {
+      bp = buffer::create(r);
+      r = do_getxattr(fn, n, bp.c_str(), r);
+      if (r > 0) bp.set_length(r);
+    }
+    dout(10) << "getattr " << cid << " " << oid << " '" << name << "' size " << bp.length() << " = " << r << dendl;
+  }
+  return r < 0 ? -errno:r;
+}
+
 int FileStore::getattrs(coll_t cid, pobject_t oid, map<string,bufferptr>& aset) 
 {
   int r;
index 4626d61e57c94a74dc6eb3b70618dc917ec909e2..f8921c1973e7d95ecde9be97919645f5fb4722ad 100644 (file)
@@ -112,8 +112,9 @@ class FileStore : public JournalingObjectStore {
 
   // attrs
   int setattr(coll_t cid, pobject_t oid, const char *name, const void *value, size_t size, Context *onsafe=0);
-  int setattrs(coll_t cid, pobject_t oid, map<string,bufferptr>& aset);
+  int setattrs(coll_t cid, pobject_t oid, map<string,bufferptr>& aset, Context *onsafe=0);
   int getattr(coll_t cid, pobject_t oid, const char *name, void *value, size_t size);
+  int getattr(coll_t cid, pobject_t oid, const char *name, bufferptr &bp);
   int getattrs(coll_t cid, pobject_t oid, map<string,bufferptr>& aset);
   int rmattr(coll_t cid, pobject_t oid, const char *name, Context *onsafe=0);
 
index f6a7e2a4fbd33d8bfb202f48a66421998eed3910..0012c94c90501e938b32d895b873b3475c206e1b 100644 (file)
@@ -563,13 +563,13 @@ public:
   virtual void trim_from_cache(coll_t cid, pobject_t oid, __u64 offset, size_t len) = 0; //{ }
   virtual int is_cached(coll_t cid, pobject_t oid, __u64 offset, size_t len) = 0;  //{ return -1; }
 
-  virtual int setattr(coll_t cid, pobject_t oid, const char *name,
-                      const void *value, size_t size,
-                      Context *onsafe=0) {return 0;} //= 0;
-  virtual int setattrs(coll_t cid, pobject_t oid, map<string,bufferptr>& aset,
-                      Context *onsafe=0) {return 0;} //= 0;
-  virtual int getattr(coll_t cid, pobject_t oid, const char *name,
-                      void *value, size_t size) {return 0;} //= 0;
+  virtual int setattr(coll_t cid, pobject_t oid, const char *name, const void *value, size_t size, Context *onsafe=0) = 0;
+  virtual int setattr(coll_t cid, pobject_t oid, const char *name, const bufferptr &bp, Context *onsafe=0) {
+    return setattr(cid, oid, name, bp.c_str(), bp.length(), onsafe);
+  }
+  virtual int setattrs(coll_t cid, pobject_t oid, map<string,bufferptr>& aset, Context *onsafe=0) = 0;
+  virtual int getattr(coll_t cid, pobject_t oid, const char *name, void *value, size_t size) = 0;
+  virtual int getattr(coll_t cid, pobject_t oid, const char *name, bufferptr& value) = 0;
   virtual int getattrs(coll_t cid, pobject_t oid, map<string,bufferptr>& aset) {return 0;};
 
   virtual int rmattr(coll_t cid, pobject_t oid, const char *name,