Merge branches 'release', 'bugzilla-12011', 'bugzilla-12632', 'misc' and 'suspend...
[linux-2.6-block.git] / mm / shmem.c
index adf5c3eedbc992decd43fb1601c89e4931603fb5..19d566ccdeeab8c6a1f0431602b3bd3dd5a76026 100644 (file)
@@ -929,11 +929,11 @@ found:
        if (!inode)
                goto out;
        /*
-        * Charge page using GFP_HIGHUSER_MOVABLE while we can wait.
-        * charged back to the user(not to caller) when swap account is used.
+        * 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_swapin(page,
-                       current->mm, GFP_HIGHUSER_MOVABLE, true);
+       error = mem_cgroup_cache_charge(page, current->mm, GFP_KERNEL);
        if (error)
                goto out;
        error = radix_tree_preload(GFP_KERNEL);
@@ -1270,16 +1270,6 @@ repeat:
                                goto repeat;
                        }
                        wait_on_page_locked(swappage);
-                       /*
-                        * We want to avoid charge at add_to_page_cache().
-                        * charge against this swap cache here.
-                        */
-                       if (mem_cgroup_cache_charge_swapin(swappage,
-                                               current->mm, gfp, false)) {
-                               page_cache_release(swappage);
-                               error = -ENOMEM;
-                               goto failed;
-                       }
                        page_cache_release(swappage);
                        goto repeat;
                }
@@ -1334,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) {
@@ -1393,7 +1387,7 @@ repeat:
 
                        /* Precharge page while we can wait, compensate after */
                        error = mem_cgroup_cache_charge(filepage, current->mm,
-                                       GFP_HIGHUSER_MOVABLE);
+                                       GFP_KERNEL);
                        if (error) {
                                page_cache_release(filepage);
                                shmem_unacct_blocks(info->flags, 1);
@@ -2634,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;