md: linear supports TRIM
This makes md linear support TRIM. Signed-off-by: Shaohua Li <shli@fusionio.com> Signed-off-by: NeilBrown <neilb@suse.de>
This commit is contained in:
parent
bc78c57388
commit
f1cad2b68e
1 changed files with 16 additions and 0 deletions
|
@ -138,6 +138,7 @@ static struct linear_conf *linear_conf(struct mddev *mddev, int raid_disks)
|
||||||
struct linear_conf *conf;
|
struct linear_conf *conf;
|
||||||
struct md_rdev *rdev;
|
struct md_rdev *rdev;
|
||||||
int i, cnt;
|
int i, cnt;
|
||||||
|
bool discard_supported = false;
|
||||||
|
|
||||||
conf = kzalloc (sizeof (*conf) + raid_disks*sizeof(struct dev_info),
|
conf = kzalloc (sizeof (*conf) + raid_disks*sizeof(struct dev_info),
|
||||||
GFP_KERNEL);
|
GFP_KERNEL);
|
||||||
|
@ -171,6 +172,8 @@ static struct linear_conf *linear_conf(struct mddev *mddev, int raid_disks)
|
||||||
conf->array_sectors += rdev->sectors;
|
conf->array_sectors += rdev->sectors;
|
||||||
cnt++;
|
cnt++;
|
||||||
|
|
||||||
|
if (blk_queue_discard(bdev_get_queue(rdev->bdev)))
|
||||||
|
discard_supported = true;
|
||||||
}
|
}
|
||||||
if (cnt != raid_disks) {
|
if (cnt != raid_disks) {
|
||||||
printk(KERN_ERR "md/linear:%s: not enough drives present. Aborting!\n",
|
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;
|
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.
|
* 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
|
bio->bi_sector = bio->bi_sector - start_sector
|
||||||
+ tmp_dev->rdev->data_offset;
|
+ tmp_dev->rdev->data_offset;
|
||||||
rcu_read_unlock();
|
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);
|
generic_make_request(bio);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue