Blame view

fs/reiserfs/item_ops.c 18.7 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
  /*
   * Copyright 2000 by Hans Reiser, licensing governed by reiserfs/README
   */
  
  #include <linux/time.h>
  #include <linux/reiserfs_fs.h>
  
  // this contains item handlers for old item types: sd, direct,
  // indirect, directory
  
  /* and where are the comments? how about saying where we can find an
     explanation of each item handler method? -Hans */
  
  //////////////////////////////////////////////////////////////////////////////
  // stat data functions
  //
bd4c625c0   Linus Torvalds   reiserfs: run scr...
17
  static int sd_bytes_number(struct item_head *ih, int block_size)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
18
  {
bd4c625c0   Linus Torvalds   reiserfs: run scr...
19
  	return 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
20
  }
bd4c625c0   Linus Torvalds   reiserfs: run scr...
21
  static void sd_decrement_key(struct cpu_key *key)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
22
  {
bd4c625c0   Linus Torvalds   reiserfs: run scr...
23
24
  	key->on_disk_key.k_objectid--;
  	set_cpu_key_k_type(key, TYPE_ANY);
6d205f120   Vladimir Saveliev   [PATCH] reiserfs:...
25
  	set_cpu_key_k_offset(key, (loff_t)(~0ULL >> 1));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
26
  }
bd4c625c0   Linus Torvalds   reiserfs: run scr...
27
  static int sd_is_left_mergeable(struct reiserfs_key *key, unsigned long bsize)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
28
  {
bd4c625c0   Linus Torvalds   reiserfs: run scr...
29
  	return 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
30
  }
bd4c625c0   Linus Torvalds   reiserfs: run scr...
31
  static char *print_time(time_t t)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
32
  {
bd4c625c0   Linus Torvalds   reiserfs: run scr...
33
  	static char timebuf[256];
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
34

bd4c625c0   Linus Torvalds   reiserfs: run scr...
35
36
  	sprintf(timebuf, "%ld", t);
  	return timebuf;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
37
  }
bd4c625c0   Linus Torvalds   reiserfs: run scr...
38
  static void sd_print_item(struct item_head *ih, char *item)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
39
  {
bd4c625c0   Linus Torvalds   reiserfs: run scr...
40
41
42
43
  	printk("\tmode | size | nlinks | first direct | mtime
  ");
  	if (stat_data_v1(ih)) {
  		struct stat_data_v1 *sd = (struct stat_data_v1 *)item;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
44

bd4c625c0   Linus Torvalds   reiserfs: run scr...
45
46
47
48
49
50
51
  		printk("\t0%-6o | %6u | %2u | %d | %s
  ", sd_v1_mode(sd),
  		       sd_v1_size(sd), sd_v1_nlink(sd),
  		       sd_v1_first_direct_byte(sd),
  		       print_time(sd_v1_mtime(sd)));
  	} else {
  		struct stat_data *sd = (struct stat_data *)item;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
52

bd4c625c0   Linus Torvalds   reiserfs: run scr...
53
54
55
56
57
  		printk("\t0%-6o | %6Lu | %2u | %d | %s
  ", sd_v2_mode(sd),
  		       (unsigned long long)sd_v2_size(sd), sd_v2_nlink(sd),
  		       sd_v2_rdev(sd), print_time(sd_v2_mtime(sd)));
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
58
  }
bd4c625c0   Linus Torvalds   reiserfs: run scr...
59
  static void sd_check_item(struct item_head *ih, char *item)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
60
  {
bd4c625c0   Linus Torvalds   reiserfs: run scr...
61
  	// FIXME: type something here!
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
62
  }
bd4c625c0   Linus Torvalds   reiserfs: run scr...
63
64
65
  static int sd_create_vi(struct virtual_node *vn,
  			struct virtual_item *vi,
  			int is_affected, int insert_size)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
66
  {
bd4c625c0   Linus Torvalds   reiserfs: run scr...
67
68
69
  	vi->vi_index = TYPE_STAT_DATA;
  	//vi->vi_type |= VI_TYPE_STAT_DATA;// not needed?
  	return 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
70
  }
bd4c625c0   Linus Torvalds   reiserfs: run scr...
71
72
  static int sd_check_left(struct virtual_item *vi, int free,
  			 int start_skip, int end_skip)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
73
  {
14a61442c   Eric Sesterhenn   BUG_ON conversion...
74
  	BUG_ON(start_skip || end_skip);
bd4c625c0   Linus Torvalds   reiserfs: run scr...
75
  	return -1;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
76
  }
bd4c625c0   Linus Torvalds   reiserfs: run scr...
77
  static int sd_check_right(struct virtual_item *vi, int free)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
78
  {
bd4c625c0   Linus Torvalds   reiserfs: run scr...
79
  	return -1;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
80
  }
bd4c625c0   Linus Torvalds   reiserfs: run scr...
81
  static int sd_part_size(struct virtual_item *vi, int first, int count)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
82
  {
14a61442c   Eric Sesterhenn   BUG_ON conversion...
83
  	BUG_ON(count);
bd4c625c0   Linus Torvalds   reiserfs: run scr...
84
  	return 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
85
  }
bd4c625c0   Linus Torvalds   reiserfs: run scr...
86
  static int sd_unit_num(struct virtual_item *vi)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
87
  {
bd4c625c0   Linus Torvalds   reiserfs: run scr...
88
  	return vi->vi_item_len - IH_SIZE;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
89
  }
bd4c625c0   Linus Torvalds   reiserfs: run scr...
90
  static void sd_print_vi(struct virtual_item *vi)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
91
  {
45b03d5e8   Jeff Mahoney   reiserfs: rework ...
92
93
  	reiserfs_warning(NULL, "reiserfs-16100",
  			 "STATDATA, index %d, type 0x%x, %h",
bd4c625c0   Linus Torvalds   reiserfs: run scr...
94
  			 vi->vi_index, vi->vi_type, vi->vi_ih);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
95
96
97
  }
  
  static struct item_operations stat_data_ops = {
bd4c625c0   Linus Torvalds   reiserfs: run scr...
98
99
100
101
102
103
104
105
106
107
108
109
  	.bytes_number = sd_bytes_number,
  	.decrement_key = sd_decrement_key,
  	.is_left_mergeable = sd_is_left_mergeable,
  	.print_item = sd_print_item,
  	.check_item = sd_check_item,
  
  	.create_vi = sd_create_vi,
  	.check_left = sd_check_left,
  	.check_right = sd_check_right,
  	.part_size = sd_part_size,
  	.unit_num = sd_unit_num,
  	.print_vi = sd_print_vi
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
110
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
111
112
113
  //////////////////////////////////////////////////////////////////////////////
  // direct item functions
  //
bd4c625c0   Linus Torvalds   reiserfs: run scr...
114
  static int direct_bytes_number(struct item_head *ih, int block_size)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
115
  {
bd4c625c0   Linus Torvalds   reiserfs: run scr...
116
  	return ih_item_len(ih);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
117
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
118
  // FIXME: this should probably switch to indirect as well
bd4c625c0   Linus Torvalds   reiserfs: run scr...
119
  static void direct_decrement_key(struct cpu_key *key)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
120
  {
bd4c625c0   Linus Torvalds   reiserfs: run scr...
121
122
123
  	cpu_key_k_offset_dec(key);
  	if (cpu_key_k_offset(key) == 0)
  		set_cpu_key_k_type(key, TYPE_STAT_DATA);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
124
  }
bd4c625c0   Linus Torvalds   reiserfs: run scr...
125
126
  static int direct_is_left_mergeable(struct reiserfs_key *key,
  				    unsigned long bsize)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
127
  {
bd4c625c0   Linus Torvalds   reiserfs: run scr...
128
129
  	int version = le_key_version(key);
  	return ((le_key_k_offset(version, key) & (bsize - 1)) != 1);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
130
  }
bd4c625c0   Linus Torvalds   reiserfs: run scr...
131
  static void direct_print_item(struct item_head *ih, char *item)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
132
  {
bd4c625c0   Linus Torvalds   reiserfs: run scr...
133
  	int j = 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
134
135
  
  //    return;
bd4c625c0   Linus Torvalds   reiserfs: run scr...
136
137
138
139
140
  	printk("\"");
  	while (j < ih_item_len(ih))
  		printk("%c", item[j++]);
  	printk("\"
  ");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
141
  }
bd4c625c0   Linus Torvalds   reiserfs: run scr...
142
  static void direct_check_item(struct item_head *ih, char *item)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
143
  {
bd4c625c0   Linus Torvalds   reiserfs: run scr...
144
  	// FIXME: type something here!
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
145
  }
bd4c625c0   Linus Torvalds   reiserfs: run scr...
146
147
148
  static int direct_create_vi(struct virtual_node *vn,
  			    struct virtual_item *vi,
  			    int is_affected, int insert_size)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
149
  {
bd4c625c0   Linus Torvalds   reiserfs: run scr...
150
151
152
  	vi->vi_index = TYPE_DIRECT;
  	//vi->vi_type |= VI_TYPE_DIRECT;
  	return 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
153
  }
bd4c625c0   Linus Torvalds   reiserfs: run scr...
154
155
  static int direct_check_left(struct virtual_item *vi, int free,
  			     int start_skip, int end_skip)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
156
  {
bd4c625c0   Linus Torvalds   reiserfs: run scr...
157
  	int bytes;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
158

bd4c625c0   Linus Torvalds   reiserfs: run scr...
159
160
  	bytes = free - free % 8;
  	return bytes ? : -1;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
161
  }
bd4c625c0   Linus Torvalds   reiserfs: run scr...
162
  static int direct_check_right(struct virtual_item *vi, int free)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
163
  {
bd4c625c0   Linus Torvalds   reiserfs: run scr...
164
  	return direct_check_left(vi, free, 0, 0);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
165
  }
bd4c625c0   Linus Torvalds   reiserfs: run scr...
166
  static int direct_part_size(struct virtual_item *vi, int first, int count)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
167
  {
bd4c625c0   Linus Torvalds   reiserfs: run scr...
168
  	return count;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
169
  }
bd4c625c0   Linus Torvalds   reiserfs: run scr...
170
  static int direct_unit_num(struct virtual_item *vi)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
171
  {
bd4c625c0   Linus Torvalds   reiserfs: run scr...
172
  	return vi->vi_item_len - IH_SIZE;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
173
  }
bd4c625c0   Linus Torvalds   reiserfs: run scr...
174
  static void direct_print_vi(struct virtual_item *vi)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
175
  {
45b03d5e8   Jeff Mahoney   reiserfs: rework ...
176
177
  	reiserfs_warning(NULL, "reiserfs-16101",
  			 "DIRECT, index %d, type 0x%x, %h",
bd4c625c0   Linus Torvalds   reiserfs: run scr...
178
  			 vi->vi_index, vi->vi_type, vi->vi_ih);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
179
180
181
  }
  
  static struct item_operations direct_ops = {
bd4c625c0   Linus Torvalds   reiserfs: run scr...
182
183
184
185
186
187
188
189
190
191
192
193
  	.bytes_number = direct_bytes_number,
  	.decrement_key = direct_decrement_key,
  	.is_left_mergeable = direct_is_left_mergeable,
  	.print_item = direct_print_item,
  	.check_item = direct_check_item,
  
  	.create_vi = direct_create_vi,
  	.check_left = direct_check_left,
  	.check_right = direct_check_right,
  	.part_size = direct_part_size,
  	.unit_num = direct_unit_num,
  	.print_vi = direct_print_vi
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
194
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
195
196
197
  //////////////////////////////////////////////////////////////////////////////
  // indirect item functions
  //
bd4c625c0   Linus Torvalds   reiserfs: run scr...
198
  static int indirect_bytes_number(struct item_head *ih, int block_size)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
199
  {
bd4c625c0   Linus Torvalds   reiserfs: run scr...
200
  	return ih_item_len(ih) / UNFM_P_SIZE * block_size;	//- get_ih_free_space (ih);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
201
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
202
  // decrease offset, if it becomes 0, change type to stat data
bd4c625c0   Linus Torvalds   reiserfs: run scr...
203
  static void indirect_decrement_key(struct cpu_key *key)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
204
  {
bd4c625c0   Linus Torvalds   reiserfs: run scr...
205
206
207
  	cpu_key_k_offset_dec(key);
  	if (cpu_key_k_offset(key) == 0)
  		set_cpu_key_k_type(key, TYPE_STAT_DATA);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
208
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
209
  // if it is not first item of the body, then it is mergeable
bd4c625c0   Linus Torvalds   reiserfs: run scr...
210
211
  static int indirect_is_left_mergeable(struct reiserfs_key *key,
  				      unsigned long bsize)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
212
  {
bd4c625c0   Linus Torvalds   reiserfs: run scr...
213
214
  	int version = le_key_version(key);
  	return (le_key_k_offset(version, key) != 1);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
215
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
216
  // printing of indirect item
bd4c625c0   Linus Torvalds   reiserfs: run scr...
217
  static void start_new_sequence(__u32 * start, int *len, __u32 new)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
218
  {
bd4c625c0   Linus Torvalds   reiserfs: run scr...
219
220
  	*start = new;
  	*len = 1;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
221
  }
bd4c625c0   Linus Torvalds   reiserfs: run scr...
222
  static int sequence_finished(__u32 start, int *len, __u32 new)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
223
  {
bd4c625c0   Linus Torvalds   reiserfs: run scr...
224
225
  	if (start == INT_MAX)
  		return 1;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
226

bd4c625c0   Linus Torvalds   reiserfs: run scr...
227
228
229
230
231
232
233
234
235
  	if (start == 0 && new == 0) {
  		(*len)++;
  		return 0;
  	}
  	if (start != 0 && (start + *len) == new) {
  		(*len)++;
  		return 0;
  	}
  	return 1;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
236
  }
bd4c625c0   Linus Torvalds   reiserfs: run scr...
237
  static void print_sequence(__u32 start, int len)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
238
  {
bd4c625c0   Linus Torvalds   reiserfs: run scr...
239
240
  	if (start == INT_MAX)
  		return;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
241

bd4c625c0   Linus Torvalds   reiserfs: run scr...
242
243
244
245
  	if (len == 1)
  		printk(" %d", start);
  	else
  		printk(" %d(%d)", start, len);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
246
  }
bd4c625c0   Linus Torvalds   reiserfs: run scr...
247
  static void indirect_print_item(struct item_head *ih, char *item)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
248
  {
bd4c625c0   Linus Torvalds   reiserfs: run scr...
249
250
251
  	int j;
  	__le32 *unp;
  	__u32 prev = INT_MAX;
d5ee4ea83   Benoit Boissinot   [PATCH] indirect_...
252
  	int num = 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
253

bd4c625c0   Linus Torvalds   reiserfs: run scr...
254
  	unp = (__le32 *) item;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
255

bd4c625c0   Linus Torvalds   reiserfs: run scr...
256
  	if (ih_item_len(ih) % UNFM_P_SIZE)
45b03d5e8   Jeff Mahoney   reiserfs: rework ...
257
  		reiserfs_warning(NULL, "reiserfs-16102", "invalid item len");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
258

bd4c625c0   Linus Torvalds   reiserfs: run scr...
259
260
261
262
263
264
265
  	printk("%d pointers
  [ ", (int)I_UNFM_NUM(ih));
  	for (j = 0; j < I_UNFM_NUM(ih); j++) {
  		if (sequence_finished(prev, &num, get_block_num(unp, j))) {
  			print_sequence(prev, num);
  			start_new_sequence(&prev, &num, get_block_num(unp, j));
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
266
  	}
bd4c625c0   Linus Torvalds   reiserfs: run scr...
267
268
269
  	print_sequence(prev, num);
  	printk("]
  ");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
270
  }
bd4c625c0   Linus Torvalds   reiserfs: run scr...
271
  static void indirect_check_item(struct item_head *ih, char *item)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
272
  {
bd4c625c0   Linus Torvalds   reiserfs: run scr...
273
  	// FIXME: type something here!
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
274
  }
bd4c625c0   Linus Torvalds   reiserfs: run scr...
275
276
277
  static int indirect_create_vi(struct virtual_node *vn,
  			      struct virtual_item *vi,
  			      int is_affected, int insert_size)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
278
  {
bd4c625c0   Linus Torvalds   reiserfs: run scr...
279
280
281
  	vi->vi_index = TYPE_INDIRECT;
  	//vi->vi_type |= VI_TYPE_INDIRECT;
  	return 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
282
  }
bd4c625c0   Linus Torvalds   reiserfs: run scr...
283
284
  static int indirect_check_left(struct virtual_item *vi, int free,
  			       int start_skip, int end_skip)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
285
  {
bd4c625c0   Linus Torvalds   reiserfs: run scr...
286
  	int bytes;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
287

bd4c625c0   Linus Torvalds   reiserfs: run scr...
288
289
  	bytes = free - free % UNFM_P_SIZE;
  	return bytes ? : -1;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
290
  }
bd4c625c0   Linus Torvalds   reiserfs: run scr...
291
  static int indirect_check_right(struct virtual_item *vi, int free)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
292
  {
bd4c625c0   Linus Torvalds   reiserfs: run scr...
293
  	return indirect_check_left(vi, free, 0, 0);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
294
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
295
  // return size in bytes of 'units' units. If first == 0 - calculate from the head (left), otherwise - from tail (right)
bd4c625c0   Linus Torvalds   reiserfs: run scr...
296
  static int indirect_part_size(struct virtual_item *vi, int first, int units)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
297
  {
bd4c625c0   Linus Torvalds   reiserfs: run scr...
298
299
  	// unit of indirect item is byte (yet)
  	return units;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
300
  }
bd4c625c0   Linus Torvalds   reiserfs: run scr...
301
  static int indirect_unit_num(struct virtual_item *vi)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
302
  {
bd4c625c0   Linus Torvalds   reiserfs: run scr...
303
304
  	// unit of indirect item is byte (yet)
  	return vi->vi_item_len - IH_SIZE;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
305
  }
bd4c625c0   Linus Torvalds   reiserfs: run scr...
306
  static void indirect_print_vi(struct virtual_item *vi)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
307
  {
45b03d5e8   Jeff Mahoney   reiserfs: rework ...
308
309
  	reiserfs_warning(NULL, "reiserfs-16103",
  			 "INDIRECT, index %d, type 0x%x, %h",
bd4c625c0   Linus Torvalds   reiserfs: run scr...
310
  			 vi->vi_index, vi->vi_type, vi->vi_ih);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
311
312
313
  }
  
  static struct item_operations indirect_ops = {
bd4c625c0   Linus Torvalds   reiserfs: run scr...
314
315
316
317
318
319
320
321
322
323
324
325
  	.bytes_number = indirect_bytes_number,
  	.decrement_key = indirect_decrement_key,
  	.is_left_mergeable = indirect_is_left_mergeable,
  	.print_item = indirect_print_item,
  	.check_item = indirect_check_item,
  
  	.create_vi = indirect_create_vi,
  	.check_left = indirect_check_left,
  	.check_right = indirect_check_right,
  	.part_size = indirect_part_size,
  	.unit_num = indirect_unit_num,
  	.print_vi = indirect_print_vi
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
326
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
327
328
329
  //////////////////////////////////////////////////////////////////////////////
  // direntry functions
  //
bd4c625c0   Linus Torvalds   reiserfs: run scr...
330
  static int direntry_bytes_number(struct item_head *ih, int block_size)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
331
  {
45b03d5e8   Jeff Mahoney   reiserfs: rework ...
332
  	reiserfs_warning(NULL, "vs-16090",
bd4c625c0   Linus Torvalds   reiserfs: run scr...
333
334
  			 "bytes number is asked for direntry");
  	return 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
335
  }
bd4c625c0   Linus Torvalds   reiserfs: run scr...
336
  static void direntry_decrement_key(struct cpu_key *key)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
337
  {
bd4c625c0   Linus Torvalds   reiserfs: run scr...
338
339
340
  	cpu_key_k_offset_dec(key);
  	if (cpu_key_k_offset(key) == 0)
  		set_cpu_key_k_type(key, TYPE_STAT_DATA);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
341
  }
bd4c625c0   Linus Torvalds   reiserfs: run scr...
342
343
  static int direntry_is_left_mergeable(struct reiserfs_key *key,
  				      unsigned long bsize)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
344
  {
bd4c625c0   Linus Torvalds   reiserfs: run scr...
345
346
347
  	if (le32_to_cpu(key->u.k_offset_v1.k_offset) == DOT_OFFSET)
  		return 0;
  	return 1;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
348

bd4c625c0   Linus Torvalds   reiserfs: run scr...
349
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
350

bd4c625c0   Linus Torvalds   reiserfs: run scr...
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
  static void direntry_print_item(struct item_head *ih, char *item)
  {
  	int i;
  	int namelen;
  	struct reiserfs_de_head *deh;
  	char *name;
  	static char namebuf[80];
  
  	printk("
   # %-15s%-30s%-15s%-15s%-15s
  ", "Name",
  	       "Key of pointed object", "Hash", "Gen number", "Status");
  
  	deh = (struct reiserfs_de_head *)item;
  
  	for (i = 0; i < I_ENTRY_COUNT(ih); i++, deh++) {
  		namelen =
  		    (i ? (deh_location(deh - 1)) : ih_item_len(ih)) -
  		    deh_location(deh);
  		name = item + deh_location(deh);
  		if (name[namelen - 1] == 0)
  			namelen = strlen(name);
  		namebuf[0] = '"';
  		if (namelen > sizeof(namebuf) - 3) {
  			strncpy(namebuf + 1, name, sizeof(namebuf) - 3);
  			namebuf[sizeof(namebuf) - 2] = '"';
  			namebuf[sizeof(namebuf) - 1] = 0;
  		} else {
  			memcpy(namebuf + 1, name, namelen);
  			namebuf[namelen + 1] = '"';
  			namebuf[namelen + 2] = 0;
  		}
  
  		printk("%d:  %-15s%-15d%-15d%-15Ld%-15Ld(%s)
  ",
  		       i, namebuf,
  		       deh_dir_id(deh), deh_objectid(deh),
  		       GET_HASH_VALUE(deh_offset(deh)),
  		       GET_GENERATION_NUMBER((deh_offset(deh))),
  		       (de_hidden(deh)) ? "HIDDEN" : "VISIBLE");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
391
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
392
  }
bd4c625c0   Linus Torvalds   reiserfs: run scr...
393
  static void direntry_check_item(struct item_head *ih, char *item)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
394
  {
bd4c625c0   Linus Torvalds   reiserfs: run scr...
395
396
  	int i;
  	struct reiserfs_de_head *deh;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
397

bd4c625c0   Linus Torvalds   reiserfs: run scr...
398
399
400
401
402
  	// FIXME: type something here!
  	deh = (struct reiserfs_de_head *)item;
  	for (i = 0; i < I_ENTRY_COUNT(ih); i++, deh++) {
  		;
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
403
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
404
405
406
407
408
  #define DIRENTRY_VI_FIRST_DIRENTRY_ITEM 1
  
  /*
   * function returns old entry number in directory item in real node
   * using new entry number in virtual item in virtual node */
bd4c625c0   Linus Torvalds   reiserfs: run scr...
409
410
  static inline int old_entry_num(int is_affected, int virtual_entry_num,
  				int pos_in_item, int mode)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
411
  {
bd4c625c0   Linus Torvalds   reiserfs: run scr...
412
413
  	if (mode == M_INSERT || mode == M_DELETE)
  		return virtual_entry_num;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
414

bd4c625c0   Linus Torvalds   reiserfs: run scr...
415
416
417
  	if (!is_affected)
  		/* cut or paste is applied to another item */
  		return virtual_entry_num;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
418

bd4c625c0   Linus Torvalds   reiserfs: run scr...
419
420
  	if (virtual_entry_num < pos_in_item)
  		return virtual_entry_num;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
421

bd4c625c0   Linus Torvalds   reiserfs: run scr...
422
423
  	if (mode == M_CUT)
  		return virtual_entry_num + 1;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
424

bd4c625c0   Linus Torvalds   reiserfs: run scr...
425
426
427
  	RFALSE(mode != M_PASTE || virtual_entry_num == 0,
  	       "vs-8015: old_entry_num: mode must be M_PASTE (mode = \'%c\'",
  	       mode);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
428

bd4c625c0   Linus Torvalds   reiserfs: run scr...
429
430
  	return virtual_entry_num - 1;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
431
432
433
434
  
  /* Create an array of sizes of directory entries for virtual
     item. Return space used by an item. FIXME: no control over
     consuming of space used by this item handler */
bd4c625c0   Linus Torvalds   reiserfs: run scr...
435
436
437
438
439
440
441
442
  static int direntry_create_vi(struct virtual_node *vn,
  			      struct virtual_item *vi,
  			      int is_affected, int insert_size)
  {
  	struct direntry_uarea *dir_u = vi->vi_uarea;
  	int i, j;
  	int size = sizeof(struct direntry_uarea);
  	struct reiserfs_de_head *deh;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
443

bd4c625c0   Linus Torvalds   reiserfs: run scr...
444
  	vi->vi_index = TYPE_DIRENTRY;
14a61442c   Eric Sesterhenn   BUG_ON conversion...
445
  	BUG_ON(!(vi->vi_ih) || !vi->vi_item);
bd4c625c0   Linus Torvalds   reiserfs: run scr...
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
  
  	dir_u->flags = 0;
  	if (le_ih_k_offset(vi->vi_ih) == DOT_OFFSET)
  		dir_u->flags |= DIRENTRY_VI_FIRST_DIRENTRY_ITEM;
  
  	deh = (struct reiserfs_de_head *)(vi->vi_item);
  
  	/* virtual directory item have this amount of entry after */
  	dir_u->entry_count = ih_entry_count(vi->vi_ih) +
  	    ((is_affected) ? ((vn->vn_mode == M_CUT) ? -1 :
  			      (vn->vn_mode == M_PASTE ? 1 : 0)) : 0);
  
  	for (i = 0; i < dir_u->entry_count; i++) {
  		j = old_entry_num(is_affected, i, vn->vn_pos_in_item,
  				  vn->vn_mode);
  		dir_u->entry_sizes[i] =
  		    (j ? deh_location(&(deh[j - 1])) : ih_item_len(vi->vi_ih)) -
  		    deh_location(&(deh[j])) + DEH_SIZE;
  	}
  
  	size += (dir_u->entry_count * sizeof(short));
  
  	/* set size of pasted entry */
  	if (is_affected && vn->vn_mode == M_PASTE)
  		dir_u->entry_sizes[vn->vn_pos_in_item] = insert_size;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
471
472
  
  #ifdef CONFIG_REISERFS_CHECK
bd4c625c0   Linus Torvalds   reiserfs: run scr...
473
474
475
476
477
478
479
480
481
482
483
484
  	/* compare total size of entries with item length */
  	{
  		int k, l;
  
  		l = 0;
  		for (k = 0; k < dir_u->entry_count; k++)
  			l += dir_u->entry_sizes[k];
  
  		if (l + IH_SIZE != vi->vi_item_len +
  		    ((is_affected
  		      && (vn->vn_mode == M_PASTE
  			  || vn->vn_mode == M_CUT)) ? insert_size : 0)) {
c3a9c2109   Jeff Mahoney   reiserfs: rework ...
485
486
487
  			reiserfs_panic(NULL, "vs-8025", "(mode==%c, "
  				       "insert_size==%d), invalid length of "
  				       "directory item",
bd4c625c0   Linus Torvalds   reiserfs: run scr...
488
489
  				       vn->vn_mode, insert_size);
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
490
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
491
  #endif
bd4c625c0   Linus Torvalds   reiserfs: run scr...
492
  	return size;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
493
494
  
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
495
496
497
498
  //
  // return number of entries which may fit into specified amount of
  // free space, or -1 if free space is not enough even for 1 entry
  //
bd4c625c0   Linus Torvalds   reiserfs: run scr...
499
500
  static int direntry_check_left(struct virtual_item *vi, int free,
  			       int start_skip, int end_skip)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
501
  {
bd4c625c0   Linus Torvalds   reiserfs: run scr...
502
503
504
  	int i;
  	int entries = 0;
  	struct direntry_uarea *dir_u = vi->vi_uarea;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
505

bd4c625c0   Linus Torvalds   reiserfs: run scr...
506
507
508
509
  	for (i = start_skip; i < dir_u->entry_count - end_skip; i++) {
  		if (dir_u->entry_sizes[i] > free)
  			/* i-th entry doesn't fit into the remaining free space */
  			break;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
510

bd4c625c0   Linus Torvalds   reiserfs: run scr...
511
512
513
  		free -= dir_u->entry_sizes[i];
  		entries++;
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
514

bd4c625c0   Linus Torvalds   reiserfs: run scr...
515
  	if (entries == dir_u->entry_count) {
c3a9c2109   Jeff Mahoney   reiserfs: rework ...
516
517
  		reiserfs_panic(NULL, "item_ops-1",
  			       "free space %d, entry_count %d", free,
bd4c625c0   Linus Torvalds   reiserfs: run scr...
518
519
  			       dir_u->entry_count);
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
520

bd4c625c0   Linus Torvalds   reiserfs: run scr...
521
522
523
524
  	/* "." and ".." can not be separated from each other */
  	if (start_skip == 0 && (dir_u->flags & DIRENTRY_VI_FIRST_DIRENTRY_ITEM)
  	    && entries < 2)
  		entries = 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
525

bd4c625c0   Linus Torvalds   reiserfs: run scr...
526
527
528
529
  	return entries ? : -1;
  }
  
  static int direntry_check_right(struct virtual_item *vi, int free)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
530
  {
bd4c625c0   Linus Torvalds   reiserfs: run scr...
531
532
533
  	int i;
  	int entries = 0;
  	struct direntry_uarea *dir_u = vi->vi_uarea;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
534

bd4c625c0   Linus Torvalds   reiserfs: run scr...
535
536
537
538
  	for (i = dir_u->entry_count - 1; i >= 0; i--) {
  		if (dir_u->entry_sizes[i] > free)
  			/* i-th entry doesn't fit into the remaining free space */
  			break;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
539

bd4c625c0   Linus Torvalds   reiserfs: run scr...
540
541
542
  		free -= dir_u->entry_sizes[i];
  		entries++;
  	}
14a61442c   Eric Sesterhenn   BUG_ON conversion...
543
  	BUG_ON(entries == dir_u->entry_count);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
544

bd4c625c0   Linus Torvalds   reiserfs: run scr...
545
546
547
548
549
550
551
  	/* "." and ".." can not be separated from each other */
  	if ((dir_u->flags & DIRENTRY_VI_FIRST_DIRENTRY_ITEM)
  	    && entries > dir_u->entry_count - 2)
  		entries = dir_u->entry_count - 2;
  
  	return entries ? : -1;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
552
553
  
  /* sum of entry sizes between from-th and to-th entries including both edges */
bd4c625c0   Linus Torvalds   reiserfs: run scr...
554
  static int direntry_part_size(struct virtual_item *vi, int first, int count)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
555
  {
bd4c625c0   Linus Torvalds   reiserfs: run scr...
556
557
558
  	int i, retval;
  	int from, to;
  	struct direntry_uarea *dir_u = vi->vi_uarea;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
559

bd4c625c0   Linus Torvalds   reiserfs: run scr...
560
561
562
563
564
565
  	retval = 0;
  	if (first == 0)
  		from = 0;
  	else
  		from = dir_u->entry_count - count;
  	to = from + count - 1;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
566

bd4c625c0   Linus Torvalds   reiserfs: run scr...
567
568
  	for (i = from; i <= to; i++)
  		retval += dir_u->entry_sizes[i];
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
569

bd4c625c0   Linus Torvalds   reiserfs: run scr...
570
  	return retval;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
571
  }
bd4c625c0   Linus Torvalds   reiserfs: run scr...
572
573
574
  static int direntry_unit_num(struct virtual_item *vi)
  {
  	struct direntry_uarea *dir_u = vi->vi_uarea;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
575

bd4c625c0   Linus Torvalds   reiserfs: run scr...
576
577
  	return dir_u->entry_count;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
578

bd4c625c0   Linus Torvalds   reiserfs: run scr...
579
  static void direntry_print_vi(struct virtual_item *vi)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
580
  {
bd4c625c0   Linus Torvalds   reiserfs: run scr...
581
582
  	int i;
  	struct direntry_uarea *dir_u = vi->vi_uarea;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
583

45b03d5e8   Jeff Mahoney   reiserfs: rework ...
584
585
  	reiserfs_warning(NULL, "reiserfs-16104",
  			 "DIRENTRY, index %d, type 0x%x, %h, flags 0x%x",
bd4c625c0   Linus Torvalds   reiserfs: run scr...
586
587
588
589
590
591
  			 vi->vi_index, vi->vi_type, vi->vi_ih, dir_u->flags);
  	printk("%d entries: ", dir_u->entry_count);
  	for (i = 0; i < dir_u->entry_count; i++)
  		printk("%d ", dir_u->entry_sizes[i]);
  	printk("
  ");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
592
593
594
  }
  
  static struct item_operations direntry_ops = {
bd4c625c0   Linus Torvalds   reiserfs: run scr...
595
596
597
598
599
600
601
602
603
604
605
606
  	.bytes_number = direntry_bytes_number,
  	.decrement_key = direntry_decrement_key,
  	.is_left_mergeable = direntry_is_left_mergeable,
  	.print_item = direntry_print_item,
  	.check_item = direntry_check_item,
  
  	.create_vi = direntry_create_vi,
  	.check_left = direntry_check_left,
  	.check_right = direntry_check_right,
  	.part_size = direntry_part_size,
  	.unit_num = direntry_unit_num,
  	.print_vi = direntry_print_vi
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
607
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
608
609
610
  //////////////////////////////////////////////////////////////////////////////
  // Error catching functions to catch errors caused by incorrect item types.
  //
bd4c625c0   Linus Torvalds   reiserfs: run scr...
611
  static int errcatch_bytes_number(struct item_head *ih, int block_size)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
612
  {
45b03d5e8   Jeff Mahoney   reiserfs: rework ...
613
614
  	reiserfs_warning(NULL, "green-16001",
  			 "Invalid item type observed, run fsck ASAP");
bd4c625c0   Linus Torvalds   reiserfs: run scr...
615
  	return 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
616
  }
bd4c625c0   Linus Torvalds   reiserfs: run scr...
617
  static void errcatch_decrement_key(struct cpu_key *key)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
618
  {
45b03d5e8   Jeff Mahoney   reiserfs: rework ...
619
620
  	reiserfs_warning(NULL, "green-16002",
  			 "Invalid item type observed, run fsck ASAP");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
621
  }
bd4c625c0   Linus Torvalds   reiserfs: run scr...
622
623
  static int errcatch_is_left_mergeable(struct reiserfs_key *key,
  				      unsigned long bsize)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
624
  {
45b03d5e8   Jeff Mahoney   reiserfs: rework ...
625
626
  	reiserfs_warning(NULL, "green-16003",
  			 "Invalid item type observed, run fsck ASAP");
bd4c625c0   Linus Torvalds   reiserfs: run scr...
627
  	return 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
628
  }
bd4c625c0   Linus Torvalds   reiserfs: run scr...
629
  static void errcatch_print_item(struct item_head *ih, char *item)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
630
  {
45b03d5e8   Jeff Mahoney   reiserfs: rework ...
631
632
  	reiserfs_warning(NULL, "green-16004",
  			 "Invalid item type observed, run fsck ASAP");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
633
  }
bd4c625c0   Linus Torvalds   reiserfs: run scr...
634
  static void errcatch_check_item(struct item_head *ih, char *item)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
635
  {
45b03d5e8   Jeff Mahoney   reiserfs: rework ...
636
637
  	reiserfs_warning(NULL, "green-16005",
  			 "Invalid item type observed, run fsck ASAP");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
638
  }
bd4c625c0   Linus Torvalds   reiserfs: run scr...
639
640
641
  static int errcatch_create_vi(struct virtual_node *vn,
  			      struct virtual_item *vi,
  			      int is_affected, int insert_size)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
642
  {
45b03d5e8   Jeff Mahoney   reiserfs: rework ...
643
644
  	reiserfs_warning(NULL, "green-16006",
  			 "Invalid item type observed, run fsck ASAP");
bd4c625c0   Linus Torvalds   reiserfs: run scr...
645
646
  	return 0;		// We might return -1 here as well, but it won't help as create_virtual_node() from where
  	// this operation is called from is of return type void.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
647
  }
bd4c625c0   Linus Torvalds   reiserfs: run scr...
648
649
  static int errcatch_check_left(struct virtual_item *vi, int free,
  			       int start_skip, int end_skip)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
650
  {
45b03d5e8   Jeff Mahoney   reiserfs: rework ...
651
652
  	reiserfs_warning(NULL, "green-16007",
  			 "Invalid item type observed, run fsck ASAP");
bd4c625c0   Linus Torvalds   reiserfs: run scr...
653
  	return -1;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
654
  }
bd4c625c0   Linus Torvalds   reiserfs: run scr...
655
  static int errcatch_check_right(struct virtual_item *vi, int free)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
656
  {
45b03d5e8   Jeff Mahoney   reiserfs: rework ...
657
658
  	reiserfs_warning(NULL, "green-16008",
  			 "Invalid item type observed, run fsck ASAP");
bd4c625c0   Linus Torvalds   reiserfs: run scr...
659
  	return -1;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
660
  }
bd4c625c0   Linus Torvalds   reiserfs: run scr...
661
  static int errcatch_part_size(struct virtual_item *vi, int first, int count)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
662
  {
45b03d5e8   Jeff Mahoney   reiserfs: rework ...
663
664
  	reiserfs_warning(NULL, "green-16009",
  			 "Invalid item type observed, run fsck ASAP");
bd4c625c0   Linus Torvalds   reiserfs: run scr...
665
  	return 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
666
  }
bd4c625c0   Linus Torvalds   reiserfs: run scr...
667
  static int errcatch_unit_num(struct virtual_item *vi)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
668
  {
45b03d5e8   Jeff Mahoney   reiserfs: rework ...
669
670
  	reiserfs_warning(NULL, "green-16010",
  			 "Invalid item type observed, run fsck ASAP");
bd4c625c0   Linus Torvalds   reiserfs: run scr...
671
  	return 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
672
  }
bd4c625c0   Linus Torvalds   reiserfs: run scr...
673
  static void errcatch_print_vi(struct virtual_item *vi)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
674
  {
45b03d5e8   Jeff Mahoney   reiserfs: rework ...
675
676
  	reiserfs_warning(NULL, "green-16011",
  			 "Invalid item type observed, run fsck ASAP");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
677
678
679
  }
  
  static struct item_operations errcatch_ops = {
bd4c625c0   Linus Torvalds   reiserfs: run scr...
680
681
682
683
684
685
686
687
688
689
690
691
  	errcatch_bytes_number,
  	errcatch_decrement_key,
  	errcatch_is_left_mergeable,
  	errcatch_print_item,
  	errcatch_check_item,
  
  	errcatch_create_vi,
  	errcatch_check_left,
  	errcatch_check_right,
  	errcatch_part_size,
  	errcatch_unit_num,
  	errcatch_print_vi
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
692
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
693
694
695
696
  //////////////////////////////////////////////////////////////////////////////
  //
  //
  #if ! (TYPE_STAT_DATA == 0 && TYPE_INDIRECT == 1 && TYPE_DIRECT == 2 && TYPE_DIRENTRY == 3)
7fa94c886   Jeff Mahoney   [PATCH] reiserfs:...
697
  #error Item types must use disk-format assigned values.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
698
  #endif
bd4c625c0   Linus Torvalds   reiserfs: run scr...
699
700
701
702
703
704
705
  struct item_operations *item_ops[TYPE_ANY + 1] = {
  	&stat_data_ops,
  	&indirect_ops,
  	&direct_ops,
  	&direntry_ops,
  	NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
  	&errcatch_ops		/* This is to catch errors with invalid type (15th entry for TYPE_ANY) */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
706
  };