Merge branch 'for-2.6.39/core' of git://git.kernel.dk/linux-2.6-block
* 'for-2.6.39/core' of git://git.kernel.dk/linux-2.6-block: (65 commits) Documentation/iostats.txt: bit-size reference etc. cfq-iosched: removing unnecessary think time checking cfq-iosched: Don't clear queue stats when preempt. blk-throttle: Reset group slice when limits are changed blk-cgroup: Only give unaccounted_time under debug cfq-iosched: Don't set active queue in preempt block: fix non-atomic access to genhd inflight structures block: attempt to merge with existing requests on plug flush block: NULL dereference on error path in __blkdev_get() cfq-iosched: Don't update group weights when on service tree fs: assign sb->s_bdi to default_backing_dev_info if the bdi is going away block: Require subsystems to explicitly allocate bio_set integrity mempool jbd2: finish conversion from WRITE_SYNC_PLUG to WRITE_SYNC and explicit plugging jbd: finish conversion from WRITE_SYNC_PLUG to WRITE_SYNC and explicit plugging fs: make fsync_buffers_list() plug mm: make generic_writepages() use plugging blk-cgroup: Add unaccounted time to timeslice_used. block: fixup plugging stubs for !CONFIG_BLOCK block: remove obsolete comments for blkdev_issue_zeroout. blktrace: Use rq->cmd_flags directly in blk_add_trace_rq. ... Fix up conflicts in fs/{aio.c,super.c}
This commit is contained in:
@@ -94,39 +94,6 @@ __try_to_reclaim_swap(struct swap_info_struct *si, unsigned long offset)
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
* We need this because the bdev->unplug_fn can sleep and we cannot
|
||||
* hold swap_lock while calling the unplug_fn. And swap_lock
|
||||
* cannot be turned into a mutex.
|
||||
*/
|
||||
static DECLARE_RWSEM(swap_unplug_sem);
|
||||
|
||||
void swap_unplug_io_fn(struct backing_dev_info *unused_bdi, struct page *page)
|
||||
{
|
||||
swp_entry_t entry;
|
||||
|
||||
down_read(&swap_unplug_sem);
|
||||
entry.val = page_private(page);
|
||||
if (PageSwapCache(page)) {
|
||||
struct block_device *bdev = swap_info[swp_type(entry)]->bdev;
|
||||
struct backing_dev_info *bdi;
|
||||
|
||||
/*
|
||||
* If the page is removed from swapcache from under us (with a
|
||||
* racy try_to_unuse/swapoff) we need an additional reference
|
||||
* count to avoid reading garbage from page_private(page) above.
|
||||
* If the WARN_ON triggers during a swapoff it maybe the race
|
||||
* condition and it's harmless. However if it triggers without
|
||||
* swapoff it signals a problem.
|
||||
*/
|
||||
WARN_ON(page_count(page) <= 1);
|
||||
|
||||
bdi = bdev->bd_inode->i_mapping->backing_dev_info;
|
||||
blk_run_backing_dev(bdi, page);
|
||||
}
|
||||
up_read(&swap_unplug_sem);
|
||||
}
|
||||
|
||||
/*
|
||||
* swapon tell device that all the old swap contents can be discarded,
|
||||
* to allow the swap device to optimize its wear-levelling.
|
||||
@@ -1662,10 +1629,6 @@ SYSCALL_DEFINE1(swapoff, const char __user *, specialfile)
|
||||
goto out_dput;
|
||||
}
|
||||
|
||||
/* wait for any unplug function to finish */
|
||||
down_write(&swap_unplug_sem);
|
||||
up_write(&swap_unplug_sem);
|
||||
|
||||
destroy_swap_extents(p);
|
||||
if (p->flags & SWP_CONTINUED)
|
||||
free_swap_count_continuations(p);
|
||||
|
Reference in New Issue
Block a user