xref: /openbmc/linux/fs/reiserfs/item_ops.c (revision 7fa94c88)
11da177e4SLinus Torvalds /*
21da177e4SLinus Torvalds  * Copyright 2000 by Hans Reiser, licensing governed by reiserfs/README
31da177e4SLinus Torvalds  */
41da177e4SLinus Torvalds 
51da177e4SLinus Torvalds #include <linux/time.h>
61da177e4SLinus Torvalds #include <linux/reiserfs_fs.h>
71da177e4SLinus Torvalds 
81da177e4SLinus Torvalds // this contains item handlers for old item types: sd, direct,
91da177e4SLinus Torvalds // indirect, directory
101da177e4SLinus Torvalds 
111da177e4SLinus Torvalds /* and where are the comments? how about saying where we can find an
121da177e4SLinus Torvalds    explanation of each item handler method? -Hans */
131da177e4SLinus Torvalds 
141da177e4SLinus Torvalds //////////////////////////////////////////////////////////////////////////////
151da177e4SLinus Torvalds // stat data functions
161da177e4SLinus Torvalds //
171da177e4SLinus Torvalds static int sd_bytes_number (struct item_head * ih, int block_size)
181da177e4SLinus Torvalds {
191da177e4SLinus Torvalds   return 0;
201da177e4SLinus Torvalds }
211da177e4SLinus Torvalds 
221da177e4SLinus Torvalds static void sd_decrement_key (struct cpu_key * key)
231da177e4SLinus Torvalds {
241da177e4SLinus Torvalds     key->on_disk_key.k_objectid --;
251da177e4SLinus Torvalds     set_cpu_key_k_type (key, TYPE_ANY);
261da177e4SLinus Torvalds     set_cpu_key_k_offset(key, (loff_t)(-1));
271da177e4SLinus Torvalds }
281da177e4SLinus Torvalds 
291da177e4SLinus Torvalds static int sd_is_left_mergeable (struct reiserfs_key * key, unsigned long bsize)
301da177e4SLinus Torvalds {
311da177e4SLinus Torvalds     return 0;
321da177e4SLinus Torvalds }
331da177e4SLinus Torvalds 
341da177e4SLinus Torvalds 
351da177e4SLinus Torvalds 
361da177e4SLinus Torvalds static char * print_time (time_t t)
371da177e4SLinus Torvalds {
381da177e4SLinus Torvalds     static char timebuf[256];
391da177e4SLinus Torvalds 
401da177e4SLinus Torvalds     sprintf (timebuf, "%ld", t);
411da177e4SLinus Torvalds     return timebuf;
421da177e4SLinus Torvalds }
431da177e4SLinus Torvalds 
441da177e4SLinus Torvalds 
451da177e4SLinus Torvalds static void sd_print_item (struct item_head * ih, char * item)
461da177e4SLinus Torvalds {
471da177e4SLinus Torvalds     printk ("\tmode | size | nlinks | first direct | mtime\n");
481da177e4SLinus Torvalds     if (stat_data_v1 (ih)) {
491da177e4SLinus Torvalds       	struct stat_data_v1 * sd = (struct stat_data_v1 *)item;
501da177e4SLinus Torvalds 
511da177e4SLinus Torvalds 	printk ("\t0%-6o | %6u | %2u | %d | %s\n", sd_v1_mode(sd),
521da177e4SLinus Torvalds                 sd_v1_size(sd), sd_v1_nlink(sd), sd_v1_first_direct_byte(sd),
531da177e4SLinus Torvalds                 print_time( sd_v1_mtime(sd) ) );
541da177e4SLinus Torvalds     } else {
551da177e4SLinus Torvalds 	struct stat_data * sd = (struct stat_data *)item;
561da177e4SLinus Torvalds 
571da177e4SLinus Torvalds 	printk ("\t0%-6o | %6Lu | %2u | %d | %s\n", sd_v2_mode(sd),
581da177e4SLinus Torvalds             (unsigned long long)sd_v2_size(sd), sd_v2_nlink(sd),
591da177e4SLinus Torvalds             sd_v2_rdev(sd), print_time(sd_v2_mtime(sd)));
601da177e4SLinus Torvalds     }
611da177e4SLinus Torvalds }
621da177e4SLinus Torvalds 
631da177e4SLinus Torvalds static void sd_check_item (struct item_head * ih, char * item)
641da177e4SLinus Torvalds {
651da177e4SLinus Torvalds     // FIXME: type something here!
661da177e4SLinus Torvalds }
671da177e4SLinus Torvalds 
681da177e4SLinus Torvalds 
691da177e4SLinus Torvalds static int sd_create_vi (struct virtual_node * vn,
701da177e4SLinus Torvalds 			 struct virtual_item * vi,
711da177e4SLinus Torvalds 			 int is_affected,
721da177e4SLinus Torvalds 			 int insert_size)
731da177e4SLinus Torvalds {
741da177e4SLinus Torvalds     vi->vi_index = TYPE_STAT_DATA;
751da177e4SLinus Torvalds     //vi->vi_type |= VI_TYPE_STAT_DATA;// not needed?
761da177e4SLinus Torvalds     return 0;
771da177e4SLinus Torvalds }
781da177e4SLinus Torvalds 
791da177e4SLinus Torvalds 
801da177e4SLinus Torvalds static int sd_check_left (struct virtual_item * vi, int free,
811da177e4SLinus Torvalds 			  int start_skip, int end_skip)
821da177e4SLinus Torvalds {
831da177e4SLinus Torvalds     if (start_skip || end_skip)
841da177e4SLinus Torvalds 	BUG ();
851da177e4SLinus Torvalds     return -1;
861da177e4SLinus Torvalds }
871da177e4SLinus Torvalds 
881da177e4SLinus Torvalds 
891da177e4SLinus Torvalds static int sd_check_right (struct virtual_item * vi, int free)
901da177e4SLinus Torvalds {
911da177e4SLinus Torvalds     return -1;
921da177e4SLinus Torvalds }
931da177e4SLinus Torvalds 
941da177e4SLinus Torvalds static int sd_part_size (struct virtual_item * vi, int first, int count)
951da177e4SLinus Torvalds {
961da177e4SLinus Torvalds     if (count)
971da177e4SLinus Torvalds 	BUG ();
981da177e4SLinus Torvalds     return 0;
991da177e4SLinus Torvalds }
1001da177e4SLinus Torvalds 
1011da177e4SLinus Torvalds static int sd_unit_num (struct virtual_item * vi)
1021da177e4SLinus Torvalds {
1031da177e4SLinus Torvalds     return vi->vi_item_len - IH_SIZE;
1041da177e4SLinus Torvalds }
1051da177e4SLinus Torvalds 
1061da177e4SLinus Torvalds 
1071da177e4SLinus Torvalds static void sd_print_vi (struct virtual_item * vi)
1081da177e4SLinus Torvalds {
1091da177e4SLinus Torvalds     reiserfs_warning (NULL, "STATDATA, index %d, type 0x%x, %h",
1101da177e4SLinus Torvalds 		      vi->vi_index, vi->vi_type, vi->vi_ih);
1111da177e4SLinus Torvalds }
1121da177e4SLinus Torvalds 
1131da177e4SLinus Torvalds static struct item_operations stat_data_ops = {
1141da177e4SLinus Torvalds 	.bytes_number		= sd_bytes_number,
1151da177e4SLinus Torvalds 	.decrement_key		= sd_decrement_key,
1161da177e4SLinus Torvalds 	.is_left_mergeable	= sd_is_left_mergeable,
1171da177e4SLinus Torvalds 	.print_item		= sd_print_item,
1181da177e4SLinus Torvalds 	.check_item		= sd_check_item,
1191da177e4SLinus Torvalds 
1201da177e4SLinus Torvalds 	.create_vi		= sd_create_vi,
1211da177e4SLinus Torvalds 	.check_left		= sd_check_left,
1221da177e4SLinus Torvalds 	.check_right		= sd_check_right,
1231da177e4SLinus Torvalds 	.part_size		= sd_part_size,
1241da177e4SLinus Torvalds 	.unit_num		= sd_unit_num,
1251da177e4SLinus Torvalds 	.print_vi		= sd_print_vi
1261da177e4SLinus Torvalds };
1271da177e4SLinus Torvalds 
1281da177e4SLinus Torvalds 
1291da177e4SLinus Torvalds 
1301da177e4SLinus Torvalds //////////////////////////////////////////////////////////////////////////////
1311da177e4SLinus Torvalds // direct item functions
1321da177e4SLinus Torvalds //
1331da177e4SLinus Torvalds static int direct_bytes_number (struct item_head * ih, int block_size)
1341da177e4SLinus Torvalds {
1351da177e4SLinus Torvalds   return ih_item_len(ih);
1361da177e4SLinus Torvalds }
1371da177e4SLinus Torvalds 
1381da177e4SLinus Torvalds 
1391da177e4SLinus Torvalds // FIXME: this should probably switch to indirect as well
1401da177e4SLinus Torvalds static void direct_decrement_key (struct cpu_key * key)
1411da177e4SLinus Torvalds {
1421da177e4SLinus Torvalds     cpu_key_k_offset_dec (key);
1431da177e4SLinus Torvalds     if (cpu_key_k_offset (key) == 0)
1441da177e4SLinus Torvalds 	set_cpu_key_k_type (key, TYPE_STAT_DATA);
1451da177e4SLinus Torvalds }
1461da177e4SLinus Torvalds 
1471da177e4SLinus Torvalds 
1481da177e4SLinus Torvalds static int direct_is_left_mergeable (struct reiserfs_key * key, unsigned long bsize)
1491da177e4SLinus Torvalds {
1501da177e4SLinus Torvalds     int version = le_key_version (key);
1511da177e4SLinus Torvalds     return ((le_key_k_offset (version, key) & (bsize - 1)) != 1);
1521da177e4SLinus Torvalds }
1531da177e4SLinus Torvalds 
1541da177e4SLinus Torvalds 
1551da177e4SLinus Torvalds static void direct_print_item (struct item_head * ih, char * item)
1561da177e4SLinus Torvalds {
1571da177e4SLinus Torvalds     int j = 0;
1581da177e4SLinus Torvalds 
1591da177e4SLinus Torvalds //    return;
1601da177e4SLinus Torvalds     printk ("\"");
1611da177e4SLinus Torvalds     while (j < ih_item_len(ih))
1621da177e4SLinus Torvalds 	printk ("%c", item[j++]);
1631da177e4SLinus Torvalds     printk ("\"\n");
1641da177e4SLinus Torvalds }
1651da177e4SLinus Torvalds 
1661da177e4SLinus Torvalds 
1671da177e4SLinus Torvalds static void direct_check_item (struct item_head * ih, char * item)
1681da177e4SLinus Torvalds {
1691da177e4SLinus Torvalds     // FIXME: type something here!
1701da177e4SLinus Torvalds }
1711da177e4SLinus Torvalds 
1721da177e4SLinus Torvalds 
1731da177e4SLinus Torvalds static int direct_create_vi (struct virtual_node * vn,
1741da177e4SLinus Torvalds 			     struct virtual_item * vi,
1751da177e4SLinus Torvalds 			     int is_affected,
1761da177e4SLinus Torvalds 			     int insert_size)
1771da177e4SLinus Torvalds {
1781da177e4SLinus Torvalds     vi->vi_index = TYPE_DIRECT;
1791da177e4SLinus Torvalds     //vi->vi_type |= VI_TYPE_DIRECT;
1801da177e4SLinus Torvalds     return 0;
1811da177e4SLinus Torvalds }
1821da177e4SLinus Torvalds 
1831da177e4SLinus Torvalds static int direct_check_left (struct virtual_item * vi, int free,
1841da177e4SLinus Torvalds 			      int start_skip, int end_skip)
1851da177e4SLinus Torvalds {
1861da177e4SLinus Torvalds     int bytes;
1871da177e4SLinus Torvalds 
1881da177e4SLinus Torvalds     bytes = free - free % 8;
1891da177e4SLinus Torvalds     return bytes ?: -1;
1901da177e4SLinus Torvalds }
1911da177e4SLinus Torvalds 
1921da177e4SLinus Torvalds 
1931da177e4SLinus Torvalds static int direct_check_right (struct virtual_item * vi, int free)
1941da177e4SLinus Torvalds {
1951da177e4SLinus Torvalds     return direct_check_left (vi, free, 0, 0);
1961da177e4SLinus Torvalds }
1971da177e4SLinus Torvalds 
1981da177e4SLinus Torvalds static int direct_part_size (struct virtual_item * vi, int first, int count)
1991da177e4SLinus Torvalds {
2001da177e4SLinus Torvalds     return count;
2011da177e4SLinus Torvalds }
2021da177e4SLinus Torvalds 
2031da177e4SLinus Torvalds 
2041da177e4SLinus Torvalds static int direct_unit_num (struct virtual_item * vi)
2051da177e4SLinus Torvalds {
2061da177e4SLinus Torvalds     return vi->vi_item_len - IH_SIZE;
2071da177e4SLinus Torvalds }
2081da177e4SLinus Torvalds 
2091da177e4SLinus Torvalds 
2101da177e4SLinus Torvalds static void direct_print_vi (struct virtual_item * vi)
2111da177e4SLinus Torvalds {
2121da177e4SLinus Torvalds     reiserfs_warning (NULL, "DIRECT, index %d, type 0x%x, %h",
2131da177e4SLinus Torvalds 		      vi->vi_index, vi->vi_type, vi->vi_ih);
2141da177e4SLinus Torvalds }
2151da177e4SLinus Torvalds 
2161da177e4SLinus Torvalds static struct item_operations direct_ops = {
2171da177e4SLinus Torvalds 	.bytes_number		= direct_bytes_number,
2181da177e4SLinus Torvalds 	.decrement_key		= direct_decrement_key,
2191da177e4SLinus Torvalds 	.is_left_mergeable	= direct_is_left_mergeable,
2201da177e4SLinus Torvalds 	.print_item		= direct_print_item,
2211da177e4SLinus Torvalds 	.check_item		= direct_check_item,
2221da177e4SLinus Torvalds 
2231da177e4SLinus Torvalds 	.create_vi		= direct_create_vi,
2241da177e4SLinus Torvalds 	.check_left		= direct_check_left,
2251da177e4SLinus Torvalds 	.check_right		= direct_check_right,
2261da177e4SLinus Torvalds 	.part_size		= direct_part_size,
2271da177e4SLinus Torvalds 	.unit_num		= direct_unit_num,
2281da177e4SLinus Torvalds 	.print_vi		= direct_print_vi
2291da177e4SLinus Torvalds };
2301da177e4SLinus Torvalds 
2311da177e4SLinus Torvalds 
2321da177e4SLinus Torvalds 
2331da177e4SLinus Torvalds //////////////////////////////////////////////////////////////////////////////
2341da177e4SLinus Torvalds // indirect item functions
2351da177e4SLinus Torvalds //
2361da177e4SLinus Torvalds 
2371da177e4SLinus Torvalds static int indirect_bytes_number (struct item_head * ih, int block_size)
2381da177e4SLinus Torvalds {
2391da177e4SLinus Torvalds   return ih_item_len(ih) / UNFM_P_SIZE * block_size; //- get_ih_free_space (ih);
2401da177e4SLinus Torvalds }
2411da177e4SLinus Torvalds 
2421da177e4SLinus Torvalds 
2431da177e4SLinus Torvalds // decrease offset, if it becomes 0, change type to stat data
2441da177e4SLinus Torvalds static void indirect_decrement_key (struct cpu_key * key)
2451da177e4SLinus Torvalds {
2461da177e4SLinus Torvalds     cpu_key_k_offset_dec (key);
2471da177e4SLinus Torvalds     if (cpu_key_k_offset (key) == 0)
2481da177e4SLinus Torvalds 	set_cpu_key_k_type (key, TYPE_STAT_DATA);
2491da177e4SLinus Torvalds }
2501da177e4SLinus Torvalds 
2511da177e4SLinus Torvalds 
2521da177e4SLinus Torvalds // if it is not first item of the body, then it is mergeable
2531da177e4SLinus Torvalds static int indirect_is_left_mergeable (struct reiserfs_key * key, unsigned long bsize)
2541da177e4SLinus Torvalds {
2551da177e4SLinus Torvalds     int version = le_key_version (key);
2561da177e4SLinus Torvalds     return (le_key_k_offset (version, key) != 1);
2571da177e4SLinus Torvalds }
2581da177e4SLinus Torvalds 
2591da177e4SLinus Torvalds 
2601da177e4SLinus Torvalds // printing of indirect item
2611da177e4SLinus Torvalds static void start_new_sequence (__u32 * start, int * len, __u32 new)
2621da177e4SLinus Torvalds {
2631da177e4SLinus Torvalds     *start = new;
2641da177e4SLinus Torvalds     *len = 1;
2651da177e4SLinus Torvalds }
2661da177e4SLinus Torvalds 
2671da177e4SLinus Torvalds 
2681da177e4SLinus Torvalds static int sequence_finished (__u32 start, int * len, __u32 new)
2691da177e4SLinus Torvalds {
2701da177e4SLinus Torvalds     if (start == INT_MAX)
2711da177e4SLinus Torvalds 	return 1;
2721da177e4SLinus Torvalds 
2731da177e4SLinus Torvalds     if (start == 0 && new == 0) {
2741da177e4SLinus Torvalds 	(*len) ++;
2751da177e4SLinus Torvalds 	return 0;
2761da177e4SLinus Torvalds     }
2771da177e4SLinus Torvalds     if (start != 0 && (start + *len) == new) {
2781da177e4SLinus Torvalds 	(*len) ++;
2791da177e4SLinus Torvalds 	return 0;
2801da177e4SLinus Torvalds     }
2811da177e4SLinus Torvalds     return 1;
2821da177e4SLinus Torvalds }
2831da177e4SLinus Torvalds 
2841da177e4SLinus Torvalds static void print_sequence (__u32 start, int len)
2851da177e4SLinus Torvalds {
2861da177e4SLinus Torvalds     if (start == INT_MAX)
2871da177e4SLinus Torvalds 	return;
2881da177e4SLinus Torvalds 
2891da177e4SLinus Torvalds     if (len == 1)
2901da177e4SLinus Torvalds 	printk (" %d", start);
2911da177e4SLinus Torvalds     else
2921da177e4SLinus Torvalds 	printk (" %d(%d)", start, len);
2931da177e4SLinus Torvalds }
2941da177e4SLinus Torvalds 
2951da177e4SLinus Torvalds 
2961da177e4SLinus Torvalds static void indirect_print_item (struct item_head * ih, char * item)
2971da177e4SLinus Torvalds {
2981da177e4SLinus Torvalds     int j;
2993e8962beSAl Viro     __le32 * unp;
3003e8962beSAl Viro     __u32 prev = INT_MAX;
3011da177e4SLinus Torvalds     int num;
3021da177e4SLinus Torvalds 
3033e8962beSAl Viro     unp = (__le32 *)item;
3041da177e4SLinus Torvalds 
3051da177e4SLinus Torvalds     if (ih_item_len(ih) % UNFM_P_SIZE)
3061da177e4SLinus Torvalds 	reiserfs_warning (NULL, "indirect_print_item: invalid item len");
3071da177e4SLinus Torvalds 
3081da177e4SLinus Torvalds     printk ("%d pointers\n[ ", (int)I_UNFM_NUM (ih));
3091da177e4SLinus Torvalds     for (j = 0; j < I_UNFM_NUM (ih); j ++) {
3101da177e4SLinus Torvalds 	if (sequence_finished (prev, &num, get_block_num(unp, j))) {
3111da177e4SLinus Torvalds 	    print_sequence (prev, num);
3121da177e4SLinus Torvalds 	    start_new_sequence (&prev, &num, get_block_num(unp, j));
3131da177e4SLinus Torvalds 	}
3141da177e4SLinus Torvalds     }
3151da177e4SLinus Torvalds     print_sequence (prev, num);
3161da177e4SLinus Torvalds     printk ("]\n");
3171da177e4SLinus Torvalds }
3181da177e4SLinus Torvalds 
3191da177e4SLinus Torvalds static void indirect_check_item (struct item_head * ih, char * item)
3201da177e4SLinus Torvalds {
3211da177e4SLinus Torvalds     // FIXME: type something here!
3221da177e4SLinus Torvalds }
3231da177e4SLinus Torvalds 
3241da177e4SLinus Torvalds 
3251da177e4SLinus Torvalds static int indirect_create_vi (struct virtual_node * vn,
3261da177e4SLinus Torvalds 			       struct virtual_item * vi,
3271da177e4SLinus Torvalds 			       int is_affected,
3281da177e4SLinus Torvalds 			       int insert_size)
3291da177e4SLinus Torvalds {
3301da177e4SLinus Torvalds     vi->vi_index = TYPE_INDIRECT;
3311da177e4SLinus Torvalds     //vi->vi_type |= VI_TYPE_INDIRECT;
3321da177e4SLinus Torvalds     return 0;
3331da177e4SLinus Torvalds }
3341da177e4SLinus Torvalds 
3351da177e4SLinus Torvalds static int indirect_check_left (struct virtual_item * vi, int free,
3361da177e4SLinus Torvalds 				int start_skip, int end_skip)
3371da177e4SLinus Torvalds {
3381da177e4SLinus Torvalds     int bytes;
3391da177e4SLinus Torvalds 
3401da177e4SLinus Torvalds     bytes = free - free % UNFM_P_SIZE;
3411da177e4SLinus Torvalds     return bytes ?: -1;
3421da177e4SLinus Torvalds }
3431da177e4SLinus Torvalds 
3441da177e4SLinus Torvalds 
3451da177e4SLinus Torvalds static int indirect_check_right (struct virtual_item * vi, int free)
3461da177e4SLinus Torvalds {
3471da177e4SLinus Torvalds     return indirect_check_left (vi, free, 0, 0);
3481da177e4SLinus Torvalds }
3491da177e4SLinus Torvalds 
3501da177e4SLinus Torvalds 
3511da177e4SLinus Torvalds 
3521da177e4SLinus Torvalds // return size in bytes of 'units' units. If first == 0 - calculate from the head (left), otherwise - from tail (right)
3531da177e4SLinus Torvalds static int indirect_part_size (struct virtual_item * vi, int first, int units)
3541da177e4SLinus Torvalds {
3551da177e4SLinus Torvalds     // unit of indirect item is byte (yet)
3561da177e4SLinus Torvalds     return units;
3571da177e4SLinus Torvalds }
3581da177e4SLinus Torvalds 
3591da177e4SLinus Torvalds static int indirect_unit_num (struct virtual_item * vi)
3601da177e4SLinus Torvalds {
3611da177e4SLinus Torvalds     // unit of indirect item is byte (yet)
3621da177e4SLinus Torvalds     return vi->vi_item_len - IH_SIZE;
3631da177e4SLinus Torvalds }
3641da177e4SLinus Torvalds 
3651da177e4SLinus Torvalds static void indirect_print_vi (struct virtual_item * vi)
3661da177e4SLinus Torvalds {
3671da177e4SLinus Torvalds     reiserfs_warning (NULL, "INDIRECT, index %d, type 0x%x, %h",
3681da177e4SLinus Torvalds 		      vi->vi_index, vi->vi_type, vi->vi_ih);
3691da177e4SLinus Torvalds }
3701da177e4SLinus Torvalds 
3711da177e4SLinus Torvalds static struct item_operations indirect_ops = {
3721da177e4SLinus Torvalds 	.bytes_number		= indirect_bytes_number,
3731da177e4SLinus Torvalds 	.decrement_key		= indirect_decrement_key,
3741da177e4SLinus Torvalds 	.is_left_mergeable	= indirect_is_left_mergeable,
3751da177e4SLinus Torvalds 	.print_item		= indirect_print_item,
3761da177e4SLinus Torvalds 	.check_item		= indirect_check_item,
3771da177e4SLinus Torvalds 
3781da177e4SLinus Torvalds 	.create_vi		= indirect_create_vi,
3791da177e4SLinus Torvalds 	.check_left		= indirect_check_left,
3801da177e4SLinus Torvalds 	.check_right		= indirect_check_right,
3811da177e4SLinus Torvalds 	.part_size		= indirect_part_size,
3821da177e4SLinus Torvalds 	.unit_num		= indirect_unit_num,
3831da177e4SLinus Torvalds 	.print_vi		= indirect_print_vi
3841da177e4SLinus Torvalds };
3851da177e4SLinus Torvalds 
3861da177e4SLinus Torvalds 
3871da177e4SLinus Torvalds //////////////////////////////////////////////////////////////////////////////
3881da177e4SLinus Torvalds // direntry functions
3891da177e4SLinus Torvalds //
3901da177e4SLinus Torvalds 
3911da177e4SLinus Torvalds 
3921da177e4SLinus Torvalds static int direntry_bytes_number (struct item_head * ih, int block_size)
3931da177e4SLinus Torvalds {
3941da177e4SLinus Torvalds     reiserfs_warning (NULL, "vs-16090: direntry_bytes_number: "
3951da177e4SLinus Torvalds 		      "bytes number is asked for direntry");
3961da177e4SLinus Torvalds     return 0;
3971da177e4SLinus Torvalds }
3981da177e4SLinus Torvalds 
3991da177e4SLinus Torvalds static void direntry_decrement_key (struct cpu_key * key)
4001da177e4SLinus Torvalds {
4011da177e4SLinus Torvalds     cpu_key_k_offset_dec (key);
4021da177e4SLinus Torvalds     if (cpu_key_k_offset (key) == 0)
4031da177e4SLinus Torvalds 	set_cpu_key_k_type (key, TYPE_STAT_DATA);
4041da177e4SLinus Torvalds }
4051da177e4SLinus Torvalds 
4061da177e4SLinus Torvalds 
4071da177e4SLinus Torvalds static int direntry_is_left_mergeable (struct reiserfs_key * key, unsigned long bsize)
4081da177e4SLinus Torvalds {
4091da177e4SLinus Torvalds     if (le32_to_cpu (key->u.k_offset_v1.k_offset) == DOT_OFFSET)
4101da177e4SLinus Torvalds 	return 0;
4111da177e4SLinus Torvalds     return 1;
4121da177e4SLinus Torvalds 
4131da177e4SLinus Torvalds }
4141da177e4SLinus Torvalds 
4151da177e4SLinus Torvalds 
4161da177e4SLinus Torvalds static void direntry_print_item (struct item_head * ih, char * item)
4171da177e4SLinus Torvalds {
4181da177e4SLinus Torvalds     int i;
4191da177e4SLinus Torvalds     int namelen;
4201da177e4SLinus Torvalds     struct reiserfs_de_head * deh;
4211da177e4SLinus Torvalds     char * name;
4221da177e4SLinus Torvalds     static char namebuf [80];
4231da177e4SLinus Torvalds 
4241da177e4SLinus Torvalds 
4251da177e4SLinus Torvalds     printk ("\n # %-15s%-30s%-15s%-15s%-15s\n", "Name", "Key of pointed object", "Hash", "Gen number", "Status");
4261da177e4SLinus Torvalds 
4271da177e4SLinus Torvalds     deh = (struct reiserfs_de_head *)item;
4281da177e4SLinus Torvalds 
4291da177e4SLinus Torvalds     for (i = 0; i < I_ENTRY_COUNT (ih); i ++, deh ++) {
4301da177e4SLinus Torvalds 	namelen = (i ? (deh_location(deh - 1)) : ih_item_len(ih)) - deh_location(deh);
4311da177e4SLinus Torvalds 	name = item + deh_location(deh);
4321da177e4SLinus Torvalds 	if (name[namelen-1] == 0)
4331da177e4SLinus Torvalds 	  namelen = strlen (name);
4341da177e4SLinus Torvalds 	namebuf[0] = '"';
4351da177e4SLinus Torvalds 	if (namelen > sizeof (namebuf) - 3) {
4361da177e4SLinus Torvalds 	    strncpy (namebuf + 1, name, sizeof (namebuf) - 3);
4371da177e4SLinus Torvalds 	    namebuf[sizeof (namebuf) - 2] = '"';
4381da177e4SLinus Torvalds 	    namebuf[sizeof (namebuf) - 1] = 0;
4391da177e4SLinus Torvalds 	} else {
4401da177e4SLinus Torvalds 	    memcpy (namebuf + 1, name, namelen);
4411da177e4SLinus Torvalds 	    namebuf[namelen + 1] = '"';
4421da177e4SLinus Torvalds 	    namebuf[namelen + 2] = 0;
4431da177e4SLinus Torvalds 	}
4441da177e4SLinus Torvalds 
4451da177e4SLinus Torvalds 	printk ("%d:  %-15s%-15d%-15d%-15Ld%-15Ld(%s)\n",
4461da177e4SLinus Torvalds 		i, namebuf,
4471da177e4SLinus Torvalds 		deh_dir_id(deh), deh_objectid(deh),
4481da177e4SLinus Torvalds 		GET_HASH_VALUE (deh_offset (deh)), GET_GENERATION_NUMBER ((deh_offset (deh))),
4491da177e4SLinus Torvalds 		(de_hidden (deh)) ? "HIDDEN" : "VISIBLE");
4501da177e4SLinus Torvalds     }
4511da177e4SLinus Torvalds }
4521da177e4SLinus Torvalds 
4531da177e4SLinus Torvalds 
4541da177e4SLinus Torvalds static void direntry_check_item (struct item_head * ih, char * item)
4551da177e4SLinus Torvalds {
4561da177e4SLinus Torvalds     int i;
4571da177e4SLinus Torvalds     struct reiserfs_de_head * deh;
4581da177e4SLinus Torvalds 
4591da177e4SLinus Torvalds     // FIXME: type something here!
4601da177e4SLinus Torvalds     deh = (struct reiserfs_de_head *)item;
4611da177e4SLinus Torvalds     for (i = 0; i < I_ENTRY_COUNT (ih); i ++, deh ++) {
4621da177e4SLinus Torvalds 	;
4631da177e4SLinus Torvalds     }
4641da177e4SLinus Torvalds }
4651da177e4SLinus Torvalds 
4661da177e4SLinus Torvalds 
4671da177e4SLinus Torvalds 
4681da177e4SLinus Torvalds #define DIRENTRY_VI_FIRST_DIRENTRY_ITEM 1
4691da177e4SLinus Torvalds 
4701da177e4SLinus Torvalds /*
4711da177e4SLinus Torvalds  * function returns old entry number in directory item in real node
4721da177e4SLinus Torvalds  * using new entry number in virtual item in virtual node */
4731da177e4SLinus Torvalds static inline int old_entry_num (int is_affected, int virtual_entry_num, int pos_in_item, int mode)
4741da177e4SLinus Torvalds {
4751da177e4SLinus Torvalds     if ( mode == M_INSERT || mode == M_DELETE)
4761da177e4SLinus Torvalds 	return virtual_entry_num;
4771da177e4SLinus Torvalds 
4781da177e4SLinus Torvalds     if (!is_affected)
4791da177e4SLinus Torvalds 	/* cut or paste is applied to another item */
4801da177e4SLinus Torvalds 	return virtual_entry_num;
4811da177e4SLinus Torvalds 
4821da177e4SLinus Torvalds     if (virtual_entry_num < pos_in_item)
4831da177e4SLinus Torvalds 	return virtual_entry_num;
4841da177e4SLinus Torvalds 
4851da177e4SLinus Torvalds     if (mode == M_CUT)
4861da177e4SLinus Torvalds 	return virtual_entry_num + 1;
4871da177e4SLinus Torvalds 
4881da177e4SLinus Torvalds     RFALSE( mode != M_PASTE || virtual_entry_num == 0,
4891da177e4SLinus Torvalds 	    "vs-8015: old_entry_num: mode must be M_PASTE (mode = \'%c\'", mode);
4901da177e4SLinus Torvalds 
4911da177e4SLinus Torvalds     return virtual_entry_num - 1;
4921da177e4SLinus Torvalds }
4931da177e4SLinus Torvalds 
4941da177e4SLinus Torvalds 
4951da177e4SLinus Torvalds 
4961da177e4SLinus Torvalds 
4971da177e4SLinus Torvalds /* Create an array of sizes of directory entries for virtual
4981da177e4SLinus Torvalds    item. Return space used by an item. FIXME: no control over
4991da177e4SLinus Torvalds    consuming of space used by this item handler */
5001da177e4SLinus Torvalds static int direntry_create_vi (struct virtual_node * vn,
5011da177e4SLinus Torvalds 			       struct virtual_item * vi,
5021da177e4SLinus Torvalds 			       int is_affected,
5031da177e4SLinus Torvalds 			       int insert_size)
5041da177e4SLinus Torvalds {
5051da177e4SLinus Torvalds     struct direntry_uarea * dir_u = vi->vi_uarea;
5061da177e4SLinus Torvalds     int i, j;
5071da177e4SLinus Torvalds     int size = sizeof (struct direntry_uarea);
5081da177e4SLinus Torvalds     struct reiserfs_de_head * deh;
5091da177e4SLinus Torvalds 
5101da177e4SLinus Torvalds     vi->vi_index = TYPE_DIRENTRY;
5111da177e4SLinus Torvalds 
5121da177e4SLinus Torvalds     if (!(vi->vi_ih) || !vi->vi_item)
5131da177e4SLinus Torvalds 	BUG ();
5141da177e4SLinus Torvalds 
5151da177e4SLinus Torvalds 
5161da177e4SLinus Torvalds     dir_u->flags = 0;
5171da177e4SLinus Torvalds     if (le_ih_k_offset (vi->vi_ih) == DOT_OFFSET)
5181da177e4SLinus Torvalds 	dir_u->flags |= DIRENTRY_VI_FIRST_DIRENTRY_ITEM;
5191da177e4SLinus Torvalds 
5201da177e4SLinus Torvalds     deh = (struct reiserfs_de_head *)(vi->vi_item);
5211da177e4SLinus Torvalds 
5221da177e4SLinus Torvalds 
5231da177e4SLinus Torvalds     /* virtual directory item have this amount of entry after */
5241da177e4SLinus Torvalds     dir_u->entry_count = ih_entry_count (vi->vi_ih) +
5251da177e4SLinus Torvalds 	((is_affected) ? ((vn->vn_mode == M_CUT) ? -1 :
5261da177e4SLinus Torvalds 			  (vn->vn_mode == M_PASTE ? 1 : 0)) : 0);
5271da177e4SLinus Torvalds 
5281da177e4SLinus Torvalds     for (i = 0; i < dir_u->entry_count; i ++) {
5291da177e4SLinus Torvalds 	j = old_entry_num (is_affected, i, vn->vn_pos_in_item, vn->vn_mode);
5301da177e4SLinus Torvalds         dir_u->entry_sizes[i] = (j ? deh_location( &(deh[j - 1]) ) :
5311da177e4SLinus Torvalds                                 ih_item_len (vi->vi_ih)) -
5321da177e4SLinus Torvalds                                 deh_location( &(deh[j])) + DEH_SIZE;
5331da177e4SLinus Torvalds     }
5341da177e4SLinus Torvalds 
5351da177e4SLinus Torvalds     size += (dir_u->entry_count * sizeof (short));
5361da177e4SLinus Torvalds 
5371da177e4SLinus Torvalds     /* set size of pasted entry */
5381da177e4SLinus Torvalds     if (is_affected && vn->vn_mode == M_PASTE)
5391da177e4SLinus Torvalds 	dir_u->entry_sizes[vn->vn_pos_in_item] = insert_size;
5401da177e4SLinus Torvalds 
5411da177e4SLinus Torvalds 
5421da177e4SLinus Torvalds #ifdef CONFIG_REISERFS_CHECK
5431da177e4SLinus Torvalds     /* compare total size of entries with item length */
5441da177e4SLinus Torvalds     {
5451da177e4SLinus Torvalds 	int k, l;
5461da177e4SLinus Torvalds 
5471da177e4SLinus Torvalds 	l = 0;
5481da177e4SLinus Torvalds 	for (k = 0; k < dir_u->entry_count; k ++)
5491da177e4SLinus Torvalds 	    l += dir_u->entry_sizes[k];
5501da177e4SLinus Torvalds 
5511da177e4SLinus Torvalds 	if (l + IH_SIZE != vi->vi_item_len +
5521da177e4SLinus Torvalds 	    ((is_affected && (vn->vn_mode == M_PASTE || vn->vn_mode == M_CUT)) ? insert_size : 0) ) {
5531da177e4SLinus Torvalds 	    reiserfs_panic (NULL, "vs-8025: set_entry_sizes: (mode==%c, insert_size==%d), invalid length of directory item",
5541da177e4SLinus Torvalds 			    vn->vn_mode, insert_size);
5551da177e4SLinus Torvalds 	}
5561da177e4SLinus Torvalds     }
5571da177e4SLinus Torvalds #endif
5581da177e4SLinus Torvalds 
5591da177e4SLinus Torvalds     return size;
5601da177e4SLinus Torvalds 
5611da177e4SLinus Torvalds 
5621da177e4SLinus Torvalds }
5631da177e4SLinus Torvalds 
5641da177e4SLinus Torvalds 
5651da177e4SLinus Torvalds //
5661da177e4SLinus Torvalds // return number of entries which may fit into specified amount of
5671da177e4SLinus Torvalds // free space, or -1 if free space is not enough even for 1 entry
5681da177e4SLinus Torvalds //
5691da177e4SLinus Torvalds static int direntry_check_left (struct virtual_item * vi, int free,
5701da177e4SLinus Torvalds 				int start_skip, int end_skip)
5711da177e4SLinus Torvalds {
5721da177e4SLinus Torvalds     int i;
5731da177e4SLinus Torvalds     int entries = 0;
5741da177e4SLinus Torvalds     struct direntry_uarea * dir_u = vi->vi_uarea;
5751da177e4SLinus Torvalds 
5761da177e4SLinus Torvalds     for (i = start_skip; i < dir_u->entry_count - end_skip; i ++) {
5771da177e4SLinus Torvalds 	if (dir_u->entry_sizes[i] > free)
5781da177e4SLinus Torvalds 	    /* i-th entry doesn't fit into the remaining free space */
5791da177e4SLinus Torvalds 	    break;
5801da177e4SLinus Torvalds 
5811da177e4SLinus Torvalds 	free -= dir_u->entry_sizes[i];
5821da177e4SLinus Torvalds 	entries ++;
5831da177e4SLinus Torvalds     }
5841da177e4SLinus Torvalds 
5851da177e4SLinus Torvalds     if (entries == dir_u->entry_count) {
5861da177e4SLinus Torvalds 	reiserfs_panic (NULL, "free space %d, entry_count %d\n", free, dir_u->entry_count);
5871da177e4SLinus Torvalds     }
5881da177e4SLinus Torvalds 
5891da177e4SLinus Torvalds     /* "." and ".." can not be separated from each other */
5901da177e4SLinus Torvalds     if (start_skip == 0 && (dir_u->flags & DIRENTRY_VI_FIRST_DIRENTRY_ITEM) && entries < 2)
5911da177e4SLinus Torvalds 	entries = 0;
5921da177e4SLinus Torvalds 
5931da177e4SLinus Torvalds     return entries ?: -1;
5941da177e4SLinus Torvalds }
5951da177e4SLinus Torvalds 
5961da177e4SLinus Torvalds 
5971da177e4SLinus Torvalds static int direntry_check_right (struct virtual_item * vi, int free)
5981da177e4SLinus Torvalds {
5991da177e4SLinus Torvalds     int i;
6001da177e4SLinus Torvalds     int entries = 0;
6011da177e4SLinus Torvalds     struct direntry_uarea * dir_u = vi->vi_uarea;
6021da177e4SLinus Torvalds 
6031da177e4SLinus Torvalds     for (i = dir_u->entry_count - 1; i >= 0; i --) {
6041da177e4SLinus Torvalds 	if (dir_u->entry_sizes[i] > free)
6051da177e4SLinus Torvalds 	    /* i-th entry doesn't fit into the remaining free space */
6061da177e4SLinus Torvalds 	    break;
6071da177e4SLinus Torvalds 
6081da177e4SLinus Torvalds 	free -= dir_u->entry_sizes[i];
6091da177e4SLinus Torvalds 	entries ++;
6101da177e4SLinus Torvalds     }
6111da177e4SLinus Torvalds     if (entries == dir_u->entry_count)
6121da177e4SLinus Torvalds 	BUG ();
6131da177e4SLinus Torvalds 
6141da177e4SLinus Torvalds     /* "." and ".." can not be separated from each other */
6151da177e4SLinus Torvalds     if ((dir_u->flags & DIRENTRY_VI_FIRST_DIRENTRY_ITEM) && entries > dir_u->entry_count - 2)
6161da177e4SLinus Torvalds 	entries = dir_u->entry_count - 2;
6171da177e4SLinus Torvalds 
6181da177e4SLinus Torvalds     return entries ?: -1;
6191da177e4SLinus Torvalds }
6201da177e4SLinus Torvalds 
6211da177e4SLinus Torvalds 
6221da177e4SLinus Torvalds /* sum of entry sizes between from-th and to-th entries including both edges */
6231da177e4SLinus Torvalds static int direntry_part_size (struct virtual_item * vi, int first, int count)
6241da177e4SLinus Torvalds {
6251da177e4SLinus Torvalds     int i, retval;
6261da177e4SLinus Torvalds     int from, to;
6271da177e4SLinus Torvalds     struct direntry_uarea * dir_u = vi->vi_uarea;
6281da177e4SLinus Torvalds 
6291da177e4SLinus Torvalds     retval = 0;
6301da177e4SLinus Torvalds     if (first == 0)
6311da177e4SLinus Torvalds 	from = 0;
6321da177e4SLinus Torvalds     else
6331da177e4SLinus Torvalds 	from = dir_u->entry_count - count;
6341da177e4SLinus Torvalds     to = from + count - 1;
6351da177e4SLinus Torvalds 
6361da177e4SLinus Torvalds     for (i = from; i <= to; i ++)
6371da177e4SLinus Torvalds 	retval += dir_u->entry_sizes[i];
6381da177e4SLinus Torvalds 
6391da177e4SLinus Torvalds     return retval;
6401da177e4SLinus Torvalds }
6411da177e4SLinus Torvalds 
6421da177e4SLinus Torvalds static int direntry_unit_num (struct virtual_item * vi)
6431da177e4SLinus Torvalds {
6441da177e4SLinus Torvalds     struct direntry_uarea * dir_u = vi->vi_uarea;
6451da177e4SLinus Torvalds 
6461da177e4SLinus Torvalds     return dir_u->entry_count;
6471da177e4SLinus Torvalds }
6481da177e4SLinus Torvalds 
6491da177e4SLinus Torvalds 
6501da177e4SLinus Torvalds 
6511da177e4SLinus Torvalds static void direntry_print_vi (struct virtual_item * vi)
6521da177e4SLinus Torvalds {
6531da177e4SLinus Torvalds     int i;
6541da177e4SLinus Torvalds     struct direntry_uarea * dir_u = vi->vi_uarea;
6551da177e4SLinus Torvalds 
6561da177e4SLinus Torvalds     reiserfs_warning (NULL, "DIRENTRY, index %d, type 0x%x, %h, flags 0x%x",
6571da177e4SLinus Torvalds 		      vi->vi_index, vi->vi_type, vi->vi_ih, dir_u->flags);
6581da177e4SLinus Torvalds     printk ("%d entries: ", dir_u->entry_count);
6591da177e4SLinus Torvalds     for (i = 0; i < dir_u->entry_count; i ++)
6601da177e4SLinus Torvalds 	printk ("%d ", dir_u->entry_sizes[i]);
6611da177e4SLinus Torvalds     printk ("\n");
6621da177e4SLinus Torvalds }
6631da177e4SLinus Torvalds 
6641da177e4SLinus Torvalds static struct item_operations direntry_ops = {
6651da177e4SLinus Torvalds 	.bytes_number		= direntry_bytes_number,
6661da177e4SLinus Torvalds 	.decrement_key		= direntry_decrement_key,
6671da177e4SLinus Torvalds 	.is_left_mergeable	= direntry_is_left_mergeable,
6681da177e4SLinus Torvalds 	.print_item		= direntry_print_item,
6691da177e4SLinus Torvalds 	.check_item		= direntry_check_item,
6701da177e4SLinus Torvalds 
6711da177e4SLinus Torvalds 	.create_vi		= direntry_create_vi,
6721da177e4SLinus Torvalds 	.check_left		= direntry_check_left,
6731da177e4SLinus Torvalds 	.check_right		= direntry_check_right,
6741da177e4SLinus Torvalds 	.part_size		= direntry_part_size,
6751da177e4SLinus Torvalds 	.unit_num		= direntry_unit_num,
6761da177e4SLinus Torvalds 	.print_vi		= direntry_print_vi
6771da177e4SLinus Torvalds };
6781da177e4SLinus Torvalds 
6791da177e4SLinus Torvalds 
6801da177e4SLinus Torvalds //////////////////////////////////////////////////////////////////////////////
6811da177e4SLinus Torvalds // Error catching functions to catch errors caused by incorrect item types.
6821da177e4SLinus Torvalds //
6831da177e4SLinus Torvalds static int errcatch_bytes_number (struct item_head * ih, int block_size)
6841da177e4SLinus Torvalds {
6851da177e4SLinus Torvalds     reiserfs_warning (NULL, "green-16001: Invalid item type observed, run fsck ASAP");
6861da177e4SLinus Torvalds     return 0;
6871da177e4SLinus Torvalds }
6881da177e4SLinus Torvalds 
6891da177e4SLinus Torvalds static void errcatch_decrement_key (struct cpu_key * key)
6901da177e4SLinus Torvalds {
6911da177e4SLinus Torvalds     reiserfs_warning (NULL, "green-16002: Invalid item type observed, run fsck ASAP");
6921da177e4SLinus Torvalds }
6931da177e4SLinus Torvalds 
6941da177e4SLinus Torvalds 
6951da177e4SLinus Torvalds static int errcatch_is_left_mergeable (struct reiserfs_key * key, unsigned long bsize)
6961da177e4SLinus Torvalds {
6971da177e4SLinus Torvalds     reiserfs_warning (NULL, "green-16003: Invalid item type observed, run fsck ASAP");
6981da177e4SLinus Torvalds     return 0;
6991da177e4SLinus Torvalds }
7001da177e4SLinus Torvalds 
7011da177e4SLinus Torvalds 
7021da177e4SLinus Torvalds static void errcatch_print_item (struct item_head * ih, char * item)
7031da177e4SLinus Torvalds {
7041da177e4SLinus Torvalds     reiserfs_warning (NULL, "green-16004: Invalid item type observed, run fsck ASAP");
7051da177e4SLinus Torvalds }
7061da177e4SLinus Torvalds 
7071da177e4SLinus Torvalds 
7081da177e4SLinus Torvalds static void errcatch_check_item (struct item_head * ih, char * item)
7091da177e4SLinus Torvalds {
7101da177e4SLinus Torvalds     reiserfs_warning (NULL, "green-16005: Invalid item type observed, run fsck ASAP");
7111da177e4SLinus Torvalds }
7121da177e4SLinus Torvalds 
7131da177e4SLinus Torvalds static int errcatch_create_vi (struct virtual_node * vn,
7141da177e4SLinus Torvalds 			       struct virtual_item * vi,
7151da177e4SLinus Torvalds 			       int is_affected,
7161da177e4SLinus Torvalds 			       int insert_size)
7171da177e4SLinus Torvalds {
7181da177e4SLinus Torvalds     reiserfs_warning (NULL, "green-16006: Invalid item type observed, run fsck ASAP");
7191da177e4SLinus Torvalds     return 0;	// We might return -1 here as well, but it won't help as create_virtual_node() from where
7201da177e4SLinus Torvalds 		// this operation is called from is of return type void.
7211da177e4SLinus Torvalds }
7221da177e4SLinus Torvalds 
7231da177e4SLinus Torvalds static int errcatch_check_left (struct virtual_item * vi, int free,
7241da177e4SLinus Torvalds 				int start_skip, int end_skip)
7251da177e4SLinus Torvalds {
7261da177e4SLinus Torvalds     reiserfs_warning (NULL, "green-16007: Invalid item type observed, run fsck ASAP");
7271da177e4SLinus Torvalds     return -1;
7281da177e4SLinus Torvalds }
7291da177e4SLinus Torvalds 
7301da177e4SLinus Torvalds 
7311da177e4SLinus Torvalds static int errcatch_check_right (struct virtual_item * vi, int free)
7321da177e4SLinus Torvalds {
7331da177e4SLinus Torvalds     reiserfs_warning (NULL, "green-16008: Invalid item type observed, run fsck ASAP");
7341da177e4SLinus Torvalds     return -1;
7351da177e4SLinus Torvalds }
7361da177e4SLinus Torvalds 
7371da177e4SLinus Torvalds static int errcatch_part_size (struct virtual_item * vi, int first, int count)
7381da177e4SLinus Torvalds {
7391da177e4SLinus Torvalds     reiserfs_warning (NULL, "green-16009: Invalid item type observed, run fsck ASAP");
7401da177e4SLinus Torvalds     return 0;
7411da177e4SLinus Torvalds }
7421da177e4SLinus Torvalds 
7431da177e4SLinus Torvalds static int errcatch_unit_num (struct virtual_item * vi)
7441da177e4SLinus Torvalds {
7451da177e4SLinus Torvalds     reiserfs_warning (NULL, "green-16010: Invalid item type observed, run fsck ASAP");
7461da177e4SLinus Torvalds     return 0;
7471da177e4SLinus Torvalds }
7481da177e4SLinus Torvalds 
7491da177e4SLinus Torvalds static void errcatch_print_vi (struct virtual_item * vi)
7501da177e4SLinus Torvalds {
7511da177e4SLinus Torvalds     reiserfs_warning (NULL, "green-16011: Invalid item type observed, run fsck ASAP");
7521da177e4SLinus Torvalds }
7531da177e4SLinus Torvalds 
7541da177e4SLinus Torvalds static struct item_operations errcatch_ops = {
7551da177e4SLinus Torvalds     errcatch_bytes_number,
7561da177e4SLinus Torvalds     errcatch_decrement_key,
7571da177e4SLinus Torvalds     errcatch_is_left_mergeable,
7581da177e4SLinus Torvalds     errcatch_print_item,
7591da177e4SLinus Torvalds     errcatch_check_item,
7601da177e4SLinus Torvalds 
7611da177e4SLinus Torvalds     errcatch_create_vi,
7621da177e4SLinus Torvalds     errcatch_check_left,
7631da177e4SLinus Torvalds     errcatch_check_right,
7641da177e4SLinus Torvalds     errcatch_part_size,
7651da177e4SLinus Torvalds     errcatch_unit_num,
7661da177e4SLinus Torvalds     errcatch_print_vi
7671da177e4SLinus Torvalds };
7681da177e4SLinus Torvalds 
7691da177e4SLinus Torvalds 
7701da177e4SLinus Torvalds 
7711da177e4SLinus Torvalds //////////////////////////////////////////////////////////////////////////////
7721da177e4SLinus Torvalds //
7731da177e4SLinus Torvalds //
7741da177e4SLinus Torvalds #if ! (TYPE_STAT_DATA == 0 && TYPE_INDIRECT == 1 && TYPE_DIRECT == 2 && TYPE_DIRENTRY == 3)
7757fa94c88SJeff Mahoney #error Item types must use disk-format assigned values.
7761da177e4SLinus Torvalds #endif
7771da177e4SLinus Torvalds 
7781da177e4SLinus Torvalds struct item_operations * item_ops [TYPE_ANY + 1] = {
7791da177e4SLinus Torvalds   &stat_data_ops,
7801da177e4SLinus Torvalds   &indirect_ops,
7811da177e4SLinus Torvalds   &direct_ops,
7821da177e4SLinus Torvalds   &direntry_ops,
7831da177e4SLinus Torvalds   NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
7841da177e4SLinus Torvalds   &errcatch_ops		/* This is to catch errors with invalid type (15th entry for TYPE_ANY) */
7851da177e4SLinus Torvalds };
7861da177e4SLinus Torvalds 
7871da177e4SLinus Torvalds 
7881da177e4SLinus Torvalds 
7891da177e4SLinus Torvalds 
790