Commit be0bf7da19135a7a0f8c275f20c819940be218d9

Authored by Dave Kleikamp
1 parent 5b3030e390

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

... ... @@ -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. */
... ... @@ -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 }