1 #ifndef __LINUX_SNAPFS_H
2 #define __LINUX_SNAPFS_H
3 /* maximum number of snapshot tables we maintain in the kernel */
5 #define SNAP_MAX_TABLES 32
6 #define SNAP_MAX_NAMELEN 64
8 /* ioctls for manipulating snapshots 40 - 60 */
9 #define IOC_SNAP_TYPE 'f'
10 #define IOC_SNAP_MIN_NR 41
12 #define IOC_SNAP_SETTABLE _IOWR('f', 41, long)
13 #define IOC_SNAP_PRINTTABLE _IOWR('f', 42, long)
14 #define IOC_SNAP_GETINDEXFROMNAME _IOWR('f', 43, long)
15 #define IOC_SNAP_GET_NEXT_INO _IOWR('f', 44, long)
16 #define IOC_SNAP_GET_INO_INFO _IOWR('f', 45, long)
18 #define IOC_SNAP_ADD _IOWR('f', 46, long)
19 #define IOC_SNAP_DELETE _IOWR('f', 47, long)
20 #define IOC_SNAP_RESTORE _IOWR('f', 48, long)
21 #define IOC_SNAP_DEBUG _IOWR('f', 49, long)
22 #define IOC_SNAP_DEVFAIL _IOWR('f', 50, long)
23 #define IOC_SNAP_SHOW_DOTSNAP _IOWR('f', 51, long)
25 #define IOC_SNAP_MAX_NR 51
32 char name[SNAP_MAX_NAMELEN];
36 /*FIXME, use ioc_data temporary, will use obd_ioc_data later*/
38 unsigned int ioc_inlen;
43 /* snap ioctl data for table fiddling */
44 struct ioc_snap_tbl_data {
45 int no; /* which table */
47 unsigned int count; /* how many snaps */
48 struct snap snaps[0]; /* sorted times! */
53 struct list_head list;
55 /* we have just a single snapshot control device
56 it contains a list of all the snap_current info's
58 #define SNAPDEV_NAME "/dev/snapconf"
59 #define SNAP_PSDEV_MINOR 240
60 #define SNAP_PSDEV_MAJOR 10
62 #define SNAP_TABLE_OUTBUF_LEN 1020
67 #include <linux/lustre_lib.h>
69 #include "snapfs_support.h"
71 /* What we use to point to IDs in the obdmd data for snapshots. If we use
72 * obd_id (8 bytes) instead of ino_t (4 bytes), we halve the number of
73 * available snapshot slots (14 in 56 bytes vs. 7 in 56 bytes until we
74 * increase the size of OBD_OBDMDSZ).
76 typedef ino_t snap_id;
79 /* maximum number of snapshots per device
80 must fit in "o_obdmd" area of struct obdo */
81 //#define OBD_OBDMDSZ 54
82 //#define SNAP_MAX ((OBD_OBDMDSZ - sizeof(uint32_t))/sizeof(snap_id))
86 /* if time is 0 this designates the "current" snapshot, i.e.
91 extern int init_snapfs_proc_sys(void);
92 extern void cleanup_spapfs_proc_sys(void);
93 extern int snap_print_entry;
94 extern int snap_debug_level;
95 extern int snap_inodes;
96 extern long snap_kmemory;
97 extern int snap_stack;
99 /* snap cache information: this morally equals the superblock of a
100 snap_current_fs. However, that superblock is the one of the "cache"
101 device holding the inodes, hence we store this info in the hash of
102 mountpoints hanging of our control device.
105 struct list_head cache_chain;
108 struct super_block *cache_sb; /* the _real_ device */
110 struct list_head cache_clone_list;
111 int cache_snap_tableno;
113 struct filter_fs *cache_filter;
116 char cache_show_dotsnap;
119 /* this is the snap_clone_info for the sb of snap_clone_fs */
120 struct snap_clone_info {
121 struct snap_cache *clone_cache;
122 struct list_head clone_list_entry;
127 * it is important that things like inode, super and file operations
128 * for intermezzo are not defined statically. If methods are NULL
129 * the VFS takes special action based on that. Given that different
130 * cache types have NULL ops at different slots, we must install opeation
131 * talbes for InterMezzo with NULL's in the same spot
135 /* operations on the file store */
136 struct super_operations filter_sops;
138 struct inode_operations filter_dir_iops;
139 struct inode_operations filter_file_iops;
140 struct inode_operations filter_sym_iops;
142 struct file_operations filter_dir_fops;
143 struct file_operations filter_file_fops;
144 struct file_operations filter_sym_fops;
146 struct address_space_operations filter_file_aops;
147 struct dentry_operations filter_dentry_ops;
152 /* operations on the file store */
153 struct super_operations *cache_sops;
155 struct inode_operations *cache_dir_iops;
156 struct inode_operations *cache_file_iops;
157 struct inode_operations *cache_sym_iops;
159 struct file_operations *cache_dir_fops;
160 struct file_operations *cache_file_fops;
161 struct file_operations *cache_sym_fops;
163 struct address_space_operations *cache_file_aops;
164 struct dentry_operations *cache_dentry_ops;
168 #define SNAP_OP_NOOP 0
169 #define SNAP_OP_CREATE 1
170 #define SNAP_OP_MKDIR 2
171 #define SNAP_OP_UNLINK 3
172 #define SNAP_OP_RMDIR 4
173 #define SNAP_OP_CLOSE 5
174 #define SNAP_OP_SYMLINK 6
175 #define SNAP_OP_RENAME 7
176 #define SNAP_OP_SETATTR 8
177 #define SNAP_OP_LINK 9
178 #define SNAP_OP_OPEN 10
179 #define SNAP_OP_MKNOD 11
180 #define SNAP_OP_WRITE 12
181 #define SNAP_OP_RELEASE 13
184 void *(*trans_start)(struct inode *, int op);
185 void (*trans_commit)(void *handle);
188 struct snap_control_device {
189 struct list_head snap_dev_list;
192 #define D_MAXLEN 1024
194 #define SNAPSHOT_UNUSED_FLAG (1 << 0)
195 #define SNAPSHOT_GOOD_FLAG (1 << 1)
196 #define SNAPSHOT_DELETING_FLAG (1 << 2)
197 #define SNAPSHOT_BAD_FLAG (1 << 3)
204 char name[SNAP_MAX_NAMELEN];
206 /* snap ioctl data for attach: current always in first slot of this array */
207 struct snap_obd_data {
208 int snap_dev; /* which device contains the data */
209 unsigned int snap_index;/* which snapshot is ours */
210 unsigned int snap_table;/* which table do we use */
212 #define DISK_SNAPTABLE_ATTR "Snaptable"
213 #define DISK_SNAP_TABLE_MAGIC 0x1976
214 struct snap_disk_table {
217 unsigned int generation;
218 struct snap_disk snap_items[SNAP_MAX];
223 struct semaphore tbl_sema;
225 unsigned int tbl_count; /* how many snapshots exist in this table*/
226 unsigned int generation;
227 struct snap snap_items[SNAP_MAX];
230 struct snap_iterdata {
231 kdev_t dev; /* snap current device number */
237 struct snap_ioc_data {
239 char name[SNAP_MAX_NAMELEN];
242 struct snap_ino_list_data{
246 struct filter_inode_info {
247 int flags; /* the flags indicated inode type */
248 int generation; /*the inode generation*/
251 extern int currentfs_is_under_dotsnap(struct dentry *de);
254 inline void snap_free_cache(struct snap_cache *cache);
255 struct snap_cache *snap_find_cache(kdev_t dev);
256 typedef int (*snap_cache_cb_t)(struct snap_cache*, void *in, unsigned long *out);
257 int snap_cache_process(snap_cache_cb_t cb, void* in, unsigned long* out);
260 extern struct snap_table snap_tables[SNAP_MAX_TABLES];
261 void snap_last(struct snap_cache *info, struct snap *snap);
262 int snap_index2slot(struct snap_table *snap_table, int snap_index);
263 int snap_needs_cow(struct inode *);
264 int snapfs_read_snaptable(struct snap_cache *cache, int tableno);
266 int snap_is_redirector(struct inode *inode);
267 struct inode *snap_redirect(struct inode *inode, struct super_block *clone_sb);
268 int snap_do_cow(struct inode *inode, ino_t parent_ino, int del);
270 int snap_iterate(struct super_block *sb,
271 int (*repeat)(struct inode *inode, void *priv),
272 struct inode **start, void *priv, int flag);
274 struct inode *snap_get_indirect(struct inode *pri, int *table, int slot);
275 int snap_destroy_indirect(struct inode *pri, int index, struct inode *next_ind);
276 int snap_restore_indirect(struct inode *pri, int index );
277 int snap_migrate_data(struct inode *dst, struct inode *src);
278 int snap_set_indirect(struct inode *pri, ino_t ind_ino,
279 int index, ino_t parent_ino);
282 void put_snap_current_mnt(struct super_block *sb);
283 void get_snap_current_mnt(struct super_block *sb);
285 extern struct super_operations currentfs_super_ops;
286 void cleanup_filter_info_cache(void);
287 int init_filter_info_cache(void);
288 extern void init_filter_data(struct inode *inode, int flag);
289 extern void set_filter_ops(struct snap_cache *cache, struct inode *inode);
291 extern struct inode_operations currentfs_dir_iops;
292 extern struct file_operations currentfs_dir_fops;
293 extern struct address_space_operations currentfs_file_aops;
296 extern struct inode_operations currentfs_file_iops;
297 extern struct file_operations currentfs_file_fops;
300 extern struct inode_operations currentfs_sym_iops;
301 extern struct file_operations currentfs_sym_fops;
303 extern struct dentry_operations currentfs_dentry_ops;
306 extern int init_option(char *data);
307 extern void cleanup_option(void);
308 extern int get_opt(struct option **opt, char **pos);
310 #define FILTER_DID_SUPER_OPS 0x1
311 #define FILTER_DID_INODE_OPS 0x2
312 #define FILTER_DID_FILE_OPS 0x4
313 #define FILTER_DID_DENTRY_OPS 0x8
314 #define FILTER_DID_DEV_OPS 0x10
315 #define FILTER_DID_SYMLINK_OPS 0x20
316 #define FILTER_DID_DIR_OPS 0x40
317 #define FILTER_DID_SNAPSHOT_OPS 0x80
318 #define FILTER_DID_JOURNAL_OPS 0x100
322 struct filter_ops o_fops;
323 struct cache_ops o_caops;
324 struct journal_ops *o_trops;
325 struct snapshot_operations *o_snapops;
328 #define FILTER_FS_TYPES 3
329 #define FILTER_FS_EXT2 0
330 #define FILTER_FS_EXT3 1
331 #define FILTER_FS_REISER 2
332 extern struct filter_fs filter_oppar[FILTER_FS_TYPES];
333 struct filter_fs *filter_get_filter_fs(const char *cache_type);
334 inline struct super_operations *filter_c2usops(struct filter_fs *cache);
335 inline struct inode_operations *filter_c2ufiops(struct filter_fs *cache);
336 inline struct inode_operations *filter_c2udiops(struct filter_fs *cache);
337 inline struct inode_operations *filter_c2usiops(struct filter_fs *cache);
338 inline struct super_operations *filter_c2csops(struct filter_fs *cache);
339 inline struct inode_operations *filter_c2cfiops(struct filter_fs *cache);
340 inline struct inode_operations *filter_c2cdiops(struct filter_fs *cache);
341 inline struct inode_operations *filter_c2csiops(struct filter_fs *cache);
342 inline struct file_operations *filter_c2udfops(struct filter_fs *cache);
343 inline struct file_operations *filter_c2cffops(struct filter_fs *cache);
344 inline struct file_operations *filter_c2cdfops(struct filter_fs *cache);
345 inline struct file_operations *filter_c2csfops(struct filter_fs *cache);
346 inline struct file_operations *filter_c2uffops(struct filter_fs *cache);
347 inline struct file_operations *filter_c2usfops(struct filter_fs *cache);
348 inline struct dentry_operations *filter_c2cdops(struct filter_fs *cache);
349 inline struct dentry_operations *filter_c2udops(struct filter_fs *cache);
350 inline struct address_space_operations *filter_c2cfaops(struct filter_fs *cache);
351 inline struct address_space_operations *filter_c2ufaops(struct filter_fs *cache);
353 inline struct snapshot_operations *filter_c2csnapops(struct filter_fs *cache);
355 void filter_setup_file_ops(struct filter_fs *cache,
357 struct inode_operations *filter_iops,
358 struct file_operations *filter_fops,
359 struct address_space_operations *filter_aops);
361 void filter_setup_dir_ops(struct filter_fs *cache,
363 struct inode_operations *filter_iops,
364 struct file_operations *filter_fops);
366 void filter_setup_symlink_ops(struct filter_fs *cache,
368 struct inode_operations *filter_iops,
369 struct file_operations *filter_fops);
371 void filter_setup_dentry_ops(struct filter_fs *cache,
372 struct dentry_operations *cache_dop,
373 struct dentry_operations *filter_dop);
374 void filter_setup_super_ops(struct filter_fs *cache,
375 struct super_operations *cache_sops,
376 struct super_operations *filter_sops);
378 void filter_setup_snapshot_ops(struct filter_fs *cache,
379 struct snapshot_operations *cache_snapops);
380 void filter_setup_journal_ops(struct filter_fs *cache,
381 struct journal_ops *cache_journal_ops);
383 static inline void* snap_trans_start(struct snap_cache *cache,
384 struct inode *inode, int op)
386 if( cache->cache_filter->o_trops )
387 return cache->cache_filter->o_trops->trans_start(inode, op);
390 static inline void snap_trans_commit(struct snap_cache *cache, void *handle)
392 if( cache->cache_filter->o_trops )
393 cache->cache_filter->o_trops->trans_commit(handle);
396 static inline void snapfs_cpy_attrs(struct inode *dst, struct inode *src)
398 dst->i_mtime = src->i_mtime;
399 dst->i_ctime = src->i_ctime;
400 dst->i_atime = src->i_atime;
401 dst->i_size = src->i_size;
402 dst->i_blksize = src->i_blksize;
403 dst->i_blocks = src->i_blocks;
404 dst->i_generation = src->i_generation;
405 dst->i_uid = src->i_uid;
406 dst->i_gid = src->i_gid;
407 dst->i_mode = src->i_mode;
410 extern unsigned int snap_debug_failcode;
411 #ifdef CONFIG_LOOP_DISCARD
412 #define BLKDEV_FAIL(dev,fail) loop_discard_io(dev,fail)
414 #define BLKDEV_FAIL(dev,fail) set_device_ro(dev, 1)
417 static inline void snap_debug_device_fail(dev_t dev, unsigned short opcode, unsigned short pos)
419 unsigned int failcode = (opcode<<16) | pos;
421 if( failcode == snap_debug_failcode && !is_read_only(dev)){
422 printk(KERN_EMERG "set block device %s into fail mode\n", bdevname(dev));
427 #define snap_debug_device_fail(args...) do{}while(0)
430 extern int snap_debug_level;
431 extern int snap_print_entry;
434 #endif /* __LINUX_SNAPFS_H */