~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/include/linux/dm-dirty-log.h

Version: ~ [ linux-5.9.1 ] ~ [ linux-5.8.16 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.72 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.152 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.202 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.240 ] ~ [ linux-4.8.17 ] ~ [ linux-4.7.10 ] ~ [ linux-4.6.7 ] ~ [ linux-4.5.7 ] ~ [ linux-4.4.240 ] ~ [ linux-4.3.6 ] ~ [ linux-4.2.8 ] ~ [ linux-4.1.52 ] ~ [ linux-4.0.9 ] ~ [ linux-3.19.8 ] ~ [ linux-3.18.140 ] ~ [ linux-3.17.8 ] ~ [ linux-3.16.85 ] ~ [ linux-3.15.10 ] ~ [ linux-3.14.79 ] ~ [ linux-3.13.11 ] ~ [ linux-3.12.74 ] ~ [ linux-3.11.10 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.5 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 /*
  2  * Copyright (C) 2003 Sistina Software
  3  * Copyright (C) 2004-2008 Red Hat, Inc. All rights reserved.
  4  *
  5  * Device-Mapper dirty region log.
  6  *
  7  * This file is released under the LGPL.
  8  */
  9 
 10 #ifndef _LINUX_DM_DIRTY_LOG
 11 #define _LINUX_DM_DIRTY_LOG
 12 
 13 #ifdef __KERNEL__
 14 
 15 #include <linux/types.h>
 16 #include <linux/device-mapper.h>
 17 
 18 typedef sector_t region_t;
 19 
 20 struct dm_dirty_log_type;
 21 
 22 struct dm_dirty_log {
 23         struct dm_dirty_log_type *type;
 24         int (*flush_callback_fn)(struct dm_target *ti);
 25         void *context;
 26 };
 27 
 28 struct dm_dirty_log_type {
 29         const char *name;
 30         struct module *module;
 31 
 32         /* For internal device-mapper use */
 33         struct list_head list;
 34 
 35         int (*ctr)(struct dm_dirty_log *log, struct dm_target *ti,
 36                    unsigned argc, char **argv);
 37         void (*dtr)(struct dm_dirty_log *log);
 38 
 39         /*
 40          * There are times when we don't want the log to touch
 41          * the disk.
 42          */
 43         int (*presuspend)(struct dm_dirty_log *log);
 44         int (*postsuspend)(struct dm_dirty_log *log);
 45         int (*resume)(struct dm_dirty_log *log);
 46 
 47         /*
 48          * Retrieves the smallest size of region that the log can
 49          * deal with.
 50          */
 51         uint32_t (*get_region_size)(struct dm_dirty_log *log);
 52 
 53         /*
 54          * A predicate to say whether a region is clean or not.
 55          * May block.
 56          */
 57         int (*is_clean)(struct dm_dirty_log *log, region_t region);
 58 
 59         /*
 60          *  Returns: 0, 1, -EWOULDBLOCK, < 0
 61          *
 62          * A predicate function to check the area given by
 63          * [sector, sector + len) is in sync.
 64          *
 65          * If -EWOULDBLOCK is returned the state of the region is
 66          * unknown, typically this will result in a read being
 67          * passed to a daemon to deal with, since a daemon is
 68          * allowed to block.
 69          */
 70         int (*in_sync)(struct dm_dirty_log *log, region_t region,
 71                        int can_block);
 72 
 73         /*
 74          * Flush the current log state (eg, to disk).  This
 75          * function may block.
 76          */
 77         int (*flush)(struct dm_dirty_log *log);
 78 
 79         /*
 80          * Mark an area as clean or dirty.  These functions may
 81          * block, though for performance reasons blocking should
 82          * be extremely rare (eg, allocating another chunk of
 83          * memory for some reason).
 84          */
 85         void (*mark_region)(struct dm_dirty_log *log, region_t region);
 86         void (*clear_region)(struct dm_dirty_log *log, region_t region);
 87 
 88         /*
 89          * Returns: <0 (error), 0 (no region), 1 (region)
 90          *
 91          * The mirrord will need perform recovery on regions of
 92          * the mirror that are in the NOSYNC state.  This
 93          * function asks the log to tell the caller about the
 94          * next region that this machine should recover.
 95          *
 96          * Do not confuse this function with 'in_sync()', one
 97          * tells you if an area is synchronised, the other
 98          * assigns recovery work.
 99         */
100         int (*get_resync_work)(struct dm_dirty_log *log, region_t *region);
101 
102         /*
103          * This notifies the log that the resync status of a region
104          * has changed.  It also clears the region from the recovering
105          * list (if present).
106          */
107         void (*set_region_sync)(struct dm_dirty_log *log,
108                                 region_t region, int in_sync);
109 
110         /*
111          * Returns the number of regions that are in sync.
112          */
113         region_t (*get_sync_count)(struct dm_dirty_log *log);
114 
115         /*
116          * Support function for mirror status requests.
117          */
118         int (*status)(struct dm_dirty_log *log, status_type_t status_type,
119                       char *result, unsigned maxlen);
120 
121         /*
122          * is_remote_recovering is necessary for cluster mirroring. It provides
123          * a way to detect recovery on another node, so we aren't writing
124          * concurrently.  This function is likely to block (when a cluster log
125          * is used).
126          *
127          * Returns: 0, 1
128          */
129         int (*is_remote_recovering)(struct dm_dirty_log *log, region_t region);
130 };
131 
132 int dm_dirty_log_type_register(struct dm_dirty_log_type *type);
133 int dm_dirty_log_type_unregister(struct dm_dirty_log_type *type);
134 
135 /*
136  * Make sure you use these two functions, rather than calling
137  * type->constructor/destructor() directly.
138  */
139 struct dm_dirty_log *dm_dirty_log_create(const char *type_name,
140                         struct dm_target *ti,
141                         int (*flush_callback_fn)(struct dm_target *ti),
142                         unsigned argc, char **argv);
143 void dm_dirty_log_destroy(struct dm_dirty_log *log);
144 
145 #endif  /* __KERNEL__ */
146 #endif  /* _LINUX_DM_DIRTY_LOG_H */
147 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | Wiki (Japanese) | Wiki (English) | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

osdn.jp