int Client::setxattr(const char *path, const char *name, const void *value,
size_t size, int flags, const UserPerm& perms)
{
+ _setxattr_maybe_wait_for_osdmap(name, value, size);
+
Mutex::Locker lock(client_lock);
InodeRef in;
int r = Client::path_walk(path, &in, perms, true);
int Client::lsetxattr(const char *path, const char *name, const void *value,
size_t size, int flags, const UserPerm& perms)
{
+ _setxattr_maybe_wait_for_osdmap(name, value, size);
+
Mutex::Locker lock(client_lock);
InodeRef in;
int r = Client::path_walk(path, &in, perms, false);
int Client::fsetxattr(int fd, const char *name, const void *value, size_t size,
int flags, const UserPerm& perms)
{
+ _setxattr_maybe_wait_for_osdmap(name, value, size);
+
Mutex::Locker lock(client_lock);
Fh *f = get_filehandle(fd);
if (!f)
return _setxattr(in.get(), name, value, size, flags, perms);
}
-int Client::check_data_pool_exist(string name, string value, const OSDMap *osdmap)
+int Client::_setxattr_check_data_pool(string& name, string& value, const OSDMap *osdmap)
{
string tmp;
if (name == "layout") {
return 0;
}
-int Client::ll_setxattr(Inode *in, const char *name, const void *value,
- size_t size, int flags, const UserPerm& perms)
+void Client::_setxattr_maybe_wait_for_osdmap(const char *name, const void *value, size_t size)
{
// For setting pool of layout, MetaRequest need osdmap epoch.
// There is a race which create a new data pool but client and mds both don't have.
// Make client got the latest osdmap which make mds quickly judge whether get newer osdmap.
- if (strcmp(name, "ceph.file.layout.pool") == 0 || strcmp(name, "ceph.dir.layout.pool") == 0 ||
+ if (strcmp(name, "ceph.file.layout.pool") == 0 || strcmp(name, "ceph.dir.layout.pool") == 0 ||
strcmp(name, "ceph.file.layout") == 0 || strcmp(name, "ceph.dir.layout") == 0) {
string rest(strstr(name, "layout"));
- string v((const char*)value);
+ string v((const char*)value, size);
int r = objecter->with_osdmap([&](const OSDMap& o) {
- return check_data_pool_exist(rest, v, &o);
+ return _setxattr_check_data_pool(rest, v, &o);
});
if (r == -ENOENT) {
ctx.wait();
}
}
+}
+
+int Client::ll_setxattr(Inode *in, const char *name, const void *value,
+ size_t size, int flags, const UserPerm& perms)
+{
+ _setxattr_maybe_wait_for_osdmap(name, value, size);
Mutex::Locker lock(client_lock);
int flags, const UserPerm& perms);
int _setxattr(InodeRef &in, const char *name, const void *value, size_t len,
int flags, const UserPerm& perms);
+ int _setxattr_check_data_pool(string& name, string& value, const OSDMap *osdmap);
+ void _setxattr_maybe_wait_for_osdmap(const char *name, const void *value, size_t len);
int _removexattr(Inode *in, const char *nm, const UserPerm& perms);
int _removexattr(InodeRef &in, const char *nm, const UserPerm& perms);
int _open(Inode *in, int flags, mode_t mode, Fh **fhp,
int _getattr_for_perm(Inode *in, const UserPerm& perms);
int _getgrouplist(gid_t **sgids, uid_t uid, gid_t gid);
- int check_data_pool_exist(string name, string value, const OSDMap *osdmap);
-
vinodeno_t _get_vino(Inode *in);
inodeno_t _get_inodeno(Inode *in);