Merge tag 'for-linus' of git://git.kernel.org/pub/scm/virt/kvm/kvm
[linux-2.6-microblaze.git] / mm / swapfile.c
index 1e07d1c..22d10f7 100644 (file)
@@ -3130,6 +3130,7 @@ SYSCALL_DEFINE2(swapon, const char __user *, specialfile, int, swap_flags)
        struct filename *name;
        struct file *swap_file = NULL;
        struct address_space *mapping;
+       struct dentry *dentry;
        int prio;
        int error;
        union swap_header *swap_header;
@@ -3173,6 +3174,7 @@ SYSCALL_DEFINE2(swapon, const char __user *, specialfile, int, swap_flags)
 
        p->swap_file = swap_file;
        mapping = swap_file->f_mapping;
+       dentry = swap_file->f_path.dentry;
        inode = mapping->host;
 
        error = claim_swapfile(p, inode);
@@ -3180,6 +3182,10 @@ SYSCALL_DEFINE2(swapon, const char __user *, specialfile, int, swap_flags)
                goto bad_swap;
 
        inode_lock(inode);
+       if (d_unlinked(dentry) || cant_mount(dentry)) {
+               error = -ENOENT;
+               goto bad_swap_unlock_inode;
+       }
        if (IS_SWAPFILE(inode)) {
                error = -EBUSY;
                goto bad_swap_unlock_inode;
@@ -3773,7 +3779,7 @@ static void free_swap_count_continuations(struct swap_info_struct *si)
 }
 
 #if defined(CONFIG_MEMCG) && defined(CONFIG_BLK_CGROUP)
-void cgroup_throttle_swaprate(struct page *page, gfp_t gfp_mask)
+void __cgroup_throttle_swaprate(struct page *page, gfp_t gfp_mask)
 {
        struct swap_info_struct *si, *next;
        int nid = page_to_nid(page);