PM / Hibernate: Replace bdget call with simple atomic_inc of i_count
Create bdgrab(). This function copies an existing reference to a block_device. It is safe to call from any context. Hibernation code wishes to copy a reference to the active swap device. Right now it calls bdget() under a spinlock, but this is wrong because bdget() can sleep. It doesn't need a full bdget() because we already hold a reference to active swap devices (and the spinlock protects against swapoff). Fixes http://bugzilla.kernel.org/show_bug.cgi?id=13827 Signed-off-by: Alan Jenkins <alan-jenkins@tuffmail.co.uk> Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
This commit is contained in:
committed by
Rafael J. Wysocki
parent
ec79be2687
commit
dddac6a7b4
@ -753,7 +753,7 @@ int swap_type_of(dev_t device, sector_t offset, struct block_device **bdev_p)
|
||||
|
||||
if (!bdev) {
|
||||
if (bdev_p)
|
||||
*bdev_p = bdget(sis->bdev->bd_dev);
|
||||
*bdev_p = bdgrab(sis->bdev);
|
||||
|
||||
spin_unlock(&swap_lock);
|
||||
return i;
|
||||
@ -765,7 +765,7 @@ int swap_type_of(dev_t device, sector_t offset, struct block_device **bdev_p)
|
||||
struct swap_extent, list);
|
||||
if (se->start_block == offset) {
|
||||
if (bdev_p)
|
||||
*bdev_p = bdget(sis->bdev->bd_dev);
|
||||
*bdev_p = bdgrab(sis->bdev);
|
||||
|
||||
spin_unlock(&swap_lock);
|
||||
bdput(bdev);
|
||||
|
Reference in New Issue
Block a user