aboutsummaryrefslogtreecommitdiffstats
path: root/fs/btrfs/volumes.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/btrfs/volumes.c')
-rw-r--r--fs/btrfs/volumes.c11
1 files changed, 9 insertions, 2 deletions
diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c
index fd0bedb07a64..bcd14ebccae1 100644
--- a/fs/btrfs/volumes.c
+++ b/fs/btrfs/volumes.c
@@ -154,6 +154,7 @@ static noinline int run_scheduled_bios(struct btrfs_device *device)
154loop: 154loop:
155 spin_lock(&device->io_lock); 155 spin_lock(&device->io_lock);
156 156
157loop_lock:
157 /* take all the bios off the list at once and process them 158 /* take all the bios off the list at once and process them
158 * later on (without the lock held). But, remember the 159 * later on (without the lock held). But, remember the
159 * tail and other pointers so the bios can be properly reinserted 160 * tail and other pointers so the bios can be properly reinserted
@@ -203,7 +204,7 @@ loop:
203 * is now congested. Back off and let other work structs 204 * is now congested. Back off and let other work structs
204 * run instead 205 * run instead
205 */ 206 */
206 if (pending && bdi_write_congested(bdi) && 207 if (pending && bdi_write_congested(bdi) && num_run > 16 &&
207 fs_info->fs_devices->open_devices > 1) { 208 fs_info->fs_devices->open_devices > 1) {
208 struct bio *old_head; 209 struct bio *old_head;
209 210
@@ -215,7 +216,8 @@ loop:
215 tail->bi_next = old_head; 216 tail->bi_next = old_head;
216 else 217 else
217 device->pending_bio_tail = tail; 218 device->pending_bio_tail = tail;
218 device->running_pending = 0; 219
220 device->running_pending = 1;
219 221
220 spin_unlock(&device->io_lock); 222 spin_unlock(&device->io_lock);
221 btrfs_requeue_work(&device->work); 223 btrfs_requeue_work(&device->work);
@@ -224,6 +226,11 @@ loop:
224 } 226 }
225 if (again) 227 if (again)
226 goto loop; 228 goto loop;
229
230 spin_lock(&device->io_lock);
231 if (device->pending_bios)
232 goto loop_lock;
233 spin_unlock(&device->io_lock);
227done: 234done:
228 return 0; 235 return 0;
229} 236}