super.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:25k
源码类别:

嵌入式Linux

开发平台:

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. sb->s_blocksize_bits =
  457. le32_to_cpu(EXT2_SB(sb)->s_es->s_log_block_size) + 10;
  458. sb->s_blocksize = 1 << sb->s_blocksize_bits;
  459. sb->s_maxbytes = ext2_max_size(sb->s_blocksize_bits);
  460. /* If the blocksize doesn't match, re-read the thing.. */
  461. if (sb->s_blocksize != blocksize) {
  462. blocksize = sb->s_blocksize;
  463. brelse(bh);
  464. if (set_blocksize(dev, blocksize) < 0) {
  465. printk(KERN_ERR "EXT2-fs: blocksize too small for device.n");
  466. return NULL;
  467. }
  468. logic_sb_block = (sb_block*BLOCK_SIZE) / blocksize;
  469. offset = (sb_block*BLOCK_SIZE) % blocksize;
  470. bh = sb_bread(sb, logic_sb_block);
  471. if(!bh) {
  472. printk("EXT2-fs: Couldn't read superblock on "
  473.        "2nd try.n");
  474. goto failed_mount;
  475. }
  476. es = (struct ext2_super_block *) (((char *)bh->b_data) + offset);
  477. sb->u.ext2_sb.s_es = es;
  478. if (es->s_magic != le16_to_cpu(EXT2_SUPER_MAGIC)) {
  479. printk ("EXT2-fs: Magic mismatch, very weird !n");
  480. goto failed_mount;
  481. }
  482. }
  483. if (le32_to_cpu(es->s_rev_level) == EXT2_GOOD_OLD_REV) {
  484. sb->u.ext2_sb.s_inode_size = EXT2_GOOD_OLD_INODE_SIZE;
  485. sb->u.ext2_sb.s_first_ino = EXT2_GOOD_OLD_FIRST_INO;
  486. } else {
  487. sb->u.ext2_sb.s_inode_size = le16_to_cpu(es->s_inode_size);
  488. sb->u.ext2_sb.s_first_ino = le32_to_cpu(es->s_first_ino);
  489. if (sb->u.ext2_sb.s_inode_size != EXT2_GOOD_OLD_INODE_SIZE) {
  490. printk ("EXT2-fs: unsupported inode size: %dn",
  491. sb->u.ext2_sb.s_inode_size);
  492. goto failed_mount;
  493. }
  494. }
  495. sb->u.ext2_sb.s_frag_size = EXT2_MIN_FRAG_SIZE <<
  496.    le32_to_cpu(es->s_log_frag_size);
  497. if (sb->u.ext2_sb.s_frag_size)
  498. sb->u.ext2_sb.s_frags_per_block = sb->s_blocksize /
  499.   sb->u.ext2_sb.s_frag_size;
  500. else
  501. sb->s_magic = 0;
  502. sb->u.ext2_sb.s_blocks_per_group = le32_to_cpu(es->s_blocks_per_group);
  503. sb->u.ext2_sb.s_frags_per_group = le32_to_cpu(es->s_frags_per_group);
  504. sb->u.ext2_sb.s_inodes_per_group = le32_to_cpu(es->s_inodes_per_group);
  505. sb->u.ext2_sb.s_inodes_per_block = sb->s_blocksize /
  506.    EXT2_INODE_SIZE(sb);
  507. sb->u.ext2_sb.s_itb_per_group = sb->u.ext2_sb.s_inodes_per_group /
  508.         sb->u.ext2_sb.s_inodes_per_block;
  509. sb->u.ext2_sb.s_desc_per_block = sb->s_blocksize /
  510.  sizeof (struct ext2_group_desc);
  511. sb->u.ext2_sb.s_sbh = bh;
  512. if (resuid != EXT2_DEF_RESUID)
  513. sb->u.ext2_sb.s_resuid = resuid;
  514. else
  515. sb->u.ext2_sb.s_resuid = le16_to_cpu(es->s_def_resuid);
  516. if (resgid != EXT2_DEF_RESGID)
  517. sb->u.ext2_sb.s_resgid = resgid;
  518. else
  519. sb->u.ext2_sb.s_resgid = le16_to_cpu(es->s_def_resgid);
  520. sb->u.ext2_sb.s_mount_state = le16_to_cpu(es->s_state);
  521. sb->u.ext2_sb.s_addr_per_block_bits =
  522. log2 (EXT2_ADDR_PER_BLOCK(sb));
  523. sb->u.ext2_sb.s_desc_per_block_bits =
  524. log2 (EXT2_DESC_PER_BLOCK(sb));
  525. if (sb->s_magic != EXT2_SUPER_MAGIC) {
  526. if (!silent)
  527. printk ("VFS: Can't find an ext2 filesystem on dev "
  528. "%s.n",
  529. bdevname(dev));
  530. goto failed_mount;
  531. }
  532. if (sb->s_blocksize != bh->b_size) {
  533. if (!silent)
  534. printk ("VFS: Unsupported blocksize on dev "
  535. "%s.n", bdevname(dev));
  536. goto failed_mount;
  537. }
  538. if (sb->s_blocksize != sb->u.ext2_sb.s_frag_size) {
  539. printk ("EXT2-fs: fragsize %lu != blocksize %lu (not supported yet)n",
  540. sb->u.ext2_sb.s_frag_size, sb->s_blocksize);
  541. goto failed_mount;
  542. }
  543. if (sb->u.ext2_sb.s_blocks_per_group > sb->s_blocksize * 8) {
  544. printk ("EXT2-fs: #blocks per group too big: %lun",
  545. sb->u.ext2_sb.s_blocks_per_group);
  546. goto failed_mount;
  547. }
  548. if (sb->u.ext2_sb.s_frags_per_group > sb->s_blocksize * 8) {
  549. printk ("EXT2-fs: #fragments per group too big: %lun",
  550. sb->u.ext2_sb.s_frags_per_group);
  551. goto failed_mount;
  552. }
  553. if (sb->u.ext2_sb.s_inodes_per_group > sb->s_blocksize * 8) {
  554. printk ("EXT2-fs: #inodes per group too big: %lun",
  555. sb->u.ext2_sb.s_inodes_per_group);
  556. goto failed_mount;
  557. }
  558. sb->u.ext2_sb.s_groups_count = (le32_to_cpu(es->s_blocks_count) -
  559.         le32_to_cpu(es->s_first_data_block) +
  560.        EXT2_BLOCKS_PER_GROUP(sb) - 1) /
  561.        EXT2_BLOCKS_PER_GROUP(sb);
  562. db_count = (sb->u.ext2_sb.s_groups_count + EXT2_DESC_PER_BLOCK(sb) - 1) /
  563.    EXT2_DESC_PER_BLOCK(sb);
  564. sb->u.ext2_sb.s_group_desc = kmalloc (db_count * sizeof (struct buffer_head *), GFP_KERNEL);
  565. if (sb->u.ext2_sb.s_group_desc == NULL) {
  566. printk ("EXT2-fs: not enough memoryn");
  567. goto failed_mount;
  568. }
  569. for (i = 0; i < db_count; i++) {
  570. sb->u.ext2_sb.s_group_desc[i] = sb_bread(sb, logic_sb_block + i + 1);
  571. if (!sb->u.ext2_sb.s_group_desc[i]) {
  572. for (j = 0; j < i; j++)
  573. brelse (sb->u.ext2_sb.s_group_desc[j]);
  574. kfree(sb->u.ext2_sb.s_group_desc);
  575. printk ("EXT2-fs: unable to read group descriptorsn");
  576. goto failed_mount;
  577. }
  578. }
  579. if (!ext2_check_descriptors (sb)) {
  580. printk ("EXT2-fs: group descriptors corrupted!n");
  581. db_count = i;
  582. goto failed_mount2;
  583. }
  584. for (i = 0; i < EXT2_MAX_GROUP_LOADED; i++) {
  585. sb->u.ext2_sb.s_inode_bitmap_number[i] = 0;
  586. sb->u.ext2_sb.s_inode_bitmap[i] = NULL;
  587. sb->u.ext2_sb.s_block_bitmap_number[i] = 0;
  588. sb->u.ext2_sb.s_block_bitmap[i] = NULL;
  589. }
  590. sb->u.ext2_sb.s_loaded_inode_bitmaps = 0;
  591. sb->u.ext2_sb.s_loaded_block_bitmaps = 0;
  592. sb->u.ext2_sb.s_gdb_count = db_count;
  593. /*
  594.  * set up enough so that it can read an inode
  595.  */
  596. sb->s_op = &ext2_sops;
  597. sb->s_root = d_alloc_root(iget(sb, EXT2_ROOT_INO));
  598. if (!sb->s_root || !S_ISDIR(sb->s_root->d_inode->i_mode) ||
  599.     !sb->s_root->d_inode->i_blocks || !sb->s_root->d_inode->i_size) {
  600. if (sb->s_root) {
  601. dput(sb->s_root);
  602. sb->s_root = NULL;
  603. printk(KERN_ERR "EXT2-fs: corrupt root inode, run e2fsckn");
  604. } else
  605. printk(KERN_ERR "EXT2-fs: get root inode failedn");
  606. goto failed_mount2;
  607. }
  608. ext2_setup_super (sb, es, sb->s_flags & MS_RDONLY);
  609. return sb;
  610. failed_mount2:
  611. for (i = 0; i < db_count; i++)
  612. brelse(sb->u.ext2_sb.s_group_desc[i]);
  613. kfree(sb->u.ext2_sb.s_group_desc);
  614. failed_mount:
  615. brelse(bh);
  616. return NULL;
  617. }
  618. static void ext2_commit_super (struct super_block * sb,
  619.        struct ext2_super_block * es)
  620. {
  621. es->s_wtime = cpu_to_le32(CURRENT_TIME);
  622. mark_buffer_dirty(sb->u.ext2_sb.s_sbh);
  623. sb->s_dirt = 0;
  624. }
  625. static void ext2_sync_super(struct super_block *sb, struct ext2_super_block *es)
  626. {
  627. es->s_wtime = cpu_to_le32(CURRENT_TIME);
  628. mark_buffer_dirty(EXT2_SB(sb)->s_sbh);
  629. ll_rw_block(WRITE, 1, &EXT2_SB(sb)->s_sbh);
  630. wait_on_buffer(EXT2_SB(sb)->s_sbh);
  631. sb->s_dirt = 0;
  632. }
  633. /*
  634.  * In the second extended file system, it is not necessary to
  635.  * write the super block since we use a mapping of the
  636.  * disk super block in a buffer.
  637.  *
  638.  * However, this function is still used to set the fs valid
  639.  * flags to 0.  We need to set this flag to 0 since the fs
  640.  * may have been checked while mounted and e2fsck may have
  641.  * set s_state to EXT2_VALID_FS after some corrections.
  642.  */
  643. void ext2_write_super (struct super_block * sb)
  644. {
  645. struct ext2_super_block * es;
  646. if (!(sb->s_flags & MS_RDONLY)) {
  647. es = sb->u.ext2_sb.s_es;
  648. if (le16_to_cpu(es->s_state) & EXT2_VALID_FS) {
  649. ext2_debug ("setting valid to 0n");
  650. es->s_state = cpu_to_le16(le16_to_cpu(es->s_state) &
  651.   ~EXT2_VALID_FS);
  652. es->s_mtime = cpu_to_le32(CURRENT_TIME);
  653. ext2_sync_super(sb, es);
  654. } else
  655. ext2_commit_super (sb, es);
  656. }
  657. sb->s_dirt = 0;
  658. }
  659. int ext2_remount (struct super_block * sb, int * flags, char * data)
  660. {
  661. struct ext2_super_block * es;
  662. unsigned short resuid = sb->u.ext2_sb.s_resuid;
  663. unsigned short resgid = sb->u.ext2_sb.s_resgid;
  664. unsigned long new_mount_opt;
  665. unsigned long tmp;
  666. /*
  667.  * Allow the "check" option to be passed as a remount option.
  668.  */
  669. new_mount_opt = sb->u.ext2_sb.s_mount_opt;
  670. if (!parse_options (data, &tmp, &resuid, &resgid,
  671.     &new_mount_opt))
  672. return -EINVAL;
  673. sb->u.ext2_sb.s_mount_opt = new_mount_opt;
  674. sb->u.ext2_sb.s_resuid = resuid;
  675. sb->u.ext2_sb.s_resgid = resgid;
  676. es = sb->u.ext2_sb.s_es;
  677. if ((*flags & MS_RDONLY) == (sb->s_flags & MS_RDONLY))
  678. return 0;
  679. if (*flags & MS_RDONLY) {
  680. if (le16_to_cpu(es->s_state) & EXT2_VALID_FS ||
  681.     !(sb->u.ext2_sb.s_mount_state & EXT2_VALID_FS))
  682. return 0;
  683. /*
  684.  * OK, we are remounting a valid rw partition rdonly, so set
  685.  * the rdonly flag and then mark the partition as valid again.
  686.  */
  687. es->s_state = cpu_to_le16(sb->u.ext2_sb.s_mount_state);
  688. es->s_mtime = cpu_to_le32(CURRENT_TIME);
  689. } else {
  690. int ret;
  691. if ((ret = EXT2_HAS_RO_COMPAT_FEATURE(sb,
  692.        ~EXT2_FEATURE_RO_COMPAT_SUPP))) {
  693. printk("EXT2-fs: %s: couldn't remount RDWR because of "
  694.        "unsupported optional features (%x).n",
  695.        bdevname(sb->s_dev), ret);
  696. return -EROFS;
  697. }
  698. /*
  699.  * Mounting a RDONLY partition read-write, so reread and
  700.  * store the current valid flag.  (It may have been changed
  701.  * by e2fsck since we originally mounted the partition.)
  702.  */
  703. sb->u.ext2_sb.s_mount_state = le16_to_cpu(es->s_state);
  704. if (!ext2_setup_super (sb, es, 0))
  705. sb->s_flags &= ~MS_RDONLY;
  706. }
  707. ext2_sync_super(sb, es);
  708. return 0;
  709. }
  710. int ext2_statfs (struct super_block * sb, struct statfs * buf)
  711. {
  712. unsigned long overhead;
  713. int i;
  714. if (test_opt (sb, MINIX_DF))
  715. overhead = 0;
  716. else {
  717. /*
  718.  * Compute the overhead (FS structures)
  719.  */
  720. /*
  721.  * All of the blocks before first_data_block are
  722.  * overhead
  723.  */
  724. overhead = le32_to_cpu(sb->u.ext2_sb.s_es->s_first_data_block);
  725. /*
  726.  * Add the overhead attributed to the superblock and
  727.  * block group descriptors.  If the sparse superblocks
  728.  * feature is turned on, then not all groups have this.
  729.  */
  730. for (i = 0; i < EXT2_SB(sb)->s_groups_count; i++)
  731. overhead += ext2_bg_has_super(sb, i) +
  732. ext2_bg_num_gdb(sb, i);
  733. /*
  734.  * Every block group has an inode bitmap, a block
  735.  * bitmap, and an inode table.
  736.  */
  737. overhead += (sb->u.ext2_sb.s_groups_count *
  738.      (2 + sb->u.ext2_sb.s_itb_per_group));
  739. }
  740. buf->f_type = EXT2_SUPER_MAGIC;
  741. buf->f_bsize = sb->s_blocksize;
  742. buf->f_blocks = le32_to_cpu(sb->u.ext2_sb.s_es->s_blocks_count) - overhead;
  743. buf->f_bfree = ext2_count_free_blocks (sb);
  744. buf->f_bavail = buf->f_bfree - le32_to_cpu(sb->u.ext2_sb.s_es->s_r_blocks_count);
  745. if (buf->f_bfree < le32_to_cpu(sb->u.ext2_sb.s_es->s_r_blocks_count))
  746. buf->f_bavail = 0;
  747. buf->f_files = le32_to_cpu(sb->u.ext2_sb.s_es->s_inodes_count);
  748. buf->f_ffree = ext2_count_free_inodes (sb);
  749. buf->f_namelen = EXT2_NAME_LEN;
  750. return 0;
  751. }
  752. static DECLARE_FSTYPE_DEV(ext2_fs_type, "ext2", ext2_read_super);
  753. static int __init init_ext2_fs(void)
  754. {
  755.         return register_filesystem(&ext2_fs_type);
  756. }
  757. static void __exit exit_ext2_fs(void)
  758. {
  759. unregister_filesystem(&ext2_fs_type);
  760. }
  761. EXPORT_NO_SYMBOLS;
  762. module_init(init_ext2_fs)
  763. module_exit(exit_ext2_fs)