aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLatchesar Ionkov <lucho@ionkov.net>2006-01-08 04:05:02 -0500
committerLinus Torvalds <torvalds@g5.osdl.org>2006-01-08 23:14:06 -0500
commit1dac06b20dcc8078dab037bd70652c69c67ba672 (patch)
tree34436f474074aa2760604555e3aa9b02df18fce2
parent531b1094b74365dcc55fa464d28a9a2497ae825d (diff)
[PATCH] v9fs: handle kthread_create failure, minor bugfixes
- remove unnecessary -ENOMEM assignments - return correct value when buf_check_size for second time in a buffer - handle failures when create_workqueue and kthread_create are called - use kzalloc instead of kmalloc/memset 0 - v9fs_str_copy and v9fs_str_compare were buggy, were used only in one place, correct the logic and move it to the place it is used. Signed-off-by: Latchesar Ionkov <lucho@ionkov.net> Cc: Eric Van Hensbergen <ericvh@ericvh.myip.org> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
-rw-r--r--fs/9p/9p.c10
-rw-r--r--fs/9p/9p.h3
-rw-r--r--fs/9p/conv.c45
-rw-r--r--fs/9p/error.h1
-rw-r--r--fs/9p/mux.c38
-rw-r--r--fs/9p/mux.h3
-rw-r--r--fs/9p/v9fs.c19
-rw-r--r--fs/9p/vfs_inode.c7
-rw-r--r--fs/9p/vfs_super.c3
9 files changed, 58 insertions, 71 deletions
diff --git a/fs/9p/9p.c b/fs/9p/9p.c
index dc3ce44ec836..1a6d08761f39 100644
--- a/fs/9p/9p.c
+++ b/fs/9p/9p.c
@@ -86,7 +86,6 @@ v9fs_t_attach(struct v9fs_session_info *v9ses, char *uname, char *aname,
86 dprintk(DEBUG_9P, "uname '%s' aname '%s' fid %d afid %d\n", uname, 86 dprintk(DEBUG_9P, "uname '%s' aname '%s' fid %d afid %d\n", uname,
87 aname, fid, afid); 87 aname, fid, afid);
88 88
89 ret = -ENOMEM;
90 tc = v9fs_create_tattach(fid, afid, uname, aname); 89 tc = v9fs_create_tattach(fid, afid, uname, aname);
91 if (!IS_ERR(tc)) { 90 if (!IS_ERR(tc)) {
92 ret = v9fs_mux_rpc(v9ses->mux, tc, rcp); 91 ret = v9fs_mux_rpc(v9ses->mux, tc, rcp);
@@ -136,7 +135,6 @@ v9fs_t_clunk(struct v9fs_session_info *v9ses, u32 fid)
136 135
137 dprintk(DEBUG_9P, "fid %d\n", fid); 136 dprintk(DEBUG_9P, "fid %d\n", fid);
138 137
139 ret = -ENOMEM;
140 rc = NULL; 138 rc = NULL;
141 tc = v9fs_create_tclunk(fid); 139 tc = v9fs_create_tclunk(fid);
142 if (!IS_ERR(tc)) 140 if (!IS_ERR(tc))
@@ -165,7 +163,6 @@ int v9fs_t_flush(struct v9fs_session_info *v9ses, u16 oldtag)
165 163
166 dprintk(DEBUG_9P, "oldtag %d\n", oldtag); 164 dprintk(DEBUG_9P, "oldtag %d\n", oldtag);
167 165
168 ret = -ENOMEM;
169 tc = v9fs_create_tflush(oldtag); 166 tc = v9fs_create_tflush(oldtag);
170 if (!IS_ERR(tc)) { 167 if (!IS_ERR(tc)) {
171 ret = v9fs_mux_rpc(v9ses->mux, tc, NULL); 168 ret = v9fs_mux_rpc(v9ses->mux, tc, NULL);
@@ -221,7 +218,6 @@ v9fs_t_wstat(struct v9fs_session_info *v9ses, u32 fid,
221 218
222 dprintk(DEBUG_9P, "fid %d\n", fid); 219 dprintk(DEBUG_9P, "fid %d\n", fid);
223 220
224 ret = -ENOMEM;
225 tc = v9fs_create_twstat(fid, wstat, v9ses->extended); 221 tc = v9fs_create_twstat(fid, wstat, v9ses->extended);
226 if (!IS_ERR(tc)) { 222 if (!IS_ERR(tc)) {
227 ret = v9fs_mux_rpc(v9ses->mux, tc, rcp); 223 ret = v9fs_mux_rpc(v9ses->mux, tc, rcp);
@@ -259,7 +255,6 @@ v9fs_t_walk(struct v9fs_session_info *v9ses, u32 fid, u32 newfid,
259 else 255 else
260 nwname = 0; 256 nwname = 0;
261 257
262 ret = -ENOMEM;
263 tc = v9fs_create_twalk(fid, newfid, nwname, &name); 258 tc = v9fs_create_twalk(fid, newfid, nwname, &name);
264 if (!IS_ERR(tc)) { 259 if (!IS_ERR(tc)) {
265 ret = v9fs_mux_rpc(v9ses->mux, tc, rcp); 260 ret = v9fs_mux_rpc(v9ses->mux, tc, rcp);
@@ -289,7 +284,6 @@ v9fs_t_open(struct v9fs_session_info *v9ses, u32 fid, u8 mode,
289 284
290 dprintk(DEBUG_9P, "fid %d mode %d\n", fid, mode); 285 dprintk(DEBUG_9P, "fid %d mode %d\n", fid, mode);
291 286
292 ret = -ENOMEM;
293 tc = v9fs_create_topen(fid, mode); 287 tc = v9fs_create_topen(fid, mode);
294 if (!IS_ERR(tc)) { 288 if (!IS_ERR(tc)) {
295 ret = v9fs_mux_rpc(v9ses->mux, tc, rcp); 289 ret = v9fs_mux_rpc(v9ses->mux, tc, rcp);
@@ -317,7 +311,6 @@ v9fs_t_remove(struct v9fs_session_info *v9ses, u32 fid,
317 311
318 dprintk(DEBUG_9P, "fid %d\n", fid); 312 dprintk(DEBUG_9P, "fid %d\n", fid);
319 313
320 ret = -ENOMEM;
321 tc = v9fs_create_tremove(fid); 314 tc = v9fs_create_tremove(fid);
322 if (!IS_ERR(tc)) { 315 if (!IS_ERR(tc)) {
323 ret = v9fs_mux_rpc(v9ses->mux, tc, rcp); 316 ret = v9fs_mux_rpc(v9ses->mux, tc, rcp);
@@ -349,7 +342,6 @@ v9fs_t_create(struct v9fs_session_info *v9ses, u32 fid, char *name,
349 dprintk(DEBUG_9P, "fid %d name '%s' perm %x mode %d\n", 342 dprintk(DEBUG_9P, "fid %d name '%s' perm %x mode %d\n",
350 fid, name, perm, mode); 343 fid, name, perm, mode);
351 344
352 ret = -ENOMEM;
353 tc = v9fs_create_tcreate(fid, name, perm, mode); 345 tc = v9fs_create_tcreate(fid, name, perm, mode);
354 if (!IS_ERR(tc)) { 346 if (!IS_ERR(tc)) {
355 ret = v9fs_mux_rpc(v9ses->mux, tc, rcp); 347 ret = v9fs_mux_rpc(v9ses->mux, tc, rcp);
@@ -380,7 +372,6 @@ v9fs_t_read(struct v9fs_session_info *v9ses, u32 fid, u64 offset,
380 dprintk(DEBUG_9P, "fid %d offset 0x%llux count 0x%x\n", fid, 372 dprintk(DEBUG_9P, "fid %d offset 0x%llux count 0x%x\n", fid,
381 (long long unsigned) offset, count); 373 (long long unsigned) offset, count);
382 374
383 ret = -ENOMEM;
384 tc = v9fs_create_tread(fid, offset, count); 375 tc = v9fs_create_tread(fid, offset, count);
385 if (!IS_ERR(tc)) { 376 if (!IS_ERR(tc)) {
386 ret = v9fs_mux_rpc(v9ses->mux, tc, &rc); 377 ret = v9fs_mux_rpc(v9ses->mux, tc, &rc);
@@ -418,7 +409,6 @@ v9fs_t_write(struct v9fs_session_info *v9ses, u32 fid, u64 offset, u32 count,
418 dprintk(DEBUG_9P, "fid %d offset 0x%llux count 0x%x\n", fid, 409 dprintk(DEBUG_9P, "fid %d offset 0x%llux count 0x%x\n", fid,
419 (long long unsigned) offset, count); 410 (long long unsigned) offset, count);
420 411
421 ret = -ENOMEM;
422 tc = v9fs_create_twrite(fid, offset, count, data); 412 tc = v9fs_create_twrite(fid, offset, count, data);
423 if (!IS_ERR(tc)) { 413 if (!IS_ERR(tc)) {
424 ret = v9fs_mux_rpc(v9ses->mux, tc, &rc); 414 ret = v9fs_mux_rpc(v9ses->mux, tc, &rc);
diff --git a/fs/9p/9p.h b/fs/9p/9p.h
index 007ff639777d..0cd374d94717 100644
--- a/fs/9p/9p.h
+++ b/fs/9p/9p.h
@@ -340,9 +340,6 @@ struct v9fs_fcall {
340 fcall?fcall->params.rerror.error.len:0, \ 340 fcall?fcall->params.rerror.error.len:0, \
341 fcall?fcall->params.rerror.error.str:""); 341 fcall?fcall->params.rerror.error.str:"");
342 342
343char *v9fs_str_copy(char *buf, int buflen, struct v9fs_str *str);
344int v9fs_str_compare(char *buf, struct v9fs_str *str);
345
346int v9fs_t_version(struct v9fs_session_info *v9ses, u32 msize, 343int v9fs_t_version(struct v9fs_session_info *v9ses, u32 msize,
347 char *version, struct v9fs_fcall **rcall); 344 char *version, struct v9fs_fcall **rcall);
348 345
diff --git a/fs/9p/conv.c b/fs/9p/conv.c
index f62434d435b3..55ccfa10ee9e 100644
--- a/fs/9p/conv.c
+++ b/fs/9p/conv.c
@@ -45,37 +45,6 @@ struct cbuf {
45 unsigned char *ep; 45 unsigned char *ep;
46}; 46};
47 47
48char *v9fs_str_copy(char *buf, int buflen, struct v9fs_str *str)
49{
50 int n;
51
52 if (buflen < str->len)
53 n = buflen;
54 else
55 n = str->len;
56
57 memmove(buf, str->str, n - 1);
58
59 return buf;
60}
61
62int v9fs_str_compare(char *buf, struct v9fs_str *str)
63{
64 int n, ret;
65
66 ret = strncmp(buf, str->str, str->len);
67
68 if (!ret) {
69 n = strlen(buf);
70 if (n < str->len)
71 ret = -1;
72 else if (n > str->len)
73 ret = 1;
74 }
75
76 return ret;
77}
78
79static inline void buf_init(struct cbuf *buf, void *data, int datalen) 48static inline void buf_init(struct cbuf *buf, void *data, int datalen)
80{ 49{
81 buf->sp = buf->p = data; 50 buf->sp = buf->p = data;
@@ -89,11 +58,14 @@ static inline int buf_check_overflow(struct cbuf *buf)
89 58
90static inline int buf_check_size(struct cbuf *buf, int len) 59static inline int buf_check_size(struct cbuf *buf, int len)
91{ 60{
92 if (buf->p + len > buf->ep && buf->p < buf->ep) { 61 if (buf->p + len > buf->ep) {
93 eprintk(KERN_ERR, "buffer overflow: want %d has %d\n", 62 if (buf->p < buf->ep) {
94 len, (int)(buf->ep - buf->p)); 63 eprintk(KERN_ERR, "buffer overflow: want %d has %d\n",
95 dump_stack(); 64 len, (int)(buf->ep - buf->p));
96 buf->p = buf->ep + 1; 65 dump_stack();
66 buf->p = buf->ep + 1;
67 }
68
97 return 0; 69 return 0;
98 } 70 }
99 71
@@ -527,6 +499,7 @@ v9fs_create_common(struct cbuf *bufp, u32 size, u8 id)
527 499
528void v9fs_set_tag(struct v9fs_fcall *fc, u16 tag) 500void v9fs_set_tag(struct v9fs_fcall *fc, u16 tag)
529{ 501{
502 fc->tag = tag;
530 *(__le16 *) (fc->sdata + 5) = cpu_to_le16(tag); 503 *(__le16 *) (fc->sdata + 5) = cpu_to_le16(tag);
531} 504}
532 505
diff --git a/fs/9p/error.h b/fs/9p/error.h
index 8b3176b3f658..a9794e85fe51 100644
--- a/fs/9p/error.h
+++ b/fs/9p/error.h
@@ -176,4 +176,3 @@ static struct errormap errmap[] = {
176}; 176};
177 177
178extern int v9fs_error_init(void); 178extern int v9fs_error_init(void);
179extern int v9fs_errstr2errno(char *errstr, int len);
diff --git a/fs/9p/mux.c b/fs/9p/mux.c
index f21cf5083973..945cb368d451 100644
--- a/fs/9p/mux.c
+++ b/fs/9p/mux.c
@@ -102,8 +102,6 @@ struct v9fs_mux_rpc {
102 wait_queue_head_t wqueue; 102 wait_queue_head_t wqueue;
103}; 103};
104 104
105extern int v9fs_errstr2errno(char *str, int len);
106
107static int v9fs_poll_proc(void *); 105static int v9fs_poll_proc(void *);
108static void v9fs_read_work(void *); 106static void v9fs_read_work(void *);
109static void v9fs_write_work(void *); 107static void v9fs_write_work(void *);
@@ -119,7 +117,7 @@ static int v9fs_mux_num;
119static int v9fs_mux_poll_task_num; 117static int v9fs_mux_poll_task_num;
120static struct v9fs_mux_poll_task v9fs_mux_poll_tasks[100]; 118static struct v9fs_mux_poll_task v9fs_mux_poll_tasks[100];
121 119
122void v9fs_mux_global_init(void) 120int v9fs_mux_global_init(void)
123{ 121{
124 int i; 122 int i;
125 123
@@ -127,6 +125,10 @@ void v9fs_mux_global_init(void)
127 v9fs_mux_poll_tasks[i].task = NULL; 125 v9fs_mux_poll_tasks[i].task = NULL;
128 126
129 v9fs_mux_wq = create_workqueue("v9fs"); 127 v9fs_mux_wq = create_workqueue("v9fs");
128 if (!v9fs_mux_wq)
129 return -ENOMEM;
130
131 return 0;
130} 132}
131 133
132void v9fs_mux_global_exit(void) 134void v9fs_mux_global_exit(void)
@@ -156,10 +158,11 @@ inline int v9fs_mux_calc_poll_procs(int muxnum)
156 return n; 158 return n;
157} 159}
158 160
159static void v9fs_mux_poll_start(struct v9fs_mux_data *m) 161static int v9fs_mux_poll_start(struct v9fs_mux_data *m)
160{ 162{
161 int i, n; 163 int i, n;
162 struct v9fs_mux_poll_task *vpt, *vptlast; 164 struct v9fs_mux_poll_task *vpt, *vptlast;
165 struct task_struct *pproc;
163 166
164 dprintk(DEBUG_MUX, "mux %p muxnum %d procnum %d\n", m, v9fs_mux_num, 167 dprintk(DEBUG_MUX, "mux %p muxnum %d procnum %d\n", m, v9fs_mux_num,
165 v9fs_mux_poll_task_num); 168 v9fs_mux_poll_task_num);
@@ -171,13 +174,16 @@ static void v9fs_mux_poll_start(struct v9fs_mux_data *m)
171 if (v9fs_mux_poll_tasks[i].task == NULL) { 174 if (v9fs_mux_poll_tasks[i].task == NULL) {
172 vpt = &v9fs_mux_poll_tasks[i]; 175 vpt = &v9fs_mux_poll_tasks[i];
173 dprintk(DEBUG_MUX, "create proc %p\n", vpt); 176 dprintk(DEBUG_MUX, "create proc %p\n", vpt);
174 vpt->task = 177 pproc = kthread_create(v9fs_poll_proc, vpt,
175 kthread_create(v9fs_poll_proc, vpt,
176 "v9fs-poll"); 178 "v9fs-poll");
177 INIT_LIST_HEAD(&vpt->mux_list); 179
178 vpt->muxnum = 0; 180 if (!IS_ERR(pproc)) {
179 v9fs_mux_poll_task_num++; 181 vpt->task = pproc;
180 wake_up_process(vpt->task); 182 INIT_LIST_HEAD(&vpt->mux_list);
183 vpt->muxnum = 0;
184 v9fs_mux_poll_task_num++;
185 wake_up_process(vpt->task);
186 }
181 break; 187 break;
182 } 188 }
183 } 189 }
@@ -207,16 +213,21 @@ static void v9fs_mux_poll_start(struct v9fs_mux_data *m)
207 } 213 }
208 214
209 if (i >= ARRAY_SIZE(v9fs_mux_poll_tasks)) { 215 if (i >= ARRAY_SIZE(v9fs_mux_poll_tasks)) {
216 if (vptlast == NULL)
217 return -ENOMEM;
218
210 dprintk(DEBUG_MUX, "put in proc %d\n", i); 219 dprintk(DEBUG_MUX, "put in proc %d\n", i);
211 list_add(&m->mux_list, &vptlast->mux_list); 220 list_add(&m->mux_list, &vptlast->mux_list);
212 vptlast->muxnum++; 221 vptlast->muxnum++;
213 m->poll_task = vpt; 222 m->poll_task = vptlast;
214 memset(&m->poll_waddr, 0, sizeof(m->poll_waddr)); 223 memset(&m->poll_waddr, 0, sizeof(m->poll_waddr));
215 init_poll_funcptr(&m->pt, v9fs_pollwait); 224 init_poll_funcptr(&m->pt, v9fs_pollwait);
216 } 225 }
217 226
218 v9fs_mux_num++; 227 v9fs_mux_num++;
219 down(&v9fs_mux_task_lock); 228 down(&v9fs_mux_task_lock);
229
230 return 0;
220} 231}
221 232
222static void v9fs_mux_poll_stop(struct v9fs_mux_data *m) 233static void v9fs_mux_poll_stop(struct v9fs_mux_data *m)
@@ -283,7 +294,10 @@ struct v9fs_mux_data *v9fs_mux_init(struct v9fs_transport *trans, int msize,
283 INIT_WORK(&m->wq, v9fs_write_work, m); 294 INIT_WORK(&m->wq, v9fs_write_work, m);
284 m->wsched = 0; 295 m->wsched = 0;
285 memset(&m->poll_waddr, 0, sizeof(m->poll_waddr)); 296 memset(&m->poll_waddr, 0, sizeof(m->poll_waddr));
286 v9fs_mux_poll_start(m); 297 m->poll_task = NULL;
298 n = v9fs_mux_poll_start(m);
299 if (n)
300 return ERR_PTR(n);
287 301
288 n = trans->poll(trans, &m->pt); 302 n = trans->poll(trans, &m->pt);
289 if (n & POLLIN) { 303 if (n & POLLIN) {
diff --git a/fs/9p/mux.h b/fs/9p/mux.h
index 02b13b14b05b..9473b84f24b2 100644
--- a/fs/9p/mux.h
+++ b/fs/9p/mux.h
@@ -40,7 +40,7 @@ struct v9fs_mux_data;
40typedef void (*v9fs_mux_req_callback)(void *a, struct v9fs_fcall *tc, 40typedef void (*v9fs_mux_req_callback)(void *a, struct v9fs_fcall *tc,
41 struct v9fs_fcall *rc, int err); 41 struct v9fs_fcall *rc, int err);
42 42
43void v9fs_mux_global_init(void); 43int v9fs_mux_global_init(void);
44void v9fs_mux_global_exit(void); 44void v9fs_mux_global_exit(void);
45 45
46struct v9fs_mux_data *v9fs_mux_init(struct v9fs_transport *trans, int msize, 46struct v9fs_mux_data *v9fs_mux_init(struct v9fs_transport *trans, int msize,
@@ -55,3 +55,4 @@ int v9fs_mux_rpcnb(struct v9fs_mux_data *m, struct v9fs_fcall *tc,
55 55
56void v9fs_mux_flush(struct v9fs_mux_data *m, int sendflush); 56void v9fs_mux_flush(struct v9fs_mux_data *m, int sendflush);
57void v9fs_mux_cancel(struct v9fs_mux_data *m, int err); 57void v9fs_mux_cancel(struct v9fs_mux_data *m, int err);
58int v9fs_errstr2errno(char *errstr, int len);
diff --git a/fs/9p/v9fs.c b/fs/9p/v9fs.c
index 519b21d8b15b..5250c428fc1f 100644
--- a/fs/9p/v9fs.c
+++ b/fs/9p/v9fs.c
@@ -269,6 +269,7 @@ v9fs_session_init(struct v9fs_session_info *v9ses,
269 int n = 0; 269 int n = 0;
270 int newfid = -1; 270 int newfid = -1;
271 int retval = -EINVAL; 271 int retval = -EINVAL;
272 struct v9fs_str *version;
272 273
273 v9ses->name = __getname(); 274 v9ses->name = __getname();
274 if (!v9ses->name) 275 if (!v9ses->name)
@@ -351,13 +352,16 @@ v9fs_session_init(struct v9fs_session_info *v9ses,
351 goto FreeFcall; 352 goto FreeFcall;
352 } 353 }
353 354
354 /* Really should check for 9P1 and report error */ 355 version = &fcall->params.rversion.version;
355 if (!v9fs_str_compare("9P2000.u", &fcall->params.rversion.version)) { 356 if (version->len==8 && !memcmp(version->str, "9P2000.u", 8)) {
356 dprintk(DEBUG_9P, "9P2000 UNIX extensions enabled\n"); 357 dprintk(DEBUG_9P, "9P2000 UNIX extensions enabled\n");
357 v9ses->extended = 1; 358 v9ses->extended = 1;
358 } else { 359 } else if (version->len==6 && !memcmp(version->str, "9P2000", 6)) {
359 dprintk(DEBUG_9P, "9P2000 legacy mode enabled\n"); 360 dprintk(DEBUG_9P, "9P2000 legacy mode enabled\n");
360 v9ses->extended = 0; 361 v9ses->extended = 0;
362 } else {
363 retval = -EREMOTEIO;
364 goto FreeFcall;
361 } 365 }
362 366
363 n = fcall->params.rversion.msize; 367 n = fcall->params.rversion.msize;
@@ -449,12 +453,17 @@ extern int v9fs_error_init(void);
449 453
450static int __init init_v9fs(void) 454static int __init init_v9fs(void)
451{ 455{
456 int ret;
457
452 v9fs_error_init(); 458 v9fs_error_init();
453 459
454 printk(KERN_INFO "Installing v9fs 9P2000 file system support\n"); 460 printk(KERN_INFO "Installing v9fs 9P2000 file system support\n");
455 461
456 v9fs_mux_global_init(); 462 ret = v9fs_mux_global_init();
457 return register_filesystem(&v9fs_fs_type); 463 if (!ret)
464 ret = register_filesystem(&v9fs_fs_type);
465
466 return ret;
458} 467}
459 468
460/** 469/**
diff --git a/fs/9p/vfs_inode.c b/fs/9p/vfs_inode.c
index 742bcd0dc4a7..d933ef1fbd8a 100644
--- a/fs/9p/vfs_inode.c
+++ b/fs/9p/vfs_inode.c
@@ -768,6 +768,7 @@ void
768v9fs_stat2inode(struct v9fs_stat *stat, struct inode *inode, 768v9fs_stat2inode(struct v9fs_stat *stat, struct inode *inode,
769 struct super_block *sb) 769 struct super_block *sb)
770{ 770{
771 int n;
771 char ext[32]; 772 char ext[32];
772 struct v9fs_session_info *v9ses = sb->s_fs_info; 773 struct v9fs_session_info *v9ses = sb->s_fs_info;
773 774
@@ -791,7 +792,11 @@ v9fs_stat2inode(struct v9fs_stat *stat, struct inode *inode,
791 int major = -1; 792 int major = -1;
792 int minor = -1; 793 int minor = -1;
793 794
794 v9fs_str_copy(ext, sizeof(ext), &stat->extension); 795 n = stat->extension.len;
796 if (n > sizeof(ext)-1)
797 n = sizeof(ext)-1;
798 memmove(ext, stat->extension.str, n);
799 ext[n] = 0;
795 sscanf(ext, "%c %u %u", &type, &major, &minor); 800 sscanf(ext, "%c %u %u", &type, &major, &minor);
796 switch (type) { 801 switch (type) {
797 case 'c': 802 case 'c':
diff --git a/fs/9p/vfs_super.c b/fs/9p/vfs_super.c
index d4d71a9ca573..ae0f06b3c11a 100644
--- a/fs/9p/vfs_super.c
+++ b/fs/9p/vfs_super.c
@@ -122,11 +122,10 @@ static struct super_block *v9fs_get_sb(struct file_system_type
122 122
123 dprintk(DEBUG_VFS, " \n"); 123 dprintk(DEBUG_VFS, " \n");
124 124
125 v9ses = kmalloc(sizeof(struct v9fs_session_info), GFP_KERNEL); 125 v9ses = kzalloc(sizeof(struct v9fs_session_info), GFP_KERNEL);
126 if (!v9ses) 126 if (!v9ses)
127 return ERR_PTR(-ENOMEM); 127 return ERR_PTR(-ENOMEM);
128 128
129 memset(v9ses, 0, sizeof(struct v9fs_session_info));
130 if ((newfid = v9fs_session_init(v9ses, dev_name, data)) < 0) { 129 if ((newfid = v9fs_session_init(v9ses, dev_name, data)) < 0) {
131 dprintk(DEBUG_ERROR, "problem initiating session\n"); 130 dprintk(DEBUG_ERROR, "problem initiating session\n");
132 kfree(v9ses); 131 kfree(v9ses);