diff options
Diffstat (limited to 'fs/jfs/jfs_txnmgr.c')
-rw-r--r-- | fs/jfs/jfs_txnmgr.c | 302 |
1 files changed, 153 insertions, 149 deletions
diff --git a/fs/jfs/jfs_txnmgr.c b/fs/jfs/jfs_txnmgr.c index 25430d0b0d59..7aa1f7004eaf 100644 --- a/fs/jfs/jfs_txnmgr.c +++ b/fs/jfs/jfs_txnmgr.c | |||
@@ -18,7 +18,7 @@ | |||
18 | */ | 18 | */ |
19 | 19 | ||
20 | /* | 20 | /* |
21 | * jfs_txnmgr.c: transaction manager | 21 | * jfs_txnmgr.c: transaction manager |
22 | * | 22 | * |
23 | * notes: | 23 | * notes: |
24 | * transaction starts with txBegin() and ends with txCommit() | 24 | * transaction starts with txBegin() and ends with txCommit() |
@@ -60,7 +60,7 @@ | |||
60 | #include "jfs_debug.h" | 60 | #include "jfs_debug.h" |
61 | 61 | ||
62 | /* | 62 | /* |
63 | * transaction management structures | 63 | * transaction management structures |
64 | */ | 64 | */ |
65 | static struct { | 65 | static struct { |
66 | int freetid; /* index of a free tid structure */ | 66 | int freetid; /* index of a free tid structure */ |
@@ -103,19 +103,19 @@ module_param(nTxLock, int, 0); | |||
103 | MODULE_PARM_DESC(nTxLock, | 103 | MODULE_PARM_DESC(nTxLock, |
104 | "Number of transaction locks (max:65536)"); | 104 | "Number of transaction locks (max:65536)"); |
105 | 105 | ||
106 | struct tblock *TxBlock; /* transaction block table */ | 106 | struct tblock *TxBlock; /* transaction block table */ |
107 | static int TxLockLWM; /* Low water mark for number of txLocks used */ | 107 | static int TxLockLWM; /* Low water mark for number of txLocks used */ |
108 | static int TxLockHWM; /* High water mark for number of txLocks used */ | 108 | static int TxLockHWM; /* High water mark for number of txLocks used */ |
109 | static int TxLockVHWM; /* Very High water mark */ | 109 | static int TxLockVHWM; /* Very High water mark */ |
110 | struct tlock *TxLock; /* transaction lock table */ | 110 | struct tlock *TxLock; /* transaction lock table */ |
111 | 111 | ||
112 | /* | 112 | /* |
113 | * transaction management lock | 113 | * transaction management lock |
114 | */ | 114 | */ |
115 | static DEFINE_SPINLOCK(jfsTxnLock); | 115 | static DEFINE_SPINLOCK(jfsTxnLock); |
116 | 116 | ||
117 | #define TXN_LOCK() spin_lock(&jfsTxnLock) | 117 | #define TXN_LOCK() spin_lock(&jfsTxnLock) |
118 | #define TXN_UNLOCK() spin_unlock(&jfsTxnLock) | 118 | #define TXN_UNLOCK() spin_unlock(&jfsTxnLock) |
119 | 119 | ||
120 | #define LAZY_LOCK_INIT() spin_lock_init(&TxAnchor.LazyLock); | 120 | #define LAZY_LOCK_INIT() spin_lock_init(&TxAnchor.LazyLock); |
121 | #define LAZY_LOCK(flags) spin_lock_irqsave(&TxAnchor.LazyLock, flags) | 121 | #define LAZY_LOCK(flags) spin_lock_irqsave(&TxAnchor.LazyLock, flags) |
@@ -148,7 +148,7 @@ static inline void TXN_SLEEP_DROP_LOCK(wait_queue_head_t * event) | |||
148 | #define TXN_WAKEUP(event) wake_up_all(event) | 148 | #define TXN_WAKEUP(event) wake_up_all(event) |
149 | 149 | ||
150 | /* | 150 | /* |
151 | * statistics | 151 | * statistics |
152 | */ | 152 | */ |
153 | static struct { | 153 | static struct { |
154 | tid_t maxtid; /* 4: biggest tid ever used */ | 154 | tid_t maxtid; /* 4: biggest tid ever used */ |
@@ -181,8 +181,8 @@ static void xtLog(struct jfs_log * log, struct tblock * tblk, struct lrd * lrd, | |||
181 | static void LogSyncRelease(struct metapage * mp); | 181 | static void LogSyncRelease(struct metapage * mp); |
182 | 182 | ||
183 | /* | 183 | /* |
184 | * transaction block/lock management | 184 | * transaction block/lock management |
185 | * --------------------------------- | 185 | * --------------------------------- |
186 | */ | 186 | */ |
187 | 187 | ||
188 | /* | 188 | /* |
@@ -227,9 +227,9 @@ static void txLockFree(lid_t lid) | |||
227 | } | 227 | } |
228 | 228 | ||
229 | /* | 229 | /* |
230 | * NAME: txInit() | 230 | * NAME: txInit() |
231 | * | 231 | * |
232 | * FUNCTION: initialize transaction management structures | 232 | * FUNCTION: initialize transaction management structures |
233 | * | 233 | * |
234 | * RETURN: | 234 | * RETURN: |
235 | * | 235 | * |
@@ -333,9 +333,9 @@ int txInit(void) | |||
333 | } | 333 | } |
334 | 334 | ||
335 | /* | 335 | /* |
336 | * NAME: txExit() | 336 | * NAME: txExit() |
337 | * | 337 | * |
338 | * FUNCTION: clean up when module is unloaded | 338 | * FUNCTION: clean up when module is unloaded |
339 | */ | 339 | */ |
340 | void txExit(void) | 340 | void txExit(void) |
341 | { | 341 | { |
@@ -346,12 +346,12 @@ void txExit(void) | |||
346 | } | 346 | } |
347 | 347 | ||
348 | /* | 348 | /* |
349 | * NAME: txBegin() | 349 | * NAME: txBegin() |
350 | * | 350 | * |
351 | * FUNCTION: start a transaction. | 351 | * FUNCTION: start a transaction. |
352 | * | 352 | * |
353 | * PARAMETER: sb - superblock | 353 | * PARAMETER: sb - superblock |
354 | * flag - force for nested tx; | 354 | * flag - force for nested tx; |
355 | * | 355 | * |
356 | * RETURN: tid - transaction id | 356 | * RETURN: tid - transaction id |
357 | * | 357 | * |
@@ -447,13 +447,13 @@ tid_t txBegin(struct super_block *sb, int flag) | |||
447 | } | 447 | } |
448 | 448 | ||
449 | /* | 449 | /* |
450 | * NAME: txBeginAnon() | 450 | * NAME: txBeginAnon() |
451 | * | 451 | * |
452 | * FUNCTION: start an anonymous transaction. | 452 | * FUNCTION: start an anonymous transaction. |
453 | * Blocks if logsync or available tlocks are low to prevent | 453 | * Blocks if logsync or available tlocks are low to prevent |
454 | * anonymous tlocks from depleting supply. | 454 | * anonymous tlocks from depleting supply. |
455 | * | 455 | * |
456 | * PARAMETER: sb - superblock | 456 | * PARAMETER: sb - superblock |
457 | * | 457 | * |
458 | * RETURN: none | 458 | * RETURN: none |
459 | */ | 459 | */ |
@@ -489,11 +489,11 @@ void txBeginAnon(struct super_block *sb) | |||
489 | } | 489 | } |
490 | 490 | ||
491 | /* | 491 | /* |
492 | * txEnd() | 492 | * txEnd() |
493 | * | 493 | * |
494 | * function: free specified transaction block. | 494 | * function: free specified transaction block. |
495 | * | 495 | * |
496 | * logsync barrier processing: | 496 | * logsync barrier processing: |
497 | * | 497 | * |
498 | * serialization: | 498 | * serialization: |
499 | */ | 499 | */ |
@@ -577,13 +577,13 @@ wakeup: | |||
577 | } | 577 | } |
578 | 578 | ||
579 | /* | 579 | /* |
580 | * txLock() | 580 | * txLock() |
581 | * | 581 | * |
582 | * function: acquire a transaction lock on the specified <mp> | 582 | * function: acquire a transaction lock on the specified <mp> |
583 | * | 583 | * |
584 | * parameter: | 584 | * parameter: |
585 | * | 585 | * |
586 | * return: transaction lock id | 586 | * return: transaction lock id |
587 | * | 587 | * |
588 | * serialization: | 588 | * serialization: |
589 | */ | 589 | */ |
@@ -829,12 +829,16 @@ struct tlock *txLock(tid_t tid, struct inode *ip, struct metapage * mp, | |||
829 | /* Only locks on ipimap or ipaimap should reach here */ | 829 | /* Only locks on ipimap or ipaimap should reach here */ |
830 | /* assert(jfs_ip->fileset == AGGREGATE_I); */ | 830 | /* assert(jfs_ip->fileset == AGGREGATE_I); */ |
831 | if (jfs_ip->fileset != AGGREGATE_I) { | 831 | if (jfs_ip->fileset != AGGREGATE_I) { |
832 | jfs_err("txLock: trying to lock locked page!"); | 832 | printk(KERN_ERR "txLock: trying to lock locked page!"); |
833 | dump_mem("ip", ip, sizeof(struct inode)); | 833 | print_hex_dump(KERN_ERR, "ip: ", DUMP_PREFIX_ADDRESS, 16, 4, |
834 | dump_mem("mp", mp, sizeof(struct metapage)); | 834 | ip, sizeof(*ip), 0); |
835 | dump_mem("Locker's tblk", tid_to_tblock(tid), | 835 | print_hex_dump(KERN_ERR, "mp: ", DUMP_PREFIX_ADDRESS, 16, 4, |
836 | sizeof(struct tblock)); | 836 | mp, sizeof(*mp), 0); |
837 | dump_mem("Tlock", tlck, sizeof(struct tlock)); | 837 | print_hex_dump(KERN_ERR, "Locker's tblock: ", |
838 | DUMP_PREFIX_ADDRESS, 16, 4, tid_to_tblock(tid), | ||
839 | sizeof(struct tblock), 0); | ||
840 | print_hex_dump(KERN_ERR, "Tlock: ", DUMP_PREFIX_ADDRESS, 16, 4, | ||
841 | tlck, sizeof(*tlck), 0); | ||
838 | BUG(); | 842 | BUG(); |
839 | } | 843 | } |
840 | INCREMENT(stattx.waitlock); /* statistics */ | 844 | INCREMENT(stattx.waitlock); /* statistics */ |
@@ -857,17 +861,17 @@ struct tlock *txLock(tid_t tid, struct inode *ip, struct metapage * mp, | |||
857 | } | 861 | } |
858 | 862 | ||
859 | /* | 863 | /* |
860 | * NAME: txRelease() | 864 | * NAME: txRelease() |
861 | * | 865 | * |
862 | * FUNCTION: Release buffers associated with transaction locks, but don't | 866 | * FUNCTION: Release buffers associated with transaction locks, but don't |
863 | * mark homeok yet. The allows other transactions to modify | 867 | * mark homeok yet. The allows other transactions to modify |
864 | * buffers, but won't let them go to disk until commit record | 868 | * buffers, but won't let them go to disk until commit record |
865 | * actually gets written. | 869 | * actually gets written. |
866 | * | 870 | * |
867 | * PARAMETER: | 871 | * PARAMETER: |
868 | * tblk - | 872 | * tblk - |
869 | * | 873 | * |
870 | * RETURN: Errors from subroutines. | 874 | * RETURN: Errors from subroutines. |
871 | */ | 875 | */ |
872 | static void txRelease(struct tblock * tblk) | 876 | static void txRelease(struct tblock * tblk) |
873 | { | 877 | { |
@@ -896,10 +900,10 @@ static void txRelease(struct tblock * tblk) | |||
896 | } | 900 | } |
897 | 901 | ||
898 | /* | 902 | /* |
899 | * NAME: txUnlock() | 903 | * NAME: txUnlock() |
900 | * | 904 | * |
901 | * FUNCTION: Initiates pageout of pages modified by tid in journalled | 905 | * FUNCTION: Initiates pageout of pages modified by tid in journalled |
902 | * objects and frees their lockwords. | 906 | * objects and frees their lockwords. |
903 | */ | 907 | */ |
904 | static void txUnlock(struct tblock * tblk) | 908 | static void txUnlock(struct tblock * tblk) |
905 | { | 909 | { |
@@ -983,10 +987,10 @@ static void txUnlock(struct tblock * tblk) | |||
983 | } | 987 | } |
984 | 988 | ||
985 | /* | 989 | /* |
986 | * txMaplock() | 990 | * txMaplock() |
987 | * | 991 | * |
988 | * function: allocate a transaction lock for freed page/entry; | 992 | * function: allocate a transaction lock for freed page/entry; |
989 | * for freed page, maplock is used as xtlock/dtlock type; | 993 | * for freed page, maplock is used as xtlock/dtlock type; |
990 | */ | 994 | */ |
991 | struct tlock *txMaplock(tid_t tid, struct inode *ip, int type) | 995 | struct tlock *txMaplock(tid_t tid, struct inode *ip, int type) |
992 | { | 996 | { |
@@ -1057,7 +1061,7 @@ struct tlock *txMaplock(tid_t tid, struct inode *ip, int type) | |||
1057 | } | 1061 | } |
1058 | 1062 | ||
1059 | /* | 1063 | /* |
1060 | * txLinelock() | 1064 | * txLinelock() |
1061 | * | 1065 | * |
1062 | * function: allocate a transaction lock for log vector list | 1066 | * function: allocate a transaction lock for log vector list |
1063 | */ | 1067 | */ |
@@ -1092,39 +1096,39 @@ struct linelock *txLinelock(struct linelock * tlock) | |||
1092 | } | 1096 | } |
1093 | 1097 | ||
1094 | /* | 1098 | /* |
1095 | * transaction commit management | 1099 | * transaction commit management |
1096 | * ----------------------------- | 1100 | * ----------------------------- |
1097 | */ | 1101 | */ |
1098 | 1102 | ||
1099 | /* | 1103 | /* |
1100 | * NAME: txCommit() | 1104 | * NAME: txCommit() |
1101 | * | 1105 | * |
1102 | * FUNCTION: commit the changes to the objects specified in | 1106 | * FUNCTION: commit the changes to the objects specified in |
1103 | * clist. For journalled segments only the | 1107 | * clist. For journalled segments only the |
1104 | * changes of the caller are committed, ie by tid. | 1108 | * changes of the caller are committed, ie by tid. |
1105 | * for non-journalled segments the data are flushed to | 1109 | * for non-journalled segments the data are flushed to |
1106 | * disk and then the change to the disk inode and indirect | 1110 | * disk and then the change to the disk inode and indirect |
1107 | * blocks committed (so blocks newly allocated to the | 1111 | * blocks committed (so blocks newly allocated to the |
1108 | * segment will be made a part of the segment atomically). | 1112 | * segment will be made a part of the segment atomically). |
1109 | * | 1113 | * |
1110 | * all of the segments specified in clist must be in | 1114 | * all of the segments specified in clist must be in |
1111 | * one file system. no more than 6 segments are needed | 1115 | * one file system. no more than 6 segments are needed |
1112 | * to handle all unix svcs. | 1116 | * to handle all unix svcs. |
1113 | * | 1117 | * |
1114 | * if the i_nlink field (i.e. disk inode link count) | 1118 | * if the i_nlink field (i.e. disk inode link count) |
1115 | * is zero, and the type of inode is a regular file or | 1119 | * is zero, and the type of inode is a regular file or |
1116 | * directory, or symbolic link , the inode is truncated | 1120 | * directory, or symbolic link , the inode is truncated |
1117 | * to zero length. the truncation is committed but the | 1121 | * to zero length. the truncation is committed but the |
1118 | * VM resources are unaffected until it is closed (see | 1122 | * VM resources are unaffected until it is closed (see |
1119 | * iput and iclose). | 1123 | * iput and iclose). |
1120 | * | 1124 | * |
1121 | * PARAMETER: | 1125 | * PARAMETER: |
1122 | * | 1126 | * |
1123 | * RETURN: | 1127 | * RETURN: |
1124 | * | 1128 | * |
1125 | * serialization: | 1129 | * serialization: |
1126 | * on entry the inode lock on each segment is assumed | 1130 | * on entry the inode lock on each segment is assumed |
1127 | * to be held. | 1131 | * to be held. |
1128 | * | 1132 | * |
1129 | * i/o error: | 1133 | * i/o error: |
1130 | */ | 1134 | */ |
@@ -1175,7 +1179,7 @@ int txCommit(tid_t tid, /* transaction identifier */ | |||
1175 | if ((flag & (COMMIT_FORCE | COMMIT_SYNC)) == 0) | 1179 | if ((flag & (COMMIT_FORCE | COMMIT_SYNC)) == 0) |
1176 | tblk->xflag |= COMMIT_LAZY; | 1180 | tblk->xflag |= COMMIT_LAZY; |
1177 | /* | 1181 | /* |
1178 | * prepare non-journaled objects for commit | 1182 | * prepare non-journaled objects for commit |
1179 | * | 1183 | * |
1180 | * flush data pages of non-journaled file | 1184 | * flush data pages of non-journaled file |
1181 | * to prevent the file getting non-initialized disk blocks | 1185 | * to prevent the file getting non-initialized disk blocks |
@@ -1186,7 +1190,7 @@ int txCommit(tid_t tid, /* transaction identifier */ | |||
1186 | cd.nip = nip; | 1190 | cd.nip = nip; |
1187 | 1191 | ||
1188 | /* | 1192 | /* |
1189 | * acquire transaction lock on (on-disk) inodes | 1193 | * acquire transaction lock on (on-disk) inodes |
1190 | * | 1194 | * |
1191 | * update on-disk inode from in-memory inode | 1195 | * update on-disk inode from in-memory inode |
1192 | * acquiring transaction locks for AFTER records | 1196 | * acquiring transaction locks for AFTER records |
@@ -1262,7 +1266,7 @@ int txCommit(tid_t tid, /* transaction identifier */ | |||
1262 | } | 1266 | } |
1263 | 1267 | ||
1264 | /* | 1268 | /* |
1265 | * write log records from transaction locks | 1269 | * write log records from transaction locks |
1266 | * | 1270 | * |
1267 | * txUpdateMap() resets XAD_NEW in XAD. | 1271 | * txUpdateMap() resets XAD_NEW in XAD. |
1268 | */ | 1272 | */ |
@@ -1294,7 +1298,7 @@ int txCommit(tid_t tid, /* transaction identifier */ | |||
1294 | !test_cflag(COMMIT_Nolink, tblk->u.ip))); | 1298 | !test_cflag(COMMIT_Nolink, tblk->u.ip))); |
1295 | 1299 | ||
1296 | /* | 1300 | /* |
1297 | * write COMMIT log record | 1301 | * write COMMIT log record |
1298 | */ | 1302 | */ |
1299 | lrd->type = cpu_to_le16(LOG_COMMIT); | 1303 | lrd->type = cpu_to_le16(LOG_COMMIT); |
1300 | lrd->length = 0; | 1304 | lrd->length = 0; |
@@ -1303,7 +1307,7 @@ int txCommit(tid_t tid, /* transaction identifier */ | |||
1303 | lmGroupCommit(log, tblk); | 1307 | lmGroupCommit(log, tblk); |
1304 | 1308 | ||
1305 | /* | 1309 | /* |
1306 | * - transaction is now committed - | 1310 | * - transaction is now committed - |
1307 | */ | 1311 | */ |
1308 | 1312 | ||
1309 | /* | 1313 | /* |
@@ -1314,11 +1318,11 @@ int txCommit(tid_t tid, /* transaction identifier */ | |||
1314 | txForce(tblk); | 1318 | txForce(tblk); |
1315 | 1319 | ||
1316 | /* | 1320 | /* |
1317 | * update allocation map. | 1321 | * update allocation map. |
1318 | * | 1322 | * |
1319 | * update inode allocation map and inode: | 1323 | * update inode allocation map and inode: |
1320 | * free pager lock on memory object of inode if any. | 1324 | * free pager lock on memory object of inode if any. |
1321 | * update block allocation map. | 1325 | * update block allocation map. |
1322 | * | 1326 | * |
1323 | * txUpdateMap() resets XAD_NEW in XAD. | 1327 | * txUpdateMap() resets XAD_NEW in XAD. |
1324 | */ | 1328 | */ |
@@ -1326,7 +1330,7 @@ int txCommit(tid_t tid, /* transaction identifier */ | |||
1326 | txUpdateMap(tblk); | 1330 | txUpdateMap(tblk); |
1327 | 1331 | ||
1328 | /* | 1332 | /* |
1329 | * free transaction locks and pageout/free pages | 1333 | * free transaction locks and pageout/free pages |
1330 | */ | 1334 | */ |
1331 | txRelease(tblk); | 1335 | txRelease(tblk); |
1332 | 1336 | ||
@@ -1335,7 +1339,7 @@ int txCommit(tid_t tid, /* transaction identifier */ | |||
1335 | 1339 | ||
1336 | 1340 | ||
1337 | /* | 1341 | /* |
1338 | * reset in-memory object state | 1342 | * reset in-memory object state |
1339 | */ | 1343 | */ |
1340 | for (k = 0; k < cd.nip; k++) { | 1344 | for (k = 0; k < cd.nip; k++) { |
1341 | ip = cd.iplist[k]; | 1345 | ip = cd.iplist[k]; |
@@ -1358,11 +1362,11 @@ int txCommit(tid_t tid, /* transaction identifier */ | |||
1358 | } | 1362 | } |
1359 | 1363 | ||
1360 | /* | 1364 | /* |
1361 | * NAME: txLog() | 1365 | * NAME: txLog() |
1362 | * | 1366 | * |
1363 | * FUNCTION: Writes AFTER log records for all lines modified | 1367 | * FUNCTION: Writes AFTER log records for all lines modified |
1364 | * by tid for segments specified by inodes in comdata. | 1368 | * by tid for segments specified by inodes in comdata. |
1365 | * Code assumes only WRITELOCKS are recorded in lockwords. | 1369 | * Code assumes only WRITELOCKS are recorded in lockwords. |
1366 | * | 1370 | * |
1367 | * PARAMETERS: | 1371 | * PARAMETERS: |
1368 | * | 1372 | * |
@@ -1421,12 +1425,12 @@ static int txLog(struct jfs_log * log, struct tblock * tblk, struct commit * cd) | |||
1421 | } | 1425 | } |
1422 | 1426 | ||
1423 | /* | 1427 | /* |
1424 | * diLog() | 1428 | * diLog() |
1425 | * | 1429 | * |
1426 | * function: log inode tlock and format maplock to update bmap; | 1430 | * function: log inode tlock and format maplock to update bmap; |
1427 | */ | 1431 | */ |
1428 | static int diLog(struct jfs_log * log, struct tblock * tblk, struct lrd * lrd, | 1432 | static int diLog(struct jfs_log * log, struct tblock * tblk, struct lrd * lrd, |
1429 | struct tlock * tlck, struct commit * cd) | 1433 | struct tlock * tlck, struct commit * cd) |
1430 | { | 1434 | { |
1431 | int rc = 0; | 1435 | int rc = 0; |
1432 | struct metapage *mp; | 1436 | struct metapage *mp; |
@@ -1442,7 +1446,7 @@ static int diLog(struct jfs_log * log, struct tblock * tblk, struct lrd * lrd, | |||
1442 | pxd = &lrd->log.redopage.pxd; | 1446 | pxd = &lrd->log.redopage.pxd; |
1443 | 1447 | ||
1444 | /* | 1448 | /* |
1445 | * inode after image | 1449 | * inode after image |
1446 | */ | 1450 | */ |
1447 | if (tlck->type & tlckENTRY) { | 1451 | if (tlck->type & tlckENTRY) { |
1448 | /* log after-image for logredo(): */ | 1452 | /* log after-image for logredo(): */ |
@@ -1456,7 +1460,7 @@ static int diLog(struct jfs_log * log, struct tblock * tblk, struct lrd * lrd, | |||
1456 | tlck->flag |= tlckWRITEPAGE; | 1460 | tlck->flag |= tlckWRITEPAGE; |
1457 | } else if (tlck->type & tlckFREE) { | 1461 | } else if (tlck->type & tlckFREE) { |
1458 | /* | 1462 | /* |
1459 | * free inode extent | 1463 | * free inode extent |
1460 | * | 1464 | * |
1461 | * (pages of the freed inode extent have been invalidated and | 1465 | * (pages of the freed inode extent have been invalidated and |
1462 | * a maplock for free of the extent has been formatted at | 1466 | * a maplock for free of the extent has been formatted at |
@@ -1498,7 +1502,7 @@ static int diLog(struct jfs_log * log, struct tblock * tblk, struct lrd * lrd, | |||
1498 | jfs_err("diLog: UFO type tlck:0x%p", tlck); | 1502 | jfs_err("diLog: UFO type tlck:0x%p", tlck); |
1499 | #ifdef _JFS_WIP | 1503 | #ifdef _JFS_WIP |
1500 | /* | 1504 | /* |
1501 | * alloc/free external EA extent | 1505 | * alloc/free external EA extent |
1502 | * | 1506 | * |
1503 | * a maplock for txUpdateMap() to update bPWMAP for alloc/free | 1507 | * a maplock for txUpdateMap() to update bPWMAP for alloc/free |
1504 | * of the extent has been formatted at txLock() time; | 1508 | * of the extent has been formatted at txLock() time; |
@@ -1534,9 +1538,9 @@ static int diLog(struct jfs_log * log, struct tblock * tblk, struct lrd * lrd, | |||
1534 | } | 1538 | } |
1535 | 1539 | ||
1536 | /* | 1540 | /* |
1537 | * dataLog() | 1541 | * dataLog() |
1538 | * | 1542 | * |
1539 | * function: log data tlock | 1543 | * function: log data tlock |
1540 | */ | 1544 | */ |
1541 | static int dataLog(struct jfs_log * log, struct tblock * tblk, struct lrd * lrd, | 1545 | static int dataLog(struct jfs_log * log, struct tblock * tblk, struct lrd * lrd, |
1542 | struct tlock * tlck) | 1546 | struct tlock * tlck) |
@@ -1580,9 +1584,9 @@ static int dataLog(struct jfs_log * log, struct tblock * tblk, struct lrd * lrd, | |||
1580 | } | 1584 | } |
1581 | 1585 | ||
1582 | /* | 1586 | /* |
1583 | * dtLog() | 1587 | * dtLog() |
1584 | * | 1588 | * |
1585 | * function: log dtree tlock and format maplock to update bmap; | 1589 | * function: log dtree tlock and format maplock to update bmap; |
1586 | */ | 1590 | */ |
1587 | static void dtLog(struct jfs_log * log, struct tblock * tblk, struct lrd * lrd, | 1591 | static void dtLog(struct jfs_log * log, struct tblock * tblk, struct lrd * lrd, |
1588 | struct tlock * tlck) | 1592 | struct tlock * tlck) |
@@ -1603,10 +1607,10 @@ static void dtLog(struct jfs_log * log, struct tblock * tblk, struct lrd * lrd, | |||
1603 | lrd->log.redopage.type |= cpu_to_le16(LOG_BTROOT); | 1607 | lrd->log.redopage.type |= cpu_to_le16(LOG_BTROOT); |
1604 | 1608 | ||
1605 | /* | 1609 | /* |
1606 | * page extension via relocation: entry insertion; | 1610 | * page extension via relocation: entry insertion; |
1607 | * page extension in-place: entry insertion; | 1611 | * page extension in-place: entry insertion; |
1608 | * new right page from page split, reinitialized in-line | 1612 | * new right page from page split, reinitialized in-line |
1609 | * root from root page split: entry insertion; | 1613 | * root from root page split: entry insertion; |
1610 | */ | 1614 | */ |
1611 | if (tlck->type & (tlckNEW | tlckEXTEND)) { | 1615 | if (tlck->type & (tlckNEW | tlckEXTEND)) { |
1612 | /* log after-image of the new page for logredo(): | 1616 | /* log after-image of the new page for logredo(): |
@@ -1641,8 +1645,8 @@ static void dtLog(struct jfs_log * log, struct tblock * tblk, struct lrd * lrd, | |||
1641 | } | 1645 | } |
1642 | 1646 | ||
1643 | /* | 1647 | /* |
1644 | * entry insertion/deletion, | 1648 | * entry insertion/deletion, |
1645 | * sibling page link update (old right page before split); | 1649 | * sibling page link update (old right page before split); |
1646 | */ | 1650 | */ |
1647 | if (tlck->type & (tlckENTRY | tlckRELINK)) { | 1651 | if (tlck->type & (tlckENTRY | tlckRELINK)) { |
1648 | /* log after-image for logredo(): */ | 1652 | /* log after-image for logredo(): */ |
@@ -1658,11 +1662,11 @@ static void dtLog(struct jfs_log * log, struct tblock * tblk, struct lrd * lrd, | |||
1658 | } | 1662 | } |
1659 | 1663 | ||
1660 | /* | 1664 | /* |
1661 | * page deletion: page has been invalidated | 1665 | * page deletion: page has been invalidated |
1662 | * page relocation: source extent | 1666 | * page relocation: source extent |
1663 | * | 1667 | * |
1664 | * a maplock for free of the page has been formatted | 1668 | * a maplock for free of the page has been formatted |
1665 | * at txLock() time); | 1669 | * at txLock() time); |
1666 | */ | 1670 | */ |
1667 | if (tlck->type & (tlckFREE | tlckRELOCATE)) { | 1671 | if (tlck->type & (tlckFREE | tlckRELOCATE)) { |
1668 | /* log LOG_NOREDOPAGE of the deleted page for logredo() | 1672 | /* log LOG_NOREDOPAGE of the deleted page for logredo() |
@@ -1683,9 +1687,9 @@ static void dtLog(struct jfs_log * log, struct tblock * tblk, struct lrd * lrd, | |||
1683 | } | 1687 | } |
1684 | 1688 | ||
1685 | /* | 1689 | /* |
1686 | * xtLog() | 1690 | * xtLog() |
1687 | * | 1691 | * |
1688 | * function: log xtree tlock and format maplock to update bmap; | 1692 | * function: log xtree tlock and format maplock to update bmap; |
1689 | */ | 1693 | */ |
1690 | static void xtLog(struct jfs_log * log, struct tblock * tblk, struct lrd * lrd, | 1694 | static void xtLog(struct jfs_log * log, struct tblock * tblk, struct lrd * lrd, |
1691 | struct tlock * tlck) | 1695 | struct tlock * tlck) |
@@ -1725,8 +1729,8 @@ static void xtLog(struct jfs_log * log, struct tblock * tblk, struct lrd * lrd, | |||
1725 | xadlock = (struct xdlistlock *) maplock; | 1729 | xadlock = (struct xdlistlock *) maplock; |
1726 | 1730 | ||
1727 | /* | 1731 | /* |
1728 | * entry insertion/extension; | 1732 | * entry insertion/extension; |
1729 | * sibling page link update (old right page before split); | 1733 | * sibling page link update (old right page before split); |
1730 | */ | 1734 | */ |
1731 | if (tlck->type & (tlckNEW | tlckGROW | tlckRELINK)) { | 1735 | if (tlck->type & (tlckNEW | tlckGROW | tlckRELINK)) { |
1732 | /* log after-image for logredo(): | 1736 | /* log after-image for logredo(): |
@@ -1801,7 +1805,7 @@ static void xtLog(struct jfs_log * log, struct tblock * tblk, struct lrd * lrd, | |||
1801 | } | 1805 | } |
1802 | 1806 | ||
1803 | /* | 1807 | /* |
1804 | * page deletion: file deletion/truncation (ref. xtTruncate()) | 1808 | * page deletion: file deletion/truncation (ref. xtTruncate()) |
1805 | * | 1809 | * |
1806 | * (page will be invalidated after log is written and bmap | 1810 | * (page will be invalidated after log is written and bmap |
1807 | * is updated from the page); | 1811 | * is updated from the page); |
@@ -1908,13 +1912,13 @@ static void xtLog(struct jfs_log * log, struct tblock * tblk, struct lrd * lrd, | |||
1908 | } | 1912 | } |
1909 | 1913 | ||
1910 | /* | 1914 | /* |
1911 | * page/entry truncation: file truncation (ref. xtTruncate()) | 1915 | * page/entry truncation: file truncation (ref. xtTruncate()) |
1912 | * | 1916 | * |
1913 | * |----------+------+------+---------------| | 1917 | * |----------+------+------+---------------| |
1914 | * | | | | 1918 | * | | | |
1915 | * | | hwm - hwm before truncation | 1919 | * | | hwm - hwm before truncation |
1916 | * | next - truncation point | 1920 | * | next - truncation point |
1917 | * lwm - lwm before truncation | 1921 | * lwm - lwm before truncation |
1918 | * header ? | 1922 | * header ? |
1919 | */ | 1923 | */ |
1920 | if (tlck->type & tlckTRUNCATE) { | 1924 | if (tlck->type & tlckTRUNCATE) { |
@@ -1937,7 +1941,7 @@ static void xtLog(struct jfs_log * log, struct tblock * tblk, struct lrd * lrd, | |||
1937 | twm = xtlck->twm.offset; | 1941 | twm = xtlck->twm.offset; |
1938 | 1942 | ||
1939 | /* | 1943 | /* |
1940 | * write log records | 1944 | * write log records |
1941 | */ | 1945 | */ |
1942 | /* log after-image for logredo(): | 1946 | /* log after-image for logredo(): |
1943 | * | 1947 | * |
@@ -1997,7 +2001,7 @@ static void xtLog(struct jfs_log * log, struct tblock * tblk, struct lrd * lrd, | |||
1997 | } | 2001 | } |
1998 | 2002 | ||
1999 | /* | 2003 | /* |
2000 | * format maplock(s) for txUpdateMap() to update bmap | 2004 | * format maplock(s) for txUpdateMap() to update bmap |
2001 | */ | 2005 | */ |
2002 | maplock->index = 0; | 2006 | maplock->index = 0; |
2003 | 2007 | ||
@@ -2069,9 +2073,9 @@ static void xtLog(struct jfs_log * log, struct tblock * tblk, struct lrd * lrd, | |||
2069 | } | 2073 | } |
2070 | 2074 | ||
2071 | /* | 2075 | /* |
2072 | * mapLog() | 2076 | * mapLog() |
2073 | * | 2077 | * |
2074 | * function: log from maplock of freed data extents; | 2078 | * function: log from maplock of freed data extents; |
2075 | */ | 2079 | */ |
2076 | static void mapLog(struct jfs_log * log, struct tblock * tblk, struct lrd * lrd, | 2080 | static void mapLog(struct jfs_log * log, struct tblock * tblk, struct lrd * lrd, |
2077 | struct tlock * tlck) | 2081 | struct tlock * tlck) |
@@ -2081,7 +2085,7 @@ static void mapLog(struct jfs_log * log, struct tblock * tblk, struct lrd * lrd, | |||
2081 | pxd_t *pxd; | 2085 | pxd_t *pxd; |
2082 | 2086 | ||
2083 | /* | 2087 | /* |
2084 | * page relocation: free the source page extent | 2088 | * page relocation: free the source page extent |
2085 | * | 2089 | * |
2086 | * a maplock for txUpdateMap() for free of the page | 2090 | * a maplock for txUpdateMap() for free of the page |
2087 | * has been formatted at txLock() time saving the src | 2091 | * has been formatted at txLock() time saving the src |
@@ -2155,10 +2159,10 @@ static void mapLog(struct jfs_log * log, struct tblock * tblk, struct lrd * lrd, | |||
2155 | } | 2159 | } |
2156 | 2160 | ||
2157 | /* | 2161 | /* |
2158 | * txEA() | 2162 | * txEA() |
2159 | * | 2163 | * |
2160 | * function: acquire maplock for EA/ACL extents or | 2164 | * function: acquire maplock for EA/ACL extents or |
2161 | * set COMMIT_INLINE flag; | 2165 | * set COMMIT_INLINE flag; |
2162 | */ | 2166 | */ |
2163 | void txEA(tid_t tid, struct inode *ip, dxd_t * oldea, dxd_t * newea) | 2167 | void txEA(tid_t tid, struct inode *ip, dxd_t * oldea, dxd_t * newea) |
2164 | { | 2168 | { |
@@ -2207,10 +2211,10 @@ void txEA(tid_t tid, struct inode *ip, dxd_t * oldea, dxd_t * newea) | |||
2207 | } | 2211 | } |
2208 | 2212 | ||
2209 | /* | 2213 | /* |
2210 | * txForce() | 2214 | * txForce() |
2211 | * | 2215 | * |
2212 | * function: synchronously write pages locked by transaction | 2216 | * function: synchronously write pages locked by transaction |
2213 | * after txLog() but before txUpdateMap(); | 2217 | * after txLog() but before txUpdateMap(); |
2214 | */ | 2218 | */ |
2215 | static void txForce(struct tblock * tblk) | 2219 | static void txForce(struct tblock * tblk) |
2216 | { | 2220 | { |
@@ -2273,10 +2277,10 @@ static void txForce(struct tblock * tblk) | |||
2273 | } | 2277 | } |
2274 | 2278 | ||
2275 | /* | 2279 | /* |
2276 | * txUpdateMap() | 2280 | * txUpdateMap() |
2277 | * | 2281 | * |
2278 | * function: update persistent allocation map (and working map | 2282 | * function: update persistent allocation map (and working map |
2279 | * if appropriate); | 2283 | * if appropriate); |
2280 | * | 2284 | * |
2281 | * parameter: | 2285 | * parameter: |
2282 | */ | 2286 | */ |
@@ -2298,7 +2302,7 @@ static void txUpdateMap(struct tblock * tblk) | |||
2298 | 2302 | ||
2299 | 2303 | ||
2300 | /* | 2304 | /* |
2301 | * update block allocation map | 2305 | * update block allocation map |
2302 | * | 2306 | * |
2303 | * update allocation state in pmap (and wmap) and | 2307 | * update allocation state in pmap (and wmap) and |
2304 | * update lsn of the pmap page; | 2308 | * update lsn of the pmap page; |
@@ -2382,7 +2386,7 @@ static void txUpdateMap(struct tblock * tblk) | |||
2382 | } | 2386 | } |
2383 | } | 2387 | } |
2384 | /* | 2388 | /* |
2385 | * update inode allocation map | 2389 | * update inode allocation map |
2386 | * | 2390 | * |
2387 | * update allocation state in pmap and | 2391 | * update allocation state in pmap and |
2388 | * update lsn of the pmap page; | 2392 | * update lsn of the pmap page; |
@@ -2407,24 +2411,24 @@ static void txUpdateMap(struct tblock * tblk) | |||
2407 | } | 2411 | } |
2408 | 2412 | ||
2409 | /* | 2413 | /* |
2410 | * txAllocPMap() | 2414 | * txAllocPMap() |
2411 | * | 2415 | * |
2412 | * function: allocate from persistent map; | 2416 | * function: allocate from persistent map; |
2413 | * | 2417 | * |
2414 | * parameter: | 2418 | * parameter: |
2415 | * ipbmap - | 2419 | * ipbmap - |
2416 | * malock - | 2420 | * malock - |
2417 | * xad list: | 2421 | * xad list: |
2418 | * pxd: | 2422 | * pxd: |
2419 | * | 2423 | * |
2420 | * maptype - | 2424 | * maptype - |
2421 | * allocate from persistent map; | 2425 | * allocate from persistent map; |
2422 | * free from persistent map; | 2426 | * free from persistent map; |
2423 | * (e.g., tmp file - free from working map at releae | 2427 | * (e.g., tmp file - free from working map at releae |
2424 | * of last reference); | 2428 | * of last reference); |
2425 | * free from persistent and working map; | 2429 | * free from persistent and working map; |
2426 | * | 2430 | * |
2427 | * lsn - log sequence number; | 2431 | * lsn - log sequence number; |
2428 | */ | 2432 | */ |
2429 | static void txAllocPMap(struct inode *ip, struct maplock * maplock, | 2433 | static void txAllocPMap(struct inode *ip, struct maplock * maplock, |
2430 | struct tblock * tblk) | 2434 | struct tblock * tblk) |
@@ -2478,9 +2482,9 @@ static void txAllocPMap(struct inode *ip, struct maplock * maplock, | |||
2478 | } | 2482 | } |
2479 | 2483 | ||
2480 | /* | 2484 | /* |
2481 | * txFreeMap() | 2485 | * txFreeMap() |
2482 | * | 2486 | * |
2483 | * function: free from persistent and/or working map; | 2487 | * function: free from persistent and/or working map; |
2484 | * | 2488 | * |
2485 | * todo: optimization | 2489 | * todo: optimization |
2486 | */ | 2490 | */ |
@@ -2579,9 +2583,9 @@ void txFreeMap(struct inode *ip, | |||
2579 | } | 2583 | } |
2580 | 2584 | ||
2581 | /* | 2585 | /* |
2582 | * txFreelock() | 2586 | * txFreelock() |
2583 | * | 2587 | * |
2584 | * function: remove tlock from inode anonymous locklist | 2588 | * function: remove tlock from inode anonymous locklist |
2585 | */ | 2589 | */ |
2586 | void txFreelock(struct inode *ip) | 2590 | void txFreelock(struct inode *ip) |
2587 | { | 2591 | { |
@@ -2619,7 +2623,7 @@ void txFreelock(struct inode *ip) | |||
2619 | } | 2623 | } |
2620 | 2624 | ||
2621 | /* | 2625 | /* |
2622 | * txAbort() | 2626 | * txAbort() |
2623 | * | 2627 | * |
2624 | * function: abort tx before commit; | 2628 | * function: abort tx before commit; |
2625 | * | 2629 | * |
@@ -2679,7 +2683,7 @@ void txAbort(tid_t tid, int dirty) | |||
2679 | } | 2683 | } |
2680 | 2684 | ||
2681 | /* | 2685 | /* |
2682 | * txLazyCommit(void) | 2686 | * txLazyCommit(void) |
2683 | * | 2687 | * |
2684 | * All transactions except those changing ipimap (COMMIT_FORCE) are | 2688 | * All transactions except those changing ipimap (COMMIT_FORCE) are |
2685 | * processed by this routine. This insures that the inode and block | 2689 | * processed by this routine. This insures that the inode and block |
@@ -2728,7 +2732,7 @@ static void txLazyCommit(struct tblock * tblk) | |||
2728 | } | 2732 | } |
2729 | 2733 | ||
2730 | /* | 2734 | /* |
2731 | * jfs_lazycommit(void) | 2735 | * jfs_lazycommit(void) |
2732 | * | 2736 | * |
2733 | * To be run as a kernel daemon. If lbmIODone is called in an interrupt | 2737 | * To be run as a kernel daemon. If lbmIODone is called in an interrupt |
2734 | * context, or where blocking is not wanted, this routine will process | 2738 | * context, or where blocking is not wanted, this routine will process |
@@ -2913,7 +2917,7 @@ void txResume(struct super_block *sb) | |||
2913 | } | 2917 | } |
2914 | 2918 | ||
2915 | /* | 2919 | /* |
2916 | * jfs_sync(void) | 2920 | * jfs_sync(void) |
2917 | * | 2921 | * |
2918 | * To be run as a kernel daemon. This is awakened when tlocks run low. | 2922 | * To be run as a kernel daemon. This is awakened when tlocks run low. |
2919 | * We write any inodes that have anonymous tlocks so they will become | 2923 | * We write any inodes that have anonymous tlocks so they will become |