diff options
author | James Bottomley <jejb@titanic.(none)> | 2005-05-20 16:27:44 -0400 |
---|---|---|
committer | James Bottomley <jejb@titanic.(none)> | 2005-05-20 16:27:44 -0400 |
commit | ad34ea2cc3845ef4dcd7d12fb0fa8484734bd672 (patch) | |
tree | ad434400f5ecaa33b433c8f830e40792d8d6c05c /fs/jfs/jfs_txnmgr.c | |
parent | 90356ac3194bf91a441a5f9c3067af386ef62462 (diff) | |
parent | 88d7bd8cb9eb8d64bf7997600b0d64f7834047c5 (diff) |
merge by hand - fix up rejections in Documentation/DocBook/Makefile
Diffstat (limited to 'fs/jfs/jfs_txnmgr.c')
-rw-r--r-- | fs/jfs/jfs_txnmgr.c | 166 |
1 files changed, 89 insertions, 77 deletions
diff --git a/fs/jfs/jfs_txnmgr.c b/fs/jfs/jfs_txnmgr.c index f40301d93f74..e93d01aa12c4 100644 --- a/fs/jfs/jfs_txnmgr.c +++ b/fs/jfs/jfs_txnmgr.c | |||
@@ -227,6 +227,7 @@ static lid_t txLockAlloc(void) | |||
227 | 227 | ||
228 | static void txLockFree(lid_t lid) | 228 | static void txLockFree(lid_t lid) |
229 | { | 229 | { |
230 | TxLock[lid].tid = 0; | ||
230 | TxLock[lid].next = TxAnchor.freelock; | 231 | TxLock[lid].next = TxAnchor.freelock; |
231 | TxAnchor.freelock = lid; | 232 | TxAnchor.freelock = lid; |
232 | TxAnchor.tlocksInUse--; | 233 | TxAnchor.tlocksInUse--; |
@@ -566,9 +567,6 @@ void txEnd(tid_t tid) | |||
566 | * synchronize with logsync barrier | 567 | * synchronize with logsync barrier |
567 | */ | 568 | */ |
568 | if (test_bit(log_SYNCBARRIER, &log->flag)) { | 569 | if (test_bit(log_SYNCBARRIER, &log->flag)) { |
569 | /* forward log syncpt */ | ||
570 | /* lmSync(log); */ | ||
571 | |||
572 | jfs_info("log barrier off: 0x%x", log->lsn); | 570 | jfs_info("log barrier off: 0x%x", log->lsn); |
573 | 571 | ||
574 | /* enable new transactions start */ | 572 | /* enable new transactions start */ |
@@ -576,15 +574,22 @@ void txEnd(tid_t tid) | |||
576 | 574 | ||
577 | /* wakeup all waitors for logsync barrier */ | 575 | /* wakeup all waitors for logsync barrier */ |
578 | TXN_WAKEUP(&log->syncwait); | 576 | TXN_WAKEUP(&log->syncwait); |
577 | |||
578 | TXN_UNLOCK(); | ||
579 | |||
580 | /* forward log syncpt */ | ||
581 | jfs_syncpt(log); | ||
582 | |||
583 | goto wakeup; | ||
579 | } | 584 | } |
580 | } | 585 | } |
581 | 586 | ||
587 | TXN_UNLOCK(); | ||
588 | wakeup: | ||
582 | /* | 589 | /* |
583 | * wakeup all waitors for a free tblock | 590 | * wakeup all waitors for a free tblock |
584 | */ | 591 | */ |
585 | TXN_WAKEUP(&TxAnchor.freewait); | 592 | TXN_WAKEUP(&TxAnchor.freewait); |
586 | |||
587 | TXN_UNLOCK(); | ||
588 | } | 593 | } |
589 | 594 | ||
590 | 595 | ||
@@ -633,8 +638,10 @@ struct tlock *txLock(tid_t tid, struct inode *ip, struct metapage * mp, | |||
633 | 638 | ||
634 | /* is page locked by the requester transaction ? */ | 639 | /* is page locked by the requester transaction ? */ |
635 | tlck = lid_to_tlock(lid); | 640 | tlck = lid_to_tlock(lid); |
636 | if ((xtid = tlck->tid) == tid) | 641 | if ((xtid = tlck->tid) == tid) { |
642 | TXN_UNLOCK(); | ||
637 | goto grantLock; | 643 | goto grantLock; |
644 | } | ||
638 | 645 | ||
639 | /* | 646 | /* |
640 | * is page locked by anonymous transaction/lock ? | 647 | * is page locked by anonymous transaction/lock ? |
@@ -649,6 +656,7 @@ struct tlock *txLock(tid_t tid, struct inode *ip, struct metapage * mp, | |||
649 | */ | 656 | */ |
650 | if (xtid == 0) { | 657 | if (xtid == 0) { |
651 | tlck->tid = tid; | 658 | tlck->tid = tid; |
659 | TXN_UNLOCK(); | ||
652 | tblk = tid_to_tblock(tid); | 660 | tblk = tid_to_tblock(tid); |
653 | /* | 661 | /* |
654 | * The order of the tlocks in the transaction is important | 662 | * The order of the tlocks in the transaction is important |
@@ -706,17 +714,18 @@ struct tlock *txLock(tid_t tid, struct inode *ip, struct metapage * mp, | |||
706 | */ | 714 | */ |
707 | tlck->tid = tid; | 715 | tlck->tid = tid; |
708 | 716 | ||
717 | TXN_UNLOCK(); | ||
718 | |||
709 | /* mark tlock for meta-data page */ | 719 | /* mark tlock for meta-data page */ |
710 | if (mp->xflag & COMMIT_PAGE) { | 720 | if (mp->xflag & COMMIT_PAGE) { |
711 | 721 | ||
712 | tlck->flag = tlckPAGELOCK; | 722 | tlck->flag = tlckPAGELOCK; |
713 | 723 | ||
714 | /* mark the page dirty and nohomeok */ | 724 | /* mark the page dirty and nohomeok */ |
715 | mark_metapage_dirty(mp); | 725 | metapage_nohomeok(mp); |
716 | atomic_inc(&mp->nohomeok); | ||
717 | 726 | ||
718 | jfs_info("locking mp = 0x%p, nohomeok = %d tid = %d tlck = 0x%p", | 727 | jfs_info("locking mp = 0x%p, nohomeok = %d tid = %d tlck = 0x%p", |
719 | mp, atomic_read(&mp->nohomeok), tid, tlck); | 728 | mp, mp->nohomeok, tid, tlck); |
720 | 729 | ||
721 | /* if anonymous transaction, and buffer is on the group | 730 | /* if anonymous transaction, and buffer is on the group |
722 | * commit synclist, mark inode to show this. This will | 731 | * commit synclist, mark inode to show this. This will |
@@ -762,8 +771,10 @@ struct tlock *txLock(tid_t tid, struct inode *ip, struct metapage * mp, | |||
762 | if (tlck->next == 0) { | 771 | if (tlck->next == 0) { |
763 | /* This inode's first anonymous transaction */ | 772 | /* This inode's first anonymous transaction */ |
764 | jfs_ip->atltail = lid; | 773 | jfs_ip->atltail = lid; |
774 | TXN_LOCK(); | ||
765 | list_add_tail(&jfs_ip->anon_inode_list, | 775 | list_add_tail(&jfs_ip->anon_inode_list, |
766 | &TxAnchor.anon_list); | 776 | &TxAnchor.anon_list); |
777 | TXN_UNLOCK(); | ||
767 | } | 778 | } |
768 | } | 779 | } |
769 | 780 | ||
@@ -821,8 +832,6 @@ struct tlock *txLock(tid_t tid, struct inode *ip, struct metapage * mp, | |||
821 | grantLock: | 832 | grantLock: |
822 | tlck->type |= type; | 833 | tlck->type |= type; |
823 | 834 | ||
824 | TXN_UNLOCK(); | ||
825 | |||
826 | return tlck; | 835 | return tlck; |
827 | 836 | ||
828 | /* | 837 | /* |
@@ -841,11 +850,19 @@ struct tlock *txLock(tid_t tid, struct inode *ip, struct metapage * mp, | |||
841 | BUG(); | 850 | BUG(); |
842 | } | 851 | } |
843 | INCREMENT(stattx.waitlock); /* statistics */ | 852 | INCREMENT(stattx.waitlock); /* statistics */ |
853 | TXN_UNLOCK(); | ||
844 | release_metapage(mp); | 854 | release_metapage(mp); |
855 | TXN_LOCK(); | ||
856 | xtid = tlck->tid; /* reaquire after dropping TXN_LOCK */ | ||
845 | 857 | ||
846 | jfs_info("txLock: in waitLock, tid = %d, xtid = %d, lid = %d", | 858 | jfs_info("txLock: in waitLock, tid = %d, xtid = %d, lid = %d", |
847 | tid, xtid, lid); | 859 | tid, xtid, lid); |
848 | TXN_SLEEP_DROP_LOCK(&tid_to_tblock(xtid)->waitor); | 860 | |
861 | /* Recheck everything since dropping TXN_LOCK */ | ||
862 | if (xtid && (tlck->mp == mp) && (mp->lid == lid)) | ||
863 | TXN_SLEEP_DROP_LOCK(&tid_to_tblock(xtid)->waitor); | ||
864 | else | ||
865 | TXN_UNLOCK(); | ||
849 | jfs_info("txLock: awakened tid = %d, lid = %d", tid, lid); | 866 | jfs_info("txLock: awakened tid = %d, lid = %d", tid, lid); |
850 | 867 | ||
851 | return NULL; | 868 | return NULL; |
@@ -906,6 +923,7 @@ static void txUnlock(struct tblock * tblk) | |||
906 | struct metapage *mp; | 923 | struct metapage *mp; |
907 | struct jfs_log *log; | 924 | struct jfs_log *log; |
908 | int difft, diffp; | 925 | int difft, diffp; |
926 | unsigned long flags; | ||
909 | 927 | ||
910 | jfs_info("txUnlock: tblk = 0x%p", tblk); | 928 | jfs_info("txUnlock: tblk = 0x%p", tblk); |
911 | log = JFS_SBI(tblk->sb)->log; | 929 | log = JFS_SBI(tblk->sb)->log; |
@@ -925,19 +943,14 @@ static void txUnlock(struct tblock * tblk) | |||
925 | assert(mp->xflag & COMMIT_PAGE); | 943 | assert(mp->xflag & COMMIT_PAGE); |
926 | 944 | ||
927 | /* hold buffer | 945 | /* hold buffer |
928 | * | ||
929 | * It's possible that someone else has the metapage. | ||
930 | * The only things were changing are nohomeok, which | ||
931 | * is handled atomically, and clsn which is protected | ||
932 | * by the LOGSYNC_LOCK. | ||
933 | */ | 946 | */ |
934 | hold_metapage(mp, 1); | 947 | hold_metapage(mp); |
935 | 948 | ||
936 | assert(atomic_read(&mp->nohomeok) > 0); | 949 | assert(mp->nohomeok > 0); |
937 | atomic_dec(&mp->nohomeok); | 950 | _metapage_homeok(mp); |
938 | 951 | ||
939 | /* inherit younger/larger clsn */ | 952 | /* inherit younger/larger clsn */ |
940 | LOGSYNC_LOCK(log); | 953 | LOGSYNC_LOCK(log, flags); |
941 | if (mp->clsn) { | 954 | if (mp->clsn) { |
942 | logdiff(difft, tblk->clsn, log); | 955 | logdiff(difft, tblk->clsn, log); |
943 | logdiff(diffp, mp->clsn, log); | 956 | logdiff(diffp, mp->clsn, log); |
@@ -945,16 +958,11 @@ static void txUnlock(struct tblock * tblk) | |||
945 | mp->clsn = tblk->clsn; | 958 | mp->clsn = tblk->clsn; |
946 | } else | 959 | } else |
947 | mp->clsn = tblk->clsn; | 960 | mp->clsn = tblk->clsn; |
948 | LOGSYNC_UNLOCK(log); | 961 | LOGSYNC_UNLOCK(log, flags); |
949 | 962 | ||
950 | assert(!(tlck->flag & tlckFREEPAGE)); | 963 | assert(!(tlck->flag & tlckFREEPAGE)); |
951 | 964 | ||
952 | if (tlck->flag & tlckWRITEPAGE) { | 965 | put_metapage(mp); |
953 | write_metapage(mp); | ||
954 | } else { | ||
955 | /* release page which has been forced */ | ||
956 | release_metapage(mp); | ||
957 | } | ||
958 | } | 966 | } |
959 | 967 | ||
960 | /* insert tlock, and linelock(s) of the tlock if any, | 968 | /* insert tlock, and linelock(s) of the tlock if any, |
@@ -981,10 +989,10 @@ static void txUnlock(struct tblock * tblk) | |||
981 | * has been inserted in logsync list at txUpdateMap()) | 989 | * has been inserted in logsync list at txUpdateMap()) |
982 | */ | 990 | */ |
983 | if (tblk->lsn) { | 991 | if (tblk->lsn) { |
984 | LOGSYNC_LOCK(log); | 992 | LOGSYNC_LOCK(log, flags); |
985 | log->count--; | 993 | log->count--; |
986 | list_del(&tblk->synclist); | 994 | list_del(&tblk->synclist); |
987 | LOGSYNC_UNLOCK(log); | 995 | LOGSYNC_UNLOCK(log, flags); |
988 | } | 996 | } |
989 | } | 997 | } |
990 | 998 | ||
@@ -1573,8 +1581,8 @@ static int dataLog(struct jfs_log * log, struct tblock * tblk, struct lrd * lrd, | |||
1573 | * the last entry, so don't bother logging this | 1581 | * the last entry, so don't bother logging this |
1574 | */ | 1582 | */ |
1575 | mp->lid = 0; | 1583 | mp->lid = 0; |
1576 | hold_metapage(mp, 0); | 1584 | grab_metapage(mp); |
1577 | atomic_dec(&mp->nohomeok); | 1585 | metapage_homeok(mp); |
1578 | discard_metapage(mp); | 1586 | discard_metapage(mp); |
1579 | tlck->mp = NULL; | 1587 | tlck->mp = NULL; |
1580 | return 0; | 1588 | return 0; |
@@ -1712,7 +1720,7 @@ static void xtLog(struct jfs_log * log, struct tblock * tblk, struct lrd * lrd, | |||
1712 | struct maplock *maplock; | 1720 | struct maplock *maplock; |
1713 | struct xdlistlock *xadlock; | 1721 | struct xdlistlock *xadlock; |
1714 | struct pxd_lock *pxdlock; | 1722 | struct pxd_lock *pxdlock; |
1715 | pxd_t *pxd; | 1723 | pxd_t *page_pxd; |
1716 | int next, lwm, hwm; | 1724 | int next, lwm, hwm; |
1717 | 1725 | ||
1718 | ip = tlck->ip; | 1726 | ip = tlck->ip; |
@@ -1722,7 +1730,7 @@ static void xtLog(struct jfs_log * log, struct tblock * tblk, struct lrd * lrd, | |||
1722 | lrd->log.redopage.type = cpu_to_le16(LOG_XTREE); | 1730 | lrd->log.redopage.type = cpu_to_le16(LOG_XTREE); |
1723 | lrd->log.redopage.l2linesize = cpu_to_le16(L2XTSLOTSIZE); | 1731 | lrd->log.redopage.l2linesize = cpu_to_le16(L2XTSLOTSIZE); |
1724 | 1732 | ||
1725 | pxd = &lrd->log.redopage.pxd; | 1733 | page_pxd = &lrd->log.redopage.pxd; |
1726 | 1734 | ||
1727 | if (tlck->type & tlckBTROOT) { | 1735 | if (tlck->type & tlckBTROOT) { |
1728 | lrd->log.redopage.type |= cpu_to_le16(LOG_BTROOT); | 1736 | lrd->log.redopage.type |= cpu_to_le16(LOG_BTROOT); |
@@ -1752,9 +1760,9 @@ static void xtLog(struct jfs_log * log, struct tblock * tblk, struct lrd * lrd, | |||
1752 | * applying the after-image to the meta-data page. | 1760 | * applying the after-image to the meta-data page. |
1753 | */ | 1761 | */ |
1754 | lrd->type = cpu_to_le16(LOG_REDOPAGE); | 1762 | lrd->type = cpu_to_le16(LOG_REDOPAGE); |
1755 | // *pxd = mp->cm_pxd; | 1763 | // *page_pxd = mp->cm_pxd; |
1756 | PXDaddress(pxd, mp->index); | 1764 | PXDaddress(page_pxd, mp->index); |
1757 | PXDlength(pxd, | 1765 | PXDlength(page_pxd, |
1758 | mp->logical_size >> tblk->sb->s_blocksize_bits); | 1766 | mp->logical_size >> tblk->sb->s_blocksize_bits); |
1759 | lrd->backchain = cpu_to_le32(lmLog(log, tblk, lrd, tlck)); | 1767 | lrd->backchain = cpu_to_le32(lmLog(log, tblk, lrd, tlck)); |
1760 | 1768 | ||
@@ -1776,25 +1784,31 @@ static void xtLog(struct jfs_log * log, struct tblock * tblk, struct lrd * lrd, | |||
1776 | tlck->flag |= tlckUPDATEMAP; | 1784 | tlck->flag |= tlckUPDATEMAP; |
1777 | xadlock->flag = mlckALLOCXADLIST; | 1785 | xadlock->flag = mlckALLOCXADLIST; |
1778 | xadlock->count = next - lwm; | 1786 | xadlock->count = next - lwm; |
1779 | if ((xadlock->count <= 2) && (tblk->xflag & COMMIT_LAZY)) { | 1787 | if ((xadlock->count <= 4) && (tblk->xflag & COMMIT_LAZY)) { |
1780 | int i; | 1788 | int i; |
1789 | pxd_t *pxd; | ||
1781 | /* | 1790 | /* |
1782 | * Lazy commit may allow xtree to be modified before | 1791 | * Lazy commit may allow xtree to be modified before |
1783 | * txUpdateMap runs. Copy xad into linelock to | 1792 | * txUpdateMap runs. Copy xad into linelock to |
1784 | * preserve correct data. | 1793 | * preserve correct data. |
1794 | * | ||
1795 | * We can fit twice as may pxd's as xads in the lock | ||
1785 | */ | 1796 | */ |
1786 | xadlock->xdlist = &xtlck->pxdlock; | 1797 | xadlock->flag = mlckALLOCPXDLIST; |
1787 | memcpy(xadlock->xdlist, &p->xad[lwm], | 1798 | pxd = xadlock->xdlist = &xtlck->pxdlock; |
1788 | sizeof(xad_t) * xadlock->count); | 1799 | for (i = 0; i < xadlock->count; i++) { |
1789 | 1800 | PXDaddress(pxd, addressXAD(&p->xad[lwm + i])); | |
1790 | for (i = 0; i < xadlock->count; i++) | 1801 | PXDlength(pxd, lengthXAD(&p->xad[lwm + i])); |
1791 | p->xad[lwm + i].flag &= | 1802 | p->xad[lwm + i].flag &= |
1792 | ~(XAD_NEW | XAD_EXTENDED); | 1803 | ~(XAD_NEW | XAD_EXTENDED); |
1804 | pxd++; | ||
1805 | } | ||
1793 | } else { | 1806 | } else { |
1794 | /* | 1807 | /* |
1795 | * xdlist will point to into inode's xtree, ensure | 1808 | * xdlist will point to into inode's xtree, ensure |
1796 | * that transaction is not committed lazily. | 1809 | * that transaction is not committed lazily. |
1797 | */ | 1810 | */ |
1811 | xadlock->flag = mlckALLOCXADLIST; | ||
1798 | xadlock->xdlist = &p->xad[lwm]; | 1812 | xadlock->xdlist = &p->xad[lwm]; |
1799 | tblk->xflag &= ~COMMIT_LAZY; | 1813 | tblk->xflag &= ~COMMIT_LAZY; |
1800 | } | 1814 | } |
@@ -1836,8 +1850,8 @@ static void xtLog(struct jfs_log * log, struct tblock * tblk, struct lrd * lrd, | |||
1836 | if (tblk->xflag & COMMIT_TRUNCATE) { | 1850 | if (tblk->xflag & COMMIT_TRUNCATE) { |
1837 | /* write NOREDOPAGE for the page */ | 1851 | /* write NOREDOPAGE for the page */ |
1838 | lrd->type = cpu_to_le16(LOG_NOREDOPAGE); | 1852 | lrd->type = cpu_to_le16(LOG_NOREDOPAGE); |
1839 | PXDaddress(pxd, mp->index); | 1853 | PXDaddress(page_pxd, mp->index); |
1840 | PXDlength(pxd, | 1854 | PXDlength(page_pxd, |
1841 | mp->logical_size >> tblk->sb-> | 1855 | mp->logical_size >> tblk->sb-> |
1842 | s_blocksize_bits); | 1856 | s_blocksize_bits); |
1843 | lrd->backchain = | 1857 | lrd->backchain = |
@@ -1872,22 +1886,32 @@ static void xtLog(struct jfs_log * log, struct tblock * tblk, struct lrd * lrd, | |||
1872 | * deleted page itself; | 1886 | * deleted page itself; |
1873 | */ | 1887 | */ |
1874 | tlck->flag |= tlckUPDATEMAP; | 1888 | tlck->flag |= tlckUPDATEMAP; |
1875 | xadlock->flag = mlckFREEXADLIST; | ||
1876 | xadlock->count = hwm - XTENTRYSTART + 1; | 1889 | xadlock->count = hwm - XTENTRYSTART + 1; |
1877 | if ((xadlock->count <= 2) && (tblk->xflag & COMMIT_LAZY)) { | 1890 | if ((xadlock->count <= 4) && (tblk->xflag & COMMIT_LAZY)) { |
1891 | int i; | ||
1892 | pxd_t *pxd; | ||
1878 | /* | 1893 | /* |
1879 | * Lazy commit may allow xtree to be modified before | 1894 | * Lazy commit may allow xtree to be modified before |
1880 | * txUpdateMap runs. Copy xad into linelock to | 1895 | * txUpdateMap runs. Copy xad into linelock to |
1881 | * preserve correct data. | 1896 | * preserve correct data. |
1897 | * | ||
1898 | * We can fit twice as may pxd's as xads in the lock | ||
1882 | */ | 1899 | */ |
1883 | xadlock->xdlist = &xtlck->pxdlock; | 1900 | xadlock->flag = mlckFREEPXDLIST; |
1884 | memcpy(xadlock->xdlist, &p->xad[XTENTRYSTART], | 1901 | pxd = xadlock->xdlist = &xtlck->pxdlock; |
1885 | sizeof(xad_t) * xadlock->count); | 1902 | for (i = 0; i < xadlock->count; i++) { |
1903 | PXDaddress(pxd, | ||
1904 | addressXAD(&p->xad[XTENTRYSTART + i])); | ||
1905 | PXDlength(pxd, | ||
1906 | lengthXAD(&p->xad[XTENTRYSTART + i])); | ||
1907 | pxd++; | ||
1908 | } | ||
1886 | } else { | 1909 | } else { |
1887 | /* | 1910 | /* |
1888 | * xdlist will point to into inode's xtree, ensure | 1911 | * xdlist will point to into inode's xtree, ensure |
1889 | * that transaction is not committed lazily. | 1912 | * that transaction is not committed lazily. |
1890 | */ | 1913 | */ |
1914 | xadlock->flag = mlckFREEXADLIST; | ||
1891 | xadlock->xdlist = &p->xad[XTENTRYSTART]; | 1915 | xadlock->xdlist = &p->xad[XTENTRYSTART]; |
1892 | tblk->xflag &= ~COMMIT_LAZY; | 1916 | tblk->xflag &= ~COMMIT_LAZY; |
1893 | } | 1917 | } |
@@ -1918,7 +1942,7 @@ static void xtLog(struct jfs_log * log, struct tblock * tblk, struct lrd * lrd, | |||
1918 | * header ? | 1942 | * header ? |
1919 | */ | 1943 | */ |
1920 | if (tlck->type & tlckTRUNCATE) { | 1944 | if (tlck->type & tlckTRUNCATE) { |
1921 | pxd_t tpxd; /* truncated extent of xad */ | 1945 | pxd_t pxd; /* truncated extent of xad */ |
1922 | int twm; | 1946 | int twm; |
1923 | 1947 | ||
1924 | /* | 1948 | /* |
@@ -1947,8 +1971,9 @@ static void xtLog(struct jfs_log * log, struct tblock * tblk, struct lrd * lrd, | |||
1947 | * applying the after-image to the meta-data page. | 1971 | * applying the after-image to the meta-data page. |
1948 | */ | 1972 | */ |
1949 | lrd->type = cpu_to_le16(LOG_REDOPAGE); | 1973 | lrd->type = cpu_to_le16(LOG_REDOPAGE); |
1950 | PXDaddress(pxd, mp->index); | 1974 | PXDaddress(page_pxd, mp->index); |
1951 | PXDlength(pxd, mp->logical_size >> tblk->sb->s_blocksize_bits); | 1975 | PXDlength(page_pxd, |
1976 | mp->logical_size >> tblk->sb->s_blocksize_bits); | ||
1952 | lrd->backchain = cpu_to_le32(lmLog(log, tblk, lrd, tlck)); | 1977 | lrd->backchain = cpu_to_le32(lmLog(log, tblk, lrd, tlck)); |
1953 | 1978 | ||
1954 | /* | 1979 | /* |
@@ -1966,7 +1991,7 @@ static void xtLog(struct jfs_log * log, struct tblock * tblk, struct lrd * lrd, | |||
1966 | lrd->log.updatemap.type = cpu_to_le16(LOG_FREEPXD); | 1991 | lrd->log.updatemap.type = cpu_to_le16(LOG_FREEPXD); |
1967 | lrd->log.updatemap.nxd = cpu_to_le16(1); | 1992 | lrd->log.updatemap.nxd = cpu_to_le16(1); |
1968 | lrd->log.updatemap.pxd = pxdlock->pxd; | 1993 | lrd->log.updatemap.pxd = pxdlock->pxd; |
1969 | tpxd = pxdlock->pxd; /* save to format maplock */ | 1994 | pxd = pxdlock->pxd; /* save to format maplock */ |
1970 | lrd->backchain = | 1995 | lrd->backchain = |
1971 | cpu_to_le32(lmLog(log, tblk, lrd, NULL)); | 1996 | cpu_to_le32(lmLog(log, tblk, lrd, NULL)); |
1972 | } | 1997 | } |
@@ -2035,7 +2060,7 @@ static void xtLog(struct jfs_log * log, struct tblock * tblk, struct lrd * lrd, | |||
2035 | pxdlock = (struct pxd_lock *) xadlock; | 2060 | pxdlock = (struct pxd_lock *) xadlock; |
2036 | pxdlock->flag = mlckFREEPXD; | 2061 | pxdlock->flag = mlckFREEPXD; |
2037 | pxdlock->count = 1; | 2062 | pxdlock->count = 1; |
2038 | pxdlock->pxd = tpxd; | 2063 | pxdlock->pxd = pxd; |
2039 | 2064 | ||
2040 | jfs_info("xtLog: truncate ip:0x%p mp:0x%p count:%d " | 2065 | jfs_info("xtLog: truncate ip:0x%p mp:0x%p count:%d " |
2041 | "hwm:%d", ip, mp, pxdlock->count, hwm); | 2066 | "hwm:%d", ip, mp, pxdlock->count, hwm); |
@@ -2253,7 +2278,8 @@ void txForce(struct tblock * tblk) | |||
2253 | tlck->flag &= ~tlckWRITEPAGE; | 2278 | tlck->flag &= ~tlckWRITEPAGE; |
2254 | 2279 | ||
2255 | /* do not release page to freelist */ | 2280 | /* do not release page to freelist */ |
2256 | 2281 | force_metapage(mp); | |
2282 | #if 0 | ||
2257 | /* | 2283 | /* |
2258 | * The "right" thing to do here is to | 2284 | * The "right" thing to do here is to |
2259 | * synchronously write the metadata. | 2285 | * synchronously write the metadata. |
@@ -2265,9 +2291,10 @@ void txForce(struct tblock * tblk) | |||
2265 | * we can get by with synchronously writing | 2291 | * we can get by with synchronously writing |
2266 | * the pages when they are released. | 2292 | * the pages when they are released. |
2267 | */ | 2293 | */ |
2268 | assert(atomic_read(&mp->nohomeok)); | 2294 | assert(mp->nohomeok); |
2269 | set_bit(META_dirty, &mp->flag); | 2295 | set_bit(META_dirty, &mp->flag); |
2270 | set_bit(META_sync, &mp->flag); | 2296 | set_bit(META_sync, &mp->flag); |
2297 | #endif | ||
2271 | } | 2298 | } |
2272 | } | 2299 | } |
2273 | } | 2300 | } |
@@ -2327,7 +2354,7 @@ static void txUpdateMap(struct tblock * tblk) | |||
2327 | */ | 2354 | */ |
2328 | mp = tlck->mp; | 2355 | mp = tlck->mp; |
2329 | ASSERT(mp->xflag & COMMIT_PAGE); | 2356 | ASSERT(mp->xflag & COMMIT_PAGE); |
2330 | hold_metapage(mp, 0); | 2357 | grab_metapage(mp); |
2331 | } | 2358 | } |
2332 | 2359 | ||
2333 | /* | 2360 | /* |
@@ -2377,8 +2404,8 @@ static void txUpdateMap(struct tblock * tblk) | |||
2377 | ASSERT(mp->lid == lid); | 2404 | ASSERT(mp->lid == lid); |
2378 | tlck->mp->lid = 0; | 2405 | tlck->mp->lid = 0; |
2379 | } | 2406 | } |
2380 | assert(atomic_read(&mp->nohomeok) == 1); | 2407 | assert(mp->nohomeok == 1); |
2381 | atomic_dec(&mp->nohomeok); | 2408 | metapage_homeok(mp); |
2382 | discard_metapage(mp); | 2409 | discard_metapage(mp); |
2383 | tlck->mp = NULL; | 2410 | tlck->mp = NULL; |
2384 | } | 2411 | } |
@@ -2844,24 +2871,9 @@ static void LogSyncRelease(struct metapage * mp) | |||
2844 | { | 2871 | { |
2845 | struct jfs_log *log = mp->log; | 2872 | struct jfs_log *log = mp->log; |
2846 | 2873 | ||
2847 | assert(atomic_read(&mp->nohomeok)); | 2874 | assert(mp->nohomeok); |
2848 | assert(log); | 2875 | assert(log); |
2849 | atomic_dec(&mp->nohomeok); | 2876 | metapage_homeok(mp); |
2850 | |||
2851 | if (atomic_read(&mp->nohomeok)) | ||
2852 | return; | ||
2853 | |||
2854 | hold_metapage(mp, 0); | ||
2855 | |||
2856 | LOGSYNC_LOCK(log); | ||
2857 | mp->log = NULL; | ||
2858 | mp->lsn = 0; | ||
2859 | mp->clsn = 0; | ||
2860 | log->count--; | ||
2861 | list_del_init(&mp->synclist); | ||
2862 | LOGSYNC_UNLOCK(log); | ||
2863 | |||
2864 | release_metapage(mp); | ||
2865 | } | 2877 | } |
2866 | 2878 | ||
2867 | /* | 2879 | /* |