mm/memory_hotplug: update comment regarding zone shuffling
[linux-2.6-microblaze.git] / mm / swapfile.c
index 4951f53..c4a6136 100644 (file)
@@ -1184,7 +1184,6 @@ static struct swap_info_struct *_swap_info_get(swp_entry_t entry)
 
 bad_free:
        pr_err("swap_info_get: %s%08lx\n", Unused_offset, entry.val);
-       goto out;
 out:
        return NULL;
 }
@@ -1802,13 +1801,12 @@ int free_swap_and_cache(swp_entry_t entry)
  *
  * This is needed for the suspend to disk (aka swsusp).
  */
-int swap_type_of(dev_t device, sector_t offset, struct block_device **bdev_p)
+int swap_type_of(dev_t device, sector_t offset)
 {
-       struct block_device *bdev = NULL;
        int type;
 
-       if (device)
-               bdev = bdget(device);
+       if (!device)
+               return -1;
 
        spin_lock(&swap_lock);
        for (type = 0; type < nr_swapfiles; type++) {
@@ -1817,30 +1815,34 @@ int swap_type_of(dev_t device, sector_t offset, struct block_device **bdev_p)
                if (!(sis->flags & SWP_WRITEOK))
                        continue;
 
-               if (!bdev) {
-                       if (bdev_p)
-                               *bdev_p = bdgrab(sis->bdev);
-
-                       spin_unlock(&swap_lock);
-                       return type;
-               }
-               if (bdev == sis->bdev) {
+               if (device == sis->bdev->bd_dev) {
                        struct swap_extent *se = first_se(sis);
 
                        if (se->start_block == offset) {
-                               if (bdev_p)
-                                       *bdev_p = bdgrab(sis->bdev);
-
                                spin_unlock(&swap_lock);
-                               bdput(bdev);
                                return type;
                        }
                }
        }
        spin_unlock(&swap_lock);
-       if (bdev)
-               bdput(bdev);
+       return -ENODEV;
+}
+
+int find_first_swap(dev_t *device)
+{
+       int type;
+
+       spin_lock(&swap_lock);
+       for (type = 0; type < nr_swapfiles; type++) {
+               struct swap_info_struct *sis = swap_info[type];
 
+               if (!(sis->flags & SWP_WRITEOK))
+                       continue;
+               *device = sis->bdev->bd_dev;
+               spin_unlock(&swap_lock);
+               return type;
+       }
+       spin_unlock(&swap_lock);
        return -ENODEV;
 }
 
@@ -1926,11 +1928,6 @@ static int unuse_pte(struct vm_area_struct *vma, pmd_t *pmd,
                lru_cache_add_inactive_or_unevictable(page, vma);
        }
        swap_free(entry);
-       /*
-        * Move the page to the active list so it is not
-        * immediately swapped out again after swapon.
-        */
-       activate_page(page);
 out:
        pte_unmap_unlock(pte, ptl);
        if (page != swapcache) {
@@ -2434,7 +2431,7 @@ static int setup_swap_extents(struct swap_info_struct *sis, sector_t *span)
                if (ret >= 0)
                        sis->flags |= SWP_ACTIVATED;
                if (!ret) {
-                       sis->flags |= SWP_FS;
+                       sis->flags |= SWP_FS_OPS;
                        ret = add_swap_extent(sis, 0, sis->max, 0);
                        *span = sis->pages;
                }
@@ -2922,10 +2919,10 @@ static int claim_swapfile(struct swap_info_struct *p, struct inode *inode)
        int error;
 
        if (S_ISBLK(inode->i_mode)) {
-               p->bdev = bdgrab(I_BDEV(inode));
-               error = blkdev_get(p->bdev,
+               p->bdev = blkdev_get_by_dev(inode->i_rdev,
                                   FMODE_READ | FMODE_WRITE | FMODE_EXCL, p);
-               if (error < 0) {
+               if (IS_ERR(p->bdev)) {
+                       error = PTR_ERR(p->bdev);
                        p->bdev = NULL;
                        return error;
                }
@@ -3236,10 +3233,10 @@ SYSCALL_DEFINE2(swapon, const char __user *, specialfile, int, swap_flags)
                goto bad_swap_unlock_inode;
        }
 
-       if (bdi_cap_stable_pages_required(inode_to_bdi(inode)))
+       if (p->bdev && blk_queue_stable_writes(p->bdev->bd_disk->queue))
                p->flags |= SWP_STABLE_WRITES;
 
-       if (bdi_cap_synchronous_io(inode_to_bdi(inode)))
+       if (p->bdev && p->bdev->bd_disk->fops->rw_page)
                p->flags |= SWP_SYNCHRONOUS_IO;
 
        if (p->bdev && blk_queue_nonrot(bdev_get_queue(p->bdev))) {
@@ -3345,7 +3342,7 @@ SYSCALL_DEFINE2(swapon, const char __user *, specialfile, int, swap_flags)
        error = inode_drain_writes(inode);
        if (error) {
                inode->i_flags &= ~S_SWAPFILE;
-               goto bad_swap_unlock_inode;
+               goto free_swap_address_space;
        }
 
        mutex_lock(&swapon_mutex);
@@ -3370,6 +3367,8 @@ SYSCALL_DEFINE2(swapon, const char __user *, specialfile, int, swap_flags)
 
        error = 0;
        goto out;
+free_swap_address_space:
+       exit_swap_address_space(p->type);
 bad_swap_unlock_inode:
        inode_unlock(inode);
 bad_swap: