aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/block/drbd/drbd_main.c
diff options
context:
space:
mode:
authorPhilipp Reisner <philipp.reisner@linbit.com>2010-08-31 06:00:50 -0400
committerPhilipp Reisner <philipp.reisner@linbit.com>2010-10-14 12:38:26 -0400
commit0778286a133d2d3f81861a4e5db308e359583006 (patch)
tree14bdfe375481d8954ada1ddaa0bc84fcaba4e23d /drivers/block/drbd/drbd_main.c
parentd53733893dc43f4ebb5be510863c5debf0f8990b (diff)
drbd: Disable activity log updates when the whole device is out of sync
When the complete device is marked as out of sync, we can disable updates of the on disk AL. Currently AL updates are only disabled if one uses the "invalidate-remote" command on an unconnected, primary device, or when at attach time all bits in the bitmap are set. As of now, AL updated do not get disabled when a all bits becomes set due to application writes to an unconnected DRBD device. While this is a missing feature, it is not considered important, and might get added later. BTW, after initializing a "one legged" DRBD device drbdadm create-md resX drbdadm -- --force primary resX AL updates also get disabled, until the first connect. 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.c12
1 files changed, 12 insertions, 0 deletions
diff --git a/drivers/block/drbd/drbd_main.c b/drivers/block/drbd/drbd_main.c
index 71c4c261573e..23878ffc43c8 100644
--- a/drivers/block/drbd/drbd_main.c
+++ b/drivers/block/drbd/drbd_main.c
@@ -963,6 +963,12 @@ static void set_ov_position(struct drbd_conf *mdev, enum drbd_conns cs)
963 } 963 }
964} 964}
965 965
966static void drbd_resume_al(struct drbd_conf *mdev)
967{
968 if (test_and_clear_bit(AL_SUSPENDED, &mdev->flags))
969 dev_info(DEV, "Resumed AL updates\n");
970}
971
966/** 972/**
967 * __drbd_set_state() - Set a new DRBD state 973 * __drbd_set_state() - Set a new DRBD state
968 * @mdev: DRBD device. 974 * @mdev: DRBD device.
@@ -1160,6 +1166,10 @@ int __drbd_set_state(struct drbd_conf *mdev,
1160 ns.conn <= C_TEAR_DOWN && ns.conn >= C_TIMEOUT) 1166 ns.conn <= C_TEAR_DOWN && ns.conn >= C_TIMEOUT)
1161 drbd_thread_restart_nowait(&mdev->receiver); 1167 drbd_thread_restart_nowait(&mdev->receiver);
1162 1168
1169 /* Resume AL writing if we get a connection */
1170 if (os.conn < C_CONNECTED && ns.conn >= C_CONNECTED)
1171 drbd_resume_al(mdev);
1172
1163 ascw = kmalloc(sizeof(*ascw), GFP_ATOMIC); 1173 ascw = kmalloc(sizeof(*ascw), GFP_ATOMIC);
1164 if (ascw) { 1174 if (ascw) {
1165 ascw->os = os; 1175 ascw->os = os;
@@ -2851,6 +2861,7 @@ void drbd_mdev_cleanup(struct drbd_conf *mdev)
2851 } 2861 }
2852 2862
2853 drbd_free_resources(mdev); 2863 drbd_free_resources(mdev);
2864 clear_bit(AL_SUSPENDED, &mdev->flags);
2854 2865
2855 /* 2866 /*
2856 * currently we drbd_init_ee only on module load, so 2867 * currently we drbd_init_ee only on module load, so
@@ -3652,6 +3663,7 @@ int drbd_bmio_clear_n_write(struct drbd_conf *mdev)
3652{ 3663{
3653 int rv = -EIO; 3664 int rv = -EIO;
3654 3665
3666 drbd_resume_al(mdev);
3655 if (get_ldev_if_state(mdev, D_ATTACHING)) { 3667 if (get_ldev_if_state(mdev, D_ATTACHING)) {
3656 drbd_bm_clear_all(mdev); 3668 drbd_bm_clear_all(mdev);
3657 rv = drbd_bm_write(mdev); 3669 rv = drbd_bm_write(mdev);