diff options
-rw-r--r-- | drivers/md/md.c | 36 |
1 files changed, 14 insertions, 22 deletions
diff --git a/drivers/md/md.c b/drivers/md/md.c index dbbe5e6df24c..5438834bf54d 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c | |||
@@ -2419,40 +2419,41 @@ state_show(struct md_rdev *rdev, char *page) | |||
2419 | { | 2419 | { |
2420 | char *sep = ""; | 2420 | char *sep = ""; |
2421 | size_t len = 0; | 2421 | size_t len = 0; |
2422 | unsigned long flags = ACCESS_ONCE(rdev->flags); | ||
2422 | 2423 | ||
2423 | if (test_bit(Faulty, &rdev->flags) || | 2424 | if (test_bit(Faulty, &flags) || |
2424 | rdev->badblocks.unacked_exist) { | 2425 | rdev->badblocks.unacked_exist) { |
2425 | len+= sprintf(page+len, "%sfaulty",sep); | 2426 | len+= sprintf(page+len, "%sfaulty",sep); |
2426 | sep = ","; | 2427 | sep = ","; |
2427 | } | 2428 | } |
2428 | if (test_bit(In_sync, &rdev->flags)) { | 2429 | if (test_bit(In_sync, &flags)) { |
2429 | len += sprintf(page+len, "%sin_sync",sep); | 2430 | len += sprintf(page+len, "%sin_sync",sep); |
2430 | sep = ","; | 2431 | sep = ","; |
2431 | } | 2432 | } |
2432 | if (test_bit(WriteMostly, &rdev->flags)) { | 2433 | if (test_bit(WriteMostly, &flags)) { |
2433 | len += sprintf(page+len, "%swrite_mostly",sep); | 2434 | len += sprintf(page+len, "%swrite_mostly",sep); |
2434 | sep = ","; | 2435 | sep = ","; |
2435 | } | 2436 | } |
2436 | if (test_bit(Blocked, &rdev->flags) || | 2437 | if (test_bit(Blocked, &flags) || |
2437 | (rdev->badblocks.unacked_exist | 2438 | (rdev->badblocks.unacked_exist |
2438 | && !test_bit(Faulty, &rdev->flags))) { | 2439 | && !test_bit(Faulty, &flags))) { |
2439 | len += sprintf(page+len, "%sblocked", sep); | 2440 | len += sprintf(page+len, "%sblocked", sep); |
2440 | sep = ","; | 2441 | sep = ","; |
2441 | } | 2442 | } |
2442 | if (!test_bit(Faulty, &rdev->flags) && | 2443 | if (!test_bit(Faulty, &flags) && |
2443 | !test_bit(In_sync, &rdev->flags)) { | 2444 | !test_bit(In_sync, &flags)) { |
2444 | len += sprintf(page+len, "%sspare", sep); | 2445 | len += sprintf(page+len, "%sspare", sep); |
2445 | sep = ","; | 2446 | sep = ","; |
2446 | } | 2447 | } |
2447 | if (test_bit(WriteErrorSeen, &rdev->flags)) { | 2448 | if (test_bit(WriteErrorSeen, &flags)) { |
2448 | len += sprintf(page+len, "%swrite_error", sep); | 2449 | len += sprintf(page+len, "%swrite_error", sep); |
2449 | sep = ","; | 2450 | sep = ","; |
2450 | } | 2451 | } |
2451 | if (test_bit(WantReplacement, &rdev->flags)) { | 2452 | if (test_bit(WantReplacement, &flags)) { |
2452 | len += sprintf(page+len, "%swant_replacement", sep); | 2453 | len += sprintf(page+len, "%swant_replacement", sep); |
2453 | sep = ","; | 2454 | sep = ","; |
2454 | } | 2455 | } |
2455 | if (test_bit(Replacement, &rdev->flags)) { | 2456 | if (test_bit(Replacement, &flags)) { |
2456 | len += sprintf(page+len, "%sreplacement", sep); | 2457 | len += sprintf(page+len, "%sreplacement", sep); |
2457 | sep = ","; | 2458 | sep = ","; |
2458 | } | 2459 | } |
@@ -2965,21 +2966,12 @@ rdev_attr_show(struct kobject *kobj, struct attribute *attr, char *page) | |||
2965 | { | 2966 | { |
2966 | struct rdev_sysfs_entry *entry = container_of(attr, struct rdev_sysfs_entry, attr); | 2967 | struct rdev_sysfs_entry *entry = container_of(attr, struct rdev_sysfs_entry, attr); |
2967 | struct md_rdev *rdev = container_of(kobj, struct md_rdev, kobj); | 2968 | struct md_rdev *rdev = container_of(kobj, struct md_rdev, kobj); |
2968 | struct mddev *mddev = rdev->mddev; | ||
2969 | ssize_t rv; | ||
2970 | 2969 | ||
2971 | if (!entry->show) | 2970 | if (!entry->show) |
2972 | return -EIO; | 2971 | return -EIO; |
2973 | 2972 | if (!rdev->mddev) | |
2974 | rv = mddev ? mddev_lock(mddev) : -EBUSY; | 2973 | return -EBUSY; |
2975 | if (!rv) { | 2974 | return entry->show(rdev, page); |
2976 | if (rdev->mddev == NULL) | ||
2977 | rv = -EBUSY; | ||
2978 | else | ||
2979 | rv = entry->show(rdev, page); | ||
2980 | mddev_unlock(mddev); | ||
2981 | } | ||
2982 | return rv; | ||
2983 | } | 2975 | } |
2984 | 2976 | ||
2985 | static ssize_t | 2977 | static ssize_t |