ntfsmount: Save pointer to ntfs_attr in (fuse_file_info *)->fh and use it in ntfs_fuse_{read,write}
							parent
							
								
									673c23d74a
								
							
						
					
					
						commit
						5151f826c4
					
				| 
						 | 
				
			
			@ -534,11 +534,10 @@ static int ntfs_fuse_readdir(const char *path, void *buf,
 | 
			
		|||
	return err;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int ntfs_fuse_open(const char *org_path,
 | 
			
		||||
		struct fuse_file_info *fi __attribute__((unused)))
 | 
			
		||||
static int ntfs_fuse_open(const char *org_path, struct fuse_file_info *fi)
 | 
			
		||||
{
 | 
			
		||||
	ntfs_inode *ni;
 | 
			
		||||
	ntfs_attr *na;
 | 
			
		||||
	ntfs_inode *ni = NULL;
 | 
			
		||||
	ntfs_attr *na = NULL;
 | 
			
		||||
	int res = 0;
 | 
			
		||||
	char *path = NULL;
 | 
			
		||||
	ntfschar *stream_name;
 | 
			
		||||
| 
						 | 
				
			
			@ -553,42 +552,53 @@ static int ntfs_fuse_open(const char *org_path,
 | 
			
		|||
		if (na) {
 | 
			
		||||
			if (NAttrEncrypted(na) && !na->crypto)
 | 
			
		||||
				res = -EACCES;
 | 
			
		||||
			ntfs_attr_close(na);
 | 
			
		||||
		} else
 | 
			
		||||
			res = -errno;
 | 
			
		||||
		ntfs_inode_close(ni);
 | 
			
		||||
	} else
 | 
			
		||||
		res = -errno;
 | 
			
		||||
	free(path);
 | 
			
		||||
	if (stream_name_len)
 | 
			
		||||
		free(stream_name);
 | 
			
		||||
	if (res) {
 | 
			
		||||
		if (ni)
 | 
			
		||||
			ntfs_inode_close(ni);
 | 
			
		||||
		if (na)
 | 
			
		||||
			ntfs_attr_close(na);
 | 
			
		||||
	} else
 | 
			
		||||
		fi->fh = (unsigned long)na;
 | 
			
		||||
	return res;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int ntfs_fuse_read(const char *org_path, char *buf, size_t size,
 | 
			
		||||
		off_t offset, struct fuse_file_info *fi __attribute__((unused)))
 | 
			
		||||
static int ntfs_fuse_flush(const char *path __attribute__((unused)),
 | 
			
		||||
		struct fuse_file_info *fi)
 | 
			
		||||
{
 | 
			
		||||
	ntfs_inode *ni = NULL;
 | 
			
		||||
	ntfs_attr *na = NULL;
 | 
			
		||||
	char *path = NULL;
 | 
			
		||||
	ntfschar *stream_name;
 | 
			
		||||
	int stream_name_len, res, total = 0;
 | 
			
		||||
	ntfs_attr *na = (ntfs_attr *)(unsigned long)fi->fh;
 | 
			
		||||
	ntfs_inode *ni = na->ni;
 | 
			
		||||
 | 
			
		||||
	if (ntfs_inode_sync(ni))
 | 
			
		||||
		return -errno;
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int ntfs_fuse_release(const char *path __attribute__((unused)),
 | 
			
		||||
		struct fuse_file_info *fi)
 | 
			
		||||
{
 | 
			
		||||
	ntfs_attr *na = (ntfs_attr *)(unsigned long)fi->fh;
 | 
			
		||||
	ntfs_inode *ni = na->ni;
 | 
			
		||||
 | 
			
		||||
	ntfs_attr_close(na);
 | 
			
		||||
	ntfs_inode_close(ni);
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int ntfs_fuse_read(const char *path, char *buf, size_t size,
 | 
			
		||||
		off_t offset, struct fuse_file_info *fi)
 | 
			
		||||
{
 | 
			
		||||
	ntfs_attr *na = (ntfs_attr *)(unsigned long)fi->fh;
 | 
			
		||||
	int res, total = 0;
 | 
			
		||||
 | 
			
		||||
	if (!size)
 | 
			
		||||
		return 0;
 | 
			
		||||
	stream_name_len = ntfs_fuse_parse_path(org_path, &path, &stream_name);
 | 
			
		||||
	if (stream_name_len < 0)
 | 
			
		||||
		return stream_name_len;
 | 
			
		||||
	ni = ntfs_pathname_to_inode(ctx->vol, NULL, path);
 | 
			
		||||
	if (!ni) {
 | 
			
		||||
		res = -errno;
 | 
			
		||||
		goto exit;
 | 
			
		||||
	}
 | 
			
		||||
	na = ntfs_attr_open(ni, AT_DATA, stream_name, stream_name_len);
 | 
			
		||||
	if (!na) {
 | 
			
		||||
		res = -errno;
 | 
			
		||||
		goto exit;
 | 
			
		||||
	}
 | 
			
		||||
	if (offset + size > na->data_size)
 | 
			
		||||
		size = na->data_size - offset;
 | 
			
		||||
	while (size) {
 | 
			
		||||
| 
						 | 
				
			
			@ -607,40 +617,17 @@ static int ntfs_fuse_read(const char *org_path, char *buf, size_t size,
 | 
			
		|||
		total += res;
 | 
			
		||||
	}
 | 
			
		||||
	res = total;
 | 
			
		||||
	ntfs_fuse_update_times(ni, NTFS_UPDATE_ATIME);
 | 
			
		||||
	ntfs_fuse_update_times(na->ni, NTFS_UPDATE_ATIME);
 | 
			
		||||
exit:
 | 
			
		||||
	if (na)
 | 
			
		||||
		ntfs_attr_close(na);
 | 
			
		||||
	if (ni && ntfs_inode_close(ni))
 | 
			
		||||
		ntfs_log_perror("Failed to close inode");
 | 
			
		||||
	free(path);
 | 
			
		||||
	if (stream_name_len)
 | 
			
		||||
		free(stream_name);
 | 
			
		||||
	return res;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int ntfs_fuse_write(const char *org_path, const char *buf, size_t size,
 | 
			
		||||
		off_t offset, struct fuse_file_info *fi __attribute__((unused)))
 | 
			
		||||
static int ntfs_fuse_write(const char *path, const char *buf, size_t size,
 | 
			
		||||
		off_t offset, struct fuse_file_info *fi)
 | 
			
		||||
{
 | 
			
		||||
	ntfs_inode *ni = NULL;
 | 
			
		||||
	ntfs_attr *na = NULL;
 | 
			
		||||
	char *path = NULL;
 | 
			
		||||
	ntfschar *stream_name;
 | 
			
		||||
	int stream_name_len, res, total = 0;
 | 
			
		||||
	ntfs_attr *na = (ntfs_attr *)(unsigned long)fi->fh;
 | 
			
		||||
	int res, total = 0;
 | 
			
		||||
 | 
			
		||||
	stream_name_len = ntfs_fuse_parse_path(org_path, &path, &stream_name);
 | 
			
		||||
	if (stream_name_len < 0)
 | 
			
		||||
		return stream_name_len;
 | 
			
		||||
	ni = ntfs_pathname_to_inode(ctx->vol, NULL, path);
 | 
			
		||||
	if (!ni) {
 | 
			
		||||
		res = -errno;
 | 
			
		||||
		goto exit;
 | 
			
		||||
	}
 | 
			
		||||
	na = ntfs_attr_open(ni, AT_DATA, stream_name, stream_name_len);
 | 
			
		||||
	if (!na) {
 | 
			
		||||
		res = -errno;
 | 
			
		||||
		goto exit;
 | 
			
		||||
	}
 | 
			
		||||
	while (size) {
 | 
			
		||||
		res = ntfs_attr_pwrite(na, offset, size, buf);
 | 
			
		||||
		if (res < (s64)size && errno != ENOSPC)
 | 
			
		||||
| 
						 | 
				
			
			@ -659,15 +646,8 @@ static int ntfs_fuse_write(const char *org_path, const char *buf, size_t size,
 | 
			
		|||
	res = total;
 | 
			
		||||
exit:
 | 
			
		||||
	if (res > 0)
 | 
			
		||||
		ntfs_fuse_update_times(ni, NTFS_UPDATE_MTIME |
 | 
			
		||||
		ntfs_fuse_update_times(na->ni, NTFS_UPDATE_MTIME |
 | 
			
		||||
				NTFS_UPDATE_CTIME);
 | 
			
		||||
	if (na)
 | 
			
		||||
		ntfs_attr_close(na);
 | 
			
		||||
	if (ni && ntfs_inode_close(ni))
 | 
			
		||||
		ntfs_log_perror("Failed to close inode");
 | 
			
		||||
	free(path);
 | 
			
		||||
	if (stream_name_len)
 | 
			
		||||
		free(stream_name);
 | 
			
		||||
	return res;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1423,6 +1403,8 @@ static struct fuse_operations ntfs_fuse_oper = {
 | 
			
		|||
	.readlink	= ntfs_fuse_readlink,
 | 
			
		||||
	.readdir	= ntfs_fuse_readdir,
 | 
			
		||||
	.open		= ntfs_fuse_open,
 | 
			
		||||
	.flush		= ntfs_fuse_flush,
 | 
			
		||||
	.release	= ntfs_fuse_release,
 | 
			
		||||
	.read		= ntfs_fuse_read,
 | 
			
		||||
	.write		= ntfs_fuse_write,
 | 
			
		||||
	.truncate	= ntfs_fuse_truncate,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue