Merge branch 'release' of git://git.kernel.org/pub/scm/linux/kernel/git/aegl/linux-2.6
[pandora-kernel.git] / fs / 9p / vfs_inode.c
1 /*
2  *  linux/fs/9p/vfs_inode.c
3  *
4  * This file contains vfs inode ops for the 9P2000 protocol.
5  *
6  *  Copyright (C) 2004 by Eric Van Hensbergen <ericvh@gmail.com>
7  *  Copyright (C) 2002 by Ron Minnich <rminnich@lanl.gov>
8  *
9  *  This program is free software; you can redistribute it and/or modify
10  *  it under the terms of the GNU General Public License version 2
11  *  as published by the Free Software Foundation.
12  *
13  *  This program is distributed in the hope that it will be useful,
14  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
15  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  *  GNU General Public License for more details.
17  *
18  *  You should have received a copy of the GNU General Public License
19  *  along with this program; if not, write to:
20  *  Free Software Foundation
21  *  51 Franklin Street, Fifth Floor
22  *  Boston, MA  02111-1301  USA
23  *
24  */
25
26 #include <linux/module.h>
27 #include <linux/errno.h>
28 #include <linux/fs.h>
29 #include <linux/file.h>
30 #include <linux/pagemap.h>
31 #include <linux/stat.h>
32 #include <linux/string.h>
33 #include <linux/inet.h>
34 #include <linux/namei.h>
35 #include <linux/idr.h>
36 #include <linux/sched.h>
37 #include <linux/slab.h>
38 #include <linux/xattr.h>
39 #include <linux/posix_acl.h>
40 #include <net/9p/9p.h>
41 #include <net/9p/client.h>
42
43 #include "v9fs.h"
44 #include "v9fs_vfs.h"
45 #include "fid.h"
46 #include "cache.h"
47 #include "xattr.h"
48 #include "acl.h"
49
50 static const struct inode_operations v9fs_dir_inode_operations;
51 static const struct inode_operations v9fs_dir_inode_operations_dotu;
52 static const struct inode_operations v9fs_dir_inode_operations_dotl;
53 static const struct inode_operations v9fs_file_inode_operations;
54 static const struct inode_operations v9fs_file_inode_operations_dotl;
55 static const struct inode_operations v9fs_symlink_inode_operations;
56 static const struct inode_operations v9fs_symlink_inode_operations_dotl;
57
58 static int
59 v9fs_vfs_mknod_dotl(struct inode *dir, struct dentry *dentry, int omode,
60                     dev_t rdev);
61
62 /**
63  * unixmode2p9mode - convert unix mode bits to plan 9
64  * @v9ses: v9fs session information
65  * @mode: mode to convert
66  *
67  */
68
69 static int unixmode2p9mode(struct v9fs_session_info *v9ses, int mode)
70 {
71         int res;
72         res = mode & 0777;
73         if (S_ISDIR(mode))
74                 res |= P9_DMDIR;
75         if (v9fs_proto_dotu(v9ses)) {
76                 if (S_ISLNK(mode))
77                         res |= P9_DMSYMLINK;
78                 if (v9ses->nodev == 0) {
79                         if (S_ISSOCK(mode))
80                                 res |= P9_DMSOCKET;
81                         if (S_ISFIFO(mode))
82                                 res |= P9_DMNAMEDPIPE;
83                         if (S_ISBLK(mode))
84                                 res |= P9_DMDEVICE;
85                         if (S_ISCHR(mode))
86                                 res |= P9_DMDEVICE;
87                 }
88
89                 if ((mode & S_ISUID) == S_ISUID)
90                         res |= P9_DMSETUID;
91                 if ((mode & S_ISGID) == S_ISGID)
92                         res |= P9_DMSETGID;
93                 if ((mode & S_ISVTX) == S_ISVTX)
94                         res |= P9_DMSETVTX;
95                 if ((mode & P9_DMLINK))
96                         res |= P9_DMLINK;
97         }
98
99         return res;
100 }
101
102 /**
103  * p9mode2unixmode- convert plan9 mode bits to unix mode bits
104  * @v9ses: v9fs session information
105  * @mode: mode to convert
106  *
107  */
108
109 static int p9mode2unixmode(struct v9fs_session_info *v9ses, int mode)
110 {
111         int res;
112
113         res = mode & 0777;
114
115         if ((mode & P9_DMDIR) == P9_DMDIR)
116                 res |= S_IFDIR;
117         else if ((mode & P9_DMSYMLINK) && (v9fs_proto_dotu(v9ses)))
118                 res |= S_IFLNK;
119         else if ((mode & P9_DMSOCKET) && (v9fs_proto_dotu(v9ses))
120                  && (v9ses->nodev == 0))
121                 res |= S_IFSOCK;
122         else if ((mode & P9_DMNAMEDPIPE) && (v9fs_proto_dotu(v9ses))
123                  && (v9ses->nodev == 0))
124                 res |= S_IFIFO;
125         else if ((mode & P9_DMDEVICE) && (v9fs_proto_dotu(v9ses))
126                  && (v9ses->nodev == 0))
127                 res |= S_IFBLK;
128         else
129                 res |= S_IFREG;
130
131         if (v9fs_proto_dotu(v9ses)) {
132                 if ((mode & P9_DMSETUID) == P9_DMSETUID)
133                         res |= S_ISUID;
134
135                 if ((mode & P9_DMSETGID) == P9_DMSETGID)
136                         res |= S_ISGID;
137
138                 if ((mode & P9_DMSETVTX) == P9_DMSETVTX)
139                         res |= S_ISVTX;
140         }
141
142         return res;
143 }
144
145 /**
146  * v9fs_uflags2omode- convert posix open flags to plan 9 mode bits
147  * @uflags: flags to convert
148  * @extended: if .u extensions are active
149  */
150
151 int v9fs_uflags2omode(int uflags, int extended)
152 {
153         int ret;
154
155         ret = 0;
156         switch (uflags&3) {
157         default:
158         case O_RDONLY:
159                 ret = P9_OREAD;
160                 break;
161
162         case O_WRONLY:
163                 ret = P9_OWRITE;
164                 break;
165
166         case O_RDWR:
167                 ret = P9_ORDWR;
168                 break;
169         }
170
171         if (uflags & O_TRUNC)
172                 ret |= P9_OTRUNC;
173
174         if (extended) {
175                 if (uflags & O_EXCL)
176                         ret |= P9_OEXCL;
177
178                 if (uflags & O_APPEND)
179                         ret |= P9_OAPPEND;
180         }
181
182         return ret;
183 }
184
185 /**
186  * v9fs_blank_wstat - helper function to setup a 9P stat structure
187  * @wstat: structure to initialize
188  *
189  */
190
191 void
192 v9fs_blank_wstat(struct p9_wstat *wstat)
193 {
194         wstat->type = ~0;
195         wstat->dev = ~0;
196         wstat->qid.type = ~0;
197         wstat->qid.version = ~0;
198         *((long long *)&wstat->qid.path) = ~0;
199         wstat->mode = ~0;
200         wstat->atime = ~0;
201         wstat->mtime = ~0;
202         wstat->length = ~0;
203         wstat->name = NULL;
204         wstat->uid = NULL;
205         wstat->gid = NULL;
206         wstat->muid = NULL;
207         wstat->n_uid = ~0;
208         wstat->n_gid = ~0;
209         wstat->n_muid = ~0;
210         wstat->extension = NULL;
211 }
212
213 #ifdef CONFIG_9P_FSCACHE
214 /**
215  * v9fs_alloc_inode - helper function to allocate an inode
216  * This callback is executed before setting up the inode so that we
217  * can associate a vcookie with each inode.
218  *
219  */
220
221 struct inode *v9fs_alloc_inode(struct super_block *sb)
222 {
223         struct v9fs_cookie *vcookie;
224         vcookie = (struct v9fs_cookie *)kmem_cache_alloc(vcookie_cache,
225                                                          GFP_KERNEL);
226         if (!vcookie)
227                 return NULL;
228
229         vcookie->fscache = NULL;
230         vcookie->qid = NULL;
231         spin_lock_init(&vcookie->lock);
232         return &vcookie->inode;
233 }
234
235 /**
236  * v9fs_destroy_inode - destroy an inode
237  *
238  */
239
240 static void v9fs_i_callback(struct rcu_head *head)
241 {
242         struct inode *inode = container_of(head, struct inode, i_rcu);
243         INIT_LIST_HEAD(&inode->i_dentry);
244         kmem_cache_free(vcookie_cache, v9fs_inode2cookie(inode));
245 }
246
247 void v9fs_destroy_inode(struct inode *inode)
248 {
249         call_rcu(&inode->i_rcu, v9fs_i_callback);
250 }
251 #endif
252
253 /**
254  * v9fs_get_fsgid_for_create - Helper function to get the gid for creating a
255  * new file system object. This checks the S_ISGID to determine the owning
256  * group of the new file system object.
257  */
258
259 static gid_t v9fs_get_fsgid_for_create(struct inode *dir_inode)
260 {
261         BUG_ON(dir_inode == NULL);
262
263         if (dir_inode->i_mode & S_ISGID) {
264                 /* set_gid bit is set.*/
265                 return dir_inode->i_gid;
266         }
267         return current_fsgid();
268 }
269
270 /**
271  * v9fs_dentry_from_dir_inode - helper function to get the dentry from
272  * dir inode.
273  *
274  */
275
276 static struct dentry *v9fs_dentry_from_dir_inode(struct inode *inode)
277 {
278         struct dentry *dentry;
279
280         spin_lock(&inode->i_lock);
281         /* Directory should have only one entry. */
282         BUG_ON(S_ISDIR(inode->i_mode) && !list_is_singular(&inode->i_dentry));
283         dentry = list_entry(inode->i_dentry.next, struct dentry, d_alias);
284         spin_unlock(&inode->i_lock);
285         return dentry;
286 }
287
288 /**
289  * v9fs_get_inode - helper function to setup an inode
290  * @sb: superblock
291  * @mode: mode to setup inode with
292  *
293  */
294
295 struct inode *v9fs_get_inode(struct super_block *sb, int mode)
296 {
297         int err;
298         struct inode *inode;
299         struct v9fs_session_info *v9ses = sb->s_fs_info;
300
301         P9_DPRINTK(P9_DEBUG_VFS, "super block: %p mode: %o\n", sb, mode);
302
303         inode = new_inode(sb);
304         if (!inode) {
305                 P9_EPRINTK(KERN_WARNING, "Problem allocating inode\n");
306                 return ERR_PTR(-ENOMEM);
307         }
308
309         inode_init_owner(inode, NULL, mode);
310         inode->i_blocks = 0;
311         inode->i_rdev = 0;
312         inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME;
313         inode->i_mapping->a_ops = &v9fs_addr_operations;
314
315         switch (mode & S_IFMT) {
316         case S_IFIFO:
317         case S_IFBLK:
318         case S_IFCHR:
319         case S_IFSOCK:
320                 if (v9fs_proto_dotl(v9ses)) {
321                         inode->i_op = &v9fs_file_inode_operations_dotl;
322                         inode->i_fop = &v9fs_file_operations_dotl;
323                 } else if (v9fs_proto_dotu(v9ses)) {
324                         inode->i_op = &v9fs_file_inode_operations;
325                         inode->i_fop = &v9fs_file_operations;
326                 } else {
327                         P9_DPRINTK(P9_DEBUG_ERROR,
328                                    "special files without extended mode\n");
329                         err = -EINVAL;
330                         goto error;
331                 }
332                 init_special_inode(inode, inode->i_mode, inode->i_rdev);
333                 break;
334         case S_IFREG:
335                 if (v9fs_proto_dotl(v9ses)) {
336                         inode->i_op = &v9fs_file_inode_operations_dotl;
337                         inode->i_fop = &v9fs_file_operations_dotl;
338                 } else {
339                         inode->i_op = &v9fs_file_inode_operations;
340                         inode->i_fop = &v9fs_file_operations;
341                 }
342
343                 break;
344
345         case S_IFLNK:
346                 if (!v9fs_proto_dotu(v9ses) && !v9fs_proto_dotl(v9ses)) {
347                         P9_DPRINTK(P9_DEBUG_ERROR, "extended modes used with "
348                                                 "legacy protocol.\n");
349                         err = -EINVAL;
350                         goto error;
351                 }
352
353                 if (v9fs_proto_dotl(v9ses))
354                         inode->i_op = &v9fs_symlink_inode_operations_dotl;
355                 else
356                         inode->i_op = &v9fs_symlink_inode_operations;
357
358                 break;
359         case S_IFDIR:
360                 inc_nlink(inode);
361                 if (v9fs_proto_dotl(v9ses))
362                         inode->i_op = &v9fs_dir_inode_operations_dotl;
363                 else if (v9fs_proto_dotu(v9ses))
364                         inode->i_op = &v9fs_dir_inode_operations_dotu;
365                 else
366                         inode->i_op = &v9fs_dir_inode_operations;
367
368                 if (v9fs_proto_dotl(v9ses))
369                         inode->i_fop = &v9fs_dir_operations_dotl;
370                 else
371                         inode->i_fop = &v9fs_dir_operations;
372
373                 break;
374         default:
375                 P9_DPRINTK(P9_DEBUG_ERROR, "BAD mode 0x%x S_IFMT 0x%x\n",
376                            mode, mode & S_IFMT);
377                 err = -EINVAL;
378                 goto error;
379         }
380
381         return inode;
382
383 error:
384         iput(inode);
385         return ERR_PTR(err);
386 }
387
388 /*
389 static struct v9fs_fid*
390 v9fs_clone_walk(struct v9fs_session_info *v9ses, u32 fid, struct dentry *dentry)
391 {
392         int err;
393         int nfid;
394         struct v9fs_fid *ret;
395         struct v9fs_fcall *fcall;
396
397         nfid = v9fs_get_idpool(&v9ses->fidpool);
398         if (nfid < 0) {
399                 eprintk(KERN_WARNING, "no free fids available\n");
400                 return ERR_PTR(-ENOSPC);
401         }
402
403         err = v9fs_t_walk(v9ses, fid, nfid, (char *) dentry->d_name.name,
404                 &fcall);
405
406         if (err < 0) {
407                 if (fcall && fcall->id == RWALK)
408                         goto clunk_fid;
409
410                 PRINT_FCALL_ERROR("walk error", fcall);
411                 v9fs_put_idpool(nfid, &v9ses->fidpool);
412                 goto error;
413         }
414
415         kfree(fcall);
416         fcall = NULL;
417         ret = v9fs_fid_create(v9ses, nfid);
418         if (!ret) {
419                 err = -ENOMEM;
420                 goto clunk_fid;
421         }
422
423         err = v9fs_fid_insert(ret, dentry);
424         if (err < 0) {
425                 v9fs_fid_destroy(ret);
426                 goto clunk_fid;
427         }
428
429         return ret;
430
431 clunk_fid:
432         v9fs_t_clunk(v9ses, nfid);
433
434 error:
435         kfree(fcall);
436         return ERR_PTR(err);
437 }
438 */
439
440
441 /**
442  * v9fs_clear_inode - release an inode
443  * @inode: inode to release
444  *
445  */
446 void v9fs_evict_inode(struct inode *inode)
447 {
448         truncate_inode_pages(inode->i_mapping, 0);
449         end_writeback(inode);
450         filemap_fdatawrite(inode->i_mapping);
451
452 #ifdef CONFIG_9P_FSCACHE
453         v9fs_cache_inode_put_cookie(inode);
454 #endif
455 }
456
457 static struct inode *
458 v9fs_inode(struct v9fs_session_info *v9ses, struct p9_fid *fid,
459         struct super_block *sb)
460 {
461         int err, umode;
462         struct inode *ret = NULL;
463         struct p9_wstat *st;
464
465         st = p9_client_stat(fid);
466         if (IS_ERR(st))
467                 return ERR_CAST(st);
468
469         umode = p9mode2unixmode(v9ses, st->mode);
470         ret = v9fs_get_inode(sb, umode);
471         if (IS_ERR(ret)) {
472                 err = PTR_ERR(ret);
473                 goto error;
474         }
475
476         v9fs_stat2inode(st, ret, sb);
477         ret->i_ino = v9fs_qid2ino(&st->qid);
478
479 #ifdef CONFIG_9P_FSCACHE
480         v9fs_vcookie_set_qid(ret, &st->qid);
481         v9fs_cache_inode_get_cookie(ret);
482 #endif
483         p9stat_free(st);
484         kfree(st);
485         return ret;
486 error:
487         p9stat_free(st);
488         kfree(st);
489         return ERR_PTR(err);
490 }
491
492 static struct inode *
493 v9fs_inode_dotl(struct v9fs_session_info *v9ses, struct p9_fid *fid,
494         struct super_block *sb)
495 {
496         struct inode *ret = NULL;
497         int err;
498         struct p9_stat_dotl *st;
499
500         st = p9_client_getattr_dotl(fid, P9_STATS_BASIC);
501         if (IS_ERR(st))
502                 return ERR_CAST(st);
503
504         ret = v9fs_get_inode(sb, st->st_mode);
505         if (IS_ERR(ret)) {
506                 err = PTR_ERR(ret);
507                 goto error;
508         }
509
510         v9fs_stat2inode_dotl(st, ret);
511         ret->i_ino = v9fs_qid2ino(&st->qid);
512 #ifdef CONFIG_9P_FSCACHE
513         v9fs_vcookie_set_qid(ret, &st->qid);
514         v9fs_cache_inode_get_cookie(ret);
515 #endif
516         err = v9fs_get_acl(ret, fid);
517         if (err) {
518                 iput(ret);
519                 goto error;
520         }
521         kfree(st);
522         return ret;
523 error:
524         kfree(st);
525         return ERR_PTR(err);
526 }
527
528 /**
529  * v9fs_inode_from_fid - Helper routine to populate an inode by
530  * issuing a attribute request
531  * @v9ses: session information
532  * @fid: fid to issue attribute request for
533  * @sb: superblock on which to create inode
534  *
535  */
536 static inline struct inode *
537 v9fs_inode_from_fid(struct v9fs_session_info *v9ses, struct p9_fid *fid,
538                         struct super_block *sb)
539 {
540         if (v9fs_proto_dotl(v9ses))
541                 return v9fs_inode_dotl(v9ses, fid, sb);
542         else
543                 return v9fs_inode(v9ses, fid, sb);
544 }
545
546 /**
547  * v9fs_remove - helper function to remove files and directories
548  * @dir: directory inode that is being deleted
549  * @file:  dentry that is being deleted
550  * @rmdir: removing a directory
551  *
552  */
553
554 static int v9fs_remove(struct inode *dir, struct dentry *file, int rmdir)
555 {
556         int retval;
557         struct inode *file_inode;
558         struct p9_fid *v9fid;
559
560         P9_DPRINTK(P9_DEBUG_VFS, "inode: %p dentry: %p rmdir: %d\n", dir, file,
561                 rmdir);
562
563         file_inode = file->d_inode;
564         v9fid = v9fs_fid_clone(file);
565         if (IS_ERR(v9fid))
566                 return PTR_ERR(v9fid);
567
568         retval = p9_client_remove(v9fid);
569         if (!retval)
570                 drop_nlink(file_inode);
571         return retval;
572 }
573
574 /**
575  * v9fs_create - Create a file
576  * @v9ses: session information
577  * @dir: directory that dentry is being created in
578  * @dentry:  dentry that is being created
579  * @extension: 9p2000.u extension string to support devices, etc.
580  * @perm: create permissions
581  * @mode: open mode
582  *
583  */
584 static struct p9_fid *
585 v9fs_create(struct v9fs_session_info *v9ses, struct inode *dir,
586                 struct dentry *dentry, char *extension, u32 perm, u8 mode)
587 {
588         int err;
589         char *name;
590         struct p9_fid *dfid, *ofid, *fid;
591         struct inode *inode;
592
593         P9_DPRINTK(P9_DEBUG_VFS, "name %s\n", dentry->d_name.name);
594
595         err = 0;
596         ofid = NULL;
597         fid = NULL;
598         name = (char *) dentry->d_name.name;
599         dfid = v9fs_fid_lookup(dentry->d_parent);
600         if (IS_ERR(dfid)) {
601                 err = PTR_ERR(dfid);
602                 P9_DPRINTK(P9_DEBUG_VFS, "fid lookup failed %d\n", err);
603                 return ERR_PTR(err);
604         }
605
606         /* clone a fid to use for creation */
607         ofid = p9_client_walk(dfid, 0, NULL, 1);
608         if (IS_ERR(ofid)) {
609                 err = PTR_ERR(ofid);
610                 P9_DPRINTK(P9_DEBUG_VFS, "p9_client_walk failed %d\n", err);
611                 return ERR_PTR(err);
612         }
613
614         err = p9_client_fcreate(ofid, name, perm, mode, extension);
615         if (err < 0) {
616                 P9_DPRINTK(P9_DEBUG_VFS, "p9_client_fcreate failed %d\n", err);
617                 goto error;
618         }
619
620         /* now walk from the parent so we can get unopened fid */
621         fid = p9_client_walk(dfid, 1, &name, 1);
622         if (IS_ERR(fid)) {
623                 err = PTR_ERR(fid);
624                 P9_DPRINTK(P9_DEBUG_VFS, "p9_client_walk failed %d\n", err);
625                 fid = NULL;
626                 goto error;
627         }
628
629         /* instantiate inode and assign the unopened fid to the dentry */
630         inode = v9fs_inode_from_fid(v9ses, fid, dir->i_sb);
631         if (IS_ERR(inode)) {
632                 err = PTR_ERR(inode);
633                 P9_DPRINTK(P9_DEBUG_VFS, "inode creation failed %d\n", err);
634                 goto error;
635         }
636
637         if (v9ses->cache)
638                 d_set_d_op(dentry, &v9fs_cached_dentry_operations);
639         else
640                 d_set_d_op(dentry, &v9fs_dentry_operations);
641
642         d_instantiate(dentry, inode);
643         err = v9fs_fid_add(dentry, fid);
644         if (err < 0)
645                 goto error;
646
647         return ofid;
648
649 error:
650         if (ofid)
651                 p9_client_clunk(ofid);
652
653         if (fid)
654                 p9_client_clunk(fid);
655
656         return ERR_PTR(err);
657 }
658
659 /**
660  * v9fs_vfs_create_dotl - VFS hook to create files for 9P2000.L protocol.
661  * @dir: directory inode that is being created
662  * @dentry:  dentry that is being deleted
663  * @mode: create permissions
664  * @nd: path information
665  *
666  */
667
668 static int
669 v9fs_vfs_create_dotl(struct inode *dir, struct dentry *dentry, int omode,
670                 struct nameidata *nd)
671 {
672         int err = 0;
673         char *name = NULL;
674         gid_t gid;
675         int flags;
676         mode_t mode;
677         struct v9fs_session_info *v9ses;
678         struct p9_fid *fid = NULL;
679         struct p9_fid *dfid, *ofid;
680         struct file *filp;
681         struct p9_qid qid;
682         struct inode *inode;
683         struct posix_acl *pacl = NULL, *dacl = NULL;
684
685         v9ses = v9fs_inode2v9ses(dir);
686         if (nd && nd->flags & LOOKUP_OPEN)
687                 flags = nd->intent.open.flags - 1;
688         else {
689                 /*
690                  * create call without LOOKUP_OPEN is due
691                  * to mknod of regular files. So use mknod
692                  * operation.
693                  */
694                 return v9fs_vfs_mknod_dotl(dir, dentry, omode, 0);
695         }
696
697         name = (char *) dentry->d_name.name;
698         P9_DPRINTK(P9_DEBUG_VFS, "v9fs_vfs_create_dotl: name:%s flags:0x%x "
699                         "mode:0x%x\n", name, flags, omode);
700
701         dfid = v9fs_fid_lookup(dentry->d_parent);
702         if (IS_ERR(dfid)) {
703                 err = PTR_ERR(dfid);
704                 P9_DPRINTK(P9_DEBUG_VFS, "fid lookup failed %d\n", err);
705                 return err;
706         }
707
708         /* clone a fid to use for creation */
709         ofid = p9_client_walk(dfid, 0, NULL, 1);
710         if (IS_ERR(ofid)) {
711                 err = PTR_ERR(ofid);
712                 P9_DPRINTK(P9_DEBUG_VFS, "p9_client_walk failed %d\n", err);
713                 return err;
714         }
715
716         gid = v9fs_get_fsgid_for_create(dir);
717
718         mode = omode;
719         /* Update mode based on ACL value */
720         err = v9fs_acl_mode(dir, &mode, &dacl, &pacl);
721         if (err) {
722                 P9_DPRINTK(P9_DEBUG_VFS,
723                            "Failed to get acl values in creat %d\n", err);
724                 goto error;
725         }
726         err = p9_client_create_dotl(ofid, name, flags, mode, gid, &qid);
727         if (err < 0) {
728                 P9_DPRINTK(P9_DEBUG_VFS,
729                                 "p9_client_open_dotl failed in creat %d\n",
730                                 err);
731                 goto error;
732         }
733         /* instantiate inode and assign the unopened fid to the dentry */
734         if (v9ses->cache == CACHE_LOOSE || v9ses->cache == CACHE_FSCACHE ||
735             (nd && nd->flags & LOOKUP_OPEN)) {
736                 fid = p9_client_walk(dfid, 1, &name, 1);
737                 if (IS_ERR(fid)) {
738                         err = PTR_ERR(fid);
739                         P9_DPRINTK(P9_DEBUG_VFS, "p9_client_walk failed %d\n",
740                                 err);
741                         fid = NULL;
742                         goto error;
743                 }
744
745                 inode = v9fs_inode_from_fid(v9ses, fid, dir->i_sb);
746                 if (IS_ERR(inode)) {
747                         err = PTR_ERR(inode);
748                         P9_DPRINTK(P9_DEBUG_VFS, "inode creation failed %d\n",
749                                 err);
750                         goto error;
751                 }
752                 d_set_d_op(dentry, &v9fs_cached_dentry_operations);
753                 d_instantiate(dentry, inode);
754                 err = v9fs_fid_add(dentry, fid);
755                 if (err < 0)
756                         goto error;
757                 /* The fid would get clunked via a dput */
758                 fid = NULL;
759         } else {
760                 /*
761                  * Not in cached mode. No need to populate
762                  * inode with stat. We need to get an inode
763                  * so that we can set the acl with dentry
764                  */
765                 inode = v9fs_get_inode(dir->i_sb, mode);
766                 if (IS_ERR(inode)) {
767                         err = PTR_ERR(inode);
768                         goto error;
769                 }
770                 d_set_d_op(dentry, &v9fs_dentry_operations);
771                 d_instantiate(dentry, inode);
772         }
773         /* Now set the ACL based on the default value */
774         v9fs_set_create_acl(dentry, dacl, pacl);
775
776         /* if we are opening a file, assign the open fid to the file */
777         if (nd && nd->flags & LOOKUP_OPEN) {
778                 filp = lookup_instantiate_filp(nd, dentry, generic_file_open);
779                 if (IS_ERR(filp)) {
780                         p9_client_clunk(ofid);
781                         return PTR_ERR(filp);
782                 }
783                 filp->private_data = ofid;
784         } else
785                 p9_client_clunk(ofid);
786
787         return 0;
788
789 error:
790         if (ofid)
791                 p9_client_clunk(ofid);
792         if (fid)
793                 p9_client_clunk(fid);
794         return err;
795 }
796
797 /**
798  * v9fs_vfs_create - VFS hook to create files
799  * @dir: directory inode that is being created
800  * @dentry:  dentry that is being deleted
801  * @mode: create permissions
802  * @nd: path information
803  *
804  */
805
806 static int
807 v9fs_vfs_create(struct inode *dir, struct dentry *dentry, int mode,
808                 struct nameidata *nd)
809 {
810         int err;
811         u32 perm;
812         int flags;
813         struct v9fs_session_info *v9ses;
814         struct p9_fid *fid;
815         struct file *filp;
816
817         err = 0;
818         fid = NULL;
819         v9ses = v9fs_inode2v9ses(dir);
820         perm = unixmode2p9mode(v9ses, mode);
821         if (nd && nd->flags & LOOKUP_OPEN)
822                 flags = nd->intent.open.flags - 1;
823         else
824                 flags = O_RDWR;
825
826         fid = v9fs_create(v9ses, dir, dentry, NULL, perm,
827                                 v9fs_uflags2omode(flags,
828                                                 v9fs_proto_dotu(v9ses)));
829         if (IS_ERR(fid)) {
830                 err = PTR_ERR(fid);
831                 fid = NULL;
832                 goto error;
833         }
834
835         /* if we are opening a file, assign the open fid to the file */
836         if (nd && nd->flags & LOOKUP_OPEN) {
837                 filp = lookup_instantiate_filp(nd, dentry, generic_file_open);
838                 if (IS_ERR(filp)) {
839                         err = PTR_ERR(filp);
840                         goto error;
841                 }
842
843                 filp->private_data = fid;
844         } else
845                 p9_client_clunk(fid);
846
847         return 0;
848
849 error:
850         if (fid)
851                 p9_client_clunk(fid);
852
853         return err;
854 }
855
856 /**
857  * v9fs_vfs_mkdir - VFS mkdir hook to create a directory
858  * @dir:  inode that is being unlinked
859  * @dentry: dentry that is being unlinked
860  * @mode: mode for new directory
861  *
862  */
863
864 static int v9fs_vfs_mkdir(struct inode *dir, struct dentry *dentry, int mode)
865 {
866         int err;
867         u32 perm;
868         struct v9fs_session_info *v9ses;
869         struct p9_fid *fid;
870
871         P9_DPRINTK(P9_DEBUG_VFS, "name %s\n", dentry->d_name.name);
872         err = 0;
873         v9ses = v9fs_inode2v9ses(dir);
874         perm = unixmode2p9mode(v9ses, mode | S_IFDIR);
875         fid = v9fs_create(v9ses, dir, dentry, NULL, perm, P9_OREAD);
876         if (IS_ERR(fid)) {
877                 err = PTR_ERR(fid);
878                 fid = NULL;
879         }
880
881         if (fid)
882                 p9_client_clunk(fid);
883
884         return err;
885 }
886
887
888 /**
889  * v9fs_vfs_mkdir_dotl - VFS mkdir hook to create a directory
890  * @dir:  inode that is being unlinked
891  * @dentry: dentry that is being unlinked
892  * @mode: mode for new directory
893  *
894  */
895
896 static int v9fs_vfs_mkdir_dotl(struct inode *dir,
897                                struct dentry *dentry, int omode)
898 {
899         int err;
900         struct v9fs_session_info *v9ses;
901         struct p9_fid *fid = NULL, *dfid = NULL;
902         gid_t gid;
903         char *name;
904         mode_t mode;
905         struct inode *inode;
906         struct p9_qid qid;
907         struct dentry *dir_dentry;
908         struct posix_acl *dacl = NULL, *pacl = NULL;
909
910         P9_DPRINTK(P9_DEBUG_VFS, "name %s\n", dentry->d_name.name);
911         err = 0;
912         v9ses = v9fs_inode2v9ses(dir);
913
914         omode |= S_IFDIR;
915         if (dir->i_mode & S_ISGID)
916                 omode |= S_ISGID;
917
918         dir_dentry = v9fs_dentry_from_dir_inode(dir);
919         dfid = v9fs_fid_lookup(dir_dentry);
920         if (IS_ERR(dfid)) {
921                 err = PTR_ERR(dfid);
922                 P9_DPRINTK(P9_DEBUG_VFS, "fid lookup failed %d\n", err);
923                 dfid = NULL;
924                 goto error;
925         }
926
927         gid = v9fs_get_fsgid_for_create(dir);
928         mode = omode;
929         /* Update mode based on ACL value */
930         err = v9fs_acl_mode(dir, &mode, &dacl, &pacl);
931         if (err) {
932                 P9_DPRINTK(P9_DEBUG_VFS,
933                            "Failed to get acl values in mkdir %d\n", err);
934                 goto error;
935         }
936         name = (char *) dentry->d_name.name;
937         err = p9_client_mkdir_dotl(dfid, name, mode, gid, &qid);
938         if (err < 0)
939                 goto error;
940
941         /* instantiate inode and assign the unopened fid to the dentry */
942         if (v9ses->cache == CACHE_LOOSE || v9ses->cache == CACHE_FSCACHE) {
943                 fid = p9_client_walk(dfid, 1, &name, 1);
944                 if (IS_ERR(fid)) {
945                         err = PTR_ERR(fid);
946                         P9_DPRINTK(P9_DEBUG_VFS, "p9_client_walk failed %d\n",
947                                 err);
948                         fid = NULL;
949                         goto error;
950                 }
951
952                 inode = v9fs_inode_from_fid(v9ses, fid, dir->i_sb);
953                 if (IS_ERR(inode)) {
954                         err = PTR_ERR(inode);
955                         P9_DPRINTK(P9_DEBUG_VFS, "inode creation failed %d\n",
956                                 err);
957                         goto error;
958                 }
959                 d_set_d_op(dentry, &v9fs_cached_dentry_operations);
960                 d_instantiate(dentry, inode);
961                 err = v9fs_fid_add(dentry, fid);
962                 if (err < 0)
963                         goto error;
964                 fid = NULL;
965         } else {
966                 /*
967                  * Not in cached mode. No need to populate
968                  * inode with stat. We need to get an inode
969                  * so that we can set the acl with dentry
970                  */
971                 inode = v9fs_get_inode(dir->i_sb, mode);
972                 if (IS_ERR(inode)) {
973                         err = PTR_ERR(inode);
974                         goto error;
975                 }
976                 d_set_d_op(dentry, &v9fs_dentry_operations);
977                 d_instantiate(dentry, inode);
978         }
979         /* Now set the ACL based on the default value */
980         v9fs_set_create_acl(dentry, dacl, pacl);
981
982 error:
983         if (fid)
984                 p9_client_clunk(fid);
985         return err;
986 }
987
988 /**
989  * v9fs_vfs_lookup - VFS lookup hook to "walk" to a new inode
990  * @dir:  inode that is being walked from
991  * @dentry: dentry that is being walked to?
992  * @nameidata: path data
993  *
994  */
995
996 static struct dentry *v9fs_vfs_lookup(struct inode *dir, struct dentry *dentry,
997                                       struct nameidata *nameidata)
998 {
999         struct super_block *sb;
1000         struct v9fs_session_info *v9ses;
1001         struct p9_fid *dfid, *fid;
1002         struct inode *inode;
1003         char *name;
1004         int result = 0;
1005
1006         P9_DPRINTK(P9_DEBUG_VFS, "dir: %p dentry: (%s) %p nameidata: %p\n",
1007                 dir, dentry->d_name.name, dentry, nameidata);
1008
1009         if (dentry->d_name.len > NAME_MAX)
1010                 return ERR_PTR(-ENAMETOOLONG);
1011
1012         sb = dir->i_sb;
1013         v9ses = v9fs_inode2v9ses(dir);
1014         /* We can walk d_parent because we hold the dir->i_mutex */
1015         dfid = v9fs_fid_lookup(dentry->d_parent);
1016         if (IS_ERR(dfid))
1017                 return ERR_CAST(dfid);
1018
1019         name = (char *) dentry->d_name.name;
1020         fid = p9_client_walk(dfid, 1, &name, 1);
1021         if (IS_ERR(fid)) {
1022                 result = PTR_ERR(fid);
1023                 if (result == -ENOENT) {
1024                         inode = NULL;
1025                         goto inst_out;
1026                 }
1027
1028                 return ERR_PTR(result);
1029         }
1030
1031         inode = v9fs_inode_from_fid(v9ses, fid, dir->i_sb);
1032         if (IS_ERR(inode)) {
1033                 result = PTR_ERR(inode);
1034                 inode = NULL;
1035                 goto error;
1036         }
1037
1038         result = v9fs_fid_add(dentry, fid);
1039         if (result < 0)
1040                 goto error_iput;
1041
1042 inst_out:
1043         if (v9ses->cache)
1044                 d_set_d_op(dentry, &v9fs_cached_dentry_operations);
1045         else
1046                 d_set_d_op(dentry, &v9fs_dentry_operations);
1047
1048         d_add(dentry, inode);
1049         return NULL;
1050
1051 error_iput:
1052         iput(inode);
1053 error:
1054         p9_client_clunk(fid);
1055
1056         return ERR_PTR(result);
1057 }
1058
1059 /**
1060  * v9fs_vfs_unlink - VFS unlink hook to delete an inode
1061  * @i:  inode that is being unlinked
1062  * @d: dentry that is being unlinked
1063  *
1064  */
1065
1066 static int v9fs_vfs_unlink(struct inode *i, struct dentry *d)
1067 {
1068         return v9fs_remove(i, d, 0);
1069 }
1070
1071 /**
1072  * v9fs_vfs_rmdir - VFS unlink hook to delete a directory
1073  * @i:  inode that is being unlinked
1074  * @d: dentry that is being unlinked
1075  *
1076  */
1077
1078 static int v9fs_vfs_rmdir(struct inode *i, struct dentry *d)
1079 {
1080         return v9fs_remove(i, d, 1);
1081 }
1082
1083 /**
1084  * v9fs_vfs_rename - VFS hook to rename an inode
1085  * @old_dir:  old dir inode
1086  * @old_dentry: old dentry
1087  * @new_dir: new dir inode
1088  * @new_dentry: new dentry
1089  *
1090  */
1091
1092 static int
1093 v9fs_vfs_rename(struct inode *old_dir, struct dentry *old_dentry,
1094                 struct inode *new_dir, struct dentry *new_dentry)
1095 {
1096         struct inode *old_inode;
1097         struct v9fs_session_info *v9ses;
1098         struct p9_fid *oldfid;
1099         struct p9_fid *olddirfid;
1100         struct p9_fid *newdirfid;
1101         struct p9_wstat wstat;
1102         int retval;
1103
1104         P9_DPRINTK(P9_DEBUG_VFS, "\n");
1105         retval = 0;
1106         old_inode = old_dentry->d_inode;
1107         v9ses = v9fs_inode2v9ses(old_inode);
1108         oldfid = v9fs_fid_lookup(old_dentry);
1109         if (IS_ERR(oldfid))
1110                 return PTR_ERR(oldfid);
1111
1112         olddirfid = v9fs_fid_clone(old_dentry->d_parent);
1113         if (IS_ERR(olddirfid)) {
1114                 retval = PTR_ERR(olddirfid);
1115                 goto done;
1116         }
1117
1118         newdirfid = v9fs_fid_clone(new_dentry->d_parent);
1119         if (IS_ERR(newdirfid)) {
1120                 retval = PTR_ERR(newdirfid);
1121                 goto clunk_olddir;
1122         }
1123
1124         down_write(&v9ses->rename_sem);
1125         if (v9fs_proto_dotl(v9ses)) {
1126                 retval = p9_client_rename(oldfid, newdirfid,
1127                                         (char *) new_dentry->d_name.name);
1128                 if (retval != -ENOSYS)
1129                         goto clunk_newdir;
1130         }
1131         if (old_dentry->d_parent != new_dentry->d_parent) {
1132                 /*
1133                  * 9P .u can only handle file rename in the same directory
1134                  */
1135
1136                 P9_DPRINTK(P9_DEBUG_ERROR,
1137                                 "old dir and new dir are different\n");
1138                 retval = -EXDEV;
1139                 goto clunk_newdir;
1140         }
1141         v9fs_blank_wstat(&wstat);
1142         wstat.muid = v9ses->uname;
1143         wstat.name = (char *) new_dentry->d_name.name;
1144         retval = p9_client_wstat(oldfid, &wstat);
1145
1146 clunk_newdir:
1147         if (!retval)
1148                 /* successful rename */
1149                 d_move(old_dentry, new_dentry);
1150         up_write(&v9ses->rename_sem);
1151         p9_client_clunk(newdirfid);
1152
1153 clunk_olddir:
1154         p9_client_clunk(olddirfid);
1155
1156 done:
1157         return retval;
1158 }
1159
1160 /**
1161  * v9fs_vfs_getattr - retrieve file metadata
1162  * @mnt: mount information
1163  * @dentry: file to get attributes on
1164  * @stat: metadata structure to populate
1165  *
1166  */
1167
1168 static int
1169 v9fs_vfs_getattr(struct vfsmount *mnt, struct dentry *dentry,
1170                  struct kstat *stat)
1171 {
1172         int err;
1173         struct v9fs_session_info *v9ses;
1174         struct p9_fid *fid;
1175         struct p9_wstat *st;
1176
1177         P9_DPRINTK(P9_DEBUG_VFS, "dentry: %p\n", dentry);
1178         err = -EPERM;
1179         v9ses = v9fs_inode2v9ses(dentry->d_inode);
1180         if (v9ses->cache == CACHE_LOOSE || v9ses->cache == CACHE_FSCACHE)
1181                 return simple_getattr(mnt, dentry, stat);
1182
1183         fid = v9fs_fid_lookup(dentry);
1184         if (IS_ERR(fid))
1185                 return PTR_ERR(fid);
1186
1187         st = p9_client_stat(fid);
1188         if (IS_ERR(st))
1189                 return PTR_ERR(st);
1190
1191         v9fs_stat2inode(st, dentry->d_inode, dentry->d_inode->i_sb);
1192                 generic_fillattr(dentry->d_inode, stat);
1193
1194         p9stat_free(st);
1195         kfree(st);
1196         return 0;
1197 }
1198
1199 static int
1200 v9fs_vfs_getattr_dotl(struct vfsmount *mnt, struct dentry *dentry,
1201                  struct kstat *stat)
1202 {
1203         int err;
1204         struct v9fs_session_info *v9ses;
1205         struct p9_fid *fid;
1206         struct p9_stat_dotl *st;
1207
1208         P9_DPRINTK(P9_DEBUG_VFS, "dentry: %p\n", dentry);
1209         err = -EPERM;
1210         v9ses = v9fs_inode2v9ses(dentry->d_inode);
1211         if (v9ses->cache == CACHE_LOOSE || v9ses->cache == CACHE_FSCACHE)
1212                 return simple_getattr(mnt, dentry, stat);
1213
1214         fid = v9fs_fid_lookup(dentry);
1215         if (IS_ERR(fid))
1216                 return PTR_ERR(fid);
1217
1218         /* Ask for all the fields in stat structure. Server will return
1219          * whatever it supports
1220          */
1221
1222         st = p9_client_getattr_dotl(fid, P9_STATS_ALL);
1223         if (IS_ERR(st))
1224                 return PTR_ERR(st);
1225
1226         v9fs_stat2inode_dotl(st, dentry->d_inode);
1227         generic_fillattr(dentry->d_inode, stat);
1228         /* Change block size to what the server returned */
1229         stat->blksize = st->st_blksize;
1230
1231         kfree(st);
1232         return 0;
1233 }
1234
1235 /**
1236  * v9fs_vfs_setattr - set file metadata
1237  * @dentry: file whose metadata to set
1238  * @iattr: metadata assignment structure
1239  *
1240  */
1241
1242 static int v9fs_vfs_setattr(struct dentry *dentry, struct iattr *iattr)
1243 {
1244         int retval;
1245         struct v9fs_session_info *v9ses;
1246         struct p9_fid *fid;
1247         struct p9_wstat wstat;
1248
1249         P9_DPRINTK(P9_DEBUG_VFS, "\n");
1250         retval = -EPERM;
1251         v9ses = v9fs_inode2v9ses(dentry->d_inode);
1252         fid = v9fs_fid_lookup(dentry);
1253         if(IS_ERR(fid))
1254                 return PTR_ERR(fid);
1255
1256         v9fs_blank_wstat(&wstat);
1257         if (iattr->ia_valid & ATTR_MODE)
1258                 wstat.mode = unixmode2p9mode(v9ses, iattr->ia_mode);
1259
1260         if (iattr->ia_valid & ATTR_MTIME)
1261                 wstat.mtime = iattr->ia_mtime.tv_sec;
1262
1263         if (iattr->ia_valid & ATTR_ATIME)
1264                 wstat.atime = iattr->ia_atime.tv_sec;
1265
1266         if (iattr->ia_valid & ATTR_SIZE)
1267                 wstat.length = iattr->ia_size;
1268
1269         if (v9fs_proto_dotu(v9ses)) {
1270                 if (iattr->ia_valid & ATTR_UID)
1271                         wstat.n_uid = iattr->ia_uid;
1272
1273                 if (iattr->ia_valid & ATTR_GID)
1274                         wstat.n_gid = iattr->ia_gid;
1275         }
1276
1277         retval = p9_client_wstat(fid, &wstat);
1278         if (retval < 0)
1279                 return retval;
1280
1281         if ((iattr->ia_valid & ATTR_SIZE) &&
1282             iattr->ia_size != i_size_read(dentry->d_inode)) {
1283                 retval = vmtruncate(dentry->d_inode, iattr->ia_size);
1284                 if (retval)
1285                         return retval;
1286         }
1287
1288         setattr_copy(dentry->d_inode, iattr);
1289         mark_inode_dirty(dentry->d_inode);
1290         return 0;
1291 }
1292
1293 /**
1294  * v9fs_vfs_setattr_dotl - set file metadata
1295  * @dentry: file whose metadata to set
1296  * @iattr: metadata assignment structure
1297  *
1298  */
1299
1300 int v9fs_vfs_setattr_dotl(struct dentry *dentry, struct iattr *iattr)
1301 {
1302         int retval;
1303         struct v9fs_session_info *v9ses;
1304         struct p9_fid *fid;
1305         struct p9_iattr_dotl p9attr;
1306
1307         P9_DPRINTK(P9_DEBUG_VFS, "\n");
1308
1309         retval = inode_change_ok(dentry->d_inode, iattr);
1310         if (retval)
1311                 return retval;
1312
1313         p9attr.valid = iattr->ia_valid;
1314         p9attr.mode = iattr->ia_mode;
1315         p9attr.uid = iattr->ia_uid;
1316         p9attr.gid = iattr->ia_gid;
1317         p9attr.size = iattr->ia_size;
1318         p9attr.atime_sec = iattr->ia_atime.tv_sec;
1319         p9attr.atime_nsec = iattr->ia_atime.tv_nsec;
1320         p9attr.mtime_sec = iattr->ia_mtime.tv_sec;
1321         p9attr.mtime_nsec = iattr->ia_mtime.tv_nsec;
1322
1323         retval = -EPERM;
1324         v9ses = v9fs_inode2v9ses(dentry->d_inode);
1325         fid = v9fs_fid_lookup(dentry);
1326         if (IS_ERR(fid))
1327                 return PTR_ERR(fid);
1328
1329         retval = p9_client_setattr(fid, &p9attr);
1330         if (retval < 0)
1331                 return retval;
1332
1333         if ((iattr->ia_valid & ATTR_SIZE) &&
1334             iattr->ia_size != i_size_read(dentry->d_inode)) {
1335                 retval = vmtruncate(dentry->d_inode, iattr->ia_size);
1336                 if (retval)
1337                         return retval;
1338         }
1339
1340         setattr_copy(dentry->d_inode, iattr);
1341         mark_inode_dirty(dentry->d_inode);
1342         if (iattr->ia_valid & ATTR_MODE) {
1343                 /* We also want to update ACL when we update mode bits */
1344                 retval = v9fs_acl_chmod(dentry);
1345                 if (retval < 0)
1346                         return retval;
1347         }
1348         return 0;
1349 }
1350
1351 /**
1352  * v9fs_stat2inode - populate an inode structure with mistat info
1353  * @stat: Plan 9 metadata (mistat) structure
1354  * @inode: inode to populate
1355  * @sb: superblock of filesystem
1356  *
1357  */
1358
1359 void
1360 v9fs_stat2inode(struct p9_wstat *stat, struct inode *inode,
1361         struct super_block *sb)
1362 {
1363         char ext[32];
1364         char tag_name[14];
1365         unsigned int i_nlink;
1366         struct v9fs_session_info *v9ses = sb->s_fs_info;
1367
1368         inode->i_nlink = 1;
1369
1370         inode->i_atime.tv_sec = stat->atime;
1371         inode->i_mtime.tv_sec = stat->mtime;
1372         inode->i_ctime.tv_sec = stat->mtime;
1373
1374         inode->i_uid = v9ses->dfltuid;
1375         inode->i_gid = v9ses->dfltgid;
1376
1377         if (v9fs_proto_dotu(v9ses)) {
1378                 inode->i_uid = stat->n_uid;
1379                 inode->i_gid = stat->n_gid;
1380         }
1381         if ((S_ISREG(inode->i_mode)) || (S_ISDIR(inode->i_mode))) {
1382                 if (v9fs_proto_dotu(v9ses) && (stat->extension[0] != '\0')) {
1383                         /*
1384                          * Hadlink support got added later to
1385                          * to the .u extension. So there can be
1386                          * server out there that doesn't support
1387                          * this even with .u extension. So check
1388                          * for non NULL stat->extension
1389                          */
1390                         strncpy(ext, stat->extension, sizeof(ext));
1391                         /* HARDLINKCOUNT %u */
1392                         sscanf(ext, "%13s %u", tag_name, &i_nlink);
1393                         if (!strncmp(tag_name, "HARDLINKCOUNT", 13))
1394                                 inode->i_nlink = i_nlink;
1395                 }
1396         }
1397         inode->i_mode = p9mode2unixmode(v9ses, stat->mode);
1398         if ((S_ISBLK(inode->i_mode)) || (S_ISCHR(inode->i_mode))) {
1399                 char type = 0;
1400                 int major = -1;
1401                 int minor = -1;
1402
1403                 strncpy(ext, stat->extension, sizeof(ext));
1404                 sscanf(ext, "%c %u %u", &type, &major, &minor);
1405                 switch (type) {
1406                 case 'c':
1407                         inode->i_mode &= ~S_IFBLK;
1408                         inode->i_mode |= S_IFCHR;
1409                         break;
1410                 case 'b':
1411                         break;
1412                 default:
1413                         P9_DPRINTK(P9_DEBUG_ERROR,
1414                                 "Unknown special type %c %s\n", type,
1415                                 stat->extension);
1416                 };
1417                 inode->i_rdev = MKDEV(major, minor);
1418                 init_special_inode(inode, inode->i_mode, inode->i_rdev);
1419         } else
1420                 inode->i_rdev = 0;
1421
1422         i_size_write(inode, stat->length);
1423
1424         /* not real number of blocks, but 512 byte ones ... */
1425         inode->i_blocks = (i_size_read(inode) + 512 - 1) >> 9;
1426 }
1427
1428 /**
1429  * v9fs_stat2inode_dotl - populate an inode structure with stat info
1430  * @stat: stat structure
1431  * @inode: inode to populate
1432  * @sb: superblock of filesystem
1433  *
1434  */
1435
1436 void
1437 v9fs_stat2inode_dotl(struct p9_stat_dotl *stat, struct inode *inode)
1438 {
1439
1440         if ((stat->st_result_mask & P9_STATS_BASIC) == P9_STATS_BASIC) {
1441                 inode->i_atime.tv_sec = stat->st_atime_sec;
1442                 inode->i_atime.tv_nsec = stat->st_atime_nsec;
1443                 inode->i_mtime.tv_sec = stat->st_mtime_sec;
1444                 inode->i_mtime.tv_nsec = stat->st_mtime_nsec;
1445                 inode->i_ctime.tv_sec = stat->st_ctime_sec;
1446                 inode->i_ctime.tv_nsec = stat->st_ctime_nsec;
1447                 inode->i_uid = stat->st_uid;
1448                 inode->i_gid = stat->st_gid;
1449                 inode->i_nlink = stat->st_nlink;
1450                 inode->i_mode = stat->st_mode;
1451                 inode->i_rdev = new_decode_dev(stat->st_rdev);
1452
1453                 if ((S_ISBLK(inode->i_mode)) || (S_ISCHR(inode->i_mode)))
1454                         init_special_inode(inode, inode->i_mode, inode->i_rdev);
1455
1456                 i_size_write(inode, stat->st_size);
1457                 inode->i_blocks = stat->st_blocks;
1458         } else {
1459                 if (stat->st_result_mask & P9_STATS_ATIME) {
1460                         inode->i_atime.tv_sec = stat->st_atime_sec;
1461                         inode->i_atime.tv_nsec = stat->st_atime_nsec;
1462                 }
1463                 if (stat->st_result_mask & P9_STATS_MTIME) {
1464                         inode->i_mtime.tv_sec = stat->st_mtime_sec;
1465                         inode->i_mtime.tv_nsec = stat->st_mtime_nsec;
1466                 }
1467                 if (stat->st_result_mask & P9_STATS_CTIME) {
1468                         inode->i_ctime.tv_sec = stat->st_ctime_sec;
1469                         inode->i_ctime.tv_nsec = stat->st_ctime_nsec;
1470                 }
1471                 if (stat->st_result_mask & P9_STATS_UID)
1472                         inode->i_uid = stat->st_uid;
1473                 if (stat->st_result_mask & P9_STATS_GID)
1474                         inode->i_gid = stat->st_gid;
1475                 if (stat->st_result_mask & P9_STATS_NLINK)
1476                         inode->i_nlink = stat->st_nlink;
1477                 if (stat->st_result_mask & P9_STATS_MODE) {
1478                         inode->i_mode = stat->st_mode;
1479                         if ((S_ISBLK(inode->i_mode)) ||
1480                                                 (S_ISCHR(inode->i_mode)))
1481                                 init_special_inode(inode, inode->i_mode,
1482                                                                 inode->i_rdev);
1483                 }
1484                 if (stat->st_result_mask & P9_STATS_RDEV)
1485                         inode->i_rdev = new_decode_dev(stat->st_rdev);
1486                 if (stat->st_result_mask & P9_STATS_SIZE)
1487                         i_size_write(inode, stat->st_size);
1488                 if (stat->st_result_mask & P9_STATS_BLOCKS)
1489                         inode->i_blocks = stat->st_blocks;
1490         }
1491         if (stat->st_result_mask & P9_STATS_GEN)
1492                         inode->i_generation = stat->st_gen;
1493
1494         /* Currently we don't support P9_STATS_BTIME and P9_STATS_DATA_VERSION
1495          * because the inode structure does not have fields for them.
1496          */
1497 }
1498
1499 /**
1500  * v9fs_qid2ino - convert qid into inode number
1501  * @qid: qid to hash
1502  *
1503  * BUG: potential for inode number collisions?
1504  */
1505
1506 ino_t v9fs_qid2ino(struct p9_qid *qid)
1507 {
1508         u64 path = qid->path + 2;
1509         ino_t i = 0;
1510
1511         if (sizeof(ino_t) == sizeof(path))
1512                 memcpy(&i, &path, sizeof(ino_t));
1513         else
1514                 i = (ino_t) (path ^ (path >> 32));
1515
1516         return i;
1517 }
1518
1519 /**
1520  * v9fs_readlink - read a symlink's location (internal version)
1521  * @dentry: dentry for symlink
1522  * @buffer: buffer to load symlink location into
1523  * @buflen: length of buffer
1524  *
1525  */
1526
1527 static int v9fs_readlink(struct dentry *dentry, char *buffer, int buflen)
1528 {
1529         int retval;
1530
1531         struct v9fs_session_info *v9ses;
1532         struct p9_fid *fid;
1533         struct p9_wstat *st;
1534
1535         P9_DPRINTK(P9_DEBUG_VFS, " %s\n", dentry->d_name.name);
1536         retval = -EPERM;
1537         v9ses = v9fs_inode2v9ses(dentry->d_inode);
1538         fid = v9fs_fid_lookup(dentry);
1539         if (IS_ERR(fid))
1540                 return PTR_ERR(fid);
1541
1542         if (!v9fs_proto_dotu(v9ses))
1543                 return -EBADF;
1544
1545         st = p9_client_stat(fid);
1546         if (IS_ERR(st))
1547                 return PTR_ERR(st);
1548
1549         if (!(st->mode & P9_DMSYMLINK)) {
1550                 retval = -EINVAL;
1551                 goto done;
1552         }
1553
1554         /* copy extension buffer into buffer */
1555         strncpy(buffer, st->extension, buflen);
1556
1557         P9_DPRINTK(P9_DEBUG_VFS,
1558                 "%s -> %s (%s)\n", dentry->d_name.name, st->extension, buffer);
1559
1560         retval = strnlen(buffer, buflen);
1561 done:
1562         p9stat_free(st);
1563         kfree(st);
1564         return retval;
1565 }
1566
1567 /**
1568  * v9fs_vfs_follow_link - follow a symlink path
1569  * @dentry: dentry for symlink
1570  * @nd: nameidata
1571  *
1572  */
1573
1574 static void *v9fs_vfs_follow_link(struct dentry *dentry, struct nameidata *nd)
1575 {
1576         int len = 0;
1577         char *link = __getname();
1578
1579         P9_DPRINTK(P9_DEBUG_VFS, "%s n", dentry->d_name.name);
1580
1581         if (!link)
1582                 link = ERR_PTR(-ENOMEM);
1583         else {
1584                 len = v9fs_readlink(dentry, link, PATH_MAX);
1585
1586                 if (len < 0) {
1587                         __putname(link);
1588                         link = ERR_PTR(len);
1589                 } else
1590                         link[min(len, PATH_MAX-1)] = 0;
1591         }
1592         nd_set_link(nd, link);
1593
1594         return NULL;
1595 }
1596
1597 /**
1598  * v9fs_vfs_put_link - release a symlink path
1599  * @dentry: dentry for symlink
1600  * @nd: nameidata
1601  * @p: unused
1602  *
1603  */
1604
1605 static void
1606 v9fs_vfs_put_link(struct dentry *dentry, struct nameidata *nd, void *p)
1607 {
1608         char *s = nd_get_link(nd);
1609
1610         P9_DPRINTK(P9_DEBUG_VFS, " %s %s\n", dentry->d_name.name,
1611                 IS_ERR(s) ? "<error>" : s);
1612         if (!IS_ERR(s))
1613                 __putname(s);
1614 }
1615
1616 /**
1617  * v9fs_vfs_mkspecial - create a special file
1618  * @dir: inode to create special file in
1619  * @dentry: dentry to create
1620  * @mode: mode to create special file
1621  * @extension: 9p2000.u format extension string representing special file
1622  *
1623  */
1624
1625 static int v9fs_vfs_mkspecial(struct inode *dir, struct dentry *dentry,
1626         int mode, const char *extension)
1627 {
1628         u32 perm;
1629         struct v9fs_session_info *v9ses;
1630         struct p9_fid *fid;
1631
1632         v9ses = v9fs_inode2v9ses(dir);
1633         if (!v9fs_proto_dotu(v9ses)) {
1634                 P9_DPRINTK(P9_DEBUG_ERROR, "not extended\n");
1635                 return -EPERM;
1636         }
1637
1638         perm = unixmode2p9mode(v9ses, mode);
1639         fid = v9fs_create(v9ses, dir, dentry, (char *) extension, perm,
1640                                                                 P9_OREAD);
1641         if (IS_ERR(fid))
1642                 return PTR_ERR(fid);
1643
1644         p9_client_clunk(fid);
1645         return 0;
1646 }
1647
1648 /**
1649  * v9fs_vfs_symlink_dotl - helper function to create symlinks
1650  * @dir: directory inode containing symlink
1651  * @dentry: dentry for symlink
1652  * @symname: symlink data
1653  *
1654  * See Also: 9P2000.L RFC for more information
1655  *
1656  */
1657
1658 static int
1659 v9fs_vfs_symlink_dotl(struct inode *dir, struct dentry *dentry,
1660                 const char *symname)
1661 {
1662         struct v9fs_session_info *v9ses;
1663         struct p9_fid *dfid;
1664         struct p9_fid *fid = NULL;
1665         struct inode *inode;
1666         struct p9_qid qid;
1667         char *name;
1668         int err;
1669         gid_t gid;
1670
1671         name = (char *) dentry->d_name.name;
1672         P9_DPRINTK(P9_DEBUG_VFS, "v9fs_vfs_symlink_dotl : %lu,%s,%s\n",
1673                         dir->i_ino, name, symname);
1674         v9ses = v9fs_inode2v9ses(dir);
1675
1676         dfid = v9fs_fid_lookup(dentry->d_parent);
1677         if (IS_ERR(dfid)) {
1678                 err = PTR_ERR(dfid);
1679                 P9_DPRINTK(P9_DEBUG_VFS, "fid lookup failed %d\n", err);
1680                 return err;
1681         }
1682
1683         gid = v9fs_get_fsgid_for_create(dir);
1684
1685         /* Server doesn't alter fid on TSYMLINK. Hence no need to clone it. */
1686         err = p9_client_symlink(dfid, name, (char *)symname, gid, &qid);
1687
1688         if (err < 0) {
1689                 P9_DPRINTK(P9_DEBUG_VFS, "p9_client_symlink failed %d\n", err);
1690                 goto error;
1691         }
1692
1693         if (v9ses->cache) {
1694                 /* Now walk from the parent so we can get an unopened fid. */
1695                 fid = p9_client_walk(dfid, 1, &name, 1);
1696                 if (IS_ERR(fid)) {
1697                         err = PTR_ERR(fid);
1698                         P9_DPRINTK(P9_DEBUG_VFS, "p9_client_walk failed %d\n",
1699                                         err);
1700                         fid = NULL;
1701                         goto error;
1702                 }
1703
1704                 /* instantiate inode and assign the unopened fid to dentry */
1705                 inode = v9fs_inode_from_fid(v9ses, fid, dir->i_sb);
1706                 if (IS_ERR(inode)) {
1707                         err = PTR_ERR(inode);
1708                         P9_DPRINTK(P9_DEBUG_VFS, "inode creation failed %d\n",
1709                                         err);
1710                         goto error;
1711                 }
1712                 d_set_d_op(dentry, &v9fs_cached_dentry_operations);
1713                 d_instantiate(dentry, inode);
1714                 err = v9fs_fid_add(dentry, fid);
1715                 if (err < 0)
1716                         goto error;
1717                 fid = NULL;
1718         } else {
1719                 /* Not in cached mode. No need to populate inode with stat */
1720                 inode = v9fs_get_inode(dir->i_sb, S_IFLNK);
1721                 if (IS_ERR(inode)) {
1722                         err = PTR_ERR(inode);
1723                         goto error;
1724                 }
1725                 d_set_d_op(dentry, &v9fs_dentry_operations);
1726                 d_instantiate(dentry, inode);
1727         }
1728
1729 error:
1730         if (fid)
1731                 p9_client_clunk(fid);
1732
1733         return err;
1734 }
1735
1736 /**
1737  * v9fs_vfs_symlink - helper function to create symlinks
1738  * @dir: directory inode containing symlink
1739  * @dentry: dentry for symlink
1740  * @symname: symlink data
1741  *
1742  * See Also: 9P2000.u RFC for more information
1743  *
1744  */
1745
1746 static int
1747 v9fs_vfs_symlink(struct inode *dir, struct dentry *dentry, const char *symname)
1748 {
1749         P9_DPRINTK(P9_DEBUG_VFS, " %lu,%s,%s\n", dir->i_ino,
1750                                         dentry->d_name.name, symname);
1751
1752         return v9fs_vfs_mkspecial(dir, dentry, S_IFLNK, symname);
1753 }
1754
1755 /**
1756  * v9fs_vfs_link - create a hardlink
1757  * @old_dentry: dentry for file to link to
1758  * @dir: inode destination for new link
1759  * @dentry: dentry for link
1760  *
1761  */
1762
1763 static int
1764 v9fs_vfs_link(struct dentry *old_dentry, struct inode *dir,
1765               struct dentry *dentry)
1766 {
1767         int retval;
1768         struct p9_fid *oldfid;
1769         char *name;
1770
1771         P9_DPRINTK(P9_DEBUG_VFS,
1772                 " %lu,%s,%s\n", dir->i_ino, dentry->d_name.name,
1773                 old_dentry->d_name.name);
1774
1775         oldfid = v9fs_fid_clone(old_dentry);
1776         if (IS_ERR(oldfid))
1777                 return PTR_ERR(oldfid);
1778
1779         name = __getname();
1780         if (unlikely(!name)) {
1781                 retval = -ENOMEM;
1782                 goto clunk_fid;
1783         }
1784
1785         sprintf(name, "%d\n", oldfid->fid);
1786         retval = v9fs_vfs_mkspecial(dir, dentry, P9_DMLINK, name);
1787         __putname(name);
1788
1789 clunk_fid:
1790         p9_client_clunk(oldfid);
1791         return retval;
1792 }
1793
1794 /**
1795  * v9fs_vfs_link_dotl - create a hardlink for dotl
1796  * @old_dentry: dentry for file to link to
1797  * @dir: inode destination for new link
1798  * @dentry: dentry for link
1799  *
1800  */
1801
1802 static int
1803 v9fs_vfs_link_dotl(struct dentry *old_dentry, struct inode *dir,
1804                 struct dentry *dentry)
1805 {
1806         int err;
1807         struct p9_fid *dfid, *oldfid;
1808         char *name;
1809         struct v9fs_session_info *v9ses;
1810         struct dentry *dir_dentry;
1811
1812         P9_DPRINTK(P9_DEBUG_VFS, "dir ino: %lu, old_name: %s, new_name: %s\n",
1813                         dir->i_ino, old_dentry->d_name.name,
1814                         dentry->d_name.name);
1815
1816         v9ses = v9fs_inode2v9ses(dir);
1817         dir_dentry = v9fs_dentry_from_dir_inode(dir);
1818         dfid = v9fs_fid_lookup(dir_dentry);
1819         if (IS_ERR(dfid))
1820                 return PTR_ERR(dfid);
1821
1822         oldfid = v9fs_fid_lookup(old_dentry);
1823         if (IS_ERR(oldfid))
1824                 return PTR_ERR(oldfid);
1825
1826         name = (char *) dentry->d_name.name;
1827
1828         err = p9_client_link(dfid, oldfid, (char *)dentry->d_name.name);
1829
1830         if (err < 0) {
1831                 P9_DPRINTK(P9_DEBUG_VFS, "p9_client_link failed %d\n", err);
1832                 return err;
1833         }
1834
1835         if (v9ses->cache == CACHE_LOOSE || v9ses->cache == CACHE_FSCACHE) {
1836                 /* Get the latest stat info from server. */
1837                 struct p9_fid *fid;
1838                 struct p9_stat_dotl *st;
1839
1840                 fid = v9fs_fid_lookup(old_dentry);
1841                 if (IS_ERR(fid))
1842                         return PTR_ERR(fid);
1843
1844                 st = p9_client_getattr_dotl(fid, P9_STATS_BASIC);
1845                 if (IS_ERR(st))
1846                         return PTR_ERR(st);
1847
1848                 v9fs_stat2inode_dotl(st, old_dentry->d_inode);
1849
1850                 kfree(st);
1851         } else {
1852                 /* Caching disabled. No need to get upto date stat info.
1853                  * This dentry will be released immediately. So, just hold the
1854                  * inode
1855                  */
1856                 ihold(old_dentry->d_inode);
1857         }
1858
1859         d_set_d_op(dentry, old_dentry->d_op);
1860         d_instantiate(dentry, old_dentry->d_inode);
1861
1862         return err;
1863 }
1864
1865 /**
1866  * v9fs_vfs_mknod - create a special file
1867  * @dir: inode destination for new link
1868  * @dentry: dentry for file
1869  * @mode: mode for creation
1870  * @rdev: device associated with special file
1871  *
1872  */
1873
1874 static int
1875 v9fs_vfs_mknod(struct inode *dir, struct dentry *dentry, int mode, dev_t rdev)
1876 {
1877         int retval;
1878         char *name;
1879
1880         P9_DPRINTK(P9_DEBUG_VFS,
1881                 " %lu,%s mode: %x MAJOR: %u MINOR: %u\n", dir->i_ino,
1882                 dentry->d_name.name, mode, MAJOR(rdev), MINOR(rdev));
1883
1884         if (!new_valid_dev(rdev))
1885                 return -EINVAL;
1886
1887         name = __getname();
1888         if (!name)
1889                 return -ENOMEM;
1890         /* build extension */
1891         if (S_ISBLK(mode))
1892                 sprintf(name, "b %u %u", MAJOR(rdev), MINOR(rdev));
1893         else if (S_ISCHR(mode))
1894                 sprintf(name, "c %u %u", MAJOR(rdev), MINOR(rdev));
1895         else if (S_ISFIFO(mode))
1896                 *name = 0;
1897         else if (S_ISSOCK(mode))
1898                 *name = 0;
1899         else {
1900                 __putname(name);
1901                 return -EINVAL;
1902         }
1903
1904         retval = v9fs_vfs_mkspecial(dir, dentry, mode, name);
1905         __putname(name);
1906
1907         return retval;
1908 }
1909
1910 /**
1911  * v9fs_vfs_mknod_dotl - create a special file
1912  * @dir: inode destination for new link
1913  * @dentry: dentry for file
1914  * @mode: mode for creation
1915  * @rdev: device associated with special file
1916  *
1917  */
1918 static int
1919 v9fs_vfs_mknod_dotl(struct inode *dir, struct dentry *dentry, int omode,
1920                 dev_t rdev)
1921 {
1922         int err;
1923         char *name;
1924         mode_t mode;
1925         struct v9fs_session_info *v9ses;
1926         struct p9_fid *fid = NULL, *dfid = NULL;
1927         struct inode *inode;
1928         gid_t gid;
1929         struct p9_qid qid;
1930         struct dentry *dir_dentry;
1931         struct posix_acl *dacl = NULL, *pacl = NULL;
1932
1933         P9_DPRINTK(P9_DEBUG_VFS,
1934                 " %lu,%s mode: %x MAJOR: %u MINOR: %u\n", dir->i_ino,
1935                 dentry->d_name.name, omode, MAJOR(rdev), MINOR(rdev));
1936
1937         if (!new_valid_dev(rdev))
1938                 return -EINVAL;
1939
1940         v9ses = v9fs_inode2v9ses(dir);
1941         dir_dentry = v9fs_dentry_from_dir_inode(dir);
1942         dfid = v9fs_fid_lookup(dir_dentry);
1943         if (IS_ERR(dfid)) {
1944                 err = PTR_ERR(dfid);
1945                 P9_DPRINTK(P9_DEBUG_VFS, "fid lookup failed %d\n", err);
1946                 dfid = NULL;
1947                 goto error;
1948         }
1949
1950         gid = v9fs_get_fsgid_for_create(dir);
1951         mode = omode;
1952         /* Update mode based on ACL value */
1953         err = v9fs_acl_mode(dir, &mode, &dacl, &pacl);
1954         if (err) {
1955                 P9_DPRINTK(P9_DEBUG_VFS,
1956                            "Failed to get acl values in mknod %d\n", err);
1957                 goto error;
1958         }
1959         name = (char *) dentry->d_name.name;
1960
1961         err = p9_client_mknod_dotl(dfid, name, mode, rdev, gid, &qid);
1962         if (err < 0)
1963                 goto error;
1964
1965         /* instantiate inode and assign the unopened fid to the dentry */
1966         if (v9ses->cache == CACHE_LOOSE || v9ses->cache == CACHE_FSCACHE) {
1967                 fid = p9_client_walk(dfid, 1, &name, 1);
1968                 if (IS_ERR(fid)) {
1969                         err = PTR_ERR(fid);
1970                         P9_DPRINTK(P9_DEBUG_VFS, "p9_client_walk failed %d\n",
1971                                 err);
1972                         fid = NULL;
1973                         goto error;
1974                 }
1975
1976                 inode = v9fs_inode_from_fid(v9ses, fid, dir->i_sb);
1977                 if (IS_ERR(inode)) {
1978                         err = PTR_ERR(inode);
1979                         P9_DPRINTK(P9_DEBUG_VFS, "inode creation failed %d\n",
1980                                 err);
1981                         goto error;
1982                 }
1983                 d_set_d_op(dentry, &v9fs_cached_dentry_operations);
1984                 d_instantiate(dentry, inode);
1985                 err = v9fs_fid_add(dentry, fid);
1986                 if (err < 0)
1987                         goto error;
1988                 fid = NULL;
1989         } else {
1990                 /*
1991                  * Not in cached mode. No need to populate inode with stat.
1992                  * socket syscall returns a fd, so we need instantiate
1993                  */
1994                 inode = v9fs_get_inode(dir->i_sb, mode);
1995                 if (IS_ERR(inode)) {
1996                         err = PTR_ERR(inode);
1997                         goto error;
1998                 }
1999                 d_set_d_op(dentry, &v9fs_dentry_operations);
2000                 d_instantiate(dentry, inode);
2001         }
2002         /* Now set the ACL based on the default value */
2003         v9fs_set_create_acl(dentry, dacl, pacl);
2004 error:
2005         if (fid)
2006                 p9_client_clunk(fid);
2007         return err;
2008 }
2009
2010 static int
2011 v9fs_vfs_readlink_dotl(struct dentry *dentry, char *buffer, int buflen)
2012 {
2013         int retval;
2014         struct p9_fid *fid;
2015         char *target = NULL;
2016
2017         P9_DPRINTK(P9_DEBUG_VFS, " %s\n", dentry->d_name.name);
2018         retval = -EPERM;
2019         fid = v9fs_fid_lookup(dentry);
2020         if (IS_ERR(fid))
2021                 return PTR_ERR(fid);
2022
2023         retval = p9_client_readlink(fid, &target);
2024         if (retval < 0)
2025                 return retval;
2026
2027         strncpy(buffer, target, buflen);
2028         P9_DPRINTK(P9_DEBUG_VFS, "%s -> %s\n", dentry->d_name.name, buffer);
2029
2030         retval = strnlen(buffer, buflen);
2031         return retval;
2032 }
2033
2034 /**
2035  * v9fs_vfs_follow_link_dotl - follow a symlink path
2036  * @dentry: dentry for symlink
2037  * @nd: nameidata
2038  *
2039  */
2040
2041 static void *
2042 v9fs_vfs_follow_link_dotl(struct dentry *dentry, struct nameidata *nd)
2043 {
2044         int len = 0;
2045         char *link = __getname();
2046
2047         P9_DPRINTK(P9_DEBUG_VFS, "%s n", dentry->d_name.name);
2048
2049         if (!link)
2050                 link = ERR_PTR(-ENOMEM);
2051         else {
2052                 len = v9fs_vfs_readlink_dotl(dentry, link, PATH_MAX);
2053                 if (len < 0) {
2054                         __putname(link);
2055                         link = ERR_PTR(len);
2056                 } else
2057                         link[min(len, PATH_MAX-1)] = 0;
2058         }
2059         nd_set_link(nd, link);
2060
2061         return NULL;
2062 }
2063
2064 static const struct inode_operations v9fs_dir_inode_operations_dotu = {
2065         .create = v9fs_vfs_create,
2066         .lookup = v9fs_vfs_lookup,
2067         .symlink = v9fs_vfs_symlink,
2068         .link = v9fs_vfs_link,
2069         .unlink = v9fs_vfs_unlink,
2070         .mkdir = v9fs_vfs_mkdir,
2071         .rmdir = v9fs_vfs_rmdir,
2072         .mknod = v9fs_vfs_mknod,
2073         .rename = v9fs_vfs_rename,
2074         .getattr = v9fs_vfs_getattr,
2075         .setattr = v9fs_vfs_setattr,
2076 };
2077
2078 static const struct inode_operations v9fs_dir_inode_operations_dotl = {
2079         .create = v9fs_vfs_create_dotl,
2080         .lookup = v9fs_vfs_lookup,
2081         .link = v9fs_vfs_link_dotl,
2082         .symlink = v9fs_vfs_symlink_dotl,
2083         .unlink = v9fs_vfs_unlink,
2084         .mkdir = v9fs_vfs_mkdir_dotl,
2085         .rmdir = v9fs_vfs_rmdir,
2086         .mknod = v9fs_vfs_mknod_dotl,
2087         .rename = v9fs_vfs_rename,
2088         .getattr = v9fs_vfs_getattr_dotl,
2089         .setattr = v9fs_vfs_setattr_dotl,
2090         .setxattr = generic_setxattr,
2091         .getxattr = generic_getxattr,
2092         .removexattr = generic_removexattr,
2093         .listxattr = v9fs_listxattr,
2094         .check_acl = v9fs_check_acl,
2095 };
2096
2097 static const struct inode_operations v9fs_dir_inode_operations = {
2098         .create = v9fs_vfs_create,
2099         .lookup = v9fs_vfs_lookup,
2100         .unlink = v9fs_vfs_unlink,
2101         .mkdir = v9fs_vfs_mkdir,
2102         .rmdir = v9fs_vfs_rmdir,
2103         .mknod = v9fs_vfs_mknod,
2104         .rename = v9fs_vfs_rename,
2105         .getattr = v9fs_vfs_getattr,
2106         .setattr = v9fs_vfs_setattr,
2107 };
2108
2109 static const struct inode_operations v9fs_file_inode_operations = {
2110         .getattr = v9fs_vfs_getattr,
2111         .setattr = v9fs_vfs_setattr,
2112 };
2113
2114 static const struct inode_operations v9fs_file_inode_operations_dotl = {
2115         .getattr = v9fs_vfs_getattr_dotl,
2116         .setattr = v9fs_vfs_setattr_dotl,
2117         .setxattr = generic_setxattr,
2118         .getxattr = generic_getxattr,
2119         .removexattr = generic_removexattr,
2120         .listxattr = v9fs_listxattr,
2121         .check_acl = v9fs_check_acl,
2122 };
2123
2124 static const struct inode_operations v9fs_symlink_inode_operations = {
2125         .readlink = generic_readlink,
2126         .follow_link = v9fs_vfs_follow_link,
2127         .put_link = v9fs_vfs_put_link,
2128         .getattr = v9fs_vfs_getattr,
2129         .setattr = v9fs_vfs_setattr,
2130 };
2131
2132 static const struct inode_operations v9fs_symlink_inode_operations_dotl = {
2133         .readlink = v9fs_vfs_readlink_dotl,
2134         .follow_link = v9fs_vfs_follow_link_dotl,
2135         .put_link = v9fs_vfs_put_link,
2136         .getattr = v9fs_vfs_getattr_dotl,
2137         .setattr = v9fs_vfs_setattr_dotl,
2138         .setxattr = generic_setxattr,
2139         .getxattr = generic_getxattr,
2140         .removexattr = generic_removexattr,
2141         .listxattr = v9fs_listxattr,
2142 };