super.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:50k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  *  linux/fs/ext3/super.c
  3.  *
  4.  * Copyright (C) 1992, 1993, 1994, 1995
  5.  * Remy Card (card@masi.ibp.fr)
  6.  * Laboratoire MASI - Institut Blaise Pascal
  7.  * Universite Pierre et Marie Curie (Paris VI)
  8.  *
  9.  *  from
  10.  *
  11.  *  linux/fs/minix/inode.c
  12.  *
  13.  *  Copyright (C) 1991, 1992  Linus Torvalds
  14.  *
  15.  *  Big-endian to little-endian byte-swapping/bitmaps by
  16.  *        David S. Miller (davem@caip.rutgers.edu), 1995
  17.  */
  18. #include <linux/config.h>
  19. #include <linux/module.h>
  20. #include <linux/string.h>
  21. #include <linux/fs.h>
  22. #include <linux/sched.h>
  23. #include <linux/jbd.h>
  24. #include <linux/ext3_fs.h>
  25. #include <linux/ext3_jbd.h>
  26. #include <linux/slab.h>
  27. #include <linux/init.h>
  28. #include <linux/locks.h>
  29. #include <linux/blkdev.h>
  30. #include <linux/smp_lock.h>
  31. #include <linux/random.h>
  32. #include <asm/uaccess.h>
  33. #ifdef CONFIG_JBD_DEBUG
  34. static int ext3_ro_after; /* Make fs read-only after this many jiffies */
  35. #endif
  36. static int ext3_load_journal(struct super_block *, struct ext3_super_block *);
  37. static int ext3_create_journal(struct super_block *, struct ext3_super_block *,
  38.        int);
  39. static void ext3_commit_super (struct super_block * sb,
  40.        struct ext3_super_block * es,
  41.        int sync);
  42. static void ext3_mark_recovery_complete(struct super_block * sb,
  43. struct ext3_super_block * es);
  44. static void ext3_clear_journal_err(struct super_block * sb,
  45.    struct ext3_super_block * es);
  46. #ifdef CONFIG_JBD_DEBUG
  47. int journal_no_write[2];
  48. /*
  49.  * Debug code for turning filesystems "read-only" after a specified
  50.  * amount of time.  This is for crash/recovery testing.
  51.  */
  52. static void make_rdonly(kdev_t dev, int *no_write)
  53. {
  54. if (dev) {
  55. printk(KERN_WARNING "Turning device %s read-onlyn", 
  56.        bdevname(dev));
  57. *no_write = 0xdead0000 + dev;
  58. }
  59. }
  60. static void turn_fs_readonly(unsigned long arg)
  61. {
  62. struct super_block *sb = (struct super_block *)arg;
  63. make_rdonly(sb->s_dev, &journal_no_write[0]);
  64. make_rdonly(EXT3_SB(sb)->s_journal->j_dev, &journal_no_write[1]);
  65. wake_up(&EXT3_SB(sb)->ro_wait_queue);
  66. }
  67. static void setup_ro_after(struct super_block *sb)
  68. {
  69. struct ext3_sb_info *sbi = EXT3_SB(sb);
  70. init_timer(&sbi->turn_ro_timer);
  71. if (ext3_ro_after) {
  72. printk(KERN_DEBUG "fs will go read-only in %d jiffiesn",
  73.        ext3_ro_after);
  74. init_waitqueue_head(&sbi->ro_wait_queue);
  75. journal_no_write[0] = 0;
  76. journal_no_write[1] = 0;
  77. sbi->turn_ro_timer.function = turn_fs_readonly;
  78. sbi->turn_ro_timer.data = (unsigned long)sb;
  79. sbi->turn_ro_timer.expires = jiffies + ext3_ro_after;
  80. ext3_ro_after = 0;
  81. add_timer(&sbi->turn_ro_timer);
  82. }
  83. }
  84. static void clear_ro_after(struct super_block *sb)
  85. {
  86. del_timer_sync(&EXT3_SB(sb)->turn_ro_timer);
  87. journal_no_write[0] = 0;
  88. journal_no_write[1] = 0;
  89. ext3_ro_after = 0;
  90. }
  91. #else
  92. #define setup_ro_after(sb) do {} while (0)
  93. #define clear_ro_after(sb) do {} while (0)
  94. #endif
  95. static char error_buf[1024];
  96. /* Determine the appropriate response to ext3_error on a given filesystem */
  97. static int ext3_error_behaviour(struct super_block *sb)
  98. {
  99. /* First check for mount-time options */
  100. if (test_opt (sb, ERRORS_PANIC))
  101. return EXT3_ERRORS_PANIC;
  102. if (test_opt (sb, ERRORS_RO))
  103. return EXT3_ERRORS_RO;
  104. if (test_opt (sb, ERRORS_CONT))
  105. return EXT3_ERRORS_CONTINUE;
  106. /* If no overrides were specified on the mount, then fall back
  107.  * to the default behaviour set in the filesystem's superblock
  108.  * on disk. */
  109. switch (le16_to_cpu(sb->u.ext3_sb.s_es->s_errors)) {
  110. case EXT3_ERRORS_PANIC:
  111. return EXT3_ERRORS_PANIC;
  112. case EXT3_ERRORS_RO:
  113. return EXT3_ERRORS_RO;
  114. default:
  115. break;
  116. }
  117. return EXT3_ERRORS_CONTINUE;
  118. }
  119. /* Deal with the reporting of failure conditions on a filesystem such as
  120.  * inconsistencies detected or read IO failures.
  121.  *
  122.  * On ext2, we can store the error state of the filesystem in the
  123.  * superblock.  That is not possible on ext3, because we may have other
  124.  * write ordering constraints on the superblock which prevent us from
  125.  * writing it out straight away; and given that the journal is about to
  126.  * be aborted, we can't rely on the current, or future, transactions to
  127.  * write out the superblock safely.
  128.  *
  129.  * We'll just use the journal_abort() error code to record an error in
  130.  * the journal instead.  On recovery, the journal will compain about
  131.  * that error until we've noted it down and cleared it.
  132.  */
  133. static void ext3_handle_error(struct super_block *sb)
  134. {
  135. struct ext3_super_block *es = EXT3_SB(sb)->s_es;
  136. EXT3_SB(sb)->s_mount_state |= EXT3_ERROR_FS;
  137. es->s_state |= cpu_to_le32(EXT3_ERROR_FS);
  138. if (sb->s_flags & MS_RDONLY)
  139. return;
  140. if (ext3_error_behaviour(sb) != EXT3_ERRORS_CONTINUE) {
  141. EXT3_SB(sb)->s_mount_opt |= EXT3_MOUNT_ABORT;
  142. journal_abort(EXT3_SB(sb)->s_journal, -EIO);
  143. }
  144. if (ext3_error_behaviour(sb) == EXT3_ERRORS_PANIC) 
  145. panic ("EXT3-fs (device %s): panic forced after errorn",
  146.        bdevname(sb->s_dev));
  147. if (ext3_error_behaviour(sb) == EXT3_ERRORS_RO) {
  148. printk (KERN_CRIT "Remounting filesystem read-onlyn");
  149. sb->s_flags |= MS_RDONLY;
  150. }
  151. ext3_commit_super(sb, es, 1);
  152. }
  153. void ext3_error (struct super_block * sb, const char * function,
  154.  const char * fmt, ...)
  155. {
  156. va_list args;
  157. va_start (args, fmt);
  158. vsprintf (error_buf, fmt, args);
  159. va_end (args);
  160. printk (KERN_CRIT "EXT3-fs error (device %s): %s: %sn",
  161. bdevname(sb->s_dev), function, error_buf);
  162. ext3_handle_error(sb);
  163. }
  164. const char *ext3_decode_error(struct super_block * sb, int errno, char nbuf[16])
  165. {
  166. char *errstr = NULL;
  167. switch (errno) {
  168. case -EIO:
  169. errstr = "IO failure";
  170. break;
  171. case -ENOMEM:
  172. errstr = "Out of memory";
  173. break;
  174. case -EROFS:
  175. if (!sb || EXT3_SB(sb)->s_journal->j_flags & JFS_ABORT)
  176. errstr = "Journal has aborted";
  177. else
  178. errstr = "Readonly filesystem";
  179. break;
  180. default:
  181. /* If the caller passed in an extra buffer for unknown
  182.  * errors, textualise them now.  Else we just return
  183.  * NULL. */
  184. if (nbuf) {
  185. /* Check for truncated error codes... */
  186. if (snprintf(nbuf, 16, "error %d", -errno) >= 0)
  187. errstr = nbuf;
  188. }
  189. break;
  190. }
  191. return errstr;
  192. }
  193. /* __ext3_std_error decodes expected errors from journaling functions
  194.  * automatically and invokes the appropriate error response.  */
  195. void __ext3_std_error (struct super_block * sb, const char * function,
  196.        int errno)
  197. {
  198. char nbuf[16];
  199. const char *errstr = ext3_decode_error(sb, errno, nbuf);
  200. printk (KERN_CRIT "EXT3-fs error (device %s) in %s: %sn",
  201. bdevname(sb->s_dev), function, errstr);
  202. ext3_handle_error(sb);
  203. }
  204. /*
  205.  * ext3_abort is a much stronger failure handler than ext3_error.  The
  206.  * abort function may be used to deal with unrecoverable failures such
  207.  * as journal IO errors or ENOMEM at a critical moment in log management.
  208.  *
  209.  * We unconditionally force the filesystem into an ABORT|READONLY state,
  210.  * unless the error response on the fs has been set to panic in which
  211.  * case we take the easy way out and panic immediately.
  212.  */
  213. void ext3_abort (struct super_block * sb, const char * function,
  214.  const char * fmt, ...)
  215. {
  216. va_list args;
  217. printk (KERN_CRIT "ext3_abort called.n");
  218. va_start (args, fmt);
  219. vsprintf (error_buf, fmt, args);
  220. va_end (args);
  221. if (ext3_error_behaviour(sb) == EXT3_ERRORS_PANIC)
  222. panic ("EXT3-fs panic (device %s): %s: %sn",
  223.        bdevname(sb->s_dev), function, error_buf);
  224. printk (KERN_CRIT "EXT3-fs abort (device %s): %s: %sn",
  225. bdevname(sb->s_dev), function, error_buf);
  226. if (sb->s_flags & MS_RDONLY)
  227. return;
  228. printk (KERN_CRIT "Remounting filesystem read-onlyn");
  229. sb->u.ext3_sb.s_mount_state |= EXT3_ERROR_FS;
  230. sb->s_flags |= MS_RDONLY;
  231. sb->u.ext3_sb.s_mount_opt |= EXT3_MOUNT_ABORT;
  232. journal_abort(EXT3_SB(sb)->s_journal, -EIO);
  233. }
  234. /* Deal with the reporting of failure conditions while running, such as
  235.  * inconsistencies in operation or invalid system states.
  236.  *
  237.  * Use ext3_error() for cases of invalid filesystem states, as that will
  238.  * record an error on disk and force a filesystem check on the next boot.
  239.  */
  240. NORET_TYPE void ext3_panic (struct super_block * sb, const char * function,
  241.     const char * fmt, ...)
  242. {
  243. va_list args;
  244. va_start (args, fmt);
  245. vsprintf (error_buf, fmt, args);
  246. va_end (args);
  247. /* this is to prevent panic from syncing this filesystem */
  248. /* AKPM: is this sufficient? */
  249. sb->s_flags |= MS_RDONLY;
  250. panic ("EXT3-fs panic (device %s): %s: %sn",
  251.        bdevname(sb->s_dev), function, error_buf);
  252. }
  253. void ext3_warning (struct super_block * sb, const char * function,
  254.    const char * fmt, ...)
  255. {
  256. va_list args;
  257. va_start (args, fmt);
  258. vsprintf (error_buf, fmt, args);
  259. va_end (args);
  260. printk (KERN_WARNING "EXT3-fs warning (device %s): %s: %sn",
  261. bdevname(sb->s_dev), function, error_buf);
  262. }
  263. void ext3_update_dynamic_rev(struct super_block *sb)
  264. {
  265. struct ext3_super_block *es = EXT3_SB(sb)->s_es;
  266. if (le32_to_cpu(es->s_rev_level) > EXT3_GOOD_OLD_REV)
  267. return;
  268. ext3_warning(sb, __FUNCTION__,
  269.      "updating to rev %d because of new feature flag, "
  270.      "running e2fsck is recommended",
  271.      EXT3_DYNAMIC_REV);
  272. es->s_first_ino = cpu_to_le32(EXT3_GOOD_OLD_FIRST_INO);
  273. es->s_inode_size = cpu_to_le16(EXT3_GOOD_OLD_INODE_SIZE);
  274. es->s_rev_level = cpu_to_le32(EXT3_DYNAMIC_REV);
  275. /* leave es->s_feature_*compat flags alone */
  276. /* es->s_uuid will be set by e2fsck if empty */
  277. /*
  278.  * The rest of the superblock fields should be zero, and if not it
  279.  * means they are likely already in use, so leave them alone.  We
  280.  * can leave it up to e2fsck to clean up any inconsistencies there.
  281.  */
  282. }
  283. /*
  284.  * Open the external journal device
  285.  */
  286. static struct block_device *ext3_blkdev_get(kdev_t dev)
  287. {
  288. struct block_device *bdev;
  289. int err = -ENODEV;
  290. bdev = bdget(kdev_t_to_nr(dev));
  291. if (bdev == NULL)
  292. goto fail;
  293. err = blkdev_get(bdev, FMODE_READ|FMODE_WRITE, 0, BDEV_FS);
  294. if (err < 0)
  295. goto fail;
  296. return bdev;
  297. fail:
  298. printk(KERN_ERR "EXT3: failed to open journal device %s: %dn",
  299. bdevname(dev), err);
  300. return NULL;
  301. }
  302. /*
  303.  * Release the journal device
  304.  */
  305. static int ext3_blkdev_put(struct block_device *bdev)
  306. {
  307. return blkdev_put(bdev, BDEV_FS);
  308. }
  309. static int ext3_blkdev_remove(struct ext3_sb_info *sbi)
  310. {
  311. struct block_device *bdev;
  312. int ret = -ENODEV;
  313. bdev = sbi->journal_bdev;
  314. if (bdev) {
  315. ret = ext3_blkdev_put(bdev);
  316. sbi->journal_bdev = 0;
  317. }
  318. return ret;
  319. }
  320. #define orphan_list_entry(l) list_entry((l), struct inode, u.ext3_i.i_orphan)
  321. static void dump_orphan_list(struct super_block *sb, struct ext3_sb_info *sbi)
  322. {
  323. struct list_head *l;
  324. printk(KERN_ERR "sb orphan head is %dn", 
  325.        le32_to_cpu(sbi->s_es->s_last_orphan));
  326. printk(KERN_ERR "sb_info orphan list:n");
  327. list_for_each(l, &sbi->s_orphan) {
  328. struct inode *inode = orphan_list_entry(l);
  329. printk(KERN_ERR "  "
  330.        "inode 0x%04x:%ld at %p: mode %o, nlink %d, next %dn",
  331.        inode->i_dev, inode->i_ino, inode,
  332.        inode->i_mode, inode->i_nlink, 
  333.        le32_to_cpu(NEXT_ORPHAN(inode)));
  334. }
  335. }
  336. void ext3_put_super (struct super_block * sb)
  337. {
  338. struct ext3_sb_info *sbi = EXT3_SB(sb);
  339. struct ext3_super_block *es = sbi->s_es;
  340. kdev_t j_dev = sbi->s_journal->j_dev;
  341. int i;
  342. journal_destroy(sbi->s_journal);
  343. if (!(sb->s_flags & MS_RDONLY)) {
  344. EXT3_CLEAR_INCOMPAT_FEATURE(sb, EXT3_FEATURE_INCOMPAT_RECOVER);
  345. es->s_state = le16_to_cpu(sbi->s_mount_state);
  346. BUFFER_TRACE(sbi->s_sbh, "marking dirty");
  347. mark_buffer_dirty(sbi->s_sbh);
  348. ext3_commit_super(sb, es, 1);
  349. }
  350. for (i = 0; i < sbi->s_gdb_count; i++)
  351. brelse(sbi->s_group_desc[i]);
  352. kfree(sbi->s_group_desc);
  353. for (i = 0; i < EXT3_MAX_GROUP_LOADED; i++)
  354. brelse(sbi->s_inode_bitmap[i]);
  355. for (i = 0; i < EXT3_MAX_GROUP_LOADED; i++)
  356. brelse(sbi->s_block_bitmap[i]);
  357. brelse(sbi->s_sbh);
  358. /* Debugging code just in case the in-memory inode orphan list
  359.  * isn't empty.  The on-disk one can be non-empty if we've
  360.  * detected an error and taken the fs readonly, but the
  361.  * in-memory list had better be clean by this point. */
  362. if (!list_empty(&sbi->s_orphan))
  363. dump_orphan_list(sb, sbi);
  364. J_ASSERT(list_empty(&sbi->s_orphan));
  365. invalidate_buffers(sb->s_dev);
  366. if (j_dev != sb->s_dev) {
  367. /*
  368.  * Invalidate the journal device's buffers.  We don't want them
  369.  * floating about in memory - the physical journal device may
  370.  * hotswapped, and it breaks the `ro-after' testing code.
  371.  */
  372. fsync_no_super(j_dev);
  373. invalidate_buffers(j_dev);
  374. ext3_blkdev_remove(sbi);
  375. }
  376. clear_ro_after(sb);
  377. return;
  378. }
  379. static struct super_operations ext3_sops = {
  380. read_inode: ext3_read_inode, /* BKL held */
  381. write_inode: ext3_write_inode, /* BKL not held.  Don't need */
  382. dirty_inode: ext3_dirty_inode, /* BKL not held.  We take it */
  383. put_inode: ext3_put_inode, /* BKL not held.  Don't need */
  384. delete_inode: ext3_delete_inode, /* BKL not held.  We take it */
  385. put_super: ext3_put_super, /* BKL held */
  386. write_super: ext3_write_super, /* BKL held */
  387. write_super_lockfs: ext3_write_super_lockfs, /* BKL not held. Take it */
  388. unlockfs: ext3_unlockfs, /* BKL not held.  We take it */
  389. statfs: ext3_statfs, /* BKL held */
  390. remount_fs: ext3_remount, /* BKL held */
  391. };
  392. static int want_value(char *value, char *option)
  393. {
  394. if (!value || !*value) {
  395. printk(KERN_NOTICE "EXT3-fs: the %s option needs an argumentn",
  396.        option);
  397. return -1;
  398. }
  399. return 0;
  400. }
  401. static int want_null_value(char *value, char *option)
  402. {
  403. if (*value) {
  404. printk(KERN_NOTICE "EXT3-fs: Invalid %s argument: %sn",
  405.        option, value);
  406. return -1;
  407. }
  408. return 0;
  409. }
  410. static int want_numeric(char *value, char *option, unsigned long *number)
  411. {
  412. if (want_value(value, option))
  413. return -1;
  414. *number = simple_strtoul(value, &value, 0);
  415. if (want_null_value(value, option))
  416. return -1;
  417. return 0;
  418. }
  419. /*
  420.  * This function has been shamelessly adapted from the msdos fs
  421.  */
  422. static int parse_options (char * options, unsigned long * sb_block,
  423.   struct ext3_sb_info *sbi,
  424.   unsigned long * inum,
  425.   int is_remount)
  426. {
  427. unsigned long *mount_options = &sbi->s_mount_opt;
  428. uid_t *resuid = &sbi->s_resuid;
  429. gid_t *resgid = &sbi->s_resgid;
  430. char * this_char;
  431. char * value;
  432. if (!options)
  433. return 1;
  434. for (this_char = strtok (options, ",");
  435.      this_char != NULL;
  436.      this_char = strtok (NULL, ",")) {
  437. if ((value = strchr (this_char, '=')) != NULL)
  438. *value++ = 0;
  439. if (!strcmp (this_char, "bsddf"))
  440. clear_opt (*mount_options, MINIX_DF);
  441. else if (!strcmp (this_char, "nouid32")) {
  442. set_opt (*mount_options, NO_UID32);
  443. }
  444. else if (!strcmp (this_char, "abort"))
  445. set_opt (*mount_options, ABORT);
  446. else if (!strcmp (this_char, "check")) {
  447. if (!value || !*value || !strcmp (value, "none"))
  448. clear_opt (*mount_options, CHECK);
  449. else
  450. #ifdef CONFIG_EXT3_CHECK
  451. set_opt (*mount_options, CHECK);
  452. #else
  453. printk(KERN_ERR 
  454.        "EXT3 Check option not supportedn");
  455. #endif
  456. }
  457. else if (!strcmp (this_char, "debug"))
  458. set_opt (*mount_options, DEBUG);
  459. else if (!strcmp (this_char, "errors")) {
  460. if (want_value(value, "errors"))
  461. return 0;
  462. if (!strcmp (value, "continue")) {
  463. clear_opt (*mount_options, ERRORS_RO);
  464. clear_opt (*mount_options, ERRORS_PANIC);
  465. set_opt (*mount_options, ERRORS_CONT);
  466. }
  467. else if (!strcmp (value, "remount-ro")) {
  468. clear_opt (*mount_options, ERRORS_CONT);
  469. clear_opt (*mount_options, ERRORS_PANIC);
  470. set_opt (*mount_options, ERRORS_RO);
  471. }
  472. else if (!strcmp (value, "panic")) {
  473. clear_opt (*mount_options, ERRORS_CONT);
  474. clear_opt (*mount_options, ERRORS_RO);
  475. set_opt (*mount_options, ERRORS_PANIC);
  476. }
  477. else {
  478. printk (KERN_ERR
  479. "EXT3-fs: Invalid errors option: %sn",
  480. value);
  481. return 0;
  482. }
  483. }
  484. else if (!strcmp (this_char, "grpid") ||
  485.  !strcmp (this_char, "bsdgroups"))
  486. set_opt (*mount_options, GRPID);
  487. else if (!strcmp (this_char, "minixdf"))
  488. set_opt (*mount_options, MINIX_DF);
  489. else if (!strcmp (this_char, "nocheck"))
  490. clear_opt (*mount_options, CHECK);
  491. else if (!strcmp (this_char, "nogrpid") ||
  492.  !strcmp (this_char, "sysvgroups"))
  493. clear_opt (*mount_options, GRPID);
  494. else if (!strcmp (this_char, "resgid")) {
  495. unsigned long v;
  496. if (want_numeric(value, "resgid", &v))
  497. return 0;
  498. *resgid = v;
  499. }
  500. else if (!strcmp (this_char, "resuid")) {
  501. unsigned long v;
  502. if (want_numeric(value, "resuid", &v))
  503. return 0;
  504. *resuid = v;
  505. }
  506. else if (!strcmp (this_char, "sb")) {
  507. if (want_numeric(value, "sb", sb_block))
  508. return 0;
  509. }
  510. #ifdef CONFIG_JBD_DEBUG
  511. else if (!strcmp (this_char, "ro-after")) {
  512. unsigned long v;
  513. if (want_numeric(value, "ro-after", &v))
  514. return 0;
  515. ext3_ro_after = v;
  516. }
  517. #endif
  518. /* Silently ignore the quota options */
  519. else if (!strcmp (this_char, "grpquota")
  520.          || !strcmp (this_char, "noquota")
  521.          || !strcmp (this_char, "quota")
  522.          || !strcmp (this_char, "usrquota"))
  523. /* Don't do anything ;-) */ ;
  524. else if (!strcmp (this_char, "journal")) {
  525. /* @@@ FIXME */
  526. /* Eventually we will want to be able to create
  527.                            a journal file here.  For now, only allow the
  528.                            user to specify an existing inode to be the
  529.                            journal file. */
  530. if (is_remount) {
  531. printk(KERN_ERR "EXT3-fs: cannot specify "
  532.        "journal on remountn");
  533. return 0;
  534. }
  535. if (want_value(value, "journal"))
  536. return 0;
  537. if (!strcmp (value, "update"))
  538. set_opt (*mount_options, UPDATE_JOURNAL);
  539. else if (want_numeric(value, "journal", inum))
  540. return 0;
  541. }
  542. else if (!strcmp (this_char, "noload"))
  543. set_opt (*mount_options, NOLOAD);
  544. else if (!strcmp (this_char, "data")) {
  545. int data_opt = 0;
  546. if (want_value(value, "data"))
  547. return 0;
  548. if (!strcmp (value, "journal"))
  549. data_opt = EXT3_MOUNT_JOURNAL_DATA;
  550. else if (!strcmp (value, "ordered"))
  551. data_opt = EXT3_MOUNT_ORDERED_DATA;
  552. else if (!strcmp (value, "writeback"))
  553. data_opt = EXT3_MOUNT_WRITEBACK_DATA;
  554. else {
  555. printk (KERN_ERR 
  556. "EXT3-fs: Invalid data option: %sn",
  557. value);
  558. return 0;
  559. }
  560. if (is_remount) {
  561. if ((*mount_options & EXT3_MOUNT_DATA_FLAGS) !=
  562. data_opt) {
  563. printk(KERN_ERR
  564.        "EXT3-fs: cannot change data "
  565.        "mode on remountn");
  566. return 0;
  567. }
  568. } else {
  569. *mount_options &= ~EXT3_MOUNT_DATA_FLAGS;
  570. *mount_options |= data_opt;
  571. }
  572. } else if (!strcmp (this_char, "commit")) {
  573. unsigned long v;
  574. if (want_numeric(value, "commit", &v))
  575. return 0;
  576. sbi->s_commit_interval = (HZ * v);
  577. } else {
  578. printk (KERN_ERR 
  579. "EXT3-fs: Unrecognized mount option %sn",
  580. this_char);
  581. return 0;
  582. }
  583. }
  584. return 1;
  585. }
  586. static int ext3_setup_super(struct super_block *sb, struct ext3_super_block *es,
  587.     int read_only)
  588. {
  589. struct ext3_sb_info *sbi = EXT3_SB(sb);
  590. int res = 0;
  591. if (le32_to_cpu(es->s_rev_level) > EXT3_MAX_SUPP_REV) {
  592. printk (KERN_ERR "EXT3-fs warning: revision level too high, "
  593. "forcing read-only moden");
  594. res = MS_RDONLY;
  595. }
  596. if (read_only)
  597. return res;
  598. if (!(sbi->s_mount_state & EXT3_VALID_FS))
  599. printk (KERN_WARNING "EXT3-fs warning: mounting unchecked fs, "
  600. "running e2fsck is recommendedn");
  601. else if ((sbi->s_mount_state & EXT3_ERROR_FS))
  602. printk (KERN_WARNING
  603. "EXT3-fs warning: mounting fs with errors, "
  604. "running e2fsck is recommendedn");
  605. else if ((__s16) le16_to_cpu(es->s_max_mnt_count) >= 0 &&
  606.  le16_to_cpu(es->s_mnt_count) >=
  607.  (unsigned short) (__s16) le16_to_cpu(es->s_max_mnt_count))
  608. printk (KERN_WARNING
  609. "EXT3-fs warning: maximal mount count reached, "
  610. "running e2fsck is recommendedn");
  611. else if (le32_to_cpu(es->s_checkinterval) &&
  612. (le32_to_cpu(es->s_lastcheck) +
  613. le32_to_cpu(es->s_checkinterval) <= CURRENT_TIME))
  614. printk (KERN_WARNING
  615. "EXT3-fs warning: checktime reached, "
  616. "running e2fsck is recommendedn");
  617. #if 0
  618. /* @@@ We _will_ want to clear the valid bit if we find
  619.                    inconsistencies, to force a fsck at reboot.  But for
  620.                    a plain journaled filesystem we can keep it set as
  621.                    valid forever! :) */
  622. es->s_state = cpu_to_le16(le16_to_cpu(es->s_state) & ~EXT3_VALID_FS);
  623. #endif
  624. if (!(__s16) le16_to_cpu(es->s_max_mnt_count))
  625. es->s_max_mnt_count =
  626. (__s16) cpu_to_le16(EXT3_DFL_MAX_MNT_COUNT);
  627. es->s_mnt_count=cpu_to_le16(le16_to_cpu(es->s_mnt_count) + 1);
  628. es->s_mtime = cpu_to_le32(CURRENT_TIME);
  629. ext3_update_dynamic_rev(sb);
  630. EXT3_SET_INCOMPAT_FEATURE(sb, EXT3_FEATURE_INCOMPAT_RECOVER);
  631. ext3_commit_super (sb, es, 1);
  632. if (test_opt (sb, DEBUG))
  633. printk (KERN_INFO
  634. "[EXT3 FS %s, %s, bs=%lu, gc=%lu, "
  635. "bpg=%lu, ipg=%lu, mo=%04lx]n",
  636. EXT3FS_VERSION, EXT3FS_DATE, sb->s_blocksize,
  637. sbi->s_groups_count,
  638. EXT3_BLOCKS_PER_GROUP(sb),
  639. EXT3_INODES_PER_GROUP(sb),
  640. sbi->s_mount_opt);
  641. printk(KERN_INFO "EXT3 FS " EXT3FS_VERSION ", " EXT3FS_DATE " on %s, ",
  642. bdevname(sb->s_dev));
  643. if (EXT3_SB(sb)->s_journal->j_inode == NULL) {
  644. printk("external journal on %sn",
  645. bdevname(EXT3_SB(sb)->s_journal->j_dev));
  646. } else {
  647. printk("internal journaln");
  648. }
  649. #ifdef CONFIG_EXT3_CHECK
  650. if (test_opt (sb, CHECK)) {
  651. ext3_check_blocks_bitmap (sb);
  652. ext3_check_inodes_bitmap (sb);
  653. }
  654. #endif
  655. setup_ro_after(sb);
  656. return res;
  657. }
  658. static int ext3_check_descriptors (struct super_block * sb)
  659. {
  660. struct ext3_sb_info *sbi = EXT3_SB(sb);
  661. unsigned long block = le32_to_cpu(sbi->s_es->s_first_data_block);
  662. struct ext3_group_desc * gdp = NULL;
  663. int desc_block = 0;
  664. int i;
  665. ext3_debug ("Checking group descriptors");
  666. for (i = 0; i < sbi->s_groups_count; i++)
  667. {
  668. if ((i % EXT3_DESC_PER_BLOCK(sb)) == 0)
  669. gdp = (struct ext3_group_desc *)
  670. sbi->s_group_desc[desc_block++]->b_data;
  671. if (le32_to_cpu(gdp->bg_block_bitmap) < block ||
  672.     le32_to_cpu(gdp->bg_block_bitmap) >=
  673. block + EXT3_BLOCKS_PER_GROUP(sb))
  674. {
  675. ext3_error (sb, "ext3_check_descriptors",
  676.     "Block bitmap for group %d"
  677.     " not in group (block %lu)!",
  678.     i, (unsigned long)
  679. le32_to_cpu(gdp->bg_block_bitmap));
  680. return 0;
  681. }
  682. if (le32_to_cpu(gdp->bg_inode_bitmap) < block ||
  683.     le32_to_cpu(gdp->bg_inode_bitmap) >=
  684. block + EXT3_BLOCKS_PER_GROUP(sb))
  685. {
  686. ext3_error (sb, "ext3_check_descriptors",
  687.     "Inode bitmap for group %d"
  688.     " not in group (block %lu)!",
  689.     i, (unsigned long)
  690. le32_to_cpu(gdp->bg_inode_bitmap));
  691. return 0;
  692. }
  693. if (le32_to_cpu(gdp->bg_inode_table) < block ||
  694.     le32_to_cpu(gdp->bg_inode_table) + sbi->s_itb_per_group >=
  695.     block + EXT3_BLOCKS_PER_GROUP(sb))
  696. {
  697. ext3_error (sb, "ext3_check_descriptors",
  698.     "Inode table for group %d"
  699.     " not in group (block %lu)!",
  700.     i, (unsigned long)
  701. le32_to_cpu(gdp->bg_inode_table));
  702. return 0;
  703. }
  704. block += EXT3_BLOCKS_PER_GROUP(sb);
  705. gdp++;
  706. }
  707. return 1;
  708. }
  709. /* ext3_orphan_cleanup() walks a singly-linked list of inodes (starting at
  710.  * the superblock) which were deleted from all directories, but held open by
  711.  * a process at the time of a crash.  We walk the list and try to delete these
  712.  * inodes at recovery time (only with a read-write filesystem).
  713.  *
  714.  * In order to keep the orphan inode chain consistent during traversal (in
  715.  * case of crash during recovery), we link each inode into the superblock
  716.  * orphan list_head and handle it the same way as an inode deletion during
  717.  * normal operation (which journals the operations for us).
  718.  *
  719.  * We only do an iget() and an iput() on each inode, which is very safe if we
  720.  * accidentally point at an in-use or already deleted inode.  The worst that
  721.  * can happen in this case is that we get a "bit already cleared" message from
  722.  * ext3_free_inode().  The only reason we would point at a wrong inode is if
  723.  * e2fsck was run on this filesystem, and it must have already done the orphan
  724.  * inode cleanup for us, so we can safely abort without any further action.
  725.  */
  726. static void ext3_orphan_cleanup (struct super_block * sb,
  727.  struct ext3_super_block * es)
  728. {
  729. unsigned int s_flags = sb->s_flags;
  730. int nr_orphans = 0, nr_truncates = 0;
  731. if (!es->s_last_orphan) {
  732. jbd_debug(4, "no orphan inodes to clean upn");
  733. return;
  734. }
  735. if (s_flags & MS_RDONLY) {
  736. printk(KERN_INFO "EXT3-fs: %s: orphan cleanup on readonly fsn",
  737.        bdevname(sb->s_dev));
  738. sb->s_flags &= ~MS_RDONLY;
  739. }
  740. if (sb->u.ext3_sb.s_mount_state & EXT3_ERROR_FS) {
  741. if (es->s_last_orphan)
  742. jbd_debug(1, "Errors on filesystem, "
  743.   "clearing orphan list.n");
  744. es->s_last_orphan = 0;
  745. jbd_debug(1, "Skipping orphan recovery on fs with errors.n");
  746. return;
  747. }
  748. while (es->s_last_orphan) {
  749. struct inode *inode;
  750. if (!(inode =
  751.       ext3_orphan_get(sb, le32_to_cpu(es->s_last_orphan)))) {
  752. es->s_last_orphan = 0;
  753. break;
  754. }
  755. list_add(&EXT3_I(inode)->i_orphan, &EXT3_SB(sb)->s_orphan);
  756. if (inode->i_nlink) {
  757. printk(KERN_DEBUG "%s: truncating inode %ld to %Ld "
  758. "bytesn", __FUNCTION__, inode->i_ino,
  759. inode->i_size);
  760. jbd_debug(2, "truncating inode %ld to %Ld bytesn",
  761.   inode->i_ino, inode->i_size);
  762. ext3_truncate(inode);
  763. nr_truncates++;
  764. } else {
  765. printk(KERN_DEBUG "%s: deleting unreferenced "
  766. "inode %ldn", __FUNCTION__, inode->i_ino);
  767. jbd_debug(2, "deleting unreferenced inode %ldn",
  768.   inode->i_ino);
  769. nr_orphans++;
  770. }
  771. iput(inode);  /* The delete magic happens here! */
  772. }
  773. #define PLURAL(x) (x), ((x)==1) ? "" : "s"
  774. if (nr_orphans)
  775. printk(KERN_INFO "EXT3-fs: %s: %d orphan inode%s deletedn",
  776.        bdevname(sb->s_dev), PLURAL(nr_orphans));
  777. if (nr_truncates)
  778. printk(KERN_INFO "EXT3-fs: %s: %d truncate%s cleaned upn",
  779.        bdevname(sb->s_dev), PLURAL(nr_truncates));
  780. sb->s_flags = s_flags; /* Restore MS_RDONLY status */
  781. }
  782. #define log2(n) ffz(~(n))
  783. /*
  784.  * Maximal file size.  There is a direct, and {,double-,triple-}indirect
  785.  * block limit, and also a limit of (2^32 - 1) 512-byte sectors in i_blocks.
  786.  * We need to be 1 filesystem block less than the 2^32 sector limit.
  787.  */
  788. static loff_t ext3_max_size(int bits)
  789. {
  790. loff_t res = EXT3_NDIR_BLOCKS;
  791. res += 1LL << (bits-2);
  792. res += 1LL << (2*(bits-2));
  793. res += 1LL << (3*(bits-2));
  794. res <<= bits;
  795. if (res > (512LL << 32) - (1 << bits))
  796. res = (512LL << 32) - (1 << bits);
  797. return res;
  798. }
  799. struct super_block * ext3_read_super (struct super_block * sb, void * data,
  800.       int silent)
  801. {
  802. struct buffer_head * bh;
  803. struct ext3_super_block *es = 0;
  804. struct ext3_sb_info *sbi = EXT3_SB(sb);
  805. unsigned long sb_block = 1;
  806. unsigned long logic_sb_block = 1;
  807. unsigned long offset = 0;
  808. unsigned long journal_inum = 0;
  809. kdev_t dev = sb->s_dev;
  810. int blocksize;
  811. int hblock;
  812. int db_count;
  813. int i;
  814. int needs_recovery;
  815. #ifdef CONFIG_JBD_DEBUG
  816. ext3_ro_after = 0;
  817. #endif
  818. /*
  819.  * See what the current blocksize for the device is, and
  820.  * use that as the blocksize.  Otherwise (or if the blocksize
  821.  * is smaller than the default) use the default.
  822.  * This is important for devices that have a hardware
  823.  * sectorsize that is larger than the default.
  824.  */
  825. blocksize = EXT3_MIN_BLOCK_SIZE;
  826. hblock = get_hardsect_size(dev);
  827. if (blocksize < hblock)
  828. blocksize = hblock;
  829. sbi->s_mount_opt = 0;
  830. sbi->s_resuid = EXT3_DEF_RESUID;
  831. sbi->s_resgid = EXT3_DEF_RESGID;
  832. if (!parse_options ((char *) data, &sb_block, sbi, &journal_inum, 0)) {
  833. sb->s_dev = 0;
  834. goto out_fail;
  835. }
  836. sb->s_blocksize = blocksize;
  837. set_blocksize (dev, blocksize);
  838. /*
  839.  * The ext3 superblock will not be buffer aligned for other than 1kB
  840.  * block sizes.  We need to calculate the offset from buffer start.
  841.  */
  842. if (blocksize != EXT3_MIN_BLOCK_SIZE) {
  843. logic_sb_block = (sb_block * EXT3_MIN_BLOCK_SIZE) / blocksize;
  844. offset = (sb_block * EXT3_MIN_BLOCK_SIZE) % blocksize;
  845. }
  846. if (!(bh = sb_bread(sb, logic_sb_block))) {
  847. printk (KERN_ERR "EXT3-fs: unable to read superblockn");
  848. goto out_fail;
  849. }
  850. /*
  851.  * Note: s_es must be initialized as soon as possible because
  852.  *       some ext3 macro-instructions depend on its value
  853.  */
  854. es = (struct ext3_super_block *) (((char *)bh->b_data) + offset);
  855. sbi->s_es = es;
  856. sb->s_magic = le16_to_cpu(es->s_magic);
  857. if (sb->s_magic != EXT3_SUPER_MAGIC) {
  858. if (!silent)
  859. printk(KERN_ERR 
  860.        "VFS: Can't find ext3 filesystem on dev %s.n",
  861.        bdevname(dev));
  862. goto failed_mount;
  863. }
  864. if (le32_to_cpu(es->s_rev_level) == EXT3_GOOD_OLD_REV &&
  865.     (EXT3_HAS_COMPAT_FEATURE(sb, ~0U) ||
  866.      EXT3_HAS_RO_COMPAT_FEATURE(sb, ~0U) ||
  867.      EXT3_HAS_INCOMPAT_FEATURE(sb, ~0U)))
  868. printk(KERN_WARNING 
  869.        "EXT3-fs warning: feature flags set on rev 0 fs, "
  870.        "running e2fsck is recommendedn");
  871. /*
  872.  * Check feature flags regardless of the revision level, since we
  873.  * previously didn't change the revision level when setting the flags,
  874.  * so there is a chance incompat flags are set on a rev 0 filesystem.
  875.  */
  876. if ((i = EXT3_HAS_INCOMPAT_FEATURE(sb, ~EXT3_FEATURE_INCOMPAT_SUPP))) {
  877. printk(KERN_ERR "EXT3-fs: %s: couldn't mount because of "
  878.        "unsupported optional features (%x).n",
  879.        bdevname(dev), i);
  880. goto failed_mount;
  881. }
  882. if (!(sb->s_flags & MS_RDONLY) &&
  883.     (i = EXT3_HAS_RO_COMPAT_FEATURE(sb, ~EXT3_FEATURE_RO_COMPAT_SUPP))){
  884. printk(KERN_ERR "EXT3-fs: %s: couldn't mount RDWR because of "
  885.        "unsupported optional features (%x).n",
  886.        bdevname(dev), i);
  887. goto failed_mount;
  888. }
  889. sb->s_blocksize_bits = le32_to_cpu(es->s_log_block_size) + 10;
  890. sb->s_blocksize = 1 << sb->s_blocksize_bits;
  891. if (sb->s_blocksize < EXT3_MIN_BLOCK_SIZE ||
  892.     sb->s_blocksize > EXT3_MAX_BLOCK_SIZE) {
  893. printk(KERN_ERR 
  894.        "EXT3-fs: Unsupported filesystem blocksize %d on %s.n",
  895.        blocksize, bdevname(dev));
  896. goto failed_mount;
  897. }
  898. sb->s_maxbytes = ext3_max_size(sb->s_blocksize_bits);
  899. if (sb->s_blocksize != blocksize) {
  900. blocksize = sb->s_blocksize;
  901. /*
  902.  * Make sure the blocksize for the filesystem is larger
  903.  * than the hardware sectorsize for the machine.
  904.  */
  905. if (sb->s_blocksize < hblock) {
  906. printk(KERN_ERR "EXT3-fs: blocksize %d too small for "
  907.        "device blocksize %d.n", blocksize, hblock);
  908. goto failed_mount;
  909. }
  910. brelse (bh);
  911. set_blocksize (dev, sb->s_blocksize);
  912. logic_sb_block = (sb_block * EXT3_MIN_BLOCK_SIZE) / blocksize;
  913. offset = (sb_block * EXT3_MIN_BLOCK_SIZE) % blocksize;
  914. bh = sb_bread(sb, logic_sb_block);
  915. if (!bh) {
  916. printk(KERN_ERR 
  917.        "EXT3-fs: Can't read superblock on 2nd try.n");
  918. return NULL;
  919. }
  920. es = (struct ext3_super_block *)(((char *)bh->b_data) + offset);
  921. sbi->s_es = es;
  922. if (es->s_magic != le16_to_cpu(EXT3_SUPER_MAGIC)) {
  923. printk (KERN_ERR 
  924. "EXT3-fs: Magic mismatch, very weird !n");
  925. goto failed_mount;
  926. }
  927. }
  928. if (le32_to_cpu(es->s_rev_level) == EXT3_GOOD_OLD_REV) {
  929. sbi->s_inode_size = EXT3_GOOD_OLD_INODE_SIZE;
  930. sbi->s_first_ino = EXT3_GOOD_OLD_FIRST_INO;
  931. } else {
  932. sbi->s_inode_size = le16_to_cpu(es->s_inode_size);
  933. sbi->s_first_ino = le32_to_cpu(es->s_first_ino);
  934. if (sbi->s_inode_size != EXT3_GOOD_OLD_INODE_SIZE) {
  935. printk (KERN_ERR
  936. "EXT3-fs: unsupported inode size: %dn",
  937. sbi->s_inode_size);
  938. goto failed_mount;
  939. }
  940. }
  941. sbi->s_frag_size = EXT3_MIN_FRAG_SIZE <<
  942.    le32_to_cpu(es->s_log_frag_size);
  943. if (blocksize != sbi->s_frag_size) {
  944. printk(KERN_ERR
  945.        "EXT3-fs: fragsize %lu != blocksize %u (unsupported)n",
  946.        sbi->s_frag_size, blocksize);
  947. goto failed_mount;
  948. }
  949. sbi->s_frags_per_block = 1;
  950. sbi->s_blocks_per_group = le32_to_cpu(es->s_blocks_per_group);
  951. sbi->s_frags_per_group = le32_to_cpu(es->s_frags_per_group);
  952. sbi->s_inodes_per_group = le32_to_cpu(es->s_inodes_per_group);
  953. sbi->s_inodes_per_block = blocksize / EXT3_INODE_SIZE(sb);
  954. sbi->s_itb_per_group = sbi->s_inodes_per_group /sbi->s_inodes_per_block;
  955. sbi->s_desc_per_block = blocksize / sizeof(struct ext3_group_desc);
  956. sbi->s_sbh = bh;
  957. if (sbi->s_resuid == EXT3_DEF_RESUID)
  958. sbi->s_resuid = le16_to_cpu(es->s_def_resuid);
  959. if (sbi->s_resgid == EXT3_DEF_RESGID)
  960. sbi->s_resgid = le16_to_cpu(es->s_def_resgid);
  961. sbi->s_mount_state = le16_to_cpu(es->s_state);
  962. sbi->s_addr_per_block_bits = log2(EXT3_ADDR_PER_BLOCK(sb));
  963. sbi->s_desc_per_block_bits = log2(EXT3_DESC_PER_BLOCK(sb));
  964. if (sbi->s_blocks_per_group > blocksize * 8) {
  965. printk (KERN_ERR
  966. "EXT3-fs: #blocks per group too big: %lun",
  967. sbi->s_blocks_per_group);
  968. goto failed_mount;
  969. }
  970. if (sbi->s_frags_per_group > blocksize * 8) {
  971. printk (KERN_ERR
  972. "EXT3-fs: #fragments per group too big: %lun",
  973. sbi->s_frags_per_group);
  974. goto failed_mount;
  975. }
  976. if (sbi->s_inodes_per_group > blocksize * 8) {
  977. printk (KERN_ERR
  978. "EXT3-fs: #inodes per group too big: %lun",
  979. sbi->s_inodes_per_group);
  980. goto failed_mount;
  981. }
  982. sbi->s_groups_count = (le32_to_cpu(es->s_blocks_count) -
  983.        le32_to_cpu(es->s_first_data_block) +
  984.        EXT3_BLOCKS_PER_GROUP(sb) - 1) /
  985.       EXT3_BLOCKS_PER_GROUP(sb);
  986. db_count = (sbi->s_groups_count + EXT3_DESC_PER_BLOCK(sb) - 1) /
  987.    EXT3_DESC_PER_BLOCK(sb);
  988. sbi->s_group_desc = kmalloc(db_count * sizeof (struct buffer_head *),
  989.     GFP_KERNEL);
  990. if (sbi->s_group_desc == NULL) {
  991. printk (KERN_ERR "EXT3-fs: not enough memoryn");
  992. goto failed_mount;
  993. }
  994. for (i = 0; i < db_count; i++) {
  995. sbi->s_group_desc[i] = sb_bread(sb, logic_sb_block + i + 1);
  996. if (!sbi->s_group_desc[i]) {
  997. printk (KERN_ERR "EXT3-fs: "
  998. "can't read group descriptor %dn", i);
  999. db_count = i;
  1000. goto failed_mount2;
  1001. }
  1002. }
  1003. if (!ext3_check_descriptors (sb)) {
  1004. printk (KERN_ERR "EXT3-fs: group descriptors corrupted !n");
  1005. goto failed_mount2;
  1006. }
  1007. for (i = 0; i < EXT3_MAX_GROUP_LOADED; i++) {
  1008. sbi->s_inode_bitmap_number[i] = 0;
  1009. sbi->s_inode_bitmap[i] = NULL;
  1010. sbi->s_block_bitmap_number[i] = 0;
  1011. sbi->s_block_bitmap[i] = NULL;
  1012. }
  1013. sbi->s_loaded_inode_bitmaps = 0;
  1014. sbi->s_loaded_block_bitmaps = 0;
  1015. sbi->s_gdb_count = db_count;
  1016. get_random_bytes(&sbi->s_next_generation, sizeof(u32));
  1017. /*
  1018.  * set up enough so that it can read an inode
  1019.  */
  1020. sb->s_op = &ext3_sops;
  1021. INIT_LIST_HEAD(&sbi->s_orphan); /* unlinked but open files */
  1022. sb->s_root = 0;
  1023. needs_recovery = (es->s_last_orphan != 0 ||
  1024.   EXT3_HAS_INCOMPAT_FEATURE(sb,
  1025.     EXT3_FEATURE_INCOMPAT_RECOVER));
  1026. /*
  1027.  * The first inode we look at is the journal inode.  Don't try
  1028.  * root first: it may be modified in the journal!
  1029.  */
  1030. if (!test_opt(sb, NOLOAD) &&
  1031.     EXT3_HAS_COMPAT_FEATURE(sb, EXT3_FEATURE_COMPAT_HAS_JOURNAL)) {
  1032. if (ext3_load_journal(sb, es))
  1033. goto failed_mount2;
  1034. } else if (journal_inum) {
  1035. if (ext3_create_journal(sb, es, journal_inum))
  1036. goto failed_mount2;
  1037. } else {
  1038. if (!silent)
  1039. printk (KERN_ERR
  1040. "ext3: No journal on filesystem on %sn",
  1041. bdevname(dev));
  1042. goto failed_mount2;
  1043. }
  1044. /* We have now updated the journal if required, so we can
  1045.  * validate the data journaling mode. */
  1046. switch (test_opt(sb, DATA_FLAGS)) {
  1047. case 0:
  1048. /* No mode set, assume a default based on the journal
  1049.                    capabilities: ORDERED_DATA if the journal can
  1050.                    cope, else JOURNAL_DATA */
  1051. if (journal_check_available_features
  1052.     (sbi->s_journal, 0, 0, JFS_FEATURE_INCOMPAT_REVOKE))
  1053. set_opt(sbi->s_mount_opt, ORDERED_DATA);
  1054. else
  1055. set_opt(sbi->s_mount_opt, JOURNAL_DATA);
  1056. break;
  1057. case EXT3_MOUNT_ORDERED_DATA:
  1058. case EXT3_MOUNT_WRITEBACK_DATA:
  1059. if (!journal_check_available_features
  1060.     (sbi->s_journal, 0, 0, JFS_FEATURE_INCOMPAT_REVOKE)) {
  1061. printk(KERN_ERR "EXT3-fs: Journal does not support "
  1062.        "requested data journaling moden");
  1063. goto failed_mount3;
  1064. }
  1065. default:
  1066. break;
  1067. }
  1068. /*
  1069.  * The journal_load will have done any necessary log recovery,
  1070.  * so we can safely mount the rest of the filesystem now.
  1071.  */
  1072. sb->s_root = d_alloc_root(iget(sb, EXT3_ROOT_INO));
  1073. if (!sb->s_root || !S_ISDIR(sb->s_root->d_inode->i_mode) ||
  1074.     !sb->s_root->d_inode->i_blocks || !sb->s_root->d_inode->i_size) {
  1075. if (sb->s_root) {
  1076. dput(sb->s_root);
  1077. sb->s_root = NULL;
  1078. printk(KERN_ERR
  1079.        "EXT3-fs: corrupt root inode, run e2fsckn");
  1080. } else
  1081. printk(KERN_ERR "EXT3-fs: get root inode failedn");
  1082. goto failed_mount3;
  1083. }
  1084. ext3_setup_super (sb, es, sb->s_flags & MS_RDONLY);
  1085. /*
  1086.  * akpm: core read_super() calls in here with the superblock locked.
  1087.  * That deadlocks, because orphan cleanup needs to lock the superblock
  1088.  * in numerous places.  Here we just pop the lock - it's relatively
  1089.  * harmless, because we are now ready to accept write_super() requests,
  1090.  * and aviro says that's the only reason for hanging onto the
  1091.  * superblock lock.
  1092.  */
  1093. EXT3_SB(sb)->s_mount_state |= EXT3_ORPHAN_FS;
  1094. unlock_super(sb); /* akpm: sigh */
  1095. ext3_orphan_cleanup(sb, es);
  1096. lock_super(sb);
  1097. EXT3_SB(sb)->s_mount_state &= ~EXT3_ORPHAN_FS;
  1098. if (needs_recovery)
  1099. printk (KERN_INFO "EXT3-fs: recovery complete.n");
  1100. ext3_mark_recovery_complete(sb, es);
  1101. printk (KERN_INFO "EXT3-fs: mounted filesystem with %s data mode.n",
  1102. test_opt(sb,DATA_FLAGS) == EXT3_MOUNT_JOURNAL_DATA ? "journal":
  1103. test_opt(sb,DATA_FLAGS) == EXT3_MOUNT_ORDERED_DATA ? "ordered":
  1104. "writeback");
  1105. return sb;
  1106. failed_mount3:
  1107. journal_destroy(sbi->s_journal);
  1108. failed_mount2:
  1109. for (i = 0; i < db_count; i++)
  1110. brelse(sbi->s_group_desc[i]);
  1111. kfree(sbi->s_group_desc);
  1112. failed_mount:
  1113. ext3_blkdev_remove(sbi);
  1114. brelse(bh);
  1115. out_fail:
  1116. return NULL;
  1117. }
  1118. /*
  1119.  * Setup any per-fs journal parameters now.  We'll do this both on
  1120.  * initial mount, once the journal has been initialised but before we've
  1121.  * done any recovery; and again on any subsequent remount. 
  1122.  */
  1123. static void ext3_init_journal_params(struct ext3_sb_info *sbi, 
  1124.      journal_t *journal)
  1125. {
  1126. if (sbi->s_commit_interval)
  1127. journal->j_commit_interval = sbi->s_commit_interval;
  1128. /* We could also set up an ext3-specific default for the commit
  1129.  * interval here, but for now we'll just fall back to the jbd
  1130.  * default. */
  1131. }
  1132. static journal_t *ext3_get_journal(struct super_block *sb, int journal_inum)
  1133. {
  1134. struct inode *journal_inode;
  1135. journal_t *journal;
  1136. /* First, test for the existence of a valid inode on disk.  Bad
  1137.  * things happen if we iget() an unused inode, as the subsequent
  1138.  * iput() will try to delete it. */
  1139. journal_inode = iget(sb, journal_inum);
  1140. if (!journal_inode) {
  1141. printk(KERN_ERR "EXT3-fs: no journal found.n");
  1142. return NULL;
  1143. }
  1144. if (!journal_inode->i_nlink) {
  1145. make_bad_inode(journal_inode);
  1146. iput(journal_inode);
  1147. printk(KERN_ERR "EXT3-fs: journal inode is deleted.n");
  1148. return NULL;
  1149. }
  1150. jbd_debug(2, "Journal inode found at %p: %Ld bytesn",
  1151.   journal_inode, journal_inode->i_size);
  1152. if (is_bad_inode(journal_inode) || !S_ISREG(journal_inode->i_mode)) {
  1153. printk(KERN_ERR "EXT3-fs: invalid journal inode.n");
  1154. iput(journal_inode);
  1155. return NULL;
  1156. }
  1157. journal = journal_init_inode(journal_inode);
  1158. if (!journal) {
  1159. printk(KERN_ERR "EXT3-fs: Could not load journal inoden");
  1160. iput(journal_inode);
  1161. }
  1162. ext3_init_journal_params(EXT3_SB(sb), journal);
  1163. return journal;
  1164. }
  1165. static journal_t *ext3_get_dev_journal(struct super_block *sb,
  1166.        int dev)
  1167. {
  1168. struct buffer_head * bh;
  1169. journal_t *journal;
  1170. int start;
  1171. int len;
  1172. int hblock, blocksize;
  1173. unsigned long sb_block;
  1174. unsigned long offset;
  1175. kdev_t journal_dev = to_kdev_t(dev);
  1176. struct ext3_super_block * es;
  1177. struct block_device *bdev;
  1178. bdev = ext3_blkdev_get(journal_dev);
  1179. if (bdev == NULL)
  1180. return NULL;
  1181. blocksize = sb->s_blocksize;
  1182. hblock = get_hardsect_size(journal_dev);
  1183. if (blocksize < hblock) {
  1184. printk(KERN_ERR
  1185. "EXT3-fs: blocksize too small for journal device.n");
  1186. goto out_bdev;
  1187. }
  1188. sb_block = EXT3_MIN_BLOCK_SIZE / blocksize;
  1189. offset = EXT3_MIN_BLOCK_SIZE % blocksize;
  1190. set_blocksize(dev, blocksize);
  1191. if (!(bh = bread(dev, sb_block, blocksize))) {
  1192. printk(KERN_ERR "EXT3-fs: couldn't read superblock of "
  1193.        "external journaln");
  1194. goto out_bdev;
  1195. }
  1196. es = (struct ext3_super_block *) (((char *)bh->b_data) + offset);
  1197. if ((le16_to_cpu(es->s_magic) != EXT3_SUPER_MAGIC) ||
  1198.     !(le32_to_cpu(es->s_feature_incompat) &
  1199.       EXT3_FEATURE_INCOMPAT_JOURNAL_DEV)) {
  1200. printk(KERN_ERR "EXT3-fs: external journal has "
  1201. "bad superblockn");
  1202. brelse(bh);
  1203. goto out_bdev;
  1204. }
  1205. if (memcmp(EXT3_SB(sb)->s_es->s_journal_uuid, es->s_uuid, 16)) {
  1206. printk(KERN_ERR "EXT3-fs: journal UUID does not matchn");
  1207. brelse(bh);
  1208. goto out_bdev;
  1209. }
  1210. len = le32_to_cpu(es->s_blocks_count);
  1211. start = sb_block + 1;
  1212. brelse(bh); /* we're done with the superblock */
  1213. journal = journal_init_dev(journal_dev, sb->s_dev, 
  1214. start, len, blocksize);
  1215. if (!journal) {
  1216. printk(KERN_ERR "EXT3-fs: failed to create device journaln");
  1217. goto out_bdev;
  1218. }
  1219. ll_rw_block(READ, 1, &journal->j_sb_buffer);
  1220. wait_on_buffer(journal->j_sb_buffer);
  1221. if (!buffer_uptodate(journal->j_sb_buffer)) {
  1222. printk(KERN_ERR "EXT3-fs: I/O error on journal devicen");
  1223. goto out_journal;
  1224. }
  1225. if (ntohl(journal->j_superblock->s_nr_users) != 1) {
  1226. printk(KERN_ERR "EXT3-fs: External journal has more than one "
  1227. "user (unsupported) - %dn",
  1228. ntohl(journal->j_superblock->s_nr_users));
  1229. goto out_journal;
  1230. }
  1231. EXT3_SB(sb)->journal_bdev = bdev;
  1232. ext3_init_journal_params(EXT3_SB(sb), journal);
  1233. return journal;
  1234. out_journal:
  1235. journal_destroy(journal);
  1236. out_bdev:
  1237. ext3_blkdev_put(bdev);
  1238. return NULL;
  1239. }
  1240. static int ext3_load_journal(struct super_block * sb,
  1241.      struct ext3_super_block * es)
  1242. {
  1243. journal_t *journal;
  1244. int journal_inum = le32_to_cpu(es->s_journal_inum);
  1245. int journal_dev = le32_to_cpu(es->s_journal_dev);
  1246. int err = 0;
  1247. int really_read_only;
  1248. really_read_only = is_read_only(sb->s_dev);
  1249. /*
  1250.  * Are we loading a blank journal or performing recovery after a
  1251.  * crash?  For recovery, we need to check in advance whether we
  1252.  * can get read-write access to the device.
  1253.  */
  1254. if (EXT3_HAS_INCOMPAT_FEATURE(sb, EXT3_FEATURE_INCOMPAT_RECOVER)) {
  1255. if (sb->s_flags & MS_RDONLY) {
  1256. printk(KERN_INFO "EXT3-fs: INFO: recovery "
  1257. "required on readonly filesystem.n");
  1258. if (really_read_only) {
  1259. printk(KERN_ERR "EXT3-fs: write access "
  1260. "unavailable, cannot proceed.n");
  1261. return -EROFS;
  1262. }
  1263. printk (KERN_INFO "EXT3-fs: write access will "
  1264. "be enabled during recovery.n");
  1265. }
  1266. }
  1267. if (journal_inum && journal_dev) {
  1268. printk(KERN_ERR "EXT3-fs: filesystem has both journal "
  1269.        "and inode journals!n");
  1270. return -EINVAL;
  1271. }
  1272. if (journal_inum) {
  1273. if (!(journal = ext3_get_journal(sb, journal_inum)))
  1274. return -EINVAL;
  1275. } else {
  1276. if (!(journal = ext3_get_dev_journal(sb, journal_dev)))
  1277. return -EINVAL;
  1278. }
  1279. if (!really_read_only && test_opt(sb, UPDATE_JOURNAL)) {
  1280. err = journal_update_format(journal);
  1281. if (err)  {
  1282. printk(KERN_ERR "EXT3-fs: error updating journal.n");
  1283. journal_destroy(journal);
  1284. return err;
  1285. }
  1286. }
  1287. if (!EXT3_HAS_INCOMPAT_FEATURE(sb, EXT3_FEATURE_INCOMPAT_RECOVER))
  1288. err = journal_wipe(journal, !really_read_only);
  1289. if (!err)
  1290. err = journal_load(journal);
  1291. if (err) {
  1292. printk(KERN_ERR "EXT3-fs: error loading journal.n");
  1293. journal_destroy(journal);
  1294. return err;
  1295. }
  1296. EXT3_SB(sb)->s_journal = journal;
  1297. ext3_clear_journal_err(sb, es);
  1298. return 0;
  1299. }
  1300. static int ext3_create_journal(struct super_block * sb,
  1301.        struct ext3_super_block * es,
  1302.        int journal_inum)
  1303. {
  1304. journal_t *journal;
  1305. if (sb->s_flags & MS_RDONLY) {
  1306. printk(KERN_ERR "EXT3-fs: readonly filesystem when trying to "
  1307. "create journal.n");
  1308. return -EROFS;
  1309. }
  1310. if (!(journal = ext3_get_journal(sb, journal_inum)))
  1311. return -EINVAL;
  1312. printk(KERN_INFO "EXT3-fs: creating new journal on inode %dn",
  1313.        journal_inum);
  1314. if (journal_create(journal)) {
  1315. printk(KERN_ERR "EXT3-fs: error creating journal.n");
  1316. journal_destroy(journal);
  1317. return -EIO;
  1318. }
  1319. EXT3_SB(sb)->s_journal = journal;
  1320. ext3_update_dynamic_rev(sb);
  1321. EXT3_SET_INCOMPAT_FEATURE(sb, EXT3_FEATURE_INCOMPAT_RECOVER);
  1322. EXT3_SET_COMPAT_FEATURE(sb, EXT3_FEATURE_COMPAT_HAS_JOURNAL);
  1323. es->s_journal_inum = cpu_to_le32(journal_inum);
  1324. sb->s_dirt = 1;
  1325. /* Make sure we flush the recovery flag to disk. */
  1326. ext3_commit_super(sb, es, 1);
  1327. return 0;
  1328. }
  1329. static void ext3_commit_super (struct super_block * sb,
  1330.        struct ext3_super_block * es,
  1331.        int sync)
  1332. {
  1333. es->s_wtime = cpu_to_le32(CURRENT_TIME);
  1334. BUFFER_TRACE(sb->u.ext3_sb.s_sbh, "marking dirty");
  1335. mark_buffer_dirty(sb->u.ext3_sb.s_sbh);
  1336. if (sync) {
  1337. ll_rw_block(WRITE, 1, &sb->u.ext3_sb.s_sbh);
  1338. wait_on_buffer(sb->u.ext3_sb.s_sbh);
  1339. }
  1340. }
  1341. /*
  1342.  * Have we just finished recovery?  If so, and if we are mounting (or
  1343.  * remounting) the filesystem readonly, then we will end up with a
  1344.  * consistent fs on disk.  Record that fact.
  1345.  */
  1346. static void ext3_mark_recovery_complete(struct super_block * sb,
  1347. struct ext3_super_block * es)
  1348. {
  1349. journal_flush(EXT3_SB(sb)->s_journal);
  1350. if (EXT3_HAS_INCOMPAT_FEATURE(sb, EXT3_FEATURE_INCOMPAT_RECOVER) &&
  1351.     sb->s_flags & MS_RDONLY) {
  1352. EXT3_CLEAR_INCOMPAT_FEATURE(sb, EXT3_FEATURE_INCOMPAT_RECOVER);
  1353. sb->s_dirt = 0;
  1354. ext3_commit_super(sb, es, 1);
  1355. }
  1356. }
  1357. /*
  1358.  * If we are mounting (or read-write remounting) a filesystem whose journal
  1359.  * has recorded an error from a previous lifetime, move that error to the
  1360.  * main filesystem now.
  1361.  */
  1362. static void ext3_clear_journal_err(struct super_block * sb,
  1363.    struct ext3_super_block * es)
  1364. {
  1365. journal_t *journal;
  1366. int j_errno;
  1367. const char *errstr;
  1368. journal = EXT3_SB(sb)->s_journal;
  1369. /*
  1370.  * Now check for any error status which may have been recorded in the
  1371.  * journal by a prior ext3_error() or ext3_abort()
  1372.  */
  1373. j_errno = journal_errno(journal);
  1374. if (j_errno) {
  1375. char nbuf[16];
  1376. errstr = ext3_decode_error(sb, j_errno, nbuf);
  1377. ext3_warning(sb, __FUNCTION__, "Filesystem error recorded "
  1378.      "from previous mount: %s", errstr);
  1379. ext3_warning(sb, __FUNCTION__, "Marking fs in need of "
  1380.      "filesystem check.");
  1381. sb->u.ext3_sb.s_mount_state |= EXT3_ERROR_FS;
  1382. es->s_state |= cpu_to_le16(EXT3_ERROR_FS);
  1383. ext3_commit_super (sb, es, 1);
  1384. journal_clear_err(journal);
  1385. }
  1386. }
  1387. /*
  1388.  * Force the running and committing transactions to commit,
  1389.  * and wait on the commit.
  1390.  */
  1391. int ext3_force_commit(struct super_block *sb)
  1392. {
  1393. journal_t *journal;
  1394. int ret;
  1395. if (sb->s_flags & MS_RDONLY)
  1396. return 0;
  1397. journal = EXT3_SB(sb)->s_journal;
  1398. sb->s_dirt = 0;
  1399. lock_kernel(); /* important: lock down j_running_transaction */
  1400. ret = ext3_journal_force_commit(journal);
  1401. unlock_kernel();
  1402. return ret;
  1403. }
  1404. /*
  1405.  * Ext3 always journals updates to the superblock itself, so we don't
  1406.  * have to propagate any other updates to the superblock on disk at this
  1407.  * point.  Just start an async writeback to get the buffers on their way
  1408.  * to the disk.
  1409.  *
  1410.  * This implicitly triggers the writebehind on sync().
  1411.  */
  1412. static int do_sync_supers = 0;
  1413. MODULE_PARM(do_sync_supers, "i");
  1414. MODULE_PARM_DESC(do_sync_supers, "Write superblocks synchronously");
  1415. void ext3_write_super (struct super_block * sb)
  1416. {
  1417. tid_t target;
  1418. if (down_trylock(&sb->s_lock) == 0)
  1419. BUG(); /* aviro detector */
  1420. sb->s_dirt = 0;
  1421. target = log_start_commit(EXT3_SB(sb)->s_journal, NULL);
  1422. if (do_sync_supers) {
  1423. unlock_super(sb);
  1424. log_wait_commit(EXT3_SB(sb)->s_journal, target);
  1425. lock_super(sb);
  1426. }
  1427. }
  1428. /*
  1429.  * LVM calls this function before a (read-only) snapshot is created.  This
  1430.  * gives us a chance to flush the journal completely and mark the fs clean.
  1431.  */
  1432. void ext3_write_super_lockfs(struct super_block *sb)
  1433. {
  1434. sb->s_dirt = 0;
  1435. lock_kernel(); /* 2.4.5 forgot to do this for us */
  1436. if (!(sb->s_flags & MS_RDONLY)) {
  1437. journal_t *journal = EXT3_SB(sb)->s_journal;
  1438. /* Now we set up the journal barrier. */
  1439. unlock_super(sb);
  1440. journal_lock_updates(journal);
  1441. journal_flush(journal);
  1442. lock_super(sb);
  1443. /* Journal blocked and flushed, clear needs_recovery flag. */
  1444. EXT3_CLEAR_INCOMPAT_FEATURE(sb, EXT3_FEATURE_INCOMPAT_RECOVER);
  1445. ext3_commit_super(sb, EXT3_SB(sb)->s_es, 1);
  1446. }
  1447. unlock_kernel();
  1448. }
  1449. /*
  1450.  * Called by LVM after the snapshot is done.  We need to reset the RECOVER
  1451.  * flag here, even though the filesystem is not technically dirty yet.
  1452.  */
  1453. void ext3_unlockfs(struct super_block *sb)
  1454. {
  1455. if (!(sb->s_flags & MS_RDONLY)) {
  1456. lock_kernel();
  1457. lock_super(sb);
  1458. /* Reser the needs_recovery flag before the fs is unlocked. */
  1459. EXT3_SET_INCOMPAT_FEATURE(sb, EXT3_FEATURE_INCOMPAT_RECOVER);
  1460. ext3_commit_super(sb, EXT3_SB(sb)->s_es, 1);
  1461. unlock_super(sb);
  1462. journal_unlock_updates(EXT3_SB(sb)->s_journal);
  1463. unlock_kernel();
  1464. }
  1465. }
  1466. int ext3_remount (struct super_block * sb, int * flags, char * data)
  1467. {
  1468. struct ext3_super_block * es;
  1469. struct ext3_sb_info *sbi = EXT3_SB(sb);
  1470. unsigned long tmp;
  1471. clear_ro_after(sb);
  1472. /*
  1473.  * Allow the "check" option to be passed as a remount option.
  1474.  */
  1475. if (!parse_options(data, &tmp, sbi, &tmp, 1))
  1476. return -EINVAL;
  1477. if (sbi->s_mount_opt & EXT3_MOUNT_ABORT)
  1478. ext3_abort(sb, __FUNCTION__, "Abort forced by user");
  1479. es = sbi->s_es;
  1480. ext3_init_journal_params(sbi, sbi->s_journal);
  1481. if ((*flags & MS_RDONLY) != (sb->s_flags & MS_RDONLY)) {
  1482. if (sbi->s_mount_opt & EXT3_MOUNT_ABORT)
  1483. return -EROFS;
  1484. if (*flags & MS_RDONLY) {
  1485. /*
  1486.  * First of all, the unconditional stuff we have to do
  1487.  * to disable replay of the journal when we next remount
  1488.  */
  1489. sb->s_flags |= MS_RDONLY;
  1490. /*
  1491.  * OK, test if we are remounting a valid rw partition
  1492.  * readonly, and if so set the rdonly flag and then
  1493.  * mark the partition as valid again.
  1494.  */
  1495. if (!(es->s_state & cpu_to_le16(EXT3_VALID_FS)) &&
  1496.     (sbi->s_mount_state & EXT3_VALID_FS))
  1497. es->s_state = cpu_to_le16(sbi->s_mount_state);
  1498. ext3_mark_recovery_complete(sb, es);
  1499. } else {
  1500. int ret;
  1501. if ((ret = EXT3_HAS_RO_COMPAT_FEATURE(sb,
  1502. ~EXT3_FEATURE_RO_COMPAT_SUPP))) {
  1503. printk(KERN_WARNING "EXT3-fs: %s: couldn't "
  1504.        "remount RDWR because of unsupported "
  1505.        "optional features (%x).n",
  1506.        bdevname(sb->s_dev), ret);
  1507. return -EROFS;
  1508. }
  1509. /*
  1510.  * Mounting a RDONLY partition read-write, so reread
  1511.  * and store the current valid flag.  (It may have
  1512.  * been changed by e2fsck since we originally mounted
  1513.  * the partition.)
  1514.  */
  1515. ext3_clear_journal_err(sb, es);
  1516. sbi->s_mount_state = le16_to_cpu(es->s_state);
  1517. if (!ext3_setup_super (sb, es, 0))
  1518. sb->s_flags &= ~MS_RDONLY;
  1519. }
  1520. }
  1521. setup_ro_after(sb);
  1522. return 0;
  1523. }
  1524. int ext3_statfs (struct super_block * sb, struct statfs * buf)
  1525. {
  1526. struct ext3_super_block *es = EXT3_SB(sb)->s_es;
  1527. unsigned long overhead;
  1528. int i;
  1529. if (test_opt (sb, MINIX_DF))
  1530. overhead = 0;
  1531. else {
  1532. /*
  1533.  * Compute the overhead (FS structures)
  1534.  */
  1535. /*
  1536.  * All of the blocks before first_data_block are
  1537.  * overhead
  1538.  */
  1539. overhead = le32_to_cpu(es->s_first_data_block);
  1540. /*
  1541.  * Add the overhead attributed to the superblock and
  1542.  * block group descriptors.  If the sparse superblocks
  1543.  * feature is turned on, then not all groups have this.
  1544.  */
  1545. for (i = 0; i < EXT3_SB(sb)->s_groups_count; i++)
  1546. overhead += ext3_bg_has_super(sb, i) +
  1547. ext3_bg_num_gdb(sb, i);
  1548. /*
  1549.  * Every block group has an inode bitmap, a block
  1550.  * bitmap, and an inode table.
  1551.  */
  1552. overhead += (EXT3_SB(sb)->s_groups_count *
  1553.      (2 + EXT3_SB(sb)->s_itb_per_group));
  1554. }
  1555. buf->f_type = EXT3_SUPER_MAGIC;
  1556. buf->f_bsize = sb->s_blocksize;
  1557. buf->f_blocks = le32_to_cpu(es->s_blocks_count) - overhead;
  1558. buf->f_bfree = ext3_count_free_blocks (sb);
  1559. buf->f_bavail = buf->f_bfree - le32_to_cpu(es->s_r_blocks_count);
  1560. if (buf->f_bfree < le32_to_cpu(es->s_r_blocks_count))
  1561. buf->f_bavail = 0;
  1562. buf->f_files = le32_to_cpu(es->s_inodes_count);
  1563. buf->f_ffree = ext3_count_free_inodes (sb);
  1564. buf->f_namelen = EXT3_NAME_LEN;
  1565. return 0;
  1566. }
  1567. static DECLARE_FSTYPE_DEV(ext3_fs_type, "ext3", ext3_read_super);
  1568. static int __init init_ext3_fs(void)
  1569. {
  1570.         return register_filesystem(&ext3_fs_type);
  1571. }
  1572. static void __exit exit_ext3_fs(void)
  1573. {
  1574. unregister_filesystem(&ext3_fs_type);
  1575. }
  1576. EXPORT_NO_SYMBOLS;
  1577. MODULE_AUTHOR("Remy Card, Stephen Tweedie, Andrew Morton, Andreas Dilger, Theodore Ts'o and others");
  1578. MODULE_DESCRIPTION("Second Extended Filesystem with journaling extensions");
  1579. MODULE_LICENSE("GPL");
  1580. module_init(init_ext3_fs)
  1581. module_exit(exit_ext3_fs)