Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 373409
b: refs/heads/master
c: 8848695
h: refs/heads/master
i:
  373407: b833c1b
v: v3
  • Loading branch information
Alex Elder authored and Sage Weil committed May 2, 2013
1 parent 79b3147 commit 1e5b772
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 28 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 94fe8420bf519acd641ecbd442a0a79c1a024212
refs/heads/master: 88486957f9fbf52ff4313ff52d583110a6503c28
45 changes: 18 additions & 27 deletions trunk/fs/ceph/addr.c
Original file line number Diff line number Diff line change
Expand Up @@ -631,29 +631,6 @@ static void writepages_finish(struct ceph_osd_request *req,
ceph_osdc_put_request(req);
}

/*
* allocate a page vec, either directly, or if necessary, via a the
* mempool. we avoid the mempool if we can because req->r_data_out.length
* may be less than the maximum write size.
*/
static void alloc_page_vec(struct ceph_fs_client *fsc,
struct ceph_osd_request *req)
{
size_t size;
int num_pages;

num_pages = calc_pages_for((u64)req->r_data_out.alignment,
(u64)req->r_data_out.length);
size = sizeof (struct page *) * num_pages;
req->r_data_out.pages = kmalloc(size, GFP_NOFS);
if (!req->r_data_out.pages) {
req->r_data_out.pages = mempool_alloc(fsc->wb_pagevec_pool,
GFP_NOFS);
req->r_data_out.pages_from_pool = 1;
WARN_ON(!req->r_data_out.pages);
}
}

static struct ceph_osd_request *
ceph_writepages_osd_request(struct inode *inode, u64 offset, u64 *len,
struct ceph_snap_context *snapc,
Expand Down Expand Up @@ -851,6 +828,9 @@ static int ceph_writepages_start(struct address_space *mapping,
if (locked_pages == 0) {
struct ceph_vino vino;
int num_ops = do_sync ? 2 : 1;
size_t size;
struct page **pages;
mempool_t *pool = NULL;

/* prepare async write request */
offset = (u64) page_offset(page);
Expand All @@ -870,13 +850,24 @@ static int ceph_writepages_start(struct address_space *mapping,
num_ops, ops, snapc, vino.snap,
&inode->i_mtime);

req->r_callback = writepages_finish;
req->r_inode = inode;

max_pages = calc_pages_for(0, (u64)len);
size = max_pages * sizeof (*pages);
pages = kmalloc(size, GFP_NOFS);
if (!pages) {
pool = fsc->wb_pagevec_pool;

pages = mempool_alloc(pool, GFP_NOFS);
WARN_ON(!pages);
}

req->r_data_out.pages = pages;
req->r_data_out.pages_from_pool = !!pool;
req->r_data_out.type = CEPH_OSD_DATA_TYPE_PAGES;
req->r_data_out.length = len;
req->r_data_out.alignment = 0;
max_pages = calc_pages_for(0, (u64)len);
alloc_page_vec(fsc, req);
req->r_callback = writepages_finish;
req->r_inode = inode;
}

/* note position of first page in pvec */
Expand Down

0 comments on commit 1e5b772

Please sign in to comment.