if (!o)
return -ENOENT;
string k(name);
+ std::lock_guard<std::mutex> lock(o->xattr_mutex);
if (!o->xattr.count(k)) {
return -ENODATA;
}
ObjectRef o = c->get_object(oid);
if (!o)
return -ENOENT;
+ std::lock_guard<std::mutex> lock(o->xattr_mutex);
aset = o->xattr;
return 0;
}
ObjectRef o = c->get_object(oid);
if (!o)
return -ENOENT;
+ std::lock_guard<std::mutex> lock(o->xattr_mutex);
for (map<string,bufferptr>::const_iterator p = aset.begin(); p != aset.end(); ++p)
o->xattr[p->first] = p->second;
return 0;
ObjectRef o = c->get_object(oid);
if (!o)
return -ENOENT;
- if (!o->xattr.count(name))
+ std::lock_guard<std::mutex> lock(o->xattr_mutex);
+ auto i = o->xattr.find(name);
+ if (i == o->xattr.end())
return -ENODATA;
- o->xattr.erase(name);
+ o->xattr.erase(i);
return 0;
}
ObjectRef o = c->get_object(oid);
if (!o)
return -ENOENT;
+ std::lock_guard<std::mutex> lock(o->xattr_mutex);
o->xattr.clear();
return 0;
}
used_bytes += oo->get_size() - no->get_size();
no->clone(oo.get(), 0, oo->get_size(), 0);
- // take both omap locks with std::lock()
- std::unique_lock<std::mutex> oo_lock(oo->omap_mutex, std::defer_lock),
+ // take xattr and omap locks with std::lock()
+ std::unique_lock<std::mutex>
+ ox_lock(oo->xattr_mutex, std::defer_lock),
+ nx_lock(no->xattr_mutex, std::defer_lock),
+ oo_lock(oo->omap_mutex, std::defer_lock),
no_lock(no->omap_mutex, std::defer_lock);
- std::lock(oo_lock, no_lock);
+ std::lock(ox_lock, nx_lock, oo_lock, no_lock);
no->omap_header = oo->omap_header;
no->omap = oo->omap;