X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=fs%2Fbuffer.c;h=3b6d701073e7f09a311f10297a58d8c06e715df5;hb=8454aeef6fea944ced757ff8e761b59eb3ee960f;hp=3660dcb975912d5a831a7940192df8f53354024d;hpb=6fa0cb1141da80eed4f86155fb51931bc1c31888;p=~andy%2Flinux diff --git a/fs/buffer.c b/fs/buffer.c index 3660dcb9759..3b6d701073e 100644 --- a/fs/buffer.c +++ b/fs/buffer.c @@ -470,13 +470,18 @@ out: pass does the actual I/O. */ void invalidate_bdev(struct block_device *bdev, int destroy_dirty_buffers) { + struct address_space *mapping = bdev->bd_inode->i_mapping; + + if (mapping->nrpages == 0) + return; + invalidate_bh_lrus(); /* * FIXME: what about destroy_dirty_buffers? * We really want to use invalidate_inode_pages2() for * that, but not until that's cleaned up. */ - invalidate_inode_pages(bdev->bd_inode->i_mapping); + invalidate_inode_pages(mapping); } /* @@ -2982,6 +2987,7 @@ int try_to_free_buffers(struct page *page) spin_lock(&mapping->private_lock); ret = drop_buffers(page, &buffers_to_free); + spin_unlock(&mapping->private_lock); if (ret) { /* * If the filesystem writes its buffers by hand (eg ext3) @@ -2993,7 +2999,6 @@ int try_to_free_buffers(struct page *page) */ clear_page_dirty(page); } - spin_unlock(&mapping->private_lock); out: if (buffers_to_free) { struct buffer_head *bh = buffers_to_free;