xref: /openbmc/linux/fs/coda/dir.c (revision 3996eabb)
1 
2 /*
3  * Directory operations for Coda filesystem
4  * Original version: (C) 1996 P. Braam and M. Callahan
5  * Rewritten for Linux 2.1. (C) 1997 Carnegie Mellon University
6  *
7  * Carnegie Mellon encourages users to contribute improvements to
8  * the Coda project. Contact Peter Braam (coda@cs.cmu.edu).
9  */
10 
11 #include <linux/types.h>
12 #include <linux/kernel.h>
13 #include <linux/time.h>
14 #include <linux/fs.h>
15 #include <linux/slab.h>
16 #include <linux/file.h>
17 #include <linux/stat.h>
18 #include <linux/errno.h>
19 #include <linux/string.h>
20 #include <linux/spinlock.h>
21 #include <linux/namei.h>
22 
23 #include <asm/uaccess.h>
24 
25 #include <linux/coda.h>
26 #include <linux/coda_psdev.h>
27 #include "coda_linux.h"
28 #include "coda_cache.h"
29 
30 #include "coda_int.h"
31 
32 /* dir inode-ops */
33 static int coda_create(struct inode *dir, struct dentry *new, int mode, struct nameidata *nd);
34 static struct dentry *coda_lookup(struct inode *dir, struct dentry *target, struct nameidata *nd);
35 static int coda_link(struct dentry *old_dentry, struct inode *dir_inode,
36 		     struct dentry *entry);
37 static int coda_unlink(struct inode *dir_inode, struct dentry *entry);
38 static int coda_symlink(struct inode *dir_inode, struct dentry *entry,
39 			const char *symname);
40 static int coda_mkdir(struct inode *dir_inode, struct dentry *entry, int mode);
41 static int coda_rmdir(struct inode *dir_inode, struct dentry *entry);
42 static int coda_rename(struct inode *old_inode, struct dentry *old_dentry,
43                        struct inode *new_inode, struct dentry *new_dentry);
44 
45 /* dir file-ops */
46 static int coda_readdir(struct file *file, void *buf, filldir_t filldir);
47 
48 /* dentry ops */
49 static int coda_dentry_revalidate(struct dentry *de, struct nameidata *nd);
50 static int coda_dentry_delete(const struct dentry *);
51 
52 /* support routines */
53 static int coda_venus_readdir(struct file *coda_file, void *buf,
54 			      filldir_t filldir);
55 
56 /* same as fs/bad_inode.c */
57 static int coda_return_EIO(void)
58 {
59 	return -EIO;
60 }
61 #define CODA_EIO_ERROR ((void *) (coda_return_EIO))
62 
63 const struct dentry_operations coda_dentry_operations =
64 {
65 	.d_revalidate	= coda_dentry_revalidate,
66 	.d_delete	= coda_dentry_delete,
67 };
68 
69 const struct inode_operations coda_dir_inode_operations =
70 {
71 	.create		= coda_create,
72 	.lookup		= coda_lookup,
73 	.link		= coda_link,
74 	.unlink		= coda_unlink,
75 	.symlink	= coda_symlink,
76 	.mkdir		= coda_mkdir,
77 	.rmdir		= coda_rmdir,
78 	.mknod		= CODA_EIO_ERROR,
79 	.rename		= coda_rename,
80 	.permission	= coda_permission,
81 	.getattr	= coda_getattr,
82 	.setattr	= coda_setattr,
83 };
84 
85 const struct file_operations coda_dir_operations = {
86 	.llseek		= generic_file_llseek,
87 	.read		= generic_read_dir,
88 	.readdir	= coda_readdir,
89 	.open		= coda_open,
90 	.release	= coda_release,
91 	.fsync		= coda_fsync,
92 };
93 
94 
95 /* inode operations for directories */
96 /* access routines: lookup, readlink, permission */
97 static struct dentry *coda_lookup(struct inode *dir, struct dentry *entry, struct nameidata *nd)
98 {
99 	struct inode *inode = NULL;
100 	struct CodaFid resfid = { { 0, } };
101 	int type = 0;
102 	int error = 0;
103 	const char *name = entry->d_name.name;
104 	size_t length = entry->d_name.len;
105 
106 	if (length > CODA_MAXNAMLEN) {
107 		printk(KERN_ERR "name too long: lookup, %s (%*s)\n",
108 		       coda_i2s(dir), (int)length, name);
109 		return ERR_PTR(-ENAMETOOLONG);
110 	}
111 
112 	/* control object, create inode on the fly */
113 	if (coda_isroot(dir) && coda_iscontrol(name, length)) {
114 		error = coda_cnode_makectl(&inode, dir->i_sb);
115 		type = CODA_NOCACHE;
116 		goto exit;
117 	}
118 
119 	error = venus_lookup(dir->i_sb, coda_i2f(dir), name, length,
120 			     &type, &resfid);
121 	if (!error)
122 		error = coda_cnode_make(&inode, &resfid, dir->i_sb);
123 
124 	if (error && error != -ENOENT)
125 		return ERR_PTR(error);
126 
127 exit:
128 	if (inode && (type & CODA_NOCACHE))
129 		coda_flag_inode(inode, C_VATTR | C_PURGE);
130 
131 	return d_splice_alias(inode, entry);
132 }
133 
134 
135 int coda_permission(struct inode *inode, int mask, unsigned int flags)
136 {
137 	int error;
138 
139 	if (flags & IPERM_FLAG_RCU)
140 		return -ECHILD;
141 
142 	mask &= MAY_READ | MAY_WRITE | MAY_EXEC;
143 
144 	if (!mask)
145 		return 0;
146 
147 	if ((mask & MAY_EXEC) && !execute_ok(inode))
148 		return -EACCES;
149 
150 	if (coda_cache_check(inode, mask))
151 		return 0;
152 
153 	error = venus_access(inode->i_sb, coda_i2f(inode), mask);
154 
155 	if (!error)
156 		coda_cache_enter(inode, mask);
157 
158 	return error;
159 }
160 
161 
162 static inline void coda_dir_update_mtime(struct inode *dir)
163 {
164 #ifdef REQUERY_VENUS_FOR_MTIME
165 	/* invalidate the directory cnode's attributes so we refetch the
166 	 * attributes from venus next time the inode is referenced */
167 	coda_flag_inode(dir, C_VATTR);
168 #else
169 	/* optimistically we can also act as if our nose bleeds. The
170 	 * granularity of the mtime is coarse anyways so we might actually be
171 	 * right most of the time. Note: we only do this for directories. */
172 	dir->i_mtime = dir->i_ctime = CURRENT_TIME_SEC;
173 #endif
174 }
175 
176 /* we have to wrap inc_nlink/drop_nlink because sometimes userspace uses a
177  * trick to fool GNU find's optimizations. If we can't be sure of the link
178  * (because of volume mount points) we set i_nlink to 1 which forces find
179  * to consider every child as a possible directory. We should also never
180  * see an increment or decrement for deleted directories where i_nlink == 0 */
181 static inline void coda_dir_inc_nlink(struct inode *dir)
182 {
183 	if (dir->i_nlink >= 2)
184 		inc_nlink(dir);
185 }
186 
187 static inline void coda_dir_drop_nlink(struct inode *dir)
188 {
189 	if (dir->i_nlink > 2)
190 		drop_nlink(dir);
191 }
192 
193 /* creation routines: create, mknod, mkdir, link, symlink */
194 static int coda_create(struct inode *dir, struct dentry *de, int mode, struct nameidata *nd)
195 {
196 	int error;
197 	const char *name=de->d_name.name;
198 	int length=de->d_name.len;
199 	struct inode *inode;
200 	struct CodaFid newfid;
201 	struct coda_vattr attrs;
202 
203 	if (coda_isroot(dir) && coda_iscontrol(name, length))
204 		return -EPERM;
205 
206 	error = venus_create(dir->i_sb, coda_i2f(dir), name, length,
207 				0, mode, &newfid, &attrs);
208 	if (error)
209 		goto err_out;
210 
211 	inode = coda_iget(dir->i_sb, &newfid, &attrs);
212 	if (IS_ERR(inode)) {
213 		error = PTR_ERR(inode);
214 		goto err_out;
215 	}
216 
217 	/* invalidate the directory cnode's attributes */
218 	coda_dir_update_mtime(dir);
219 	d_instantiate(de, inode);
220 	return 0;
221 err_out:
222 	d_drop(de);
223 	return error;
224 }
225 
226 static int coda_mkdir(struct inode *dir, struct dentry *de, int mode)
227 {
228 	struct inode *inode;
229 	struct coda_vattr attrs;
230 	const char *name = de->d_name.name;
231 	int len = de->d_name.len;
232 	int error;
233 	struct CodaFid newfid;
234 
235 	if (coda_isroot(dir) && coda_iscontrol(name, len))
236 		return -EPERM;
237 
238 	attrs.va_mode = mode;
239 	error = venus_mkdir(dir->i_sb, coda_i2f(dir),
240 			       name, len, &newfid, &attrs);
241 	if (error)
242 		goto err_out;
243 
244 	inode = coda_iget(dir->i_sb, &newfid, &attrs);
245 	if (IS_ERR(inode)) {
246 		error = PTR_ERR(inode);
247 		goto err_out;
248 	}
249 
250 	/* invalidate the directory cnode's attributes */
251 	coda_dir_inc_nlink(dir);
252 	coda_dir_update_mtime(dir);
253 	d_instantiate(de, inode);
254 	return 0;
255 err_out:
256 	d_drop(de);
257 	return error;
258 }
259 
260 /* try to make de an entry in dir_inodde linked to source_de */
261 static int coda_link(struct dentry *source_de, struct inode *dir_inode,
262 	  struct dentry *de)
263 {
264 	struct inode *inode = source_de->d_inode;
265         const char * name = de->d_name.name;
266 	int len = de->d_name.len;
267 	int error;
268 
269 	if (coda_isroot(dir_inode) && coda_iscontrol(name, len))
270 		return -EPERM;
271 
272 	error = venus_link(dir_inode->i_sb, coda_i2f(inode),
273 			   coda_i2f(dir_inode), (const char *)name, len);
274 	if (error) {
275 		d_drop(de);
276 		return error;
277 	}
278 
279 	coda_dir_update_mtime(dir_inode);
280 	ihold(inode);
281 	d_instantiate(de, inode);
282 	inc_nlink(inode);
283 	return 0;
284 }
285 
286 
287 static int coda_symlink(struct inode *dir_inode, struct dentry *de,
288 			const char *symname)
289 {
290 	const char *name = de->d_name.name;
291 	int len = de->d_name.len;
292 	int symlen;
293 	int error;
294 
295 	if (coda_isroot(dir_inode) && coda_iscontrol(name, len))
296 		return -EPERM;
297 
298 	symlen = strlen(symname);
299 	if (symlen > CODA_MAXPATHLEN)
300 		return -ENAMETOOLONG;
301 
302 	/*
303 	 * This entry is now negative. Since we do not create
304 	 * an inode for the entry we have to drop it.
305 	 */
306 	d_drop(de);
307 	error = venus_symlink(dir_inode->i_sb, coda_i2f(dir_inode), name, len,
308 			      symname, symlen);
309 
310 	/* mtime is no good anymore */
311 	if (!error)
312 		coda_dir_update_mtime(dir_inode);
313 
314 	return error;
315 }
316 
317 /* destruction routines: unlink, rmdir */
318 static int coda_unlink(struct inode *dir, struct dentry *de)
319 {
320         int error;
321 	const char *name = de->d_name.name;
322 	int len = de->d_name.len;
323 
324 	error = venus_remove(dir->i_sb, coda_i2f(dir), name, len);
325 	if (error)
326 		return error;
327 
328 	coda_dir_update_mtime(dir);
329 	drop_nlink(de->d_inode);
330 	return 0;
331 }
332 
333 static int coda_rmdir(struct inode *dir, struct dentry *de)
334 {
335 	const char *name = de->d_name.name;
336 	int len = de->d_name.len;
337 	int error;
338 
339 	error = venus_rmdir(dir->i_sb, coda_i2f(dir), name, len);
340 	if (!error) {
341 		/* VFS may delete the child */
342 		if (de->d_inode)
343 		    de->d_inode->i_nlink = 0;
344 
345 		/* fix the link count of the parent */
346 		coda_dir_drop_nlink(dir);
347 		coda_dir_update_mtime(dir);
348 	}
349 	return error;
350 }
351 
352 /* rename */
353 static int coda_rename(struct inode *old_dir, struct dentry *old_dentry,
354 		       struct inode *new_dir, struct dentry *new_dentry)
355 {
356 	const char *old_name = old_dentry->d_name.name;
357 	const char *new_name = new_dentry->d_name.name;
358 	int old_length = old_dentry->d_name.len;
359 	int new_length = new_dentry->d_name.len;
360 	int error;
361 
362 	error = venus_rename(old_dir->i_sb, coda_i2f(old_dir),
363 			     coda_i2f(new_dir), old_length, new_length,
364 			     (const char *) old_name, (const char *)new_name);
365 	if (!error) {
366 		if (new_dentry->d_inode) {
367 			if (S_ISDIR(new_dentry->d_inode->i_mode)) {
368 				coda_dir_drop_nlink(old_dir);
369 				coda_dir_inc_nlink(new_dir);
370 			}
371 			coda_dir_update_mtime(old_dir);
372 			coda_dir_update_mtime(new_dir);
373 			coda_flag_inode(new_dentry->d_inode, C_VATTR);
374 		} else {
375 			coda_flag_inode(old_dir, C_VATTR);
376 			coda_flag_inode(new_dir, C_VATTR);
377 		}
378 	}
379 	return error;
380 }
381 
382 
383 /* file operations for directories */
384 static int coda_readdir(struct file *coda_file, void *buf, filldir_t filldir)
385 {
386 	struct coda_file_info *cfi;
387 	struct file *host_file;
388 	int ret;
389 
390 	cfi = CODA_FTOC(coda_file);
391 	BUG_ON(!cfi || cfi->cfi_magic != CODA_MAGIC);
392 	host_file = cfi->cfi_container;
393 
394 	if (!host_file->f_op)
395 		return -ENOTDIR;
396 
397 	if (host_file->f_op->readdir)
398 	{
399 		/* potemkin case: we were handed a directory inode.
400 		 * We can't use vfs_readdir because we have to keep the file
401 		 * position in sync between the coda_file and the host_file.
402 		 * and as such we need grab the inode mutex. */
403 		struct inode *host_inode = host_file->f_path.dentry->d_inode;
404 
405 		mutex_lock(&host_inode->i_mutex);
406 		host_file->f_pos = coda_file->f_pos;
407 
408 		ret = -ENOENT;
409 		if (!IS_DEADDIR(host_inode)) {
410 			ret = host_file->f_op->readdir(host_file, buf, filldir);
411 			file_accessed(host_file);
412 		}
413 
414 		coda_file->f_pos = host_file->f_pos;
415 		mutex_unlock(&host_inode->i_mutex);
416 	}
417 	else /* Venus: we must read Venus dirents from a file */
418 		ret = coda_venus_readdir(coda_file, buf, filldir);
419 
420 	return ret;
421 }
422 
423 static inline unsigned int CDT2DT(unsigned char cdt)
424 {
425 	unsigned int dt;
426 
427 	switch(cdt) {
428 	case CDT_UNKNOWN: dt = DT_UNKNOWN; break;
429 	case CDT_FIFO:	  dt = DT_FIFO;    break;
430 	case CDT_CHR:	  dt = DT_CHR;     break;
431 	case CDT_DIR:	  dt = DT_DIR;     break;
432 	case CDT_BLK:	  dt = DT_BLK;     break;
433 	case CDT_REG:	  dt = DT_REG;     break;
434 	case CDT_LNK:	  dt = DT_LNK;     break;
435 	case CDT_SOCK:	  dt = DT_SOCK;    break;
436 	case CDT_WHT:	  dt = DT_WHT;     break;
437 	default:	  dt = DT_UNKNOWN; break;
438 	}
439 	return dt;
440 }
441 
442 /* support routines */
443 static int coda_venus_readdir(struct file *coda_file, void *buf,
444 			      filldir_t filldir)
445 {
446 	int result = 0; /* # of entries returned */
447 	struct coda_file_info *cfi;
448 	struct coda_inode_info *cii;
449 	struct file *host_file;
450 	struct dentry *de;
451 	struct venus_dirent *vdir;
452 	unsigned long vdir_size =
453 	    (unsigned long)(&((struct venus_dirent *)0)->d_name);
454 	unsigned int type;
455 	struct qstr name;
456 	ino_t ino;
457 	int ret;
458 
459 	cfi = CODA_FTOC(coda_file);
460 	BUG_ON(!cfi || cfi->cfi_magic != CODA_MAGIC);
461 	host_file = cfi->cfi_container;
462 
463 	de = coda_file->f_path.dentry;
464 	cii = ITOC(de->d_inode);
465 
466 	vdir = kmalloc(sizeof(*vdir), GFP_KERNEL);
467 	if (!vdir) return -ENOMEM;
468 
469 	if (coda_file->f_pos == 0) {
470 		ret = filldir(buf, ".", 1, 0, de->d_inode->i_ino, DT_DIR);
471 		if (ret < 0)
472 			goto out;
473 		result++;
474 		coda_file->f_pos++;
475 	}
476 	if (coda_file->f_pos == 1) {
477 		ret = filldir(buf, "..", 2, 1, de->d_parent->d_inode->i_ino, DT_DIR);
478 		if (ret < 0)
479 			goto out;
480 		result++;
481 		coda_file->f_pos++;
482 	}
483 	while (1) {
484 		/* read entries from the directory file */
485 		ret = kernel_read(host_file, coda_file->f_pos - 2, (char *)vdir,
486 				  sizeof(*vdir));
487 		if (ret < 0) {
488 			printk(KERN_ERR "coda readdir: read dir %s failed %d\n",
489 			       coda_f2s(&cii->c_fid), ret);
490 			break;
491 		}
492 		if (ret == 0) break; /* end of directory file reached */
493 
494 		/* catch truncated reads */
495 		if (ret < vdir_size || ret < vdir_size + vdir->d_namlen) {
496 			printk(KERN_ERR "coda readdir: short read on %s\n",
497 			       coda_f2s(&cii->c_fid));
498 			ret = -EBADF;
499 			break;
500 		}
501 		/* validate whether the directory file actually makes sense */
502 		if (vdir->d_reclen < vdir_size + vdir->d_namlen) {
503 			printk(KERN_ERR "coda readdir: invalid dir %s\n",
504 			       coda_f2s(&cii->c_fid));
505 			ret = -EBADF;
506 			break;
507 		}
508 
509 		name.len = vdir->d_namlen;
510 		name.name = vdir->d_name;
511 
512 		/* Make sure we skip '.' and '..', we already got those */
513 		if (name.name[0] == '.' && (name.len == 1 ||
514 		    (vdir->d_name[1] == '.' && name.len == 2)))
515 			vdir->d_fileno = name.len = 0;
516 
517 		/* skip null entries */
518 		if (vdir->d_fileno && name.len) {
519 			/* try to look up this entry in the dcache, that way
520 			 * userspace doesn't have to worry about breaking
521 			 * getcwd by having mismatched inode numbers for
522 			 * internal volume mountpoints. */
523 			ino = find_inode_number(de, &name);
524 			if (!ino) ino = vdir->d_fileno;
525 
526 			type = CDT2DT(vdir->d_type);
527 			ret = filldir(buf, name.name, name.len,
528 				      coda_file->f_pos, ino, type);
529 			/* failure means no space for filling in this round */
530 			if (ret < 0) break;
531 			result++;
532 		}
533 		/* we'll always have progress because d_reclen is unsigned and
534 		 * we've already established it is non-zero. */
535 		coda_file->f_pos += vdir->d_reclen;
536 	}
537 out:
538 	kfree(vdir);
539 	return result ? result : ret;
540 }
541 
542 /* called when a cache lookup succeeds */
543 static int coda_dentry_revalidate(struct dentry *de, struct nameidata *nd)
544 {
545 	struct inode *inode;
546 	struct coda_inode_info *cii;
547 
548 	if (nd->flags & LOOKUP_RCU)
549 		return -ECHILD;
550 
551 	inode = de->d_inode;
552 	if (!inode || coda_isroot(inode))
553 		goto out;
554 	if (is_bad_inode(inode))
555 		goto bad;
556 
557 	cii = ITOC(de->d_inode);
558 	if (!(cii->c_flags & (C_PURGE | C_FLUSH)))
559 		goto out;
560 
561 	shrink_dcache_parent(de);
562 
563 	/* propagate for a flush */
564 	if (cii->c_flags & C_FLUSH)
565 		coda_flag_inode_children(inode, C_FLUSH);
566 
567 	if (de->d_count > 1)
568 		/* pretend it's valid, but don't change the flags */
569 		goto out;
570 
571 	/* clear the flags. */
572 	spin_lock(&cii->c_lock);
573 	cii->c_flags &= ~(C_VATTR | C_PURGE | C_FLUSH);
574 	spin_unlock(&cii->c_lock);
575 bad:
576 	return 0;
577 out:
578 	return 1;
579 }
580 
581 /*
582  * This is the callback from dput() when d_count is going to 0.
583  * We use this to unhash dentries with bad inodes.
584  */
585 static int coda_dentry_delete(const struct dentry * dentry)
586 {
587 	int flags;
588 
589 	if (!dentry->d_inode)
590 		return 0;
591 
592 	flags = (ITOC(dentry->d_inode)->c_flags) & C_PURGE;
593 	if (is_bad_inode(dentry->d_inode) || flags) {
594 		return 1;
595 	}
596 	return 0;
597 }
598 
599 
600 
601 /*
602  * This is called when we want to check if the inode has
603  * changed on the server.  Coda makes this easy since the
604  * cache manager Venus issues a downcall to the kernel when this
605  * happens
606  */
607 int coda_revalidate_inode(struct dentry *dentry)
608 {
609 	struct coda_vattr attr;
610 	int error;
611 	int old_mode;
612 	ino_t old_ino;
613 	struct inode *inode = dentry->d_inode;
614 	struct coda_inode_info *cii = ITOC(inode);
615 
616 	if (!cii->c_flags)
617 		return 0;
618 
619 	if (cii->c_flags & (C_VATTR | C_PURGE | C_FLUSH)) {
620 		error = venus_getattr(inode->i_sb, &(cii->c_fid), &attr);
621 		if (error)
622 			return -EIO;
623 
624 		/* this inode may be lost if:
625 		   - it's ino changed
626 		   - type changes must be permitted for repair and
627 		   missing mount points.
628 		*/
629 		old_mode = inode->i_mode;
630 		old_ino = inode->i_ino;
631 		coda_vattr_to_iattr(inode, &attr);
632 
633 		if ((old_mode & S_IFMT) != (inode->i_mode & S_IFMT)) {
634 			printk("Coda: inode %ld, fid %s changed type!\n",
635 			       inode->i_ino, coda_f2s(&(cii->c_fid)));
636 		}
637 
638 		/* the following can happen when a local fid is replaced
639 		   with a global one, here we lose and declare the inode bad */
640 		if (inode->i_ino != old_ino)
641 			return -EIO;
642 
643 		coda_flag_inode_children(inode, C_FLUSH);
644 
645 		spin_lock(&cii->c_lock);
646 		cii->c_flags &= ~(C_VATTR | C_PURGE | C_FLUSH);
647 		spin_unlock(&cii->c_lock);
648 	}
649 	return 0;
650 }
651