return _unlink(dir.get(), name.c_str(), perm);
}
-int Client::rename(const char *relfrom, const char *relto)
+int Client::rename(const char *relfrom, const char *relto, const UserPerm& perm)
{
Mutex::Locker lock(client_lock);
tout(cct) << "rename" << std::endl;
to.pop_dentry();
InodeRef fromdir, todir;
- int r = path_walk(from, &fromdir);
+ int r = path_walk(from, &fromdir, perm);
if (r < 0)
goto out;
- r = path_walk(to, &todir);
+ r = path_walk(to, &todir, perm);
if (r < 0)
goto out;
if (cct->_conf->client_permissions) {
- int r = may_delete(fromdir.get(), fromname.c_str());
+ int r = may_delete(fromdir.get(), fromname.c_str(), perm);
if (r < 0)
return r;
- r = may_delete(todir.get(), toname.c_str());
+ r = may_delete(todir.get(), toname.c_str(), perm);
if (r < 0 && r != -ENOENT)
return r;
}
- r = _rename(fromdir.get(), fromname.c_str(), todir.get(), toname.c_str());
+ r = _rename(fromdir.get(), fromname.c_str(), todir.get(), toname.c_str(), perm);
out:
return r;
}
return _rmdir(in, name, uid, gid);
}
-int Client::_rename(Inode *fromdir, const char *fromname, Inode *todir, const char *toname, int uid, int gid)
+int Client::_rename(Inode *fromdir, const char *fromname, Inode *todir, const char *toname, const UserPerm& perm)
{
- ldout(cct, 3) << "_rename(" << fromdir->ino << " " << fromname << " to " << todir->ino << " " << toname
- << " uid " << uid << " gid " << gid << ")" << dendl;
+ ldout(cct, 3) << "_rename(" << fromdir->ino << " " << fromname << " to "
+ << todir->ino << " " << toname
+ << " uid " << perm.uid() << " gid " << perm.gid() << ")"
+ << dendl;
if (fromdir->snapid != todir->snapid)
return -EXDEV;
req->dentry_unless = CEPH_CAP_FILE_EXCL;
InodeRef oldin, otherin;
- res = _lookup(fromdir, fromname, 0, &oldin, uid, gid);
+ res = _lookup(fromdir, fromname, 0, &oldin, perm);
if (res < 0)
goto fail;
req->set_old_inode(oldin.get());
req->old_inode_drop = CEPH_CAP_LINK_SHARED;
- res = _lookup(todir, toname, 0, &otherin, uid, gid);
+ res = _lookup(todir, toname, 0, &otherin, perm);
if (res != 0 && res != -ENOENT) {
goto fail;
} else if (res == 0) {
unlink(de, true, true);
}
- res = make_request(req, uid, gid, &target);
+ res = make_request(req, perm, &target);
ldout(cct, 10) << "rename result is " << res << dendl;
// renamed item from our cache
}
int Client::ll_rename(Inode *parent, const char *name, Inode *newparent,
- const char *newname, int uid, int gid)
+ const char *newname, const UserPerm& perm)
{
Mutex::Locker lock(client_lock);
tout(cct) << newname << std::endl;
if (!cct->_conf->fuse_default_permissions) {
- int r = may_delete(parent, name, uid, gid);
+ int r = may_delete(parent, name, perm);
if (r < 0)
return r;
- r = may_delete(newparent, newname, uid, gid);
+ r = may_delete(newparent, newname, perm);
if (r < 0 && r != -ENOENT)
return r;
}
- return _rename(parent, name, newparent, newname, uid, gid);
+ return _rename(parent, name, newparent, newname, perm);
}
int Client::_link(Inode *in, Inode *dir, const char *newname, const UserPerm& perm, InodeRef *inp)
int _link(Inode *in, Inode *dir, const char *name, const UserPerm& perm,
InodeRef *inp = 0);
int _unlink(Inode *dir, const char *name, const UserPerm& perm);
- int _rename(Inode *olddir, const char *oname, Inode *ndir, const char *nname, int uid=-1, int gid=-1);
+ int _rename(Inode *olddir, const char *oname, Inode *ndir, const char *nname, const UserPerm& perm);
int _mkdir(Inode *dir, const char *name, mode_t mode, int uid=-1, int gid=-1, InodeRef *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, InodeRef *inp = 0);
int link(const char *existing, const char *newname, const UserPerm& perm);
int unlink(const char *path, const UserPerm& perm);
- int rename(const char *from, const char *to);
+ int rename(const char *from, const char *to, const UserPerm& perm);
// dirs
int mkdir(const char *path, mode_t mode);
int ll_unlink(Inode *in, const char *name, const UserPerm& perm);
int ll_rmdir(Inode *in, const char *name, int uid = -1, int gid = -1);
int ll_rename(Inode *parent, const char *name, Inode *newparent,
- const char *newname, int uid = -1, int gid = -1);
+ const char *newname, const UserPerm& perm);
int ll_link(Inode *in, Inode *newparent, const char *newname,
struct stat *attr, const UserPerm& perm);
int ll_open(Inode *in, int flags, Fh **fh, int uid = -1, int gid = -1);
} else if (strcmp(op, "rename") == 0) {
const char *a = t.get_string(buf, p);
const char *b = t.get_string(buf2, p);
- client->rename(a,b);
+ client->rename(a,b, perms);
} else if (strcmp(op, "mkdir") == 0) {
const char *a = t.get_string(buf, p);
int64_t b = t.get_int();
ll_inos.count(ni)) {
i1 = client->ll_get_inode(vinodeno_t(ll_inos[i],CEPH_NOSNAP));
i2 = client->ll_get_inode(vinodeno_t(ll_inos[ni],CEPH_NOSNAP));
- client->ll_rename(i1, n, i2, nn);
+ client->ll_rename(i1, n, i2, nn, perms);
client->ll_put(i1);
client->ll_put(i2);
}
if (contents.empty())
op = CEPH_MDS_OP_READDIR;
else {
- r = client->rename( get_random_sub(), make_sub("ren") );
+ r = client->rename(get_random_sub(), make_sub("ren"), perms);
}
}
char dst[80];
snprintf(src, sizeof(src), "syn.0.0/dir.%d/dir.%d/file.%d", a, b, c);
snprintf(dst, sizeof(dst), "syn.0.0/dir.%d/dir.%d/file.%d", d, e, f);
- client->rename(src, dst);
+ client->rename(src, dst, perms);
}
return;
}
// rename fun
client->mknod("p1", 0644);
client->mknod("p2", 0644);
- client->rename("p1","p2");
+ client->rename("p1","p2", perms);
client->mknod("p3", 0644);
- client->rename("p3","p4");
+ client->rename("p3","p4", perms);
// check dest dir ambiguity thing
client->mkdir("dir1", 0755);
client->mkdir("dir2", 0755);
- client->rename("p2","dir1/p2");
- client->rename("dir1/p2","dir2/p2");
- client->rename("dir2/p2","/p2");
+ client->rename("p2", "dir1/p2", perms);
+ client->rename("dir1/p2", "dir2/p2", perms);
+ client->rename("dir2/p2", "/p2", perms);
// check primary+remote link merging
client->link("p2","p2.l", perms);
client->link("p4","p4.l", perms);
- client->rename("p2.l","p2");
- client->rename("p4","p4.l");
+ client->rename("p2.l", "p2", perms);
+ client->rename("p4", "p4.l", perms);
// check anchor updates
client->mknod("dir1/a", 0644);
client->link("dir1/a", "da1", perms);
client->link("dir1/a", "da2", perms);
client->link("da2","da3", perms);
- client->rename("dir1/a","dir2/a");
- client->rename("dir2/a","da2");
- client->rename("da1","da2");
- client->rename("da2","da3");
+ client->rename("dir1/a", "dir2/a", perms);
+ client->rename("dir2/a", "da2", perms);
+ client->rename("da1", "da2", perms);
+ client->rename("da2", "da3", perms);
// check directory renames
client->mkdir("dir3", 0755);
client->mkdir("dir4", 0755);
client->mkdir("dir5", 0755);
client->mknod("dir5/asdf", 0644);
- client->rename("dir3","dir4"); // ok
- client->rename("dir4","dir5"); // fail
+ client->rename("dir3", "dir4", perms); // ok
+ client->rename("dir4", "dir5", perms); // fail
}
int SyntheticClient::thrash_links(const char *basedir, int dirs, int files, int depth, int n)
}
}
- if (client->rename(dst.c_str(), "/tmp") == 0) {
- client->rename(src.c_str(), dst.c_str());
- client->rename("/tmp", src.c_str());
+ if (client->rename(dst.c_str(), "/tmp", perms) == 0) {
+ client->rename(src.c_str(), dst.c_str(), perms);
+ client->rename("/tmp", src.c_str(), perms);
}
continue;
}
switch (o) {
case 0:
client->mknod(src.c_str(), 0755);
- if (renames) client->rename(src.c_str(), dst.c_str());
+ if (renames) client->rename(src.c_str(), dst.c_str(), perms);
break;
case 1:
client->mknod(src.c_str(), 0755);
const struct fuse_ctx *ctx = fuse_req_ctx(req);
Inode *in = cfuse->iget(parent);
Inode *nin = cfuse->iget(newparent);
+ UserPerm perm(ctx->uid, ctx->gid);
- int r = cfuse->client->ll_rename(in, name, nin, newname, ctx->uid, ctx->gid);
+ int r = cfuse->client->ll_rename(in, name, nin, newname, perm);
fuse_reply_err(req, -r);
cfuse->iput(in); // iputs required
{
if (!cmount->is_mounted())
return -ENOTCONN;
- return cmount->get_client()->rename(from, to);
+ UserPerm perms = cmount->get_client()->pick_my_perms();
+ return cmount->get_client()->rename(from, to, perms);
}
// dirs
Inode *newparent, const char *newname,
int uid, int gid)
{
- return (cmount->get_client()->ll_rename(parent, name, newparent, newname,
- uid, gid));
+ UserPerm perms(uid, gid);
+ return (cmount->get_client()->ll_rename(parent, name,
+ newparent, newname, perms));
}
extern "C" int ceph_ll_unlink(class ceph_mount_info *cmount,