Commit 0d66a487 authored by Sage Weil's avatar Sage Weil

ceph: implement (optional) max read size

The 'rsize' mount option limits the maximum size of an individual
read(ahead) operation that is sent off to an OSD.  This is distinct from
'rasize', which controls the size of the readahead window.
Signed-off-by: default avatarSage Weil <sage@newdream.net>
parent 83817e35
...@@ -268,7 +268,7 @@ static void finish_read(struct ceph_osd_request *req, struct ceph_msg *msg) ...@@ -268,7 +268,7 @@ static void finish_read(struct ceph_osd_request *req, struct ceph_msg *msg)
* start an async read(ahead) operation. return nr_pages we submitted * start an async read(ahead) operation. return nr_pages we submitted
* a read for on success, or negative error code. * a read for on success, or negative error code.
*/ */
static int start_read(struct inode *inode, struct list_head *page_list) static int start_read(struct inode *inode, struct list_head *page_list, int max)
{ {
struct ceph_osd_client *osdc = struct ceph_osd_client *osdc =
&ceph_inode_to_client(inode)->client->osdc; &ceph_inode_to_client(inode)->client->osdc;
...@@ -292,6 +292,8 @@ static int start_read(struct inode *inode, struct list_head *page_list) ...@@ -292,6 +292,8 @@ static int start_read(struct inode *inode, struct list_head *page_list)
break; break;
nr_pages++; nr_pages++;
next_index++; next_index++;
if (max && nr_pages == max)
break;
} }
len = nr_pages << PAGE_CACHE_SHIFT; len = nr_pages << PAGE_CACHE_SHIFT;
dout("start_read %p nr_pages %d is %lld~%lld\n", inode, nr_pages, dout("start_read %p nr_pages %d is %lld~%lld\n", inode, nr_pages,
...@@ -358,11 +360,18 @@ static int ceph_readpages(struct file *file, struct address_space *mapping, ...@@ -358,11 +360,18 @@ static int ceph_readpages(struct file *file, struct address_space *mapping,
struct list_head *page_list, unsigned nr_pages) struct list_head *page_list, unsigned nr_pages)
{ {
struct inode *inode = file->f_dentry->d_inode; struct inode *inode = file->f_dentry->d_inode;
struct ceph_fs_client *fsc = ceph_inode_to_client(inode);
int rc = 0; int rc = 0;
int max = 0;
if (fsc->mount_options->rsize >= PAGE_CACHE_SIZE)
max = (fsc->mount_options->rsize + PAGE_CACHE_SIZE - 1)
>> PAGE_SHIFT;
dout("readpages %p file %p nr_pages %d\n", inode, file, nr_pages); dout("readpages %p file %p nr_pages %d max %d\n", inode, file, nr_pages,
max);
while (!list_empty(page_list)) { while (!list_empty(page_list)) {
rc = start_read(inode, page_list); rc = start_read(inode, page_list, max);
if (rc < 0) if (rc < 0)
goto out; goto out;
BUG_ON(rc == 0); BUG_ON(rc == 0);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment