Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge branch 'for-linus' of git://neil.brown.name/md

* 'for-linus' of git://neil.brown.name/md:
md: protect against NULL reference when waiting to start a raid10.
md: fix bug with re-adding of partially recovered device.
md: fix possible deadlock in handling flush requests.
md: move code in to submit_flushes.
md: remove handling of flush_pending in md_submit_flush_data

+21 -20
+20 -19
drivers/md/md.c
··· 371 371 bio_put(bio); 372 372 } 373 373 374 - static void submit_flushes(mddev_t *mddev) 374 + static void md_submit_flush_data(struct work_struct *ws); 375 + 376 + static void submit_flushes(struct work_struct *ws) 375 377 { 378 + mddev_t *mddev = container_of(ws, mddev_t, flush_work); 376 379 mdk_rdev_t *rdev; 377 380 381 + INIT_WORK(&mddev->flush_work, md_submit_flush_data); 382 + atomic_set(&mddev->flush_pending, 1); 378 383 rcu_read_lock(); 379 384 list_for_each_entry_rcu(rdev, &mddev->disks, same_set) 380 385 if (rdev->raid_disk >= 0 && ··· 402 397 rdev_dec_pending(rdev, mddev); 403 398 } 404 399 rcu_read_unlock(); 400 + if (atomic_dec_and_test(&mddev->flush_pending)) 401 + queue_work(md_wq, &mddev->flush_work); 405 402 } 406 403 407 404 static void md_submit_flush_data(struct work_struct *ws) 408 405 { 409 406 mddev_t *mddev = container_of(ws, mddev_t, flush_work); 410 407 struct bio *bio = mddev->flush_bio; 411 - 412 - atomic_set(&mddev->flush_pending, 1); 413 408 414 409 if (bio->bi_size == 0) 415 410 /* an empty barrier - all done */ ··· 419 414 if (mddev->pers->make_request(mddev, bio)) 420 415 generic_make_request(bio); 421 416 } 422 - if (atomic_dec_and_test(&mddev->flush_pending)) { 423 - mddev->flush_bio = NULL; 424 - wake_up(&mddev->sb_wait); 425 - } 417 + 418 + mddev->flush_bio = NULL; 419 + wake_up(&mddev->sb_wait); 426 420 } 427 421 428 422 void md_flush_request(mddev_t *mddev, struct bio *bio) ··· 433 429 mddev->flush_bio = bio; 434 430 spin_unlock_irq(&mddev->write_lock); 435 431 436 - atomic_set(&mddev->flush_pending, 1); 437 - INIT_WORK(&mddev->flush_work, md_submit_flush_data); 438 - 439 - submit_flushes(mddev); 440 - 441 - if (atomic_dec_and_test(&mddev->flush_pending)) 442 - queue_work(md_wq, &mddev->flush_work); 432 + INIT_WORK(&mddev->flush_work, submit_flushes); 433 + queue_work(md_wq, &mddev->flush_work); 443 434 } 444 435 EXPORT_SYMBOL(md_flush_request); 445 436 ··· 5159 5160 PTR_ERR(rdev)); 5160 5161 return PTR_ERR(rdev); 5161 5162 } 5162 - /* set save_raid_disk if appropriate */ 5163 + /* set saved_raid_disk if appropriate */ 5163 5164 if (!mddev->persistent) { 5164 5165 if (info->state & (1<<MD_DISK_SYNC) && 5165 5166 info->raid_disk < mddev->raid_disks) ··· 5169 5170 } else 5170 5171 super_types[mddev->major_version]. 5171 5172 validate_super(mddev, rdev); 5172 - rdev->saved_raid_disk = rdev->raid_disk; 5173 + if (test_bit(In_sync, &rdev->flags)) 5174 + rdev->saved_raid_disk = rdev->raid_disk; 5175 + else 5176 + rdev->saved_raid_disk = -1; 5173 5177 5174 5178 clear_bit(In_sync, &rdev->flags); /* just to be sure */ 5175 5179 if (info->state & (1<<MD_DISK_WRITEMOSTLY)) ··· 6044 6042 || kthread_should_stop(), 6045 6043 thread->timeout); 6046 6044 6047 - clear_bit(THREAD_WAKEUP, &thread->flags); 6048 - 6049 - thread->run(thread->mddev); 6045 + if (test_and_clear_bit(THREAD_WAKEUP, &thread->flags)) 6046 + thread->run(thread->mddev); 6050 6047 } 6051 6048 6052 6049 return 0;
+1 -1
drivers/md/raid10.c
··· 2397 2397 return 0; 2398 2398 2399 2399 out_free_conf: 2400 + md_unregister_thread(mddev->thread); 2400 2401 if (conf->r10bio_pool) 2401 2402 mempool_destroy(conf->r10bio_pool); 2402 2403 safe_put_page(conf->tmppage); 2403 2404 kfree(conf->mirrors); 2404 2405 kfree(conf); 2405 2406 mddev->private = NULL; 2406 - md_unregister_thread(mddev->thread); 2407 2407 out: 2408 2408 return -EIO; 2409 2409 }