kcopyd.rst 1.9 KB

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