diff options
author | Philipp Reisner <philipp.reisner@linbit.com> | 2011-06-27 05:51:46 -0400 |
---|---|---|
committer | Philipp Reisner <philipp.reisner@linbit.com> | 2012-05-09 04:22:31 -0400 |
commit | e17117310b73ce6d2340ad46a539d3896a2d6de8 (patch) | |
tree | 66fed6cc939a402f70a51fdebb3b27f1f629b0ea /drivers/block/drbd/drbd_main.c | |
parent | cc94c65015022e7329e80e057e20848581d3f2a5 (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.c | 19 |
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); |
3760 | out: | ||
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; |