super.c 18 KB

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