aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNeilBrown <neilb@suse.de>2014-12-14 20:56:59 -0500
committerNeilBrown <neilb@suse.de>2015-02-05 17:32:55 -0500
commitb7b17c9b67e5984210c83d50d2c8117d3bd50ea0 (patch)
tree072e63fa9cd1e1c314d9d99d0ae77d9e955d1a38
parent7b1485bab9c49b0d3811d72beb0de60c7b8b337d (diff)
md: remove mddev_lock() from md_attr_show()
Most attributes can be read safely without any locking. A race might lead to a slightly out-dated value, but nothing wrong. We already have locking in some places where needed. All that remains is can_clear_show(), behind_writes_used_show() and action_show() which are easily fixed. Signed-off-by: NeilBrown <neilb@suse.de>
-rw-r--r--drivers/md/bitmap.c13
-rw-r--r--drivers/md/md.c23
2 files changed, 20 insertions, 16 deletions
diff --git a/drivers/md/bitmap.c b/drivers/md/bitmap.c
index 3424b1915fc4..3a5767968ba0 100644
--- a/drivers/md/bitmap.c
+++ b/drivers/md/bitmap.c
@@ -2211,11 +2211,13 @@ __ATTR(metadata, S_IRUGO|S_IWUSR, metadata_show, metadata_store);
2211static ssize_t can_clear_show(struct mddev *mddev, char *page) 2211static ssize_t can_clear_show(struct mddev *mddev, char *page)
2212{ 2212{
2213 int len; 2213 int len;
2214 spin_lock(&mddev->lock);
2214 if (mddev->bitmap) 2215 if (mddev->bitmap)
2215 len = sprintf(page, "%s\n", (mddev->bitmap->need_sync ? 2216 len = sprintf(page, "%s\n", (mddev->bitmap->need_sync ?
2216 "false" : "true")); 2217 "false" : "true"));
2217 else 2218 else
2218 len = sprintf(page, "\n"); 2219 len = sprintf(page, "\n");
2220 spin_unlock(&mddev->lock);
2219 return len; 2221 return len;
2220} 2222}
2221 2223
@@ -2240,10 +2242,15 @@ __ATTR(can_clear, S_IRUGO|S_IWUSR, can_clear_show, can_clear_store);
2240static ssize_t 2242static ssize_t
2241behind_writes_used_show(struct mddev *mddev, char *page) 2243behind_writes_used_show(struct mddev *mddev, char *page)
2242{ 2244{
2245 ssize_t ret;
2246 spin_lock(&mddev->lock);
2243 if (mddev->bitmap == NULL) 2247 if (mddev->bitmap == NULL)
2244 return sprintf(page, "0\n"); 2248 ret = sprintf(page, "0\n");
2245 return sprintf(page, "%lu\n", 2249 else
2246 mddev->bitmap->behind_writes_used); 2250 ret = sprintf(page, "%lu\n",
2251 mddev->bitmap->behind_writes_used);
2252 spin_unlock(&mddev->lock);
2253 return ret;
2247} 2254}
2248 2255
2249static ssize_t 2256static ssize_t
diff --git a/drivers/md/md.c b/drivers/md/md.c
index eb0c3b576d7d..dbbe5e6df24c 100644
--- a/drivers/md/md.c
+++ b/drivers/md/md.c
@@ -4042,20 +4042,21 @@ static ssize_t
4042action_show(struct mddev *mddev, char *page) 4042action_show(struct mddev *mddev, char *page)
4043{ 4043{
4044 char *type = "idle"; 4044 char *type = "idle";
4045 if (test_bit(MD_RECOVERY_FROZEN, &mddev->recovery)) 4045 unsigned long recovery = mddev->recovery;
4046 if (test_bit(MD_RECOVERY_FROZEN, &recovery))
4046 type = "frozen"; 4047 type = "frozen";
4047 else if (test_bit(MD_RECOVERY_RUNNING, &mddev->recovery) || 4048 else if (test_bit(MD_RECOVERY_RUNNING, &recovery) ||
4048 (!mddev->ro && test_bit(MD_RECOVERY_NEEDED, &mddev->recovery))) { 4049 (!mddev->ro && test_bit(MD_RECOVERY_NEEDED, &recovery))) {
4049 if (test_bit(MD_RECOVERY_RESHAPE, &mddev->recovery)) 4050 if (test_bit(MD_RECOVERY_RESHAPE, &recovery))
4050 type = "reshape"; 4051 type = "reshape";
4051 else if (test_bit(MD_RECOVERY_SYNC, &mddev->recovery)) { 4052 else if (test_bit(MD_RECOVERY_SYNC, &recovery)) {
4052 if (!test_bit(MD_RECOVERY_REQUESTED, &mddev->recovery)) 4053 if (!test_bit(MD_RECOVERY_REQUESTED, &recovery))
4053 type = "resync"; 4054 type = "resync";
4054 else if (test_bit(MD_RECOVERY_CHECK, &mddev->recovery)) 4055 else if (test_bit(MD_RECOVERY_CHECK, &recovery))
4055 type = "check"; 4056 type = "check";
4056 else 4057 else
4057 type = "repair"; 4058 type = "repair";
4058 } else if (test_bit(MD_RECOVERY_RECOVER, &mddev->recovery)) 4059 } else if (test_bit(MD_RECOVERY_RECOVER, &recovery))
4059 type = "recover"; 4060 type = "recover";
4060 } 4061 }
4061 return sprintf(page, "%s\n", type); 4062 return sprintf(page, "%s\n", type);
@@ -4572,11 +4573,7 @@ md_attr_show(struct kobject *kobj, struct attribute *attr, char *page)
4572 mddev_get(mddev); 4573 mddev_get(mddev);
4573 spin_unlock(&all_mddevs_lock); 4574 spin_unlock(&all_mddevs_lock);
4574 4575
4575 rv = mddev_lock(mddev); 4576 rv = entry->show(mddev, page);
4576 if (!rv) {
4577 rv = entry->show(mddev, page);
4578 mddev_unlock(mddev);
4579 }
4580 mddev_put(mddev); 4577 mddev_put(mddev);
4581 return rv; 4578 return rv;
4582} 4579}