diff options
| author | Linus Torvalds <torvalds@g5.osdl.org> | 2005-10-28 15:44:24 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@g5.osdl.org> | 2005-10-28 15:44:24 -0400 |
| commit | 8caf89157d64f1eedba37113afb4b303b2b3e301 (patch) | |
| tree | a72038508368f81e5b3f1b82ad14918df8c7be7a | |
| parent | f12baeab9d65e2fe1b43b09b666f5efcb81b9369 (diff) | |
| parent | 7038f1cbac899654cf0515e60dbe3e44d58271de (diff) | |
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/shaggy/jfs-2.6
| -rw-r--r-- | fs/jfs/jfs_dmap.c | 20 | ||||
| -rw-r--r-- | fs/jfs/jfs_imap.c | 10 | ||||
| -rw-r--r-- | fs/jfs/jfs_metapage.c | 6 | ||||
| -rw-r--r-- | fs/jfs/jfs_txnmgr.c | 2 | ||||
| -rw-r--r-- | fs/jfs/jfs_xtree.c | 18 | ||||
| -rw-r--r-- | fs/jfs/super.c | 1 |
6 files changed, 38 insertions, 19 deletions
diff --git a/fs/jfs/jfs_dmap.c b/fs/jfs/jfs_dmap.c index eadf319bee22..68000a50ceb6 100644 --- a/fs/jfs/jfs_dmap.c +++ b/fs/jfs/jfs_dmap.c | |||
| @@ -74,7 +74,7 @@ | |||
| 74 | static void dbAllocBits(struct bmap * bmp, struct dmap * dp, s64 blkno, | 74 | static void dbAllocBits(struct bmap * bmp, struct dmap * dp, s64 blkno, |
| 75 | int nblocks); | 75 | int nblocks); |
| 76 | static void dbSplit(dmtree_t * tp, int leafno, int splitsz, int newval); | 76 | static void dbSplit(dmtree_t * tp, int leafno, int splitsz, int newval); |
| 77 | static void dbBackSplit(dmtree_t * tp, int leafno); | 77 | static int dbBackSplit(dmtree_t * tp, int leafno); |
| 78 | static int dbJoin(dmtree_t * tp, int leafno, int newval); | 78 | static int dbJoin(dmtree_t * tp, int leafno, int newval); |
| 79 | static void dbAdjTree(dmtree_t * tp, int leafno, int newval); | 79 | static void dbAdjTree(dmtree_t * tp, int leafno, int newval); |
| 80 | static int dbAdjCtl(struct bmap * bmp, s64 blkno, int newval, int alloc, | 80 | static int dbAdjCtl(struct bmap * bmp, s64 blkno, int newval, int alloc, |
| @@ -305,7 +305,6 @@ int dbSync(struct inode *ipbmap) | |||
| 305 | filemap_fdatawrite(ipbmap->i_mapping); | 305 | filemap_fdatawrite(ipbmap->i_mapping); |
| 306 | filemap_fdatawait(ipbmap->i_mapping); | 306 | filemap_fdatawait(ipbmap->i_mapping); |
| 307 | 307 | ||
| 308 | ipbmap->i_state |= I_DIRTY; | ||
| 309 | diWriteSpecial(ipbmap, 0); | 308 | diWriteSpecial(ipbmap, 0); |
| 310 | 309 | ||
| 311 | return (0); | 310 | return (0); |
| @@ -2467,7 +2466,9 @@ dbAdjCtl(struct bmap * bmp, s64 blkno, int newval, int alloc, int level) | |||
| 2467 | * that it is at the front of a binary buddy system. | 2466 | * that it is at the front of a binary buddy system. |
| 2468 | */ | 2467 | */ |
| 2469 | if (oldval == NOFREE) { | 2468 | if (oldval == NOFREE) { |
| 2470 | dbBackSplit((dmtree_t *) dcp, leafno); | 2469 | rc = dbBackSplit((dmtree_t *) dcp, leafno); |
| 2470 | if (rc) | ||
| 2471 | return rc; | ||
| 2471 | oldval = dcp->stree[ti]; | 2472 | oldval = dcp->stree[ti]; |
| 2472 | } | 2473 | } |
| 2473 | dbSplit((dmtree_t *) dcp, leafno, dcp->budmin, newval); | 2474 | dbSplit((dmtree_t *) dcp, leafno, dcp->budmin, newval); |
| @@ -2627,7 +2628,7 @@ static void dbSplit(dmtree_t * tp, int leafno, int splitsz, int newval) | |||
| 2627 | * | 2628 | * |
| 2628 | * serialization: IREAD_LOCK(ipbmap) or IWRITE_LOCK(ipbmap) held on entry/exit; | 2629 | * serialization: IREAD_LOCK(ipbmap) or IWRITE_LOCK(ipbmap) held on entry/exit; |
| 2629 | */ | 2630 | */ |
| 2630 | static void dbBackSplit(dmtree_t * tp, int leafno) | 2631 | static int dbBackSplit(dmtree_t * tp, int leafno) |
| 2631 | { | 2632 | { |
| 2632 | int budsz, bud, w, bsz, size; | 2633 | int budsz, bud, w, bsz, size; |
| 2633 | int cursz; | 2634 | int cursz; |
| @@ -2662,7 +2663,10 @@ static void dbBackSplit(dmtree_t * tp, int leafno) | |||
| 2662 | */ | 2663 | */ |
| 2663 | for (w = leafno, bsz = budsz;; bsz <<= 1, | 2664 | for (w = leafno, bsz = budsz;; bsz <<= 1, |
| 2664 | w = (w < bud) ? w : bud) { | 2665 | w = (w < bud) ? w : bud) { |
| 2665 | assert(bsz < le32_to_cpu(tp->dmt_nleafs)); | 2666 | if (bsz >= le32_to_cpu(tp->dmt_nleafs)) { |
| 2667 | jfs_err("JFS: block map error in dbBackSplit"); | ||
| 2668 | return -EIO; | ||
| 2669 | } | ||
| 2666 | 2670 | ||
| 2667 | /* determine the buddy. | 2671 | /* determine the buddy. |
| 2668 | */ | 2672 | */ |
| @@ -2681,7 +2685,11 @@ static void dbBackSplit(dmtree_t * tp, int leafno) | |||
| 2681 | } | 2685 | } |
| 2682 | } | 2686 | } |
| 2683 | 2687 | ||
| 2684 | assert(leaf[leafno] == size); | 2688 | if (leaf[leafno] != size) { |
| 2689 | jfs_err("JFS: wrong leaf value in dbBackSplit"); | ||
| 2690 | return -EIO; | ||
| 2691 | } | ||
| 2692 | return 0; | ||
| 2685 | } | 2693 | } |
| 2686 | 2694 | ||
| 2687 | 2695 | ||
diff --git a/fs/jfs/jfs_imap.c b/fs/jfs/jfs_imap.c index 4021d46da7e3..28201b194f53 100644 --- a/fs/jfs/jfs_imap.c +++ b/fs/jfs/jfs_imap.c | |||
| @@ -57,6 +57,12 @@ | |||
| 57 | #include "jfs_debug.h" | 57 | #include "jfs_debug.h" |
| 58 | 58 | ||
| 59 | /* | 59 | /* |
| 60 | * __mark_inode_dirty expects inodes to be hashed. Since we don't want | ||
| 61 | * special inodes in the fileset inode space, we hash them to a dummy head | ||
| 62 | */ | ||
| 63 | static HLIST_HEAD(aggregate_hash); | ||
| 64 | |||
| 65 | /* | ||
| 60 | * imap locks | 66 | * imap locks |
| 61 | */ | 67 | */ |
| 62 | /* iag free list lock */ | 68 | /* iag free list lock */ |
| @@ -491,6 +497,8 @@ struct inode *diReadSpecial(struct super_block *sb, ino_t inum, int secondary) | |||
| 491 | /* release the page */ | 497 | /* release the page */ |
| 492 | release_metapage(mp); | 498 | release_metapage(mp); |
| 493 | 499 | ||
| 500 | hlist_add_head(&ip->i_hash, &aggregate_hash); | ||
| 501 | |||
| 494 | return (ip); | 502 | return (ip); |
| 495 | } | 503 | } |
| 496 | 504 | ||
| @@ -514,8 +522,6 @@ void diWriteSpecial(struct inode *ip, int secondary) | |||
| 514 | ino_t inum = ip->i_ino; | 522 | ino_t inum = ip->i_ino; |
| 515 | struct metapage *mp; | 523 | struct metapage *mp; |
| 516 | 524 | ||
| 517 | ip->i_state &= ~I_DIRTY; | ||
| 518 | |||
| 519 | if (secondary) | 525 | if (secondary) |
| 520 | address = addressPXD(&sbi->ait2) >> sbi->l2nbperpage; | 526 | address = addressPXD(&sbi->ait2) >> sbi->l2nbperpage; |
| 521 | else | 527 | else |
diff --git a/fs/jfs/jfs_metapage.c b/fs/jfs/jfs_metapage.c index eeb37d70e650..26091a5f88d4 100644 --- a/fs/jfs/jfs_metapage.c +++ b/fs/jfs/jfs_metapage.c | |||
| @@ -395,6 +395,12 @@ static int metapage_writepage(struct page *page, struct writeback_control *wbc) | |||
| 395 | 395 | ||
| 396 | if (mp->nohomeok && !test_bit(META_forcewrite, &mp->flag)) { | 396 | if (mp->nohomeok && !test_bit(META_forcewrite, &mp->flag)) { |
| 397 | redirty = 1; | 397 | redirty = 1; |
| 398 | /* | ||
| 399 | * Make sure this page isn't blocked indefinitely. | ||
| 400 | * If the journal isn't undergoing I/O, push it | ||
| 401 | */ | ||
| 402 | if (mp->log && !(mp->log->cflag & logGC_PAGEOUT)) | ||
| 403 | jfs_flush_journal(mp->log, 0); | ||
| 398 | continue; | 404 | continue; |
| 399 | } | 405 | } |
| 400 | 406 | ||
diff --git a/fs/jfs/jfs_txnmgr.c b/fs/jfs/jfs_txnmgr.c index 9b71ed2674fe..b660c93c92de 100644 --- a/fs/jfs/jfs_txnmgr.c +++ b/fs/jfs/jfs_txnmgr.c | |||
| @@ -2396,7 +2396,6 @@ static void txUpdateMap(struct tblock * tblk) | |||
| 2396 | */ | 2396 | */ |
| 2397 | if (tblk->xflag & COMMIT_CREATE) { | 2397 | if (tblk->xflag & COMMIT_CREATE) { |
| 2398 | diUpdatePMap(ipimap, tblk->ino, FALSE, tblk); | 2398 | diUpdatePMap(ipimap, tblk->ino, FALSE, tblk); |
| 2399 | ipimap->i_state |= I_DIRTY; | ||
| 2400 | /* update persistent block allocation map | 2399 | /* update persistent block allocation map |
| 2401 | * for the allocation of inode extent; | 2400 | * for the allocation of inode extent; |
| 2402 | */ | 2401 | */ |
| @@ -2407,7 +2406,6 @@ static void txUpdateMap(struct tblock * tblk) | |||
| 2407 | } else if (tblk->xflag & COMMIT_DELETE) { | 2406 | } else if (tblk->xflag & COMMIT_DELETE) { |
| 2408 | ip = tblk->u.ip; | 2407 | ip = tblk->u.ip; |
| 2409 | diUpdatePMap(ipimap, ip->i_ino, TRUE, tblk); | 2408 | diUpdatePMap(ipimap, ip->i_ino, TRUE, tblk); |
| 2410 | ipimap->i_state |= I_DIRTY; | ||
| 2411 | iput(ip); | 2409 | iput(ip); |
| 2412 | } | 2410 | } |
| 2413 | } | 2411 | } |
diff --git a/fs/jfs/jfs_xtree.c b/fs/jfs/jfs_xtree.c index a7fe2f2b969f..e72f4ebb6e9c 100644 --- a/fs/jfs/jfs_xtree.c +++ b/fs/jfs/jfs_xtree.c | |||
| @@ -3516,16 +3516,10 @@ s64 xtTruncate(tid_t tid, struct inode *ip, s64 newsize, int flag) | |||
| 3516 | /* process entries backward from last index */ | 3516 | /* process entries backward from last index */ |
| 3517 | index = le16_to_cpu(p->header.nextindex) - 1; | 3517 | index = le16_to_cpu(p->header.nextindex) - 1; |
| 3518 | 3518 | ||
| 3519 | if (p->header.flag & BT_INTERNAL) | ||
| 3520 | goto getChild; | ||
| 3521 | |||
| 3522 | /* | ||
| 3523 | * leaf page | ||
| 3524 | */ | ||
| 3525 | 3519 | ||
| 3526 | /* Since this is the rightmost leaf, and we may have already freed | 3520 | /* Since this is the rightmost page at this level, and we may have |
| 3527 | * a page that was formerly to the right, let's make sure that the | 3521 | * already freed a page that was formerly to the right, let's make |
| 3528 | * next pointer is zero. | 3522 | * sure that the next pointer is zero. |
| 3529 | */ | 3523 | */ |
| 3530 | if (p->header.next) { | 3524 | if (p->header.next) { |
| 3531 | if (log) | 3525 | if (log) |
| @@ -3539,6 +3533,12 @@ s64 xtTruncate(tid_t tid, struct inode *ip, s64 newsize, int flag) | |||
| 3539 | p->header.next = 0; | 3533 | p->header.next = 0; |
| 3540 | } | 3534 | } |
| 3541 | 3535 | ||
| 3536 | if (p->header.flag & BT_INTERNAL) | ||
| 3537 | goto getChild; | ||
| 3538 | |||
| 3539 | /* | ||
| 3540 | * leaf page | ||
| 3541 | */ | ||
| 3542 | freed = 0; | 3542 | freed = 0; |
| 3543 | 3543 | ||
| 3544 | /* does region covered by leaf page precede Teof ? */ | 3544 | /* does region covered by leaf page precede Teof ? */ |
diff --git a/fs/jfs/super.c b/fs/jfs/super.c index 71bc34b96b2b..4226af3ea91b 100644 --- a/fs/jfs/super.c +++ b/fs/jfs/super.c | |||
| @@ -442,6 +442,7 @@ static int jfs_fill_super(struct super_block *sb, void *data, int silent) | |||
| 442 | inode->i_nlink = 1; | 442 | inode->i_nlink = 1; |
| 443 | inode->i_size = sb->s_bdev->bd_inode->i_size; | 443 | inode->i_size = sb->s_bdev->bd_inode->i_size; |
| 444 | inode->i_mapping->a_ops = &jfs_metapage_aops; | 444 | inode->i_mapping->a_ops = &jfs_metapage_aops; |
| 445 | insert_inode_hash(inode); | ||
| 445 | mapping_set_gfp_mask(inode->i_mapping, GFP_NOFS); | 446 | mapping_set_gfp_mask(inode->i_mapping, GFP_NOFS); |
| 446 | 447 | ||
| 447 | sbi->direct_inode = inode; | 448 | sbi->direct_inode = inode; |
