return r;
}
+int Client::ll_mkdirx(Inode *parent, const char *name, mode_t mode, Inode **out,
+ struct ceph_statx *stx, unsigned want, unsigned flags,
+ const UserPerm& perms)
+{
+ Mutex::Locker lock(client_lock);
+
+ vinodeno_t vparent = _get_vino(parent);
+
+ ldout(cct, 3) << "ll_mkdirx " << vparent << " " << name << dendl;
+ tout(cct) << "ll_mkdirx" << std::endl;
+ tout(cct) << vparent.ino.val << std::endl;
+ tout(cct) << name << std::endl;
+ tout(cct) << mode << std::endl;
+
+ if (!cct->_conf->fuse_default_permissions) {
+ int r = may_create(parent, perms);
+ if (r < 0)
+ return r;
+ }
+
+ InodeRef in;
+ int r = _mkdir(parent, name, mode, perms, &in);
+ if (r == 0) {
+ fill_statx(in, statx_to_mask(flags, want), stx);
+ _ll_get(in.get());
+ } else {
+ stx->stx_ino = 0;
+ stx->stx_mask = 0;
+ }
+ tout(cct) << stx->stx_ino << std::endl;
+ ldout(cct, 3) << "ll_mkdirx " << vparent << " " << name
+ << " = " << r << " (" << hex << stx->stx_ino << dec << ")" << dendl;
+ *out = in.get();
+ return r;
+}
+
int Client::_symlink(Inode *dir, const char *name, const char *target,
const UserPerm& perms, InodeRef *inp)
{
unsigned flags, const UserPerm& perms);
int ll_mkdir(Inode *in, const char *name, mode_t mode, struct stat *attr,
Inode **out, const UserPerm& perm);
+ int ll_mkdirx(Inode *parent, const char *name, mode_t mode, Inode **out,
+ struct ceph_statx *stx, unsigned want, unsigned flags,
+ const UserPerm& perms);
int ll_symlink(Inode *in, const char *name, const char *value,
struct stat *attr, Inode **out, const UserPerm& perms);
int ll_unlink(Inode *in, const char *name, const UserPerm& perm);
const char *name, mode_t mode, dev_t rdev, Inode **out,
struct ceph_statx *stx, unsigned want, unsigned flags,
const UserPerm *perms);
-int ceph_ll_mkdir(struct ceph_mount_info *cmount, struct Inode *parent,
- const char *name, mode_t mode, struct stat *attr,
- Inode **out, int uid, int gid);
+int ceph_ll_mkdir(struct ceph_mount_info *cmount, Inode *parent,
+ const char *name, mode_t mode, Inode **out,
+ struct ceph_statx *stx, unsigned want,
+ unsigned flags, const UserPerm *perms);
int ceph_ll_link(struct ceph_mount_info *cmount, struct Inode *in,
struct Inode *newparrent, const char *name,
struct stat *attr, int uid, int gid);
out, stx, want, flags, *perms);
}
-extern "C" int ceph_ll_mkdir(class ceph_mount_info *cmount,
- Inode *parent, const char *name,
- mode_t mode, struct stat *attr, Inode **out,
- int uid, int gid)
+extern "C" int ceph_ll_mkdir(class ceph_mount_info *cmount, Inode *parent,
+ const char *name, mode_t mode, Inode **out,
+ struct ceph_statx *stx, unsigned want,
+ unsigned flags, const UserPerm *perms)
{
- UserPerm perms(uid, gid);
- return (cmount->get_client()->ll_mkdir(parent, name, mode, attr, out, perms));
+ return cmount->get_client()->ll_mkdirx(parent, name, mode, out, stx, want,
+ flags, *perms);
}
extern "C" int ceph_ll_link(class ceph_mount_info *cmount,
Fh *fh;
UserPerm *perms = ceph_mount_perms(cmount);
- ASSERT_EQ(ceph_ll_mkdir(cmount, root, dirname, 0755, &st, &dir, getuid(), getgid()), 0);
+ ASSERT_EQ(ceph_ll_mkdir(cmount, root, dirname, 0755, &dir, &stx, 0, 0, perms), 0);
ASSERT_EQ(ceph_ll_create(cmount, dir, filename, 0666, O_RDWR|O_CREAT|O_EXCL,
&file, &fh, &stx, CEPH_STATX_NLINK, 0, perms), 0);
ASSERT_EQ(stx.stx_nlink, (nlink_t)1);