diff options
Diffstat (limited to 'fs/9p/vfs_super.c')
| -rw-r--r-- | fs/9p/vfs_super.c | 43 |
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 | ||
| 162 | P9_DPRINTK(P9_DEBUG_VFS, " simple set mount, return 0\n"); | 175 | P9_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 | ||
| 166 | free_stat: | ||
| 167 | p9stat_free(st); | ||
| 168 | kfree(st); | ||
| 169 | |||
| 170 | clunk_fid: | 179 | clunk_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 | ||
| 178 | release_sb: | 187 | release_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 | } |
