Commit 148e51ba authored by Mike Snitzer's avatar Mike Snitzer

dm: improve documentation and code clarity in dm_merge_bvec

These code changes do not introduce a functional change.

But bio_add_page() will never attempt to build up a bio larger than
queue_max_sectors().  Similarly, bio_get_nr_vecs() is also bound by
queue_max_sectors().  Therefore, there is no point in allowing
dm_merge_bvec() to answer "how many sectors can a bio have at this
offset?" with anything larger than queue_max_sectors().  Using
queue_max_sectors() rather than BIO_MAX_SECTORS serves to more
accurately convey the limits that are being imposed.

Also, use unlikely() to clarify the fact that the defensive code in
dm_merge_bvec() relative to max_size going negative shouldn't ever
happen -- if it does happen there is a bug in the block layer for
requesting larger than dm_merge_bvec()'s initial response for a given
offset.  Also, update a comment in dm_merge_bvec() relative to
max_hw_sectors_kb.  And fix empty newline whitespace.
Signed-off-by: default avatarMike Snitzer <snitzer@redhat.com>
parent 604ea906
...@@ -1607,9 +1607,9 @@ static int dm_merge_bvec(struct request_queue *q, ...@@ -1607,9 +1607,9 @@ static int dm_merge_bvec(struct request_queue *q,
* Find maximum amount of I/O that won't need splitting * Find maximum amount of I/O that won't need splitting
*/ */
max_sectors = min(max_io_len(bvm->bi_sector, ti), max_sectors = min(max_io_len(bvm->bi_sector, ti),
(sector_t) BIO_MAX_SECTORS); (sector_t) queue_max_sectors(q));
max_size = (max_sectors << SECTOR_SHIFT) - bvm->bi_size; max_size = (max_sectors << SECTOR_SHIFT) - bvm->bi_size;
if (max_size < 0) if (unlikely(max_size < 0)) /* this shouldn't _ever_ happen */
max_size = 0; max_size = 0;
/* /*
...@@ -1621,10 +1621,10 @@ static int dm_merge_bvec(struct request_queue *q, ...@@ -1621,10 +1621,10 @@ static int dm_merge_bvec(struct request_queue *q,
max_size = ti->type->merge(ti, bvm, biovec, max_size); max_size = ti->type->merge(ti, bvm, biovec, max_size);
/* /*
* If the target doesn't support merge method and some of the devices * If the target doesn't support merge method and some of the devices
* provided their merge_bvec method (we know this by looking at * provided their merge_bvec method (we know this by looking for the
* queue_max_hw_sectors), then we can't allow bios with multiple vector * max_hw_sectors that dm_set_device_limits may set), then we can't
* entries. So always set max_size to 0, and the code below allows * allow bios with multiple vector entries. So always set max_size
* just one page. * to 0, and the code below allows just one page.
*/ */
else if (queue_max_hw_sectors(q) <= PAGE_SIZE >> 9) else if (queue_max_hw_sectors(q) <= PAGE_SIZE >> 9)
max_size = 0; max_size = 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment