⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 item_ops.c

📁 linux 内核源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
/* * 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 + -