Updating shmem_get_policy to use the vma_policy if provided.
This is to allows us to safely provide shmem_vm_ops to the vma when the vm_file
has not been setup which is the case on the pseudo vmas.

Cc: Christoph Lameter <c...@linux.com>
Cc: Nick Piggin <npig...@gmail.com>
Cc: Hugh Dickins <hu...@google.com>
Cc: Lee Schermerhorn <lee.schermerh...@hp.com>
Cc: KOSAKI Motohiro <kosaki.motoh...@jp.fujitsu.com>
Cc: Rik van Riel <r...@redhat.com>
Signed-off-by: Nathan Zimmer <nzim...@sgi.com>
---
 mm/shmem.c |   18 +++++++++++++++---
 1 files changed, 15 insertions(+), 3 deletions(-)

diff --git a/mm/shmem.c b/mm/shmem.c
index a15a466..d073252 100644
--- a/mm/shmem.c
+++ b/mm/shmem.c
@@ -921,8 +921,11 @@ static struct page *shmem_swapin(swp_entry_t swap, gfp_t 
gfp,
        /* Create a pseudo vma that just contains the policy */
        pvma.vm_start = 0;
        pvma.vm_pgoff = index;
-       pvma.vm_ops = NULL;
        pvma.vm_policy = spol;
+       if (pvma.vm_policy)
+               pvma.vm_ops = &shmem_vm_ops;
+       else
+               pvma.vm_ops = NULL;
        return swapin_readahead(swap, gfp, &pvma, 0);
 }
 
@@ -934,8 +937,11 @@ static struct page *shmem_alloc_page(gfp_t gfp,
        /* Create a pseudo vma that just contains the policy */
        pvma.vm_start = 0;
        pvma.vm_pgoff = index;
-       pvma.vm_ops = NULL;
        pvma.vm_policy = mpol_shared_policy_lookup(&info->policy, index);
+       if (pvma.vm_policy)
+               pvma.vm_ops = &shmem_vm_ops;
+       else
+               pvma.vm_ops = NULL;
 
        /*
         * alloc_page_vma() will drop the shared policy reference
@@ -1296,8 +1302,14 @@ static int shmem_set_policy(struct vm_area_struct *vma, 
struct mempolicy *mpol)
 static struct mempolicy *shmem_get_policy(struct vm_area_struct *vma,
                                          unsigned long addr)
 {
-       struct inode *inode = vma->vm_file->f_path.dentry->d_inode;
        pgoff_t index;
+       struct inode *inode;
+
+       /* If the vma knows what policy it wants use that one. */
+       if (vma->vm_policy)
+               return vma->vm_policy;
+
+       inode = vma->vm_file->f_path.dentry->d_inode;
 
        index = ((addr - vma->vm_start) >> PAGE_SHIFT) + vma->vm_pgoff;
        return mpol_shared_policy_lookup(&SHMEM_I(inode)->policy, index);
-- 
1.6.0.2

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to