From: Philipp Reisner <philipp.reisner@linbit.com>
To: linux-kernel@vger.kernel.org, Jens Axboe <axboe@kernel.dk>
Cc: drbd-dev@lists.linbit.com
Subject: [PATCH 10/12] drbd: Fix the upper limit of resync-after
Date: Fri, 7 Oct 2011 13:27:43 +0200 [thread overview]
Message-ID: <1317986865-3706-11-git-send-email-philipp.reisner@linbit.com> (raw)
In-Reply-To: <1317986865-3706-1-git-send-email-philipp.reisner@linbit.com>
From: Andreas Gruenbacher <agruen@linbit.com>
The 32-bit resync_after netlink field takes a device minor number as
parameter, which is no longer limited to 255. We cannot statically
verify which device numbers are valid, so set the ummer limit to the
highest possible signed 32-bit integer.
Signed-off-by: Philipp Reisner <philipp.reisner@linbit.com>
Signed-off-by: Lars Ellenberg <lars.ellenberg@linbit.com>
---
drivers/block/drbd/drbd_int.h | 4 ++--
drivers/block/drbd/drbd_nl.c | 4 ++--
drivers/block/drbd/drbd_worker.c | 26 +++++++++++++-------------
include/linux/drbd.h | 4 ++--
include/linux/drbd_genl.h | 2 +-
include/linux/drbd_limits.h | 7 ++++---
6 files changed, 24 insertions(+), 23 deletions(-)
diff --git a/drivers/block/drbd/drbd_int.h b/drivers/block/drbd/drbd_int.h
index 8026ada..e167228 100644
--- a/drivers/block/drbd/drbd_int.h
+++ b/drivers/block/drbd/drbd_int.h
@@ -1408,8 +1408,8 @@ extern int drbd_khelper(struct drbd_conf *mdev, char *cmd);
/* drbd_worker.c */
extern int drbd_worker(struct drbd_thread *thi);
-enum drbd_ret_code drbd_sync_after_valid(struct drbd_conf *mdev, int o_minor);
-void drbd_sync_after_changed(struct drbd_conf *mdev);
+enum drbd_ret_code drbd_resync_after_valid(struct drbd_conf *mdev, int o_minor);
+void drbd_resync_after_changed(struct drbd_conf *mdev);
extern void drbd_start_resync(struct drbd_conf *mdev, enum drbd_conns side);
extern void resume_next_sg(struct drbd_conf *mdev);
extern void suspend_other_sg(struct drbd_conf *mdev);
diff --git a/drivers/block/drbd/drbd_nl.c b/drivers/block/drbd/drbd_nl.c
index 64de372..e67ce20 100644
--- a/drivers/block/drbd/drbd_nl.c
+++ b/drivers/block/drbd/drbd_nl.c
@@ -1219,10 +1219,10 @@ int drbd_adm_disk_opts(struct sk_buff *skb, struct genl_info *info)
}
write_lock_irq(&global_state_lock);
- retcode = drbd_sync_after_valid(mdev, new_disk_conf->resync_after);
+ retcode = drbd_resync_after_valid(mdev, new_disk_conf->resync_after);
if (retcode == NO_ERROR) {
rcu_assign_pointer(mdev->ldev->disk_conf, new_disk_conf);
- drbd_sync_after_changed(mdev);
+ drbd_resync_after_changed(mdev);
}
write_unlock_irq(&global_state_lock);
diff --git a/drivers/block/drbd/drbd_worker.c b/drivers/block/drbd/drbd_worker.c
index 46b5f7f..85bcab9 100644
--- a/drivers/block/drbd/drbd_worker.c
+++ b/drivers/block/drbd/drbd_worker.c
@@ -57,7 +57,7 @@ static int w_make_ov_request(struct drbd_work *w, int cancel);
/* About the global_state_lock
Each state transition on an device holds a read lock. In case we have
- to evaluate the sync after dependencies, we grab a write lock, because
+ to evaluate the resync after dependencies, we grab a write lock, because
we need stable states on all devices for that. */
rwlock_t global_state_lock;
@@ -1340,17 +1340,17 @@ int w_restart_disk_io(struct drbd_work *w, int cancel)
static int _drbd_may_sync_now(struct drbd_conf *mdev)
{
struct drbd_conf *odev = mdev;
- int ra;
+ int resync_after;
while (1) {
if (!odev->ldev)
return 1;
rcu_read_lock();
- ra = rcu_dereference(odev->ldev->disk_conf)->resync_after;
+ resync_after = rcu_dereference(odev->ldev->disk_conf)->resync_after;
rcu_read_unlock();
- if (ra == -1)
+ if (resync_after == -1)
return 1;
- odev = minor_to_mdev(ra);
+ odev = minor_to_mdev(resync_after);
if (!expect(odev))
return 1;
if ((odev->state.conn >= C_SYNC_SOURCE &&
@@ -1426,36 +1426,36 @@ void suspend_other_sg(struct drbd_conf *mdev)
}
/* caller must hold global_state_lock */
-enum drbd_ret_code drbd_sync_after_valid(struct drbd_conf *mdev, int o_minor)
+enum drbd_ret_code drbd_resync_after_valid(struct drbd_conf *mdev, int o_minor)
{
struct drbd_conf *odev;
- int ra;
+ int resync_after;
if (o_minor == -1)
return NO_ERROR;
if (o_minor < -1 || minor_to_mdev(o_minor) == NULL)
- return ERR_SYNC_AFTER;
+ return ERR_RESYNC_AFTER;
/* check for loops */
odev = minor_to_mdev(o_minor);
while (1) {
if (odev == mdev)
- return ERR_SYNC_AFTER_CYCLE;
+ return ERR_RESYNC_AFTER_CYCLE;
rcu_read_lock();
- ra = rcu_dereference(odev->ldev->disk_conf)->resync_after;
+ resync_after = rcu_dereference(odev->ldev->disk_conf)->resync_after;
rcu_read_unlock();
/* dependency chain ends here, no cycles. */
- if (ra == -1)
+ if (resync_after == -1)
return NO_ERROR;
/* follow the dependency chain */
- odev = minor_to_mdev(ra);
+ odev = minor_to_mdev(resync_after);
}
}
/* caller must hold global_state_lock */
-void drbd_sync_after_changed(struct drbd_conf *mdev)
+void drbd_resync_after_changed(struct drbd_conf *mdev)
{
int changes;
diff --git a/include/linux/drbd.h b/include/linux/drbd.h
index 6c7c85d..05063e6 100644
--- a/include/linux/drbd.h
+++ b/include/linux/drbd.h
@@ -130,8 +130,8 @@ enum drbd_ret_code {
ERR_INTR = 129, /* EINTR */
ERR_RESIZE_RESYNC = 130,
ERR_NO_PRIMARY = 131,
- ERR_SYNC_AFTER = 132,
- ERR_SYNC_AFTER_CYCLE = 133,
+ ERR_RESYNC_AFTER = 132,
+ ERR_RESYNC_AFTER_CYCLE = 133,
ERR_PAUSE_IS_SET = 134,
ERR_PAUSE_IS_CLEAR = 135,
ERR_PACKET_NR = 137,
diff --git a/include/linux/drbd_genl.h b/include/linux/drbd_genl.h
index 07b4f4a..40606ad 100644
--- a/include/linux/drbd_genl.h
+++ b/include/linux/drbd_genl.h
@@ -116,7 +116,7 @@ GENL_struct(DRBD_NLA_DISK_CONF, 3, disk_conf,
__u32_field_def(7, GENLA_F_MANDATORY, fencing, DRBD_FENCING_DEF)
__u32_field_def(8, GENLA_F_MANDATORY, resync_rate, DRBD_RESYNC_RATE_DEF)
- __u32_field_def(9, GENLA_F_MANDATORY, resync_after, DRBD_AFTER_DEF)
+ __u32_field_def(9, GENLA_F_MANDATORY, resync_after, DRBD_RESYNC_AFTER_DEF)
__u32_field_def(10, GENLA_F_MANDATORY, al_extents, DRBD_AL_EXTENTS_DEF)
__u32_field_def(11, GENLA_F_MANDATORY, c_plan_ahead, DRBD_C_PLAN_AHEAD_DEF)
__u32_field_def(12, GENLA_F_MANDATORY, c_delay_target, DRBD_C_DELAY_TARGET_DEF)
diff --git a/include/linux/drbd_limits.h b/include/linux/drbd_limits.h
index 27f5a13..62e93b2 100644
--- a/include/linux/drbd_limits.h
+++ b/include/linux/drbd_limits.h
@@ -111,9 +111,10 @@
#define DRBD_AL_EXTENTS_MAX 6433
#define DRBD_AL_EXTENTS_DEF 127
-#define DRBD_AFTER_MIN -1
-#define DRBD_AFTER_MAX 255
-#define DRBD_AFTER_DEF -1
+#define DRBD_RESYNC_AFTER_MIN -1
+#define DRBD_RESYNC_AFTER_MAX (1<<30)
+#define DRBD_RESYNC_AFTER_DEF -1
+#define DRBD_RESYNC_AFTER_SCALE '1'
/* } */
--
1.7.4.1
next prev parent reply other threads:[~2011-10-07 11:27 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-10-07 11:27 [RFC 00/12] drbd: part 16 of adding multiple volume support to drbd Philipp Reisner
2011-10-07 11:27 ` [PATCH 01/12] drbd: Refcounting for mdev objects Philipp Reisner
2011-10-07 11:27 ` [PATCH 02/12] drbd: Use RCU for the drbd_tconns list Philipp Reisner
2011-10-07 11:27 ` [PATCH 03/12] drbd: Removing drbd_cfg_rwsem Philipp Reisner
2011-10-07 11:27 ` [PATCH 04/12] drbd: Make broadcast events return NO_ERROR Philipp Reisner
2011-10-07 11:27 ` [PATCH 05/12] drbd: Also define the default values of boolean flags in a single place Philipp Reisner
2011-10-07 11:27 ` [PATCH 06/12] drbd: Rename the want_lose field/flag to discard_my_data Philipp Reisner
2011-10-07 11:27 ` [PATCH 07/12] drbd: skip spurious wait_event in drbd_al_begin_io Philipp Reisner
2011-10-07 11:27 ` [PATCH 08/12] drbd: Refer to resync-rate consistently throughout the code Philipp Reisner
2011-10-07 11:27 ` [PATCH 09/12] drbd: Refer to connect-int " Philipp Reisner
2011-10-07 11:27 ` Philipp Reisner [this message]
2011-10-07 11:27 ` [PATCH 11/12] drbd: Convert resync-after into a signed netlink field Philipp Reisner
2011-10-07 11:27 ` [PATCH 12/12] drbd: Rename DISK_SIZE_SECT -> DISK_SIZE Philipp Reisner
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1317986865-3706-11-git-send-email-philipp.reisner@linbit.com \
--to=philipp.reisner@linbit.com \
--cc=axboe@kernel.dk \
--cc=drbd-dev@lists.linbit.com \
--cc=linux-kernel@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®