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

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  *  linux/fs/ext2/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/ext2_fs.h>
  23. #include <linux/slab.h>
  24. #include <linux/init.h>
  25. #include <linux/locks.h>
  26. #include <linux/blkdev.h>
  27. #include <asm/uaccess.h>
  28. static void ext2_sync_super(struct super_block *sb,
  29.     struct ext2_super_block *es);
  30. static char error_buf[1024];
  31. void ext2_error (struct super_block * sb, const char * function,
  32.  const char * fmt, ...)
  33. {
  34. va_list args;
  35. struct ext2_super_block *es = EXT2_SB(sb)->s_es;
  36. if (!(sb->s_flags & MS_RDONLY)) {
  37. sb->u.ext2_sb.s_mount_state |= EXT2_ERROR_FS;
  38. es->s_state =
  39. cpu_to_le16(le16_to_cpu(es->s_state) | EXT2_ERROR_FS);
  40. ext2_sync_super(sb, es);
  41. }
  42. va_start (args, fmt);
  43. vsprintf (error_buf, fmt, args);
  44. va_end (args);
  45. if (test_opt (sb, ERRORS_PANIC) ||
  46.     (le16_to_cpu(sb->u.ext2_sb.s_es->s_errors) == EXT2_ERRORS_PANIC &&
  47.      !test_opt (sb, ERRORS_CONT) && !test_opt (sb, ERRORS_RO)))
  48. panic ("EXT2-fs panic (device %s): %s: %sn",
  49.        bdevname(sb->s_dev), function, error_buf);
  50. printk (KERN_CRIT "EXT2-fs error (device %s): %s: %sn",
  51. bdevname(sb->s_dev), function, error_buf);
  52. if (test_opt (sb, ERRORS_RO) ||
  53.     (le16_to_cpu(sb->u.ext2_sb.s_es->s_errors) == EXT2_ERRORS_RO &&
  54.      !test_opt (sb, ERRORS_CONT) && !test_opt (sb, ERRORS_PANIC))) {
  55. printk ("Remounting filesystem read-onlyn");
  56. sb->s_flags |= MS_RDONLY;
  57. }
  58. }
  59. NORET_TYPE void ext2_panic (struct super_block * sb, const char * function,
  60.     const char * fmt, ...)
  61. {
  62. va_list args;
  63. if (!(sb->s_flags & MS_RDONLY)) {
  64. sb->u.ext2_sb.s_mount_state |= EXT2_ERROR_FS;
  65. sb->u.ext2_sb.s_es->s_state =
  66. cpu_to_le16(le16_to_cpu(sb->u.ext2_sb.s_es->s_state) | EXT2_ERROR_FS);
  67. mark_buffer_dirty(sb->u.ext2_sb.s_sbh);
  68. sb->s_dirt = 1;
  69. }
  70. va_start (args, fmt);
  71. vsprintf (error_buf, fmt, args);
  72. va_end (args);
  73. sb->s_flags |= MS_RDONLY;
  74. panic ("EXT2-fs panic (device %s): %s: %sn",
  75.        bdevname(sb->s_dev), function, error_buf);
  76. }
  77. void ext2_warning (struct super_block * sb, const char * function,
  78.    const char * fmt, ...)
  79. {
  80. va_list args;
  81. va_start (args, fmt);
  82. vsprintf (error_buf, fmt, args);
  83. va_end (args);
  84. printk (KERN_WARNING "EXT2-fs warning (device %s): %s: %sn",
  85. bdevname(sb->s_dev), function, error_buf);
  86. }
  87. void ext2_update_dynamic_rev(struct super_block *sb)
  88. {
  89. struct ext2_super_block *es = EXT2_SB(sb)->s_es;
  90. if (le32_to_cpu(es->s_rev_level) > EXT2_GOOD_OLD_REV)
  91. return;
  92. ext2_warning(sb, __FUNCTION__,
  93.      "updating to rev %d because of new feature flag, "
  94.      "running e2fsck is recommended",
  95.      EXT2_DYNAMIC_REV);
  96. es->s_first_ino = cpu_to_le32(EXT2_GOOD_OLD_FIRST_INO);
  97. es->s_inode_size = cpu_to_le16(EXT2_GOOD_OLD_INODE_SIZE);
  98. es->s_rev_level = cpu_to_le32(EXT2_DYNAMIC_REV);
  99. /* leave es->s_feature_*compat flags alone */
  100. /* es->s_uuid will be set by e2fsck if empty */
  101. /*
  102.  * The rest of the superblock fields should be zero, and if not it
  103.  * means they are likely already in use, so leave them alone.  We
  104.  * can leave it up to e2fsck to clean up any inconsistencies there.
  105.  */
  106. }
  107. void ext2_put_super (struct super_block * sb)
  108. {
  109. int db_count;
  110. int i;
  111. if (!(sb->s_flags & MS_RDONLY)) {
  112. struct ext2_super_block *es = EXT2_SB(sb)->s_es;
  113. es->s_state = le16_to_cpu(EXT2_SB(sb)->s_mount_state);
  114. ext2_sync_super(sb, es);
  115. }
  116. db_count = EXT2_SB(sb)->s_gdb_count;
  117. for (i = 0; i < db_count; i++)
  118. if (sb->u.ext2_sb.s_group_desc[i])
  119. brelse (sb->u.ext2_sb.s_group_desc[i]);
  120. kfree(sb->u.ext2_sb.s_group_desc);
  121. for (i = 0; i < EXT2_MAX_GROUP_LOADED; i++)
  122. if (sb->u.ext2_sb.s_inode_bitmap[i])
  123. brelse (sb->u.ext2_sb.s_inode_bitmap[i]);
  124. for (i = 0; i < EXT2_MAX_GROUP_LOADED; i++)
  125. if (sb->u.ext2_sb.s_block_bitmap[i])
  126. brelse (sb->u.ext2_sb.s_block_bitmap[i]);
  127. brelse (sb->u.ext2_sb.s_sbh);
  128. return;
  129. }
  130. static struct super_operations ext2_sops = {
  131. read_inode: ext2_read_inode,
  132. write_inode: ext2_write_inode,
  133. put_inode: ext2_put_inode,
  134. delete_inode: ext2_delete_inode,
  135. put_super: ext2_put_super,
  136. write_super: ext2_write_super,
  137. statfs: ext2_statfs,
  138. remount_fs: ext2_remount,
  139. };
  140. /*
  141.  * This function has been shamelessly adapted from the msdos fs
  142.  */
  143. static int parse_options (char * options, unsigned long * sb_block,
  144.   unsigned short *resuid, unsigned short * resgid,
  145.   unsigned long * mount_options)
  146. {
  147. char * this_char;
  148. char * value;
  149. if (!options)
  150. return 1;
  151. for (this_char = strtok (options, ",");
  152.      this_char != NULL;
  153.      this_char = strtok (NULL, ",")) {
  154. if ((value = strchr (this_char, '=')) != NULL)
  155. *value++ = 0;
  156. if (!strcmp (this_char, "bsddf"))
  157. clear_opt (*mount_options, MINIX_DF);
  158. else if (!strcmp (this_char, "nouid32")) {
  159. set_opt (*mount_options, NO_UID32);
  160. }
  161. else if (!strcmp (this_char, "check")) {
  162. if (!value || !*value || !strcmp (value, "none"))
  163. clear_opt (*mount_options, CHECK);
  164. else
  165. #ifdef CONFIG_EXT2_CHECK
  166. set_opt (*mount_options, CHECK);
  167. #else
  168. printk("EXT2 Check option not supportedn");
  169. #endif
  170. }
  171. else if (!strcmp (this_char, "debug"))
  172. set_opt (*mount_options, DEBUG);
  173. else if (!strcmp (this_char, "errors")) {
  174. if (!value || !*value) {
  175. printk ("EXT2-fs: the errors option requires "
  176. "an argumentn");
  177. return 0;
  178. }
  179. if (!strcmp (value, "continue")) {
  180. clear_opt (*mount_options, ERRORS_RO);
  181. clear_opt (*mount_options, ERRORS_PANIC);
  182. set_opt (*mount_options, ERRORS_CONT);
  183. }
  184. else if (!strcmp (value, "remount-ro")) {
  185. clear_opt (*mount_options, ERRORS_CONT);
  186. clear_opt (*mount_options, ERRORS_PANIC);
  187. set_opt (*mount_options, ERRORS_RO);
  188. }
  189. else if (!strcmp (value, "panic")) {
  190. clear_opt (*mount_options, ERRORS_CONT);
  191. clear_opt (*mount_options, ERRORS_RO);
  192. set_opt (*mount_options, ERRORS_PANIC);
  193. }
  194. else {
  195. printk ("EXT2-fs: Invalid errors option: %sn",
  196. value);
  197. return 0;
  198. }
  199. }
  200. else if (!strcmp (this_char, "grpid") ||
  201.  !strcmp (this_char, "bsdgroups"))
  202. set_opt (*mount_options, GRPID);
  203. else if (!strcmp (this_char, "minixdf"))
  204. set_opt (*mount_options, MINIX_DF);
  205. else if (!strcmp (this_char, "nocheck"))
  206. clear_opt (*mount_options, CHECK);
  207. else if (!strcmp (this_char, "nogrpid") ||
  208.  !strcmp (this_char, "sysvgroups"))
  209. clear_opt (*mount_options, GRPID);
  210. else if (!strcmp (this_char, "resgid")) {
  211. if (!value || !*value) {
  212. printk ("EXT2-fs: the resgid option requires "
  213. "an argumentn");
  214. return 0;
  215. }
  216. *resgid = simple_strtoul (value, &value, 0);
  217. if (*value) {
  218. printk ("EXT2-fs: Invalid resgid option: %sn",
  219. value);
  220. return 0;
  221. }
  222. }
  223. else if (!strcmp (this_char, "resuid")) {
  224. if (!value || !*value) {
  225. printk ("EXT2-fs: the resuid option requires "
  226. "an argument");
  227. return 0;
  228. }
  229. *resuid = simple_strtoul (value, &value, 0);
  230. if (*value) {
  231. printk ("EXT2-fs: Invalid resuid option: %sn",
  232. value);
  233. return 0;
  234. }
  235. }
  236. else if (!strcmp (this_char, "sb")) {
  237. if (!value || !*value) {
  238. printk ("EXT2-fs: the sb option requires "
  239. "an argument");
  240. return 0;
  241. }
  242. *sb_block = simple_strtoul (value, &value, 0);
  243. if (*value) {
  244. printk ("EXT2-fs: Invalid sb option: %sn",
  245. value);
  246. return 0;
  247. }
  248. }
  249. /* Silently ignore the quota options */
  250. else if (!strcmp (this_char, "grpquota")
  251.          || !strcmp (this_char, "noquota")
  252.          || !strcmp (this_char, "quota")
  253.          || !strcmp (this_char, "usrquota"))
  254. /* Don't do anything ;-) */ ;
  255. else {
  256. printk ("EXT2-fs: Unrecognized mount option %sn", this_char);
  257. return 0;
  258. }
  259. }
  260. return 1;
  261. }
  262. static int ext2_setup_super (struct super_block * sb,
  263.       struct ext2_super_block * es,
  264.       int read_only)
  265. {
  266. int res = 0;
  267. if (le32_to_cpu(es->s_rev_level) > EXT2_MAX_SUPP_REV) {
  268. printk ("EXT2-fs warning: revision level too high, "
  269. "forcing read-only moden");
  270. res = MS_RDONLY;
  271. }
  272. if (read_only)
  273. return res;
  274. if (!(sb->u.ext2_sb.s_mount_state & EXT2_VALID_FS))
  275. printk ("EXT2-fs warning: mounting unchecked fs, "
  276. "running e2fsck is recommendedn");
  277. else if ((sb->u.ext2_sb.s_mount_state & EXT2_ERROR_FS))
  278. printk ("EXT2-fs warning: mounting fs with errors, "
  279. "running e2fsck is recommendedn");
  280. else if ((__s16) le16_to_cpu(es->s_max_mnt_count) >= 0 &&
  281.  le16_to_cpu(es->s_mnt_count) >=
  282.  (unsigned short) (__s16) le16_to_cpu(es->s_max_mnt_count))
  283. printk ("EXT2-fs warning: maximal mount count reached, "
  284. "running e2fsck is recommendedn");
  285. else if (le32_to_cpu(es->s_checkinterval) &&
  286. (le32_to_cpu(es->s_lastcheck) + le32_to_cpu(es->s_checkinterval) <= CURRENT_TIME))
  287. printk ("EXT2-fs warning: checktime reached, "
  288. "running e2fsck is recommendedn");
  289. if (!(__s16) le16_to_cpu(es->s_max_mnt_count))
  290. es->s_max_mnt_count = (__s16) cpu_to_le16(EXT2_DFL_MAX_MNT_COUNT);
  291. es->s_mnt_count=cpu_to_le16(le16_to_cpu(es->s_mnt_count) + 1);
  292. ext2_write_super(sb);
  293. if (test_opt (sb, DEBUG))
  294. printk ("[EXT II FS %s, %s, bs=%lu, fs=%lu, gc=%lu, "
  295. "bpg=%lu, ipg=%lu, mo=%04lx]n",
  296. EXT2FS_VERSION, EXT2FS_DATE, sb->s_blocksize,
  297. sb->u.ext2_sb.s_frag_size,
  298. sb->u.ext2_sb.s_groups_count,
  299. EXT2_BLOCKS_PER_GROUP(sb),
  300. EXT2_INODES_PER_GROUP(sb),
  301. sb->u.ext2_sb.s_mount_opt);
  302. #ifdef CONFIG_EXT2_CHECK
  303. if (test_opt (sb, CHECK)) {
  304. ext2_check_blocks_bitmap (sb);
  305. ext2_check_inodes_bitmap (sb);
  306. }
  307. #endif
  308. return res;
  309. }
  310. static int ext2_check_descriptors (struct super_block * sb)
  311. {
  312. int i;
  313. int desc_block = 0;
  314. unsigned long block = le32_to_cpu(sb->u.ext2_sb.s_es->s_first_data_block);
  315. struct ext2_group_desc * gdp = NULL;
  316. ext2_debug ("Checking group descriptors");
  317. for (i = 0; i < sb->u.ext2_sb.s_groups_count; i++)
  318. {
  319. if ((i % EXT2_DESC_PER_BLOCK(sb)) == 0)
  320. gdp = (struct ext2_group_desc *) sb->u.ext2_sb.s_group_desc[desc_block++]->b_data;
  321. if (le32_to_cpu(gdp->bg_block_bitmap) < block ||
  322.     le32_to_cpu(gdp->bg_block_bitmap) >= block + EXT2_BLOCKS_PER_GROUP(sb))
  323. {
  324. ext2_error (sb, "ext2_check_descriptors",
  325.     "Block bitmap for group %d"
  326.     " not in group (block %lu)!",
  327.     i, (unsigned long) le32_to_cpu(gdp->bg_block_bitmap));
  328. return 0;
  329. }
  330. if (le32_to_cpu(gdp->bg_inode_bitmap) < block ||
  331.     le32_to_cpu(gdp->bg_inode_bitmap) >= block + EXT2_BLOCKS_PER_GROUP(sb))
  332. {
  333. ext2_error (sb, "ext2_check_descriptors",
  334.     "Inode bitmap for group %d"
  335.     " not in group (block %lu)!",
  336.     i, (unsigned long) le32_to_cpu(gdp->bg_inode_bitmap));
  337. return 0;
  338. }
  339. if (le32_to_cpu(gdp->bg_inode_table) < block ||
  340.     le32_to_cpu(gdp->bg_inode_table) + sb->u.ext2_sb.s_itb_per_group >=
  341.     block + EXT2_BLOCKS_PER_GROUP(sb))
  342. {
  343. ext2_error (sb, "ext2_check_descriptors",
  344.     "Inode table for group %d"
  345.     " not in group (block %lu)!",
  346.     i, (unsigned long) le32_to_cpu(gdp->bg_inode_table));
  347. return 0;
  348. }
  349. block += EXT2_BLOCKS_PER_GROUP(sb);
  350. gdp++;
  351. }
  352. return 1;
  353. }
  354. #define log2(n) ffz(~(n))
  355.  
  356. /*
  357.  * Maximal file size.  There is a direct, and {,double-,triple-}indirect
  358.  * block limit, and also a limit of (2^32 - 1) 512-byte sectors in i_blocks.
  359.  * We need to be 1 filesystem block less than the 2^32 sector limit.
  360.  */
  361. static loff_t ext2_max_size(int bits)
  362. {
  363. loff_t res = EXT2_NDIR_BLOCKS;
  364. res += 1LL << (bits-2);
  365. res += 1LL << (2*(bits-2));
  366. res += 1LL << (3*(bits-2));
  367. res <<= bits;
  368. if (res > (512LL << 32) - (1 << bits))
  369. res = (512LL << 32) - (1 << bits);
  370. return res;
  371. }
  372. struct super_block * ext2_read_super (struct super_block * sb, void * data,
  373.       int silent)
  374. {
  375. struct buffer_head * bh;
  376. struct ext2_super_block * es;
  377. unsigned long sb_block = 1;
  378. unsigned short resuid = EXT2_DEF_RESUID;
  379. unsigned short resgid = EXT2_DEF_RESGID;
  380. unsigned long logic_sb_block = 1;
  381. unsigned long offset = 0;
  382. kdev_t dev = sb->s_dev;
  383. int blocksize = BLOCK_SIZE;
  384. int db_count;
  385. int i, j;
  386. /*
  387.  * See what the current blocksize for the device is, and
  388.  * use that as the blocksize.  Otherwise (or if the blocksize
  389.  * is smaller than the default) use the default.
  390.  * This is important for devices that have a hardware
  391.  * sectorsize that is larger than the default.
  392.  */
  393. blocksize = get_hardsect_size(dev);
  394. if(blocksize < BLOCK_SIZE )
  395.     blocksize = BLOCK_SIZE;
  396. sb->u.ext2_sb.s_mount_opt = 0;
  397. if (!parse_options ((char *) data, &sb_block, &resuid, &resgid,
  398.     &sb->u.ext2_sb.s_mount_opt)) {
  399. return NULL;
  400. }
  401. if (set_blocksize(dev, blocksize) < 0) {
  402. printk ("EXT2-fs: unable to set blocksize %dn", blocksize);
  403. return NULL;
  404. }
  405. sb->s_blocksize = blocksize;
  406. /*
  407.  * If the superblock doesn't start on a sector boundary,
  408.  * calculate the offset.  FIXME(eric) this doesn't make sense
  409.  * that we would have to do this.
  410.  */
  411. if (blocksize != BLOCK_SIZE) {
  412. logic_sb_block = (sb_block*BLOCK_SIZE) / blocksize;
  413. offset = (sb_block*BLOCK_SIZE) % blocksize;
  414. }
  415. if (!(bh = sb_bread(sb, logic_sb_block))) {
  416. printk ("EXT2-fs: unable to read superblockn");
  417. return NULL;
  418. }
  419. /*
  420.  * Note: s_es must be initialized as soon as possible because
  421.  *       some ext2 macro-instructions depend on its value
  422.  */
  423. es = (struct ext2_super_block *) (((char *)bh->b_data) + offset);
  424. sb->u.ext2_sb.s_es = es;
  425. sb->s_magic = le16_to_cpu(es->s_magic);
  426. if (sb->s_magic != EXT2_SUPER_MAGIC) {
  427. if (!silent)
  428. printk ("VFS: Can't find ext2 filesystem on dev %s.n",
  429. bdevname(dev));
  430. goto failed_mount;
  431. }
  432. if (le32_to_cpu(es->s_rev_level) == EXT2_GOOD_OLD_REV &&
  433.     (EXT2_HAS_COMPAT_FEATURE(sb, ~0U) ||
  434.      EXT2_HAS_RO_COMPAT_FEATURE(sb, ~0U) ||
  435.      EXT2_HAS_INCOMPAT_FEATURE(sb, ~0U)))
  436. printk("EXT2-fs warning: feature flags set on rev 0 fs, "
  437.        "running e2fsck is recommendedn");
  438. /*
  439.  * Check feature flags regardless of the revision level, since we
  440.  * previously didn't change the revision level when setting the flags,
  441.  * so there is a chance incompat flags are set on a rev 0 filesystem.
  442.  */
  443. if ((i = EXT2_HAS_INCOMPAT_FEATURE(sb, ~EXT2_FEATURE_INCOMPAT_SUPP))) {
  444. printk("EXT2-fs: %s: couldn't mount because of "
  445.        "unsupported optional features (%x).n",
  446.        bdevname(dev), i);
  447. goto failed_mount;
  448. }
  449. if (!(sb->s_flags & MS_RDONLY) &&
  450.     (i = EXT2_HAS_RO_COMPAT_FEATURE(sb, ~EXT2_FEATURE_RO_COMPAT_SUPP))){
  451. printk("EXT2-fs: %s: couldn't mount RDWR because of "
  452.        "unsupported optional features (%x).n",
  453.        bdevname(dev), i);
  454. goto failed_mount;
  455. }
  456. if (EXT2_HAS_COMPAT_FEATURE(sb, EXT3_FEATURE_COMPAT_HAS_JOURNAL))
  457. ext2_warning(sb, __FUNCTION__,
  458. "mounting ext3 filesystem as ext2n");
  459. sb->s_blocksize_bits =
  460. le32_to_cpu(EXT2_SB(sb)->s_es->s_log_block_size) + 10;
  461. sb->s_blocksize = 1 << sb->s_blocksize_bits;
  462. sb->s_maxbytes = ext2_max_size(sb->s_blocksize_bits);
  463. /* If the blocksize doesn't match, re-read the thing.. */
  464. if (sb->s_blocksize != blocksize) {
  465. blocksize = sb->s_blocksize;
  466. brelse(bh);
  467. if (set_blocksize(dev, blocksize) < 0) {
  468. printk(KERN_ERR "EXT2-fs: blocksize too small for device.n");
  469. return NULL;
  470. }
  471. logic_sb_block = (sb_block*BLOCK_SIZE) / blocksize;
  472. offset = (sb_block*BLOCK_SIZE) % blocksize;
  473. bh = sb_bread(sb, logic_sb_block);
  474. if(!bh) {
  475. printk("EXT2-fs: Couldn't read superblock on "
  476.        "2nd try.n");
  477. goto failed_mount;
  478. }
  479. es = (struct ext2_super_block *) (((char *)bh->b_data) + offset);
  480. sb->u.ext2_sb.s_es = es;
  481. if (es->s_magic != le16_to_cpu(EXT2_SUPER_MAGIC)) {
  482. printk ("EXT2-fs: Magic mismatch, very weird !n");
  483. goto failed_mount;
  484. }
  485. }
  486. if (le32_to_cpu(es->s_rev_level) == EXT2_GOOD_OLD_REV) {
  487. sb->u.ext2_sb.s_inode_size = EXT2_GOOD_OLD_INODE_SIZE;
  488. sb->u.ext2_sb.s_first_ino = EXT2_GOOD_OLD_FIRST_INO;
  489. } else {
  490. sb->u.ext2_sb.s_inode_size = le16_to_cpu(es->s_inode_size);
  491. sb->u.ext2_sb.s_first_ino = le32_to_cpu(es->s_first_ino);
  492. if (sb->u.ext2_sb.s_inode_size != EXT2_GOOD_OLD_INODE_SIZE) {
  493. printk ("EXT2-fs: unsupported inode size: %dn",
  494. sb->u.ext2_sb.s_inode_size);
  495. goto failed_mount;
  496. }
  497. }
  498. sb->u.ext2_sb.s_frag_size = EXT2_MIN_FRAG_SIZE <<
  499.    le32_to_cpu(es->s_log_frag_size);
  500. if (sb->u.ext2_sb.s_frag_size)
  501. sb->u.ext2_sb.s_frags_per_block = sb->s_blocksize /
  502.   sb->u.ext2_sb.s_frag_size;
  503. else
  504. sb->s_magic = 0;
  505. sb->u.ext2_sb.s_blocks_per_group = le32_to_cpu(es->s_blocks_per_group);
  506. sb->u.ext2_sb.s_frags_per_group = le32_to_cpu(es->s_frags_per_group);
  507. sb->u.ext2_sb.s_inodes_per_group = le32_to_cpu(es->s_inodes_per_group);
  508. sb->u.ext2_sb.s_inodes_per_block = sb->s_blocksize /
  509.    EXT2_INODE_SIZE(sb);
  510. sb->u.ext2_sb.s_itb_per_group = sb->u.ext2_sb.s_inodes_per_group /
  511.         sb->u.ext2_sb.s_inodes_per_block;
  512. sb->u.ext2_sb.s_desc_per_block = sb->s_blocksize /
  513.  sizeof (struct ext2_group_desc);
  514. sb->u.ext2_sb.s_sbh = bh;
  515. if (resuid != EXT2_DEF_RESUID)
  516. sb->u.ext2_sb.s_resuid = resuid;
  517. else
  518. sb->u.ext2_sb.s_resuid = le16_to_cpu(es->s_def_resuid);
  519. if (resgid != EXT2_DEF_RESGID)
  520. sb->u.ext2_sb.s_resgid = resgid;
  521. else
  522. sb->u.ext2_sb.s_resgid = le16_to_cpu(es->s_def_resgid);
  523. sb->u.ext2_sb.s_mount_state = le16_to_cpu(es->s_state);
  524. sb->u.ext2_sb.s_addr_per_block_bits =
  525. log2 (EXT2_ADDR_PER_BLOCK(sb));
  526. sb->u.ext2_sb.s_desc_per_block_bits =
  527. log2 (EXT2_DESC_PER_BLOCK(sb));
  528. if (sb->s_magic != EXT2_SUPER_MAGIC) {
  529. if (!silent)
  530. printk ("VFS: Can't find an ext2 filesystem on dev "
  531. "%s.n",
  532. bdevname(dev));
  533. goto failed_mount;
  534. }
  535. if (sb->s_blocksize != bh->b_size) {
  536. if (!silent)
  537. printk ("VFS: Unsupported blocksize on dev "
  538. "%s.n", bdevname(dev));
  539. goto failed_mount;
  540. }
  541. if (sb->s_blocksize != sb->u.ext2_sb.s_frag_size) {
  542. printk ("EXT2-fs: fragsize %lu != blocksize %lu (not supported yet)n",
  543. sb->u.ext2_sb.s_frag_size, sb->s_blocksize);
  544. goto failed_mount;
  545. }
  546. if (sb->u.ext2_sb.s_blocks_per_group > sb->s_blocksize * 8) {
  547. printk ("EXT2-fs: #blocks per group too big: %lun",
  548. sb->u.ext2_sb.s_blocks_per_group);
  549. goto failed_mount;
  550. }
  551. if (sb->u.ext2_sb.s_frags_per_group > sb->s_blocksize * 8) {
  552. printk ("EXT2-fs: #fragments per group too big: %lun",
  553. sb->u.ext2_sb.s_frags_per_group);
  554. goto failed_mount;
  555. }
  556. if (sb->u.ext2_sb.s_inodes_per_group > sb->s_blocksize * 8) {
  557. printk ("EXT2-fs: #inodes per group too big: %lun",
  558. sb->u.ext2_sb.s_inodes_per_group);
  559. goto failed_mount;
  560. }
  561. sb->u.ext2_sb.s_groups_count = (le32_to_cpu(es->s_blocks_count) -
  562.         le32_to_cpu(es->s_first_data_block) +
  563.        EXT2_BLOCKS_PER_GROUP(sb) - 1) /
  564.        EXT2_BLOCKS_PER_GROUP(sb);
  565. db_count = (sb->u.ext2_sb.s_groups_count + EXT2_DESC_PER_BLOCK(sb) - 1) /
  566.    EXT2_DESC_PER_BLOCK(sb);
  567. sb->u.ext2_sb.s_group_desc = kmalloc (db_count * sizeof (struct buffer_head *), GFP_KERNEL);
  568. if (sb->u.ext2_sb.s_group_desc == NULL) {
  569. printk ("EXT2-fs: not enough memoryn");
  570. goto failed_mount;
  571. }
  572. for (i = 0; i < db_count; i++) {
  573. sb->u.ext2_sb.s_group_desc[i] = sb_bread(sb, logic_sb_block + i + 1);
  574. if (!sb->u.ext2_sb.s_group_desc[i]) {
  575. for (j = 0; j < i; j++)
  576. brelse (sb->u.ext2_sb.s_group_desc[j]);
  577. kfree(sb->u.ext2_sb.s_group_desc);
  578. printk ("EXT2-fs: unable to read group descriptorsn");
  579. goto failed_mount;
  580. }
  581. }
  582. if (!ext2_check_descriptors (sb)) {
  583. printk ("EXT2-fs: group descriptors corrupted!n");
  584. db_count = i;
  585. goto failed_mount2;
  586. }
  587. for (i = 0; i < EXT2_MAX_GROUP_LOADED; i++) {
  588. sb->u.ext2_sb.s_inode_bitmap_number[i] = 0;
  589. sb->u.ext2_sb.s_inode_bitmap[i] = NULL;
  590. sb->u.ext2_sb.s_block_bitmap_number[i] = 0;
  591. sb->u.ext2_sb.s_block_bitmap[i] = NULL;
  592. }
  593. sb->u.ext2_sb.s_loaded_inode_bitmaps = 0;
  594. sb->u.ext2_sb.s_loaded_block_bitmaps = 0;
  595. sb->u.ext2_sb.s_gdb_count = db_count;
  596. /*
  597.  * set up enough so that it can read an inode
  598.  */
  599. sb->s_op = &ext2_sops;
  600. sb->s_root = d_alloc_root(iget(sb, EXT2_ROOT_INO));
  601. if (!sb->s_root || !S_ISDIR(sb->s_root->d_inode->i_mode) ||
  602.     !sb->s_root->d_inode->i_blocks || !sb->s_root->d_inode->i_size) {
  603. if (sb->s_root) {
  604. dput(sb->s_root);
  605. sb->s_root = NULL;
  606. printk(KERN_ERR "EXT2-fs: corrupt root inode, run e2fsckn");
  607. } else
  608. printk(KERN_ERR "EXT2-fs: get root inode failedn");
  609. goto failed_mount2;
  610. }
  611. ext2_setup_super (sb, es, sb->s_flags & MS_RDONLY);
  612. return sb;
  613. failed_mount2:
  614. for (i = 0; i < db_count; i++)
  615. brelse(sb->u.ext2_sb.s_group_desc[i]);
  616. kfree(sb->u.ext2_sb.s_group_desc);
  617. failed_mount:
  618. brelse(bh);
  619. return NULL;
  620. }
  621. static void ext2_commit_super (struct super_block * sb,
  622.        struct ext2_super_block * es)
  623. {
  624. es->s_wtime = cpu_to_le32(CURRENT_TIME);
  625. mark_buffer_dirty(sb->u.ext2_sb.s_sbh);
  626. sb->s_dirt = 0;
  627. }
  628. static void ext2_sync_super(struct super_block *sb, struct ext2_super_block *es)
  629. {
  630. es->s_wtime = cpu_to_le32(CURRENT_TIME);
  631. mark_buffer_dirty(EXT2_SB(sb)->s_sbh);
  632. ll_rw_block(WRITE, 1, &EXT2_SB(sb)->s_sbh);
  633. wait_on_buffer(EXT2_SB(sb)->s_sbh);
  634. sb->s_dirt = 0;
  635. }
  636. /*
  637.  * In the second extended file system, it is not necessary to
  638.  * write the super block since we use a mapping of the
  639.  * disk super block in a buffer.
  640.  *
  641.  * However, this function is still used to set the fs valid
  642.  * flags to 0.  We need to set this flag to 0 since the fs
  643.  * may have been checked while mounted and e2fsck may have
  644.  * set s_state to EXT2_VALID_FS after some corrections.
  645.  */
  646. void ext2_write_super (struct super_block * sb)
  647. {
  648. struct ext2_super_block * es;
  649. if (!(sb->s_flags & MS_RDONLY)) {
  650. es = sb->u.ext2_sb.s_es;
  651. if (le16_to_cpu(es->s_state) & EXT2_VALID_FS) {
  652. ext2_debug ("setting valid to 0n");
  653. es->s_state = cpu_to_le16(le16_to_cpu(es->s_state) &
  654.   ~EXT2_VALID_FS);
  655. es->s_mtime = cpu_to_le32(CURRENT_TIME);
  656. ext2_sync_super(sb, es);
  657. } else
  658. ext2_commit_super (sb, es);
  659. }
  660. sb->s_dirt = 0;
  661. }
  662. int ext2_remount (struct super_block * sb, int * flags, char * data)
  663. {
  664. struct ext2_super_block * es;
  665. unsigned short resuid = sb->u.ext2_sb.s_resuid;
  666. unsigned short resgid = sb->u.ext2_sb.s_resgid;
  667. unsigned long new_mount_opt;
  668. unsigned long tmp;
  669. /*
  670.  * Allow the "check" option to be passed as a remount option.
  671.  */
  672. new_mount_opt = sb->u.ext2_sb.s_mount_opt;
  673. if (!parse_options (data, &tmp, &resuid, &resgid,
  674.     &new_mount_opt))
  675. return -EINVAL;
  676. sb->u.ext2_sb.s_mount_opt = new_mount_opt;
  677. sb->u.ext2_sb.s_resuid = resuid;
  678. sb->u.ext2_sb.s_resgid = resgid;
  679. es = sb->u.ext2_sb.s_es;
  680. if ((*flags & MS_RDONLY) == (sb->s_flags & MS_RDONLY))
  681. return 0;
  682. if (*flags & MS_RDONLY) {
  683. if (le16_to_cpu(es->s_state) & EXT2_VALID_FS ||
  684.     !(sb->u.ext2_sb.s_mount_state & EXT2_VALID_FS))
  685. return 0;
  686. /*
  687.  * OK, we are remounting a valid rw partition rdonly, so set
  688.  * the rdonly flag and then mark the partition as valid again.
  689.  */
  690. es->s_state = cpu_to_le16(sb->u.ext2_sb.s_mount_state);
  691. es->s_mtime = cpu_to_le32(CURRENT_TIME);
  692. } else {
  693. int ret;
  694. if ((ret = EXT2_HAS_RO_COMPAT_FEATURE(sb,
  695.        ~EXT2_FEATURE_RO_COMPAT_SUPP))) {
  696. printk("EXT2-fs: %s: couldn't remount RDWR because of "
  697.        "unsupported optional features (%x).n",
  698.        bdevname(sb->s_dev), ret);
  699. return -EROFS;
  700. }
  701. /*
  702.  * Mounting a RDONLY partition read-write, so reread and
  703.  * store the current valid flag.  (It may have been changed
  704.  * by e2fsck since we originally mounted the partition.)
  705.  */
  706. sb->u.ext2_sb.s_mount_state = le16_to_cpu(es->s_state);
  707. if (!ext2_setup_super (sb, es, 0))
  708. sb->s_flags &= ~MS_RDONLY;
  709. }
  710. ext2_sync_super(sb, es);
  711. return 0;
  712. }
  713. int ext2_statfs (struct super_block * sb, struct statfs * buf)
  714. {
  715. unsigned long overhead;
  716. int i;
  717. if (test_opt (sb, MINIX_DF))
  718. overhead = 0;
  719. else {
  720. /*
  721.  * Compute the overhead (FS structures)
  722.  */
  723. /*
  724.  * All of the blocks before first_data_block are
  725.  * overhead
  726.  */
  727. overhead = le32_to_cpu(sb->u.ext2_sb.s_es->s_first_data_block);
  728. /*
  729.  * Add the overhead attributed to the superblock and
  730.  * block group descriptors.  If the sparse superblocks
  731.  * feature is turned on, then not all groups have this.
  732.  */
  733. for (i = 0; i < EXT2_SB(sb)->s_groups_count; i++)
  734. overhead += ext2_bg_has_super(sb, i) +
  735. ext2_bg_num_gdb(sb, i);
  736. /*
  737.  * Every block group has an inode bitmap, a block
  738.  * bitmap, and an inode table.
  739.  */
  740. overhead += (sb->u.ext2_sb.s_groups_count *
  741.      (2 + sb->u.ext2_sb.s_itb_per_group));
  742. }
  743. buf->f_type = EXT2_SUPER_MAGIC;
  744. buf->f_bsize = sb->s_blocksize;
  745. buf->f_blocks = le32_to_cpu(sb->u.ext2_sb.s_es->s_blocks_count) - overhead;
  746. buf->f_bfree = ext2_count_free_blocks (sb);
  747. buf->f_bavail = buf->f_bfree - le32_to_cpu(sb->u.ext2_sb.s_es->s_r_blocks_count);
  748. if (buf->f_bfree < le32_to_cpu(sb->u.ext2_sb.s_es->s_r_blocks_count))
  749. buf->f_bavail = 0;
  750. buf->f_files = le32_to_cpu(sb->u.ext2_sb.s_es->s_inodes_count);
  751. buf->f_ffree = ext2_count_free_inodes (sb);
  752. buf->f_namelen = EXT2_NAME_LEN;
  753. return 0;
  754. }
  755. static DECLARE_FSTYPE_DEV(ext2_fs_type, "ext2", ext2_read_super);
  756. static int __init init_ext2_fs(void)
  757. {
  758.         return register_filesystem(&ext2_fs_type);
  759. }
  760. static void __exit exit_ext2_fs(void)
  761. {
  762. unregister_filesystem(&ext2_fs_type);
  763. }
  764. EXPORT_NO_SYMBOLS;
  765. module_init(init_ext2_fs)
  766. module_exit(exit_ext2_fs)