diff options
Diffstat (limited to 'fs/reiserfs/super.c')
-rw-r--r-- | fs/reiserfs/super.c | 161 |
1 files changed, 18 insertions, 143 deletions
diff --git a/fs/reiserfs/super.c b/fs/reiserfs/super.c index b40d4d64d598..c89aa2338191 100644 --- a/fs/reiserfs/super.c +++ b/fs/reiserfs/super.c | |||
@@ -432,7 +432,6 @@ int remove_save_link(struct inode *inode, int truncate) | |||
432 | 432 | ||
433 | static void reiserfs_put_super(struct super_block *s) | 433 | static void reiserfs_put_super(struct super_block *s) |
434 | { | 434 | { |
435 | int i; | ||
436 | struct reiserfs_transaction_handle th; | 435 | struct reiserfs_transaction_handle th; |
437 | th.t_trans_id = 0; | 436 | th.t_trans_id = 0; |
438 | 437 | ||
@@ -462,10 +461,7 @@ static void reiserfs_put_super(struct super_block *s) | |||
462 | */ | 461 | */ |
463 | journal_release(&th, s); | 462 | journal_release(&th, s); |
464 | 463 | ||
465 | for (i = 0; i < SB_BMAP_NR(s); i++) | 464 | reiserfs_free_bitmap_cache(s); |
466 | brelse(SB_AP_BITMAP(s)[i].bh); | ||
467 | |||
468 | vfree(SB_AP_BITMAP(s)); | ||
469 | 465 | ||
470 | brelse(SB_BUFFER_WITH_SB(s)); | 466 | brelse(SB_BUFFER_WITH_SB(s)); |
471 | 467 | ||
@@ -510,8 +506,10 @@ static void init_once(void *foo, kmem_cache_t * cachep, unsigned long flags) | |||
510 | SLAB_CTOR_CONSTRUCTOR) { | 506 | SLAB_CTOR_CONSTRUCTOR) { |
511 | INIT_LIST_HEAD(&ei->i_prealloc_list); | 507 | INIT_LIST_HEAD(&ei->i_prealloc_list); |
512 | inode_init_once(&ei->vfs_inode); | 508 | inode_init_once(&ei->vfs_inode); |
509 | #ifdef CONFIG_REISERFS_FS_POSIX_ACL | ||
513 | ei->i_acl_access = NULL; | 510 | ei->i_acl_access = NULL; |
514 | ei->i_acl_default = NULL; | 511 | ei->i_acl_default = NULL; |
512 | #endif | ||
515 | } | 513 | } |
516 | } | 514 | } |
517 | 515 | ||
@@ -560,6 +558,7 @@ static void reiserfs_dirty_inode(struct inode *inode) | |||
560 | reiserfs_write_unlock(inode->i_sb); | 558 | reiserfs_write_unlock(inode->i_sb); |
561 | } | 559 | } |
562 | 560 | ||
561 | #ifdef CONFIG_REISERFS_FS_POSIX_ACL | ||
563 | static void reiserfs_clear_inode(struct inode *inode) | 562 | static void reiserfs_clear_inode(struct inode *inode) |
564 | { | 563 | { |
565 | struct posix_acl *acl; | 564 | struct posix_acl *acl; |
@@ -574,6 +573,9 @@ static void reiserfs_clear_inode(struct inode *inode) | |||
574 | posix_acl_release(acl); | 573 | posix_acl_release(acl); |
575 | REISERFS_I(inode)->i_acl_default = NULL; | 574 | REISERFS_I(inode)->i_acl_default = NULL; |
576 | } | 575 | } |
576 | #else | ||
577 | #define reiserfs_clear_inode NULL | ||
578 | #endif | ||
577 | 579 | ||
578 | #ifdef CONFIG_QUOTA | 580 | #ifdef CONFIG_QUOTA |
579 | static ssize_t reiserfs_quota_write(struct super_block *, int, const char *, | 581 | static ssize_t reiserfs_quota_write(struct super_block *, int, const char *, |
@@ -1237,118 +1239,6 @@ static int reiserfs_remount(struct super_block *s, int *mount_flags, char *arg) | |||
1237 | return 0; | 1239 | return 0; |
1238 | } | 1240 | } |
1239 | 1241 | ||
1240 | /* load_bitmap_info_data - Sets up the reiserfs_bitmap_info structure from disk. | ||
1241 | * @sb - superblock for this filesystem | ||
1242 | * @bi - the bitmap info to be loaded. Requires that bi->bh is valid. | ||
1243 | * | ||
1244 | * This routine counts how many free bits there are, finding the first zero | ||
1245 | * as a side effect. Could also be implemented as a loop of test_bit() calls, or | ||
1246 | * a loop of find_first_zero_bit() calls. This implementation is similar to | ||
1247 | * find_first_zero_bit(), but doesn't return after it finds the first bit. | ||
1248 | * Should only be called on fs mount, but should be fairly efficient anyways. | ||
1249 | * | ||
1250 | * bi->first_zero_hint is considered unset if it == 0, since the bitmap itself | ||
1251 | * will * invariably occupt block 0 represented in the bitmap. The only | ||
1252 | * exception to this is when free_count also == 0, since there will be no | ||
1253 | * free blocks at all. | ||
1254 | */ | ||
1255 | |||
1256 | static void load_bitmap_info_data(struct super_block *sb, | ||
1257 | struct reiserfs_bitmap_info *bi) | ||
1258 | { | ||
1259 | unsigned long *cur = (unsigned long *)bi->bh->b_data; | ||
1260 | |||
1261 | while ((char *)cur < (bi->bh->b_data + sb->s_blocksize)) { | ||
1262 | |||
1263 | /* No need to scan if all 0's or all 1's. | ||
1264 | * Since we're only counting 0's, we can simply ignore all 1's */ | ||
1265 | if (*cur == 0) { | ||
1266 | if (bi->first_zero_hint == 0) { | ||
1267 | bi->first_zero_hint = | ||
1268 | ((char *)cur - bi->bh->b_data) << 3; | ||
1269 | } | ||
1270 | bi->free_count += sizeof(unsigned long) * 8; | ||
1271 | } else if (*cur != ~0L) { | ||
1272 | int b; | ||
1273 | for (b = 0; b < sizeof(unsigned long) * 8; b++) { | ||
1274 | if (!reiserfs_test_le_bit(b, cur)) { | ||
1275 | bi->free_count++; | ||
1276 | if (bi->first_zero_hint == 0) | ||
1277 | bi->first_zero_hint = | ||
1278 | (((char *)cur - | ||
1279 | bi->bh->b_data) << 3) + b; | ||
1280 | } | ||
1281 | } | ||
1282 | } | ||
1283 | cur++; | ||
1284 | } | ||
1285 | |||
1286 | #ifdef CONFIG_REISERFS_CHECK | ||
1287 | // This outputs a lot of unneded info on big FSes | ||
1288 | // reiserfs_warning ("bitmap loaded from block %d: %d free blocks", | ||
1289 | // bi->bh->b_blocknr, bi->free_count); | ||
1290 | #endif | ||
1291 | } | ||
1292 | |||
1293 | static int read_bitmaps(struct super_block *s) | ||
1294 | { | ||
1295 | int i, bmap_nr; | ||
1296 | |||
1297 | SB_AP_BITMAP(s) = | ||
1298 | vmalloc(sizeof(struct reiserfs_bitmap_info) * SB_BMAP_NR(s)); | ||
1299 | if (SB_AP_BITMAP(s) == 0) | ||
1300 | return 1; | ||
1301 | memset(SB_AP_BITMAP(s), 0, | ||
1302 | sizeof(struct reiserfs_bitmap_info) * SB_BMAP_NR(s)); | ||
1303 | for (i = 0, bmap_nr = | ||
1304 | REISERFS_DISK_OFFSET_IN_BYTES / s->s_blocksize + 1; | ||
1305 | i < SB_BMAP_NR(s); i++, bmap_nr = s->s_blocksize * 8 * i) { | ||
1306 | SB_AP_BITMAP(s)[i].bh = sb_getblk(s, bmap_nr); | ||
1307 | if (!buffer_uptodate(SB_AP_BITMAP(s)[i].bh)) | ||
1308 | ll_rw_block(READ, 1, &SB_AP_BITMAP(s)[i].bh); | ||
1309 | } | ||
1310 | for (i = 0; i < SB_BMAP_NR(s); i++) { | ||
1311 | wait_on_buffer(SB_AP_BITMAP(s)[i].bh); | ||
1312 | if (!buffer_uptodate(SB_AP_BITMAP(s)[i].bh)) { | ||
1313 | reiserfs_warning(s, "sh-2029: reiserfs read_bitmaps: " | ||
1314 | "bitmap block (#%lu) reading failed", | ||
1315 | SB_AP_BITMAP(s)[i].bh->b_blocknr); | ||
1316 | for (i = 0; i < SB_BMAP_NR(s); i++) | ||
1317 | brelse(SB_AP_BITMAP(s)[i].bh); | ||
1318 | vfree(SB_AP_BITMAP(s)); | ||
1319 | SB_AP_BITMAP(s) = NULL; | ||
1320 | return 1; | ||
1321 | } | ||
1322 | load_bitmap_info_data(s, SB_AP_BITMAP(s) + i); | ||
1323 | } | ||
1324 | return 0; | ||
1325 | } | ||
1326 | |||
1327 | static int read_old_bitmaps(struct super_block *s) | ||
1328 | { | ||
1329 | int i; | ||
1330 | struct reiserfs_super_block *rs = SB_DISK_SUPER_BLOCK(s); | ||
1331 | int bmp1 = (REISERFS_OLD_DISK_OFFSET_IN_BYTES / s->s_blocksize) + 1; /* first of bitmap blocks */ | ||
1332 | |||
1333 | /* read true bitmap */ | ||
1334 | SB_AP_BITMAP(s) = | ||
1335 | vmalloc(sizeof(struct reiserfs_buffer_info *) * sb_bmap_nr(rs)); | ||
1336 | if (SB_AP_BITMAP(s) == 0) | ||
1337 | return 1; | ||
1338 | |||
1339 | memset(SB_AP_BITMAP(s), 0, | ||
1340 | sizeof(struct reiserfs_buffer_info *) * sb_bmap_nr(rs)); | ||
1341 | |||
1342 | for (i = 0; i < sb_bmap_nr(rs); i++) { | ||
1343 | SB_AP_BITMAP(s)[i].bh = sb_bread(s, bmp1 + i); | ||
1344 | if (!SB_AP_BITMAP(s)[i].bh) | ||
1345 | return 1; | ||
1346 | load_bitmap_info_data(s, SB_AP_BITMAP(s) + i); | ||
1347 | } | ||
1348 | |||
1349 | return 0; | ||
1350 | } | ||
1351 | |||
1352 | static int read_super_block(struct super_block *s, int offset) | 1242 | static int read_super_block(struct super_block *s, int offset) |
1353 | { | 1243 | { |
1354 | struct buffer_head *bh; | 1244 | struct buffer_head *bh; |
@@ -1450,7 +1340,6 @@ static int read_super_block(struct super_block *s, int offset) | |||
1450 | /* after journal replay, reread all bitmap and super blocks */ | 1340 | /* after journal replay, reread all bitmap and super blocks */ |
1451 | static int reread_meta_blocks(struct super_block *s) | 1341 | static int reread_meta_blocks(struct super_block *s) |
1452 | { | 1342 | { |
1453 | int i; | ||
1454 | ll_rw_block(READ, 1, &(SB_BUFFER_WITH_SB(s))); | 1343 | ll_rw_block(READ, 1, &(SB_BUFFER_WITH_SB(s))); |
1455 | wait_on_buffer(SB_BUFFER_WITH_SB(s)); | 1344 | wait_on_buffer(SB_BUFFER_WITH_SB(s)); |
1456 | if (!buffer_uptodate(SB_BUFFER_WITH_SB(s))) { | 1345 | if (!buffer_uptodate(SB_BUFFER_WITH_SB(s))) { |
@@ -1459,20 +1348,7 @@ static int reread_meta_blocks(struct super_block *s) | |||
1459 | return 1; | 1348 | return 1; |
1460 | } | 1349 | } |
1461 | 1350 | ||
1462 | for (i = 0; i < SB_BMAP_NR(s); i++) { | ||
1463 | ll_rw_block(READ, 1, &(SB_AP_BITMAP(s)[i].bh)); | ||
1464 | wait_on_buffer(SB_AP_BITMAP(s)[i].bh); | ||
1465 | if (!buffer_uptodate(SB_AP_BITMAP(s)[i].bh)) { | ||
1466 | reiserfs_warning(s, | ||
1467 | "reread_meta_blocks, error reading bitmap block number %d at %llu", | ||
1468 | i, | ||
1469 | (unsigned long long)SB_AP_BITMAP(s)[i]. | ||
1470 | bh->b_blocknr); | ||
1471 | return 1; | ||
1472 | } | ||
1473 | } | ||
1474 | return 0; | 1351 | return 0; |
1475 | |||
1476 | } | 1352 | } |
1477 | 1353 | ||
1478 | ///////////////////////////////////////////////////// | 1354 | ///////////////////////////////////////////////////// |
@@ -1653,7 +1529,6 @@ static int function2code(hashf_t func) | |||
1653 | static int reiserfs_fill_super(struct super_block *s, void *data, int silent) | 1529 | static int reiserfs_fill_super(struct super_block *s, void *data, int silent) |
1654 | { | 1530 | { |
1655 | struct inode *root_inode; | 1531 | struct inode *root_inode; |
1656 | int j; | ||
1657 | struct reiserfs_transaction_handle th; | 1532 | struct reiserfs_transaction_handle th; |
1658 | int old_format = 0; | 1533 | int old_format = 0; |
1659 | unsigned long blocks; | 1534 | unsigned long blocks; |
@@ -1730,7 +1605,7 @@ static int reiserfs_fill_super(struct super_block *s, void *data, int silent) | |||
1730 | sbi->s_mount_state = SB_REISERFS_STATE(s); | 1605 | sbi->s_mount_state = SB_REISERFS_STATE(s); |
1731 | sbi->s_mount_state = REISERFS_VALID_FS; | 1606 | sbi->s_mount_state = REISERFS_VALID_FS; |
1732 | 1607 | ||
1733 | if (old_format ? read_old_bitmaps(s) : read_bitmaps(s)) { | 1608 | if ((errval = reiserfs_init_bitmap_cache(s))) { |
1734 | SWARN(silent, s, | 1609 | SWARN(silent, s, |
1735 | "jmacd-8: reiserfs_fill_super: unable to read bitmap"); | 1610 | "jmacd-8: reiserfs_fill_super: unable to read bitmap"); |
1736 | goto error; | 1611 | goto error; |
@@ -1812,6 +1687,8 @@ static int reiserfs_fill_super(struct super_block *s, void *data, int silent) | |||
1812 | if (is_reiserfs_3_5(rs) | 1687 | if (is_reiserfs_3_5(rs) |
1813 | || (is_reiserfs_jr(rs) && SB_VERSION(s) == REISERFS_VERSION_1)) | 1688 | || (is_reiserfs_jr(rs) && SB_VERSION(s) == REISERFS_VERSION_1)) |
1814 | set_bit(REISERFS_3_5, &(sbi->s_properties)); | 1689 | set_bit(REISERFS_3_5, &(sbi->s_properties)); |
1690 | else if (old_format) | ||
1691 | set_bit(REISERFS_OLD_FORMAT, &(sbi->s_properties)); | ||
1815 | else | 1692 | else |
1816 | set_bit(REISERFS_3_6, &(sbi->s_properties)); | 1693 | set_bit(REISERFS_3_6, &(sbi->s_properties)); |
1817 | 1694 | ||
@@ -1897,19 +1774,17 @@ static int reiserfs_fill_super(struct super_block *s, void *data, int silent) | |||
1897 | if (jinit_done) { /* kill the commit thread, free journal ram */ | 1774 | if (jinit_done) { /* kill the commit thread, free journal ram */ |
1898 | journal_release_error(NULL, s); | 1775 | journal_release_error(NULL, s); |
1899 | } | 1776 | } |
1900 | if (SB_DISK_SUPER_BLOCK(s)) { | 1777 | |
1901 | for (j = 0; j < SB_BMAP_NR(s); j++) { | 1778 | reiserfs_free_bitmap_cache(s); |
1902 | if (SB_AP_BITMAP(s)) | ||
1903 | brelse(SB_AP_BITMAP(s)[j].bh); | ||
1904 | } | ||
1905 | vfree(SB_AP_BITMAP(s)); | ||
1906 | } | ||
1907 | if (SB_BUFFER_WITH_SB(s)) | 1779 | if (SB_BUFFER_WITH_SB(s)) |
1908 | brelse(SB_BUFFER_WITH_SB(s)); | 1780 | brelse(SB_BUFFER_WITH_SB(s)); |
1909 | #ifdef CONFIG_QUOTA | 1781 | #ifdef CONFIG_QUOTA |
1910 | for (j = 0; j < MAXQUOTAS; j++) { | 1782 | { |
1911 | kfree(sbi->s_qf_names[j]); | 1783 | int j; |
1912 | sbi->s_qf_names[j] = NULL; | 1784 | for (j = 0; j < MAXQUOTAS; j++) { |
1785 | kfree(sbi->s_qf_names[j]); | ||
1786 | sbi->s_qf_names[j] = NULL; | ||
1787 | } | ||
1913 | } | 1788 | } |
1914 | #endif | 1789 | #endif |
1915 | kfree(sbi); | 1790 | kfree(sbi); |