From: Sage Weil Date: Sun, 15 Mar 2009 21:15:30 +0000 (-0700) Subject: kclient: put_page O_DIRECT pages after read or write X-Git-Tag: v0.7.1^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=aa1289ba844dba08a0d81130b777436f51627d2e;p=ceph.git kclient: put_page O_DIRECT pages after read or write We were leaking page refs. --- diff --git a/src/TODO b/src/TODO index cda0f424a5bbb..28486813d480f 100644 --- a/src/TODO +++ b/src/TODO @@ -53,7 +53,6 @@ repair kernel client -- should O_DIRECT invalidate the page cache? - inotify for updates from other clients? - optional or no fill_trace? - flock, fnctl locks diff --git a/src/kernel/file.c b/src/kernel/file.c index 88548d88fd10e..2083573973ff6 100644 --- a/src/kernel/file.c +++ b/src/kernel/file.c @@ -232,6 +232,15 @@ fail: return ERR_PTR(rc); } +static void put_page_vector(struct page **pages, int num_pages) +{ + int i; + + for (i = 0; i < num_pages; i++) + put_page(pages[i]); + kfree(pages); +} + static void release_page_vector(struct page **pages, int num_pages) { int i; @@ -388,7 +397,7 @@ more: } if (file->f_flags & O_DIRECT) - kfree(pages); + put_page_vector(pages, num_pages); else release_page_vector(pages, num_pages); return ret; @@ -489,7 +498,7 @@ more: out: if (file->f_flags & O_DIRECT) - kfree(pages); + put_page_vector(pages, num_pages); else release_page_vector(pages, num_pages); return ret;