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)
{
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;
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)
{
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);
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);
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;
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);
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)
}
}
if (r >= 0)
- journal_setattrs(cid, oid, aset, 0);
+ journal_setattrs(cid, oid, aset, onsafe);
+ else
+ delete onsafe;
return r < 0 ? -errno:r;
}
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;
// 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);
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,