aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/block/drbd/drbd_main.c
diff options
context:
space:
mode:
authorPhilipp Reisner <philipp.reisner@linbit.com>2011-06-27 05:51:46 -0400
committerPhilipp Reisner <philipp.reisner@linbit.com>2012-05-09 04:22:31 -0400
commite17117310b73ce6d2340ad46a539d3896a2d6de8 (patch)
tree66fed6cc939a402f70a51fdebb3b27f1f629b0ea /drivers/block/drbd/drbd_main.c
parentcc94c65015022e7329e80e057e20848581d3f2a5 (diff)
drbd: Replaced md_io_mutex by an atomic: md_io_in_use
The new function drbd_md_get_buffer() aborts waiting for the buffer in case the disk failes in the meantime. Signed-off-by: Philipp Reisner <philipp.reisner@linbit.com> Signed-off-by: Lars Ellenberg <lars.ellenberg@linbit.com>
Diffstat (limited to 'drivers/block/drbd/drbd_main.c')
-rw-r--r--drivers/block/drbd/drbd_main.c19
1 files changed, 12 insertions, 7 deletions
diff --git a/drivers/block/drbd/drbd_main.c b/drivers/block/drbd/drbd_main.c
index 16969c2b96cd..1b59ab3ab9c7 100644
--- a/drivers/block/drbd/drbd_main.c
+++ b/drivers/block/drbd/drbd_main.c
@@ -3043,8 +3043,8 @@ void drbd_init_set_defaults(struct drbd_conf *mdev)
3043 atomic_set(&mdev->rs_sect_in, 0); 3043 atomic_set(&mdev->rs_sect_in, 0);
3044 atomic_set(&mdev->rs_sect_ev, 0); 3044 atomic_set(&mdev->rs_sect_ev, 0);
3045 atomic_set(&mdev->ap_in_flight, 0); 3045 atomic_set(&mdev->ap_in_flight, 0);
3046 atomic_set(&mdev->md_io_in_use, 0);
3046 3047
3047 mutex_init(&mdev->md_io_mutex);
3048 mutex_init(&mdev->data.mutex); 3048 mutex_init(&mdev->data.mutex);
3049 mutex_init(&mdev->meta.mutex); 3049 mutex_init(&mdev->meta.mutex);
3050 sema_init(&mdev->data.work.s, 0); 3050 sema_init(&mdev->data.work.s, 0);
@@ -3722,8 +3722,10 @@ void drbd_md_sync(struct drbd_conf *mdev)
3722 if (!get_ldev_if_state(mdev, D_FAILED)) 3722 if (!get_ldev_if_state(mdev, D_FAILED))
3723 return; 3723 return;
3724 3724
3725 mutex_lock(&mdev->md_io_mutex); 3725 buffer = drbd_md_get_buffer(mdev);
3726 buffer = (struct meta_data_on_disk *)page_address(mdev->md_io_page); 3726 if (!buffer)
3727 goto out;
3728
3727 memset(buffer, 0, 512); 3729 memset(buffer, 0, 512);
3728 3730
3729 buffer->la_size = cpu_to_be64(drbd_get_capacity(mdev->this_bdev)); 3731 buffer->la_size = cpu_to_be64(drbd_get_capacity(mdev->this_bdev));
@@ -3754,7 +3756,8 @@ void drbd_md_sync(struct drbd_conf *mdev)
3754 * since we updated it on metadata. */ 3756 * since we updated it on metadata. */
3755 mdev->ldev->md.la_size_sect = drbd_get_capacity(mdev->this_bdev); 3757 mdev->ldev->md.la_size_sect = drbd_get_capacity(mdev->this_bdev);
3756 3758
3757 mutex_unlock(&mdev->md_io_mutex); 3759 drbd_md_put_buffer(mdev);
3760out:
3758 put_ldev(mdev); 3761 put_ldev(mdev);
3759} 3762}
3760 3763
@@ -3774,8 +3777,9 @@ int drbd_md_read(struct drbd_conf *mdev, struct drbd_backing_dev *bdev)
3774 if (!get_ldev_if_state(mdev, D_ATTACHING)) 3777 if (!get_ldev_if_state(mdev, D_ATTACHING))
3775 return ERR_IO_MD_DISK; 3778 return ERR_IO_MD_DISK;
3776 3779
3777 mutex_lock(&mdev->md_io_mutex); 3780 buffer = drbd_md_get_buffer(mdev);
3778 buffer = (struct meta_data_on_disk *)page_address(mdev->md_io_page); 3781 if (!buffer)
3782 goto out;
3779 3783
3780 if (!drbd_md_sync_page_io(mdev, bdev, bdev->md.md_offset, READ)) { 3784 if (!drbd_md_sync_page_io(mdev, bdev, bdev->md.md_offset, READ)) {
3781 /* NOTE: can't do normal error processing here as this is 3785 /* NOTE: can't do normal error processing here as this is
@@ -3836,7 +3840,8 @@ int drbd_md_read(struct drbd_conf *mdev, struct drbd_backing_dev *bdev)
3836 mdev->sync_conf.al_extents = 127; 3840 mdev->sync_conf.al_extents = 127;
3837 3841
3838 err: 3842 err:
3839 mutex_unlock(&mdev->md_io_mutex); 3843 drbd_md_put_buffer(mdev);
3844 out:
3840 put_ldev(mdev); 3845 put_ldev(mdev);
3841 3846
3842 return rv; 3847 return rv;