]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
client: pass ptarget from link, create, mkdir, symlink, setattr
authorSage Weil <sage@inktank.com>
Fri, 1 Mar 2013 02:08:51 +0000 (18:08 -0800)
committerSage Weil <sage@inktank.com>
Fri, 8 Mar 2013 00:09:45 +0000 (16:09 -0800)
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 <sage@inktank.com>
src/client/Client.cc
src/client/Client.h

index 7be7b76b4b48ff415c49399a4c2afb27ea5aa700..b3bea7adcbcd5cfe0a06e4d11d186dd3d219305f 100644 (file)
@@ -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);
index 15aff6c35ad6a4ae8b14b069056249d7db66470f..ba6bb7c4a5fa95c18ce967ad12f6eec5581bb469 100644 (file)
@@ -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);