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);