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 missing cleanup of gc cache on error cases
nilfs2: fix kernel oops in error case of nilfs_ioctl_move_blocks

+15 -18
+15 -18
fs/nilfs2/ioctl.c
··· 297 297 (unsigned long long)vdesc->vd_vblocknr); 298 298 return ret; 299 299 } 300 - bh->b_private = vdesc; 300 + if (unlikely(!list_empty(&bh->b_assoc_buffers))) { 301 + printk(KERN_CRIT "%s: conflicting %s buffer: ino=%llu, " 302 + "cno=%llu, offset=%llu, blocknr=%llu, vblocknr=%llu\n", 303 + __func__, vdesc->vd_flags ? "node" : "data", 304 + (unsigned long long)vdesc->vd_ino, 305 + (unsigned long long)vdesc->vd_cno, 306 + (unsigned long long)vdesc->vd_offset, 307 + (unsigned long long)vdesc->vd_blocknr, 308 + (unsigned long long)vdesc->vd_vblocknr); 309 + brelse(bh); 310 + return -EEXIST; 311 + } 301 312 list_add_tail(&bh->b_assoc_buffers, buffers); 302 313 return 0; 303 314 } ··· 346 335 list_for_each_entry_safe(bh, n, &buffers, b_assoc_buffers) { 347 336 ret = nilfs_gccache_wait_and_mark_dirty(bh); 348 337 if (unlikely(ret < 0)) { 349 - if (ret == -EEXIST) { 350 - vdesc = bh->b_private; 351 - printk(KERN_CRIT 352 - "%s: conflicting %s buffer: " 353 - "ino=%llu, cno=%llu, offset=%llu, " 354 - "blocknr=%llu, vblocknr=%llu\n", 355 - __func__, 356 - vdesc->vd_flags ? "node" : "data", 357 - (unsigned long long)vdesc->vd_ino, 358 - (unsigned long long)vdesc->vd_cno, 359 - (unsigned long long)vdesc->vd_offset, 360 - (unsigned long long)vdesc->vd_blocknr, 361 - (unsigned long long)vdesc->vd_vblocknr); 362 - } 338 + WARN_ON(ret == -EEXIST); 363 339 goto failed; 364 340 } 365 341 list_del_init(&bh->b_assoc_buffers); 366 - bh->b_private = NULL; 367 342 brelse(bh); 368 343 } 369 344 return nmembs; ··· 357 360 failed: 358 361 list_for_each_entry_safe(bh, n, &buffers, b_assoc_buffers) { 359 362 list_del_init(&bh->b_assoc_buffers); 360 - bh->b_private = NULL; 361 363 brelse(bh); 362 364 } 363 365 return ret; ··· 467 471 return 0; 468 472 469 473 failed: 470 - nilfs_remove_all_gcinode(nilfs); 471 474 printk(KERN_ERR "NILFS: GC failed during preparation: %s: err=%d\n", 472 475 msg, ret); 473 476 return ret; ··· 555 560 else 556 561 ret = nilfs_clean_segments(inode->i_sb, argv, kbufs); 557 562 563 + if (ret < 0) 564 + nilfs_remove_all_gcinode(nilfs); 558 565 clear_nilfs_gc_running(nilfs); 559 566 560 567 out_free: