mm: Export symbol ksize()
[linux-2.6-block.git] / mm / shmem.c
index 5941f980136367c8e0bc28c39b80f2acadee54c2..19d566ccdeeab8c6a1f0431602b3bd3dd5a76026 100644 (file)
@@ -928,7 +928,11 @@ found:
        error = 1;
        if (!inode)
                goto out;
-       /* Precharge page using GFP_KERNEL while we can wait */
+       /*
+        * Charge page using GFP_KERNEL while we can wait.
+        * Charged back to the user(not to caller) when swap account is used.
+        * add_to_page_cache() will be called with GFP_NOWAIT.
+        */
        error = mem_cgroup_cache_charge(page, current->mm, GFP_KERNEL);
        if (error)
                goto out;
@@ -1320,15 +1324,19 @@ repeat:
                } else {
                        shmem_swp_unmap(entry);
                        spin_unlock(&info->lock);
-                       unlock_page(swappage);
-                       page_cache_release(swappage);
                        if (error == -ENOMEM) {
                                /* allow reclaim from this memory cgroup */
-                               error = mem_cgroup_shrink_usage(current->mm,
+                               error = mem_cgroup_shrink_usage(swappage,
+                                                               current->mm,
                                                                gfp);
-                               if (error)
+                               if (error) {
+                                       unlock_page(swappage);
+                                       page_cache_release(swappage);
                                        goto failed;
+                               }
                        }
+                       unlock_page(swappage);
+                       page_cache_release(swappage);
                        goto repeat;
                }
        } else if (sgp == SGP_READ && !filepage) {
@@ -1379,7 +1387,7 @@ repeat:
 
                        /* Precharge page while we can wait, compensate after */
                        error = mem_cgroup_cache_charge(filepage, current->mm,
-                                                       gfp & ~__GFP_HIGHMEM);
+                                       GFP_KERNEL);
                        if (error) {
                                page_cache_release(filepage);
                                shmem_unacct_blocks(info->flags, 1);
@@ -2620,7 +2628,7 @@ struct file *shmem_file_setup(char *name, loff_t size, unsigned long flags)
                goto close_file;
 
 #ifdef CONFIG_SHMEM
-       SHMEM_I(inode)->flags = flags & VM_ACCOUNT;
+       SHMEM_I(inode)->flags = (flags & VM_NORESERVE) ? 0 : VM_ACCOUNT;
 #endif
        d_instantiate(dentry, inode);
        inode->i_size = size;