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

📄 inode.c

📁 Linux内核源代码 为压缩文件 是<<Linux内核>>一书中的源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
	buf->f_bavail = buf->f_bfree;	buf->f_files = sb->u.minix_sb.s_ninodes;	buf->f_ffree = minix_count_free_inodes(sb);	buf->f_namelen = sb->u.minix_sb.s_namelen;	return 0;}static int minix_get_block(struct inode *inode, long block,		    struct buffer_head *bh_result, int create){	if (INODE_VERSION(inode) == MINIX_V1)		return V1_minix_get_block(inode, block, bh_result, create);	else		return V2_minix_get_block(inode, block, bh_result, create);}/* * the global minix fs getblk function. */struct buffer_head *minix_getblk(struct inode *inode, int block, int create){	struct buffer_head dummy;	int error;	dummy.b_state = 0;	dummy.b_blocknr = -1000;	error = minix_get_block(inode, block, &dummy, create);	if (!error && buffer_mapped(&dummy)) {		struct buffer_head *bh;		bh = getblk(dummy.b_dev, dummy.b_blocknr, BLOCK_SIZE);		if (buffer_new(&dummy)) {			memset(bh->b_data, 0, BLOCK_SIZE);			mark_buffer_uptodate(bh, 1);			mark_buffer_dirty(bh);		}		return bh;	}	return NULL;}struct buffer_head * minix_bread(struct inode * inode, int block, int create){	struct buffer_head * bh;	bh = minix_getblk(inode, block, create);	if (!bh || buffer_uptodate(bh))		return bh;	ll_rw_block(READ, 1, &bh);	wait_on_buffer(bh);	if (buffer_uptodate(bh))		return bh;	brelse(bh);	return NULL;}static int minix_writepage(struct page *page){	return block_write_full_page(page,minix_get_block);}static int minix_readpage(struct file *file, struct page *page){	return block_read_full_page(page,minix_get_block);}static int minix_prepare_write(struct file *file, struct page *page, unsigned from, unsigned to){	return block_prepare_write(page,from,to,minix_get_block);}static int minix_bmap(struct address_space *mapping, long block){	return generic_block_bmap(mapping,block,minix_get_block);}struct address_space_operations minix_aops = {	readpage: minix_readpage,	writepage: minix_writepage,	sync_page: block_sync_page,	prepare_write: minix_prepare_write,	commit_write: generic_commit_write,	bmap: minix_bmap};/* * The minix V1 function to read an inode. */static void V1_minix_read_inode(struct inode * inode){	struct buffer_head * bh;	struct minix_inode * raw_inode;	int block, ino;	ino = inode->i_ino;	inode->i_mode = 0;	if (!ino || ino > inode->i_sb->u.minix_sb.s_ninodes) {		printk("Bad inode number on dev %s"		       ": %d is out of range\n",			kdevname(inode->i_dev), ino);		return;	}	block = 2 + inode->i_sb->u.minix_sb.s_imap_blocks +		    inode->i_sb->u.minix_sb.s_zmap_blocks +		    (ino-1)/MINIX_INODES_PER_BLOCK;	if (!(bh=bread(inode->i_dev,block, BLOCK_SIZE))) {		printk("Major problem: unable to read inode from dev "		       "%s\n", kdevname(inode->i_dev));		return;	}	raw_inode = ((struct minix_inode *) bh->b_data) +		    (ino-1)%MINIX_INODES_PER_BLOCK;	inode->i_mode = raw_inode->i_mode;	inode->i_uid = (uid_t)raw_inode->i_uid;	inode->i_gid = (gid_t)raw_inode->i_gid;	inode->i_nlink = raw_inode->i_nlinks;	inode->i_size = raw_inode->i_size;	inode->i_mtime = inode->i_atime = inode->i_ctime = raw_inode->i_time;	inode->i_blocks = inode->i_blksize = 0;	for (block = 0; block < 9; block++)		inode->u.minix_i.u.i1_data[block] = raw_inode->i_zone[block];	if (S_ISREG(inode->i_mode)) {		inode->i_op = &minix_file_inode_operations;		inode->i_fop = &minix_file_operations;		inode->i_mapping->a_ops = &minix_aops;	} else if (S_ISDIR(inode->i_mode)) {		inode->i_op = &minix_dir_inode_operations;		inode->i_fop = &minix_dir_operations;	} else if (S_ISLNK(inode->i_mode)) {		inode->i_op = &page_symlink_inode_operations;		inode->i_mapping->a_ops = &minix_aops;	} else		init_special_inode(inode, inode->i_mode, raw_inode->i_zone[0]);	brelse(bh);}/* * The minix V2 function to read an inode. */static void V2_minix_read_inode(struct inode * inode){	struct buffer_head * bh;	struct minix2_inode * raw_inode;	int block, ino;	ino = inode->i_ino;	inode->i_mode = 0;	if (!ino || ino > inode->i_sb->u.minix_sb.s_ninodes) {		printk("Bad inode number on dev %s"		       ": %d is out of range\n",			kdevname(inode->i_dev), ino);		return;	}	block = 2 + inode->i_sb->u.minix_sb.s_imap_blocks +		    inode->i_sb->u.minix_sb.s_zmap_blocks +		    (ino-1)/MINIX2_INODES_PER_BLOCK;	if (!(bh=bread(inode->i_dev,block, BLOCK_SIZE))) {		printk("Major problem: unable to read inode from dev "		       "%s\n", kdevname(inode->i_dev));		return;	}	raw_inode = ((struct minix2_inode *) bh->b_data) +		    (ino-1)%MINIX2_INODES_PER_BLOCK;	inode->i_mode = raw_inode->i_mode;	inode->i_uid = (uid_t)raw_inode->i_uid;	inode->i_gid = (gid_t)raw_inode->i_gid;	inode->i_nlink = raw_inode->i_nlinks;	inode->i_size = raw_inode->i_size;	inode->i_mtime = raw_inode->i_mtime;	inode->i_atime = raw_inode->i_atime;	inode->i_ctime = raw_inode->i_ctime;	inode->i_blocks = inode->i_blksize = 0;	for (block = 0; block < 10; block++)		inode->u.minix_i.u.i2_data[block] = raw_inode->i_zone[block];	if (S_ISREG(inode->i_mode)) {		inode->i_op = &minix_file_inode_operations;		inode->i_fop = &minix_file_operations;		inode->i_mapping->a_ops = &minix_aops;	} else if (S_ISDIR(inode->i_mode)) {		inode->i_op = &minix_dir_inode_operations;		inode->i_fop = &minix_dir_operations;	} else if (S_ISLNK(inode->i_mode)) {		inode->i_op = &page_symlink_inode_operations;		inode->i_mapping->a_ops = &minix_aops;	} else		init_special_inode(inode, inode->i_mode, raw_inode->i_zone[0]);	brelse(bh);}/* * The global function to read an inode. */static void minix_read_inode(struct inode * inode){	if (INODE_VERSION(inode) == MINIX_V1)		V1_minix_read_inode(inode);	else		V2_minix_read_inode(inode);}/* * The minix V1 function to synchronize an inode. */static struct buffer_head * V1_minix_update_inode(struct inode * inode){	struct buffer_head * bh;	struct minix_inode * raw_inode;	int ino, block;	ino = inode->i_ino;	if (!ino || ino > inode->i_sb->u.minix_sb.s_ninodes) {		printk("Bad inode number on dev %s"		       ": %d is out of range\n",			kdevname(inode->i_dev), ino);		return 0;	}	block = 2 + inode->i_sb->u.minix_sb.s_imap_blocks + inode->i_sb->u.minix_sb.s_zmap_blocks +		(ino-1)/MINIX_INODES_PER_BLOCK;	if (!(bh=bread(inode->i_dev, block, BLOCK_SIZE))) {		printk("unable to read i-node block\n");		return 0;	}	raw_inode = ((struct minix_inode *)bh->b_data) +		(ino-1)%MINIX_INODES_PER_BLOCK;	raw_inode->i_mode = inode->i_mode;	raw_inode->i_uid = fs_high2lowuid(inode->i_uid);	raw_inode->i_gid = fs_high2lowgid(inode->i_gid);	raw_inode->i_nlinks = inode->i_nlink;	raw_inode->i_size = inode->i_size;	raw_inode->i_time = inode->i_mtime;	if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode))		raw_inode->i_zone[0] = kdev_t_to_nr(inode->i_rdev);	else for (block = 0; block < 9; block++)		raw_inode->i_zone[block] = inode->u.minix_i.u.i1_data[block];	mark_buffer_dirty(bh);	return bh;}/* * The minix V2 function to synchronize an inode. */static struct buffer_head * V2_minix_update_inode(struct inode * inode){	struct buffer_head * bh;	struct minix2_inode * raw_inode;	int ino, block;	ino = inode->i_ino;	if (!ino || ino > inode->i_sb->u.minix_sb.s_ninodes) {		printk("Bad inode number on dev %s"		       ": %d is out of range\n",			kdevname(inode->i_dev), ino);		return 0;	}	block = 2 + inode->i_sb->u.minix_sb.s_imap_blocks + inode->i_sb->u.minix_sb.s_zmap_blocks +		(ino-1)/MINIX2_INODES_PER_BLOCK;	if (!(bh=bread(inode->i_dev, block, BLOCK_SIZE))) {		printk("unable to read i-node block\n");		return 0;	}	raw_inode = ((struct minix2_inode *)bh->b_data) +		(ino-1)%MINIX2_INODES_PER_BLOCK;	raw_inode->i_mode = inode->i_mode;	raw_inode->i_uid = fs_high2lowuid(inode->i_uid);	raw_inode->i_gid = fs_high2lowgid(inode->i_gid);	raw_inode->i_nlinks = inode->i_nlink;	raw_inode->i_size = inode->i_size;	raw_inode->i_mtime = inode->i_mtime;	raw_inode->i_atime = inode->i_atime;	raw_inode->i_ctime = inode->i_ctime;	if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode))		raw_inode->i_zone[0] = kdev_t_to_nr(inode->i_rdev);	else for (block = 0; block < 10; block++)		raw_inode->i_zone[block] = inode->u.minix_i.u.i2_data[block];	mark_buffer_dirty(bh);	return bh;}static struct buffer_head *minix_update_inode(struct inode *inode){	if (INODE_VERSION(inode) == MINIX_V1)		return V1_minix_update_inode(inode);	else		return V2_minix_update_inode(inode);}static void minix_write_inode(struct inode * inode, int wait){	struct buffer_head *bh;	lock_kernel();	bh = minix_update_inode(inode);	unlock_kernel();	brelse(bh);}int minix_sync_inode(struct inode * inode){	int err = 0;	struct buffer_head *bh;	bh = minix_update_inode(inode);	if (bh && buffer_dirty(bh))	{		ll_rw_block(WRITE, 1, &bh);		wait_on_buffer(bh);		if (buffer_req(bh) && !buffer_uptodate(bh))		{			printk ("IO error syncing minix inode ["				"%s:%08lx]\n",				kdevname(inode->i_dev), inode->i_ino);			err = -1;		}	}	else if (!bh)		err = -1;	brelse (bh);	return err;}/* * The function that is called for file truncation. */void minix_truncate(struct inode * inode){	if (INODE_VERSION(inode) == MINIX_V1)		V1_minix_truncate(inode);	else		V2_minix_truncate(inode);}static DECLARE_FSTYPE_DEV(minix_fs_type,"minix",minix_read_super);static int __init init_minix_fs(void){        return register_filesystem(&minix_fs_type);}static void __exit exit_minix_fs(void){        unregister_filesystem(&minix_fs_type);}EXPORT_NO_SYMBOLS;module_init(init_minix_fs)module_exit(exit_minix_fs)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -