Commit b7b17c9b authored by NeilBrown's avatar NeilBrown

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: default avatarNeilBrown <neilb@suse.de>
parent 7b1485ba
...@@ -2211,11 +2211,13 @@ __ATTR(metadata, S_IRUGO|S_IWUSR, metadata_show, metadata_store); ...@@ -2211,11 +2211,13 @@ __ATTR(metadata, S_IRUGO|S_IWUSR, metadata_show, metadata_store);
static ssize_t can_clear_show(struct mddev *mddev, char *page) static ssize_t can_clear_show(struct mddev *mddev, char *page)
{ {
int len; int len;
spin_lock(&mddev->lock);
if (mddev->bitmap) if (mddev->bitmap)
len = sprintf(page, "%s\n", (mddev->bitmap->need_sync ? len = sprintf(page, "%s\n", (mddev->bitmap->need_sync ?
"false" : "true")); "false" : "true"));
else else
len = sprintf(page, "\n"); len = sprintf(page, "\n");
spin_unlock(&mddev->lock);
return len; return len;
} }
...@@ -2240,10 +2242,15 @@ __ATTR(can_clear, S_IRUGO|S_IWUSR, can_clear_show, can_clear_store); ...@@ -2240,10 +2242,15 @@ __ATTR(can_clear, S_IRUGO|S_IWUSR, can_clear_show, can_clear_store);
static ssize_t static ssize_t
behind_writes_used_show(struct mddev *mddev, char *page) behind_writes_used_show(struct mddev *mddev, char *page)
{ {
ssize_t ret;
spin_lock(&mddev->lock);
if (mddev->bitmap == NULL) if (mddev->bitmap == NULL)
return sprintf(page, "0\n"); ret = sprintf(page, "0\n");
return sprintf(page, "%lu\n", else
mddev->bitmap->behind_writes_used); ret = sprintf(page, "%lu\n",
mddev->bitmap->behind_writes_used);
spin_unlock(&mddev->lock);
return ret;
} }
static ssize_t static ssize_t
......
...@@ -4042,20 +4042,21 @@ static ssize_t ...@@ -4042,20 +4042,21 @@ static ssize_t
action_show(struct mddev *mddev, char *page) action_show(struct mddev *mddev, char *page)
{ {
char *type = "idle"; char *type = "idle";
if (test_bit(MD_RECOVERY_FROZEN, &mddev->recovery)) unsigned long recovery = mddev->recovery;
if (test_bit(MD_RECOVERY_FROZEN, &recovery))
type = "frozen"; type = "frozen";
else if (test_bit(MD_RECOVERY_RUNNING, &mddev->recovery) || else if (test_bit(MD_RECOVERY_RUNNING, &recovery) ||
(!mddev->ro && test_bit(MD_RECOVERY_NEEDED, &mddev->recovery))) { (!mddev->ro && test_bit(MD_RECOVERY_NEEDED, &recovery))) {
if (test_bit(MD_RECOVERY_RESHAPE, &mddev->recovery)) if (test_bit(MD_RECOVERY_RESHAPE, &recovery))
type = "reshape"; type = "reshape";
else if (test_bit(MD_RECOVERY_SYNC, &mddev->recovery)) { else if (test_bit(MD_RECOVERY_SYNC, &recovery)) {
if (!test_bit(MD_RECOVERY_REQUESTED, &mddev->recovery)) if (!test_bit(MD_RECOVERY_REQUESTED, &recovery))
type = "resync"; type = "resync";
else if (test_bit(MD_RECOVERY_CHECK, &mddev->recovery)) else if (test_bit(MD_RECOVERY_CHECK, &recovery))
type = "check"; type = "check";
else else
type = "repair"; type = "repair";
} else if (test_bit(MD_RECOVERY_RECOVER, &mddev->recovery)) } else if (test_bit(MD_RECOVERY_RECOVER, &recovery))
type = "recover"; type = "recover";
} }
return sprintf(page, "%s\n", type); return sprintf(page, "%s\n", type);
...@@ -4572,11 +4573,7 @@ md_attr_show(struct kobject *kobj, struct attribute *attr, char *page) ...@@ -4572,11 +4573,7 @@ md_attr_show(struct kobject *kobj, struct attribute *attr, char *page)
mddev_get(mddev); mddev_get(mddev);
spin_unlock(&all_mddevs_lock); spin_unlock(&all_mddevs_lock);
rv = mddev_lock(mddev); rv = entry->show(mddev, page);
if (!rv) {
rv = entry->show(mddev, page);
mddev_unlock(mddev);
}
mddev_put(mddev); mddev_put(mddev);
return rv; return rv;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment