Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 347961
b: refs/heads/master
c: 23508a9
h: refs/heads/master
i:
  347959: fada679
v: v3
  • Loading branch information
Mike Snitzer authored and Alasdair G Kergon committed Dec 21, 2012
1 parent e0ff43e commit 6d44020
Show file tree
Hide file tree
Showing 2 changed files with 40 additions and 6 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: d54eaa5a0fde0a202e4e91f200f818edcef15bee
refs/heads/master: 23508a96cd2e857d57044a2ed7d305f2d9daf441
44 changes: 39 additions & 5 deletions trunk/drivers/md/dm.c
Original file line number Diff line number Diff line change
Expand Up @@ -1174,7 +1174,28 @@ static void __clone_and_map_simple(struct clone_info *ci, struct dm_target *ti)
ci->sector_count = 0;
}

static int __clone_and_map_discard(struct clone_info *ci)
typedef unsigned (*get_num_requests_fn)(struct dm_target *ti);

static unsigned get_num_discard_requests(struct dm_target *ti)
{
return ti->num_discard_requests;
}

static unsigned get_num_write_same_requests(struct dm_target *ti)
{
return ti->num_write_same_requests;
}

typedef bool (*is_split_required_fn)(struct dm_target *ti);

static bool is_split_required_for_discard(struct dm_target *ti)
{
return ti->split_discard_requests;
}

static int __clone_and_map_changing_extent_only(struct clone_info *ci,
get_num_requests_fn get_num_requests,
is_split_required_fn is_split_required)
{
struct dm_target *ti;
sector_t len;
Expand All @@ -1185,15 +1206,15 @@ static int __clone_and_map_discard(struct clone_info *ci)
return -EIO;

/*
* Even though the device advertised discard support,
* that does not mean every target supports it, and
* Even though the device advertised support for this type of
* request, that does not mean every target supports it, and
* reconfiguration might also have changed that since the
* check was performed.
*/
if (!ti->num_discard_requests)
if (!get_num_requests || !get_num_requests(ti))
return -EOPNOTSUPP;

if (!ti->split_discard_requests)
if (is_split_required && !is_split_required(ti))
len = min(ci->sector_count, max_io_len_target_boundary(ci->sector, ti));
else
len = min(ci->sector_count, max_io_len(ci->sector, ti));
Expand All @@ -1206,6 +1227,17 @@ static int __clone_and_map_discard(struct clone_info *ci)
return 0;
}

static int __clone_and_map_discard(struct clone_info *ci)
{
return __clone_and_map_changing_extent_only(ci, get_num_discard_requests,
is_split_required_for_discard);
}

static int __clone_and_map_write_same(struct clone_info *ci)
{
return __clone_and_map_changing_extent_only(ci, get_num_write_same_requests, NULL);
}

static int __clone_and_map(struct clone_info *ci)
{
struct bio *bio = ci->bio;
Expand All @@ -1215,6 +1247,8 @@ static int __clone_and_map(struct clone_info *ci)

if (unlikely(bio->bi_rw & REQ_DISCARD))
return __clone_and_map_discard(ci);
else if (unlikely(bio->bi_rw & REQ_WRITE_SAME))
return __clone_and_map_write_same(ci);

ti = dm_table_find_target(ci->map, ci->sector);
if (!dm_target_is_valid(ti))
Expand Down

0 comments on commit 6d44020

Please sign in to comment.