exofs: clean up the correct page collection on write error
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>
This commit is contained in:
parent
b6755ffb0c
commit
af402ab2b0
1 changed files with 4 additions and 2 deletions
|
@ -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;
|
||||
|
|
Loading…
Reference in a new issue