]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mkdir, crashy
authorSage Weil <sage@newdream.net>
Fri, 21 Dec 2007 02:29:18 +0000 (18:29 -0800)
committerSage Weil <sage@newdream.net>
Fri, 21 Dec 2007 02:29:18 +0000 (18:29 -0800)
src/kernel/dir.c
src/kernel/mds_client.c

index fa35469124a9efade045f275585cfce51462a884..6d4d28bc9fd8755d890d43e5d1c3d96326fe2a76 100644 (file)
@@ -48,7 +48,6 @@ struct ceph_inode_cap *ceph_open(struct inode *inode, struct file *file, int fla
        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)) 
@@ -235,7 +234,6 @@ static struct dentry *ceph_dir_lookup(struct inode *dir, struct dentry *dentry,
 
        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, 
@@ -257,6 +255,40 @@ static struct dentry *ceph_dir_lookup(struct inode *dir, struct dentry *dentry,
 }
 
 
+
+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);
@@ -270,7 +302,6 @@ static int ceph_dir_unlink(struct inode *dir, struct dentry *dentry)
 
        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);
@@ -289,9 +320,6 @@ static int ceph_dir_unlink(struct inode *dir, struct dentry *dentry)
 
 
 /*
-static int ceph_dir_mkdir(struct inode *dir, struct dentry *dentry, int mode)
-{
-}
 
 
 static int ceph_dir_rmdir(struct inode *i, struct dentry *d)
@@ -317,7 +345,7 @@ const struct inode_operations ceph_dir_iops = {
        .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,
index 2db4b14bb606802c9f5d9934e89a6f9d5af154c0..71873bf0740594a61ccf4d023263e87340e3617e 100644 (file)
@@ -263,7 +263,9 @@ ceph_mdsc_create_request(struct ceph_mds_client *mdsc, int op,
        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);
 
@@ -284,6 +286,11 @@ ceph_mdsc_create_request(struct ceph_mds_client *mdsc, int op,
        /* 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);