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

📄 inode.c

📁 linux 内核源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
			hfsplus_delete_cat(inode->i_ino, HFSPLUS_SB(sb).hidden_dir, NULL);			hfsplus_delete_inode(inode);		}		mutex_unlock(&inode->i_mutex);	}	return 0;}extern const struct inode_operations hfsplus_dir_inode_operations;extern struct file_operations hfsplus_dir_operations;static const struct inode_operations hfsplus_file_inode_operations = {	.lookup		= hfsplus_file_lookup,	.truncate	= hfsplus_file_truncate,	.permission	= hfsplus_permission,	.setxattr	= hfsplus_setxattr,	.getxattr	= hfsplus_getxattr,	.listxattr	= hfsplus_listxattr,};static const struct file_operations hfsplus_file_operations = {	.llseek 	= generic_file_llseek,	.read		= do_sync_read,	.aio_read	= generic_file_aio_read,	.write		= do_sync_write,	.aio_write	= generic_file_aio_write,	.mmap		= generic_file_mmap,	.splice_read	= generic_file_splice_read,	.fsync		= file_fsync,	.open		= hfsplus_file_open,	.release	= hfsplus_file_release,	.ioctl          = hfsplus_ioctl,};struct inode *hfsplus_new_inode(struct super_block *sb, int mode){	struct inode *inode = new_inode(sb);	if (!inode)		return NULL;	inode->i_ino = HFSPLUS_SB(sb).next_cnid++;	inode->i_mode = mode;	inode->i_uid = current->fsuid;	inode->i_gid = current->fsgid;	inode->i_nlink = 1;	inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME_SEC;	INIT_LIST_HEAD(&HFSPLUS_I(inode).open_dir_list);	init_MUTEX(&HFSPLUS_I(inode).extents_lock);	atomic_set(&HFSPLUS_I(inode).opencnt, 0);	HFSPLUS_I(inode).flags = 0;	memset(HFSPLUS_I(inode).first_extents, 0, sizeof(hfsplus_extent_rec));	memset(HFSPLUS_I(inode).cached_extents, 0, sizeof(hfsplus_extent_rec));	HFSPLUS_I(inode).alloc_blocks = 0;	HFSPLUS_I(inode).first_blocks = 0;	HFSPLUS_I(inode).cached_start = 0;	HFSPLUS_I(inode).cached_blocks = 0;	HFSPLUS_I(inode).phys_size = 0;	HFSPLUS_I(inode).fs_blocks = 0;	HFSPLUS_I(inode).rsrc_inode = NULL;	if (S_ISDIR(inode->i_mode)) {		inode->i_size = 2;		HFSPLUS_SB(sb).folder_count++;		inode->i_op = &hfsplus_dir_inode_operations;		inode->i_fop = &hfsplus_dir_operations;	} else if (S_ISREG(inode->i_mode)) {		HFSPLUS_SB(sb).file_count++;		inode->i_op = &hfsplus_file_inode_operations;		inode->i_fop = &hfsplus_file_operations;		inode->i_mapping->a_ops = &hfsplus_aops;		HFSPLUS_I(inode).clump_blocks = HFSPLUS_SB(sb).data_clump_blocks;	} else if (S_ISLNK(inode->i_mode)) {		HFSPLUS_SB(sb).file_count++;		inode->i_op = &page_symlink_inode_operations;		inode->i_mapping->a_ops = &hfsplus_aops;		HFSPLUS_I(inode).clump_blocks = 1;	} else		HFSPLUS_SB(sb).file_count++;	insert_inode_hash(inode);	mark_inode_dirty(inode);	sb->s_dirt = 1;	return inode;}void hfsplus_delete_inode(struct inode *inode){	struct super_block *sb = inode->i_sb;	if (S_ISDIR(inode->i_mode)) {		HFSPLUS_SB(sb).folder_count--;		sb->s_dirt = 1;		return;	}	HFSPLUS_SB(sb).file_count--;	if (S_ISREG(inode->i_mode)) {		if (!inode->i_nlink) {			inode->i_size = 0;			hfsplus_file_truncate(inode);		}	} else if (S_ISLNK(inode->i_mode)) {		inode->i_size = 0;		hfsplus_file_truncate(inode);	}	sb->s_dirt = 1;}void hfsplus_inode_read_fork(struct inode *inode, struct hfsplus_fork_raw *fork){	struct super_block *sb = inode->i_sb;	u32 count;	int i;	memcpy(&HFSPLUS_I(inode).first_extents, &fork->extents,	       sizeof(hfsplus_extent_rec));	for (count = 0, i = 0; i < 8; i++)		count += be32_to_cpu(fork->extents[i].block_count);	HFSPLUS_I(inode).first_blocks = count;	memset(HFSPLUS_I(inode).cached_extents, 0, sizeof(hfsplus_extent_rec));	HFSPLUS_I(inode).cached_start = 0;	HFSPLUS_I(inode).cached_blocks = 0;	HFSPLUS_I(inode).alloc_blocks = be32_to_cpu(fork->total_blocks);	inode->i_size = HFSPLUS_I(inode).phys_size = be64_to_cpu(fork->total_size);	HFSPLUS_I(inode).fs_blocks = (inode->i_size + sb->s_blocksize - 1) >> sb->s_blocksize_bits;	inode_set_bytes(inode, HFSPLUS_I(inode).fs_blocks << sb->s_blocksize_bits);	HFSPLUS_I(inode).clump_blocks = be32_to_cpu(fork->clump_size) >> HFSPLUS_SB(sb).alloc_blksz_shift;	if (!HFSPLUS_I(inode).clump_blocks)		HFSPLUS_I(inode).clump_blocks = HFSPLUS_IS_RSRC(inode) ? HFSPLUS_SB(sb).rsrc_clump_blocks :				HFSPLUS_SB(sb).data_clump_blocks;}void hfsplus_inode_write_fork(struct inode *inode, struct hfsplus_fork_raw *fork){	memcpy(&fork->extents, &HFSPLUS_I(inode).first_extents,	       sizeof(hfsplus_extent_rec));	fork->total_size = cpu_to_be64(inode->i_size);	fork->total_blocks = cpu_to_be32(HFSPLUS_I(inode).alloc_blocks);}int hfsplus_cat_read_inode(struct inode *inode, struct hfs_find_data *fd){	hfsplus_cat_entry entry;	int res = 0;	u16 type;	type = hfs_bnode_read_u16(fd->bnode, fd->entryoffset);	HFSPLUS_I(inode).dev = 0;	if (type == HFSPLUS_FOLDER) {		struct hfsplus_cat_folder *folder = &entry.folder;		if (fd->entrylength < sizeof(struct hfsplus_cat_folder))			/* panic? */;		hfs_bnode_read(fd->bnode, &entry, fd->entryoffset,					sizeof(struct hfsplus_cat_folder));		hfsplus_get_perms(inode, &folder->permissions, 1);		inode->i_nlink = 1;		inode->i_size = 2 + be32_to_cpu(folder->valence);		inode->i_atime = hfsp_mt2ut(folder->access_date);		inode->i_mtime = hfsp_mt2ut(folder->content_mod_date);		inode->i_ctime = hfsp_mt2ut(folder->attribute_mod_date);		HFSPLUS_I(inode).create_date = folder->create_date;		HFSPLUS_I(inode).fs_blocks = 0;		inode->i_op = &hfsplus_dir_inode_operations;		inode->i_fop = &hfsplus_dir_operations;	} else if (type == HFSPLUS_FILE) {		struct hfsplus_cat_file *file = &entry.file;		if (fd->entrylength < sizeof(struct hfsplus_cat_file))			/* panic? */;		hfs_bnode_read(fd->bnode, &entry, fd->entryoffset,					sizeof(struct hfsplus_cat_file));		hfsplus_inode_read_fork(inode, HFSPLUS_IS_DATA(inode) ?					&file->data_fork : &file->rsrc_fork);		hfsplus_get_perms(inode, &file->permissions, 0);		inode->i_nlink = 1;		if (S_ISREG(inode->i_mode)) {			if (file->permissions.dev)				inode->i_nlink = be32_to_cpu(file->permissions.dev);			inode->i_op = &hfsplus_file_inode_operations;			inode->i_fop = &hfsplus_file_operations;			inode->i_mapping->a_ops = &hfsplus_aops;		} else if (S_ISLNK(inode->i_mode)) {			inode->i_op = &page_symlink_inode_operations;			inode->i_mapping->a_ops = &hfsplus_aops;		} else {			init_special_inode(inode, inode->i_mode,					   be32_to_cpu(file->permissions.dev));		}		inode->i_atime = hfsp_mt2ut(file->access_date);		inode->i_mtime = hfsp_mt2ut(file->content_mod_date);		inode->i_ctime = hfsp_mt2ut(file->attribute_mod_date);		HFSPLUS_I(inode).create_date = file->create_date;	} else {		printk(KERN_ERR "hfs: bad catalog entry used to create inode\n");		res = -EIO;	}	return res;}int hfsplus_cat_write_inode(struct inode *inode){	struct inode *main_inode = inode;	struct hfs_find_data fd;	hfsplus_cat_entry entry;	if (HFSPLUS_IS_RSRC(inode))		main_inode = HFSPLUS_I(inode).rsrc_inode;	if (!main_inode->i_nlink)		return 0;	if (hfs_find_init(HFSPLUS_SB(main_inode->i_sb).cat_tree, &fd))		/* panic? */		return -EIO;	if (hfsplus_find_cat(main_inode->i_sb, main_inode->i_ino, &fd))		/* panic? */		goto out;	if (S_ISDIR(main_inode->i_mode)) {		struct hfsplus_cat_folder *folder = &entry.folder;		if (fd.entrylength < sizeof(struct hfsplus_cat_folder))			/* panic? */;		hfs_bnode_read(fd.bnode, &entry, fd.entryoffset,					sizeof(struct hfsplus_cat_folder));		/* simple node checks? */		hfsplus_set_perms(inode, &folder->permissions);		folder->access_date = hfsp_ut2mt(inode->i_atime);		folder->content_mod_date = hfsp_ut2mt(inode->i_mtime);		folder->attribute_mod_date = hfsp_ut2mt(inode->i_ctime);		folder->valence = cpu_to_be32(inode->i_size - 2);		hfs_bnode_write(fd.bnode, &entry, fd.entryoffset,					 sizeof(struct hfsplus_cat_folder));	} else if (HFSPLUS_IS_RSRC(inode)) {		struct hfsplus_cat_file *file = &entry.file;		hfs_bnode_read(fd.bnode, &entry, fd.entryoffset,			       sizeof(struct hfsplus_cat_file));		hfsplus_inode_write_fork(inode, &file->rsrc_fork);		hfs_bnode_write(fd.bnode, &entry, fd.entryoffset,				sizeof(struct hfsplus_cat_file));	} else {		struct hfsplus_cat_file *file = &entry.file;		if (fd.entrylength < sizeof(struct hfsplus_cat_file))			/* panic? */;		hfs_bnode_read(fd.bnode, &entry, fd.entryoffset,					sizeof(struct hfsplus_cat_file));		hfsplus_inode_write_fork(inode, &file->data_fork);		if (S_ISREG(inode->i_mode))			HFSPLUS_I(inode).dev = inode->i_nlink;		if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode))			HFSPLUS_I(inode).dev = kdev_t_to_nr(inode->i_rdev);		hfsplus_set_perms(inode, &file->permissions);		if ((file->permissions.rootflags | file->permissions.userflags) & HFSPLUS_FLG_IMMUTABLE)			file->flags |= cpu_to_be16(HFSPLUS_FILE_LOCKED);		else			file->flags &= cpu_to_be16(~HFSPLUS_FILE_LOCKED);		file->access_date = hfsp_ut2mt(inode->i_atime);		file->content_mod_date = hfsp_ut2mt(inode->i_mtime);		file->attribute_mod_date = hfsp_ut2mt(inode->i_ctime);		hfs_bnode_write(fd.bnode, &entry, fd.entryoffset,					 sizeof(struct hfsplus_cat_file));	}out:	hfs_find_exit(&fd);	return 0;}

⌨️ 快捷键说明

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