aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/md/dm-mpath.c11
-rw-r--r--drivers/md/dm.c11
-rw-r--r--include/linux/device-mapper.h3
3 files changed, 23 insertions, 2 deletions
diff --git a/drivers/md/dm-mpath.c b/drivers/md/dm-mpath.c
index 075747e25f77..e08be94959fd 100644
--- a/drivers/md/dm-mpath.c
+++ b/drivers/md/dm-mpath.c
@@ -1299,8 +1299,17 @@ static int do_end_io(struct multipath *m, struct request *clone,
1299 if (!error && !clone->errors) 1299 if (!error && !clone->errors)
1300 return 0; /* I/O complete */ 1300 return 0; /* I/O complete */
1301 1301
1302 if (noretry_error(error)) 1302 if (noretry_error(error)) {
1303 if ((clone->cmd_flags & REQ_WRITE_SAME) &&
1304 !clone->q->limits.max_write_same_sectors) {
1305 struct queue_limits *limits;
1306
1307 /* device doesn't really support WRITE SAME, disable it */
1308 limits = dm_get_queue_limits(dm_table_get_md(m->ti->table));
1309 limits->max_write_same_sectors = 0;
1310 }
1303 return error; 1311 return error;
1312 }
1304 1313
1305 if (mpio->pgpath) 1314 if (mpio->pgpath)
1306 fail_path(mpio->pgpath); 1315 fail_path(mpio->pgpath);
diff --git a/drivers/md/dm.c b/drivers/md/dm.c
index 6a5e9ed2fcc3..7b0ccdc5d65c 100644
--- a/drivers/md/dm.c
+++ b/drivers/md/dm.c
@@ -2278,6 +2278,17 @@ struct target_type *dm_get_immutable_target_type(struct mapped_device *md)
2278} 2278}
2279 2279
2280/* 2280/*
2281 * The queue_limits are only valid as long as you have a reference
2282 * count on 'md'.
2283 */
2284struct queue_limits *dm_get_queue_limits(struct mapped_device *md)
2285{
2286 BUG_ON(!atomic_read(&md->holders));
2287 return &md->queue->limits;
2288}
2289EXPORT_SYMBOL_GPL(dm_get_queue_limits);
2290
2291/*
2281 * Fully initialize a request-based queue (->elevator, ->request_fn, etc). 2292 * Fully initialize a request-based queue (->elevator, ->request_fn, etc).
2282 */ 2293 */
2283static int dm_init_request_based_queue(struct mapped_device *md) 2294static int dm_init_request_based_queue(struct mapped_device *md)
diff --git a/include/linux/device-mapper.h b/include/linux/device-mapper.h
index 653073de09e3..ed419c62dde1 100644
--- a/include/linux/device-mapper.h
+++ b/include/linux/device-mapper.h
@@ -406,13 +406,14 @@ int dm_noflush_suspending(struct dm_target *ti);
406union map_info *dm_get_mapinfo(struct bio *bio); 406union map_info *dm_get_mapinfo(struct bio *bio);
407union map_info *dm_get_rq_mapinfo(struct request *rq); 407union map_info *dm_get_rq_mapinfo(struct request *rq);
408 408
409struct queue_limits *dm_get_queue_limits(struct mapped_device *md);
410
409/* 411/*
410 * Geometry functions. 412 * Geometry functions.
411 */ 413 */
412int dm_get_geometry(struct mapped_device *md, struct hd_geometry *geo); 414int dm_get_geometry(struct mapped_device *md, struct hd_geometry *geo);
413int dm_set_geometry(struct mapped_device *md, struct hd_geometry *geo); 415int dm_set_geometry(struct mapped_device *md, struct hd_geometry *geo);
414 416
415
416/*----------------------------------------------------------------- 417/*-----------------------------------------------------------------
417 * Functions for manipulating device-mapper tables. 418 * Functions for manipulating device-mapper tables.
418 *---------------------------------------------------------------*/ 419 *---------------------------------------------------------------*/