Blame view
fs/reiserfs/item_ops.c
18.7 KB
1da177e4c 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 reiserfs: run scr... |
17 |
static int sd_bytes_number(struct item_head *ih, int block_size) |
1da177e4c Linux-2.6.12-rc2 |
18 |
{ |
bd4c625c0 reiserfs: run scr... |
19 |
return 0; |
1da177e4c Linux-2.6.12-rc2 |
20 |
} |
bd4c625c0 reiserfs: run scr... |
21 |
static void sd_decrement_key(struct cpu_key *key) |
1da177e4c Linux-2.6.12-rc2 |
22 |
{ |
bd4c625c0 reiserfs: run scr... |
23 24 |
key->on_disk_key.k_objectid--; set_cpu_key_k_type(key, TYPE_ANY); |
6d205f120 [PATCH] reiserfs:... |
25 |
set_cpu_key_k_offset(key, (loff_t)(~0ULL >> 1)); |
1da177e4c Linux-2.6.12-rc2 |
26 |
} |
bd4c625c0 reiserfs: run scr... |
27 |
static int sd_is_left_mergeable(struct reiserfs_key *key, unsigned long bsize) |
1da177e4c Linux-2.6.12-rc2 |
28 |
{ |
bd4c625c0 reiserfs: run scr... |
29 |
return 0; |
1da177e4c Linux-2.6.12-rc2 |
30 |
} |
bd4c625c0 reiserfs: run scr... |
31 |
static char *print_time(time_t t) |
1da177e4c Linux-2.6.12-rc2 |
32 |
{ |
bd4c625c0 reiserfs: run scr... |
33 |
static char timebuf[256]; |
1da177e4c Linux-2.6.12-rc2 |
34 |
|
bd4c625c0 reiserfs: run scr... |
35 36 |
sprintf(timebuf, "%ld", t); return timebuf; |
1da177e4c Linux-2.6.12-rc2 |
37 |
} |
bd4c625c0 reiserfs: run scr... |
38 |
static void sd_print_item(struct item_head *ih, char *item) |
1da177e4c Linux-2.6.12-rc2 |
39 |
{ |
bd4c625c0 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 Linux-2.6.12-rc2 |
44 |
|
bd4c625c0 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 Linux-2.6.12-rc2 |
52 |
|
bd4c625c0 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 Linux-2.6.12-rc2 |
58 |
} |
bd4c625c0 reiserfs: run scr... |
59 |
static void sd_check_item(struct item_head *ih, char *item) |
1da177e4c Linux-2.6.12-rc2 |
60 |
{ |
bd4c625c0 reiserfs: run scr... |
61 |
// FIXME: type something here! |
1da177e4c Linux-2.6.12-rc2 |
62 |
} |
bd4c625c0 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 Linux-2.6.12-rc2 |
66 |
{ |
bd4c625c0 reiserfs: run scr... |
67 68 69 |
vi->vi_index = TYPE_STAT_DATA; //vi->vi_type |= VI_TYPE_STAT_DATA;// not needed? return 0; |
1da177e4c Linux-2.6.12-rc2 |
70 |
} |
bd4c625c0 reiserfs: run scr... |
71 72 |
static int sd_check_left(struct virtual_item *vi, int free, int start_skip, int end_skip) |
1da177e4c Linux-2.6.12-rc2 |
73 |
{ |
14a61442c BUG_ON conversion... |
74 |
BUG_ON(start_skip || end_skip); |
bd4c625c0 reiserfs: run scr... |
75 |
return -1; |
1da177e4c Linux-2.6.12-rc2 |
76 |
} |
bd4c625c0 reiserfs: run scr... |
77 |
static int sd_check_right(struct virtual_item *vi, int free) |
1da177e4c Linux-2.6.12-rc2 |
78 |
{ |
bd4c625c0 reiserfs: run scr... |
79 |
return -1; |
1da177e4c Linux-2.6.12-rc2 |
80 |
} |
bd4c625c0 reiserfs: run scr... |
81 |
static int sd_part_size(struct virtual_item *vi, int first, int count) |
1da177e4c Linux-2.6.12-rc2 |
82 |
{ |
14a61442c BUG_ON conversion... |
83 |
BUG_ON(count); |
bd4c625c0 reiserfs: run scr... |
84 |
return 0; |
1da177e4c Linux-2.6.12-rc2 |
85 |
} |
bd4c625c0 reiserfs: run scr... |
86 |
static int sd_unit_num(struct virtual_item *vi) |
1da177e4c Linux-2.6.12-rc2 |
87 |
{ |
bd4c625c0 reiserfs: run scr... |
88 |
return vi->vi_item_len - IH_SIZE; |
1da177e4c Linux-2.6.12-rc2 |
89 |
} |
bd4c625c0 reiserfs: run scr... |
90 |
static void sd_print_vi(struct virtual_item *vi) |
1da177e4c Linux-2.6.12-rc2 |
91 |
{ |
45b03d5e8 reiserfs: rework ... |
92 93 |
reiserfs_warning(NULL, "reiserfs-16100", "STATDATA, index %d, type 0x%x, %h", |
bd4c625c0 reiserfs: run scr... |
94 |
vi->vi_index, vi->vi_type, vi->vi_ih); |
1da177e4c Linux-2.6.12-rc2 |
95 96 97 |
} static struct item_operations stat_data_ops = { |
bd4c625c0 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 Linux-2.6.12-rc2 |
110 |
}; |
1da177e4c Linux-2.6.12-rc2 |
111 112 113 |
////////////////////////////////////////////////////////////////////////////// // direct item functions // |
bd4c625c0 reiserfs: run scr... |
114 |
static int direct_bytes_number(struct item_head *ih, int block_size) |
1da177e4c Linux-2.6.12-rc2 |
115 |
{ |
bd4c625c0 reiserfs: run scr... |
116 |
return ih_item_len(ih); |
1da177e4c Linux-2.6.12-rc2 |
117 |
} |
1da177e4c Linux-2.6.12-rc2 |
118 |
// FIXME: this should probably switch to indirect as well |
bd4c625c0 reiserfs: run scr... |
119 |
static void direct_decrement_key(struct cpu_key *key) |
1da177e4c Linux-2.6.12-rc2 |
120 |
{ |
bd4c625c0 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 Linux-2.6.12-rc2 |
124 |
} |
bd4c625c0 reiserfs: run scr... |
125 126 |
static int direct_is_left_mergeable(struct reiserfs_key *key, unsigned long bsize) |
1da177e4c Linux-2.6.12-rc2 |
127 |
{ |
bd4c625c0 reiserfs: run scr... |
128 129 |
int version = le_key_version(key); return ((le_key_k_offset(version, key) & (bsize - 1)) != 1); |
1da177e4c Linux-2.6.12-rc2 |
130 |
} |
bd4c625c0 reiserfs: run scr... |
131 |
static void direct_print_item(struct item_head *ih, char *item) |
1da177e4c Linux-2.6.12-rc2 |
132 |
{ |
bd4c625c0 reiserfs: run scr... |
133 |
int j = 0; |
1da177e4c Linux-2.6.12-rc2 |
134 135 |
// return; |
bd4c625c0 reiserfs: run scr... |
136 137 138 139 140 |
printk("\""); while (j < ih_item_len(ih)) printk("%c", item[j++]); printk("\" "); |
1da177e4c Linux-2.6.12-rc2 |
141 |
} |
bd4c625c0 reiserfs: run scr... |
142 |
static void direct_check_item(struct item_head *ih, char *item) |
1da177e4c Linux-2.6.12-rc2 |
143 |
{ |
bd4c625c0 reiserfs: run scr... |
144 |
// FIXME: type something here! |
1da177e4c Linux-2.6.12-rc2 |
145 |
} |
bd4c625c0 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 Linux-2.6.12-rc2 |
149 |
{ |
bd4c625c0 reiserfs: run scr... |
150 151 152 |
vi->vi_index = TYPE_DIRECT; //vi->vi_type |= VI_TYPE_DIRECT; return 0; |
1da177e4c Linux-2.6.12-rc2 |
153 |
} |
bd4c625c0 reiserfs: run scr... |
154 155 |
static int direct_check_left(struct virtual_item *vi, int free, int start_skip, int end_skip) |
1da177e4c Linux-2.6.12-rc2 |
156 |
{ |
bd4c625c0 reiserfs: run scr... |
157 |
int bytes; |
1da177e4c Linux-2.6.12-rc2 |
158 |
|
bd4c625c0 reiserfs: run scr... |
159 160 |
bytes = free - free % 8; return bytes ? : -1; |
1da177e4c Linux-2.6.12-rc2 |
161 |
} |
bd4c625c0 reiserfs: run scr... |
162 |
static int direct_check_right(struct virtual_item *vi, int free) |
1da177e4c Linux-2.6.12-rc2 |
163 |
{ |
bd4c625c0 reiserfs: run scr... |
164 |
return direct_check_left(vi, free, 0, 0); |
1da177e4c Linux-2.6.12-rc2 |
165 |
} |
bd4c625c0 reiserfs: run scr... |
166 |
static int direct_part_size(struct virtual_item *vi, int first, int count) |
1da177e4c Linux-2.6.12-rc2 |
167 |
{ |
bd4c625c0 reiserfs: run scr... |
168 |
return count; |
1da177e4c Linux-2.6.12-rc2 |
169 |
} |
bd4c625c0 reiserfs: run scr... |
170 |
static int direct_unit_num(struct virtual_item *vi) |
1da177e4c Linux-2.6.12-rc2 |
171 |
{ |
bd4c625c0 reiserfs: run scr... |
172 |
return vi->vi_item_len - IH_SIZE; |
1da177e4c Linux-2.6.12-rc2 |
173 |
} |
bd4c625c0 reiserfs: run scr... |
174 |
static void direct_print_vi(struct virtual_item *vi) |
1da177e4c Linux-2.6.12-rc2 |
175 |
{ |
45b03d5e8 reiserfs: rework ... |
176 177 |
reiserfs_warning(NULL, "reiserfs-16101", "DIRECT, index %d, type 0x%x, %h", |
bd4c625c0 reiserfs: run scr... |
178 |
vi->vi_index, vi->vi_type, vi->vi_ih); |
1da177e4c Linux-2.6.12-rc2 |
179 180 181 |
} static struct item_operations direct_ops = { |
bd4c625c0 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 Linux-2.6.12-rc2 |
194 |
}; |
1da177e4c Linux-2.6.12-rc2 |
195 196 197 |
////////////////////////////////////////////////////////////////////////////// // indirect item functions // |
bd4c625c0 reiserfs: run scr... |
198 |
static int indirect_bytes_number(struct item_head *ih, int block_size) |
1da177e4c Linux-2.6.12-rc2 |
199 |
{ |
bd4c625c0 reiserfs: run scr... |
200 |
return ih_item_len(ih) / UNFM_P_SIZE * block_size; //- get_ih_free_space (ih); |
1da177e4c Linux-2.6.12-rc2 |
201 |
} |
1da177e4c Linux-2.6.12-rc2 |
202 |
// decrease offset, if it becomes 0, change type to stat data |
bd4c625c0 reiserfs: run scr... |
203 |
static void indirect_decrement_key(struct cpu_key *key) |
1da177e4c Linux-2.6.12-rc2 |
204 |
{ |
bd4c625c0 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 Linux-2.6.12-rc2 |
208 |
} |
1da177e4c Linux-2.6.12-rc2 |
209 |
// if it is not first item of the body, then it is mergeable |
bd4c625c0 reiserfs: run scr... |
210 211 |
static int indirect_is_left_mergeable(struct reiserfs_key *key, unsigned long bsize) |
1da177e4c Linux-2.6.12-rc2 |
212 |
{ |
bd4c625c0 reiserfs: run scr... |
213 214 |
int version = le_key_version(key); return (le_key_k_offset(version, key) != 1); |
1da177e4c Linux-2.6.12-rc2 |
215 |
} |
1da177e4c Linux-2.6.12-rc2 |
216 |
// printing of indirect item |
bd4c625c0 reiserfs: run scr... |
217 |
static void start_new_sequence(__u32 * start, int *len, __u32 new) |
1da177e4c Linux-2.6.12-rc2 |
218 |
{ |
bd4c625c0 reiserfs: run scr... |
219 220 |
*start = new; *len = 1; |
1da177e4c Linux-2.6.12-rc2 |
221 |
} |
bd4c625c0 reiserfs: run scr... |
222 |
static int sequence_finished(__u32 start, int *len, __u32 new) |
1da177e4c Linux-2.6.12-rc2 |
223 |
{ |
bd4c625c0 reiserfs: run scr... |
224 225 |
if (start == INT_MAX) return 1; |
1da177e4c Linux-2.6.12-rc2 |
226 |
|
bd4c625c0 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 Linux-2.6.12-rc2 |
236 |
} |
bd4c625c0 reiserfs: run scr... |
237 |
static void print_sequence(__u32 start, int len) |
1da177e4c Linux-2.6.12-rc2 |
238 |
{ |
bd4c625c0 reiserfs: run scr... |
239 240 |
if (start == INT_MAX) return; |
1da177e4c Linux-2.6.12-rc2 |
241 |
|
bd4c625c0 reiserfs: run scr... |
242 243 244 245 |
if (len == 1) printk(" %d", start); else printk(" %d(%d)", start, len); |
1da177e4c Linux-2.6.12-rc2 |
246 |
} |
bd4c625c0 reiserfs: run scr... |
247 |
static void indirect_print_item(struct item_head *ih, char *item) |
1da177e4c Linux-2.6.12-rc2 |
248 |
{ |
bd4c625c0 reiserfs: run scr... |
249 250 251 |
int j; __le32 *unp; __u32 prev = INT_MAX; |
d5ee4ea83 [PATCH] indirect_... |
252 |
int num = 0; |
1da177e4c Linux-2.6.12-rc2 |
253 |
|
bd4c625c0 reiserfs: run scr... |
254 |
unp = (__le32 *) item; |
1da177e4c Linux-2.6.12-rc2 |
255 |
|
bd4c625c0 reiserfs: run scr... |
256 |
if (ih_item_len(ih) % UNFM_P_SIZE) |
45b03d5e8 reiserfs: rework ... |
257 |
reiserfs_warning(NULL, "reiserfs-16102", "invalid item len"); |
1da177e4c Linux-2.6.12-rc2 |
258 |
|
bd4c625c0 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 Linux-2.6.12-rc2 |
266 |
} |
bd4c625c0 reiserfs: run scr... |
267 268 269 |
print_sequence(prev, num); printk("] "); |
1da177e4c Linux-2.6.12-rc2 |
270 |
} |
bd4c625c0 reiserfs: run scr... |
271 |
static void indirect_check_item(struct item_head *ih, char *item) |
1da177e4c Linux-2.6.12-rc2 |
272 |
{ |
bd4c625c0 reiserfs: run scr... |
273 |
// FIXME: type something here! |
1da177e4c Linux-2.6.12-rc2 |
274 |
} |
bd4c625c0 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 Linux-2.6.12-rc2 |
278 |
{ |
bd4c625c0 reiserfs: run scr... |
279 280 281 |
vi->vi_index = TYPE_INDIRECT; //vi->vi_type |= VI_TYPE_INDIRECT; return 0; |
1da177e4c Linux-2.6.12-rc2 |
282 |
} |
bd4c625c0 reiserfs: run scr... |
283 284 |
static int indirect_check_left(struct virtual_item *vi, int free, int start_skip, int end_skip) |
1da177e4c Linux-2.6.12-rc2 |
285 |
{ |
bd4c625c0 reiserfs: run scr... |
286 |
int bytes; |
1da177e4c Linux-2.6.12-rc2 |
287 |
|
bd4c625c0 reiserfs: run scr... |
288 289 |
bytes = free - free % UNFM_P_SIZE; return bytes ? : -1; |
1da177e4c Linux-2.6.12-rc2 |
290 |
} |
bd4c625c0 reiserfs: run scr... |
291 |
static int indirect_check_right(struct virtual_item *vi, int free) |
1da177e4c Linux-2.6.12-rc2 |
292 |
{ |
bd4c625c0 reiserfs: run scr... |
293 |
return indirect_check_left(vi, free, 0, 0); |
1da177e4c Linux-2.6.12-rc2 |
294 |
} |
1da177e4c 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 reiserfs: run scr... |
296 |
static int indirect_part_size(struct virtual_item *vi, int first, int units) |
1da177e4c Linux-2.6.12-rc2 |
297 |
{ |
bd4c625c0 reiserfs: run scr... |
298 299 |
// unit of indirect item is byte (yet) return units; |
1da177e4c Linux-2.6.12-rc2 |
300 |
} |
bd4c625c0 reiserfs: run scr... |
301 |
static int indirect_unit_num(struct virtual_item *vi) |
1da177e4c Linux-2.6.12-rc2 |
302 |
{ |
bd4c625c0 reiserfs: run scr... |
303 304 |
// unit of indirect item is byte (yet) return vi->vi_item_len - IH_SIZE; |
1da177e4c Linux-2.6.12-rc2 |
305 |
} |
bd4c625c0 reiserfs: run scr... |
306 |
static void indirect_print_vi(struct virtual_item *vi) |
1da177e4c Linux-2.6.12-rc2 |
307 |
{ |
45b03d5e8 reiserfs: rework ... |
308 309 |
reiserfs_warning(NULL, "reiserfs-16103", "INDIRECT, index %d, type 0x%x, %h", |
bd4c625c0 reiserfs: run scr... |
310 |
vi->vi_index, vi->vi_type, vi->vi_ih); |
1da177e4c Linux-2.6.12-rc2 |
311 312 313 |
} static struct item_operations indirect_ops = { |
bd4c625c0 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 Linux-2.6.12-rc2 |
326 |
}; |
1da177e4c Linux-2.6.12-rc2 |
327 328 329 |
////////////////////////////////////////////////////////////////////////////// // direntry functions // |
bd4c625c0 reiserfs: run scr... |
330 |
static int direntry_bytes_number(struct item_head *ih, int block_size) |
1da177e4c Linux-2.6.12-rc2 |
331 |
{ |
45b03d5e8 reiserfs: rework ... |
332 |
reiserfs_warning(NULL, "vs-16090", |
bd4c625c0 reiserfs: run scr... |
333 334 |
"bytes number is asked for direntry"); return 0; |
1da177e4c Linux-2.6.12-rc2 |
335 |
} |
bd4c625c0 reiserfs: run scr... |
336 |
static void direntry_decrement_key(struct cpu_key *key) |
1da177e4c Linux-2.6.12-rc2 |
337 |
{ |
bd4c625c0 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 Linux-2.6.12-rc2 |
341 |
} |
bd4c625c0 reiserfs: run scr... |
342 343 |
static int direntry_is_left_mergeable(struct reiserfs_key *key, unsigned long bsize) |
1da177e4c Linux-2.6.12-rc2 |
344 |
{ |
bd4c625c0 reiserfs: run scr... |
345 346 347 |
if (le32_to_cpu(key->u.k_offset_v1.k_offset) == DOT_OFFSET) return 0; return 1; |
1da177e4c Linux-2.6.12-rc2 |
348 |
|
bd4c625c0 reiserfs: run scr... |
349 |
} |
1da177e4c Linux-2.6.12-rc2 |
350 |
|
bd4c625c0 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 Linux-2.6.12-rc2 |
391 |
} |
1da177e4c Linux-2.6.12-rc2 |
392 |
} |
bd4c625c0 reiserfs: run scr... |
393 |
static void direntry_check_item(struct item_head *ih, char *item) |
1da177e4c Linux-2.6.12-rc2 |
394 |
{ |
bd4c625c0 reiserfs: run scr... |
395 396 |
int i; struct reiserfs_de_head *deh; |
1da177e4c Linux-2.6.12-rc2 |
397 |
|
bd4c625c0 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 Linux-2.6.12-rc2 |
403 |
} |
1da177e4c 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 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 Linux-2.6.12-rc2 |
411 |
{ |
bd4c625c0 reiserfs: run scr... |
412 413 |
if (mode == M_INSERT || mode == M_DELETE) return virtual_entry_num; |
1da177e4c Linux-2.6.12-rc2 |
414 |
|
bd4c625c0 reiserfs: run scr... |
415 416 417 |
if (!is_affected) /* cut or paste is applied to another item */ return virtual_entry_num; |
1da177e4c Linux-2.6.12-rc2 |
418 |
|
bd4c625c0 reiserfs: run scr... |
419 420 |
if (virtual_entry_num < pos_in_item) return virtual_entry_num; |
1da177e4c Linux-2.6.12-rc2 |
421 |
|
bd4c625c0 reiserfs: run scr... |
422 423 |
if (mode == M_CUT) return virtual_entry_num + 1; |
1da177e4c Linux-2.6.12-rc2 |
424 |
|
bd4c625c0 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 Linux-2.6.12-rc2 |
428 |
|
bd4c625c0 reiserfs: run scr... |
429 430 |
return virtual_entry_num - 1; } |
1da177e4c 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 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 Linux-2.6.12-rc2 |
443 |
|
bd4c625c0 reiserfs: run scr... |
444 |
vi->vi_index = TYPE_DIRENTRY; |
14a61442c BUG_ON conversion... |
445 |
BUG_ON(!(vi->vi_ih) || !vi->vi_item); |
bd4c625c0 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 Linux-2.6.12-rc2 |
471 472 |
#ifdef CONFIG_REISERFS_CHECK |
bd4c625c0 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 reiserfs: rework ... |
485 486 487 |
reiserfs_panic(NULL, "vs-8025", "(mode==%c, " "insert_size==%d), invalid length of " "directory item", |
bd4c625c0 reiserfs: run scr... |
488 489 |
vn->vn_mode, insert_size); } |
1da177e4c Linux-2.6.12-rc2 |
490 |
} |
1da177e4c Linux-2.6.12-rc2 |
491 |
#endif |
bd4c625c0 reiserfs: run scr... |
492 |
return size; |
1da177e4c Linux-2.6.12-rc2 |
493 494 |
} |
1da177e4c 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 reiserfs: run scr... |
499 500 |
static int direntry_check_left(struct virtual_item *vi, int free, int start_skip, int end_skip) |
1da177e4c Linux-2.6.12-rc2 |
501 |
{ |
bd4c625c0 reiserfs: run scr... |
502 503 504 |
int i; int entries = 0; struct direntry_uarea *dir_u = vi->vi_uarea; |
1da177e4c Linux-2.6.12-rc2 |
505 |
|
bd4c625c0 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 Linux-2.6.12-rc2 |
510 |
|
bd4c625c0 reiserfs: run scr... |
511 512 513 |
free -= dir_u->entry_sizes[i]; entries++; } |
1da177e4c Linux-2.6.12-rc2 |
514 |
|
bd4c625c0 reiserfs: run scr... |
515 |
if (entries == dir_u->entry_count) { |
c3a9c2109 reiserfs: rework ... |
516 517 |
reiserfs_panic(NULL, "item_ops-1", "free space %d, entry_count %d", free, |
bd4c625c0 reiserfs: run scr... |
518 519 |
dir_u->entry_count); } |
1da177e4c Linux-2.6.12-rc2 |
520 |
|
bd4c625c0 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 Linux-2.6.12-rc2 |
525 |
|
bd4c625c0 reiserfs: run scr... |
526 527 528 529 |
return entries ? : -1; } static int direntry_check_right(struct virtual_item *vi, int free) |
1da177e4c Linux-2.6.12-rc2 |
530 |
{ |
bd4c625c0 reiserfs: run scr... |
531 532 533 |
int i; int entries = 0; struct direntry_uarea *dir_u = vi->vi_uarea; |
1da177e4c Linux-2.6.12-rc2 |
534 |
|
bd4c625c0 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 Linux-2.6.12-rc2 |
539 |
|
bd4c625c0 reiserfs: run scr... |
540 541 542 |
free -= dir_u->entry_sizes[i]; entries++; } |
14a61442c BUG_ON conversion... |
543 |
BUG_ON(entries == dir_u->entry_count); |
1da177e4c Linux-2.6.12-rc2 |
544 |
|
bd4c625c0 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 Linux-2.6.12-rc2 |
552 553 |
/* sum of entry sizes between from-th and to-th entries including both edges */ |
bd4c625c0 reiserfs: run scr... |
554 |
static int direntry_part_size(struct virtual_item *vi, int first, int count) |
1da177e4c Linux-2.6.12-rc2 |
555 |
{ |
bd4c625c0 reiserfs: run scr... |
556 557 558 |
int i, retval; int from, to; struct direntry_uarea *dir_u = vi->vi_uarea; |
1da177e4c Linux-2.6.12-rc2 |
559 |
|
bd4c625c0 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 Linux-2.6.12-rc2 |
566 |
|
bd4c625c0 reiserfs: run scr... |
567 568 |
for (i = from; i <= to; i++) retval += dir_u->entry_sizes[i]; |
1da177e4c Linux-2.6.12-rc2 |
569 |
|
bd4c625c0 reiserfs: run scr... |
570 |
return retval; |
1da177e4c Linux-2.6.12-rc2 |
571 |
} |
bd4c625c0 reiserfs: run scr... |
572 573 574 |
static int direntry_unit_num(struct virtual_item *vi) { struct direntry_uarea *dir_u = vi->vi_uarea; |
1da177e4c Linux-2.6.12-rc2 |
575 |
|
bd4c625c0 reiserfs: run scr... |
576 577 |
return dir_u->entry_count; } |
1da177e4c Linux-2.6.12-rc2 |
578 |
|
bd4c625c0 reiserfs: run scr... |
579 |
static void direntry_print_vi(struct virtual_item *vi) |
1da177e4c Linux-2.6.12-rc2 |
580 |
{ |
bd4c625c0 reiserfs: run scr... |
581 582 |
int i; struct direntry_uarea *dir_u = vi->vi_uarea; |
1da177e4c Linux-2.6.12-rc2 |
583 |
|
45b03d5e8 reiserfs: rework ... |
584 585 |
reiserfs_warning(NULL, "reiserfs-16104", "DIRENTRY, index %d, type 0x%x, %h, flags 0x%x", |
bd4c625c0 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 Linux-2.6.12-rc2 |
592 593 594 |
} static struct item_operations direntry_ops = { |
bd4c625c0 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 Linux-2.6.12-rc2 |
607 |
}; |
1da177e4c Linux-2.6.12-rc2 |
608 609 610 |
////////////////////////////////////////////////////////////////////////////// // Error catching functions to catch errors caused by incorrect item types. // |
bd4c625c0 reiserfs: run scr... |
611 |
static int errcatch_bytes_number(struct item_head *ih, int block_size) |
1da177e4c Linux-2.6.12-rc2 |
612 |
{ |
45b03d5e8 reiserfs: rework ... |
613 614 |
reiserfs_warning(NULL, "green-16001", "Invalid item type observed, run fsck ASAP"); |
bd4c625c0 reiserfs: run scr... |
615 |
return 0; |
1da177e4c Linux-2.6.12-rc2 |
616 |
} |
bd4c625c0 reiserfs: run scr... |
617 |
static void errcatch_decrement_key(struct cpu_key *key) |
1da177e4c Linux-2.6.12-rc2 |
618 |
{ |
45b03d5e8 reiserfs: rework ... |
619 620 |
reiserfs_warning(NULL, "green-16002", "Invalid item type observed, run fsck ASAP"); |
1da177e4c Linux-2.6.12-rc2 |
621 |
} |
bd4c625c0 reiserfs: run scr... |
622 623 |
static int errcatch_is_left_mergeable(struct reiserfs_key *key, unsigned long bsize) |
1da177e4c Linux-2.6.12-rc2 |
624 |
{ |
45b03d5e8 reiserfs: rework ... |
625 626 |
reiserfs_warning(NULL, "green-16003", "Invalid item type observed, run fsck ASAP"); |
bd4c625c0 reiserfs: run scr... |
627 |
return 0; |
1da177e4c Linux-2.6.12-rc2 |
628 |
} |
bd4c625c0 reiserfs: run scr... |
629 |
static void errcatch_print_item(struct item_head *ih, char *item) |
1da177e4c Linux-2.6.12-rc2 |
630 |
{ |
45b03d5e8 reiserfs: rework ... |
631 632 |
reiserfs_warning(NULL, "green-16004", "Invalid item type observed, run fsck ASAP"); |
1da177e4c Linux-2.6.12-rc2 |
633 |
} |
bd4c625c0 reiserfs: run scr... |
634 |
static void errcatch_check_item(struct item_head *ih, char *item) |
1da177e4c Linux-2.6.12-rc2 |
635 |
{ |
45b03d5e8 reiserfs: rework ... |
636 637 |
reiserfs_warning(NULL, "green-16005", "Invalid item type observed, run fsck ASAP"); |
1da177e4c Linux-2.6.12-rc2 |
638 |
} |
bd4c625c0 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 Linux-2.6.12-rc2 |
642 |
{ |
45b03d5e8 reiserfs: rework ... |
643 644 |
reiserfs_warning(NULL, "green-16006", "Invalid item type observed, run fsck ASAP"); |
bd4c625c0 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 Linux-2.6.12-rc2 |
647 |
} |
bd4c625c0 reiserfs: run scr... |
648 649 |
static int errcatch_check_left(struct virtual_item *vi, int free, int start_skip, int end_skip) |
1da177e4c Linux-2.6.12-rc2 |
650 |
{ |
45b03d5e8 reiserfs: rework ... |
651 652 |
reiserfs_warning(NULL, "green-16007", "Invalid item type observed, run fsck ASAP"); |
bd4c625c0 reiserfs: run scr... |
653 |
return -1; |
1da177e4c Linux-2.6.12-rc2 |
654 |
} |
bd4c625c0 reiserfs: run scr... |
655 |
static int errcatch_check_right(struct virtual_item *vi, int free) |
1da177e4c Linux-2.6.12-rc2 |
656 |
{ |
45b03d5e8 reiserfs: rework ... |
657 658 |
reiserfs_warning(NULL, "green-16008", "Invalid item type observed, run fsck ASAP"); |
bd4c625c0 reiserfs: run scr... |
659 |
return -1; |
1da177e4c Linux-2.6.12-rc2 |
660 |
} |
bd4c625c0 reiserfs: run scr... |
661 |
static int errcatch_part_size(struct virtual_item *vi, int first, int count) |
1da177e4c Linux-2.6.12-rc2 |
662 |
{ |
45b03d5e8 reiserfs: rework ... |
663 664 |
reiserfs_warning(NULL, "green-16009", "Invalid item type observed, run fsck ASAP"); |
bd4c625c0 reiserfs: run scr... |
665 |
return 0; |
1da177e4c Linux-2.6.12-rc2 |
666 |
} |
bd4c625c0 reiserfs: run scr... |
667 |
static int errcatch_unit_num(struct virtual_item *vi) |
1da177e4c Linux-2.6.12-rc2 |
668 |
{ |
45b03d5e8 reiserfs: rework ... |
669 670 |
reiserfs_warning(NULL, "green-16010", "Invalid item type observed, run fsck ASAP"); |
bd4c625c0 reiserfs: run scr... |
671 |
return 0; |
1da177e4c Linux-2.6.12-rc2 |
672 |
} |
bd4c625c0 reiserfs: run scr... |
673 |
static void errcatch_print_vi(struct virtual_item *vi) |
1da177e4c Linux-2.6.12-rc2 |
674 |
{ |
45b03d5e8 reiserfs: rework ... |
675 676 |
reiserfs_warning(NULL, "green-16011", "Invalid item type observed, run fsck ASAP"); |
1da177e4c Linux-2.6.12-rc2 |
677 678 679 |
} static struct item_operations errcatch_ops = { |
bd4c625c0 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 Linux-2.6.12-rc2 |
692 |
}; |
1da177e4c Linux-2.6.12-rc2 |
693 694 695 696 |
////////////////////////////////////////////////////////////////////////////// // // #if ! (TYPE_STAT_DATA == 0 && TYPE_INDIRECT == 1 && TYPE_DIRECT == 2 && TYPE_DIRENTRY == 3) |
7fa94c886 [PATCH] reiserfs:... |
697 |
#error Item types must use disk-format assigned values. |
1da177e4c Linux-2.6.12-rc2 |
698 |
#endif |
bd4c625c0 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 Linux-2.6.12-rc2 |
706 |
}; |