Skip to content

Commit

Permalink
libceph: Unlock unprocessed pages in start_read() error path
Browse files Browse the repository at this point in the history
Function start_read() can get an error before processing all pages.
It must not only release the remaining pages, but unlock them too.

This fixes http://tracker.newdream.net/issues/3370

Signed-off-by: David Zafman <david.zafman@inktank.com>
Reviewed-by: Alex Elder <elder@inktank.com>
  • Loading branch information
David Zafman authored and Alex Elder committed Dec 13, 2012
1 parent 0e5e177 commit 8884d53
Showing 1 changed file with 9 additions and 0 deletions.
9 changes: 9 additions & 0 deletions fs/ceph/addr.c
Original file line number Diff line number Diff line change
Expand Up @@ -267,6 +267,14 @@ static void finish_read(struct ceph_osd_request *req, struct ceph_msg *msg)
kfree(req->r_pages);
}

static void ceph_unlock_page_vector(struct page **pages, int num_pages)
{
int i;

for (i = 0; i < num_pages; i++)
unlock_page(pages[i]);
}

/*
* start an async read(ahead) operation. return nr_pages we submitted
* a read for on success, or negative error code.
Expand Down Expand Up @@ -347,6 +355,7 @@ static int start_read(struct inode *inode, struct list_head *page_list, int max)
return nr_pages;

out_pages:
ceph_unlock_page_vector(pages, nr_pages);
ceph_release_page_vector(pages, nr_pages);
out:
ceph_osdc_put_request(req);
Expand Down

0 comments on commit 8884d53

Please sign in to comment.