dm kcopyd: add WRITE SAME support to dm_kcopyd_zero
Add WRITE SAME support to dm-io and make it accessible to dm_kcopyd_zero(). dm_kcopyd_zero() provides an asynchronous interface whereas the blkdev_issue_write_same() interface is synchronous. WRITE SAME is a SCSI command that can be leveraged for more efficient zeroing of a specified logical extent of a device which supports it. Only a single zeroed logical block is transfered to the target for each WRITE SAME and the target then writes that same block across the specified extent. The dm thin target uses this. Signed-off-by: Mike Snitzer <snitzer@redhat.com> Signed-off-by: Alasdair G Kergon <agk@redhat.com>
This commit is contained in:

zatwierdzone przez
Alasdair G Kergon

rodzic
4f0b70b047
commit
70d6c400ac
@@ -349,7 +349,7 @@ static void complete_io(unsigned long error, void *context)
|
||||
struct dm_kcopyd_client *kc = job->kc;
|
||||
|
||||
if (error) {
|
||||
if (job->rw == WRITE)
|
||||
if (job->rw & WRITE)
|
||||
job->write_err |= error;
|
||||
else
|
||||
job->read_err = 1;
|
||||
@@ -361,7 +361,7 @@ static void complete_io(unsigned long error, void *context)
|
||||
}
|
||||
}
|
||||
|
||||
if (job->rw == WRITE)
|
||||
if (job->rw & WRITE)
|
||||
push(&kc->complete_jobs, job);
|
||||
|
||||
else {
|
||||
@@ -432,7 +432,7 @@ static int process_jobs(struct list_head *jobs, struct dm_kcopyd_client *kc,
|
||||
|
||||
if (r < 0) {
|
||||
/* error this rogue job */
|
||||
if (job->rw == WRITE)
|
||||
if (job->rw & WRITE)
|
||||
job->write_err = (unsigned long) -1L;
|
||||
else
|
||||
job->read_err = 1;
|
||||
@@ -585,6 +585,7 @@ int dm_kcopyd_copy(struct dm_kcopyd_client *kc, struct dm_io_region *from,
|
||||
unsigned int flags, dm_kcopyd_notify_fn fn, void *context)
|
||||
{
|
||||
struct kcopyd_job *job;
|
||||
int i;
|
||||
|
||||
/*
|
||||
* Allocate an array of jobs consisting of one master job
|
||||
@@ -611,7 +612,16 @@ int dm_kcopyd_copy(struct dm_kcopyd_client *kc, struct dm_io_region *from,
|
||||
memset(&job->source, 0, sizeof job->source);
|
||||
job->source.count = job->dests[0].count;
|
||||
job->pages = &zero_page_list;
|
||||
job->rw = WRITE;
|
||||
|
||||
/*
|
||||
* Use WRITE SAME to optimize zeroing if all dests support it.
|
||||
*/
|
||||
job->rw = WRITE | REQ_WRITE_SAME;
|
||||
for (i = 0; i < job->num_dests; i++)
|
||||
if (!bdev_write_same(job->dests[i].bdev)) {
|
||||
job->rw = WRITE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
job->fn = fn;
|
||||
|
Reference in New Issue
Block a user