struct address_space *mapping = inode->i_mapping;
        struct shmem_inode_info *info = SHMEM_I(inode);
        struct mm_struct *charge_mm = vma ? vma->vm_mm : current->mm;
-       struct page *page;
+       struct swap_info_struct *si;
+       struct page *page = NULL;
        swp_entry_t swap;
        int error;
 
        swap = radix_to_swp_entry(*pagep);
        *pagep = NULL;
 
+       /* Prevent swapoff from happening to us. */
+       si = get_swap_device(swap);
+       if (!si) {
+               error = EINVAL;
+               goto failed;
+       }
        /* Look it up and read it in.. */
        page = lookup_swap_cache(swap, NULL, 0);
        if (!page) {
        swap_free(swap);
 
        *pagep = page;
+       if (si)
+               put_swap_device(si);
        return 0;
 failed:
        if (!shmem_confirm_swap(mapping, index, swap))
                put_page(page);
        }
 
+       if (si)
+               put_swap_device(si);
+
        return error;
 }