diff options
author | Ingo Molnar <mingo@kernel.org> | 2016-09-15 02:24:53 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@kernel.org> | 2016-09-15 02:24:53 -0400 |
commit | d4b80afbba49e968623330f1336da8c724da8aad (patch) | |
tree | a9478bd77d8b001a6a7119328d34e9666d7bfe93 /drivers/md/bitmap.c | |
parent | fcd709ef20a9d83bdb7524d27cd6719dac8690a0 (diff) | |
parent | 4cea8776571b18db7485930cb422faa739580c8c (diff) |
Merge branch 'linus' into x86/asm, to pick up recent fixes
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Diffstat (limited to 'drivers/md/bitmap.c')
-rw-r--r-- | drivers/md/bitmap.c | 47 |
1 files changed, 33 insertions, 14 deletions
diff --git a/drivers/md/bitmap.c b/drivers/md/bitmap.c index 6fff794e0c72..13041ee37ad6 100644 --- a/drivers/md/bitmap.c +++ b/drivers/md/bitmap.c | |||
@@ -2183,19 +2183,29 @@ location_show(struct mddev *mddev, char *page) | |||
2183 | static ssize_t | 2183 | static ssize_t |
2184 | location_store(struct mddev *mddev, const char *buf, size_t len) | 2184 | location_store(struct mddev *mddev, const char *buf, size_t len) |
2185 | { | 2185 | { |
2186 | int rv; | ||
2186 | 2187 | ||
2188 | rv = mddev_lock(mddev); | ||
2189 | if (rv) | ||
2190 | return rv; | ||
2187 | if (mddev->pers) { | 2191 | if (mddev->pers) { |
2188 | if (!mddev->pers->quiesce) | 2192 | if (!mddev->pers->quiesce) { |
2189 | return -EBUSY; | 2193 | rv = -EBUSY; |
2190 | if (mddev->recovery || mddev->sync_thread) | 2194 | goto out; |
2191 | return -EBUSY; | 2195 | } |
2196 | if (mddev->recovery || mddev->sync_thread) { | ||
2197 | rv = -EBUSY; | ||
2198 | goto out; | ||
2199 | } | ||
2192 | } | 2200 | } |
2193 | 2201 | ||
2194 | if (mddev->bitmap || mddev->bitmap_info.file || | 2202 | if (mddev->bitmap || mddev->bitmap_info.file || |
2195 | mddev->bitmap_info.offset) { | 2203 | mddev->bitmap_info.offset) { |
2196 | /* bitmap already configured. Only option is to clear it */ | 2204 | /* bitmap already configured. Only option is to clear it */ |
2197 | if (strncmp(buf, "none", 4) != 0) | 2205 | if (strncmp(buf, "none", 4) != 0) { |
2198 | return -EBUSY; | 2206 | rv = -EBUSY; |
2207 | goto out; | ||
2208 | } | ||
2199 | if (mddev->pers) { | 2209 | if (mddev->pers) { |
2200 | mddev->pers->quiesce(mddev, 1); | 2210 | mddev->pers->quiesce(mddev, 1); |
2201 | bitmap_destroy(mddev); | 2211 | bitmap_destroy(mddev); |
@@ -2214,21 +2224,25 @@ location_store(struct mddev *mddev, const char *buf, size_t len) | |||
2214 | /* nothing to be done */; | 2224 | /* nothing to be done */; |
2215 | else if (strncmp(buf, "file:", 5) == 0) { | 2225 | else if (strncmp(buf, "file:", 5) == 0) { |
2216 | /* Not supported yet */ | 2226 | /* Not supported yet */ |
2217 | return -EINVAL; | 2227 | rv = -EINVAL; |
2228 | goto out; | ||
2218 | } else { | 2229 | } else { |
2219 | int rv; | ||
2220 | if (buf[0] == '+') | 2230 | if (buf[0] == '+') |
2221 | rv = kstrtoll(buf+1, 10, &offset); | 2231 | rv = kstrtoll(buf+1, 10, &offset); |
2222 | else | 2232 | else |
2223 | rv = kstrtoll(buf, 10, &offset); | 2233 | rv = kstrtoll(buf, 10, &offset); |
2224 | if (rv) | 2234 | if (rv) |
2225 | return rv; | 2235 | goto out; |
2226 | if (offset == 0) | 2236 | if (offset == 0) { |
2227 | return -EINVAL; | 2237 | rv = -EINVAL; |
2238 | goto out; | ||
2239 | } | ||
2228 | if (mddev->bitmap_info.external == 0 && | 2240 | if (mddev->bitmap_info.external == 0 && |
2229 | mddev->major_version == 0 && | 2241 | mddev->major_version == 0 && |
2230 | offset != mddev->bitmap_info.default_offset) | 2242 | offset != mddev->bitmap_info.default_offset) { |
2231 | return -EINVAL; | 2243 | rv = -EINVAL; |
2244 | goto out; | ||
2245 | } | ||
2232 | mddev->bitmap_info.offset = offset; | 2246 | mddev->bitmap_info.offset = offset; |
2233 | if (mddev->pers) { | 2247 | if (mddev->pers) { |
2234 | struct bitmap *bitmap; | 2248 | struct bitmap *bitmap; |
@@ -2245,7 +2259,7 @@ location_store(struct mddev *mddev, const char *buf, size_t len) | |||
2245 | mddev->pers->quiesce(mddev, 0); | 2259 | mddev->pers->quiesce(mddev, 0); |
2246 | if (rv) { | 2260 | if (rv) { |
2247 | bitmap_destroy(mddev); | 2261 | bitmap_destroy(mddev); |
2248 | return rv; | 2262 | goto out; |
2249 | } | 2263 | } |
2250 | } | 2264 | } |
2251 | } | 2265 | } |
@@ -2257,6 +2271,11 @@ location_store(struct mddev *mddev, const char *buf, size_t len) | |||
2257 | set_bit(MD_CHANGE_DEVS, &mddev->flags); | 2271 | set_bit(MD_CHANGE_DEVS, &mddev->flags); |
2258 | md_wakeup_thread(mddev->thread); | 2272 | md_wakeup_thread(mddev->thread); |
2259 | } | 2273 | } |
2274 | rv = 0; | ||
2275 | out: | ||
2276 | mddev_unlock(mddev); | ||
2277 | if (rv) | ||
2278 | return rv; | ||
2260 | return len; | 2279 | return len; |
2261 | } | 2280 | } |
2262 | 2281 | ||