[PATCH] fs/buffer.c: cleanups
[linux-2.6] / fs / jfs / super.c
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/config.h>
22 #include <linux/module.h>
23 #include <linux/parser.h>
24 #include <linux/completion.h>
25 #include <linux/vfs.h>
26 #include <linux/mount.h>
27 #include <linux/moduleparam.h>
28 #include <linux/kthread.h>
29 #include <linux/posix_acl.h>
30 #include <asm/uaccess.h>
31 #include <linux/seq_file.h>
32
33 #include "jfs_incore.h"
34 #include "jfs_filsys.h"
35 #include "jfs_inode.h"
36 #include "jfs_metapage.h"
37 #include "jfs_superblock.h"
38 #include "jfs_dmap.h"
39 #include "jfs_imap.h"
40 #include "jfs_acl.h"
41 #include "jfs_debug.h"
42
43 MODULE_DESCRIPTION("The Journaled Filesystem (JFS)");
44 MODULE_AUTHOR("Steve Best/Dave Kleikamp/Barry Arndt, IBM");
45 MODULE_LICENSE("GPL");
46
47 static kmem_cache_t * jfs_inode_cachep;
48
49 static struct super_operations jfs_super_operations;
50 static struct export_operations jfs_export_operations;
51 static struct file_system_type jfs_fs_type;
52
53 #define MAX_COMMIT_THREADS 64
54 static int commit_threads = 0;
55 module_param(commit_threads, int, 0);
56 MODULE_PARM_DESC(commit_threads, "Number of commit threads");
57
58 static struct task_struct *jfsCommitThread[MAX_COMMIT_THREADS];
59 struct task_struct *jfsIOthread;
60 struct task_struct *jfsSyncThread;
61
62 #ifdef CONFIG_JFS_DEBUG
63 int jfsloglevel = JFS_LOGLEVEL_WARN;
64 module_param(jfsloglevel, int, 0644);
65 MODULE_PARM_DESC(jfsloglevel, "Specify JFS loglevel (0, 1 or 2)");
66 #endif
67
68 static void jfs_handle_error(struct super_block *sb)
69 {
70         struct jfs_sb_info *sbi = JFS_SBI(sb);
71
72         if (sb->s_flags & MS_RDONLY)
73                 return;
74
75         updateSuper(sb, FM_DIRTY);
76
77         if (sbi->flag & JFS_ERR_PANIC)
78                 panic("JFS (device %s): panic forced after error\n",
79                         sb->s_id);
80         else if (sbi->flag & JFS_ERR_REMOUNT_RO) {
81                 jfs_err("ERROR: (device %s): remounting filesystem "
82                         "as read-only\n",
83                         sb->s_id);
84                 sb->s_flags |= MS_RDONLY;
85         } 
86
87         /* nothing is done for continue beyond marking the superblock dirty */
88 }
89
90 void jfs_error(struct super_block *sb, const char * function, ...)
91 {
92         static char error_buf[256];
93         va_list args;
94
95         va_start(args, function);
96         vsprintf(error_buf, function, args);
97         va_end(args);
98
99         printk(KERN_ERR "ERROR: (device %s): %s\n", sb->s_id, error_buf);
100
101         jfs_handle_error(sb);
102 }
103
104 static struct inode *jfs_alloc_inode(struct super_block *sb)
105 {
106         struct jfs_inode_info *jfs_inode;
107
108         jfs_inode = kmem_cache_alloc(jfs_inode_cachep, GFP_NOFS);
109         if (!jfs_inode)
110                 return NULL;
111         return &jfs_inode->vfs_inode;
112 }
113
114 static void jfs_destroy_inode(struct inode *inode)
115 {
116         struct jfs_inode_info *ji = JFS_IP(inode);
117
118         BUG_ON(!list_empty(&ji->anon_inode_list));
119
120         spin_lock_irq(&ji->ag_lock);
121         if (ji->active_ag != -1) {
122                 struct bmap *bmap = JFS_SBI(inode->i_sb)->bmap;
123                 atomic_dec(&bmap->db_active[ji->active_ag]);
124                 ji->active_ag = -1;
125         }
126         spin_unlock_irq(&ji->ag_lock);
127
128 #ifdef CONFIG_JFS_POSIX_ACL
129         if (ji->i_acl != JFS_ACL_NOT_CACHED) {
130                 posix_acl_release(ji->i_acl);
131                 ji->i_acl = JFS_ACL_NOT_CACHED;
132         }
133         if (ji->i_default_acl != JFS_ACL_NOT_CACHED) {
134                 posix_acl_release(ji->i_default_acl);
135                 ji->i_default_acl = JFS_ACL_NOT_CACHED;
136         }
137 #endif
138
139         kmem_cache_free(jfs_inode_cachep, ji);
140 }
141
142 static int jfs_statfs(struct dentry *dentry, struct kstatfs *buf)
143 {
144         struct jfs_sb_info *sbi = JFS_SBI(dentry->d_sb);
145         s64 maxinodes;
146         struct inomap *imap = JFS_IP(sbi->ipimap)->i_imap;
147
148         jfs_info("In jfs_statfs");
149         buf->f_type = JFS_SUPER_MAGIC;
150         buf->f_bsize = sbi->bsize;
151         buf->f_blocks = sbi->bmap->db_mapsize;
152         buf->f_bfree = sbi->bmap->db_nfree;
153         buf->f_bavail = sbi->bmap->db_nfree;
154         /*
155          * If we really return the number of allocated & free inodes, some
156          * applications will fail because they won't see enough free inodes.
157          * We'll try to calculate some guess as to how may inodes we can
158          * really allocate
159          *
160          * buf->f_files = atomic_read(&imap->im_numinos);
161          * buf->f_ffree = atomic_read(&imap->im_numfree);
162          */
163         maxinodes = min((s64) atomic_read(&imap->im_numinos) +
164                         ((sbi->bmap->db_nfree >> imap->im_l2nbperiext)
165                          << L2INOSPEREXT), (s64) 0xffffffffLL);
166         buf->f_files = maxinodes;
167         buf->f_ffree = maxinodes - (atomic_read(&imap->im_numinos) -
168                                     atomic_read(&imap->im_numfree));
169
170         buf->f_namelen = JFS_NAME_MAX;
171         return 0;
172 }
173
174 static void jfs_put_super(struct super_block *sb)
175 {
176         struct jfs_sb_info *sbi = JFS_SBI(sb);
177         int rc;
178
179         jfs_info("In jfs_put_super");
180         rc = jfs_umount(sb);
181         if (rc)
182                 jfs_err("jfs_umount failed with return code %d", rc);
183         if (sbi->nls_tab)
184                 unload_nls(sbi->nls_tab);
185         sbi->nls_tab = NULL;
186
187         truncate_inode_pages(sbi->direct_inode->i_mapping, 0);
188         iput(sbi->direct_inode);
189         sbi->direct_inode = NULL;
190
191         kfree(sbi);
192 }
193
194 enum {
195         Opt_integrity, Opt_nointegrity, Opt_iocharset, Opt_resize,
196         Opt_resize_nosize, Opt_errors, Opt_ignore, Opt_err, Opt_quota,
197         Opt_usrquota, Opt_grpquota, Opt_uid, Opt_gid, Opt_umask
198 };
199
200 static match_table_t tokens = {
201         {Opt_integrity, "integrity"},
202         {Opt_nointegrity, "nointegrity"},
203         {Opt_iocharset, "iocharset=%s"},
204         {Opt_resize, "resize=%u"},
205         {Opt_resize_nosize, "resize"},
206         {Opt_errors, "errors=%s"},
207         {Opt_ignore, "noquota"},
208         {Opt_ignore, "quota"},
209         {Opt_usrquota, "usrquota"},
210         {Opt_grpquota, "grpquota"},
211         {Opt_uid, "uid=%u"},
212         {Opt_gid, "gid=%u"},
213         {Opt_umask, "umask=%u"},
214         {Opt_err, NULL}
215 };
216
217 static int parse_options(char *options, struct super_block *sb, s64 *newLVSize,
218                          int *flag)
219 {
220         void *nls_map = (void *)-1;     /* -1: no change;  NULL: none */
221         char *p;
222         struct jfs_sb_info *sbi = JFS_SBI(sb);
223
224         *newLVSize = 0;
225
226         if (!options)
227                 return 1;
228
229         while ((p = strsep(&options, ",")) != NULL) {
230                 substring_t args[MAX_OPT_ARGS];
231                 int token;
232                 if (!*p)
233                         continue;
234
235                 token = match_token(p, tokens, args);
236                 switch (token) {
237                 case Opt_integrity:
238                         *flag &= ~JFS_NOINTEGRITY;
239                         break;
240                 case Opt_nointegrity:
241                         *flag |= JFS_NOINTEGRITY;
242                         break;
243                 case Opt_ignore:
244                         /* Silently ignore the quota options */
245                         /* Don't do anything ;-) */
246                         break;
247                 case Opt_iocharset:
248                         if (nls_map && nls_map != (void *) -1)
249                                 unload_nls(nls_map);
250                         if (!strcmp(args[0].from, "none"))
251                                 nls_map = NULL;
252                         else {
253                                 nls_map = load_nls(args[0].from);
254                                 if (!nls_map) {
255                                         printk(KERN_ERR
256                                                "JFS: charset not found\n");
257                                         goto cleanup;
258                                 }
259                         }
260                         break;
261                 case Opt_resize:
262                 {
263                         char *resize = args[0].from;
264                         *newLVSize = simple_strtoull(resize, &resize, 0);
265                         break;
266                 }
267                 case Opt_resize_nosize:
268                 {
269                         *newLVSize = sb->s_bdev->bd_inode->i_size >>
270                                 sb->s_blocksize_bits;
271                         if (*newLVSize == 0)
272                                 printk(KERN_ERR
273                                        "JFS: Cannot determine volume size\n");
274                         break;
275                 }
276                 case Opt_errors:
277                 {
278                         char *errors = args[0].from;
279                         if (!errors || !*errors)
280                                 goto cleanup;
281                         if (!strcmp(errors, "continue")) {
282                                 *flag &= ~JFS_ERR_REMOUNT_RO;
283                                 *flag &= ~JFS_ERR_PANIC;
284                                 *flag |= JFS_ERR_CONTINUE;
285                         } else if (!strcmp(errors, "remount-ro")) {
286                                 *flag &= ~JFS_ERR_CONTINUE;
287                                 *flag &= ~JFS_ERR_PANIC;
288                                 *flag |= JFS_ERR_REMOUNT_RO;
289                         } else if (!strcmp(errors, "panic")) {
290                                 *flag &= ~JFS_ERR_CONTINUE;
291                                 *flag &= ~JFS_ERR_REMOUNT_RO;
292                                 *flag |= JFS_ERR_PANIC;
293                         } else {
294                                 printk(KERN_ERR
295                                        "JFS: %s is an invalid error handler\n",
296                                        errors);
297                                 goto cleanup;
298                         }
299                         break;
300                 }
301
302 #if defined(CONFIG_QUOTA)
303                 case Opt_quota:
304                 case Opt_usrquota:
305                         *flag |= JFS_USRQUOTA;
306                         break;
307                 case Opt_grpquota:
308                         *flag |= JFS_GRPQUOTA;
309                         break;
310 #else
311                 case Opt_usrquota:
312                 case Opt_grpquota:
313                 case Opt_quota:
314                         printk(KERN_ERR
315                                "JFS: quota operations not supported\n");
316                         break;
317 #endif
318                 case Opt_uid:
319                 {
320                         char *uid = args[0].from;
321                         sbi->uid = simple_strtoul(uid, &uid, 0);
322                         break;
323                 }
324                 case Opt_gid:
325                 {
326                         char *gid = args[0].from;
327                         sbi->gid = simple_strtoul(gid, &gid, 0);
328                         break;
329                 }
330                 case Opt_umask:
331                 {
332                         char *umask = args[0].from;
333                         sbi->umask = simple_strtoul(umask, &umask, 8);
334                         if (sbi->umask & ~0777) {
335                                 printk(KERN_ERR
336                                        "JFS: Invalid value of umask\n");
337                                 goto cleanup;
338                         }
339                         break;
340                 }
341                 default:
342                         printk("jfs: Unrecognized mount option \"%s\" "
343                                         " or missing value\n", p);
344                         goto cleanup;
345                 }
346         }
347
348         if (nls_map != (void *) -1) {
349                 /* Discard old (if remount) */
350                 if (sbi->nls_tab)
351                         unload_nls(sbi->nls_tab);
352                 sbi->nls_tab = nls_map;
353         }
354         return 1;
355
356 cleanup:
357         if (nls_map && nls_map != (void *) -1)
358                 unload_nls(nls_map);
359         return 0;
360 }
361
362 static int jfs_remount(struct super_block *sb, int *flags, char *data)
363 {
364         s64 newLVSize = 0;
365         int rc = 0;
366         int flag = JFS_SBI(sb)->flag;
367
368         if (!parse_options(data, sb, &newLVSize, &flag)) {
369                 return -EINVAL;
370         }
371         if (newLVSize) {
372                 if (sb->s_flags & MS_RDONLY) {
373                         printk(KERN_ERR
374                   "JFS: resize requires volume to be mounted read-write\n");
375                         return -EROFS;
376                 }
377                 rc = jfs_extendfs(sb, newLVSize, 0);
378                 if (rc)
379                         return rc;
380         }
381
382         if ((sb->s_flags & MS_RDONLY) && !(*flags & MS_RDONLY)) {
383                 /*
384                  * Invalidate any previously read metadata.  fsck may have
385                  * changed the on-disk data since we mounted r/o
386                  */
387                 truncate_inode_pages(JFS_SBI(sb)->direct_inode->i_mapping, 0);
388
389                 JFS_SBI(sb)->flag = flag;
390                 return jfs_mount_rw(sb, 1);
391         }
392         if ((!(sb->s_flags & MS_RDONLY)) && (*flags & MS_RDONLY)) {
393                 rc = jfs_umount_rw(sb);
394                 JFS_SBI(sb)->flag = flag;
395                 return rc;
396         }
397         if ((JFS_SBI(sb)->flag & JFS_NOINTEGRITY) != (flag & JFS_NOINTEGRITY))
398                 if (!(sb->s_flags & MS_RDONLY)) {
399                         rc = jfs_umount_rw(sb);
400                         if (rc)
401                                 return rc;
402                         JFS_SBI(sb)->flag = flag;
403                         return jfs_mount_rw(sb, 1);
404                 }
405         JFS_SBI(sb)->flag = flag;
406
407         return 0;
408 }
409
410 static int jfs_fill_super(struct super_block *sb, void *data, int silent)
411 {
412         struct jfs_sb_info *sbi;
413         struct inode *inode;
414         int rc;
415         s64 newLVSize = 0;
416         int flag;
417
418         jfs_info("In jfs_read_super: s_flags=0x%lx", sb->s_flags);
419
420         if (!new_valid_dev(sb->s_bdev->bd_dev))
421                 return -EOVERFLOW;
422
423         sbi = kzalloc(sizeof (struct jfs_sb_info), GFP_KERNEL);
424         if (!sbi)
425                 return -ENOSPC;
426         sb->s_fs_info = sbi;
427         sbi->sb = sb;
428         sbi->uid = sbi->gid = sbi->umask = -1;
429
430         /* initialize the mount flag and determine the default error handler */
431         flag = JFS_ERR_REMOUNT_RO;
432
433         if (!parse_options((char *) data, sb, &newLVSize, &flag)) {
434                 kfree(sbi);
435                 return -EINVAL;
436         }
437         sbi->flag = flag;
438
439 #ifdef CONFIG_JFS_POSIX_ACL
440         sb->s_flags |= MS_POSIXACL;
441 #endif
442
443         if (newLVSize) {
444                 printk(KERN_ERR "resize option for remount only\n");
445                 return -EINVAL;
446         }
447
448         /*
449          * Initialize blocksize to 4K.
450          */
451         sb_set_blocksize(sb, PSIZE);
452
453         /*
454          * Set method vectors.
455          */
456         sb->s_op = &jfs_super_operations;
457         sb->s_export_op = &jfs_export_operations;
458
459         /*
460          * Initialize direct-mapping inode/address-space
461          */
462         inode = new_inode(sb);
463         if (inode == NULL)
464                 goto out_kfree;
465         inode->i_ino = 0;
466         inode->i_nlink = 1;
467         inode->i_size = sb->s_bdev->bd_inode->i_size;
468         inode->i_mapping->a_ops = &jfs_metapage_aops;
469         insert_inode_hash(inode);
470         mapping_set_gfp_mask(inode->i_mapping, GFP_NOFS);
471
472         sbi->direct_inode = inode;
473
474         rc = jfs_mount(sb);
475         if (rc) {
476                 if (!silent) {
477                         jfs_err("jfs_mount failed w/return code = %d", rc);
478                 }
479                 goto out_mount_failed;
480         }
481         if (sb->s_flags & MS_RDONLY)
482                 sbi->log = NULL;
483         else {
484                 rc = jfs_mount_rw(sb, 0);
485                 if (rc) {
486                         if (!silent) {
487                                 jfs_err("jfs_mount_rw failed, return code = %d",
488                                         rc);
489                         }
490                         goto out_no_rw;
491                 }
492         }
493
494         sb->s_magic = JFS_SUPER_MAGIC;
495
496         inode = iget(sb, ROOT_I);
497         if (!inode || is_bad_inode(inode))
498                 goto out_no_root;
499         sb->s_root = d_alloc_root(inode);
500         if (!sb->s_root)
501                 goto out_no_root;
502
503         if (sbi->mntflag & JFS_OS2)
504                 sb->s_root->d_op = &jfs_ci_dentry_operations;
505
506         /* logical blocks are represented by 40 bits in pxd_t, etc. */
507         sb->s_maxbytes = ((u64) sb->s_blocksize) << 40;
508 #if BITS_PER_LONG == 32
509         /*
510          * Page cache is indexed by long.
511          * I would use MAX_LFS_FILESIZE, but it's only half as big
512          */
513         sb->s_maxbytes = min(((u64) PAGE_CACHE_SIZE << 32) - 1, sb->s_maxbytes);
514 #endif
515         sb->s_time_gran = 1;
516         return 0;
517
518 out_no_root:
519         jfs_err("jfs_read_super: get root inode failed");
520         if (inode)
521                 iput(inode);
522
523 out_no_rw:
524         rc = jfs_umount(sb);
525         if (rc) {
526                 jfs_err("jfs_umount failed with return code %d", rc);
527         }
528 out_mount_failed:
529         filemap_write_and_wait(sbi->direct_inode->i_mapping);
530         truncate_inode_pages(sbi->direct_inode->i_mapping, 0);
531         make_bad_inode(sbi->direct_inode);
532         iput(sbi->direct_inode);
533         sbi->direct_inode = NULL;
534 out_kfree:
535         if (sbi->nls_tab)
536                 unload_nls(sbi->nls_tab);
537         kfree(sbi);
538         return -EINVAL;
539 }
540
541 static void jfs_write_super_lockfs(struct super_block *sb)
542 {
543         struct jfs_sb_info *sbi = JFS_SBI(sb);
544         struct jfs_log *log = sbi->log;
545
546         if (!(sb->s_flags & MS_RDONLY)) {
547                 txQuiesce(sb);
548                 lmLogShutdown(log);
549                 updateSuper(sb, FM_CLEAN);
550         }
551 }
552
553 static void jfs_unlockfs(struct super_block *sb)
554 {
555         struct jfs_sb_info *sbi = JFS_SBI(sb);
556         struct jfs_log *log = sbi->log;
557         int rc = 0;
558
559         if (!(sb->s_flags & MS_RDONLY)) {
560                 updateSuper(sb, FM_MOUNT);
561                 if ((rc = lmLogInit(log)))
562                         jfs_err("jfs_unlock failed with return code %d", rc);
563                 else
564                         txResume(sb);
565         }
566 }
567
568 static int jfs_get_sb(struct file_system_type *fs_type,
569         int flags, const char *dev_name, void *data, struct vfsmount *mnt)
570 {
571         return get_sb_bdev(fs_type, flags, dev_name, data, jfs_fill_super,
572                            mnt);
573 }
574
575 static int jfs_sync_fs(struct super_block *sb, int wait)
576 {
577         struct jfs_log *log = JFS_SBI(sb)->log;
578
579         /* log == NULL indicates read-only mount */
580         if (log) {
581                 jfs_flush_journal(log, wait);
582                 jfs_syncpt(log, 0);
583         }
584
585         return 0;
586 }
587
588 static int jfs_show_options(struct seq_file *seq, struct vfsmount *vfs)
589 {
590         struct jfs_sb_info *sbi = JFS_SBI(vfs->mnt_sb);
591
592         if (sbi->uid != -1)
593                 seq_printf(seq, ",uid=%d", sbi->uid);
594         if (sbi->gid != -1)
595                 seq_printf(seq, ",gid=%d", sbi->gid);
596         if (sbi->umask != -1)
597                 seq_printf(seq, ",umask=%03o", sbi->umask);
598         if (sbi->flag & JFS_NOINTEGRITY)
599                 seq_puts(seq, ",nointegrity");
600
601 #if defined(CONFIG_QUOTA)
602         if (sbi->flag & JFS_USRQUOTA)
603                 seq_puts(seq, ",usrquota");
604
605         if (sbi->flag & JFS_GRPQUOTA)
606                 seq_puts(seq, ",grpquota");
607 #endif
608
609         return 0;
610 }
611
612 static struct super_operations jfs_super_operations = {
613         .alloc_inode    = jfs_alloc_inode,
614         .destroy_inode  = jfs_destroy_inode,
615         .read_inode     = jfs_read_inode,
616         .dirty_inode    = jfs_dirty_inode,
617         .write_inode    = jfs_write_inode,
618         .delete_inode   = jfs_delete_inode,
619         .put_super      = jfs_put_super,
620         .sync_fs        = jfs_sync_fs,
621         .write_super_lockfs = jfs_write_super_lockfs,
622         .unlockfs       = jfs_unlockfs,
623         .statfs         = jfs_statfs,
624         .remount_fs     = jfs_remount,
625         .show_options   = jfs_show_options
626 };
627
628 static struct export_operations jfs_export_operations = {
629         .get_parent     = jfs_get_parent,
630 };
631
632 static struct file_system_type jfs_fs_type = {
633         .owner          = THIS_MODULE,
634         .name           = "jfs",
635         .get_sb         = jfs_get_sb,
636         .kill_sb        = kill_block_super,
637         .fs_flags       = FS_REQUIRES_DEV,
638 };
639
640 static void init_once(void *foo, kmem_cache_t * cachep, unsigned long flags)
641 {
642         struct jfs_inode_info *jfs_ip = (struct jfs_inode_info *) foo;
643
644         if ((flags & (SLAB_CTOR_VERIFY | SLAB_CTOR_CONSTRUCTOR)) ==
645             SLAB_CTOR_CONSTRUCTOR) {
646                 memset(jfs_ip, 0, sizeof(struct jfs_inode_info));
647                 INIT_LIST_HEAD(&jfs_ip->anon_inode_list);
648                 init_rwsem(&jfs_ip->rdwrlock);
649                 mutex_init(&jfs_ip->commit_mutex);
650                 init_rwsem(&jfs_ip->xattr_sem);
651                 spin_lock_init(&jfs_ip->ag_lock);
652                 jfs_ip->active_ag = -1;
653 #ifdef CONFIG_JFS_POSIX_ACL
654                 jfs_ip->i_acl = JFS_ACL_NOT_CACHED;
655                 jfs_ip->i_default_acl = JFS_ACL_NOT_CACHED;
656 #endif
657                 inode_init_once(&jfs_ip->vfs_inode);
658         }
659 }
660
661 static int __init init_jfs_fs(void)
662 {
663         int i;
664         int rc;
665
666         jfs_inode_cachep =
667             kmem_cache_create("jfs_ip", sizeof(struct jfs_inode_info), 0, 
668                             SLAB_RECLAIM_ACCOUNT|SLAB_MEM_SPREAD,
669                             init_once, NULL);
670         if (jfs_inode_cachep == NULL)
671                 return -ENOMEM;
672
673         /*
674          * Metapage initialization
675          */
676         rc = metapage_init();
677         if (rc) {
678                 jfs_err("metapage_init failed w/rc = %d", rc);
679                 goto free_slab;
680         }
681
682         /*
683          * Transaction Manager initialization
684          */
685         rc = txInit();
686         if (rc) {
687                 jfs_err("txInit failed w/rc = %d", rc);
688                 goto free_metapage;
689         }
690
691         /*
692          * I/O completion thread (endio)
693          */
694         jfsIOthread = kthread_run(jfsIOWait, NULL, "jfsIO");
695         if (IS_ERR(jfsIOthread)) {
696                 rc = PTR_ERR(jfsIOthread);
697                 jfs_err("init_jfs_fs: fork failed w/rc = %d", rc);
698                 goto end_txmngr;
699         }
700
701         if (commit_threads < 1)
702                 commit_threads = num_online_cpus();
703         if (commit_threads > MAX_COMMIT_THREADS)
704                 commit_threads = MAX_COMMIT_THREADS;
705
706         for (i = 0; i < commit_threads; i++) {
707                 jfsCommitThread[i] = kthread_run(jfs_lazycommit, NULL, "jfsCommit");
708                 if (IS_ERR(jfsCommitThread[i])) {
709                         rc = PTR_ERR(jfsCommitThread[i]);
710                         jfs_err("init_jfs_fs: fork failed w/rc = %d", rc);
711                         commit_threads = i;
712                         goto kill_committask;
713                 }
714         }
715
716         jfsSyncThread = kthread_run(jfs_sync, NULL, "jfsSync");
717         if (IS_ERR(jfsSyncThread)) {
718                 rc = PTR_ERR(jfsSyncThread);
719                 jfs_err("init_jfs_fs: fork failed w/rc = %d", rc);
720                 goto kill_committask;
721         }
722
723 #ifdef PROC_FS_JFS
724         jfs_proc_init();
725 #endif
726
727         return register_filesystem(&jfs_fs_type);
728
729 kill_committask:
730         for (i = 0; i < commit_threads; i++)
731                 kthread_stop(jfsCommitThread[i]);
732         kthread_stop(jfsIOthread);
733 end_txmngr:
734         txExit();
735 free_metapage:
736         metapage_exit();
737 free_slab:
738         kmem_cache_destroy(jfs_inode_cachep);
739         return rc;
740 }
741
742 static void __exit exit_jfs_fs(void)
743 {
744         int i;
745
746         jfs_info("exit_jfs_fs called");
747
748         txExit();
749         metapage_exit();
750
751         kthread_stop(jfsIOthread);
752         for (i = 0; i < commit_threads; i++)
753                 kthread_stop(jfsCommitThread[i]);
754         kthread_stop(jfsSyncThread);
755 #ifdef PROC_FS_JFS
756         jfs_proc_clean();
757 #endif
758         unregister_filesystem(&jfs_fs_type);
759         kmem_cache_destroy(jfs_inode_cachep);
760 }
761
762 module_init(init_jfs_fs)
763 module_exit(exit_jfs_fs)