aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux/blkdev.h
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2014-10-18 14:53:51 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2014-10-18 14:53:51 -0400
commitd3dc366bbaf07c125561e90d6da4bb147741101a (patch)
tree6eb7e79a8ec9df1fa705393c6d15ccea3d104661 /include/linux/blkdev.h
parent511c41d9e6665a07aca94eb00983cf6d77dd87ff (diff)
parente19a8a0ad2d255316830ead05b59c5a704434cbb (diff)
Merge branch 'for-3.18/core' of git://git.kernel.dk/linux-block
Pull core block layer changes from Jens Axboe: "This is the core block IO pull request for 3.18. Apart from the new and improved flush machinery for blk-mq, this is all mostly bug fixes and cleanups. - blk-mq timeout updates and fixes from Christoph. - Removal of REQ_END, also from Christoph. We pass it through the ->queue_rq() hook for blk-mq instead, freeing up one of the request bits. The space was overly tight on 32-bit, so Martin also killed REQ_KERNEL since it's no longer used. - blk integrity updates and fixes from Martin and Gu Zheng. - Update to the flush machinery for blk-mq from Ming Lei. Now we have a per hardware context flush request, which both cleans up the code should scale better for flush intensive workloads on blk-mq. - Improve the error printing, from Rob Elliott. - Backing device improvements and cleanups from Tejun. - Fixup of a misplaced rq_complete() tracepoint from Hannes. - Make blk_get_request() return error pointers, fixing up issues where we NULL deref when a device goes bad or missing. From Joe Lawrence. - Prep work for drastically reducing the memory consumption of dm devices from Junichi Nomura. This allows creating clone bio sets without preallocating a lot of memory. - Fix a blk-mq hang on certain combinations of queue depths and hardware queues from me. - Limit memory consumption for blk-mq devices for crash dump scenarios and drivers that use crazy high depths (certain SCSI shared tag setups). We now just use a single queue and limited depth for that" * 'for-3.18/core' of git://git.kernel.dk/linux-block: (58 commits) block: Remove REQ_KERNEL blk-mq: allocate cpumask on the home node bio-integrity: remove the needless fail handle of bip_slab creating block: include func name in __get_request prints block: make blk_update_request print prefix match ratelimited prefix blk-merge: don't compute bi_phys_segments from bi_vcnt for cloned bio block: fix alignment_offset math that assumes io_min is a power-of-2 blk-mq: Make bt_clear_tag() easier to read blk-mq: fix potential hang if rolling wakeup depth is too high block: add bioset_create_nobvec() block: use bio_clone_fast() in blk_rq_prep_clone() block: misplaced rq_complete tracepoint sd: Honor block layer integrity handling flags block: Replace strnicmp with strncasecmp block: Add T10 Protection Information functions block: Don't merge requests if integrity flags differ block: Integrity checksum flag block: Relocate bio integrity flags block: Add a disk flag to block integrity profile block: Add prefix to block integrity profile flags ...
Diffstat (limited to 'include/linux/blkdev.h')
-rw-r--r--include/linux/blkdev.h71
1 files changed, 30 insertions, 41 deletions
diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h
index 87be398166d3..0207a78a8d82 100644
--- a/include/linux/blkdev.h
+++ b/include/linux/blkdev.h
@@ -36,6 +36,7 @@ struct request;
36struct sg_io_hdr; 36struct sg_io_hdr;
37struct bsg_job; 37struct bsg_job;
38struct blkcg_gq; 38struct blkcg_gq;
39struct blk_flush_queue;
39 40
40#define BLKDEV_MIN_RQ 4 41#define BLKDEV_MIN_RQ 4
41#define BLKDEV_MAX_RQ 128 /* Default maximum */ 42#define BLKDEV_MAX_RQ 128 /* Default maximum */
@@ -455,14 +456,7 @@ struct request_queue {
455 */ 456 */
456 unsigned int flush_flags; 457 unsigned int flush_flags;
457 unsigned int flush_not_queueable:1; 458 unsigned int flush_not_queueable:1;
458 unsigned int flush_queue_delayed:1; 459 struct blk_flush_queue *fq;
459 unsigned int flush_pending_idx:1;
460 unsigned int flush_running_idx:1;
461 unsigned long flush_pending_since;
462 struct list_head flush_queue[2];
463 struct list_head flush_data_in_flight;
464 struct request *flush_rq;
465 spinlock_t mq_flush_lock;
466 460
467 struct list_head requeue_list; 461 struct list_head requeue_list;
468 spinlock_t requeue_lock; 462 spinlock_t requeue_lock;
@@ -865,7 +859,7 @@ extern void blk_execute_rq_nowait(struct request_queue *, struct gendisk *,
865 859
866static inline struct request_queue *bdev_get_queue(struct block_device *bdev) 860static inline struct request_queue *bdev_get_queue(struct block_device *bdev)
867{ 861{
868 return bdev->bd_disk->queue; 862 return bdev->bd_disk->queue; /* this is never NULL */
869} 863}
870 864
871/* 865/*
@@ -1285,10 +1279,9 @@ static inline int queue_alignment_offset(struct request_queue *q)
1285static inline int queue_limit_alignment_offset(struct queue_limits *lim, sector_t sector) 1279static inline int queue_limit_alignment_offset(struct queue_limits *lim, sector_t sector)
1286{ 1280{
1287 unsigned int granularity = max(lim->physical_block_size, lim->io_min); 1281 unsigned int granularity = max(lim->physical_block_size, lim->io_min);
1288 unsigned int alignment = (sector << 9) & (granularity - 1); 1282 unsigned int alignment = sector_div(sector, granularity >> 9) << 9;
1289 1283
1290 return (granularity + lim->alignment_offset - alignment) 1284 return (granularity + lim->alignment_offset - alignment) % granularity;
1291 & (granularity - 1);
1292} 1285}
1293 1286
1294static inline int bdev_alignment_offset(struct block_device *bdev) 1287static inline int bdev_alignment_offset(struct block_device *bdev)
@@ -1464,32 +1457,31 @@ static inline uint64_t rq_io_start_time_ns(struct request *req)
1464 1457
1465#if defined(CONFIG_BLK_DEV_INTEGRITY) 1458#if defined(CONFIG_BLK_DEV_INTEGRITY)
1466 1459
1467#define INTEGRITY_FLAG_READ 2 /* verify data integrity on read */ 1460enum blk_integrity_flags {
1468#define INTEGRITY_FLAG_WRITE 4 /* generate data integrity on write */ 1461 BLK_INTEGRITY_VERIFY = 1 << 0,
1462 BLK_INTEGRITY_GENERATE = 1 << 1,
1463 BLK_INTEGRITY_DEVICE_CAPABLE = 1 << 2,
1464 BLK_INTEGRITY_IP_CHECKSUM = 1 << 3,
1465};
1469 1466
1470struct blk_integrity_exchg { 1467struct blk_integrity_iter {
1471 void *prot_buf; 1468 void *prot_buf;
1472 void *data_buf; 1469 void *data_buf;
1473 sector_t sector; 1470 sector_t seed;
1474 unsigned int data_size; 1471 unsigned int data_size;
1475 unsigned short sector_size; 1472 unsigned short interval;
1476 const char *disk_name; 1473 const char *disk_name;
1477}; 1474};
1478 1475
1479typedef void (integrity_gen_fn) (struct blk_integrity_exchg *); 1476typedef int (integrity_processing_fn) (struct blk_integrity_iter *);
1480typedef int (integrity_vrfy_fn) (struct blk_integrity_exchg *);
1481typedef void (integrity_set_tag_fn) (void *, void *, unsigned int);
1482typedef void (integrity_get_tag_fn) (void *, void *, unsigned int);
1483 1477
1484struct blk_integrity { 1478struct blk_integrity {
1485 integrity_gen_fn *generate_fn; 1479 integrity_processing_fn *generate_fn;
1486 integrity_vrfy_fn *verify_fn; 1480 integrity_processing_fn *verify_fn;
1487 integrity_set_tag_fn *set_tag_fn;
1488 integrity_get_tag_fn *get_tag_fn;
1489 1481
1490 unsigned short flags; 1482 unsigned short flags;
1491 unsigned short tuple_size; 1483 unsigned short tuple_size;
1492 unsigned short sector_size; 1484 unsigned short interval;
1493 unsigned short tag_size; 1485 unsigned short tag_size;
1494 1486
1495 const char *name; 1487 const char *name;
@@ -1504,10 +1496,10 @@ extern int blk_integrity_compare(struct gendisk *, struct gendisk *);
1504extern int blk_rq_map_integrity_sg(struct request_queue *, struct bio *, 1496extern int blk_rq_map_integrity_sg(struct request_queue *, struct bio *,
1505 struct scatterlist *); 1497 struct scatterlist *);
1506extern int blk_rq_count_integrity_sg(struct request_queue *, struct bio *); 1498extern int blk_rq_count_integrity_sg(struct request_queue *, struct bio *);
1507extern int blk_integrity_merge_rq(struct request_queue *, struct request *, 1499extern bool blk_integrity_merge_rq(struct request_queue *, struct request *,
1508 struct request *); 1500 struct request *);
1509extern int blk_integrity_merge_bio(struct request_queue *, struct request *, 1501extern bool blk_integrity_merge_bio(struct request_queue *, struct request *,
1510 struct bio *); 1502 struct bio *);
1511 1503
1512static inline 1504static inline
1513struct blk_integrity *bdev_get_integrity(struct block_device *bdev) 1505struct blk_integrity *bdev_get_integrity(struct block_device *bdev)
@@ -1520,12 +1512,9 @@ static inline struct blk_integrity *blk_get_integrity(struct gendisk *disk)
1520 return disk->integrity; 1512 return disk->integrity;
1521} 1513}
1522 1514
1523static inline int blk_integrity_rq(struct request *rq) 1515static inline bool blk_integrity_rq(struct request *rq)
1524{ 1516{
1525 if (rq->bio == NULL) 1517 return rq->cmd_flags & REQ_INTEGRITY;
1526 return 0;
1527
1528 return bio_integrity(rq->bio);
1529} 1518}
1530 1519
1531static inline void blk_queue_max_integrity_segments(struct request_queue *q, 1520static inline void blk_queue_max_integrity_segments(struct request_queue *q,
@@ -1590,15 +1579,15 @@ static inline unsigned short queue_max_integrity_segments(struct request_queue *
1590{ 1579{
1591 return 0; 1580 return 0;
1592} 1581}
1593static inline int blk_integrity_merge_rq(struct request_queue *rq, 1582static inline bool blk_integrity_merge_rq(struct request_queue *rq,
1594 struct request *r1, 1583 struct request *r1,
1595 struct request *r2) 1584 struct request *r2)
1596{ 1585{
1597 return 0; 1586 return 0;
1598} 1587}
1599static inline int blk_integrity_merge_bio(struct request_queue *rq, 1588static inline bool blk_integrity_merge_bio(struct request_queue *rq,
1600 struct request *r, 1589 struct request *r,
1601 struct bio *b) 1590 struct bio *b)
1602{ 1591{
1603 return 0; 1592 return 0;
1604} 1593}