diff options
| author | Chris Mason <chris.mason@oracle.com> | 2008-04-22 09:22:11 -0400 |
|---|---|---|
| committer | Chris Mason <chris.mason@oracle.com> | 2008-09-25 11:04:02 -0400 |
| commit | 38b669880df44cba24ab1b01715b87318d469217 (patch) | |
| tree | 8141fbc479cbed2eb608bee04ab85846aee435a6 | |
| parent | b30757178dad19a0388d958ff9eea66e674d39ed (diff) | |
Deal with page == NULL in the btrfs_unplug_io_fn
Signed-off-by: Chris Mason <chris.mason@oracle.com>
| -rw-r--r-- | fs/btrfs/disk-io.c | 32 |
1 files changed, 30 insertions, 2 deletions
diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c index 7f5aca35494..19c258d2c7e 100644 --- a/fs/btrfs/disk-io.c +++ b/fs/btrfs/disk-io.c | |||
| @@ -911,12 +911,40 @@ static int btrfs_congested_fn(void *congested_data, int bdi_bits) | |||
| 911 | return ret; | 911 | return ret; |
| 912 | } | 912 | } |
| 913 | 913 | ||
| 914 | /* | ||
| 915 | * this unplugs every device on the box, and it is only used when page | ||
| 916 | * is null | ||
| 917 | */ | ||
| 918 | static void __unplug_io_fn(struct backing_dev_info *bdi, struct page *page) | ||
| 919 | { | ||
| 920 | struct list_head *cur; | ||
| 921 | struct btrfs_device *device; | ||
| 922 | struct btrfs_fs_info *info; | ||
| 923 | |||
| 924 | info = (struct btrfs_fs_info *)bdi->unplug_io_data; | ||
| 925 | list_for_each(cur, &info->fs_devices->devices) { | ||
| 926 | device = list_entry(cur, struct btrfs_device, dev_list); | ||
| 927 | bdi = blk_get_backing_dev_info(device->bdev); | ||
| 928 | if (bdi->unplug_io_fn) { | ||
| 929 | bdi->unplug_io_fn(bdi, page); | ||
| 930 | } | ||
| 931 | } | ||
| 932 | } | ||
| 933 | |||
| 914 | void btrfs_unplug_io_fn(struct backing_dev_info *bdi, struct page *page) | 934 | void btrfs_unplug_io_fn(struct backing_dev_info *bdi, struct page *page) |
| 915 | { | 935 | { |
| 916 | struct inode *inode = page->mapping->host; | 936 | struct inode *inode; |
| 917 | struct extent_map_tree *em_tree; | 937 | struct extent_map_tree *em_tree; |
| 918 | struct extent_map *em; | 938 | struct extent_map *em; |
| 919 | u64 offset = page_offset(page); | 939 | u64 offset; |
| 940 | |||
| 941 | if (!page) { | ||
| 942 | __unplug_io_fn(bdi, page); | ||
| 943 | return; | ||
| 944 | } | ||
| 945 | |||
| 946 | inode = page->mapping->host; | ||
| 947 | offset = page_offset(page); | ||
| 920 | 948 | ||
| 921 | em_tree = &BTRFS_I(inode)->extent_tree; | 949 | em_tree = &BTRFS_I(inode)->extent_tree; |
| 922 | spin_lock(&em_tree->lock); | 950 | spin_lock(&em_tree->lock); |
