Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^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);