|
@@ -138,6 +138,7 @@ static struct linear_conf *linear_conf(struct mddev *mddev, int raid_disks)
|
|
|
struct linear_conf *conf;
|
|
|
struct md_rdev *rdev;
|
|
|
int i, cnt;
|
|
|
+ bool discard_supported = false;
|
|
|
|
|
|
conf = kzalloc (sizeof (*conf) + raid_disks*sizeof(struct dev_info),
|
|
|
GFP_KERNEL);
|
|
@@ -171,6 +172,8 @@ static struct linear_conf *linear_conf(struct mddev *mddev, int raid_disks)
|
|
|
conf->array_sectors += rdev->sectors;
|
|
|
cnt++;
|
|
|
|
|
|
+ if (blk_queue_discard(bdev_get_queue(rdev->bdev)))
|
|
|
+ discard_supported = true;
|
|
|
}
|
|
|
if (cnt != raid_disks) {
|
|
|
printk(KERN_ERR "md/linear:%s: not enough drives present. Aborting!\n",
|
|
@@ -178,6 +181,11 @@ static struct linear_conf *linear_conf(struct mddev *mddev, int raid_disks)
|
|
|
goto out;
|
|
|
}
|
|
|
|
|
|
+ if (!discard_supported)
|
|
|
+ queue_flag_clear_unlocked(QUEUE_FLAG_DISCARD, mddev->queue);
|
|
|
+ else
|
|
|
+ queue_flag_set_unlocked(QUEUE_FLAG_DISCARD, mddev->queue);
|
|
|
+
|
|
|
/*
|
|
|
* Here we calculate the device offsets.
|
|
|
*/
|
|
@@ -331,6 +339,14 @@ static void linear_make_request(struct mddev *mddev, struct bio *bio)
|
|
|
bio->bi_sector = bio->bi_sector - start_sector
|
|
|
+ tmp_dev->rdev->data_offset;
|
|
|
rcu_read_unlock();
|
|
|
+
|
|
|
+ if (unlikely((bio->bi_rw & REQ_DISCARD) &&
|
|
|
+ !blk_queue_discard(bdev_get_queue(bio->bi_bdev)))) {
|
|
|
+ /* Just ignore it */
|
|
|
+ bio_endio(bio, 0);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
generic_make_request(bio);
|
|
|
}
|
|
|
|