kcopyd

Kcopyd 提供了将一系列扇区从一个块设备复制到一个或多个其他块设备的能力,并具有异步完成通知。它被 dm-snapshot 和 dm-mirror 使用。

kcopyd 的用户必须首先创建一个客户端,并指示为他们的复制作业预留多少内存页。这通过调用 kcopyd_client_create() 完成。

int kcopyd_client_create(unsigned int num_pages,
                         struct kcopyd_client **result);

要启动复制作业,用户必须设置 io_region 结构以描述复制的源和目标。每个 io_region 指示一个块设备以及区域的起始扇区和大小。复制的源以一个 io_region 结构给出,复制的目标以 io_region 结构数组给出。

struct io_region {
   struct block_device *bdev;
   sector_t sector;
   sector_t count;
};

要启动复制,用户调用 kcopyd_copy(),传入客户端指针、指向源和目标 io_region 的指针、完成回调例程的名称以及指向复制的一些上下文数据的指针。

int kcopyd_copy(struct kcopyd_client *kc, struct io_region *from,
                unsigned int num_dests, struct io_region *dests,
                unsigned int flags, kcopyd_notify_fn fn, void *context);

typedef void (*kcopyd_notify_fn)(int read_err, unsigned int write_err,
                                 void *context);

当复制完成时,kcopyd 将调用用户的完成例程,将用户的上下文指针传回。它还会指示复制期间是否发生读取或写入错误。

当用户完成所有复制作业后,他们应该调用 kcopyd_client_destroy() 以删除 kcopyd 客户端,这将释放相关的内存页。

void kcopyd_client_destroy(struct kcopyd_client *kc);