* @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,
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();
}
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;
}
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;
}
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;
if (res < 0)
goto fail;
- res = make_request(req, uid, gid);
+ res = make_request(req, uid, gid, inp);
trim_cache();
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);
}
}
-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;
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();
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);
}
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;
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;
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);
}
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;
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();
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);
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);