Blame view

include/linux/dm-dirty-log.h 3.94 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
  /*
   * Copyright (C) 2003 Sistina Software
416cd17b1   Heinz Mauelshagen   dm log: clean int...
3
4
5
   * Copyright (C) 2004-2008 Red Hat, Inc. All rights reserved.
   *
   * Device-Mapper dirty region log.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6
7
8
   *
   * This file is released under the LGPL.
   */
416cd17b1   Heinz Mauelshagen   dm log: clean int...
9
10
11
12
  #ifndef _LINUX_DM_DIRTY_LOG
  #define _LINUX_DM_DIRTY_LOG
  
  #ifdef __KERNEL__
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
13

416cd17b1   Heinz Mauelshagen   dm log: clean int...
14
15
  #include <linux/types.h>
  #include <linux/device-mapper.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
16
17
  
  typedef sector_t region_t;
416cd17b1   Heinz Mauelshagen   dm log: clean int...
18
  struct dm_dirty_log_type;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
19

416cd17b1   Heinz Mauelshagen   dm log: clean int...
20
21
  struct dm_dirty_log {
  	struct dm_dirty_log_type *type;
87a8f240e   Mikulas Patocka   dm log: add flush...
22
  	int (*flush_callback_fn)(struct dm_target *ti);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
23
24
  	void *context;
  };
416cd17b1   Heinz Mauelshagen   dm log: clean int...
25
  struct dm_dirty_log_type {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
26
27
  	const char *name;
  	struct module *module;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
28

ec44ab9d6   Mike Snitzer   dm log: remove st...
29
30
  	/* For internal device-mapper use */
  	struct list_head list;
416cd17b1   Heinz Mauelshagen   dm log: clean int...
31
32
33
  	int (*ctr)(struct dm_dirty_log *log, struct dm_target *ti,
  		   unsigned argc, char **argv);
  	void (*dtr)(struct dm_dirty_log *log);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
34
35
36
37
38
  
  	/*
  	 * There are times when we don't want the log to touch
  	 * the disk.
  	 */
416cd17b1   Heinz Mauelshagen   dm log: clean int...
39
40
41
  	int (*presuspend)(struct dm_dirty_log *log);
  	int (*postsuspend)(struct dm_dirty_log *log);
  	int (*resume)(struct dm_dirty_log *log);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
42
43
44
45
46
  
  	/*
  	 * Retrieves the smallest size of region that the log can
  	 * deal with.
  	 */
416cd17b1   Heinz Mauelshagen   dm log: clean int...
47
  	uint32_t (*get_region_size)(struct dm_dirty_log *log);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
48

416cd17b1   Heinz Mauelshagen   dm log: clean int...
49
  	/*
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
50
51
52
  	 * A predicate to say whether a region is clean or not.
  	 * May block.
  	 */
416cd17b1   Heinz Mauelshagen   dm log: clean int...
53
  	int (*is_clean)(struct dm_dirty_log *log, region_t region);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
54
55
56
57
58
59
60
61
62
63
64
65
  
  	/*
  	 *  Returns: 0, 1, -EWOULDBLOCK, < 0
  	 *
  	 * A predicate function to check the area given by
  	 * [sector, sector + len) is in sync.
  	 *
  	 * If -EWOULDBLOCK is returned the state of the region is
  	 * unknown, typically this will result in a read being
  	 * passed to a daemon to deal with, since a daemon is
  	 * allowed to block.
  	 */
416cd17b1   Heinz Mauelshagen   dm log: clean int...
66
67
  	int (*in_sync)(struct dm_dirty_log *log, region_t region,
  		       int can_block);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
68
69
70
71
72
  
  	/*
  	 * Flush the current log state (eg, to disk).  This
  	 * function may block.
  	 */
416cd17b1   Heinz Mauelshagen   dm log: clean int...
73
  	int (*flush)(struct dm_dirty_log *log);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
74
75
76
77
78
79
80
  
  	/*
  	 * Mark an area as clean or dirty.  These functions may
  	 * block, though for performance reasons blocking should
  	 * be extremely rare (eg, allocating another chunk of
  	 * memory for some reason).
  	 */
416cd17b1   Heinz Mauelshagen   dm log: clean int...
81
82
  	void (*mark_region)(struct dm_dirty_log *log, region_t region);
  	void (*clear_region)(struct dm_dirty_log *log, region_t region);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
83
84
85
86
87
88
89
90
91
92
93
94
95
  
  	/*
  	 * Returns: <0 (error), 0 (no region), 1 (region)
  	 *
  	 * The mirrord will need perform recovery on regions of
  	 * the mirror that are in the NOSYNC state.  This
  	 * function asks the log to tell the caller about the
  	 * next region that this machine should recover.
  	 *
  	 * Do not confuse this function with 'in_sync()', one
  	 * tells you if an area is synchronised, the other
  	 * assigns recovery work.
  	*/
416cd17b1   Heinz Mauelshagen   dm log: clean int...
96
  	int (*get_resync_work)(struct dm_dirty_log *log, region_t *region);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
97
98
  
  	/*
f3ee6b2f6   Jonathan E Brassow   [PATCH] dm: log: ...
99
100
101
  	 * This notifies the log that the resync status of a region
  	 * has changed.  It also clears the region from the recovering
  	 * list (if present).
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
102
  	 */
416cd17b1   Heinz Mauelshagen   dm log: clean int...
103
  	void (*set_region_sync)(struct dm_dirty_log *log,
f3ee6b2f6   Jonathan E Brassow   [PATCH] dm: log: ...
104
  				region_t region, int in_sync);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
105

416cd17b1   Heinz Mauelshagen   dm log: clean int...
106
  	/*
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
107
  	 * Returns the number of regions that are in sync.
416cd17b1   Heinz Mauelshagen   dm log: clean int...
108
109
  	 */
  	region_t (*get_sync_count)(struct dm_dirty_log *log);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
110
111
112
113
  
  	/*
  	 * Support function for mirror status requests.
  	 */
416cd17b1   Heinz Mauelshagen   dm log: clean int...
114
115
  	int (*status)(struct dm_dirty_log *log, status_type_t status_type,
  		      char *result, unsigned maxlen);
7513c2a76   Jonathan Brassow   dm raid1: add is_...
116
117
118
119
120
121
122
123
124
125
  
  	/*
  	 * is_remote_recovering is necessary for cluster mirroring. It provides
  	 * a way to detect recovery on another node, so we aren't writing
  	 * concurrently.  This function is likely to block (when a cluster log
  	 * is used).
  	 *
  	 * Returns: 0, 1
  	 */
  	int (*is_remote_recovering)(struct dm_dirty_log *log, region_t region);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
126
  };
416cd17b1   Heinz Mauelshagen   dm log: clean int...
127
128
  int dm_dirty_log_type_register(struct dm_dirty_log_type *type);
  int dm_dirty_log_type_unregister(struct dm_dirty_log_type *type);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
129
130
131
132
133
  
  /*
   * Make sure you use these two functions, rather than calling
   * type->constructor/destructor() directly.
   */
416cd17b1   Heinz Mauelshagen   dm log: clean int...
134
  struct dm_dirty_log *dm_dirty_log_create(const char *type_name,
87a8f240e   Mikulas Patocka   dm log: add flush...
135
136
137
  			struct dm_target *ti,
  			int (*flush_callback_fn)(struct dm_target *ti),
  			unsigned argc, char **argv);
416cd17b1   Heinz Mauelshagen   dm log: clean int...
138
  void dm_dirty_log_destroy(struct dm_dirty_log *log);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
139

416cd17b1   Heinz Mauelshagen   dm log: clean int...
140
141
  #endif	/* __KERNEL__ */
  #endif	/* _LINUX_DM_DIRTY_LOG_H */