Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/ryusuke/nilfs2

* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/ryusuke/nilfs2:
nilfs2: fix imperfect completion wait in nilfs_wait_on_logs
nilfs2: fix hang-up of cleaner after log writer returned with error
nilfs2: fix duplicate call to nilfs_segctor_cancel_freev

+11 -12
+4 -4
fs/nilfs2/segbuf.c
··· 323 323 int nilfs_wait_on_logs(struct list_head *logs) 324 324 { 325 325 struct nilfs_segment_buffer *segbuf; 326 - int err; 326 + int err, ret = 0; 327 327 328 328 list_for_each_entry(segbuf, logs, sb_list) { 329 329 err = nilfs_segbuf_wait(segbuf); 330 - if (err) 331 - return err; 330 + if (err && !ret) 331 + ret = err; 332 332 } 333 - return 0; 333 + return ret; 334 334 } 335 335 336 336 /*
+7 -8
fs/nilfs2/segment.c
··· 1510 1510 if (mode != SC_LSEG_SR || sci->sc_stage.scnt < NILFS_ST_CPFILE) 1511 1511 break; 1512 1512 1513 + nilfs_clear_logs(&sci->sc_segbufs); 1514 + 1515 + err = nilfs_segctor_extend_segments(sci, nilfs, nadd); 1516 + if (unlikely(err)) 1517 + return err; 1518 + 1513 1519 if (sci->sc_stage.flags & NILFS_CF_SUFREED) { 1514 1520 err = nilfs_sufile_cancel_freev(nilfs->ns_sufile, 1515 1521 sci->sc_freesegs, ··· 1523 1517 NULL); 1524 1518 WARN_ON(err); /* do not happen */ 1525 1519 } 1526 - nilfs_clear_logs(&sci->sc_segbufs); 1527 - 1528 - err = nilfs_segctor_extend_segments(sci, nilfs, nadd); 1529 - if (unlikely(err)) 1530 - return err; 1531 - 1532 1520 nadd = min_t(int, nadd << 1, SC_MAX_SEGDELTA); 1533 1521 sci->sc_stage = prev_stage; 1534 1522 } ··· 1897 1897 1898 1898 list_splice_tail_init(&sci->sc_write_logs, &logs); 1899 1899 ret = nilfs_wait_on_logs(&logs); 1900 - if (ret) 1901 - nilfs_abort_logs(&logs, NULL, sci->sc_super_root, ret); 1900 + nilfs_abort_logs(&logs, NULL, sci->sc_super_root, ret ? : err); 1902 1901 1903 1902 list_splice_tail_init(&sci->sc_segbufs, &logs); 1904 1903 nilfs_cancel_segusage(&logs, nilfs->ns_sufile);