dout(5, "open inode %p dentry %p name '%s' flags %d\n", inode, dentry, dentry->d_name.name, flags);
pathbase = inode->i_sb->s_root->d_inode->i_ino;
pathlen = get_dentry_path(dentry, path, inode->i_sb->s_root);
- dout(5, "path is %s len %d\n", path, pathlen);
req = ceph_mdsc_create_request(mdsc, CEPH_MDS_OP_OPEN, pathbase, path, 0, 0);
if (IS_ERR(req))
dout(5, "dir_lookup inode %p dentry %p '%s'\n", dir, dentry, dentry->d_name.name);
pathlen = get_dentry_path(dentry, path, dir->i_sb->s_root);
- dout(5, "path is %s len %d\n", path, pathlen);
/* stat mds */
req = ceph_mdsc_create_request(mdsc, CEPH_MDS_OP_STAT,
}
+
+static int ceph_dir_mkdir(struct inode *dir, struct dentry *dentry, int mode)
+{
+ struct ceph_super_info *sbinfo = ceph_sbinfo(dir->i_sb);
+ struct ceph_mds_client *mdsc = &sbinfo->sb_client->mdsc;
+ struct inode *inode = dentry->d_inode;
+ struct ceph_msg *req;
+ struct ceph_mds_request_head *rhead;
+ struct ceph_mds_reply_info rinfo;
+ char path[200];
+ int pathlen;
+ int err;
+
+ dout(5, "dir_mkdir dir %p dentry %p mode %d\n", dir, dentry, mode);
+ pathlen = get_dentry_path(dentry, path, dir->i_sb->s_root);
+
+ req = ceph_mdsc_create_request(mdsc, CEPH_MDS_OP_MKDIR,
+ dir->i_sb->s_root->d_inode->i_ino, path, 0, 0);
+ if (IS_ERR(req))
+ return PTR_ERR(req);
+ rhead = req->front.iov_base;
+ rhead->args.mkdir.mode = cpu_to_le32(mode);
+ if ((err = ceph_mdsc_do_request(mdsc, req, &rinfo, -1)) < 0)
+ return err;
+
+ err = le32_to_cpu(rinfo.head->result);
+ if (err == 0) {
+ inode_dec_link_count(inode);
+ /* FIXME update dir mtime etc. from reply trace */
+ }
+ return err;
+}
+
+
static int ceph_dir_unlink(struct inode *dir, struct dentry *dentry)
{
struct ceph_super_info *sbinfo = ceph_sbinfo(dir->i_sb);
dout(5, "dir_unlink dir %p dentry %p inode %p\n", dir, dentry, inode);
pathlen = get_dentry_path(dentry, path, dir->i_sb->s_root);
- dout(5, "path is %s len %d\n", path, pathlen);
req = ceph_mdsc_create_request(mdsc, CEPH_MDS_OP_UNLINK,
dir->i_sb->s_root->d_inode->i_ino, path, 0, 0);
/*
-static int ceph_dir_mkdir(struct inode *dir, struct dentry *dentry, int mode)
-{
-}
static int ceph_dir_rmdir(struct inode *i, struct dentry *d)
.lookup = ceph_dir_lookup,
// .getattr = ceph_inode_getattr,
.unlink = ceph_dir_unlink,
-// .mkdir = ceph_vfs_mkdir,
+ .mkdir = ceph_dir_mkdir,
// .rmdir = ceph_vfs_rmdir,
/* .create = ceph_dir_create,
.mknod = ceph_vfs_mknod,
struct ceph_msg *req;
struct ceph_mds_request_head *head;
void *p, *end;
- int pathlen = 2*(sizeof(ino1) + sizeof(__u32));
+ int pathlen;
+
+ pathlen = 2*(sizeof(ino1) + sizeof(__u32));
if (path1) pathlen += strlen(path1);
if (path2) pathlen += strlen(path2);
/* encode paths */
ceph_encode_filepath(&p, end, ino1, path1);
ceph_encode_filepath(&p, end, ino2, path2);
+ dout(10, "create_request op %d -> %p\n", op, req);
+ if (path1)
+ dout(10, "create_request path1 %llx/%s\n", ino1, path1);
+ if (path2)
+ dout(10, "create_request path2 %llx/%s\n", ino2, path2);
BUG_ON(p != end);