Merge tag 'jfs-5.2' of git://github.com/kleikamp/linux-shaggy
[sfrench/cifs-2.6.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 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
27
28 #include <linux/module.h>
29 #include <linux/errno.h>
30 #include <linux/fs.h>
31 #include <linux/file.h>
32 #include <linux/pagemap.h>
33 #include <linux/stat.h>
34 #include <linux/string.h>
35 #include <linux/inet.h>
36 #include <linux/namei.h>
37 #include <linux/idr.h>
38 #include <linux/sched.h>
39 #include <linux/slab.h>
40 #include <linux/xattr.h>
41 #include <linux/posix_acl.h>
42 #include <net/9p/9p.h>
43 #include <net/9p/client.h>
44
45 #include "v9fs.h"
46 #include "v9fs_vfs.h"
47 #include "fid.h"
48 #include "cache.h"
49 #include "xattr.h"
50 #include "acl.h"
51
52 static const struct inode_operations v9fs_dir_inode_operations;
53 static const struct inode_operations v9fs_dir_inode_operations_dotu;
54 static const struct inode_operations v9fs_file_inode_operations;
55 static const struct inode_operations v9fs_symlink_inode_operations;
56
57 /**
58  * unixmode2p9mode - convert unix mode bits to plan 9
59  * @v9ses: v9fs session information
60  * @mode: mode to convert
61  *
62  */
63
64 static u32 unixmode2p9mode(struct v9fs_session_info *v9ses, umode_t mode)
65 {
66         int res;
67         res = mode & 0777;
68         if (S_ISDIR(mode))
69                 res |= P9_DMDIR;
70         if (v9fs_proto_dotu(v9ses)) {
71                 if (v9ses->nodev == 0) {
72                         if (S_ISSOCK(mode))
73                                 res |= P9_DMSOCKET;
74                         if (S_ISFIFO(mode))
75                                 res |= P9_DMNAMEDPIPE;
76                         if (S_ISBLK(mode))
77                                 res |= P9_DMDEVICE;
78                         if (S_ISCHR(mode))
79                                 res |= P9_DMDEVICE;
80                 }
81
82                 if ((mode & S_ISUID) == S_ISUID)
83                         res |= P9_DMSETUID;
84                 if ((mode & S_ISGID) == S_ISGID)
85                         res |= P9_DMSETGID;
86                 if ((mode & S_ISVTX) == S_ISVTX)
87                         res |= P9_DMSETVTX;
88         }
89         return res;
90 }
91
92 /**
93  * p9mode2perm- convert plan9 mode bits to unix permission bits
94  * @v9ses: v9fs session information
95  * @stat: p9_wstat from which mode need to be derived
96  *
97  */
98 static int p9mode2perm(struct v9fs_session_info *v9ses,
99                        struct p9_wstat *stat)
100 {
101         int res;
102         int mode = stat->mode;
103
104         res = mode & S_IALLUGO;
105         if (v9fs_proto_dotu(v9ses)) {
106                 if ((mode & P9_DMSETUID) == P9_DMSETUID)
107                         res |= S_ISUID;
108
109                 if ((mode & P9_DMSETGID) == P9_DMSETGID)
110                         res |= S_ISGID;
111
112                 if ((mode & P9_DMSETVTX) == P9_DMSETVTX)
113                         res |= S_ISVTX;
114         }
115         return res;
116 }
117
118 /**
119  * p9mode2unixmode- convert plan9 mode bits to unix mode bits
120  * @v9ses: v9fs session information
121  * @stat: p9_wstat from which mode need to be derived
122  * @rdev: major number, minor number in case of device files.
123  *
124  */
125 static umode_t p9mode2unixmode(struct v9fs_session_info *v9ses,
126                                struct p9_wstat *stat, dev_t *rdev)
127 {
128         int res;
129         u32 mode = stat->mode;
130
131         *rdev = 0;
132         res = p9mode2perm(v9ses, stat);
133
134         if ((mode & P9_DMDIR) == P9_DMDIR)
135                 res |= S_IFDIR;
136         else if ((mode & P9_DMSYMLINK) && (v9fs_proto_dotu(v9ses)))
137                 res |= S_IFLNK;
138         else if ((mode & P9_DMSOCKET) && (v9fs_proto_dotu(v9ses))
139                  && (v9ses->nodev == 0))
140                 res |= S_IFSOCK;
141         else if ((mode & P9_DMNAMEDPIPE) && (v9fs_proto_dotu(v9ses))
142                  && (v9ses->nodev == 0))
143                 res |= S_IFIFO;
144         else if ((mode & P9_DMDEVICE) && (v9fs_proto_dotu(v9ses))
145                  && (v9ses->nodev == 0)) {
146                 char type = 0, ext[32];
147                 int major = -1, minor = -1;
148
149                 strlcpy(ext, stat->extension, sizeof(ext));
150                 sscanf(ext, "%c %i %i", &type, &major, &minor);
151                 switch (type) {
152                 case 'c':
153                         res |= S_IFCHR;
154                         break;
155                 case 'b':
156                         res |= S_IFBLK;
157                         break;
158                 default:
159                         p9_debug(P9_DEBUG_ERROR, "Unknown special type %c %s\n",
160                                  type, stat->extension);
161                 };
162                 *rdev = MKDEV(major, minor);
163         } else
164                 res |= S_IFREG;
165
166         return res;
167 }
168
169 /**
170  * v9fs_uflags2omode- convert posix open flags to plan 9 mode bits
171  * @uflags: flags to convert
172  * @extended: if .u extensions are active
173  */
174
175 int v9fs_uflags2omode(int uflags, int extended)
176 {
177         int ret;
178
179         ret = 0;
180         switch (uflags&3) {
181         default:
182         case O_RDONLY:
183                 ret = P9_OREAD;
184                 break;
185
186         case O_WRONLY:
187                 ret = P9_OWRITE;
188                 break;
189
190         case O_RDWR:
191                 ret = P9_ORDWR;
192                 break;
193         }
194
195         if (extended) {
196                 if (uflags & O_EXCL)
197                         ret |= P9_OEXCL;
198
199                 if (uflags & O_APPEND)
200                         ret |= P9_OAPPEND;
201         }
202
203         return ret;
204 }
205
206 /**
207  * v9fs_blank_wstat - helper function to setup a 9P stat structure
208  * @wstat: structure to initialize
209  *
210  */
211
212 void
213 v9fs_blank_wstat(struct p9_wstat *wstat)
214 {
215         wstat->type = ~0;
216         wstat->dev = ~0;
217         wstat->qid.type = ~0;
218         wstat->qid.version = ~0;
219         *((long long *)&wstat->qid.path) = ~0;
220         wstat->mode = ~0;
221         wstat->atime = ~0;
222         wstat->mtime = ~0;
223         wstat->length = ~0;
224         wstat->name = NULL;
225         wstat->uid = NULL;
226         wstat->gid = NULL;
227         wstat->muid = NULL;
228         wstat->n_uid = INVALID_UID;
229         wstat->n_gid = INVALID_GID;
230         wstat->n_muid = INVALID_UID;
231         wstat->extension = NULL;
232 }
233
234 /**
235  * v9fs_alloc_inode - helper function to allocate an inode
236  *
237  */
238 struct inode *v9fs_alloc_inode(struct super_block *sb)
239 {
240         struct v9fs_inode *v9inode;
241         v9inode = (struct v9fs_inode *)kmem_cache_alloc(v9fs_inode_cache,
242                                                         GFP_KERNEL);
243         if (!v9inode)
244                 return NULL;
245 #ifdef CONFIG_9P_FSCACHE
246         v9inode->fscache = NULL;
247         mutex_init(&v9inode->fscache_lock);
248 #endif
249         v9inode->writeback_fid = NULL;
250         v9inode->cache_validity = 0;
251         mutex_init(&v9inode->v_mutex);
252         return &v9inode->vfs_inode;
253 }
254
255 /**
256  * v9fs_free_inode - destroy an inode
257  *
258  */
259
260 void v9fs_free_inode(struct inode *inode)
261 {
262         kmem_cache_free(v9fs_inode_cache, V9FS_I(inode));
263 }
264
265 int v9fs_init_inode(struct v9fs_session_info *v9ses,
266                     struct inode *inode, umode_t mode, dev_t rdev)
267 {
268         int err = 0;
269
270         inode_init_owner(inode, NULL, mode);
271         inode->i_blocks = 0;
272         inode->i_rdev = rdev;
273         inode->i_atime = inode->i_mtime = inode->i_ctime = current_time(inode);
274         inode->i_mapping->a_ops = &v9fs_addr_operations;
275
276         switch (mode & S_IFMT) {
277         case S_IFIFO:
278         case S_IFBLK:
279         case S_IFCHR:
280         case S_IFSOCK:
281                 if (v9fs_proto_dotl(v9ses)) {
282                         inode->i_op = &v9fs_file_inode_operations_dotl;
283                 } else if (v9fs_proto_dotu(v9ses)) {
284                         inode->i_op = &v9fs_file_inode_operations;
285                 } else {
286                         p9_debug(P9_DEBUG_ERROR,
287                                  "special files without extended mode\n");
288                         err = -EINVAL;
289                         goto error;
290                 }
291                 init_special_inode(inode, inode->i_mode, inode->i_rdev);
292                 break;
293         case S_IFREG:
294                 if (v9fs_proto_dotl(v9ses)) {
295                         inode->i_op = &v9fs_file_inode_operations_dotl;
296                         if (v9ses->cache == CACHE_LOOSE ||
297                             v9ses->cache == CACHE_FSCACHE)
298                                 inode->i_fop =
299                                         &v9fs_cached_file_operations_dotl;
300                         else if (v9ses->cache == CACHE_MMAP)
301                                 inode->i_fop = &v9fs_mmap_file_operations_dotl;
302                         else
303                                 inode->i_fop = &v9fs_file_operations_dotl;
304                 } else {
305                         inode->i_op = &v9fs_file_inode_operations;
306                         if (v9ses->cache == CACHE_LOOSE ||
307                             v9ses->cache == CACHE_FSCACHE)
308                                 inode->i_fop =
309                                         &v9fs_cached_file_operations;
310                         else if (v9ses->cache == CACHE_MMAP)
311                                 inode->i_fop = &v9fs_mmap_file_operations;
312                         else
313                                 inode->i_fop = &v9fs_file_operations;
314                 }
315
316                 break;
317         case S_IFLNK:
318                 if (!v9fs_proto_dotu(v9ses) && !v9fs_proto_dotl(v9ses)) {
319                         p9_debug(P9_DEBUG_ERROR,
320                                  "extended modes used with legacy protocol\n");
321                         err = -EINVAL;
322                         goto error;
323                 }
324
325                 if (v9fs_proto_dotl(v9ses))
326                         inode->i_op = &v9fs_symlink_inode_operations_dotl;
327                 else
328                         inode->i_op = &v9fs_symlink_inode_operations;
329
330                 break;
331         case S_IFDIR:
332                 inc_nlink(inode);
333                 if (v9fs_proto_dotl(v9ses))
334                         inode->i_op = &v9fs_dir_inode_operations_dotl;
335                 else if (v9fs_proto_dotu(v9ses))
336                         inode->i_op = &v9fs_dir_inode_operations_dotu;
337                 else
338                         inode->i_op = &v9fs_dir_inode_operations;
339
340                 if (v9fs_proto_dotl(v9ses))
341                         inode->i_fop = &v9fs_dir_operations_dotl;
342                 else
343                         inode->i_fop = &v9fs_dir_operations;
344
345                 break;
346         default:
347                 p9_debug(P9_DEBUG_ERROR, "BAD mode 0x%hx S_IFMT 0x%x\n",
348                          mode, mode & S_IFMT);
349                 err = -EINVAL;
350                 goto error;
351         }
352 error:
353         return err;
354
355 }
356
357 /**
358  * v9fs_get_inode - helper function to setup an inode
359  * @sb: superblock
360  * @mode: mode to setup inode with
361  *
362  */
363
364 struct inode *v9fs_get_inode(struct super_block *sb, umode_t mode, dev_t rdev)
365 {
366         int err;
367         struct inode *inode;
368         struct v9fs_session_info *v9ses = sb->s_fs_info;
369
370         p9_debug(P9_DEBUG_VFS, "super block: %p mode: %ho\n", sb, mode);
371
372         inode = new_inode(sb);
373         if (!inode) {
374                 pr_warn("%s (%d): Problem allocating inode\n",
375                         __func__, task_pid_nr(current));
376                 return ERR_PTR(-ENOMEM);
377         }
378         err = v9fs_init_inode(v9ses, inode, mode, rdev);
379         if (err) {
380                 iput(inode);
381                 return ERR_PTR(err);
382         }
383         return inode;
384 }
385
386 /*
387 static struct v9fs_fid*
388 v9fs_clone_walk(struct v9fs_session_info *v9ses, u32 fid, struct dentry *dentry)
389 {
390         int err;
391         int nfid;
392         struct v9fs_fid *ret;
393         struct v9fs_fcall *fcall;
394
395         nfid = v9fs_get_idpool(&v9ses->fidpool);
396         if (nfid < 0) {
397                 eprintk(KERN_WARNING, "no free fids available\n");
398                 return ERR_PTR(-ENOSPC);
399         }
400
401         err = v9fs_t_walk(v9ses, fid, nfid, (char *) dentry->d_name.name,
402                 &fcall);
403
404         if (err < 0) {
405                 if (fcall && fcall->id == RWALK)
406                         goto clunk_fid;
407
408                 PRINT_FCALL_ERROR("walk error", fcall);
409                 v9fs_put_idpool(nfid, &v9ses->fidpool);
410                 goto error;
411         }
412
413         kfree(fcall);
414         fcall = NULL;
415         ret = v9fs_fid_create(v9ses, nfid);
416         if (!ret) {
417                 err = -ENOMEM;
418                 goto clunk_fid;
419         }
420
421         err = v9fs_fid_insert(ret, dentry);
422         if (err < 0) {
423                 v9fs_fid_destroy(ret);
424                 goto clunk_fid;
425         }
426
427         return ret;
428
429 clunk_fid:
430         v9fs_t_clunk(v9ses, nfid);
431
432 error:
433         kfree(fcall);
434         return ERR_PTR(err);
435 }
436 */
437
438
439 /**
440  * v9fs_clear_inode - release an inode
441  * @inode: inode to release
442  *
443  */
444 void v9fs_evict_inode(struct inode *inode)
445 {
446         struct v9fs_inode *v9inode = V9FS_I(inode);
447
448         truncate_inode_pages_final(&inode->i_data);
449         clear_inode(inode);
450         filemap_fdatawrite(&inode->i_data);
451
452         v9fs_cache_inode_put_cookie(inode);
453         /* clunk the fid stashed in writeback_fid */
454         if (v9inode->writeback_fid) {
455                 p9_client_clunk(v9inode->writeback_fid);
456                 v9inode->writeback_fid = NULL;
457         }
458 }
459
460 static int v9fs_test_inode(struct inode *inode, void *data)
461 {
462         int umode;
463         dev_t rdev;
464         struct v9fs_inode *v9inode = V9FS_I(inode);
465         struct p9_wstat *st = (struct p9_wstat *)data;
466         struct v9fs_session_info *v9ses = v9fs_inode2v9ses(inode);
467
468         umode = p9mode2unixmode(v9ses, st, &rdev);
469         /* don't match inode of different type */
470         if ((inode->i_mode & S_IFMT) != (umode & S_IFMT))
471                 return 0;
472
473         /* compare qid details */
474         if (memcmp(&v9inode->qid.version,
475                    &st->qid.version, sizeof(v9inode->qid.version)))
476                 return 0;
477
478         if (v9inode->qid.type != st->qid.type)
479                 return 0;
480
481         if (v9inode->qid.path != st->qid.path)
482                 return 0;
483         return 1;
484 }
485
486 static int v9fs_test_new_inode(struct inode *inode, void *data)
487 {
488         return 0;
489 }
490
491 static int v9fs_set_inode(struct inode *inode,  void *data)
492 {
493         struct v9fs_inode *v9inode = V9FS_I(inode);
494         struct p9_wstat *st = (struct p9_wstat *)data;
495
496         memcpy(&v9inode->qid, &st->qid, sizeof(st->qid));
497         return 0;
498 }
499
500 static struct inode *v9fs_qid_iget(struct super_block *sb,
501                                    struct p9_qid *qid,
502                                    struct p9_wstat *st,
503                                    int new)
504 {
505         dev_t rdev;
506         int retval;
507         umode_t umode;
508         unsigned long i_ino;
509         struct inode *inode;
510         struct v9fs_session_info *v9ses = sb->s_fs_info;
511         int (*test)(struct inode *, void *);
512
513         if (new)
514                 test = v9fs_test_new_inode;
515         else
516                 test = v9fs_test_inode;
517
518         i_ino = v9fs_qid2ino(qid);
519         inode = iget5_locked(sb, i_ino, test, v9fs_set_inode, st);
520         if (!inode)
521                 return ERR_PTR(-ENOMEM);
522         if (!(inode->i_state & I_NEW))
523                 return inode;
524         /*
525          * initialize the inode with the stat info
526          * FIXME!! we may need support for stale inodes
527          * later.
528          */
529         inode->i_ino = i_ino;
530         umode = p9mode2unixmode(v9ses, st, &rdev);
531         retval = v9fs_init_inode(v9ses, inode, umode, rdev);
532         if (retval)
533                 goto error;
534
535         v9fs_stat2inode(st, inode, sb, 0);
536         v9fs_cache_inode_get_cookie(inode);
537         unlock_new_inode(inode);
538         return inode;
539 error:
540         iget_failed(inode);
541         return ERR_PTR(retval);
542
543 }
544
545 struct inode *
546 v9fs_inode_from_fid(struct v9fs_session_info *v9ses, struct p9_fid *fid,
547                     struct super_block *sb, int new)
548 {
549         struct p9_wstat *st;
550         struct inode *inode = NULL;
551
552         st = p9_client_stat(fid);
553         if (IS_ERR(st))
554                 return ERR_CAST(st);
555
556         inode = v9fs_qid_iget(sb, &st->qid, st, new);
557         p9stat_free(st);
558         kfree(st);
559         return inode;
560 }
561
562 /**
563  * v9fs_at_to_dotl_flags- convert Linux specific AT flags to
564  * plan 9 AT flag.
565  * @flags: flags to convert
566  */
567 static int v9fs_at_to_dotl_flags(int flags)
568 {
569         int rflags = 0;
570         if (flags & AT_REMOVEDIR)
571                 rflags |= P9_DOTL_AT_REMOVEDIR;
572         return rflags;
573 }
574
575 /**
576  * v9fs_dec_count - helper functon to drop i_nlink.
577  *
578  * If a directory had nlink <= 2 (including . and ..), then we should not drop
579  * the link count, which indicates the underlying exported fs doesn't maintain
580  * nlink accurately. e.g.
581  * - overlayfs sets nlink to 1 for merged dir
582  * - ext4 (with dir_nlink feature enabled) sets nlink to 1 if a dir has more
583  *   than EXT4_LINK_MAX (65000) links.
584  *
585  * @inode: inode whose nlink is being dropped
586  */
587 static void v9fs_dec_count(struct inode *inode)
588 {
589         if (!S_ISDIR(inode->i_mode) || inode->i_nlink > 2)
590                 drop_nlink(inode);
591 }
592
593 /**
594  * v9fs_remove - helper function to remove files and directories
595  * @dir: directory inode that is being deleted
596  * @dentry:  dentry that is being deleted
597  * @flags: removing a directory
598  *
599  */
600
601 static int v9fs_remove(struct inode *dir, struct dentry *dentry, int flags)
602 {
603         struct inode *inode;
604         int retval = -EOPNOTSUPP;
605         struct p9_fid *v9fid, *dfid;
606         struct v9fs_session_info *v9ses;
607
608         p9_debug(P9_DEBUG_VFS, "inode: %p dentry: %p rmdir: %x\n",
609                  dir, dentry, flags);
610
611         v9ses = v9fs_inode2v9ses(dir);
612         inode = d_inode(dentry);
613         dfid = v9fs_parent_fid(dentry);
614         if (IS_ERR(dfid)) {
615                 retval = PTR_ERR(dfid);
616                 p9_debug(P9_DEBUG_VFS, "fid lookup failed %d\n", retval);
617                 return retval;
618         }
619         if (v9fs_proto_dotl(v9ses))
620                 retval = p9_client_unlinkat(dfid, dentry->d_name.name,
621                                             v9fs_at_to_dotl_flags(flags));
622         if (retval == -EOPNOTSUPP) {
623                 /* Try the one based on path */
624                 v9fid = v9fs_fid_clone(dentry);
625                 if (IS_ERR(v9fid))
626                         return PTR_ERR(v9fid);
627                 retval = p9_client_remove(v9fid);
628         }
629         if (!retval) {
630                 /*
631                  * directories on unlink should have zero
632                  * link count
633                  */
634                 if (flags & AT_REMOVEDIR) {
635                         clear_nlink(inode);
636                         v9fs_dec_count(dir);
637                 } else
638                         v9fs_dec_count(inode);
639
640                 v9fs_invalidate_inode_attr(inode);
641                 v9fs_invalidate_inode_attr(dir);
642         }
643         return retval;
644 }
645
646 /**
647  * v9fs_create - Create a file
648  * @v9ses: session information
649  * @dir: directory that dentry is being created in
650  * @dentry:  dentry that is being created
651  * @extension: 9p2000.u extension string to support devices, etc.
652  * @perm: create permissions
653  * @mode: open mode
654  *
655  */
656 static struct p9_fid *
657 v9fs_create(struct v9fs_session_info *v9ses, struct inode *dir,
658                 struct dentry *dentry, char *extension, u32 perm, u8 mode)
659 {
660         int err;
661         const unsigned char *name;
662         struct p9_fid *dfid, *ofid, *fid;
663         struct inode *inode;
664
665         p9_debug(P9_DEBUG_VFS, "name %pd\n", dentry);
666
667         err = 0;
668         ofid = NULL;
669         fid = NULL;
670         name = dentry->d_name.name;
671         dfid = v9fs_parent_fid(dentry);
672         if (IS_ERR(dfid)) {
673                 err = PTR_ERR(dfid);
674                 p9_debug(P9_DEBUG_VFS, "fid lookup failed %d\n", err);
675                 return ERR_PTR(err);
676         }
677
678         /* clone a fid to use for creation */
679         ofid = clone_fid(dfid);
680         if (IS_ERR(ofid)) {
681                 err = PTR_ERR(ofid);
682                 p9_debug(P9_DEBUG_VFS, "p9_client_walk failed %d\n", err);
683                 return ERR_PTR(err);
684         }
685
686         err = p9_client_fcreate(ofid, name, perm, mode, extension);
687         if (err < 0) {
688                 p9_debug(P9_DEBUG_VFS, "p9_client_fcreate failed %d\n", err);
689                 goto error;
690         }
691
692         if (!(perm & P9_DMLINK)) {
693                 /* now walk from the parent so we can get unopened fid */
694                 fid = p9_client_walk(dfid, 1, &name, 1);
695                 if (IS_ERR(fid)) {
696                         err = PTR_ERR(fid);
697                         p9_debug(P9_DEBUG_VFS,
698                                    "p9_client_walk failed %d\n", err);
699                         fid = NULL;
700                         goto error;
701                 }
702                 /*
703                  * instantiate inode and assign the unopened fid to the dentry
704                  */
705                 inode = v9fs_get_new_inode_from_fid(v9ses, fid, dir->i_sb);
706                 if (IS_ERR(inode)) {
707                         err = PTR_ERR(inode);
708                         p9_debug(P9_DEBUG_VFS,
709                                    "inode creation failed %d\n", err);
710                         goto error;
711                 }
712                 v9fs_fid_add(dentry, fid);
713                 d_instantiate(dentry, inode);
714         }
715         return ofid;
716 error:
717         if (ofid)
718                 p9_client_clunk(ofid);
719
720         if (fid)
721                 p9_client_clunk(fid);
722
723         return ERR_PTR(err);
724 }
725
726 /**
727  * v9fs_vfs_create - VFS hook to create a regular file
728  *
729  * open(.., O_CREAT) is handled in v9fs_vfs_atomic_open().  This is only called
730  * for mknod(2).
731  *
732  * @dir: directory inode that is being created
733  * @dentry:  dentry that is being deleted
734  * @mode: create permissions
735  *
736  */
737
738 static int
739 v9fs_vfs_create(struct inode *dir, struct dentry *dentry, umode_t mode,
740                 bool excl)
741 {
742         struct v9fs_session_info *v9ses = v9fs_inode2v9ses(dir);
743         u32 perm = unixmode2p9mode(v9ses, mode);
744         struct p9_fid *fid;
745
746         /* P9_OEXCL? */
747         fid = v9fs_create(v9ses, dir, dentry, NULL, perm, P9_ORDWR);
748         if (IS_ERR(fid))
749                 return PTR_ERR(fid);
750
751         v9fs_invalidate_inode_attr(dir);
752         p9_client_clunk(fid);
753
754         return 0;
755 }
756
757 /**
758  * v9fs_vfs_mkdir - VFS mkdir hook to create a directory
759  * @dir:  inode that is being unlinked
760  * @dentry: dentry that is being unlinked
761  * @mode: mode for new directory
762  *
763  */
764
765 static int v9fs_vfs_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode)
766 {
767         int err;
768         u32 perm;
769         struct p9_fid *fid;
770         struct v9fs_session_info *v9ses;
771
772         p9_debug(P9_DEBUG_VFS, "name %pd\n", dentry);
773         err = 0;
774         v9ses = v9fs_inode2v9ses(dir);
775         perm = unixmode2p9mode(v9ses, mode | S_IFDIR);
776         fid = v9fs_create(v9ses, dir, dentry, NULL, perm, P9_OREAD);
777         if (IS_ERR(fid)) {
778                 err = PTR_ERR(fid);
779                 fid = NULL;
780         } else {
781                 inc_nlink(dir);
782                 v9fs_invalidate_inode_attr(dir);
783         }
784
785         if (fid)
786                 p9_client_clunk(fid);
787
788         return err;
789 }
790
791 /**
792  * v9fs_vfs_lookup - VFS lookup hook to "walk" to a new inode
793  * @dir:  inode that is being walked from
794  * @dentry: dentry that is being walked to?
795  * @flags: lookup flags (unused)
796  *
797  */
798
799 struct dentry *v9fs_vfs_lookup(struct inode *dir, struct dentry *dentry,
800                                       unsigned int flags)
801 {
802         struct dentry *res;
803         struct v9fs_session_info *v9ses;
804         struct p9_fid *dfid, *fid;
805         struct inode *inode;
806         const unsigned char *name;
807
808         p9_debug(P9_DEBUG_VFS, "dir: %p dentry: (%pd) %p flags: %x\n",
809                  dir, dentry, dentry, flags);
810
811         if (dentry->d_name.len > NAME_MAX)
812                 return ERR_PTR(-ENAMETOOLONG);
813
814         v9ses = v9fs_inode2v9ses(dir);
815         /* We can walk d_parent because we hold the dir->i_mutex */
816         dfid = v9fs_parent_fid(dentry);
817         if (IS_ERR(dfid))
818                 return ERR_CAST(dfid);
819
820         /*
821          * Make sure we don't use a wrong inode due to parallel
822          * unlink. For cached mode create calls request for new
823          * inode. But with cache disabled, lookup should do this.
824          */
825         name = dentry->d_name.name;
826         fid = p9_client_walk(dfid, 1, &name, 1);
827         if (fid == ERR_PTR(-ENOENT))
828                 inode = NULL;
829         else if (IS_ERR(fid))
830                 inode = ERR_CAST(fid);
831         else if (v9ses->cache == CACHE_LOOSE || v9ses->cache == CACHE_FSCACHE)
832                 inode = v9fs_get_inode_from_fid(v9ses, fid, dir->i_sb);
833         else
834                 inode = v9fs_get_new_inode_from_fid(v9ses, fid, dir->i_sb);
835         /*
836          * If we had a rename on the server and a parallel lookup
837          * for the new name, then make sure we instantiate with
838          * the new name. ie look up for a/b, while on server somebody
839          * moved b under k and client parallely did a lookup for
840          * k/b.
841          */
842         res = d_splice_alias(inode, dentry);
843         if (!IS_ERR(fid)) {
844                 if (!res)
845                         v9fs_fid_add(dentry, fid);
846                 else if (!IS_ERR(res))
847                         v9fs_fid_add(res, fid);
848                 else
849                         p9_client_clunk(fid);
850         }
851         return res;
852 }
853
854 static int
855 v9fs_vfs_atomic_open(struct inode *dir, struct dentry *dentry,
856                      struct file *file, unsigned flags, umode_t mode)
857 {
858         int err;
859         u32 perm;
860         struct v9fs_inode *v9inode;
861         struct v9fs_session_info *v9ses;
862         struct p9_fid *fid, *inode_fid;
863         struct dentry *res = NULL;
864
865         if (d_in_lookup(dentry)) {
866                 res = v9fs_vfs_lookup(dir, dentry, 0);
867                 if (IS_ERR(res))
868                         return PTR_ERR(res);
869
870                 if (res)
871                         dentry = res;
872         }
873
874         /* Only creates */
875         if (!(flags & O_CREAT) || d_really_is_positive(dentry))
876                 return finish_no_open(file, res);
877
878         err = 0;
879
880         v9ses = v9fs_inode2v9ses(dir);
881         perm = unixmode2p9mode(v9ses, mode);
882         fid = v9fs_create(v9ses, dir, dentry, NULL, perm,
883                                 v9fs_uflags2omode(flags,
884                                                 v9fs_proto_dotu(v9ses)));
885         if (IS_ERR(fid)) {
886                 err = PTR_ERR(fid);
887                 fid = NULL;
888                 goto error;
889         }
890
891         v9fs_invalidate_inode_attr(dir);
892         v9inode = V9FS_I(d_inode(dentry));
893         mutex_lock(&v9inode->v_mutex);
894         if ((v9ses->cache == CACHE_LOOSE || v9ses->cache == CACHE_FSCACHE) &&
895             !v9inode->writeback_fid &&
896             ((flags & O_ACCMODE) != O_RDONLY)) {
897                 /*
898                  * clone a fid and add it to writeback_fid
899                  * we do it during open time instead of
900                  * page dirty time via write_begin/page_mkwrite
901                  * because we want write after unlink usecase
902                  * to work.
903                  */
904                 inode_fid = v9fs_writeback_fid(dentry);
905                 if (IS_ERR(inode_fid)) {
906                         err = PTR_ERR(inode_fid);
907                         mutex_unlock(&v9inode->v_mutex);
908                         goto error;
909                 }
910                 v9inode->writeback_fid = (void *) inode_fid;
911         }
912         mutex_unlock(&v9inode->v_mutex);
913         err = finish_open(file, dentry, generic_file_open);
914         if (err)
915                 goto error;
916
917         file->private_data = fid;
918         if (v9ses->cache == CACHE_LOOSE || v9ses->cache == CACHE_FSCACHE)
919                 v9fs_cache_inode_set_cookie(d_inode(dentry), file);
920
921         file->f_mode |= FMODE_CREATED;
922 out:
923         dput(res);
924         return err;
925
926 error:
927         if (fid)
928                 p9_client_clunk(fid);
929         goto out;
930 }
931
932 /**
933  * v9fs_vfs_unlink - VFS unlink hook to delete an inode
934  * @i:  inode that is being unlinked
935  * @d: dentry that is being unlinked
936  *
937  */
938
939 int v9fs_vfs_unlink(struct inode *i, struct dentry *d)
940 {
941         return v9fs_remove(i, d, 0);
942 }
943
944 /**
945  * v9fs_vfs_rmdir - VFS unlink hook to delete a directory
946  * @i:  inode that is being unlinked
947  * @d: dentry that is being unlinked
948  *
949  */
950
951 int v9fs_vfs_rmdir(struct inode *i, struct dentry *d)
952 {
953         return v9fs_remove(i, d, AT_REMOVEDIR);
954 }
955
956 /**
957  * v9fs_vfs_rename - VFS hook to rename an inode
958  * @old_dir:  old dir inode
959  * @old_dentry: old dentry
960  * @new_dir: new dir inode
961  * @new_dentry: new dentry
962  *
963  */
964
965 int
966 v9fs_vfs_rename(struct inode *old_dir, struct dentry *old_dentry,
967                 struct inode *new_dir, struct dentry *new_dentry,
968                 unsigned int flags)
969 {
970         int retval;
971         struct inode *old_inode;
972         struct inode *new_inode;
973         struct v9fs_session_info *v9ses;
974         struct p9_fid *oldfid;
975         struct p9_fid *olddirfid;
976         struct p9_fid *newdirfid;
977         struct p9_wstat wstat;
978
979         if (flags)
980                 return -EINVAL;
981
982         p9_debug(P9_DEBUG_VFS, "\n");
983         retval = 0;
984         old_inode = d_inode(old_dentry);
985         new_inode = d_inode(new_dentry);
986         v9ses = v9fs_inode2v9ses(old_inode);
987         oldfid = v9fs_fid_lookup(old_dentry);
988         if (IS_ERR(oldfid))
989                 return PTR_ERR(oldfid);
990
991         olddirfid = clone_fid(v9fs_parent_fid(old_dentry));
992         if (IS_ERR(olddirfid)) {
993                 retval = PTR_ERR(olddirfid);
994                 goto done;
995         }
996
997         newdirfid = clone_fid(v9fs_parent_fid(new_dentry));
998         if (IS_ERR(newdirfid)) {
999                 retval = PTR_ERR(newdirfid);
1000                 goto clunk_olddir;
1001         }
1002
1003         down_write(&v9ses->rename_sem);
1004         if (v9fs_proto_dotl(v9ses)) {
1005                 retval = p9_client_renameat(olddirfid, old_dentry->d_name.name,
1006                                             newdirfid, new_dentry->d_name.name);
1007                 if (retval == -EOPNOTSUPP)
1008                         retval = p9_client_rename(oldfid, newdirfid,
1009                                                   new_dentry->d_name.name);
1010                 if (retval != -EOPNOTSUPP)
1011                         goto clunk_newdir;
1012         }
1013         if (old_dentry->d_parent != new_dentry->d_parent) {
1014                 /*
1015                  * 9P .u can only handle file rename in the same directory
1016                  */
1017
1018                 p9_debug(P9_DEBUG_ERROR, "old dir and new dir are different\n");
1019                 retval = -EXDEV;
1020                 goto clunk_newdir;
1021         }
1022         v9fs_blank_wstat(&wstat);
1023         wstat.muid = v9ses->uname;
1024         wstat.name = new_dentry->d_name.name;
1025         retval = p9_client_wstat(oldfid, &wstat);
1026
1027 clunk_newdir:
1028         if (!retval) {
1029                 if (new_inode) {
1030                         if (S_ISDIR(new_inode->i_mode))
1031                                 clear_nlink(new_inode);
1032                         else
1033                                 v9fs_dec_count(new_inode);
1034                 }
1035                 if (S_ISDIR(old_inode->i_mode)) {
1036                         if (!new_inode)
1037                                 inc_nlink(new_dir);
1038                         v9fs_dec_count(old_dir);
1039                 }
1040                 v9fs_invalidate_inode_attr(old_inode);
1041                 v9fs_invalidate_inode_attr(old_dir);
1042                 v9fs_invalidate_inode_attr(new_dir);
1043
1044                 /* successful rename */
1045                 d_move(old_dentry, new_dentry);
1046         }
1047         up_write(&v9ses->rename_sem);
1048         p9_client_clunk(newdirfid);
1049
1050 clunk_olddir:
1051         p9_client_clunk(olddirfid);
1052
1053 done:
1054         return retval;
1055 }
1056
1057 /**
1058  * v9fs_vfs_getattr - retrieve file metadata
1059  * @path: Object to query
1060  * @stat: metadata structure to populate
1061  * @request_mask: Mask of STATX_xxx flags indicating the caller's interests
1062  * @flags: AT_STATX_xxx setting
1063  *
1064  */
1065
1066 static int
1067 v9fs_vfs_getattr(const struct path *path, struct kstat *stat,
1068                  u32 request_mask, unsigned int flags)
1069 {
1070         struct dentry *dentry = path->dentry;
1071         struct v9fs_session_info *v9ses;
1072         struct p9_fid *fid;
1073         struct p9_wstat *st;
1074
1075         p9_debug(P9_DEBUG_VFS, "dentry: %p\n", dentry);
1076         v9ses = v9fs_dentry2v9ses(dentry);
1077         if (v9ses->cache == CACHE_LOOSE || v9ses->cache == CACHE_FSCACHE) {
1078                 generic_fillattr(d_inode(dentry), stat);
1079                 return 0;
1080         }
1081         fid = v9fs_fid_lookup(dentry);
1082         if (IS_ERR(fid))
1083                 return PTR_ERR(fid);
1084
1085         st = p9_client_stat(fid);
1086         if (IS_ERR(st))
1087                 return PTR_ERR(st);
1088
1089         v9fs_stat2inode(st, d_inode(dentry), dentry->d_sb, 0);
1090         generic_fillattr(d_inode(dentry), stat);
1091
1092         p9stat_free(st);
1093         kfree(st);
1094         return 0;
1095 }
1096
1097 /**
1098  * v9fs_vfs_setattr - set file metadata
1099  * @dentry: file whose metadata to set
1100  * @iattr: metadata assignment structure
1101  *
1102  */
1103
1104 static int v9fs_vfs_setattr(struct dentry *dentry, struct iattr *iattr)
1105 {
1106         int retval;
1107         struct v9fs_session_info *v9ses;
1108         struct p9_fid *fid;
1109         struct p9_wstat wstat;
1110
1111         p9_debug(P9_DEBUG_VFS, "\n");
1112         retval = setattr_prepare(dentry, iattr);
1113         if (retval)
1114                 return retval;
1115
1116         retval = -EPERM;
1117         v9ses = v9fs_dentry2v9ses(dentry);
1118         fid = v9fs_fid_lookup(dentry);
1119         if(IS_ERR(fid))
1120                 return PTR_ERR(fid);
1121
1122         v9fs_blank_wstat(&wstat);
1123         if (iattr->ia_valid & ATTR_MODE)
1124                 wstat.mode = unixmode2p9mode(v9ses, iattr->ia_mode);
1125
1126         if (iattr->ia_valid & ATTR_MTIME)
1127                 wstat.mtime = iattr->ia_mtime.tv_sec;
1128
1129         if (iattr->ia_valid & ATTR_ATIME)
1130                 wstat.atime = iattr->ia_atime.tv_sec;
1131
1132         if (iattr->ia_valid & ATTR_SIZE)
1133                 wstat.length = iattr->ia_size;
1134
1135         if (v9fs_proto_dotu(v9ses)) {
1136                 if (iattr->ia_valid & ATTR_UID)
1137                         wstat.n_uid = iattr->ia_uid;
1138
1139                 if (iattr->ia_valid & ATTR_GID)
1140                         wstat.n_gid = iattr->ia_gid;
1141         }
1142
1143         /* Write all dirty data */
1144         if (d_is_reg(dentry))
1145                 filemap_write_and_wait(d_inode(dentry)->i_mapping);
1146
1147         retval = p9_client_wstat(fid, &wstat);
1148         if (retval < 0)
1149                 return retval;
1150
1151         if ((iattr->ia_valid & ATTR_SIZE) &&
1152             iattr->ia_size != i_size_read(d_inode(dentry)))
1153                 truncate_setsize(d_inode(dentry), iattr->ia_size);
1154
1155         v9fs_invalidate_inode_attr(d_inode(dentry));
1156
1157         setattr_copy(d_inode(dentry), iattr);
1158         mark_inode_dirty(d_inode(dentry));
1159         return 0;
1160 }
1161
1162 /**
1163  * v9fs_stat2inode - populate an inode structure with mistat info
1164  * @stat: Plan 9 metadata (mistat) structure
1165  * @inode: inode to populate
1166  * @sb: superblock of filesystem
1167  * @flags: control flags (e.g. V9FS_STAT2INODE_KEEP_ISIZE)
1168  *
1169  */
1170
1171 void
1172 v9fs_stat2inode(struct p9_wstat *stat, struct inode *inode,
1173                  struct super_block *sb, unsigned int flags)
1174 {
1175         umode_t mode;
1176         char ext[32];
1177         char tag_name[14];
1178         unsigned int i_nlink;
1179         struct v9fs_session_info *v9ses = sb->s_fs_info;
1180         struct v9fs_inode *v9inode = V9FS_I(inode);
1181
1182         set_nlink(inode, 1);
1183
1184         inode->i_atime.tv_sec = stat->atime;
1185         inode->i_mtime.tv_sec = stat->mtime;
1186         inode->i_ctime.tv_sec = stat->mtime;
1187
1188         inode->i_uid = v9ses->dfltuid;
1189         inode->i_gid = v9ses->dfltgid;
1190
1191         if (v9fs_proto_dotu(v9ses)) {
1192                 inode->i_uid = stat->n_uid;
1193                 inode->i_gid = stat->n_gid;
1194         }
1195         if ((S_ISREG(inode->i_mode)) || (S_ISDIR(inode->i_mode))) {
1196                 if (v9fs_proto_dotu(v9ses) && (stat->extension[0] != '\0')) {
1197                         /*
1198                          * Hadlink support got added later to
1199                          * to the .u extension. So there can be
1200                          * server out there that doesn't support
1201                          * this even with .u extension. So check
1202                          * for non NULL stat->extension
1203                          */
1204                         strlcpy(ext, stat->extension, sizeof(ext));
1205                         /* HARDLINKCOUNT %u */
1206                         sscanf(ext, "%13s %u", tag_name, &i_nlink);
1207                         if (!strncmp(tag_name, "HARDLINKCOUNT", 13))
1208                                 set_nlink(inode, i_nlink);
1209                 }
1210         }
1211         mode = p9mode2perm(v9ses, stat);
1212         mode |= inode->i_mode & ~S_IALLUGO;
1213         inode->i_mode = mode;
1214
1215         if (!(flags & V9FS_STAT2INODE_KEEP_ISIZE))
1216                 v9fs_i_size_write(inode, stat->length);
1217         /* not real number of blocks, but 512 byte ones ... */
1218         inode->i_blocks = (stat->length + 512 - 1) >> 9;
1219         v9inode->cache_validity &= ~V9FS_INO_INVALID_ATTR;
1220 }
1221
1222 /**
1223  * v9fs_qid2ino - convert qid into inode number
1224  * @qid: qid to hash
1225  *
1226  * BUG: potential for inode number collisions?
1227  */
1228
1229 ino_t v9fs_qid2ino(struct p9_qid *qid)
1230 {
1231         u64 path = qid->path + 2;
1232         ino_t i = 0;
1233
1234         if (sizeof(ino_t) == sizeof(path))
1235                 memcpy(&i, &path, sizeof(ino_t));
1236         else
1237                 i = (ino_t) (path ^ (path >> 32));
1238
1239         return i;
1240 }
1241
1242 /**
1243  * v9fs_vfs_get_link - follow a symlink path
1244  * @dentry: dentry for symlink
1245  * @inode: inode for symlink
1246  * @done: delayed call for when we are done with the return value
1247  */
1248
1249 static const char *v9fs_vfs_get_link(struct dentry *dentry,
1250                                      struct inode *inode,
1251                                      struct delayed_call *done)
1252 {
1253         struct v9fs_session_info *v9ses;
1254         struct p9_fid *fid;
1255         struct p9_wstat *st;
1256         char *res;
1257
1258         if (!dentry)
1259                 return ERR_PTR(-ECHILD);
1260
1261         v9ses = v9fs_dentry2v9ses(dentry);
1262         fid = v9fs_fid_lookup(dentry);
1263         p9_debug(P9_DEBUG_VFS, "%pd\n", dentry);
1264
1265         if (IS_ERR(fid))
1266                 return ERR_CAST(fid);
1267
1268         if (!v9fs_proto_dotu(v9ses))
1269                 return ERR_PTR(-EBADF);
1270
1271         st = p9_client_stat(fid);
1272         if (IS_ERR(st))
1273                 return ERR_CAST(st);
1274
1275         if (!(st->mode & P9_DMSYMLINK)) {
1276                 p9stat_free(st);
1277                 kfree(st);
1278                 return ERR_PTR(-EINVAL);
1279         }
1280         res = st->extension;
1281         st->extension = NULL;
1282         if (strlen(res) >= PATH_MAX)
1283                 res[PATH_MAX - 1] = '\0';
1284
1285         p9stat_free(st);
1286         kfree(st);
1287         set_delayed_call(done, kfree_link, res);
1288         return res;
1289 }
1290
1291 /**
1292  * v9fs_vfs_mkspecial - create a special file
1293  * @dir: inode to create special file in
1294  * @dentry: dentry to create
1295  * @perm: mode to create special file
1296  * @extension: 9p2000.u format extension string representing special file
1297  *
1298  */
1299
1300 static int v9fs_vfs_mkspecial(struct inode *dir, struct dentry *dentry,
1301         u32 perm, const char *extension)
1302 {
1303         struct p9_fid *fid;
1304         struct v9fs_session_info *v9ses;
1305
1306         v9ses = v9fs_inode2v9ses(dir);
1307         if (!v9fs_proto_dotu(v9ses)) {
1308                 p9_debug(P9_DEBUG_ERROR, "not extended\n");
1309                 return -EPERM;
1310         }
1311
1312         fid = v9fs_create(v9ses, dir, dentry, (char *) extension, perm,
1313                                                                 P9_OREAD);
1314         if (IS_ERR(fid))
1315                 return PTR_ERR(fid);
1316
1317         v9fs_invalidate_inode_attr(dir);
1318         p9_client_clunk(fid);
1319         return 0;
1320 }
1321
1322 /**
1323  * v9fs_vfs_symlink - helper function to create symlinks
1324  * @dir: directory inode containing symlink
1325  * @dentry: dentry for symlink
1326  * @symname: symlink data
1327  *
1328  * See Also: 9P2000.u RFC for more information
1329  *
1330  */
1331
1332 static int
1333 v9fs_vfs_symlink(struct inode *dir, struct dentry *dentry, const char *symname)
1334 {
1335         p9_debug(P9_DEBUG_VFS, " %lu,%pd,%s\n",
1336                  dir->i_ino, dentry, symname);
1337
1338         return v9fs_vfs_mkspecial(dir, dentry, P9_DMSYMLINK, symname);
1339 }
1340
1341 #define U32_MAX_DIGITS 10
1342
1343 /**
1344  * v9fs_vfs_link - create a hardlink
1345  * @old_dentry: dentry for file to link to
1346  * @dir: inode destination for new link
1347  * @dentry: dentry for link
1348  *
1349  */
1350
1351 static int
1352 v9fs_vfs_link(struct dentry *old_dentry, struct inode *dir,
1353               struct dentry *dentry)
1354 {
1355         int retval;
1356         char name[1 + U32_MAX_DIGITS + 2]; /* sign + number + \n + \0 */
1357         struct p9_fid *oldfid;
1358
1359         p9_debug(P9_DEBUG_VFS, " %lu,%pd,%pd\n",
1360                  dir->i_ino, dentry, old_dentry);
1361
1362         oldfid = v9fs_fid_clone(old_dentry);
1363         if (IS_ERR(oldfid))
1364                 return PTR_ERR(oldfid);
1365
1366         sprintf(name, "%d\n", oldfid->fid);
1367         retval = v9fs_vfs_mkspecial(dir, dentry, P9_DMLINK, name);
1368         if (!retval) {
1369                 v9fs_refresh_inode(oldfid, d_inode(old_dentry));
1370                 v9fs_invalidate_inode_attr(dir);
1371         }
1372         p9_client_clunk(oldfid);
1373         return retval;
1374 }
1375
1376 /**
1377  * v9fs_vfs_mknod - create a special file
1378  * @dir: inode destination for new link
1379  * @dentry: dentry for file
1380  * @mode: mode for creation
1381  * @rdev: device associated with special file
1382  *
1383  */
1384
1385 static int
1386 v9fs_vfs_mknod(struct inode *dir, struct dentry *dentry, umode_t mode, dev_t rdev)
1387 {
1388         struct v9fs_session_info *v9ses = v9fs_inode2v9ses(dir);
1389         int retval;
1390         char name[2 + U32_MAX_DIGITS + 1 + U32_MAX_DIGITS + 1];
1391         u32 perm;
1392
1393         p9_debug(P9_DEBUG_VFS, " %lu,%pd mode: %hx MAJOR: %u MINOR: %u\n",
1394                  dir->i_ino, dentry, mode,
1395                  MAJOR(rdev), MINOR(rdev));
1396
1397         /* build extension */
1398         if (S_ISBLK(mode))
1399                 sprintf(name, "b %u %u", MAJOR(rdev), MINOR(rdev));
1400         else if (S_ISCHR(mode))
1401                 sprintf(name, "c %u %u", MAJOR(rdev), MINOR(rdev));
1402         else
1403                 *name = 0;
1404
1405         perm = unixmode2p9mode(v9ses, mode);
1406         retval = v9fs_vfs_mkspecial(dir, dentry, perm, name);
1407
1408         return retval;
1409 }
1410
1411 int v9fs_refresh_inode(struct p9_fid *fid, struct inode *inode)
1412 {
1413         int umode;
1414         dev_t rdev;
1415         struct p9_wstat *st;
1416         struct v9fs_session_info *v9ses;
1417         unsigned int flags;
1418
1419         v9ses = v9fs_inode2v9ses(inode);
1420         st = p9_client_stat(fid);
1421         if (IS_ERR(st))
1422                 return PTR_ERR(st);
1423         /*
1424          * Don't update inode if the file type is different
1425          */
1426         umode = p9mode2unixmode(v9ses, st, &rdev);
1427         if ((inode->i_mode & S_IFMT) != (umode & S_IFMT))
1428                 goto out;
1429
1430         /*
1431          * We don't want to refresh inode->i_size,
1432          * because we may have cached data
1433          */
1434         flags = (v9ses->cache == CACHE_LOOSE || v9ses->cache == CACHE_FSCACHE) ?
1435                 V9FS_STAT2INODE_KEEP_ISIZE : 0;
1436         v9fs_stat2inode(st, inode, inode->i_sb, flags);
1437 out:
1438         p9stat_free(st);
1439         kfree(st);
1440         return 0;
1441 }
1442
1443 static const struct inode_operations v9fs_dir_inode_operations_dotu = {
1444         .create = v9fs_vfs_create,
1445         .lookup = v9fs_vfs_lookup,
1446         .atomic_open = v9fs_vfs_atomic_open,
1447         .symlink = v9fs_vfs_symlink,
1448         .link = v9fs_vfs_link,
1449         .unlink = v9fs_vfs_unlink,
1450         .mkdir = v9fs_vfs_mkdir,
1451         .rmdir = v9fs_vfs_rmdir,
1452         .mknod = v9fs_vfs_mknod,
1453         .rename = v9fs_vfs_rename,
1454         .getattr = v9fs_vfs_getattr,
1455         .setattr = v9fs_vfs_setattr,
1456 };
1457
1458 static const struct inode_operations v9fs_dir_inode_operations = {
1459         .create = v9fs_vfs_create,
1460         .lookup = v9fs_vfs_lookup,
1461         .atomic_open = v9fs_vfs_atomic_open,
1462         .unlink = v9fs_vfs_unlink,
1463         .mkdir = v9fs_vfs_mkdir,
1464         .rmdir = v9fs_vfs_rmdir,
1465         .mknod = v9fs_vfs_mknod,
1466         .rename = v9fs_vfs_rename,
1467         .getattr = v9fs_vfs_getattr,
1468         .setattr = v9fs_vfs_setattr,
1469 };
1470
1471 static const struct inode_operations v9fs_file_inode_operations = {
1472         .getattr = v9fs_vfs_getattr,
1473         .setattr = v9fs_vfs_setattr,
1474 };
1475
1476 static const struct inode_operations v9fs_symlink_inode_operations = {
1477         .get_link = v9fs_vfs_get_link,
1478         .getattr = v9fs_vfs_getattr,
1479         .setattr = v9fs_vfs_setattr,
1480 };
1481