1*6cf2a73cSMauro Carvalho Chehab====== 2*6cf2a73cSMauro Carvalho Chehabkcopyd 3*6cf2a73cSMauro Carvalho Chehab====== 4*6cf2a73cSMauro Carvalho Chehab 5*6cf2a73cSMauro Carvalho ChehabKcopyd provides the ability to copy a range of sectors from one block-device 6*6cf2a73cSMauro Carvalho Chehabto one or more other block-devices, with an asynchronous completion 7*6cf2a73cSMauro Carvalho Chehabnotification. It is used by dm-snapshot and dm-mirror. 8*6cf2a73cSMauro Carvalho Chehab 9*6cf2a73cSMauro Carvalho ChehabUsers of kcopyd must first create a client and indicate how many memory pages 10*6cf2a73cSMauro Carvalho Chehabto set aside for their copy jobs. This is done with a call to 11*6cf2a73cSMauro Carvalho Chehabkcopyd_client_create():: 12*6cf2a73cSMauro Carvalho Chehab 13*6cf2a73cSMauro Carvalho Chehab int kcopyd_client_create(unsigned int num_pages, 14*6cf2a73cSMauro Carvalho Chehab struct kcopyd_client **result); 15*6cf2a73cSMauro Carvalho Chehab 16*6cf2a73cSMauro Carvalho ChehabTo start a copy job, the user must set up io_region structures to describe 17*6cf2a73cSMauro Carvalho Chehabthe source and destinations of the copy. Each io_region indicates a 18*6cf2a73cSMauro Carvalho Chehabblock-device along with the starting sector and size of the region. The source 19*6cf2a73cSMauro Carvalho Chehabof the copy is given as one io_region structure, and the destinations of the 20*6cf2a73cSMauro Carvalho Chehabcopy are given as an array of io_region structures:: 21*6cf2a73cSMauro Carvalho Chehab 22*6cf2a73cSMauro Carvalho Chehab struct io_region { 23*6cf2a73cSMauro Carvalho Chehab struct block_device *bdev; 24*6cf2a73cSMauro Carvalho Chehab sector_t sector; 25*6cf2a73cSMauro Carvalho Chehab sector_t count; 26*6cf2a73cSMauro Carvalho Chehab }; 27*6cf2a73cSMauro Carvalho Chehab 28*6cf2a73cSMauro Carvalho ChehabTo start the copy, the user calls kcopyd_copy(), passing in the client 29*6cf2a73cSMauro Carvalho Chehabpointer, pointers to the source and destination io_regions, the name of a 30*6cf2a73cSMauro Carvalho Chehabcompletion callback routine, and a pointer to some context data for the copy:: 31*6cf2a73cSMauro Carvalho Chehab 32*6cf2a73cSMauro Carvalho Chehab int kcopyd_copy(struct kcopyd_client *kc, struct io_region *from, 33*6cf2a73cSMauro Carvalho Chehab unsigned int num_dests, struct io_region *dests, 34*6cf2a73cSMauro Carvalho Chehab unsigned int flags, kcopyd_notify_fn fn, void *context); 35*6cf2a73cSMauro Carvalho Chehab 36*6cf2a73cSMauro Carvalho Chehab typedef void (*kcopyd_notify_fn)(int read_err, unsigned int write_err, 37*6cf2a73cSMauro Carvalho Chehab void *context); 38*6cf2a73cSMauro Carvalho Chehab 39*6cf2a73cSMauro Carvalho ChehabWhen the copy completes, kcopyd will call the user's completion routine, 40*6cf2a73cSMauro Carvalho Chehabpassing back the user's context pointer. It will also indicate if a read or 41*6cf2a73cSMauro Carvalho Chehabwrite error occurred during the copy. 42*6cf2a73cSMauro Carvalho Chehab 43*6cf2a73cSMauro Carvalho ChehabWhen a user is done with all their copy jobs, they should call 44*6cf2a73cSMauro Carvalho Chehabkcopyd_client_destroy() to delete the kcopyd client, which will release the 45*6cf2a73cSMauro Carvalho Chehabassociated memory pages:: 46*6cf2a73cSMauro Carvalho Chehab 47*6cf2a73cSMauro Carvalho Chehab void kcopyd_client_destroy(struct kcopyd_client *kc); 48