1 /*
2  * irel.h
3  *
4  * Copyright (C) 1996, 1997 Theodore Ts'o.
5  *
6  * %Begin-Header%
7  * This file may be redistributed under the terms of the GNU Library
8  * General Public License, version 2.
9  * %End-Header%
10  */
11 
12 struct ext2_inode_reference {
13 	blk64_t	block;
14 	__u16 offset;
15 };
16 
17 struct ext2_inode_relocate_entry {
18 	ext2_ino_t	new;
19 	ext2_ino_t	orig;
20 	__u16		flags;
21 	__u16		max_refs;
22 };
23 
24 typedef struct ext2_inode_relocation_table *ext2_irel;
25 
26 struct ext2_inode_relocation_table {
27 	__u32	magic;
28 	char	*name;
29 	ext2_ino_t	current;
30 	void	*priv_data;
31 
32 	/*
33 	 * Add an inode relocation entry.
34 	 */
35 	errcode_t (*put)(ext2_irel irel, ext2_ino_t old,
36 			      struct ext2_inode_relocate_entry *ent);
37 	/*
38 	 * Get an inode relocation entry.
39 	 */
40 	errcode_t (*get)(ext2_irel irel, ext2_ino_t old,
41 			      struct ext2_inode_relocate_entry *ent);
42 
43 	/*
44 	 * Get an inode relocation entry by its original inode number
45 	 */
46 	errcode_t (*get_by_orig)(ext2_irel irel, ext2_ino_t orig, ext2_ino_t *old,
47 				 struct ext2_inode_relocate_entry *ent);
48 
49 	/*
50 	 * Initialize for iterating over the inode relocation entries.
51 	 */
52 	errcode_t (*start_iter)(ext2_irel irel);
53 
54 	/*
55 	 * The iterator function for the inode relocation entries.
56 	 * Returns an inode number of 0 when out of entries.
57 	 */
58 	errcode_t (*next)(ext2_irel irel, ext2_ino_t *old,
59 			  struct ext2_inode_relocate_entry *ent);
60 
61 	/*
62 	 * Add an inode reference (i.e., note the fact that a
63 	 * particular block/offset contains a reference to an inode)
64 	 */
65 	errcode_t (*add_ref)(ext2_irel irel, ext2_ino_t ino,
66 			     struct ext2_inode_reference *ref);
67 
68 	/*
69 	 * Initialize for iterating over the inode references for a
70 	 * particular inode.
71 	 */
72 	errcode_t (*start_iter_ref)(ext2_irel irel, ext2_ino_t ino);
73 
74 	/*
75 	 * The iterator function for the inode references for an
76 	 * inode.  The references for only one inode can be interator
77 	 * over at a time, as the iterator state is stored in ext2_irel.
78 	 */
79 	errcode_t (*next_ref)(ext2_irel irel,
80 			      struct ext2_inode_reference *ref);
81 
82 	/*
83 	 * Move the inode relocation table from one inode number to
84 	 * another.  Note that the inode references also must move.
85 	 */
86 	errcode_t (*move)(ext2_irel irel, ext2_ino_t old, ext2_ino_t new);
87 
88 	/*
89 	 * Remove an inode relocation entry, along with all of the
90 	 * inode references.
91 	 */
92 	errcode_t (*delete)(ext2_irel irel, ext2_ino_t old);
93 
94 	/*
95 	 * Free the inode relocation table.
96 	 */
97 	errcode_t (*free)(ext2_irel irel);
98 };
99 
100 errcode_t ext2fs_irel_memarray_create(char *name, ext2_ino_t max_inode,
101 				    ext2_irel *irel);
102 
103 #define ext2fs_irel_put(irel, old, ent) ((irel)->put((irel), old, ent))
104 #define ext2fs_irel_get(irel, old, ent) ((irel)->get((irel), old, ent))
105 #define ext2fs_irel_get_by_orig(irel, orig, old, ent) \
106 			((irel)->get_by_orig((irel), orig, old, ent))
107 #define ext2fs_irel_start_iter(irel) ((irel)->start_iter((irel)))
108 #define ext2fs_irel_next(irel, old, ent) ((irel)->next((irel), old, ent))
109 #define ext2fs_irel_add_ref(irel, ino, ref) ((irel)->add_ref((irel), ino, ref))
110 #define ext2fs_irel_start_iter_ref(irel, ino) ((irel)->start_iter_ref((irel), ino))
111 #define ext2fs_irel_next_ref(irel, ref) ((irel)->next_ref((irel), ref))
112 #define ext2fs_irel_move(irel, old, new) ((irel)->move((irel), old, new))
113 #define ext2fs_irel_delete(irel, old) ((irel)->delete((irel), old))
114 #define ext2fs_irel_free(irel) ((irel)->free((irel)))
115