Ejemplo n.º 1
0
static int msfs_write(const char *path, const char *data, size_t size, off_t offset, fuse_file_info *fi) {
	printf("msfs_write(%s)\n", path);
	reset_error();
	inode_t inode = read_inode((addr_t)fi->fh);
	if(msfs_error != 0) return msfs_error;

	int bytes = write_inode_data(&inode, offset, size, data);
	if(msfs_error != 0) return msfs_error;
	return bytes;
}
Ejemplo n.º 2
0
int create(struct inode *dir, const char *name, int len, int mode, struct inode ** res_inode){
	/*判断目录是否有效*/
	if(dir->ext2_inode.i_block[0] != UINT_MAX){
		perror("inode_operations.c: create error! dir is a file!\n");
		return -1;
	}
	/*判断名字是否有效*/
	if(checkname(name) == -1){
		perror("inode_operations.c: create error! filename is illegal!\n");
		return -1;
	}
	/*判断是否已存在*/
	if(is_exist(dir,name) == 1){
		perror("inode_operations.c: create error! file is alreay exists!\n");
		return -1;
	}
	char buf[BLOCK_SIZE];
	struct ext2_dir_entry_2 *pentry;
	int dir_datablocks = dir->ext2_inode.i_blocks;/*数据块个数*/
	int i = 1;
	int num = BLOCK_SIZE/sizeof(struct ext2_dir_entry_2);
	while(i <= dir_datablocks){
		/*取出目录节点中第i块逻辑块所在的物理块的数据,放入buf*/
		get_block_data(dir->ext2_inode.i_block[i],buf);
		pentry = (struct ext2_dir_entry_2 *)buf;
		/*寻找pentry->inode为0的每一项,表示未使用,填写目录项*/
		//printf("inode_operations.c: create : dir_datablocks: %d\n",i);
		int j = 0;
		while(j<num){
			//printf("inode_operations.c: create : entry: %d\n",j);
			if(!pentry->inode){
				pentry->name_len = len;
				strcpy(pentry->name,name);
				pentry->file_type = mode;
				pentry->rec_len = 8 + len;
				pentry->inode = new_inode();
				write_block_data(dir->ext2_inode.i_block[i],buf);//更新该数据块
				*res_inode=(struct inode *)malloc(sizeof(struct inode));
				if(*res_inode != NULL){
					get_inode_data(pentry->inode,*res_inode);
					return 1;
				}
			}
			j++;
			pentry++;
		}
		i++;
	}
	/*数据块表项已满,则需申请新的数据块来存放新的目录项*/
	if(dir_datablocks>=14){
		perror("inode_operations.c create error! dir_entry is full,no more sub_dir!\n");
		return -1;
	}
	dir_datablocks = ++(dir->ext2_inode.i_blocks);
	dir->ext2_inode.i_block[dir_datablocks] = new_block();
	write_inode_data(dir->i_number,dir);//因为申请了新块,inode节点及时更新

	get_block_data(dir->ext2_inode.i_block[dir_datablocks],buf);
	pentry = (struct ext2_dir_entry_2 *)buf;
	pentry->name_len = len;
	strcpy(pentry->name,name);
	pentry->file_type = mode;
	pentry->rec_len = 8 + len;
	pentry->inode = new_inode();
	write_block_data(dir->ext2_inode.i_block[dir_datablocks],buf);//更新该数据块
	if((*res_inode=(struct inode *)malloc(sizeof(struct inode))) != NULL){
		get_inode_data(pentry->inode,*res_inode);
		return 1;
	}
	return -1;
}
Ejemplo n.º 3
0
int mkdir(struct inode *dir, const char *name, int len, int mode){
	/*判断目录是否有效*/
	if(dir->ext2_inode.i_block[0] != UINT_MAX){
		perror("inode_operations.c: mkdir error! dir is a file!\n");
		return -1;
	}
	/*判断名字是否有效*/
	if(checkname(name) == -1){
		perror("inode_operations.c: mkdir error! dirname is illegal!\n");
		return -1;
	}
	/*判断是否已存在*/
	if(is_exist(dir,name) == 1){
		perror("inode_operations.c: mkdir error! dirname is alreay exists!\n");
		return -1;
	}
	char buf[BLOCK_SIZE];
	struct inode *m_inode;
	struct ext2_dir_entry_2 *pentry;
	int dir_datablocks = dir->ext2_inode.i_blocks;/*数据块个数*/
	int i = 1;
	int num = BLOCK_SIZE/sizeof(struct ext2_dir_entry_2);
	while(i <= dir_datablocks){
		/*取出目录节点中第i块逻辑块所在的物理块的数据,放入buf*/
		get_block_data(dir->ext2_inode.i_block[i],buf);
		pentry = (struct ext2_dir_entry_2 *)buf;
		
		/*寻找pentry->inode为0的每一项,表示未使用*/
		int j = 0;
		while(j<num){
			if(!pentry->inode){
				pentry->name_len = len;
				strcpy(pentry->name,name);
				pentry->file_type = mode;
				pentry->rec_len = 8 + len;
				pentry->inode = new_inode();
				write_block_data(dir->ext2_inode.i_block[i],buf);//更新该数据块
				/*下面更新为目录项(文件夹)申请的inode节点信息,并为其预分配一块数据块,用于存放子目录或文件*/
				if((m_inode=(struct inode*)malloc(sizeof(struct inode))) != NULL){
					get_inode_data(pentry->inode,m_inode);
					m_inode->ext2_inode.i_block[0] = UINT_MAX;//表示该节点是目录节点
					m_inode->ext2_inode.i_block[1] = new_block();//为每个目录节点预分配一块数据块,存放目录项
					m_inode->ext2_inode.i_blocks = 1;		
					write_inode_data(pentry->inode,m_inode);
					free(m_inode);
					return 1;
				}
			}
			j++;
			pentry++;
		}
		i++;
	}
	/*数据块表项已满,则需申请新的数据块来存放新的目录项*/
	if(dir_datablocks>=14){
		perror("inode_operations.c mkdir error! dir_entry is full,no more sub_dir!\n");
		return -1;
	}
	dir_datablocks = ++dir->ext2_inode.i_blocks;
	dir->ext2_inode.i_block[dir_datablocks] = new_block();
	write_inode_data(dir->i_number,dir);//因为申请了新块,inode节点及时更新

	get_block_data(dir->ext2_inode.i_block[dir_datablocks],buf);
	pentry = (struct ext2_dir_entry_2 *)buf;
	pentry->name_len = len;
	strcpy(pentry->name,name);
	pentry->file_type = mode;
	pentry->rec_len = 8 + len;
	pentry->inode = new_inode();
	write_block_data(dir->ext2_inode.i_block[dir_datablocks],buf);//更新该数据块
	
	if((m_inode=(struct inode*)malloc(sizeof(struct inode))) != NULL){
		get_inode_data(pentry->inode,m_inode);
		m_inode->ext2_inode.i_block[0] = UINT_MAX;//表示该节点是目录节点
		m_inode->ext2_inode.i_block[1] = new_block();//为每个目录节点预分配一块数据块,存放目录项
		m_inode->ext2_inode.i_blocks = 1;		
		write_inode_data(pentry->inode,m_inode);
		free(m_inode);
		return 1;
	}

	return -1;
}