Re: ceph: fix leaked inode reference on writeback abort at umount
Alex Markuze <[email protected]>
| Newsgroups | org.kernel.vger.ceph-devel |
|---|---|
| Message-ID | <[email protected]> |
Hi matthew,
NACK for now. Thanks for the patch, but I have some concerns
that need a v2:
1. [major] commit message: Commit message describes a nonexistent redirty mechanism
The commit message claims `redirty_page_for_writepage()` calls
`folio_mark_dirty()`, which re-enters `ceph_dirty_folio()` and
double-increments `i_wrbuffer_ref`. This doesn't happen. The actual
chain is `redirty_page_for_writepage()` →
`folio_redirty_for_writepage()` → `filemap_dirty_folio()`, which
sets PG_dirty directly — it never dispatches through
`->dirty_folio`, so `ceph_dirty_folio()` is never re-entered. The
real bug is simpler: the wrbuffer claim (i_wrbuffer_ref,
snap_context, ihold) is leaked because `writepages_finish()` — the
only release path — never runs for writes that were never
submitted. During umount the osd_stopping_blocker keeps failing, so
the claim stays leaked and the inode can't be evicted.
Suggested fix: Drop the double-increment theory. Rewrite around the
actual failure: unsubmitted writes orphan their wrbuffer claim, and
releasing it before redirtying lets `i_wrbuffer_ref` reach 0 and
unblocks inode eviction.
2. [nit] fs/ceph/addr.c:1429: Helper uses page API instead of folio API
`ceph_undo_wrbuffer_claim()` takes `struct page *` and uses
`detach_page_private()`, while `ceph_invalidate_folio()` uses
`folio_detach_private()`. Functionally identical but folio API is
preferred for new code.
Suggested fix: Worth converting if respinning anyway, but not a
blocker.
Code fix is correct but commit message wrongly claims redirty re-enters ceph_dirty_folio(); needs respin with accurate description of the leaked wrbuffer claim.
--
Alex Markuze