aboutsummaryrefslogtreecommitdiffstats
path: root/fs/9p/vfs_super.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/9p/vfs_super.c')
-rw-r--r--fs/9p/vfs_super.c43
1 files changed, 25 insertions, 18 deletions
diff --git a/fs/9p/vfs_super.c b/fs/9p/vfs_super.c
index be74d020436e..3623f692b448 100644
--- a/fs/9p/vfs_super.c
+++ b/fs/9p/vfs_super.c
@@ -107,7 +107,6 @@ static int v9fs_get_sb(struct file_system_type *fs_type, int flags,
107 struct inode *inode = NULL; 107 struct inode *inode = NULL;
108 struct dentry *root = NULL; 108 struct dentry *root = NULL;
109 struct v9fs_session_info *v9ses = NULL; 109 struct v9fs_session_info *v9ses = NULL;
110 struct p9_wstat *st = NULL;
111 int mode = S_IRWXUGO | S_ISVTX; 110 int mode = S_IRWXUGO | S_ISVTX;
112 struct p9_fid *fid; 111 struct p9_fid *fid;
113 int retval = 0; 112 int retval = 0;
@@ -124,16 +123,10 @@ static int v9fs_get_sb(struct file_system_type *fs_type, int flags,
124 goto close_session; 123 goto close_session;
125 } 124 }
126 125
127 st = p9_client_stat(fid);
128 if (IS_ERR(st)) {
129 retval = PTR_ERR(st);
130 goto clunk_fid;
131 }
132
133 sb = sget(fs_type, NULL, v9fs_set_super, v9ses); 126 sb = sget(fs_type, NULL, v9fs_set_super, v9ses);
134 if (IS_ERR(sb)) { 127 if (IS_ERR(sb)) {
135 retval = PTR_ERR(sb); 128 retval = PTR_ERR(sb);
136 goto free_stat; 129 goto clunk_fid;
137 } 130 }
138 v9fs_fill_super(sb, v9ses, flags, data); 131 v9fs_fill_super(sb, v9ses, flags, data);
139 132
@@ -151,22 +144,38 @@ static int v9fs_get_sb(struct file_system_type *fs_type, int flags,
151 } 144 }
152 145
153 sb->s_root = root; 146 sb->s_root = root;
154 root->d_inode->i_ino = v9fs_qid2ino(&st->qid);
155 147
156 v9fs_stat2inode(st, root->d_inode, sb); 148 if (v9fs_proto_dotl(v9ses)) {
149 struct p9_stat_dotl *st = NULL;
150 st = p9_client_getattr_dotl(fid, P9_STATS_BASIC);
151 if (IS_ERR(st)) {
152 retval = PTR_ERR(st);
153 goto clunk_fid;
154 }
155
156 v9fs_stat2inode_dotl(st, root->d_inode);
157 kfree(st);
158 } else {
159 struct p9_wstat *st = NULL;
160 st = p9_client_stat(fid);
161 if (IS_ERR(st)) {
162 retval = PTR_ERR(st);
163 goto clunk_fid;
164 }
165
166 root->d_inode->i_ino = v9fs_qid2ino(&st->qid);
167 v9fs_stat2inode(st, root->d_inode, sb);
168
169 p9stat_free(st);
170 kfree(st);
171 }
157 172
158 v9fs_fid_add(root, fid); 173 v9fs_fid_add(root, fid);
159 p9stat_free(st);
160 kfree(st);
161 174
162P9_DPRINTK(P9_DEBUG_VFS, " simple set mount, return 0\n"); 175P9_DPRINTK(P9_DEBUG_VFS, " simple set mount, return 0\n");
163 simple_set_mnt(mnt, sb); 176 simple_set_mnt(mnt, sb);
164 return 0; 177 return 0;
165 178
166free_stat:
167 p9stat_free(st);
168 kfree(st);
169
170clunk_fid: 179clunk_fid:
171 p9_client_clunk(fid); 180 p9_client_clunk(fid);
172 181
@@ -176,8 +185,6 @@ close_session:
176 return retval; 185 return retval;
177 186
178release_sb: 187release_sb:
179 p9stat_free(st);
180 kfree(st);
181 deactivate_locked_super(sb); 188 deactivate_locked_super(sb);
182 return retval; 189 return retval;
183} 190}