Commit be0bf7da19135a7a0f8c275f20c819940be218d9
1 parent
5b3030e390
Exists in
master
and in
4 other branches
JFS: Take logsync lock before testing mp->lsn
This fixes a race where lsn could be cleared before taking the lock Signed-off-by: Dave Kleikamp <shaggy@austin.ibm.com>
Showing 2 changed files with 4 additions and 9 deletions Side-by-side Diff
fs/jfs/jfs_dmap.c
| ... | ... | @@ -532,10 +532,10 @@ |
| 532 | 532 | |
| 533 | 533 | lastlblkno = lblkno; |
| 534 | 534 | |
| 535 | + LOGSYNC_LOCK(log, flags); | |
| 535 | 536 | if (mp->lsn != 0) { |
| 536 | 537 | /* inherit older/smaller lsn */ |
| 537 | 538 | logdiff(diffp, mp->lsn, log); |
| 538 | - LOGSYNC_LOCK(log, flags); | |
| 539 | 539 | if (difft < diffp) { |
| 540 | 540 | mp->lsn = lsn; |
| 541 | 541 | |
| 542 | 542 | |
| 543 | 543 | |
| 544 | 544 | |
| ... | ... | @@ -548,20 +548,17 @@ |
| 548 | 548 | logdiff(diffp, mp->clsn, log); |
| 549 | 549 | if (difft > diffp) |
| 550 | 550 | mp->clsn = tblk->clsn; |
| 551 | - LOGSYNC_UNLOCK(log, flags); | |
| 552 | 551 | } else { |
| 553 | 552 | mp->log = log; |
| 554 | 553 | mp->lsn = lsn; |
| 555 | 554 | |
| 556 | 555 | /* insert bp after tblock in logsync list */ |
| 557 | - LOGSYNC_LOCK(log, flags); | |
| 558 | - | |
| 559 | 556 | log->count++; |
| 560 | 557 | list_add(&mp->synclist, &tblk->synclist); |
| 561 | 558 | |
| 562 | 559 | mp->clsn = tblk->clsn; |
| 563 | - LOGSYNC_UNLOCK(log, flags); | |
| 564 | 560 | } |
| 561 | + LOGSYNC_UNLOCK(log, flags); | |
| 565 | 562 | } |
| 566 | 563 | |
| 567 | 564 | /* write the last buffer. */ |
fs/jfs/jfs_imap.c
| ... | ... | @@ -2844,11 +2844,11 @@ |
| 2844 | 2844 | */ |
| 2845 | 2845 | lsn = tblk->lsn; |
| 2846 | 2846 | log = JFS_SBI(tblk->sb)->log; |
| 2847 | + LOGSYNC_LOCK(log, flags); | |
| 2847 | 2848 | if (mp->lsn != 0) { |
| 2848 | 2849 | /* inherit older/smaller lsn */ |
| 2849 | 2850 | logdiff(difft, lsn, log); |
| 2850 | 2851 | logdiff(diffp, mp->lsn, log); |
| 2851 | - LOGSYNC_LOCK(log, flags); | |
| 2852 | 2852 | if (difft < diffp) { |
| 2853 | 2853 | mp->lsn = lsn; |
| 2854 | 2854 | /* move mp after tblock in logsync list */ |
| 2855 | 2855 | |
| 2856 | 2856 | |
| 2857 | 2857 | |
| ... | ... | @@ -2860,17 +2860,15 @@ |
| 2860 | 2860 | logdiff(diffp, mp->clsn, log); |
| 2861 | 2861 | if (difft > diffp) |
| 2862 | 2862 | mp->clsn = tblk->clsn; |
| 2863 | - LOGSYNC_UNLOCK(log, flags); | |
| 2864 | 2863 | } else { |
| 2865 | 2864 | mp->log = log; |
| 2866 | 2865 | mp->lsn = lsn; |
| 2867 | 2866 | /* insert mp after tblock in logsync list */ |
| 2868 | - LOGSYNC_LOCK(log, flags); | |
| 2869 | 2867 | log->count++; |
| 2870 | 2868 | list_add(&mp->synclist, &tblk->synclist); |
| 2871 | 2869 | mp->clsn = tblk->clsn; |
| 2872 | - LOGSYNC_UNLOCK(log, flags); | |
| 2873 | 2870 | } |
| 2871 | + LOGSYNC_UNLOCK(log, flags); | |
| 2874 | 2872 | write_metapage(mp); |
| 2875 | 2873 | return (0); |
| 2876 | 2874 | } |