]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
kclient: put_page O_DIRECT pages after read or write
authorSage Weil <sage@newdream.net>
Sun, 15 Mar 2009 21:15:30 +0000 (14:15 -0700)
committerSage Weil <sage@newdream.net>
Sun, 15 Mar 2009 21:15:30 +0000 (14:15 -0700)
We were leaking page refs.

src/TODO
src/kernel/file.c

index cda0f424a5bbbe4a68db4c8021ad93ea92e80da1..28486813d480fd1085bf8f053d7932eb6351d112 100644 (file)
--- 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
index 88548d88fd10e2e56756388bb436e90a7fd41f1e..2083573973ff62bf7a155f86fd2d6b73f1dea5cf 100644 (file)
@@ -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;