xref: /openbmc/linux/Documentation/admin-guide/device-mapper/kcopyd.rst (revision 0898782247ae533d1f4e47a06bc5d4870931b284)
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