Skip to content

Commit

Permalink
exofs: clean up the correct page collection on write error
Browse files Browse the repository at this point in the history
if ore_write() fails, we would unlock the pages of pcol, which is now
empty, rather than pcol_copy which owns the pages when ore_write() is
called. this means that no pages will actually be unlocked
(pcol.nr_pages == 0) and the writing process (more accurately, the
syncing process) will hang waiting for a writeback notification that
never comes.

moreover, if ore_write() fails, pcol_free() is called for pcol, whereas
pcol_copy is the object owning the ore_io_state, thus leaking the
ore_io_state.

[Boaz]
I have simplified Idan's original patch a bit, everything else still
holds

Signed-off-by: Idan Kedar <idank@tonian.com>
Signed-off-by: Boaz Harrosh <bharrosh@panasas.com>
  • Loading branch information
Idan Kedar authored and Boaz Harrosh committed Dec 11, 2012
1 parent b6755ff commit af402ab
Showing 1 changed file with 4 additions and 2 deletions.
6 changes: 4 additions & 2 deletions fs/exofs/inode.c
Original file line number Diff line number Diff line change
Expand Up @@ -676,8 +676,10 @@ static int write_exec(struct page_collect *pcol)
return 0;

err:
_unlock_pcol_pages(pcol, ret, WRITE);
pcol_free(pcol);
if (!pcol_copy) /* Failed before ownership transfer */
pcol_copy = pcol;
_unlock_pcol_pages(pcol_copy, ret, WRITE);
pcol_free(pcol_copy);
kfree(pcol_copy);

return ret;
Expand Down

0 comments on commit af402ab

Please sign in to comment.