diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2014-10-03 11:40:37 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2014-10-03 11:40:37 -0400 |
| commit | ee042ec88022249b848306dd6e87ffd2fd88a839 (patch) | |
| tree | c730a6a460b8228094636e21088a9a6277a586a0 | |
| parent | 80ad99da8bd213e12b925407f1c97a303aa8f87f (diff) | |
| parent | 8e0e99ba64c7ba46133a7c8a3e3f7de01f23bd93 (diff) | |
Merge tag 'md/3.17-final-fix' of git://neil.brown.name/md
Pull raid5 discard fix from Neil Brown:
"One fix for raid5 discard issue"
* tag 'md/3.17-final-fix' of git://neil.brown.name/md:
md/raid5: disable 'DISCARD' by default due to safety concerns.
| -rw-r--r-- | drivers/md/raid5.c | 18 |
1 files changed, 17 insertions, 1 deletions
diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c index 183588b11fc1..9f0fbecd1eb5 100644 --- a/drivers/md/raid5.c +++ b/drivers/md/raid5.c | |||
| @@ -64,6 +64,10 @@ | |||
| 64 | #define cpu_to_group(cpu) cpu_to_node(cpu) | 64 | #define cpu_to_group(cpu) cpu_to_node(cpu) |
| 65 | #define ANY_GROUP NUMA_NO_NODE | 65 | #define ANY_GROUP NUMA_NO_NODE |
| 66 | 66 | ||
| 67 | static bool devices_handle_discard_safely = false; | ||
| 68 | module_param(devices_handle_discard_safely, bool, 0644); | ||
| 69 | MODULE_PARM_DESC(devices_handle_discard_safely, | ||
| 70 | "Set to Y if all devices in each array reliably return zeroes on reads from discarded regions"); | ||
| 67 | static struct workqueue_struct *raid5_wq; | 71 | static struct workqueue_struct *raid5_wq; |
| 68 | /* | 72 | /* |
| 69 | * Stripe cache | 73 | * Stripe cache |
| @@ -6208,7 +6212,7 @@ static int run(struct mddev *mddev) | |||
| 6208 | mddev->queue->limits.discard_granularity = stripe; | 6212 | mddev->queue->limits.discard_granularity = stripe; |
| 6209 | /* | 6213 | /* |
| 6210 | * unaligned part of discard request will be ignored, so can't | 6214 | * unaligned part of discard request will be ignored, so can't |
| 6211 | * guarantee discard_zerors_data | 6215 | * guarantee discard_zeroes_data |
| 6212 | */ | 6216 | */ |
| 6213 | mddev->queue->limits.discard_zeroes_data = 0; | 6217 | mddev->queue->limits.discard_zeroes_data = 0; |
| 6214 | 6218 | ||
| @@ -6233,6 +6237,18 @@ static int run(struct mddev *mddev) | |||
| 6233 | !bdev_get_queue(rdev->bdev)-> | 6237 | !bdev_get_queue(rdev->bdev)-> |
| 6234 | limits.discard_zeroes_data) | 6238 | limits.discard_zeroes_data) |
| 6235 | discard_supported = false; | 6239 | discard_supported = false; |
| 6240 | /* Unfortunately, discard_zeroes_data is not currently | ||
| 6241 | * a guarantee - just a hint. So we only allow DISCARD | ||
| 6242 | * if the sysadmin has confirmed that only safe devices | ||
| 6243 | * are in use by setting a module parameter. | ||
| 6244 | */ | ||
| 6245 | if (!devices_handle_discard_safely) { | ||
| 6246 | if (discard_supported) { | ||
| 6247 | pr_info("md/raid456: discard support disabled due to uncertainty.\n"); | ||
| 6248 | pr_info("Set raid456.devices_handle_discard_safely=Y to override.\n"); | ||
| 6249 | } | ||
| 6250 | discard_supported = false; | ||
| 6251 | } | ||
| 6236 | } | 6252 | } |
| 6237 | 6253 | ||
| 6238 | if (discard_supported && | 6254 | if (discard_supported && |
