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