/*
  * Copyright (C) 2010-2011 Neil Brown
- * Copyright (C) 2010-2011 Red Hat, Inc. All rights reserved.
+ * Copyright (C) 2010-2014 Red Hat, Inc. All rights reserved.
  *
  * This file is released under the GPL.
  */
        return 0;
 }
 
+/*
+ * Enable/disable discard support on RAID set depending on RAID level.
+ */
+static void configure_discard_support(struct dm_target *ti, struct raid_set *rs)
+{
+       /* Assume discards not supported until after checks below. */
+       ti->discards_supported = false;
+
+       /* RAID level 4,5,6 require discard_zeroes_data for data integrity! */
+       if (rs->md.level == 4 || rs->md.level == 5 || rs->md.level == 6)
+               return; /* discard_zeroes_data cannot be trusted as reliable */
+
+       ti->discards_supported = true;
+
+       /*
+        * RAID1 and RAID10 personalities require bio splitting,
+        */
+       ti->split_discard_bios = true;
+       ti->num_discard_bios = 1;
+}
+
 /*
  * Construct a RAID4/5/6 mapping:
  * Args:
        ti->private = rs;
        ti->num_flush_bios = 1;
 
+       /*
+        * Disable/enable discard support on RAID set.
+        */
+       configure_discard_support(ti, rs);
+
        mutex_lock(&rs->md.reconfig_mutex);
        ret = md_run(&rs->md);
        rs->md.in_sync = 0; /* Assume already marked dirty */
 
 static struct target_type raid_target = {
        .name = "raid",
-       .version = {1, 5, 2},
+       .version = {1, 6, 0},
        .module = THIS_MODULE,
        .ctr = raid_ctr,
        .dtr = raid_dtr,