// dirs
-int Client::mkdir(const char *relpath, mode_t mode)
+int Client::mkdir(const char *relpath, mode_t mode, const UserPerm& perm)
{
Mutex::Locker lock(client_lock);
tout(cct) << "mkdir" << std::endl;
string name = path.last_dentry();
path.pop_dentry();
InodeRef dir;
- int r = path_walk(path, &dir);
+ int r = path_walk(path, &dir, perm);
if (r < 0)
return r;
if (cct->_conf->client_permissions) {
- r = may_create(dir.get());
+ r = may_create(dir.get(), perm);
if (r < 0)
return r;
}
- return _mkdir(dir.get(), name.c_str(), mode);
+ return _mkdir(dir.get(), name.c_str(), mode, perm);
}
int Client::mkdirs(const char *relpath, mode_t mode)
tout(cct) << relpath << std::endl;
tout(cct) << mode << std::endl;
- uid_t uid = get_uid();
- gid_t gid = get_gid();
+ UserPerm perms = pick_my_perms();
//get through existing parts of path
filepath path(relpath);
cur = cwd;
for (i=0; i<path.depth(); ++i) {
if (cct->_conf->client_permissions) {
- r = may_lookup(cur.get(), uid, gid);
+ r = may_lookup(cur.get(), perms);
if (r < 0)
break;
caps = CEPH_CAP_AUTH_SHARED;
}
- r = _lookup(cur.get(), path[i].c_str(), caps, &next, uid, gid);
+ r = _lookup(cur.get(), path[i].c_str(), caps, &next, perms);
if (r < 0)
break;
cur.swap(next);
//make new directory at each level
for (; i<path.depth(); ++i) {
if (cct->_conf->client_permissions) {
- r = may_create(cur.get(), uid, gid);
+ r = may_create(cur.get(), perms);
if (r < 0)
return r;
}
//make new dir
- r = _mkdir(cur.get(), path[i].c_str(), mode, uid, gid, &next);
+ r = _mkdir(cur.get(), path[i].c_str(), mode, perms, &next);
//check proper creation/existence
if (r < 0) return r;
//move to new dir and continue
// =============================
// snaps
-int Client::mksnap(const char *relpath, const char *name)
+int Client::mksnap(const char *relpath, const char *name, const UserPerm& perm)
{
Mutex::Locker l(client_lock);
filepath path(relpath);
InodeRef in;
- int r = path_walk(path, &in);
+ int r = path_walk(path, &in, perm);
if (r < 0)
return r;
if (cct->_conf->client_permissions) {
- r = may_create(in.get());
+ r = may_create(in.get(), perm);
if (r < 0)
return r;
}
Inode *snapdir = open_snapdir(in.get());
- return _mkdir(snapdir, name, 0);
+ return _mkdir(snapdir, name, 0, perm);
}
int Client::rmsnap(const char *relpath, const char *name)
{
}
-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, const UserPerm& perm,
InodeRef *inp)
{
ldout(cct, 3) << "_mkdir(" << dir->ino << " " << name << ", 0" << oct
- << mode << dec << ", uid " << uid << ", gid " << gid << ")"
- << dendl;
+ << mode << dec << ", uid " << perm.uid()
+ << ", gid " << perm.gid() << ")" << dendl;
if (strlen(name) > NAME_MAX)
return -ENAMETOOLONG;
mode |= S_IFDIR;
bufferlist xattrs_bl;
- int res = _posix_acl_create(dir, &mode, xattrs_bl, uid, gid);
+ int res = _posix_acl_create(dir, &mode, xattrs_bl, perm.uid(), perm.gid());
if (res < 0)
goto fail;
req->head.args.mkdir.mode = mode;
req->set_dentry(de);
ldout(cct, 10) << "_mkdir: making request" << dendl;
- res = make_request(req, uid, gid, inp);
+ res = make_request(req, perm, inp);
ldout(cct, 10) << "_mkdir result is " << res << dendl;
trim_cache();
}
int Client::ll_mkdir(Inode *parent, const char *name, mode_t mode,
- struct stat *attr, Inode **out, int uid, int gid)
+ struct stat *attr, Inode **out, const UserPerm& perm)
{
Mutex::Locker lock(client_lock);
tout(cct) << mode << std::endl;
if (!cct->_conf->fuse_default_permissions) {
- int r = may_create(parent, uid, gid);
+ int r = may_create(parent, perm);
if (r < 0)
return r;
}
InodeRef in;
- int r = _mkdir(parent, name, mode, uid, gid, &in);
+ int r = _mkdir(parent, name, mode, perm, &in);
if (r == 0) {
fill_stat(in, attr);
_ll_get(in.get());
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, const UserPerm& perm);
- int _mkdir(Inode *dir, const char *name, mode_t mode, int uid=-1, int gid=-1, InodeRef *inp = 0);
+ int _mkdir(Inode *dir, const char *name, mode_t mode, const UserPerm& perm,
+ 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 _mknod(Inode *dir, const char *name, mode_t mode, dev_t rdev, int uid=-1, int gid=-1, InodeRef *inp = 0);
int rename(const char *from, const char *to, const UserPerm& perm);
// dirs
- int mkdir(const char *path, mode_t mode);
+ int mkdir(const char *path, mode_t mode, const UserPerm& perm);
int mkdirs(const char *path, mode_t mode);
int rmdir(const char *path);
int enumerate_layout(int fd, vector<ObjectExtent>& result,
loff_t length, loff_t offset);
- int mksnap(const char *path, const char *name);
+ int mksnap(const char *path, const char *name, const UserPerm& perm);
int rmsnap(const char *path, const char *name);
// expose caps
int ll_mknod(Inode *in, const char *name, mode_t mode, dev_t rdev,
struct stat *attr, Inode **out, int uid = -1, int gid = -1);
int ll_mkdir(Inode *in, const char *name, mode_t mode, struct stat *attr,
- Inode **out, int uid = -1, int gid = -1);
+ Inode **out, const UserPerm& perm);
int ll_symlink(Inode *in, const char *name, const char *value,
struct stat *attr, Inode **out, int uid = -1, int gid = -1);
int ll_unlink(Inode *in, const char *name, const UserPerm& perm);
int seq = 0;
+ UserPerm perms = client->pick_my_perms();
+
for (list<int>::iterator it = modes.begin();
it != modes.end();
++it) {
string base = get_sarg(0);
string name = get_sarg(0);
if (run_me())
- mksnap(base.c_str(), name.c_str());
+ mksnap(base.c_str(), name.c_str(), perms);
did_run_me();
}
break;
int SyntheticClient::play_trace(Trace& t, string& prefix, bool metadata_only)
{
dout(4) << "play trace prefix '" << prefix << "'" << dendl;
+ UserPerm perms = client->pick_my_perms();
t.start();
char buf[1024];
// prefix?
const char *p = prefix.c_str();
if (prefix.length()) {
- client->mkdir(prefix.c_str(), 0755);
+ client->mkdir(prefix.c_str(), 0755, perms);
struct stat attr;
i1 = client->ll_get_inode(vinodeno_t(1, CEPH_NOSNAP));
if (client->ll_lookup(i1, prefix.c_str(), &attr, &i2) == 0) {
} else if (strcmp(op, "mkdir") == 0) {
const char *a = t.get_string(buf, p);
int64_t b = t.get_int();
- client->mkdir(a, b);
+ client->mkdir(a, b, perms);
} else if (strcmp(op, "rmdir") == 0) {
const char *a = t.get_string(buf, p);
client->rmdir(a);
struct stat attr;
if (ll_inos.count(i)) {
i1 = client->ll_get_inode(vinodeno_t(ll_inos[i],CEPH_NOSNAP));
- if (client->ll_mkdir(i1, n, m, &attr, &i2) == 0)
+ if (client->ll_mkdir(i1, n, m, &attr, &i2, perms) == 0)
ll_inos[ri] = attr.st_ino;
client->ll_put(i1);
}
{
if (time_to_stop()) return 0;
+ UserPerm perms = client->pick_my_perms();
// make sure base dir exists
- int r = client->mkdir(basedir, 0755);
+ int r = client->mkdir(basedir, 0755, perms);
if (r != 0) {
dout(1) << "can't make base dir? " << basedir << dendl;
//return -1;
if (priv) {
for (int c=0; c<count; c++) {
snprintf(d, sizeof(d), "dir.%d.run%d", whoami, c);
- client->mkdir(d, 0755);
+ client->mkdir(d, 0755, perms);
}
} else {
// shared
if (true || whoami == 0) {
for (int c=0; c<count; c++) {
snprintf(d, sizeof(d), "dir.%d.run%d", 0, c);
- client->mkdir(d, 0755);
+ client->mkdir(d, 0755, perms);
}
} else {
sleep(2);
// create files
int num = 200;
- client->mkdir("orig", 0755);
- client->mkdir("copy", 0755);
+ client->mkdir("orig", 0755, perms);
+ client->mkdir("copy", 0755, perms);
utime_t start = ceph_clock_now(client->cct);
for (int i=0; i<num; i++) {
int SyntheticClient::create_shared(int num)
{
// files
+ UserPerm perms = client->pick_my_perms();
char d[255];
- client->mkdir("test", 0755);
+ client->mkdir("test", 0755, perms);
for (int n=0; n<num; n++) {
snprintf(d, sizeof(d), "test/file.%d", n);
client->mknod(d, 0644);
}
if (op == CEPH_MDS_OP_MKDIR) {
- r = client->mkdir( make_sub("mkdir"), 0755);
+ r = client->mkdir(make_sub("mkdir"), 0755, perms);
}
if (op == CEPH_MDS_OP_RMDIR) {
void SyntheticClient::make_dir_mess(const char *basedir, int n)
{
+ UserPerm perms = client->pick_my_perms();
vector<string> dirs;
dirs.push_back(basedir);
dirs.push_back(basedir);
- client->mkdir(basedir, 0755);
+ client->mkdir(basedir, 0755, perms);
// motivation:
// P(dir) ~ subdirs_of(dir) + 2
dirs.push_back(dir);
// do it
- client->mkdir(dir.c_str(), 0755);
+ client->mkdir(dir.c_str(), 0755, perms);
}
if (1) {
// make 2 parallel dirs, link/unlink between them.
char a[100], b[100];
- client->mkdir("/a", 0755);
- client->mkdir("/b", 0755);
+ client->mkdir("/a", 0755, perms);
+ client->mkdir("/b", 0755, perms);
for (int i=0; i<10; i++) {
snprintf(a, sizeof(a), "/a/%d", i);
client->mknod(a, 0644);
client->mknod("one", 0755);
client->mknod("two", 0755);
client->link("one", "three", perms);
- client->mkdir("dir", 0755);
+ client->mkdir("dir", 0755, perms);
client->link("two", "/dir/twolink", perms);
client->link("dir/twolink", "four", perms);
client->mknod("b", 0644);
client->link("b", "c", perms);
client->unlink("c", perms);
- client->mkdir("d", 0755);
+ client->mkdir("d", 0755, perms);
client->unlink("d", perms);
client->rmdir("d");
client->rename("p3","p4", perms);
// check dest dir ambiguity thing
- client->mkdir("dir1", 0755);
- client->mkdir("dir2", 0755);
+ client->mkdir("dir1", 0755, perms);
+ client->mkdir("dir2", 0755, perms);
client->rename("p2", "dir1/p2", perms);
client->rename("dir1/p2", "dir2/p2", perms);
client->rename("dir2/p2", "/p2", perms);
client->rename("da2", "da3", perms);
// check directory renames
- client->mkdir("dir3", 0755);
+ client->mkdir("dir3", 0755, perms);
client->mknod("dir3/asdf", 0644);
- client->mkdir("dir4", 0755);
- client->mkdir("dir5", 0755);
+ client->mkdir("dir4", 0755, perms);
+ client->mkdir("dir5", 0755, perms);
client->mknod("dir5/asdf", 0644);
client->rename("dir3", "dir4", perms); // ok
client->rename("dir4", "dir5", perms); // fail
*/
if (base[0] != '-')
- client->mkdir(base, 0755);
+ client->mkdir(base, 0755, client->pick_my_perms());
ifstream f(find);
assert(f.is_open());
f >> mtime;
f.seekg(1, ios::cur);
getline(f, filename);
+ UserPerm perms(uid, gid);
// ignore "."
if (filename == ".") continue;
}
f += filename;
if (S_ISDIR(mode)) {
- client->mkdir(f.c_str(), mode);
+ client->mkdir(f.c_str(), mode, perms);
} else {
int fd = client->open(f.c_str(), O_WRONLY|O_CREAT, mode & 0777);
assert(fd > 0);
-void SyntheticClient::mksnap(const char *base, const char *name)
+void SyntheticClient::mksnap(const char *base, const char *name, const UserPerm& perms)
{
- client->mksnap(base, name);
+ client->mksnap(base, name, perms);
}
void SyntheticClient::rmsnap(const char *base, const char *name)
void SyntheticClient::mksnapfile(const char *dir)
{
- client->mkdir(dir, 0755);
+ UserPerm perms = client->pick_my_perms();
+ client->mkdir(dir, 0755, perms);
string f = dir;
f += "/foo";
string s = dir;
s += "/.snap/1";
- client->mkdir(s.c_str(), 0755);
+ client->mkdir(s.c_str(), 0755, perms);
fd = client->open(f.c_str(), O_WRONLY);
client->write(fd, buf, 1048576*2, 1048576);
int chunk_file(string &filename);
- void mksnap(const char *base, const char *name);
+ void mksnap(const char *base, const char *name, const UserPerm& perms);
void rmsnap(const char *base, const char *name);
void mksnapfile(const char *dir);
struct fuse_entry_param fe;
memset(&fe, 0, sizeof(fe));
-
+ UserPerm perm(ctx->uid, ctx->gid);
#ifdef HAVE_SYS_SYNCFS
if (cfuse->fino_snap(parent) == CEPH_SNAPDIR &&
cfuse->client->cct->_conf->fuse_multithreaded &&
#endif
i1 = cfuse->iget(parent);
- int r = cfuse->client->ll_mkdir(i1, name, mode, &fe.attr, &i2, ctx->uid,
- ctx->gid);
+ int r = cfuse->client->ll_mkdir(i1, name, mode, &fe.attr, &i2, perm);
if (r == 0) {
fe.ino = cfuse->make_fake_ino(fe.attr.st_ino, fe.attr.st_dev);
fe.attr.st_rdev = new_encode_dev(fe.attr.st_rdev);
{
if (!cmount->is_mounted())
return -ENOTCONN;
- return cmount->get_client()->mkdir(path, mode);
+ UserPerm perms = cmount->get_client()->pick_my_perms();
+ return cmount->get_client()->mkdir(path, mode, perms);
}
extern "C" int ceph_mkdirs(struct ceph_mount_info *cmount, const char *path, mode_t mode)
mode_t mode, struct stat *attr, Inode **out,
int uid, int gid)
{
- return (cmount->get_client()->ll_mkdir(parent, name, mode, attr, out, uid,
- gid));
+ UserPerm perms(uid, gid);
+ return (cmount->get_client()->ll_mkdir(parent, name, mode, attr, out, perms));
}
extern "C" int ceph_ll_link(class ceph_mount_info *cmount,