return _mkdir(dir.get(), name.c_str(), mode, perm);
}
-int Client::mkdirs(const char *relpath, mode_t mode)
+int Client::mkdirs(const char *relpath, mode_t mode, const UserPerm& perms)
{
Mutex::Locker lock(client_lock);
ldout(cct, 10) << "Client::mkdirs " << relpath << dendl;
tout(cct) << relpath << std::endl;
tout(cct) << mode << std::endl;
- UserPerm perms(get_uid(), get_gid());
-
//get through existing parts of path
filepath path(relpath);
unsigned int i;
return 0;
}
-int Client::rmdir(const char *relpath)
+int Client::rmdir(const char *relpath, const UserPerm& perms)
{
Mutex::Locker lock(client_lock);
tout(cct) << "rmdir" << std::endl;
string name = path.last_dentry();
path.pop_dentry();
InodeRef dir;
- UserPerm perms(get_uid(), get_gid());
int r = path_walk(path, &dir, perms);
if (r < 0)
return r;
return _rmdir(dir.get(), name.c_str(), perms);
}
-int Client::mknod(const char *relpath, mode_t mode, dev_t rdev)
+int Client::mknod(const char *relpath, mode_t mode, const UserPerm& perms, dev_t rdev)
{
Mutex::Locker lock(client_lock);
tout(cct) << "mknod" << std::endl;
string name = path.last_dentry();
path.pop_dentry();
InodeRef dir;
- UserPerm perms(get_uid(), get_gid());
int r = path_walk(path, &dir, perms);
if (r < 0)
return r;
// symlinks
-int Client::symlink(const char *target, const char *relpath)
+int Client::symlink(const char *target, const char *relpath, const UserPerm& perms)
{
Mutex::Locker lock(client_lock);
tout(cct) << "symlink" << std::endl;
string name = path.last_dentry();
path.pop_dentry();
InodeRef dir;
- UserPerm perms(get_uid(), get_gid());
int r = path_walk(path, &dir, perms);
if (r < 0)
return r;
{
int count = iargs.front(); iargs.pop_front();
if (run_me()) {
- client->mknod("test", 0777);
+ client->mknod("test", 0777, perms);
struct stat st;
for (int i=0; i<count; i++) {
client->lstat("test", &st, perms);
client->mkdir(a, b, perms);
} else if (strcmp(op, "rmdir") == 0) {
const char *a = t.get_string(buf, p);
- client->rmdir(a);
+ client->rmdir(a, perms);
} else if (strcmp(op, "symlink") == 0) {
const char *a = t.get_string(buf, p);
const char *b = t.get_string(buf2, p);
- client->symlink(a,b);
+ client->symlink(a, b, perms);
} else if (strcmp(op, "readlink") == 0) {
const char *a = t.get_string(buf, p);
char buf[100];
const char *a = t.get_string(buf, p);
int64_t b = t.get_int();
int64_t c = t.get_int();
- client->mknod(a, b, c);
+ client->mknod(a, b, perms, c);
} else if (strcmp(op, "oldmknod") == 0) {
const char *a = t.get_string(buf, p);
int64_t b = t.get_int();
- client->mknod(a, b, 0);
+ client->mknod(a, b, perms, 0);
} else if (strcmp(op, "getdir") == 0) {
const char *a = t.get_string(buf, p);
list<string> contents;
if ((st.st_mode & S_IFMT) == S_IFDIR) {
clean_dir(file);
- client->rmdir(file.c_str());
+ client->rmdir(file.c_str(), perms);
} else {
client->unlink(file.c_str(), perms);
}
dout(3) << "make_dirs " << basedir << " dirs " << dirs << " files " << files << " depth " << depth << dendl;
for (int i=0; i<files; i++) {
snprintf(d, sizeof(d), "%s/file.%d", basedir, i);
- client->mknod(d, 0644);
+ client->mknod(d, 0644, perms);
}
if (depth == 0) return 0;
for (int n=0; n<num; n++) {
snprintf(d, sizeof(d), "dir.%d.run%d/file.client%d.%d", priv ? whoami:0, c, whoami, n);
- client->mknod(d, 0644);
+ client->mknod(d, 0644, perms);
if (more) {
client->lstat(d, &st, perms);
utime_t start = ceph_clock_now(client->cct);
for (int i=0; i<num; i++) {
snprintf(d, sizeof(d), "orig/file.%d", i);
- client->mknod(d, 0755);
+ client->mknod(d, 0755, perms);
}
utime_t end = ceph_clock_now(client->cct);
end -= start;
client->mkdir("test", 0755, perms);
for (int n=0; n<num; n++) {
snprintf(d, sizeof(d), "test/file.%d", n);
- client->mknod(d, 0644);
+ client->mknod(d, 0644, perms);
}
return 0;
if (op == CEPH_MDS_OP_RMDIR) {
if (!subdirs.empty())
- r = client->rmdir( get_random_subdir() );
+ r = client->rmdir(get_random_subdir(), perms);
else
- r = client->rmdir( cwd.c_str() ); // will pbly fail
+ r = client->rmdir(cwd.c_str(), perms); // will pbly fail
}
if (op == CEPH_MDS_OP_SYMLINK) {
}
if (op == CEPH_MDS_OP_MKNOD) {
- r = client->mknod( make_sub("mknod"), 0644);
+ r = client->mknod(make_sub("mknod"), 0644, perms);
}
if (op == CEPH_MDS_OP_OPEN) {
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(a, 0644, perms);
}
while (1) {
for (int i=0; i<10; i++) {
}
// link fun
- client->mknod("one", 0755);
- client->mknod("two", 0755);
+ client->mknod("one", 0755, perms);
+ client->mknod("two", 0755, perms);
client->link("one", "three", perms);
client->mkdir("dir", 0755, perms);
client->link("two", "/dir/twolink", perms);
client->link("dir/twolink", "four", perms);
// unlink fun
- client->mknod("a", 0644);
+ client->mknod("a", 0644, perms);
client->unlink("a", perms);
- client->mknod("b", 0644);
+ client->mknod("b", 0644, perms);
client->link("b", "c", perms);
client->unlink("c", perms);
client->mkdir("d", 0755, perms);
client->unlink("d", perms);
- client->rmdir("d");
+ client->rmdir("d", perms);
// rename fun
- client->mknod("p1", 0644);
- client->mknod("p2", 0644);
+ client->mknod("p1", 0644, perms);
+ client->mknod("p2", 0644, perms);
client->rename("p1","p2", perms);
- client->mknod("p3", 0644);
+ client->mknod("p3", 0644, perms);
client->rename("p3","p4", perms);
// check dest dir ambiguity thing
client->rename("p4", "p4.l", perms);
// check anchor updates
- client->mknod("dir1/a", 0644);
+ client->mknod("dir1/a", 0644, perms);
client->link("dir1/a", "da1", perms);
client->link("dir1/a", "da2", perms);
client->link("da2","da3", perms);
// check directory renames
client->mkdir("dir3", 0755, perms);
- client->mknod("dir3/asdf", 0644);
+ client->mknod("dir3/asdf", 0644, perms);
client->mkdir("dir4", 0755, perms);
client->mkdir("dir5", 0755, perms);
- client->mknod("dir5/asdf", 0644);
+ client->mknod("dir5/asdf", 0644, perms);
client->rename("dir3", "dir4", perms); // ok
client->rename("dir4", "dir5", perms); // fail
}
int o = rand() % 4;
switch (o) {
case 0:
- client->mknod(src.c_str(), 0755);
+ client->mknod(src.c_str(), 0755, perms);
if (renames) client->rename(src.c_str(), dst.c_str(), perms);
break;
case 1:
- client->mknod(src.c_str(), 0755);
+ client->mknod(src.c_str(), 0755, perms);
client->unlink(dst.c_str(), perms);
client->link(src.c_str(), dst.c_str(), perms);
break;
case 2: client->unlink(src.c_str(), perms); break;
case 3: client->unlink(dst.c_str(), perms); break;
- //case 4: client->mknod(src.c_str(), 0755); break;
- //case 5: client->mknod(dst.c_str(), 0755); break;
+ //case 4: client->mknod(src.c_str(), 0755, perms); break;
+ //case 5: client->mknod(dst.c_str(), 0755, perms); break;
}
}
return 0;
target = filename.substr(pos + 4);
}
dout(10) << "symlink from '" << link << "' -> '" << target << "'" << dendl;
- client->symlink(target.c_str(), link.c_str());
+ client->symlink(target.c_str(), link.c_str(), perms);
} else {
string f;
if (base[0] != '-') {