diff options
| -rw-r--r-- | Documentation/filesystems/9p.txt | 3 | ||||
| -rw-r--r-- | fs/9p/v9fs.c | 21 | ||||
| -rw-r--r-- | fs/9p/v9fs.h | 1 | ||||
| -rw-r--r-- | fs/9p/vfs_inode.c | 126 | ||||
| -rw-r--r-- | fs/9p/vfs_super.c | 39 | ||||
| -rw-r--r-- | fs/afs/file.c | 18 | ||||
| -rw-r--r-- | lib/lmb.c | 2 | ||||
| -rw-r--r-- | net/9p/client.c | 21 | ||||
| -rw-r--r-- | net/9p/error.c | 2 | ||||
| -rw-r--r-- | net/9p/trans_fd.c | 8 | ||||
| -rw-r--r-- | net/9p/trans_rdma.c | 9 | ||||
| -rw-r--r-- | net/9p/trans_virtio.c | 11 | ||||
| -rw-r--r-- | net/ipv4/ip_output.c | 2 |
13 files changed, 125 insertions, 138 deletions
diff --git a/Documentation/filesystems/9p.txt b/Documentation/filesystems/9p.txt index bf8080640eba..6208f55c44c3 100644 --- a/Documentation/filesystems/9p.txt +++ b/Documentation/filesystems/9p.txt | |||
| @@ -123,6 +123,9 @@ available from the same CVS repository. | |||
| 123 | There are user and developer mailing lists available through the v9fs project | 123 | There are user and developer mailing lists available through the v9fs project |
| 124 | on sourceforge (http://sourceforge.net/projects/v9fs). | 124 | on sourceforge (http://sourceforge.net/projects/v9fs). |
| 125 | 125 | ||
| 126 | A stand-alone version of the module (which should build for any 2.6 kernel) | ||
| 127 | is available via (http://github.com/ericvh/9p-sac/tree/master) | ||
| 128 | |||
| 126 | News and other information is maintained on SWiK (http://swik.net/v9fs). | 129 | News and other information is maintained on SWiK (http://swik.net/v9fs). |
| 127 | 130 | ||
| 128 | Bug reports may be issued through the kernel.org bugzilla | 131 | Bug reports may be issued through the kernel.org bugzilla |
diff --git a/fs/9p/v9fs.c b/fs/9p/v9fs.c index 332b5ff02fec..f7003cfac63d 100644 --- a/fs/9p/v9fs.c +++ b/fs/9p/v9fs.c | |||
| @@ -76,7 +76,7 @@ static const match_table_t tokens = { | |||
| 76 | * Return 0 upon success, -ERRNO upon failure. | 76 | * Return 0 upon success, -ERRNO upon failure. |
| 77 | */ | 77 | */ |
| 78 | 78 | ||
| 79 | static int v9fs_parse_options(struct v9fs_session_info *v9ses) | 79 | static int v9fs_parse_options(struct v9fs_session_info *v9ses, char *opts) |
| 80 | { | 80 | { |
| 81 | char *options; | 81 | char *options; |
| 82 | substring_t args[MAX_OPT_ARGS]; | 82 | substring_t args[MAX_OPT_ARGS]; |
| @@ -90,10 +90,10 @@ static int v9fs_parse_options(struct v9fs_session_info *v9ses) | |||
| 90 | v9ses->debug = 0; | 90 | v9ses->debug = 0; |
| 91 | v9ses->cache = 0; | 91 | v9ses->cache = 0; |
| 92 | 92 | ||
| 93 | if (!v9ses->options) | 93 | if (!opts) |
| 94 | return 0; | 94 | return 0; |
| 95 | 95 | ||
| 96 | options = kstrdup(v9ses->options, GFP_KERNEL); | 96 | options = kstrdup(opts, GFP_KERNEL); |
| 97 | if (!options) { | 97 | if (!options) { |
| 98 | P9_DPRINTK(P9_DEBUG_ERROR, | 98 | P9_DPRINTK(P9_DEBUG_ERROR, |
| 99 | "failed to allocate copy of option string\n"); | 99 | "failed to allocate copy of option string\n"); |
| @@ -206,24 +206,14 @@ struct p9_fid *v9fs_session_init(struct v9fs_session_info *v9ses, | |||
| 206 | v9ses->uid = ~0; | 206 | v9ses->uid = ~0; |
| 207 | v9ses->dfltuid = V9FS_DEFUID; | 207 | v9ses->dfltuid = V9FS_DEFUID; |
| 208 | v9ses->dfltgid = V9FS_DEFGID; | 208 | v9ses->dfltgid = V9FS_DEFGID; |
| 209 | if (data) { | ||
| 210 | v9ses->options = kstrdup(data, GFP_KERNEL); | ||
| 211 | if (!v9ses->options) { | ||
| 212 | P9_DPRINTK(P9_DEBUG_ERROR, | ||
| 213 | "failed to allocate copy of option string\n"); | ||
| 214 | retval = -ENOMEM; | ||
| 215 | goto error; | ||
| 216 | } | ||
| 217 | } | ||
| 218 | 209 | ||
| 219 | rc = v9fs_parse_options(v9ses); | 210 | rc = v9fs_parse_options(v9ses, data); |
| 220 | if (rc < 0) { | 211 | if (rc < 0) { |
| 221 | retval = rc; | 212 | retval = rc; |
| 222 | goto error; | 213 | goto error; |
| 223 | } | 214 | } |
| 224 | 215 | ||
| 225 | v9ses->clnt = p9_client_create(dev_name, v9ses->options); | 216 | v9ses->clnt = p9_client_create(dev_name, data); |
| 226 | |||
| 227 | if (IS_ERR(v9ses->clnt)) { | 217 | if (IS_ERR(v9ses->clnt)) { |
| 228 | retval = PTR_ERR(v9ses->clnt); | 218 | retval = PTR_ERR(v9ses->clnt); |
| 229 | v9ses->clnt = NULL; | 219 | v9ses->clnt = NULL; |
| @@ -280,7 +270,6 @@ void v9fs_session_close(struct v9fs_session_info *v9ses) | |||
| 280 | 270 | ||
| 281 | __putname(v9ses->uname); | 271 | __putname(v9ses->uname); |
| 282 | __putname(v9ses->aname); | 272 | __putname(v9ses->aname); |
| 283 | kfree(v9ses->options); | ||
| 284 | } | 273 | } |
| 285 | 274 | ||
| 286 | /** | 275 | /** |
diff --git a/fs/9p/v9fs.h b/fs/9p/v9fs.h index a7d567192998..38762bf102a9 100644 --- a/fs/9p/v9fs.h +++ b/fs/9p/v9fs.h | |||
| @@ -85,7 +85,6 @@ struct v9fs_session_info { | |||
| 85 | unsigned int afid; | 85 | unsigned int afid; |
| 86 | unsigned int cache; | 86 | unsigned int cache; |
| 87 | 87 | ||
| 88 | char *options; /* copy of mount options */ | ||
| 89 | char *uname; /* user name to mount as */ | 88 | char *uname; /* user name to mount as */ |
| 90 | char *aname; /* name of remote hierarchy being mounted */ | 89 | char *aname; /* name of remote hierarchy being mounted */ |
| 91 | unsigned int maxdata; /* max data for client interface */ | 90 | unsigned int maxdata; /* max data for client interface */ |
diff --git a/fs/9p/vfs_inode.c b/fs/9p/vfs_inode.c index 81f8bbf12f9f..06a223d50a81 100644 --- a/fs/9p/vfs_inode.c +++ b/fs/9p/vfs_inode.c | |||
| @@ -171,7 +171,6 @@ int v9fs_uflags2omode(int uflags, int extended) | |||
| 171 | 171 | ||
| 172 | /** | 172 | /** |
| 173 | * v9fs_blank_wstat - helper function to setup a 9P stat structure | 173 | * v9fs_blank_wstat - helper function to setup a 9P stat structure |
| 174 | * @v9ses: 9P session info (for determining extended mode) | ||
| 175 | * @wstat: structure to initialize | 174 | * @wstat: structure to initialize |
| 176 | * | 175 | * |
| 177 | */ | 176 | */ |
| @@ -207,65 +206,72 @@ v9fs_blank_wstat(struct p9_wstat *wstat) | |||
| 207 | 206 | ||
| 208 | struct inode *v9fs_get_inode(struct super_block *sb, int mode) | 207 | struct inode *v9fs_get_inode(struct super_block *sb, int mode) |
| 209 | { | 208 | { |
| 209 | int err; | ||
| 210 | struct inode *inode; | 210 | struct inode *inode; |
| 211 | struct v9fs_session_info *v9ses = sb->s_fs_info; | 211 | struct v9fs_session_info *v9ses = sb->s_fs_info; |
| 212 | 212 | ||
| 213 | P9_DPRINTK(P9_DEBUG_VFS, "super block: %p mode: %o\n", sb, mode); | 213 | P9_DPRINTK(P9_DEBUG_VFS, "super block: %p mode: %o\n", sb, mode); |
| 214 | 214 | ||
| 215 | inode = new_inode(sb); | 215 | inode = new_inode(sb); |
| 216 | if (inode) { | 216 | if (!inode) { |
| 217 | inode->i_mode = mode; | ||
| 218 | inode->i_uid = current_fsuid(); | ||
| 219 | inode->i_gid = current_fsgid(); | ||
| 220 | inode->i_blocks = 0; | ||
| 221 | inode->i_rdev = 0; | ||
| 222 | inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME; | ||
| 223 | inode->i_mapping->a_ops = &v9fs_addr_operations; | ||
| 224 | |||
| 225 | switch (mode & S_IFMT) { | ||
| 226 | case S_IFIFO: | ||
| 227 | case S_IFBLK: | ||
| 228 | case S_IFCHR: | ||
| 229 | case S_IFSOCK: | ||
| 230 | if (!v9fs_extended(v9ses)) { | ||
| 231 | P9_DPRINTK(P9_DEBUG_ERROR, | ||
| 232 | "special files without extended mode\n"); | ||
| 233 | return ERR_PTR(-EINVAL); | ||
| 234 | } | ||
| 235 | init_special_inode(inode, inode->i_mode, | ||
| 236 | inode->i_rdev); | ||
| 237 | break; | ||
| 238 | case S_IFREG: | ||
| 239 | inode->i_op = &v9fs_file_inode_operations; | ||
| 240 | inode->i_fop = &v9fs_file_operations; | ||
| 241 | break; | ||
| 242 | case S_IFLNK: | ||
| 243 | if (!v9fs_extended(v9ses)) { | ||
| 244 | P9_DPRINTK(P9_DEBUG_ERROR, | ||
| 245 | "extended modes used w/o 9P2000.u\n"); | ||
| 246 | return ERR_PTR(-EINVAL); | ||
| 247 | } | ||
| 248 | inode->i_op = &v9fs_symlink_inode_operations; | ||
| 249 | break; | ||
| 250 | case S_IFDIR: | ||
| 251 | inc_nlink(inode); | ||
| 252 | if (v9fs_extended(v9ses)) | ||
| 253 | inode->i_op = &v9fs_dir_inode_operations_ext; | ||
| 254 | else | ||
| 255 | inode->i_op = &v9fs_dir_inode_operations; | ||
| 256 | inode->i_fop = &v9fs_dir_operations; | ||
| 257 | break; | ||
| 258 | default: | ||
| 259 | P9_DPRINTK(P9_DEBUG_ERROR, | ||
| 260 | "BAD mode 0x%x S_IFMT 0x%x\n", | ||
| 261 | mode, mode & S_IFMT); | ||
| 262 | return ERR_PTR(-EINVAL); | ||
| 263 | } | ||
| 264 | } else { | ||
| 265 | P9_EPRINTK(KERN_WARNING, "Problem allocating inode\n"); | 217 | P9_EPRINTK(KERN_WARNING, "Problem allocating inode\n"); |
| 266 | return ERR_PTR(-ENOMEM); | 218 | return ERR_PTR(-ENOMEM); |
| 267 | } | 219 | } |
| 220 | |||
| 221 | inode->i_mode = mode; | ||
| 222 | inode->i_uid = current_fsuid(); | ||
| 223 | inode->i_gid = current_fsgid(); | ||
| 224 | inode->i_blocks = 0; | ||
| 225 | inode->i_rdev = 0; | ||
| 226 | inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME; | ||
| 227 | inode->i_mapping->a_ops = &v9fs_addr_operations; | ||
| 228 | |||
| 229 | switch (mode & S_IFMT) { | ||
| 230 | case S_IFIFO: | ||
| 231 | case S_IFBLK: | ||
| 232 | case S_IFCHR: | ||
| 233 | case S_IFSOCK: | ||
| 234 | if (!v9fs_extended(v9ses)) { | ||
| 235 | P9_DPRINTK(P9_DEBUG_ERROR, | ||
| 236 | "special files without extended mode\n"); | ||
| 237 | err = -EINVAL; | ||
| 238 | goto error; | ||
| 239 | } | ||
| 240 | init_special_inode(inode, inode->i_mode, inode->i_rdev); | ||
| 241 | break; | ||
| 242 | case S_IFREG: | ||
| 243 | inode->i_op = &v9fs_file_inode_operations; | ||
| 244 | inode->i_fop = &v9fs_file_operations; | ||
| 245 | break; | ||
| 246 | case S_IFLNK: | ||
| 247 | if (!v9fs_extended(v9ses)) { | ||
| 248 | P9_DPRINTK(P9_DEBUG_ERROR, | ||
| 249 | "extended modes used w/o 9P2000.u\n"); | ||
| 250 | err = -EINVAL; | ||
| 251 | goto error; | ||
| 252 | } | ||
| 253 | inode->i_op = &v9fs_symlink_inode_operations; | ||
| 254 | break; | ||
| 255 | case S_IFDIR: | ||
| 256 | inc_nlink(inode); | ||
| 257 | if (v9fs_extended(v9ses)) | ||
| 258 | inode->i_op = &v9fs_dir_inode_operations_ext; | ||
| 259 | else | ||
| 260 | inode->i_op = &v9fs_dir_inode_operations; | ||
| 261 | inode->i_fop = &v9fs_dir_operations; | ||
| 262 | break; | ||
| 263 | default: | ||
| 264 | P9_DPRINTK(P9_DEBUG_ERROR, "BAD mode 0x%x S_IFMT 0x%x\n", | ||
| 265 | mode, mode & S_IFMT); | ||
| 266 | err = -EINVAL; | ||
| 267 | goto error; | ||
| 268 | } | ||
| 269 | |||
| 268 | return inode; | 270 | return inode; |
| 271 | |||
| 272 | error: | ||
| 273 | iput(inode); | ||
| 274 | return ERR_PTR(err); | ||
| 269 | } | 275 | } |
| 270 | 276 | ||
| 271 | /* | 277 | /* |
| @@ -338,30 +344,25 @@ v9fs_inode_from_fid(struct v9fs_session_info *v9ses, struct p9_fid *fid, | |||
| 338 | 344 | ||
| 339 | ret = NULL; | 345 | ret = NULL; |
| 340 | st = p9_client_stat(fid); | 346 | st = p9_client_stat(fid); |
| 341 | if (IS_ERR(st)) { | 347 | if (IS_ERR(st)) |
| 342 | err = PTR_ERR(st); | 348 | return ERR_CAST(st); |
| 343 | st = NULL; | ||
| 344 | goto error; | ||
| 345 | } | ||
| 346 | 349 | ||
| 347 | umode = p9mode2unixmode(v9ses, st->mode); | 350 | umode = p9mode2unixmode(v9ses, st->mode); |
| 348 | ret = v9fs_get_inode(sb, umode); | 351 | ret = v9fs_get_inode(sb, umode); |
| 349 | if (IS_ERR(ret)) { | 352 | if (IS_ERR(ret)) { |
| 350 | err = PTR_ERR(ret); | 353 | err = PTR_ERR(ret); |
| 351 | ret = NULL; | ||
| 352 | goto error; | 354 | goto error; |
| 353 | } | 355 | } |
| 354 | 356 | ||
| 355 | v9fs_stat2inode(st, ret, sb); | 357 | v9fs_stat2inode(st, ret, sb); |
| 356 | ret->i_ino = v9fs_qid2ino(&st->qid); | 358 | ret->i_ino = v9fs_qid2ino(&st->qid); |
| 359 | p9stat_free(st); | ||
| 357 | kfree(st); | 360 | kfree(st); |
| 358 | return ret; | 361 | return ret; |
| 359 | 362 | ||
| 360 | error: | 363 | error: |
| 364 | p9stat_free(st); | ||
| 361 | kfree(st); | 365 | kfree(st); |
| 362 | if (ret) | ||
| 363 | iput(ret); | ||
| 364 | |||
| 365 | return ERR_PTR(err); | 366 | return ERR_PTR(err); |
| 366 | } | 367 | } |
| 367 | 368 | ||
| @@ -403,9 +404,9 @@ v9fs_open_created(struct inode *inode, struct file *file) | |||
| 403 | * @v9ses: session information | 404 | * @v9ses: session information |
| 404 | * @dir: directory that dentry is being created in | 405 | * @dir: directory that dentry is being created in |
| 405 | * @dentry: dentry that is being created | 406 | * @dentry: dentry that is being created |
| 407 | * @extension: 9p2000.u extension string to support devices, etc. | ||
| 406 | * @perm: create permissions | 408 | * @perm: create permissions |
| 407 | * @mode: open mode | 409 | * @mode: open mode |
| 408 | * @extension: 9p2000.u extension string to support devices, etc. | ||
| 409 | * | 410 | * |
| 410 | */ | 411 | */ |
| 411 | static struct p9_fid * | 412 | static struct p9_fid * |
| @@ -470,7 +471,10 @@ v9fs_create(struct v9fs_session_info *v9ses, struct inode *dir, | |||
| 470 | dentry->d_op = &v9fs_dentry_operations; | 471 | dentry->d_op = &v9fs_dentry_operations; |
| 471 | 472 | ||
| 472 | d_instantiate(dentry, inode); | 473 | d_instantiate(dentry, inode); |
| 473 | v9fs_fid_add(dentry, fid); | 474 | err = v9fs_fid_add(dentry, fid); |
| 475 | if (err < 0) | ||
| 476 | goto error; | ||
| 477 | |||
| 474 | return ofid; | 478 | return ofid; |
| 475 | 479 | ||
| 476 | error: | 480 | error: |
diff --git a/fs/9p/vfs_super.c b/fs/9p/vfs_super.c index 38d695d66a0b..8961f1a8f668 100644 --- a/fs/9p/vfs_super.c +++ b/fs/9p/vfs_super.c | |||
| @@ -81,7 +81,7 @@ static int v9fs_set_super(struct super_block *s, void *data) | |||
| 81 | 81 | ||
| 82 | static void | 82 | static void |
| 83 | v9fs_fill_super(struct super_block *sb, struct v9fs_session_info *v9ses, | 83 | v9fs_fill_super(struct super_block *sb, struct v9fs_session_info *v9ses, |
| 84 | int flags) | 84 | int flags, void *data) |
| 85 | { | 85 | { |
| 86 | sb->s_maxbytes = MAX_LFS_FILESIZE; | 86 | sb->s_maxbytes = MAX_LFS_FILESIZE; |
| 87 | sb->s_blocksize_bits = fls(v9ses->maxdata - 1); | 87 | sb->s_blocksize_bits = fls(v9ses->maxdata - 1); |
| @@ -91,6 +91,8 @@ v9fs_fill_super(struct super_block *sb, struct v9fs_session_info *v9ses, | |||
| 91 | 91 | ||
| 92 | sb->s_flags = flags | MS_ACTIVE | MS_SYNCHRONOUS | MS_DIRSYNC | | 92 | sb->s_flags = flags | MS_ACTIVE | MS_SYNCHRONOUS | MS_DIRSYNC | |
| 93 | MS_NOATIME; | 93 | MS_NOATIME; |
| 94 | |||
| 95 | save_mount_options(sb, data); | ||
| 94 | } | 96 | } |
| 95 | 97 | ||
| 96 | /** | 98 | /** |
| @@ -113,14 +115,11 @@ static int v9fs_get_sb(struct file_system_type *fs_type, int flags, | |||
| 113 | struct v9fs_session_info *v9ses = NULL; | 115 | struct v9fs_session_info *v9ses = NULL; |
| 114 | struct p9_wstat *st = NULL; | 116 | struct p9_wstat *st = NULL; |
| 115 | int mode = S_IRWXUGO | S_ISVTX; | 117 | int mode = S_IRWXUGO | S_ISVTX; |
| 116 | uid_t uid = current_fsuid(); | ||
| 117 | gid_t gid = current_fsgid(); | ||
| 118 | struct p9_fid *fid; | 118 | struct p9_fid *fid; |
| 119 | int retval = 0; | 119 | int retval = 0; |
| 120 | 120 | ||
| 121 | P9_DPRINTK(P9_DEBUG_VFS, " \n"); | 121 | P9_DPRINTK(P9_DEBUG_VFS, " \n"); |
| 122 | 122 | ||
| 123 | st = NULL; | ||
| 124 | v9ses = kzalloc(sizeof(struct v9fs_session_info), GFP_KERNEL); | 123 | v9ses = kzalloc(sizeof(struct v9fs_session_info), GFP_KERNEL); |
| 125 | if (!v9ses) | 124 | if (!v9ses) |
| 126 | return -ENOMEM; | 125 | return -ENOMEM; |
| @@ -142,7 +141,7 @@ static int v9fs_get_sb(struct file_system_type *fs_type, int flags, | |||
| 142 | retval = PTR_ERR(sb); | 141 | retval = PTR_ERR(sb); |
| 143 | goto free_stat; | 142 | goto free_stat; |
| 144 | } | 143 | } |
| 145 | v9fs_fill_super(sb, v9ses, flags); | 144 | v9fs_fill_super(sb, v9ses, flags, data); |
| 146 | 145 | ||
| 147 | inode = v9fs_get_inode(sb, S_IFDIR | mode); | 146 | inode = v9fs_get_inode(sb, S_IFDIR | mode); |
| 148 | if (IS_ERR(inode)) { | 147 | if (IS_ERR(inode)) { |
| @@ -150,9 +149,6 @@ static int v9fs_get_sb(struct file_system_type *fs_type, int flags, | |||
| 150 | goto release_sb; | 149 | goto release_sb; |
| 151 | } | 150 | } |
| 152 | 151 | ||
| 153 | inode->i_uid = uid; | ||
| 154 | inode->i_gid = gid; | ||
| 155 | |||
| 156 | root = d_alloc_root(inode); | 152 | root = d_alloc_root(inode); |
| 157 | if (!root) { | 153 | if (!root) { |
| 158 | iput(inode); | 154 | iput(inode); |
| @@ -173,10 +169,8 @@ P9_DPRINTK(P9_DEBUG_VFS, " simple set mount, return 0\n"); | |||
| 173 | simple_set_mnt(mnt, sb); | 169 | simple_set_mnt(mnt, sb); |
| 174 | return 0; | 170 | return 0; |
| 175 | 171 | ||
| 176 | release_sb: | ||
| 177 | deactivate_locked_super(sb); | ||
| 178 | |||
| 179 | free_stat: | 172 | free_stat: |
| 173 | p9stat_free(st); | ||
| 180 | kfree(st); | 174 | kfree(st); |
| 181 | 175 | ||
| 182 | clunk_fid: | 176 | clunk_fid: |
| @@ -185,7 +179,12 @@ clunk_fid: | |||
| 185 | close_session: | 179 | close_session: |
| 186 | v9fs_session_close(v9ses); | 180 | v9fs_session_close(v9ses); |
| 187 | kfree(v9ses); | 181 | kfree(v9ses); |
| 182 | return retval; | ||
| 188 | 183 | ||
| 184 | release_sb: | ||
| 185 | p9stat_free(st); | ||
| 186 | kfree(st); | ||
| 187 | deactivate_locked_super(sb); | ||
| 189 | return retval; | 188 | return retval; |
| 190 | } | 189 | } |
| 191 | 190 | ||
| @@ -207,24 +206,10 @@ static void v9fs_kill_super(struct super_block *s) | |||
| 207 | 206 | ||
| 208 | v9fs_session_close(v9ses); | 207 | v9fs_session_close(v9ses); |
| 209 | kfree(v9ses); | 208 | kfree(v9ses); |
| 209 | s->s_fs_info = NULL; | ||
| 210 | P9_DPRINTK(P9_DEBUG_VFS, "exiting kill_super\n"); | 210 | P9_DPRINTK(P9_DEBUG_VFS, "exiting kill_super\n"); |
| 211 | } | 211 | } |
| 212 | 212 | ||
| 213 | /** | ||
| 214 | * v9fs_show_options - Show mount options in /proc/mounts | ||
| 215 | * @m: seq_file to write to | ||
| 216 | * @mnt: mount descriptor | ||
| 217 | * | ||
| 218 | */ | ||
| 219 | |||
| 220 | static int v9fs_show_options(struct seq_file *m, struct vfsmount *mnt) | ||
| 221 | { | ||
| 222 | struct v9fs_session_info *v9ses = mnt->mnt_sb->s_fs_info; | ||
| 223 | |||
| 224 | seq_printf(m, "%s", v9ses->options); | ||
| 225 | return 0; | ||
| 226 | } | ||
| 227 | |||
| 228 | static void | 213 | static void |
| 229 | v9fs_umount_begin(struct super_block *sb) | 214 | v9fs_umount_begin(struct super_block *sb) |
| 230 | { | 215 | { |
| @@ -237,7 +222,7 @@ v9fs_umount_begin(struct super_block *sb) | |||
| 237 | static const struct super_operations v9fs_super_ops = { | 222 | static const struct super_operations v9fs_super_ops = { |
| 238 | .statfs = simple_statfs, | 223 | .statfs = simple_statfs, |
| 239 | .clear_inode = v9fs_clear_inode, | 224 | .clear_inode = v9fs_clear_inode, |
| 240 | .show_options = v9fs_show_options, | 225 | .show_options = generic_show_options, |
| 241 | .umount_begin = v9fs_umount_begin, | 226 | .umount_begin = v9fs_umount_begin, |
| 242 | }; | 227 | }; |
| 243 | 228 | ||
diff --git a/fs/afs/file.c b/fs/afs/file.c index 0149dab365e7..681c2a7b013f 100644 --- a/fs/afs/file.c +++ b/fs/afs/file.c | |||
| @@ -134,9 +134,16 @@ static int afs_readpage(struct file *file, struct page *page) | |||
| 134 | 134 | ||
| 135 | inode = page->mapping->host; | 135 | inode = page->mapping->host; |
| 136 | 136 | ||
| 137 | ASSERT(file != NULL); | 137 | if (file) { |
| 138 | key = file->private_data; | 138 | key = file->private_data; |
| 139 | ASSERT(key != NULL); | 139 | ASSERT(key != NULL); |
| 140 | } else { | ||
| 141 | key = afs_request_key(AFS_FS_S(inode->i_sb)->volume->cell); | ||
| 142 | if (IS_ERR(key)) { | ||
| 143 | ret = PTR_ERR(key); | ||
| 144 | goto error_nokey; | ||
| 145 | } | ||
| 146 | } | ||
| 140 | 147 | ||
| 141 | _enter("{%x},{%lu},{%lu}", key_serial(key), inode->i_ino, page->index); | 148 | _enter("{%x},{%lu},{%lu}", key_serial(key), inode->i_ino, page->index); |
| 142 | 149 | ||
| @@ -207,12 +214,17 @@ static int afs_readpage(struct file *file, struct page *page) | |||
| 207 | unlock_page(page); | 214 | unlock_page(page); |
| 208 | } | 215 | } |
| 209 | 216 | ||
| 217 | if (!file) | ||
| 218 | key_put(key); | ||
| 210 | _leave(" = 0"); | 219 | _leave(" = 0"); |
| 211 | return 0; | 220 | return 0; |
| 212 | 221 | ||
| 213 | error: | 222 | error: |
| 214 | SetPageError(page); | 223 | SetPageError(page); |
| 215 | unlock_page(page); | 224 | unlock_page(page); |
| 225 | if (!file) | ||
| 226 | key_put(key); | ||
| 227 | error_nokey: | ||
| 216 | _leave(" = %d", ret); | 228 | _leave(" = %d", ret); |
| 217 | return ret; | 229 | return ret; |
| 218 | } | 230 | } |
| @@ -429,7 +429,7 @@ u64 __init lmb_phys_mem_size(void) | |||
| 429 | return lmb.memory.size; | 429 | return lmb.memory.size; |
| 430 | } | 430 | } |
| 431 | 431 | ||
| 432 | u64 __init lmb_end_of_DRAM(void) | 432 | u64 lmb_end_of_DRAM(void) |
| 433 | { | 433 | { |
| 434 | int idx = lmb.memory.cnt - 1; | 434 | int idx = lmb.memory.cnt - 1; |
| 435 | 435 | ||
diff --git a/net/9p/client.c b/net/9p/client.c index 787ccddb85ea..5bf5f227dbe0 100644 --- a/net/9p/client.c +++ b/net/9p/client.c | |||
| @@ -60,9 +60,9 @@ static struct p9_req_t * | |||
| 60 | p9_client_rpc(struct p9_client *c, int8_t type, const char *fmt, ...); | 60 | p9_client_rpc(struct p9_client *c, int8_t type, const char *fmt, ...); |
| 61 | 61 | ||
| 62 | /** | 62 | /** |
| 63 | * v9fs_parse_options - parse mount options into session structure | 63 | * parse_options - parse mount options into client structure |
| 64 | * @options: options string passed from mount | 64 | * @opts: options string passed from mount |
| 65 | * @v9ses: existing v9fs session information | 65 | * @clnt: existing v9fs client information |
| 66 | * | 66 | * |
| 67 | * Return 0 upon success, -ERRNO upon failure | 67 | * Return 0 upon success, -ERRNO upon failure |
| 68 | */ | 68 | */ |
| @@ -232,7 +232,7 @@ EXPORT_SYMBOL(p9_tag_lookup); | |||
| 232 | 232 | ||
| 233 | /** | 233 | /** |
| 234 | * p9_tag_init - setup tags structure and contents | 234 | * p9_tag_init - setup tags structure and contents |
| 235 | * @tags: tags structure from the client struct | 235 | * @c: v9fs client struct |
| 236 | * | 236 | * |
| 237 | * This initializes the tags structure for each client instance. | 237 | * This initializes the tags structure for each client instance. |
| 238 | * | 238 | * |
| @@ -258,7 +258,7 @@ error: | |||
| 258 | 258 | ||
| 259 | /** | 259 | /** |
| 260 | * p9_tag_cleanup - cleans up tags structure and reclaims resources | 260 | * p9_tag_cleanup - cleans up tags structure and reclaims resources |
| 261 | * @tags: tags structure from the client struct | 261 | * @c: v9fs client struct |
| 262 | * | 262 | * |
| 263 | * This frees resources associated with the tags structure | 263 | * This frees resources associated with the tags structure |
| 264 | * | 264 | * |
| @@ -411,14 +411,9 @@ static int p9_check_errors(struct p9_client *c, struct p9_req_t *req) | |||
| 411 | if (c->dotu) | 411 | if (c->dotu) |
| 412 | err = -ecode; | 412 | err = -ecode; |
| 413 | 413 | ||
| 414 | if (!err) { | 414 | if (!err || !IS_ERR_VALUE(err)) |
| 415 | err = p9_errstr2errno(ename, strlen(ename)); | 415 | err = p9_errstr2errno(ename, strlen(ename)); |
| 416 | 416 | ||
| 417 | /* string match failed */ | ||
| 418 | if (!err) | ||
| 419 | err = -ESERVERFAULT; | ||
| 420 | } | ||
| 421 | |||
| 422 | P9_DPRINTK(P9_DEBUG_9P, "<<< RERROR (%d) %s\n", -ecode, ename); | 417 | P9_DPRINTK(P9_DEBUG_9P, "<<< RERROR (%d) %s\n", -ecode, ename); |
| 423 | 418 | ||
| 424 | kfree(ename); | 419 | kfree(ename); |
| @@ -430,8 +425,8 @@ static int p9_check_errors(struct p9_client *c, struct p9_req_t *req) | |||
| 430 | 425 | ||
| 431 | /** | 426 | /** |
| 432 | * p9_client_flush - flush (cancel) a request | 427 | * p9_client_flush - flush (cancel) a request |
| 433 | * c: client state | 428 | * @c: client state |
| 434 | * req: request to cancel | 429 | * @oldreq: request to cancel |
| 435 | * | 430 | * |
| 436 | * This sents a flush for a particular requests and links | 431 | * This sents a flush for a particular requests and links |
| 437 | * the flush request to the original request. The current | 432 | * the flush request to the original request. The current |
diff --git a/net/9p/error.c b/net/9p/error.c index fdebe4314062..52518512a93e 100644 --- a/net/9p/error.c +++ b/net/9p/error.c | |||
| @@ -239,7 +239,7 @@ int p9_errstr2errno(char *errstr, int len) | |||
| 239 | errstr[len] = 0; | 239 | errstr[len] = 0; |
| 240 | printk(KERN_ERR "%s: server reported unknown error %s\n", | 240 | printk(KERN_ERR "%s: server reported unknown error %s\n", |
| 241 | __func__, errstr); | 241 | __func__, errstr); |
| 242 | errno = 1; | 242 | errno = ESERVERFAULT; |
| 243 | } | 243 | } |
| 244 | 244 | ||
| 245 | return -errno; | 245 | return -errno; |
diff --git a/net/9p/trans_fd.c b/net/9p/trans_fd.c index 8c2588e4edc0..8d934dd7fd54 100644 --- a/net/9p/trans_fd.c +++ b/net/9p/trans_fd.c | |||
| @@ -119,8 +119,8 @@ struct p9_poll_wait { | |||
| 119 | * @wpos: write position for current frame | 119 | * @wpos: write position for current frame |
| 120 | * @wsize: amount of data to write for current frame | 120 | * @wsize: amount of data to write for current frame |
| 121 | * @wbuf: current write buffer | 121 | * @wbuf: current write buffer |
| 122 | * @poll_pending_link: pending links to be polled per conn | ||
| 122 | * @poll_wait: array of wait_q's for various worker threads | 123 | * @poll_wait: array of wait_q's for various worker threads |
| 123 | * @poll_waddr: ???? | ||
| 124 | * @pt: poll state | 124 | * @pt: poll state |
| 125 | * @rq: current read work | 125 | * @rq: current read work |
| 126 | * @wq: current write work | 126 | * @wq: current write work |
| @@ -700,9 +700,9 @@ static int p9_fd_cancel(struct p9_client *client, struct p9_req_t *req) | |||
| 700 | } | 700 | } |
| 701 | 701 | ||
| 702 | /** | 702 | /** |
| 703 | * parse_options - parse mount options into session structure | 703 | * parse_opts - parse mount options into p9_fd_opts structure |
| 704 | * @options: options string passed from mount | 704 | * @params: options string passed from mount |
| 705 | * @opts: transport-specific structure to parse options into | 705 | * @opts: fd transport-specific structure to parse options into |
| 706 | * | 706 | * |
| 707 | * Returns 0 upon success, -ERRNO upon failure | 707 | * Returns 0 upon success, -ERRNO upon failure |
| 708 | */ | 708 | */ |
diff --git a/net/9p/trans_rdma.c b/net/9p/trans_rdma.c index ac4990041ebb..65cb29db03f8 100644 --- a/net/9p/trans_rdma.c +++ b/net/9p/trans_rdma.c | |||
| @@ -67,14 +67,15 @@ | |||
| 67 | * @pd: Protection Domain pointer | 67 | * @pd: Protection Domain pointer |
| 68 | * @qp: Queue Pair pointer | 68 | * @qp: Queue Pair pointer |
| 69 | * @cq: Completion Queue pointer | 69 | * @cq: Completion Queue pointer |
| 70 | * @dm_mr: DMA Memory Region pointer | ||
| 70 | * @lkey: The local access only memory region key | 71 | * @lkey: The local access only memory region key |
| 71 | * @timeout: Number of uSecs to wait for connection management events | 72 | * @timeout: Number of uSecs to wait for connection management events |
| 72 | * @sq_depth: The depth of the Send Queue | 73 | * @sq_depth: The depth of the Send Queue |
| 73 | * @sq_sem: Semaphore for the SQ | 74 | * @sq_sem: Semaphore for the SQ |
| 74 | * @rq_depth: The depth of the Receive Queue. | 75 | * @rq_depth: The depth of the Receive Queue. |
| 76 | * @rq_count: Count of requests in the Receive Queue. | ||
| 75 | * @addr: The remote peer's address | 77 | * @addr: The remote peer's address |
| 76 | * @req_lock: Protects the active request list | 78 | * @req_lock: Protects the active request list |
| 77 | * @send_wait: Wait list when the SQ fills up | ||
| 78 | * @cm_done: Completion event for connection management tracking | 79 | * @cm_done: Completion event for connection management tracking |
| 79 | */ | 80 | */ |
| 80 | struct p9_trans_rdma { | 81 | struct p9_trans_rdma { |
| @@ -154,9 +155,9 @@ static match_table_t tokens = { | |||
| 154 | }; | 155 | }; |
| 155 | 156 | ||
| 156 | /** | 157 | /** |
| 157 | * parse_options - parse mount options into session structure | 158 | * parse_opts - parse mount options into rdma options structure |
| 158 | * @options: options string passed from mount | 159 | * @params: options string passed from mount |
| 159 | * @opts: transport-specific structure to parse options into | 160 | * @opts: rdma transport-specific structure to parse options into |
| 160 | * | 161 | * |
| 161 | * Returns 0 upon success, -ERRNO upon failure | 162 | * Returns 0 upon success, -ERRNO upon failure |
| 162 | */ | 163 | */ |
diff --git a/net/9p/trans_virtio.c b/net/9p/trans_virtio.c index a49484e67e1d..9bf0b737aa51 100644 --- a/net/9p/trans_virtio.c +++ b/net/9p/trans_virtio.c | |||
| @@ -57,11 +57,9 @@ static int chan_index; | |||
| 57 | * @initialized: whether the channel is initialized | 57 | * @initialized: whether the channel is initialized |
| 58 | * @inuse: whether the channel is in use | 58 | * @inuse: whether the channel is in use |
| 59 | * @lock: protects multiple elements within this structure | 59 | * @lock: protects multiple elements within this structure |
| 60 | * @client: client instance | ||
| 60 | * @vdev: virtio dev associated with this channel | 61 | * @vdev: virtio dev associated with this channel |
| 61 | * @vq: virtio queue associated with this channel | 62 | * @vq: virtio queue associated with this channel |
| 62 | * @tagpool: accounting for tag ids (and request slots) | ||
| 63 | * @reqs: array of request slots | ||
| 64 | * @max_tag: current number of request_slots allocated | ||
| 65 | * @sg: scatter gather list which is used to pack a request (protected?) | 63 | * @sg: scatter gather list which is used to pack a request (protected?) |
| 66 | * | 64 | * |
| 67 | * We keep all per-channel information in a structure. | 65 | * We keep all per-channel information in a structure. |
| @@ -92,7 +90,7 @@ static unsigned int rest_of_page(void *data) | |||
| 92 | 90 | ||
| 93 | /** | 91 | /** |
| 94 | * p9_virtio_close - reclaim resources of a channel | 92 | * p9_virtio_close - reclaim resources of a channel |
| 95 | * @trans: transport state | 93 | * @client: client instance |
| 96 | * | 94 | * |
| 97 | * This reclaims a channel by freeing its resources and | 95 | * This reclaims a channel by freeing its resources and |
| 98 | * reseting its inuse flag. | 96 | * reseting its inuse flag. |
| @@ -181,9 +179,8 @@ static int p9_virtio_cancel(struct p9_client *client, struct p9_req_t *req) | |||
| 181 | 179 | ||
| 182 | /** | 180 | /** |
| 183 | * p9_virtio_request - issue a request | 181 | * p9_virtio_request - issue a request |
| 184 | * @t: transport state | 182 | * @client: client instance issuing the request |
| 185 | * @tc: &p9_fcall request to transmit | 183 | * @req: request to be issued |
| 186 | * @rc: &p9_fcall to put reponse into | ||
| 187 | * | 184 | * |
| 188 | */ | 185 | */ |
| 189 | 186 | ||
diff --git a/net/ipv4/ip_output.c b/net/ipv4/ip_output.c index 7d0821054729..7ffcd96fe591 100644 --- a/net/ipv4/ip_output.c +++ b/net/ipv4/ip_output.c | |||
| @@ -813,6 +813,8 @@ int ip_append_data(struct sock *sk, | |||
| 813 | inet->cork.addr = ipc->addr; | 813 | inet->cork.addr = ipc->addr; |
| 814 | } | 814 | } |
| 815 | rt = *rtp; | 815 | rt = *rtp; |
| 816 | if (unlikely(!rt)) | ||
| 817 | return -EFAULT; | ||
| 816 | /* | 818 | /* |
| 817 | * We steal reference to this route, caller should not release it | 819 | * We steal reference to this route, caller should not release it |
| 818 | */ | 820 | */ |
