dm-kcopyd.h 2.85 KB
Newer Older
Linus Torvalds's avatar
Linus Torvalds committed
1
/*
2 3
 * Copyright (C) 2001 - 2003 Sistina Software
 * Copyright (C) 2004 - 2008 Red Hat, Inc. All rights reserved.
Linus Torvalds's avatar
Linus Torvalds committed
4
 *
5 6 7
 * kcopyd provides a simple interface for copying an area of one
 * block-device to one or more other block-devices, either synchronous
 * or with an asynchronous completion notification.
Linus Torvalds's avatar
Linus Torvalds committed
8
 *
9
 * This file is released under the GPL.
Linus Torvalds's avatar
Linus Torvalds committed
10 11
 */

12 13 14 15
#ifndef _LINUX_DM_KCOPYD_H
#define _LINUX_DM_KCOPYD_H

#ifdef __KERNEL__
Linus Torvalds's avatar
Linus Torvalds committed
16

17
#include <linux/dm-io.h>
Linus Torvalds's avatar
Linus Torvalds committed
18 19

/* FIXME: make this configurable */
20
#define DM_KCOPYD_MAX_REGIONS 8
Linus Torvalds's avatar
Linus Torvalds committed
21

22
#define DM_KCOPYD_IGNORE_ERROR 1
Linus Torvalds's avatar
Linus Torvalds committed
23

24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
struct dm_kcopyd_throttle {
	unsigned throttle;
	unsigned num_io_jobs;
	unsigned io_period;
	unsigned total_period;
	unsigned last_jiffies;
};

/*
 * kcopyd clients that want to support throttling must pass an initialised
 * dm_kcopyd_throttle struct into dm_kcopyd_client_create().
 * Two or more clients may share the same instance of this struct between
 * them if they wish to be throttled as a group.
 *
 * This macro also creates a corresponding module parameter to configure
 * the amount of throttling.
 */
#define DECLARE_DM_KCOPYD_THROTTLE_WITH_MODULE_PARM(name, description)	\
static struct dm_kcopyd_throttle dm_kcopyd_throttle = { 100, 0, 0, 0, 0 }; \
module_param_named(name, dm_kcopyd_throttle.throttle, uint, 0644); \
MODULE_PARM_DESC(name, description)

Linus Torvalds's avatar
Linus Torvalds committed
46
/*
47
 * To use kcopyd you must first create a dm_kcopyd_client object.
48
 * throttle can be NULL if you don't want any throttling.
Linus Torvalds's avatar
Linus Torvalds committed
49
 */
50
struct dm_kcopyd_client;
51
struct dm_kcopyd_client *dm_kcopyd_client_create(struct dm_kcopyd_throttle *throttle);
52
void dm_kcopyd_client_destroy(struct dm_kcopyd_client *kc);
Linus Torvalds's avatar
Linus Torvalds committed
53 54 55 56 57 58 59 60

/*
 * Submit a copy job to kcopyd.  This is built on top of the
 * previous three fns.
 *
 * read_err is a boolean,
 * write_err is a bitset, with 1 bit for each destination region
 */
61 62
typedef void (*dm_kcopyd_notify_fn)(int read_err, unsigned long write_err,
				    void *context);
Linus Torvalds's avatar
Linus Torvalds committed
63

64 65 66
int dm_kcopyd_copy(struct dm_kcopyd_client *kc, struct dm_io_region *from,
		   unsigned num_dests, struct dm_io_region *dests,
		   unsigned flags, dm_kcopyd_notify_fn fn, void *context);
Linus Torvalds's avatar
Linus Torvalds committed
67

68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
/*
 * Prepare a callback and submit it via the kcopyd thread.
 *
 * dm_kcopyd_prepare_callback allocates a callback structure and returns it.
 * It must not be called from interrupt context.
 * The returned value should be passed into dm_kcopyd_do_callback.
 *
 * dm_kcopyd_do_callback submits the callback.
 * It may be called from interrupt context.
 * The callback is issued from the kcopyd thread.
 */
void *dm_kcopyd_prepare_callback(struct dm_kcopyd_client *kc,
				 dm_kcopyd_notify_fn fn, void *context);
void dm_kcopyd_do_callback(void *job, int read_err, unsigned long write_err);

83 84 85 86
int dm_kcopyd_zero(struct dm_kcopyd_client *kc,
		   unsigned num_dests, struct dm_io_region *dests,
		   unsigned flags, dm_kcopyd_notify_fn fn, void *context);

87 88
#endif	/* __KERNEL__ */
#endif	/* _LINUX_DM_KCOPYD_H */