diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2008-05-14 22:30:13 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2008-05-14 22:30:51 -0400 |
| commit | 8f40f672e6bb071812f61bfbd30efc3fc1263ad1 (patch) | |
| tree | 8dcdbbb7adc68647267794c4e3a4686afd94ad65 | |
| parent | 8978a318837d7acefca82645017c0534aeba5a36 (diff) | |
| parent | 887b3ece65be7b643dfdae0d433c91a26a3f437d (diff) | |
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/ericvh/v9fs
* 'for-linus' of ssh://master.kernel.org/pub/scm/linux/kernel/git/ericvh/v9fs:
9p: fix error path during early mount
9p: make cryptic unknown error from server less scary
9p: fix flags length in net
9p: Correct fidpool creation failure in p9_client_create
9p: use struct mutex instead of struct semaphore
9p: propagate parse_option changes to client and transports
fs/9p/v9fs.c (v9fs_parse_options): Handle kstrdup and match_strdup failure.
9p: Documentation updates
add match_strlcpy() us it to make v9fs make uname and remotename parsing more robust
| -rw-r--r-- | fs/9p/fid.h | 15 | ||||
| -rw-r--r-- | fs/9p/v9fs.c | 57 | ||||
| -rw-r--r-- | fs/9p/v9fs.h | 85 | ||||
| -rw-r--r-- | fs/9p/vfs_addr.c | 2 | ||||
| -rw-r--r-- | fs/9p/vfs_dir.c | 2 | ||||
| -rw-r--r-- | fs/9p/vfs_file.c | 11 | ||||
| -rw-r--r-- | fs/9p/vfs_inode.c | 50 | ||||
| -rw-r--r-- | fs/9p/vfs_super.c | 35 | ||||
| -rw-r--r-- | include/linux/parser.h | 2 | ||||
| -rw-r--r-- | include/net/9p/9p.h | 240 | ||||
| -rw-r--r-- | include/net/9p/client.h | 35 | ||||
| -rw-r--r-- | include/net/9p/transport.h | 44 | ||||
| -rw-r--r-- | lib/parser.c | 32 | ||||
| -rw-r--r-- | net/9p/Kconfig | 10 | ||||
| -rw-r--r-- | net/9p/Makefile | 3 | ||||
| -rw-r--r-- | net/9p/client.c | 32 | ||||
| -rw-r--r-- | net/9p/conv.c | 128 | ||||
| -rw-r--r-- | net/9p/error.c | 15 | ||||
| -rw-r--r-- | net/9p/fcprint.c | 8 | ||||
| -rw-r--r-- | net/9p/mod.c | 8 | ||||
| -rw-r--r-- | net/9p/trans_fd.c | 204 | ||||
| -rw-r--r-- | net/9p/trans_virtio.c | 175 | ||||
| -rw-r--r-- | net/9p/util.c | 36 |
23 files changed, 1014 insertions, 215 deletions
diff --git a/fs/9p/fid.h b/fs/9p/fid.h index 26e07df783b9..c3bbd6af996d 100644 --- a/fs/9p/fid.h +++ b/fs/9p/fid.h | |||
| @@ -22,6 +22,21 @@ | |||
| 22 | 22 | ||
| 23 | #include <linux/list.h> | 23 | #include <linux/list.h> |
| 24 | 24 | ||
| 25 | /** | ||
| 26 | * struct v9fs_dentry - 9p private data stored in dentry d_fsdata | ||
| 27 | * @lock: protects the fidlist | ||
| 28 | * @fidlist: list of FIDs currently associated with this dentry | ||
| 29 | * | ||
| 30 | * This structure defines the 9p private data associated with | ||
| 31 | * a particular dentry. In particular, this private data is used | ||
| 32 | * to lookup which 9P FID handle should be used for a particular VFS | ||
| 33 | * operation. FID handles are associated with dentries instead of | ||
| 34 | * inodes in order to more closely map functionality to the Plan 9 | ||
| 35 | * expected behavior for FID reclaimation and tracking. | ||
| 36 | * | ||
| 37 | * See Also: Mapping FIDs to Linux VFS model in | ||
| 38 | * Design and Implementation of the Linux 9P File System documentation | ||
| 39 | */ | ||
| 25 | struct v9fs_dentry { | 40 | struct v9fs_dentry { |
| 26 | spinlock_t lock; /* protect fidlist */ | 41 | spinlock_t lock; /* protect fidlist */ |
| 27 | struct list_head fidlist; | 42 | struct list_head fidlist; |
diff --git a/fs/9p/v9fs.c b/fs/9p/v9fs.c index 9b0f0222e8bb..047c791427aa 100644 --- a/fs/9p/v9fs.c +++ b/fs/9p/v9fs.c | |||
| @@ -71,19 +71,19 @@ static match_table_t tokens = { | |||
| 71 | 71 | ||
| 72 | /** | 72 | /** |
| 73 | * v9fs_parse_options - parse mount options into session structure | 73 | * v9fs_parse_options - parse mount options into session structure |
| 74 | * @options: options string passed from mount | ||
| 75 | * @v9ses: existing v9fs session information | 74 | * @v9ses: existing v9fs session information |
| 76 | * | 75 | * |
| 76 | * Return 0 upon success, -ERRNO upon failure. | ||
| 77 | */ | 77 | */ |
| 78 | 78 | ||
| 79 | static void v9fs_parse_options(struct v9fs_session_info *v9ses) | 79 | static int v9fs_parse_options(struct v9fs_session_info *v9ses) |
| 80 | { | 80 | { |
| 81 | char *options; | 81 | char *options; |
| 82 | substring_t args[MAX_OPT_ARGS]; | 82 | substring_t args[MAX_OPT_ARGS]; |
| 83 | char *p; | 83 | char *p; |
| 84 | int option = 0; | 84 | int option = 0; |
| 85 | char *s, *e; | 85 | char *s, *e; |
| 86 | int ret; | 86 | int ret = 0; |
| 87 | 87 | ||
| 88 | /* setup defaults */ | 88 | /* setup defaults */ |
| 89 | v9ses->afid = ~0; | 89 | v9ses->afid = ~0; |
| @@ -91,19 +91,26 @@ static void v9fs_parse_options(struct v9fs_session_info *v9ses) | |||
| 91 | v9ses->cache = 0; | 91 | v9ses->cache = 0; |
| 92 | 92 | ||
| 93 | if (!v9ses->options) | 93 | if (!v9ses->options) |
| 94 | return; | 94 | return 0; |
| 95 | 95 | ||
| 96 | options = kstrdup(v9ses->options, GFP_KERNEL); | 96 | options = kstrdup(v9ses->options, GFP_KERNEL); |
| 97 | if (!options) { | ||
| 98 | P9_DPRINTK(P9_DEBUG_ERROR, | ||
| 99 | "failed to allocate copy of option string\n"); | ||
| 100 | return -ENOMEM; | ||
| 101 | } | ||
| 102 | |||
| 97 | while ((p = strsep(&options, ",")) != NULL) { | 103 | while ((p = strsep(&options, ",")) != NULL) { |
| 98 | int token; | 104 | int token; |
| 99 | if (!*p) | 105 | if (!*p) |
| 100 | continue; | 106 | continue; |
| 101 | token = match_token(p, tokens, args); | 107 | token = match_token(p, tokens, args); |
| 102 | if (token < Opt_uname) { | 108 | if (token < Opt_uname) { |
| 103 | ret = match_int(&args[0], &option); | 109 | int r = match_int(&args[0], &option); |
| 104 | if (ret < 0) { | 110 | if (r < 0) { |
| 105 | P9_DPRINTK(P9_DEBUG_ERROR, | 111 | P9_DPRINTK(P9_DEBUG_ERROR, |
| 106 | "integer field, but no integer?\n"); | 112 | "integer field, but no integer?\n"); |
| 113 | ret = r; | ||
| 107 | continue; | 114 | continue; |
| 108 | } | 115 | } |
| 109 | } | 116 | } |
| @@ -125,10 +132,10 @@ static void v9fs_parse_options(struct v9fs_session_info *v9ses) | |||
| 125 | v9ses->afid = option; | 132 | v9ses->afid = option; |
| 126 | break; | 133 | break; |
| 127 | case Opt_uname: | 134 | case Opt_uname: |
| 128 | match_strcpy(v9ses->uname, &args[0]); | 135 | match_strlcpy(v9ses->uname, &args[0], PATH_MAX); |
| 129 | break; | 136 | break; |
| 130 | case Opt_remotename: | 137 | case Opt_remotename: |
| 131 | match_strcpy(v9ses->aname, &args[0]); | 138 | match_strlcpy(v9ses->aname, &args[0], PATH_MAX); |
| 132 | break; | 139 | break; |
| 133 | case Opt_nodevmap: | 140 | case Opt_nodevmap: |
| 134 | v9ses->nodev = 1; | 141 | v9ses->nodev = 1; |
| @@ -139,6 +146,13 @@ static void v9fs_parse_options(struct v9fs_session_info *v9ses) | |||
| 139 | 146 | ||
| 140 | case Opt_access: | 147 | case Opt_access: |
| 141 | s = match_strdup(&args[0]); | 148 | s = match_strdup(&args[0]); |
| 149 | if (!s) { | ||
| 150 | P9_DPRINTK(P9_DEBUG_ERROR, | ||
| 151 | "failed to allocate copy" | ||
| 152 | " of option argument\n"); | ||
| 153 | ret = -ENOMEM; | ||
| 154 | break; | ||
| 155 | } | ||
| 142 | v9ses->flags &= ~V9FS_ACCESS_MASK; | 156 | v9ses->flags &= ~V9FS_ACCESS_MASK; |
| 143 | if (strcmp(s, "user") == 0) | 157 | if (strcmp(s, "user") == 0) |
| 144 | v9ses->flags |= V9FS_ACCESS_USER; | 158 | v9ses->flags |= V9FS_ACCESS_USER; |
| @@ -158,6 +172,7 @@ static void v9fs_parse_options(struct v9fs_session_info *v9ses) | |||
| 158 | } | 172 | } |
| 159 | } | 173 | } |
| 160 | kfree(options); | 174 | kfree(options); |
| 175 | return ret; | ||
| 161 | } | 176 | } |
| 162 | 177 | ||
| 163 | /** | 178 | /** |
| @@ -173,6 +188,7 @@ struct p9_fid *v9fs_session_init(struct v9fs_session_info *v9ses, | |||
| 173 | { | 188 | { |
| 174 | int retval = -EINVAL; | 189 | int retval = -EINVAL; |
| 175 | struct p9_fid *fid; | 190 | struct p9_fid *fid; |
| 191 | int rc; | ||
| 176 | 192 | ||
| 177 | v9ses->uname = __getname(); | 193 | v9ses->uname = __getname(); |
| 178 | if (!v9ses->uname) | 194 | if (!v9ses->uname) |
| @@ -190,8 +206,21 @@ struct p9_fid *v9fs_session_init(struct v9fs_session_info *v9ses, | |||
| 190 | v9ses->uid = ~0; | 206 | v9ses->uid = ~0; |
| 191 | v9ses->dfltuid = V9FS_DEFUID; | 207 | v9ses->dfltuid = V9FS_DEFUID; |
| 192 | v9ses->dfltgid = V9FS_DEFGID; | 208 | v9ses->dfltgid = V9FS_DEFGID; |
| 193 | v9ses->options = kstrdup(data, GFP_KERNEL); | 209 | if (data) { |
| 194 | v9fs_parse_options(v9ses); | 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 | |||
| 219 | rc = v9fs_parse_options(v9ses); | ||
| 220 | if (rc < 0) { | ||
| 221 | retval = rc; | ||
| 222 | goto error; | ||
