From 135ca7b7e80f80a317985f36572812cce8e65db9 Mon Sep 17 00:00:00 2001 From: Yehuda Sadeh-Weinraub Date: Fri, 11 Jan 2008 23:05:00 +0200 Subject: [PATCH] mkdir works now with helper function ceph_fill_trace() --- src/kernel/dir.c | 77 ++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 72 insertions(+), 5 deletions(-) diff --git a/src/kernel/dir.c b/src/kernel/dir.c index d4df1709fb922..b110c226ff27f 100644 --- a/src/kernel/dir.c +++ b/src/kernel/dir.c @@ -258,7 +258,70 @@ static struct dentry *ceph_dir_lookup(struct inode *dir, struct dentry *dentry, return NULL; } +static int ceph_fill_trace(struct super_block *sb, struct ceph_mds_reply_info *prinfo, struct inode **lastinode) +{ + int err = 0; + struct qstr dname; + struct dentry *dn, *parent; + struct inode *in; + int i = 0; + + BUG_ON(sb == NULL); + if (lastinode) { + *lastinode = NULL; + } + + dn = sb->s_root; + in = dn->d_inode; + + if ((err = ceph_fill_inode(in, prinfo->trace_in[i].in)) < 0) { + return err; + } + + for (i=1; itrace_nr; i++) { + parent = dn; + + dname.name = prinfo->trace_dname[i]; + dname.len = prinfo->trace_dname_len[i]; + dname.hash = full_name_hash(dname.name, dname.len); + + dn = d_lookup(parent, &dname); + dout(30, "calling d_lookup on parent=%p name=%s returned %p\n", parent, dname.name, dn); + + if (!dn) { + dn = d_alloc(parent, &dname); + if (dn == NULL) { + dout(30, "d_alloc badness\n"); + break; + } + } + + if (!dn->d_inode) { + in = new_inode(parent->d_sb); + if (in == NULL) { + dout(30, "new_inode badness\n"); + d_delete(dn); + break; + } + if (ceph_fill_inode(in, prinfo->trace_in[i].in) < 0) { + dout(30, "ceph_fill_inode badness\n"); + iput(in); + d_delete(dn); + break; + } + d_add(dn, in); + dout(10, "ceph_fill_trace added dentry %p inode %lu %d/%d\n", + dn, in->i_ino, i, prinfo->trace_nr); + } else { + in = dn->d_inode; + } + + } + *lastinode = in; + + return err; +} static int ceph_dir_mkdir(struct inode *dir, struct dentry *dentry, int mode) { @@ -291,16 +354,20 @@ static int ceph_dir_mkdir(struct inode *dir, struct dentry *dentry, int mode) err = le32_to_cpu(rinfo.head->result); if (err == 0) { /* inode_dec_link_count(inode); */ - /* FIXME update dir mtime etc. from reply trace */ - inode = new_inode(dir->i_sb); + err = ceph_fill_trace(dir->i_sb, &rinfo, &inode); + + if (err < 0) { + goto done_mkdir; + } if (inode == NULL) { /* TODO handle this one */ + err = -ENOMEM; + goto done_mkdir; } - - inode->i_nlink = 2; - d_instantiate(dentry, inode); + dout(10, "rinfo.dir_in=%p rinfo.trace_nr=%d\n", rinfo.trace_in, rinfo.trace_nr); } +done_mkdir: return err; } -- 2.39.5