📄 item_ops.c
字号:
/* * 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//static int sd_bytes_number(struct item_head *ih, int block_size){ return 0;}static void sd_decrement_key(struct cpu_key *key){ key->on_disk_key.k_objectid--; set_cpu_key_k_type(key, TYPE_ANY); set_cpu_key_k_offset(key, (loff_t)(~0ULL >> 1));}static int sd_is_left_mergeable(struct reiserfs_key *key, unsigned long bsize){ return 0;}static char *print_time(time_t t){ static char timebuf[256]; sprintf(timebuf, "%ld", t); return timebuf;}static void sd_print_item(struct item_head *ih, char *item){ printk("\tmode | size | nlinks | first direct | mtime\n"); if (stat_data_v1(ih)) { struct stat_data_v1 *sd = (struct stat_data_v1 *)item; printk("\t0%-6o | %6u | %2u | %d | %s\n", 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; printk("\t0%-6o | %6Lu | %2u | %d | %s\n", 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))); }}static void sd_check_item(struct item_head *ih, char *item){ // FIXME: type something here!}static int sd_create_vi(struct virtual_node *vn, struct virtual_item *vi, int is_affected, int insert_size){ vi->vi_index = TYPE_STAT_DATA; //vi->vi_type |= VI_TYPE_STAT_DATA;// not needed? return 0;}static int sd_check_left(struct virtual_item *vi, int free, int start_skip, int end_skip){ BUG_ON(start_skip || end_skip); return -1;}static int sd_check_right(struct virtual_item *vi, int free){ return -1;}static int sd_part_size(struct virtual_item *vi, int first, int count){ BUG_ON(count); return 0;}static int sd_unit_num(struct virtual_item *vi){ return vi->vi_item_len - IH_SIZE;}static void sd_print_vi(struct virtual_item *vi){ reiserfs_warning(NULL, "STATDATA, index %d, type 0x%x, %h", vi->vi_index, vi->vi_type, vi->vi_ih);}static struct item_operations stat_data_ops = { .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};//////////////////////////////////////////////////////////////////////////////// direct item functions//static int direct_bytes_number(struct item_head *ih, int block_size){ return ih_item_len(ih);}// FIXME: this should probably switch to indirect as wellstatic void direct_decrement_key(struct cpu_key *key){ cpu_key_k_offset_dec(key); if (cpu_key_k_offset(key) == 0) set_cpu_key_k_type(key, TYPE_STAT_DATA);}static int direct_is_left_mergeable(struct reiserfs_key *key, unsigned long bsize){ int version = le_key_version(key); return ((le_key_k_offset(version, key) & (bsize - 1)) != 1);}static void direct_print_item(struct item_head *ih, char *item){ int j = 0;// return; printk("\""); while (j < ih_item_len(ih)) printk("%c", item[j++]); printk("\"\n");}static void direct_check_item(struct item_head *ih, char *item){ // FIXME: type something here!}static int direct_create_vi(struct virtual_node *vn, struct virtual_item *vi, int is_affected, int insert_size){ vi->vi_index = TYPE_DIRECT; //vi->vi_type |= VI_TYPE_DIRECT; return 0;}static int direct_check_left(struct virtual_item *vi, int free, int start_skip, int end_skip){ int bytes; bytes = free - free % 8; return bytes ? : -1;}static int direct_check_right(struct virtual_item *vi, int free){ return direct_check_left(vi, free, 0, 0);}static int direct_part_size(struct virtual_item *vi, int first, int count){ return count;}static int direct_unit_num(struct virtual_item *vi){ return vi->vi_item_len - IH_SIZE;}static void direct_print_vi(struct virtual_item *vi){ reiserfs_warning(NULL, "DIRECT, index %d, type 0x%x, %h", vi->vi_index, vi->vi_type, vi->vi_ih);}static struct item_operations direct_ops = { .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};//////////////////////////////////////////////////////////////////////////////// indirect item functions//static int indirect_bytes_number(struct item_head *ih, int block_size){ return ih_item_len(ih) / UNFM_P_SIZE * block_size; //- get_ih_free_space (ih);}// decrease offset, if it becomes 0, change type to stat datastatic void indirect_decrement_key(struct cpu_key *key){ cpu_key_k_offset_dec(key); if (cpu_key_k_offset(key) == 0) set_cpu_key_k_type(key, TYPE_STAT_DATA);}// if it is not first item of the body, then it is mergeablestatic int indirect_is_left_mergeable(struct reiserfs_key *key, unsigned long bsize){ int version = le_key_version(key); return (le_key_k_offset(version, key) != 1);}// printing of indirect itemstatic void start_new_sequence(__u32 * start, int *len, __u32 new){ *start = new; *len = 1;}static int sequence_finished(__u32 start, int *len, __u32 new){ if (start == INT_MAX) return 1; if (start == 0 && new == 0) { (*len)++; return 0; } if (start != 0 && (start + *len) == new) { (*len)++; return 0; } return 1;}static void print_sequence(__u32 start, int len){ if (start == INT_MAX) return; if (len == 1) printk(" %d", start); else printk(" %d(%d)", start, len);}static void indirect_print_item(struct item_head *ih, char *item){ int j; __le32 *unp; __u32 prev = INT_MAX; int num = 0; unp = (__le32 *) item; if (ih_item_len(ih) % UNFM_P_SIZE) reiserfs_warning(NULL, "indirect_print_item: invalid item len"); printk("%d pointers\n[ ", (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)); } } print_sequence(prev, num); printk("]\n");}static void indirect_check_item(struct item_head *ih, char *item){ // FIXME: type something here!}static int indirect_create_vi(struct virtual_node *vn, struct virtual_item *vi, int is_affected, int insert_size){ vi->vi_index = TYPE_INDIRECT; //vi->vi_type |= VI_TYPE_INDIRECT; return 0;}static int indirect_check_left(struct virtual_item *vi, int free, int start_skip, int end_skip){ int bytes; bytes = free - free % UNFM_P_SIZE; return bytes ? : -1;}static int indirect_check_right(struct virtual_item *vi, int free){ return indirect_check_left(vi, free, 0, 0);}// return size in bytes of 'units' units. If first == 0 - calculate from the head (left), otherwise - from tail (right)static int indirect_part_size(struct virtual_item *vi, int first, int units){ // unit of indirect item is byte (yet) return units;}static int indirect_unit_num(struct virtual_item *vi){ // unit of indirect item is byte (yet) return vi->vi_item_len - IH_SIZE;}static void indirect_print_vi(struct virtual_item *vi){ reiserfs_warning(NULL, "INDIRECT, index %d, type 0x%x, %h", vi->vi_index, vi->vi_type, vi->vi_ih);}static struct item_operations indirect_ops = { .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};//////////////////////////////////////////////////////////////////////////////// direntry functions//static int direntry_bytes_number(struct item_head *ih, int block_size){ reiserfs_warning(NULL, "vs-16090: direntry_bytes_number: " "bytes number is asked for direntry"); return 0;}static void direntry_decrement_key(struct cpu_key *key){ cpu_key_k_offset_dec(key); if (cpu_key_k_offset(key) == 0) set_cpu_key_k_type(key, TYPE_STAT_DATA);}static int direntry_is_left_mergeable(struct reiserfs_key *key, unsigned long bsize){
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -