Merge tag 'samsung-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/kgene...
[cascardo/linux.git] / net / ceph / pagelist.c
index 665cd23..c7c220a 100644 (file)
@@ -1,6 +1,6 @@
-
 #include <linux/module.h>
 #include <linux/gfp.h>
+#include <linux/slab.h>
 #include <linux/pagemap.h>
 #include <linux/highmem.h>
 #include <linux/ceph/pagelist.h>
@@ -14,8 +14,10 @@ static void ceph_pagelist_unmap_tail(struct ceph_pagelist *pl)
        }
 }
 
-int ceph_pagelist_release(struct ceph_pagelist *pl)
+void ceph_pagelist_release(struct ceph_pagelist *pl)
 {
+       if (!atomic_dec_and_test(&pl->refcnt))
+               return;
        ceph_pagelist_unmap_tail(pl);
        while (!list_empty(&pl->head)) {
                struct page *page = list_first_entry(&pl->head, struct page,
@@ -24,7 +26,7 @@ int ceph_pagelist_release(struct ceph_pagelist *pl)
                __free_page(page);
        }
        ceph_pagelist_free_reserve(pl);
-       return 0;
+       kfree(pl);
 }
 EXPORT_SYMBOL(ceph_pagelist_release);
 
@@ -134,8 +136,8 @@ int ceph_pagelist_truncate(struct ceph_pagelist *pl,
        ceph_pagelist_unmap_tail(pl);
        while (pl->head.prev != c->page_lru) {
                page = list_entry(pl->head.prev, struct page, lru);
-               list_del(&page->lru);                /* remove from pagelist */
-               list_add_tail(&page->lru, &pl->free_list); /* add to reserve */
+               /* move from pagelist to reserve */
+               list_move_tail(&page->lru, &pl->free_list);
                ++pl->num_pages_free;
        }
        pl->room = c->room;