aboutsummaryrefslogtreecommitdiffstats
path: root/fs/reiserfs/super.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/reiserfs/super.c')
-rw-r--r--fs/reiserfs/super.c161
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
433static void reiserfs_put_super(struct super_block *s) 433static 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
563static void reiserfs_clear_inode(struct inode *inode) 562static 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
579static ssize_t reiserfs_quota_write(struct super_block *, int, const char *, 581static 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
1256static 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
1293static 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
1327static 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
1352static int read_super_block(struct super_block *s, int offset) 1242static 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 */
1451static int reread_meta_blocks(struct super_block *s) 1341static 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)
1653static int reiserfs_fill_super(struct super_block *s, void *data, int silent) 1529static 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);