forked from Minki/linux
ceph: use __page_cache_alloc and add_to_page_cache_lru
Following Nick Piggin patches in btrfs, pagecache pages should be allocated with __page_cache_alloc, so they obey pagecache memory policies. Also, using add_to_page_cache_lru instead of using a private pagevec where applicable. Signed-off-by: Yehuda Sadeh <yehuda@hq.newdream.net> Signed-off-by: Sage Weil <sage@newdream.net>
This commit is contained in:
parent
f553069e5d
commit
31459fe4b2
@ -274,7 +274,6 @@ static int ceph_readpages(struct file *file, struct address_space *mapping,
|
|||||||
struct ceph_osd_client *osdc = &ceph_inode_to_client(inode)->osdc;
|
struct ceph_osd_client *osdc = &ceph_inode_to_client(inode)->osdc;
|
||||||
int rc = 0;
|
int rc = 0;
|
||||||
struct page **pages;
|
struct page **pages;
|
||||||
struct pagevec pvec;
|
|
||||||
loff_t offset;
|
loff_t offset;
|
||||||
u64 len;
|
u64 len;
|
||||||
|
|
||||||
@ -297,8 +296,6 @@ static int ceph_readpages(struct file *file, struct address_space *mapping,
|
|||||||
if (rc < 0)
|
if (rc < 0)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
/* set uptodate and add to lru in pagevec-sized chunks */
|
|
||||||
pagevec_init(&pvec, 0);
|
|
||||||
for (; !list_empty(page_list) && len > 0;
|
for (; !list_empty(page_list) && len > 0;
|
||||||
rc -= PAGE_CACHE_SIZE, len -= PAGE_CACHE_SIZE) {
|
rc -= PAGE_CACHE_SIZE, len -= PAGE_CACHE_SIZE) {
|
||||||
struct page *page =
|
struct page *page =
|
||||||
@ -312,7 +309,7 @@ static int ceph_readpages(struct file *file, struct address_space *mapping,
|
|||||||
zero_user_segment(page, s, PAGE_CACHE_SIZE);
|
zero_user_segment(page, s, PAGE_CACHE_SIZE);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (add_to_page_cache(page, mapping, page->index, GFP_NOFS)) {
|
if (add_to_page_cache_lru(page, mapping, page->index, GFP_NOFS)) {
|
||||||
page_cache_release(page);
|
page_cache_release(page);
|
||||||
dout("readpages %p add_to_page_cache failed %p\n",
|
dout("readpages %p add_to_page_cache failed %p\n",
|
||||||
inode, page);
|
inode, page);
|
||||||
@ -323,10 +320,8 @@ static int ceph_readpages(struct file *file, struct address_space *mapping,
|
|||||||
flush_dcache_page(page);
|
flush_dcache_page(page);
|
||||||
SetPageUptodate(page);
|
SetPageUptodate(page);
|
||||||
unlock_page(page);
|
unlock_page(page);
|
||||||
if (pagevec_add(&pvec, page) == 0)
|
page_cache_release(page);
|
||||||
pagevec_lru_add_file(&pvec); /* add to lru */
|
|
||||||
}
|
}
|
||||||
pagevec_lru_add_file(&pvec);
|
|
||||||
rc = 0;
|
rc = 0;
|
||||||
|
|
||||||
out:
|
out:
|
||||||
|
@ -326,7 +326,7 @@ static struct page **alloc_page_vector(int num_pages)
|
|||||||
if (!pages)
|
if (!pages)
|
||||||
return ERR_PTR(-ENOMEM);
|
return ERR_PTR(-ENOMEM);
|
||||||
for (i = 0; i < num_pages; i++) {
|
for (i = 0; i < num_pages; i++) {
|
||||||
pages[i] = alloc_page(GFP_NOFS);
|
pages[i] = __page_cache_alloc(GFP_NOFS);
|
||||||
if (pages[i] == NULL) {
|
if (pages[i] == NULL) {
|
||||||
ceph_release_page_vector(pages, i);
|
ceph_release_page_vector(pages, i);
|
||||||
return ERR_PTR(-ENOMEM);
|
return ERR_PTR(-ENOMEM);
|
||||||
|
@ -1947,7 +1947,7 @@ struct ceph_messenger *ceph_messenger_create(struct ceph_entity_addr *myaddr)
|
|||||||
|
|
||||||
/* the zero page is needed if a request is "canceled" while the message
|
/* the zero page is needed if a request is "canceled" while the message
|
||||||
* is being written over the socket */
|
* is being written over the socket */
|
||||||
msgr->zero_page = alloc_page(GFP_KERNEL | __GFP_ZERO);
|
msgr->zero_page = __page_cache_alloc(GFP_KERNEL | __GFP_ZERO);
|
||||||
if (!msgr->zero_page) {
|
if (!msgr->zero_page) {
|
||||||
kfree(msgr);
|
kfree(msgr);
|
||||||
return ERR_PTR(-ENOMEM);
|
return ERR_PTR(-ENOMEM);
|
||||||
|
@ -20,7 +20,7 @@ int ceph_pagelist_release(struct ceph_pagelist *pl)
|
|||||||
|
|
||||||
static int ceph_pagelist_addpage(struct ceph_pagelist *pl)
|
static int ceph_pagelist_addpage(struct ceph_pagelist *pl)
|
||||||
{
|
{
|
||||||
struct page *page = alloc_page(GFP_NOFS);
|
struct page *page = __page_cache_alloc(GFP_NOFS);
|
||||||
if (!page)
|
if (!page)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
pl->room += PAGE_SIZE;
|
pl->room += PAGE_SIZE;
|
||||||
|
@ -641,7 +641,7 @@ static int ceph_sync_setxattr(struct dentry *dentry, const char *name,
|
|||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
err = -ENOMEM;
|
err = -ENOMEM;
|
||||||
for (i = 0; i < nr_pages; i++) {
|
for (i = 0; i < nr_pages; i++) {
|
||||||
pages[i] = alloc_page(GFP_NOFS);
|
pages[i] = __page_cache_alloc(GFP_NOFS);
|
||||||
if (!pages[i]) {
|
if (!pages[i]) {
|
||||||
nr_pages = i;
|
nr_pages = i;
|
||||||
goto out;
|
goto out;
|
||||||
|
Loading…
Reference in New Issue
Block a user