9p: getattr client implementation for 9P2000.L protocol.
[pandora-kernel.git] / fs / 9p / vfs_super.c
index be74d02..3623f69 100644 (file)
@@ -107,7 +107,6 @@ static int v9fs_get_sb(struct file_system_type *fs_type, int flags,
        struct inode *inode = NULL;
        struct dentry *root = NULL;
        struct v9fs_session_info *v9ses = NULL;
-       struct p9_wstat *st = NULL;
        int mode = S_IRWXUGO | S_ISVTX;
        struct p9_fid *fid;
        int retval = 0;
@@ -124,16 +123,10 @@ static int v9fs_get_sb(struct file_system_type *fs_type, int flags,
                goto close_session;
        }
 
-       st = p9_client_stat(fid);
-       if (IS_ERR(st)) {
-               retval = PTR_ERR(st);
-               goto clunk_fid;
-       }
-
        sb = sget(fs_type, NULL, v9fs_set_super, v9ses);
        if (IS_ERR(sb)) {
                retval = PTR_ERR(sb);
-               goto free_stat;
+               goto clunk_fid;
        }
        v9fs_fill_super(sb, v9ses, flags, data);
 
@@ -151,22 +144,38 @@ static int v9fs_get_sb(struct file_system_type *fs_type, int flags,
        }
 
        sb->s_root = root;
-       root->d_inode->i_ino = v9fs_qid2ino(&st->qid);
 
-       v9fs_stat2inode(st, root->d_inode, sb);
+       if (v9fs_proto_dotl(v9ses)) {
+               struct p9_stat_dotl *st = NULL;
+               st = p9_client_getattr_dotl(fid, P9_STATS_BASIC);
+               if (IS_ERR(st)) {
+                       retval = PTR_ERR(st);
+                       goto clunk_fid;
+               }
+
+               v9fs_stat2inode_dotl(st, root->d_inode);
+               kfree(st);
+       } else {
+               struct p9_wstat *st = NULL;
+               st = p9_client_stat(fid);
+               if (IS_ERR(st)) {
+                       retval = PTR_ERR(st);
+                       goto clunk_fid;
+               }
+
+               root->d_inode->i_ino = v9fs_qid2ino(&st->qid);
+               v9fs_stat2inode(st, root->d_inode, sb);
+
+               p9stat_free(st);
+               kfree(st);
+       }
 
        v9fs_fid_add(root, fid);
-       p9stat_free(st);
-       kfree(st);
 
 P9_DPRINTK(P9_DEBUG_VFS, " simple set mount, return 0\n");
        simple_set_mnt(mnt, sb);
        return 0;
 
-free_stat:
-       p9stat_free(st);
-       kfree(st);
-
 clunk_fid:
        p9_client_clunk(fid);
 
@@ -176,8 +185,6 @@ close_session:
        return retval;
 
 release_sb:
-       p9stat_free(st);
-       kfree(st);
        deactivate_locked_super(sb);
        return retval;
 }