From 9891cdc7e288a3cad5ce22d7b2cea97ea09c0d1a Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Tue, 1 Jul 2008 14:51:27 -0700 Subject: [PATCH] os: getattr to bufferptr --- src/ebofs/Ebofs.cc | 29 ++++++++++++++++++++++++++++- src/ebofs/Ebofs.h | 2 ++ src/os/Fake.h | 16 +++++++++++++++- src/os/FileStore.cc | 27 +++++++++++++++++++++++++-- src/os/FileStore.h | 3 ++- src/os/ObjectStore.h | 14 +++++++------- 6 files changed, 79 insertions(+), 12 deletions(-) diff --git a/src/ebofs/Ebofs.cc b/src/ebofs/Ebofs.cc index 9a2ff7cb9761c..245ae8e6f0162 100644 --- a/src/ebofs/Ebofs.cc +++ b/src/ebofs/Ebofs.cc @@ -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 &aset) { diff --git a/src/ebofs/Ebofs.h b/src/ebofs/Ebofs.h index 945487ece4884..a387b65428e72 100644 --- a/src/ebofs/Ebofs.h +++ b/src/ebofs/Ebofs.h @@ -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& 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 &aset); int rmattr(coll_t cid, pobject_t oid, const char *name, Context *onsafe=0); int listattr(coll_t cid, pobject_t oid, vector& 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 &aset); int _get_object_collections(pobject_t oid, set& ls); diff --git a/src/os/Fake.h b/src/os/Fake.h index b0b68d5c9deca..3ac968de10977 100644 --- a/src/os/Fake.h +++ b/src/os/Fake.h @@ -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& 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& aset) { faker_lock.Lock(); int r = fakeoattrs[oid].getattrs(aset); diff --git a/src/os/FileStore.cc b/src/os/FileStore.cc index db2cace557a41..5f280bea2bb52 100644 --- a/src/os/FileStore.cc +++ b/src/os/FileStore.cc @@ -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& aset) +int FileStore::setattrs(coll_t cid, pobject_t oid, map& aset, Context *onsafe) { int r; if (fake_attrs) @@ -1180,7 +1180,9 @@ int FileStore::setattrs(coll_t cid, pobject_t oid, map& 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& aset) { int r; diff --git a/src/os/FileStore.h b/src/os/FileStore.h index 4626d61e57c94..f8921c1973e7d 100644 --- a/src/os/FileStore.h +++ b/src/os/FileStore.h @@ -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& aset); + int setattrs(coll_t cid, pobject_t oid, map& 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& aset); int rmattr(coll_t cid, pobject_t oid, const char *name, Context *onsafe=0); diff --git a/src/os/ObjectStore.h b/src/os/ObjectStore.h index f6a7e2a4fbd33..0012c94c90501 100644 --- a/src/os/ObjectStore.h +++ b/src/os/ObjectStore.h @@ -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& 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& 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& aset) {return 0;}; virtual int rmattr(coll_t cid, pobject_t oid, const char *name, -- 2.39.5