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