From: Sage Weil Date: Fri, 1 Mar 2013 02:08:51 +0000 (-0800) Subject: client: pass ptarget from link, create, mkdir, symlink, setattr X-Git-Tag: v0.60~121^2~12 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=80e122f5e8b959d60d9d48b0a9ceac577e22cba4;p=ceph.git client: pass ptarget from link, create, mkdir, symlink, setattr Use the new make_request functionality to ensure that we properly handle the re-lookup/getattr when we get a traceless reply back from the MDS. Note that we have to do this on setattr() because ll_getattr() expects to return the updated inode metadata to the caller. Signed-off-by: Sage Weil --- diff --git a/src/client/Client.cc b/src/client/Client.cc index 7be7b76b4b48..b3bea7adcbcd 100644 --- a/src/client/Client.cc +++ b/src/client/Client.cc @@ -1155,9 +1155,9 @@ void Client::dump_mds_requests(Formatter *f) * @param uid uid to execute as * @param gid gid to execute as * @param ptarget [optional] address to store a pointer to the target inode we want to create or operate on - * @param pcreated [optional] where to store a bool of whether our create atomically created a file + * @param pcreated [optional; required if ptarget] where to store a bool of whether our create atomically created a file * @param use_mds [optional] prefer a specific mds (-1 for default) - * @param pdirbl [optional] where to pass extra reply payload to the caller + * @param pdirbl [optional; disallowed if ptarget] where to pass extra reply payload to the caller */ int Client::make_request(MetaRequest *request, int uid, int gid, @@ -4267,7 +4267,7 @@ int Client::_getattr(Inode *in, int mask, int uid, int gid, bool force) return res; } -int Client::_setattr(Inode *in, struct stat *attr, int mask, int uid, int gid) +int Client::_setattr(Inode *in, struct stat *attr, int mask, int uid, int gid, Inode **inp) { int issued = in->caps_issued(); @@ -4369,7 +4369,9 @@ int Client::_setattr(Inode *in, struct stat *attr, int mask, int uid, int gid) } req->head.args.setattr.mask = mask; - int res = make_request(req, uid, gid); + req->regetattr_mask = mask; + + int res = make_request(req, uid, gid, inp); ldout(cct, 10) << "_setattr result=" << res << dendl; return res; } @@ -6513,9 +6515,12 @@ int Client::ll_setattr(vinodeno_t vino, struct stat *attr, int mask, int uid, in tout(cct) << mask << std::endl; Inode *in = _ll_get_inode(vino); - int res = _setattr(in, attr, mask, uid, gid); - if (res == 0) + Inode *target = in; + int res = _setattr(in, attr, mask, uid, gid, &target); + if (res == 0) { + assert(in == target); fill_stat(in, attr); + } ldout(cct, 3) << "ll_setattr " << vino << " = " << res << dendl; return res; } @@ -6849,7 +6854,7 @@ int Client::ll_readlink(vinodeno_t vino, const char **value, int uid, int gid) return r; } -int Client::_mknod(Inode *dir, const char *name, mode_t mode, dev_t rdev, int uid, int gid) +int Client::_mknod(Inode *dir, const char *name, mode_t mode, dev_t rdev, int uid, int gid, Inode **inp) { ldout(cct, 3) << "_mknod(" << dir->ino << " " << name << ", 0" << oct << mode << dec << ", " << rdev << ", uid " << uid << ", gid " << gid << ")" << dendl; @@ -6877,7 +6882,7 @@ int Client::_mknod(Inode *dir, const char *name, mode_t mode, dev_t rdev, int ui if (res < 0) goto fail; - res = make_request(req, uid, gid); + res = make_request(req, uid, gid, inp); trim_cache(); @@ -6900,11 +6905,9 @@ int Client::ll_mknod(vinodeno_t parent, const char *name, mode_t mode, dev_t rde tout(cct) << rdev << std::endl; Inode *diri = _ll_get_inode(parent); - - int r = _mknod(diri, name, mode, rdev, uid, gid); + Inode *in = 0; + int r = _mknod(diri, name, mode, rdev, uid, gid, &in); if (r == 0) { - string dname(name); - Inode *in = diri->dir->dentries[dname]->inode; fill_stat(in, attr); _ll_get(in); } @@ -6983,7 +6986,8 @@ int Client::_create(Inode *dir, const char *name, int flags, mode_t mode, Inode } -int Client::_mkdir(Inode *dir, const char *name, mode_t mode, int uid, int gid) +int Client::_mkdir(Inode *dir, const char *name, mode_t mode, int uid, int gid, + Inode **inp) { ldout(cct, 3) << "_mkdir(" << dir->ino << " " << name << ", 0" << oct << mode << dec << ", uid " << uid << ", gid " << gid << ")" << dendl; @@ -7010,7 +7014,7 @@ int Client::_mkdir(Inode *dir, const char *name, mode_t mode, int uid, int gid) goto fail; ldout(cct, 10) << "_mkdir: making request" << dendl; - res = make_request(req, uid, gid); + res = make_request(req, uid, gid, inp); ldout(cct, 10) << "_mkdir result is " << res << dendl; trim_cache(); @@ -7034,10 +7038,9 @@ int Client::ll_mkdir(vinodeno_t parent, const char *name, mode_t mode, struct st Inode *diri = _ll_get_inode(parent); - int r = _mkdir(diri, name, mode, uid, gid); + Inode *in = 0; + int r = _mkdir(diri, name, mode, uid, gid, &in); if (r == 0) { - string dname(name); - Inode *in = diri->dir->dentries[dname]->inode; fill_stat(in, attr); _ll_get(in); } @@ -7047,7 +7050,8 @@ int Client::ll_mkdir(vinodeno_t parent, const char *name, mode_t mode, struct st return r; } -int Client::_symlink(Inode *dir, const char *name, const char *target, int uid, int gid) +int Client::_symlink(Inode *dir, const char *name, const char *target, int uid, int gid, + Inode **inp) { ldout(cct, 3) << "_symlink(" << dir->ino << " " << name << ", " << target << ", uid " << uid << ", gid " << gid << ")" << dendl; @@ -7074,7 +7078,7 @@ int Client::_symlink(Inode *dir, const char *name, const char *target, int uid, if (res < 0) goto fail; - res = make_request(req, uid, gid); + res = make_request(req, uid, gid, inp); trim_cache(); ldout(cct, 3) << "_symlink(\"" << path << "\", \"" << target << "\") = " << res << dendl; @@ -7096,10 +7100,9 @@ int Client::ll_symlink(vinodeno_t parent, const char *name, const char *value, s tout(cct) << value << std::endl; Inode *diri = _ll_get_inode(parent); - int r = _symlink(diri, name, value, uid, gid); + Inode *in = 0; + int r = _symlink(diri, name, value, uid, gid, &in); if (r == 0) { - string dname(name); - Inode *in = diri->dir->dentries[dname]->inode; fill_stat(in, attr); _ll_get(in); } @@ -7295,7 +7298,7 @@ int Client::ll_rename(vinodeno_t parent, const char *name, vinodeno_t newparent, return _rename(fromdiri, name, todiri, newname, uid, gid); } -int Client::_link(Inode *in, Inode *dir, const char *newname, int uid, int gid) +int Client::_link(Inode *in, Inode *dir, const char *newname, int uid, int gid, Inode **inp) { ldout(cct, 3) << "_link(" << in->ino << " to " << dir->ino << " " << newname << " uid " << uid << " gid " << gid << ")" << dendl; @@ -7322,7 +7325,7 @@ int Client::_link(Inode *in, Inode *dir, const char *newname, int uid, int gid) if (res < 0) goto fail; - res = make_request(req, uid, gid); + res = make_request(req, uid, gid, inp); ldout(cct, 10) << "link result is " << res << dendl; trim_cache(); @@ -7346,7 +7349,7 @@ int Client::ll_link(vinodeno_t vino, vinodeno_t newparent, const char *newname, Inode *old = _ll_get_inode(vino); Inode *diri = _ll_get_inode(newparent); - int r = _link(old, diri, newname, uid, gid); + int r = _link(old, diri, newname, uid, gid, &old); if (r == 0) { Inode *in = _ll_get_inode(vino); fill_stat(in, attr); diff --git a/src/client/Client.h b/src/client/Client.h index 15aff6c35ad6..ba6bb7c4a5fa 100644 --- a/src/client/Client.h +++ b/src/client/Client.h @@ -524,14 +524,14 @@ private: int _do_lookup(Inode *dir, const char *name, Inode **target); int _lookup(Inode *dir, const string& dname, Inode **target); - int _link(Inode *in, Inode *dir, const char *name, int uid=-1, int gid=-1); + int _link(Inode *in, Inode *dir, const char *name, int uid=-1, int gid=-1, Inode **inp = 0); int _unlink(Inode *dir, const char *name, int uid=-1, int gid=-1); int _rename(Inode *olddir, const char *oname, Inode *ndir, const char *nname, int uid=-1, int gid=-1); - int _mkdir(Inode *dir, const char *name, mode_t mode, int uid=-1, int gid=-1); + int _mkdir(Inode *dir, const char *name, mode_t mode, int uid=-1, int gid=-1, Inode **inp = 0); int _rmdir(Inode *dir, const char *name, int uid=-1, int gid=-1); - int _symlink(Inode *dir, const char *name, const char *target, int uid=-1, int gid=-1); - int _mknod(Inode *dir, const char *name, mode_t mode, dev_t rdev, int uid=-1, int gid=-1); - int _setattr(Inode *in, struct stat *attr, int mask, int uid=-1, int gid=-1); + int _symlink(Inode *dir, const char *name, const char *target, int uid=-1, int gid=-1, Inode **inp = 0); + int _mknod(Inode *dir, const char *name, mode_t mode, dev_t rdev, int uid=-1, int gid=-1, Inode **inp = 0); + int _setattr(Inode *in, struct stat *attr, int mask, int uid=-1, int gid=-1, Inode **inp = 0); int _getattr(Inode *in, int mask, int uid=-1, int gid=-1, bool force=false); int _getxattr(Inode *in, const char *name, void *value, size_t len, int uid=-1, int gid=-1); int _listxattr(Inode *in, char *names, size_t len, int uid=-1, int gid=-1);