• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  *   Copyright (C) International Business Machines Corp., 2000-2004
3  *   Portions Copyright (C) Christoph Hellwig, 2001-2002
4  *
5  *   This program is free software;  you can redistribute it and/or modify
6  *   it under the terms of the GNU General Public License as published by
7  *   the Free Software Foundation; either version 2 of the License, or
8  *   (at your option) any later version.
9  *
10  *   This program is distributed in the hope that it will be useful,
11  *   but WITHOUT ANY WARRANTY;  without even the implied warranty of
12  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
13  *   the GNU General Public License for more details.
14  *
15  *   You should have received a copy of the GNU General Public License
16  *   along with this program;  if not, write to the Free Software
17  *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18  */
19 
20 #include <linux/fs.h>
21 #include <linux/module.h>
22 #include <linux/parser.h>
23 #include <linux/completion.h>
24 #include <linux/vfs.h>
25 #include <linux/quotaops.h>
26 #include <linux/mount.h>
27 #include <linux/moduleparam.h>
28 #include <linux/kthread.h>
29 #include <linux/posix_acl.h>
30 #include <linux/buffer_head.h>
31 #include <linux/exportfs.h>
32 #include <asm/uaccess.h>
33 #include <linux/seq_file.h>
34 
35 #include "jfs_incore.h"
36 #include "jfs_filsys.h"
37 #include "jfs_inode.h"
38 #include "jfs_metapage.h"
39 #include "jfs_superblock.h"
40 #include "jfs_dmap.h"
41 #include "jfs_imap.h"
42 #include "jfs_acl.h"
43 #include "jfs_debug.h"
44 
45 MODULE_DESCRIPTION("The Journaled Filesystem (JFS)");
46 MODULE_AUTHOR("Steve Best/Dave Kleikamp/Barry Arndt, IBM");
47 MODULE_LICENSE("GPL");
48 
49 static struct kmem_cache * jfs_inode_cachep;
50 
51 static const struct super_operations jfs_super_operations;
52 static const struct export_operations jfs_export_operations;
53 static struct file_system_type jfs_fs_type;
54 
55 #define MAX_COMMIT_THREADS 64
56 static int commit_threads = 0;
57 module_param(commit_threads, int, 0);
58 MODULE_PARM_DESC(commit_threads, "Number of commit threads");
59 
60 static struct task_struct *jfsCommitThread[MAX_COMMIT_THREADS];
61 struct task_struct *jfsIOthread;
62 struct task_struct *jfsSyncThread;
63 
64 #ifdef CONFIG_JFS_DEBUG
65 int jfsloglevel = JFS_LOGLEVEL_WARN;
66 module_param(jfsloglevel, int, 0644);
67 MODULE_PARM_DESC(jfsloglevel, "Specify JFS loglevel (0, 1 or 2)");
68 #endif
69 
jfs_handle_error(struct super_block * sb)70 static void jfs_handle_error(struct super_block *sb)
71 {
72 	struct jfs_sb_info *sbi = JFS_SBI(sb);
73 
74 	if (sb->s_flags & MS_RDONLY)
75 		return;
76 
77 	updateSuper(sb, FM_DIRTY);
78 
79 	if (sbi->flag & JFS_ERR_PANIC)
80 		panic("JFS (device %s): panic forced after error\n",
81 			sb->s_id);
82 	else if (sbi->flag & JFS_ERR_REMOUNT_RO) {
83 		jfs_err("ERROR: (device %s): remounting filesystem "
84 			"as read-only\n",
85 			sb->s_id);
86 		sb->s_flags |= MS_RDONLY;
87 	}
88 
89 	/* nothing is done for continue beyond marking the superblock dirty */
90 }
91 
jfs_error(struct super_block * sb,const char * function,...)92 void jfs_error(struct super_block *sb, const char * function, ...)
93 {
94 	static char error_buf[256];
95 	va_list args;
96 
97 	va_start(args, function);
98 	vsnprintf(error_buf, sizeof(error_buf), function, args);
99 	va_end(args);
100 
101 	printk(KERN_ERR "ERROR: (device %s): %s\n", sb->s_id, error_buf);
102 
103 	jfs_handle_error(sb);
104 }
105 
jfs_alloc_inode(struct super_block * sb)106 static struct inode *jfs_alloc_inode(struct super_block *sb)
107 {
108 	struct jfs_inode_info *jfs_inode;
109 
110 	jfs_inode = kmem_cache_alloc(jfs_inode_cachep, GFP_NOFS);
111 	if (!jfs_inode)
112 		return NULL;
113 	return &jfs_inode->vfs_inode;
114 }
115 
jfs_destroy_inode(struct inode * inode)116 static void jfs_destroy_inode(struct inode *inode)
117 {
118 	struct jfs_inode_info *ji = JFS_IP(inode);
119 
120 	BUG_ON(!list_empty(&ji->anon_inode_list));
121 
122 	spin_lock_irq(&ji->ag_lock);
123 	if (ji->active_ag != -1) {
124 		struct bmap *bmap = JFS_SBI(inode->i_sb)->bmap;
125 		atomic_dec(&bmap->db_active[ji->active_ag]);
126 		ji->active_ag = -1;
127 	}
128 	spin_unlock_irq(&ji->ag_lock);
129 
130 #ifdef CONFIG_JFS_POSIX_ACL
131 	if (ji->i_acl != JFS_ACL_NOT_CACHED) {
132 		posix_acl_release(ji->i_acl);
133 		ji->i_acl = JFS_ACL_NOT_CACHED;
134 	}
135 	if (ji->i_default_acl != JFS_ACL_NOT_CACHED) {
136 		posix_acl_release(ji->i_default_acl);
137 		ji->i_default_acl = JFS_ACL_NOT_CACHED;
138 	}
139 #endif
140 
141 	kmem_cache_free(jfs_inode_cachep, ji);
142 }
143 
jfs_statfs(struct dentry * dentry,struct kstatfs * buf)144 static int jfs_statfs(struct dentry *dentry, struct kstatfs *buf)
145 {
146 	struct jfs_sb_info *sbi = JFS_SBI(dentry->d_sb);
147 	s64 maxinodes;
148 	struct inomap *imap = JFS_IP(sbi->ipimap)->i_imap;
149 
150 	jfs_info("In jfs_statfs");
151 	buf->f_type = JFS_SUPER_MAGIC;
152 	buf->f_bsize = sbi->bsize;
153 	buf->f_blocks = sbi->bmap->db_mapsize;
154 	buf->f_bfree = sbi->bmap->db_nfree;
155 	buf->f_bavail = sbi->bmap->db_nfree;
156 	/*
157 	 * If we really return the number of allocated & free inodes, some
158 	 * applications will fail because they won't see enough free inodes.
159 	 * We'll try to calculate some guess as to how may inodes we can
160 	 * really allocate
161 	 *
162 	 * buf->f_files = atomic_read(&imap->im_numinos);
163 	 * buf->f_ffree = atomic_read(&imap->im_numfree);
164 	 */
165 	maxinodes = min((s64) atomic_read(&imap->im_numinos) +
166 			((sbi->bmap->db_nfree >> imap->im_l2nbperiext)
167 			 << L2INOSPEREXT), (s64) 0xffffffffLL);
168 	buf->f_files = maxinodes;
169 	buf->f_ffree = maxinodes - (atomic_read(&imap->im_numinos) -
170 				    atomic_read(&imap->im_numfree));
171 
172 	buf->f_namelen = JFS_NAME_MAX;
173 	return 0;
174 }
175 
jfs_put_super(struct super_block * sb)176 static void jfs_put_super(struct super_block *sb)
177 {
178 	struct jfs_sb_info *sbi = JFS_SBI(sb);
179 	int rc;
180 
181 	jfs_info("In jfs_put_super");
182 	rc = jfs_umount(sb);
183 	if (rc)
184 		jfs_err("jfs_umount failed with return code %d", rc);
185 	if (sbi->nls_tab)
186 		unload_nls(sbi->nls_tab);
187 	sbi->nls_tab = NULL;
188 
189 	truncate_inode_pages(sbi->direct_inode->i_mapping, 0);
190 	iput(sbi->direct_inode);
191 	sbi->direct_inode = NULL;
192 
193 	kfree(sbi);
194 }
195 
196 enum {
197 	Opt_integrity, Opt_nointegrity, Opt_iocharset, Opt_resize,
198 	Opt_resize_nosize, Opt_errors, Opt_ignore, Opt_err, Opt_quota,
199 	Opt_usrquota, Opt_grpquota, Opt_uid, Opt_gid, Opt_umask
200 };
201 
202 static const match_table_t tokens = {
203 	{Opt_integrity, "integrity"},
204 	{Opt_nointegrity, "nointegrity"},
205 	{Opt_iocharset, "iocharset=%s"},
206 	{Opt_resize, "resize=%u"},
207 	{Opt_resize_nosize, "resize"},
208 	{Opt_errors, "errors=%s"},
209 	{Opt_ignore, "noquota"},
210 	{Opt_ignore, "quota"},
211 	{Opt_usrquota, "usrquota"},
212 	{Opt_grpquota, "grpquota"},
213 	{Opt_uid, "uid=%u"},
214 	{Opt_gid, "gid=%u"},
215 	{Opt_umask, "umask=%u"},
216 	{Opt_err, NULL}
217 };
218 
parse_options(char * options,struct super_block * sb,s64 * newLVSize,int * flag)219 static int parse_options(char *options, struct super_block *sb, s64 *newLVSize,
220 			 int *flag)
221 {
222 	void *nls_map = (void *)-1;	/* -1: no change;  NULL: none */
223 	char *p;
224 	struct jfs_sb_info *sbi = JFS_SBI(sb);
225 
226 	*newLVSize = 0;
227 
228 	if (!options)
229 		return 1;
230 
231 	while ((p = strsep(&options, ",")) != NULL) {
232 		substring_t args[MAX_OPT_ARGS];
233 		int token;
234 		if (!*p)
235 			continue;
236 
237 		token = match_token(p, tokens, args);
238 		switch (token) {
239 		case Opt_integrity:
240 			*flag &= ~JFS_NOINTEGRITY;
241 			break;
242 		case Opt_nointegrity:
243 			*flag |= JFS_NOINTEGRITY;
244 			break;
245 		case Opt_ignore:
246 			/* Silently ignore the quota options */
247 			/* Don't do anything ;-) */
248 			break;
249 		case Opt_iocharset:
250 			if (nls_map && nls_map != (void *) -1)
251 				unload_nls(nls_map);
252 			if (!strcmp(args[0].from, "none"))
253 				nls_map = NULL;
254 			else {
255 				nls_map = load_nls(args[0].from);
256 				if (!nls_map) {
257 					printk(KERN_ERR
258 					       "JFS: charset not found\n");
259 					goto cleanup;
260 				}
261 			}
262 			break;
263 		case Opt_resize:
264 		{
265 			char *resize = args[0].from;
266 			*newLVSize = simple_strtoull(resize, &resize, 0);
267 			break;
268 		}
269 		case Opt_resize_nosize:
270 		{
271 			*newLVSize = sb->s_bdev->bd_inode->i_size >>
272 				sb->s_blocksize_bits;
273 			if (*newLVSize == 0)
274 				printk(KERN_ERR
275 				       "JFS: Cannot determine volume size\n");
276 			break;
277 		}
278 		case Opt_errors:
279 		{
280 			char *errors = args[0].from;
281 			if (!errors || !*errors)
282 				goto cleanup;
283 			if (!strcmp(errors, "continue")) {
284 				*flag &= ~JFS_ERR_REMOUNT_RO;
285 				*flag &= ~JFS_ERR_PANIC;
286 				*flag |= JFS_ERR_CONTINUE;
287 			} else if (!strcmp(errors, "remount-ro")) {
288 				*flag &= ~JFS_ERR_CONTINUE;
289 				*flag &= ~JFS_ERR_PANIC;
290 				*flag |= JFS_ERR_REMOUNT_RO;
291 			} else if (!strcmp(errors, "panic")) {
292 				*flag &= ~JFS_ERR_CONTINUE;
293 				*flag &= ~JFS_ERR_REMOUNT_RO;
294 				*flag |= JFS_ERR_PANIC;
295 			} else {
296 				printk(KERN_ERR
297 				       "JFS: %s is an invalid error handler\n",
298 				       errors);
299 				goto cleanup;
300 			}
301 			break;
302 		}
303 
304 #ifdef CONFIG_QUOTA
305 		case Opt_quota:
306 		case Opt_usrquota:
307 			*flag |= JFS_USRQUOTA;
308 			break;
309 		case Opt_grpquota:
310 			*flag |= JFS_GRPQUOTA;
311 			break;
312 #else
313 		case Opt_usrquota:
314 		case Opt_grpquota:
315 		case Opt_quota:
316 			printk(KERN_ERR
317 			       "JFS: quota operations not supported\n");
318 			break;
319 #endif
320 		case Opt_uid:
321 		{
322 			char *uid = args[0].from;
323 			sbi->uid = simple_strtoul(uid, &uid, 0);
324 			break;
325 		}
326 		case Opt_gid:
327 		{
328 			char *gid = args[0].from;
329 			sbi->gid = simple_strtoul(gid, &gid, 0);
330 			break;
331 		}
332 		case Opt_umask:
333 		{
334 			char *umask = args[0].from;
335 			sbi->umask = simple_strtoul(umask, &umask, 8);
336 			if (sbi->umask & ~0777) {
337 				printk(KERN_ERR
338 				       "JFS: Invalid value of umask\n");
339 				goto cleanup;
340 			}
341 			break;
342 		}
343 		default:
344 			printk("jfs: Unrecognized mount option \"%s\" "
345 					" or missing value\n", p);
346 			goto cleanup;
347 		}
348 	}
349 
350 	if (nls_map != (void *) -1) {
351 		/* Discard old (if remount) */
352 		if (sbi->nls_tab)
353 			unload_nls(sbi->nls_tab);
354 		sbi->nls_tab = nls_map;
355 	}
356 	return 1;
357 
358 cleanup:
359 	if (nls_map && nls_map != (void *) -1)
360 		unload_nls(nls_map);
361 	return 0;
362 }
363 
jfs_remount(struct super_block * sb,int * flags,char * data)364 static int jfs_remount(struct super_block *sb, int *flags, char *data)
365 {
366 	s64 newLVSize = 0;
367 	int rc = 0;
368 	int flag = JFS_SBI(sb)->flag;
369 
370 	if (!parse_options(data, sb, &newLVSize, &flag)) {
371 		return -EINVAL;
372 	}
373 	if (newLVSize) {
374 		if (sb->s_flags & MS_RDONLY) {
375 			printk(KERN_ERR
376 		  "JFS: resize requires volume to be mounted read-write\n");
377 			return -EROFS;
378 		}
379 		rc = jfs_extendfs(sb, newLVSize, 0);
380 		if (rc)
381 			return rc;
382 	}
383 
384 	if ((sb->s_flags & MS_RDONLY) && !(*flags & MS_RDONLY)) {
385 		/*
386 		 * Invalidate any previously read metadata.  fsck may have
387 		 * changed the on-disk data since we mounted r/o
388 		 */
389 		truncate_inode_pages(JFS_SBI(sb)->direct_inode->i_mapping, 0);
390 
391 		JFS_SBI(sb)->flag = flag;
392 		return jfs_mount_rw(sb, 1);
393 	}
394 	if ((!(sb->s_flags & MS_RDONLY)) && (*flags & MS_RDONLY)) {
395 		rc = jfs_umount_rw(sb);
396 		JFS_SBI(sb)->flag = flag;
397 		return rc;
398 	}
399 	if ((JFS_SBI(sb)->flag & JFS_NOINTEGRITY) != (flag & JFS_NOINTEGRITY))
400 		if (!(sb->s_flags & MS_RDONLY)) {
401 			rc = jfs_umount_rw(sb);
402 			if (rc)
403 				return rc;
404 			JFS_SBI(sb)->flag = flag;
405 			return jfs_mount_rw(sb, 1);
406 		}
407 	JFS_SBI(sb)->flag = flag;
408 
409 	return 0;
410 }
411 
jfs_fill_super(struct super_block * sb,void * data,int silent)412 static int jfs_fill_super(struct super_block *sb, void *data, int silent)
413 {
414 	struct jfs_sb_info *sbi;
415 	struct inode *inode;
416 	int rc;
417 	s64 newLVSize = 0;
418 	int flag, ret = -EINVAL;
419 
420 	jfs_info("In jfs_read_super: s_flags=0x%lx", sb->s_flags);
421 
422 	if (!new_valid_dev(sb->s_bdev->bd_dev))
423 		return -EOVERFLOW;
424 
425 	sbi = kzalloc(sizeof (struct jfs_sb_info), GFP_KERNEL);
426 	if (!sbi)
427 		return -ENOMEM;
428 	sb->s_fs_info = sbi;
429 	sbi->sb = sb;
430 	sbi->uid = sbi->gid = sbi->umask = -1;
431 
432 	/* initialize the mount flag and determine the default error handler */
433 	flag = JFS_ERR_REMOUNT_RO;
434 
435 	if (!parse_options((char *) data, sb, &newLVSize, &flag)) {
436 		kfree(sbi);
437 		return -EINVAL;
438 	}
439 	sbi->flag = flag;
440 
441 #ifdef CONFIG_JFS_POSIX_ACL
442 	sb->s_flags |= MS_POSIXACL;
443 #endif
444 
445 	if (newLVSize) {
446 		printk(KERN_ERR "resize option for remount only\n");
447 		return -EINVAL;
448 	}
449 
450 	/*
451 	 * Initialize blocksize to 4K.
452 	 */
453 	sb_set_blocksize(sb, PSIZE);
454 
455 	/*
456 	 * Set method vectors.
457 	 */
458 	sb->s_op = &jfs_super_operations;
459 	sb->s_export_op = &jfs_export_operations;
460 
461 	/*
462 	 * Initialize direct-mapping inode/address-space
463 	 */
464 	inode = new_inode(sb);
465 	if (inode == NULL) {
466 		ret = -ENOMEM;
467 		goto out_kfree;
468 	}
469 	inode->i_ino = 0;
470 	inode->i_nlink = 1;
471 	inode->i_size = sb->s_bdev->bd_inode->i_size;
472 	inode->i_mapping->a_ops = &jfs_metapage_aops;
473 	insert_inode_hash(inode);
474 	mapping_set_gfp_mask(inode->i_mapping, GFP_NOFS);
475 
476 	sbi->direct_inode = inode;
477 
478 	rc = jfs_mount(sb);
479 	if (rc) {
480 		if (!silent) {
481 			jfs_err("jfs_mount failed w/return code = %d", rc);
482 		}
483 		goto out_mount_failed;
484 	}
485 	if (sb->s_flags & MS_RDONLY)
486 		sbi->log = NULL;
487 	else {
488 		rc = jfs_mount_rw(sb, 0);
489 		if (rc) {
490 			if (!silent) {
491 				jfs_err("jfs_mount_rw failed, return code = %d",
492 					rc);
493 			}
494 			goto out_no_rw;
495 		}
496 	}
497 
498 	sb->s_magic = JFS_SUPER_MAGIC;
499 
500 	inode = jfs_iget(sb, ROOT_I);
501 	if (IS_ERR(inode)) {
502 		ret = PTR_ERR(inode);
503 		goto out_no_rw;
504 	}
505 	sb->s_root = d_alloc_root(inode);
506 	if (!sb->s_root)
507 		goto out_no_root;
508 
509 	if (sbi->mntflag & JFS_OS2)
510 		sb->s_root->d_op = &jfs_ci_dentry_operations;
511 
512 	/* logical blocks are represented by 40 bits in pxd_t, etc. */
513 	sb->s_maxbytes = ((u64) sb->s_blocksize) << 40;
514 #if BITS_PER_LONG == 32
515 	/*
516 	 * Page cache is indexed by long.
517 	 * I would use MAX_LFS_FILESIZE, but it's only half as big
518 	 */
519 	sb->s_maxbytes = min(((u64) PAGE_CACHE_SIZE << 32) - 1, sb->s_maxbytes);
520 #endif
521 	sb->s_time_gran = 1;
522 	return 0;
523 
524 out_no_root:
525 	jfs_err("jfs_read_super: get root dentry failed");
526 	iput(inode);
527 
528 out_no_rw:
529 	rc = jfs_umount(sb);
530 	if (rc) {
531 		jfs_err("jfs_umount failed with return code %d", rc);
532 	}
533 out_mount_failed:
534 	filemap_write_and_wait(sbi->direct_inode->i_mapping);
535 	truncate_inode_pages(sbi->direct_inode->i_mapping, 0);
536 	make_bad_inode(sbi->direct_inode);
537 	iput(sbi->direct_inode);
538 	sbi->direct_inode = NULL;
539 out_kfree:
540 	if (sbi->nls_tab)
541 		unload_nls(sbi->nls_tab);
542 	kfree(sbi);
543 	return ret;
544 }
545 
jfs_freeze(struct super_block * sb)546 static int jfs_freeze(struct super_block *sb)
547 {
548 	struct jfs_sb_info *sbi = JFS_SBI(sb);
549 	struct jfs_log *log = sbi->log;
550 
551 	if (!(sb->s_flags & MS_RDONLY)) {
552 		txQuiesce(sb);
553 		lmLogShutdown(log);
554 		updateSuper(sb, FM_CLEAN);
555 	}
556 	return 0;
557 }
558 
jfs_unfreeze(struct super_block * sb)559 static int jfs_unfreeze(struct super_block *sb)
560 {
561 	struct jfs_sb_info *sbi = JFS_SBI(sb);
562 	struct jfs_log *log = sbi->log;
563 	int rc = 0;
564 
565 	if (!(sb->s_flags & MS_RDONLY)) {
566 		updateSuper(sb, FM_MOUNT);
567 		if ((rc = lmLogInit(log)))
568 			jfs_err("jfs_unlock failed with return code %d", rc);
569 		else
570 			txResume(sb);
571 	}
572 	return 0;
573 }
574 
jfs_get_sb(struct file_system_type * fs_type,int flags,const char * dev_name,void * data,struct vfsmount * mnt)575 static int jfs_get_sb(struct file_system_type *fs_type,
576 	int flags, const char *dev_name, void *data, struct vfsmount *mnt)
577 {
578 	return get_sb_bdev(fs_type, flags, dev_name, data, jfs_fill_super,
579 			   mnt);
580 }
581 
jfs_sync_fs(struct super_block * sb,int wait)582 static int jfs_sync_fs(struct super_block *sb, int wait)
583 {
584 	struct jfs_log *log = JFS_SBI(sb)->log;
585 
586 	/* log == NULL indicates read-only mount */
587 	if (log) {
588 		jfs_flush_journal(log, wait);
589 		jfs_syncpt(log, 0);
590 	}
591 
592 	return 0;
593 }
594 
jfs_show_options(struct seq_file * seq,struct vfsmount * vfs)595 static int jfs_show_options(struct seq_file *seq, struct vfsmount *vfs)
596 {
597 	struct jfs_sb_info *sbi = JFS_SBI(vfs->mnt_sb);
598 
599 	if (sbi->uid != -1)
600 		seq_printf(seq, ",uid=%d", sbi->uid);
601 	if (sbi->gid != -1)
602 		seq_printf(seq, ",gid=%d", sbi->gid);
603 	if (sbi->umask != -1)
604 		seq_printf(seq, ",umask=%03o", sbi->umask);
605 	if (sbi->flag & JFS_NOINTEGRITY)
606 		seq_puts(seq, ",nointegrity");
607 	if (sbi->nls_tab)
608 		seq_printf(seq, ",iocharset=%s", sbi->nls_tab->charset);
609 	if (sbi->flag & JFS_ERR_CONTINUE)
610 		seq_printf(seq, ",errors=continue");
611 	if (sbi->flag & JFS_ERR_PANIC)
612 		seq_printf(seq, ",errors=panic");
613 
614 #ifdef CONFIG_QUOTA
615 	if (sbi->flag & JFS_USRQUOTA)
616 		seq_puts(seq, ",usrquota");
617 
618 	if (sbi->flag & JFS_GRPQUOTA)
619 		seq_puts(seq, ",grpquota");
620 #endif
621 
622 	return 0;
623 }
624 
625 #ifdef CONFIG_QUOTA
626 
627 /* Read data from quotafile - avoid pagecache and such because we cannot afford
628  * acquiring the locks... As quota files are never truncated and quota code
629  * itself serializes the operations (and noone else should touch the files)
630  * we don't have to be afraid of races */
jfs_quota_read(struct super_block * sb,int type,char * data,size_t len,loff_t off)631 static ssize_t jfs_quota_read(struct super_block *sb, int type, char *data,
632 			      size_t len, loff_t off)
633 {
634 	struct inode *inode = sb_dqopt(sb)->files[type];
635 	sector_t blk = off >> sb->s_blocksize_bits;
636 	int err = 0;
637 	int offset = off & (sb->s_blocksize - 1);
638 	int tocopy;
639 	size_t toread;
640 	struct buffer_head tmp_bh;
641 	struct buffer_head *bh;
642 	loff_t i_size = i_size_read(inode);
643 
644 	if (off > i_size)
645 		return 0;
646 	if (off+len > i_size)
647 		len = i_size-off;
648 	toread = len;
649 	while (toread > 0) {
650 		tocopy = sb->s_blocksize - offset < toread ?
651 				sb->s_blocksize - offset : toread;
652 
653 		tmp_bh.b_state = 0;
654 		tmp_bh.b_size = 1 << inode->i_blkbits;
655 		err = jfs_get_block(inode, blk, &tmp_bh, 0);
656 		if (err)
657 			return err;
658 		if (!buffer_mapped(&tmp_bh))	/* A hole? */
659 			memset(data, 0, tocopy);
660 		else {
661 			bh = sb_bread(sb, tmp_bh.b_blocknr);
662 			if (!bh)
663 				return -EIO;
664 			memcpy(data, bh->b_data+offset, tocopy);
665 			brelse(bh);
666 		}
667 		offset = 0;
668 		toread -= tocopy;
669 		data += tocopy;
670 		blk++;
671 	}
672 	return len;
673 }
674 
675 /* Write to quotafile */
jfs_quota_write(struct super_block * sb,int type,const char * data,size_t len,loff_t off)676 static ssize_t jfs_quota_write(struct super_block *sb, int type,
677 			       const char *data, size_t len, loff_t off)
678 {
679 	struct inode *inode = sb_dqopt(sb)->files[type];
680 	sector_t blk = off >> sb->s_blocksize_bits;
681 	int err = 0;
682 	int offset = off & (sb->s_blocksize - 1);
683 	int tocopy;
684 	size_t towrite = len;
685 	struct buffer_head tmp_bh;
686 	struct buffer_head *bh;
687 
688 	mutex_lock(&inode->i_mutex);
689 	while (towrite > 0) {
690 		tocopy = sb->s_blocksize - offset < towrite ?
691 				sb->s_blocksize - offset : towrite;
692 
693 		tmp_bh.b_state = 0;
694 		tmp_bh.b_size = 1 << inode->i_blkbits;
695 		err = jfs_get_block(inode, blk, &tmp_bh, 1);
696 		if (err)
697 			goto out;
698 		if (offset || tocopy != sb->s_blocksize)
699 			bh = sb_bread(sb, tmp_bh.b_blocknr);
700 		else
701 			bh = sb_getblk(sb, tmp_bh.b_blocknr);
702 		if (!bh) {
703 			err = -EIO;
704 			goto out;
705 		}
706 		lock_buffer(bh);
707 		memcpy(bh->b_data+offset, data, tocopy);
708 		flush_dcache_page(bh->b_page);
709 		set_buffer_uptodate(bh);
710 		mark_buffer_dirty(bh);
711 		unlock_buffer(bh);
712 		brelse(bh);
713 		offset = 0;
714 		towrite -= tocopy;
715 		data += tocopy;
716 		blk++;
717 	}
718 out:
719 	if (len == towrite)
720 		return err;
721 	if (inode->i_size < off+len-towrite)
722 		i_size_write(inode, off+len-towrite);
723 	inode->i_version++;
724 	inode->i_mtime = inode->i_ctime = CURRENT_TIME;
725 	mark_inode_dirty(inode);
726 	mutex_unlock(&inode->i_mutex);
727 	return len - towrite;
728 }
729 
730 #endif
731 
732 static const struct super_operations jfs_super_operations = {
733 	.alloc_inode	= jfs_alloc_inode,
734 	.destroy_inode	= jfs_destroy_inode,
735 	.dirty_inode	= jfs_dirty_inode,
736 	.write_inode	= jfs_write_inode,
737 	.delete_inode	= jfs_delete_inode,
738 	.put_super	= jfs_put_super,
739 	.sync_fs	= jfs_sync_fs,
740 	.freeze_fs	= jfs_freeze,
741 	.unfreeze_fs	= jfs_unfreeze,
742 	.statfs		= jfs_statfs,
743 	.remount_fs	= jfs_remount,
744 	.show_options	= jfs_show_options,
745 #ifdef CONFIG_QUOTA
746 	.quota_read	= jfs_quota_read,
747 	.quota_write	= jfs_quota_write,
748 #endif
749 };
750 
751 static const struct export_operations jfs_export_operations = {
752 	.fh_to_dentry	= jfs_fh_to_dentry,
753 	.fh_to_parent	= jfs_fh_to_parent,
754 	.get_parent	= jfs_get_parent,
755 };
756 
757 static struct file_system_type jfs_fs_type = {
758 	.owner		= THIS_MODULE,
759 	.name		= "jfs",
760 	.get_sb		= jfs_get_sb,
761 	.kill_sb	= kill_block_super,
762 	.fs_flags	= FS_REQUIRES_DEV,
763 };
764 
init_once(void * foo)765 static void init_once(void *foo)
766 {
767 	struct jfs_inode_info *jfs_ip = (struct jfs_inode_info *) foo;
768 
769 	memset(jfs_ip, 0, sizeof(struct jfs_inode_info));
770 	INIT_LIST_HEAD(&jfs_ip->anon_inode_list);
771 	init_rwsem(&jfs_ip->rdwrlock);
772 	mutex_init(&jfs_ip->commit_mutex);
773 	init_rwsem(&jfs_ip->xattr_sem);
774 	spin_lock_init(&jfs_ip->ag_lock);
775 	jfs_ip->active_ag = -1;
776 #ifdef CONFIG_JFS_POSIX_ACL
777 	jfs_ip->i_acl = JFS_ACL_NOT_CACHED;
778 	jfs_ip->i_default_acl = JFS_ACL_NOT_CACHED;
779 #endif
780 	inode_init_once(&jfs_ip->vfs_inode);
781 }
782 
init_jfs_fs(void)783 static int __init init_jfs_fs(void)
784 {
785 	int i;
786 	int rc;
787 
788 	jfs_inode_cachep =
789 	    kmem_cache_create("jfs_ip", sizeof(struct jfs_inode_info), 0,
790 			    SLAB_RECLAIM_ACCOUNT|SLAB_MEM_SPREAD,
791 			    init_once);
792 	if (jfs_inode_cachep == NULL)
793 		return -ENOMEM;
794 
795 	/*
796 	 * Metapage initialization
797 	 */
798 	rc = metapage_init();
799 	if (rc) {
800 		jfs_err("metapage_init failed w/rc = %d", rc);
801 		goto free_slab;
802 	}
803 
804 	/*
805 	 * Transaction Manager initialization
806 	 */
807 	rc = txInit();
808 	if (rc) {
809 		jfs_err("txInit failed w/rc = %d", rc);
810 		goto free_metapage;
811 	}
812 
813 	/*
814 	 * I/O completion thread (endio)
815 	 */
816 	jfsIOthread = kthread_run(jfsIOWait, NULL, "jfsIO");
817 	if (IS_ERR(jfsIOthread)) {
818 		rc = PTR_ERR(jfsIOthread);
819 		jfs_err("init_jfs_fs: fork failed w/rc = %d", rc);
820 		goto end_txmngr;
821 	}
822 
823 	if (commit_threads < 1)
824 		commit_threads = num_online_cpus();
825 	if (commit_threads > MAX_COMMIT_THREADS)
826 		commit_threads = MAX_COMMIT_THREADS;
827 
828 	for (i = 0; i < commit_threads; i++) {
829 		jfsCommitThread[i] = kthread_run(jfs_lazycommit, NULL, "jfsCommit");
830 		if (IS_ERR(jfsCommitThread[i])) {
831 			rc = PTR_ERR(jfsCommitThread[i]);
832 			jfs_err("init_jfs_fs: fork failed w/rc = %d", rc);
833 			commit_threads = i;
834 			goto kill_committask;
835 		}
836 	}
837 
838 	jfsSyncThread = kthread_run(jfs_sync, NULL, "jfsSync");
839 	if (IS_ERR(jfsSyncThread)) {
840 		rc = PTR_ERR(jfsSyncThread);
841 		jfs_err("init_jfs_fs: fork failed w/rc = %d", rc);
842 		goto kill_committask;
843 	}
844 
845 #ifdef PROC_FS_JFS
846 	jfs_proc_init();
847 #endif
848 
849 	return register_filesystem(&jfs_fs_type);
850 
851 kill_committask:
852 	for (i = 0; i < commit_threads; i++)
853 		kthread_stop(jfsCommitThread[i]);
854 	kthread_stop(jfsIOthread);
855 end_txmngr:
856 	txExit();
857 free_metapage:
858 	metapage_exit();
859 free_slab:
860 	kmem_cache_destroy(jfs_inode_cachep);
861 	return rc;
862 }
863 
exit_jfs_fs(void)864 static void __exit exit_jfs_fs(void)
865 {
866 	int i;
867 
868 	jfs_info("exit_jfs_fs called");
869 
870 	txExit();
871 	metapage_exit();
872 
873 	kthread_stop(jfsIOthread);
874 	for (i = 0; i < commit_threads; i++)
875 		kthread_stop(jfsCommitThread[i]);
876 	kthread_stop(jfsSyncThread);
877 #ifdef PROC_FS_JFS
878 	jfs_proc_clean();
879 #endif
880 	unregister_filesystem(&jfs_fs_type);
881 	kmem_cache_destroy(jfs_inode_cachep);
882 }
883 
884 module_init(init_jfs_fs)
885 module_exit(exit_jfs_fs)
886