Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8884d53d authored by David Zafman's avatar David Zafman Committed by Alex Elder
Browse files

libceph: Unlock unprocessed pages in start_read() error path

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: default avatarDavid Zafman <david.zafman@inktank.com>
Reviewed-by: default avatarAlex Elder <elder@inktank.com>
parent 0e5e1774
Loading
Loading
Loading
Loading
+9 −0
Original line number Diff line number Diff line
@@ -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.
@@ -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);