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