Commit 9b4862ec authored by Jeff Layton's avatar Jeff Layton Committed by Ilya Dryomov
Browse files

ceph: fold ceph_sync_readpages into ceph_readpage

parent d45156bf
Loading
Loading
Loading
Loading
+25 −53
Original line number Diff line number Diff line
@@ -182,58 +182,15 @@ static int ceph_releasepage(struct page *page, gfp_t g)
	return !PagePrivate(page);
}

/*
 * Read some contiguous pages.  If we cross a stripe boundary, shorten
 * *plen.  Return number of bytes read, or error.
 */
static int ceph_sync_readpages(struct ceph_fs_client *fsc,
			       struct ceph_vino vino,
			       struct ceph_file_layout *layout,
			       u64 off, u64 *plen,
			       u32 truncate_seq, u64 truncate_size,
			       struct page **pages, int num_pages,
			       int page_align)
{
	struct ceph_osd_client *osdc = &fsc->client->osdc;
	struct ceph_osd_request *req;
	int rc = 0;

	dout("readpages on ino %llx.%llx on %llu~%llu\n", vino.ino,
	     vino.snap, off, *plen);
	req = ceph_osdc_new_request(osdc, layout, vino, off, plen, 0, 1,
				    CEPH_OSD_OP_READ, CEPH_OSD_FLAG_READ,
				    NULL, truncate_seq, truncate_size,
				    false);
	if (IS_ERR(req))
		return PTR_ERR(req);

	/* it may be a short read due to an object boundary */
	osd_req_op_extent_osd_data_pages(req, 0,
				pages, *plen, page_align, false, false);

	dout("readpages  final extent is %llu~%llu (%llu bytes align %d)\n",
	     off, *plen, *plen, page_align);

	rc = ceph_osdc_start_request(osdc, req, false);
	if (!rc)
		rc = ceph_osdc_wait_request(osdc, req);

	ceph_update_read_latency(&fsc->mdsc->metric, req->r_start_latency,
				 req->r_end_latency, rc);

	ceph_osdc_put_request(req);
	dout("readpages result %d\n", rc);
	return rc;
}

/*
 * read a single page, without unlocking it.
 */
/* read a single page, without unlocking it. */
static int ceph_do_readpage(struct file *filp, struct page *page)
{
	struct inode *inode = file_inode(filp);
	struct ceph_inode_info *ci = ceph_inode(inode);
	struct ceph_fs_client *fsc = ceph_inode_to_client(inode);
	struct ceph_osd_client *osdc = &fsc->client->osdc;
	struct ceph_osd_request *req;
	struct ceph_vino vino = ceph_vino(inode);
	int err = 0;
	u64 off = page_offset(page);
	u64 len = PAGE_SIZE;
@@ -260,12 +217,27 @@ static int ceph_do_readpage(struct file *filp, struct page *page)
	if (err == 0)
		return -EINPROGRESS;

	dout("readpage inode %p file %p page %p index %lu\n",
	     inode, filp, page, page->index);
	err = ceph_sync_readpages(fsc, ceph_vino(inode),
				  &ci->i_layout, off, &len,
	dout("readpage ino %llx.%llx file %p off %llu len %llu page %p index %lu\n",
	     vino.ino, vino.snap, filp, off, len, page, page->index);
	req = ceph_osdc_new_request(osdc, &ci->i_layout, vino, off, &len, 0, 1,
				    CEPH_OSD_OP_READ, CEPH_OSD_FLAG_READ, NULL,
				    ci->i_truncate_seq, ci->i_truncate_size,
				  &page, 1, 0);
				    false);
	if (IS_ERR(req))
		return PTR_ERR(req);

	osd_req_op_extent_osd_data_pages(req, 0, &page, len, 0, false, false);

	err = ceph_osdc_start_request(osdc, req, false);
	if (!err)
		err = ceph_osdc_wait_request(osdc, req);

	ceph_update_read_latency(&fsc->mdsc->metric, req->r_start_latency,
				 req->r_end_latency, err);

	ceph_osdc_put_request(req);
	dout("readpage result %d\n", err);

	if (err == -ENOENT)
		err = 0;
	if (err < 0) {