示例#1
0
asmlinkage ssize_t sys_write(unsigned int fd, const char __user * buf, size_t count)
{
	struct file *file;
	ssize_t ret = -EBADF;
	int fput_needed;

	file = fget_light(fd, &fput_needed);
	if (file) {
		loff_t pos = file_pos_read(file);
		trace_fs_write(fd, count);
		ret = vfs_write(file, buf, count, &pos);
#ifdef CONFIG_LTT_FACILITY_FS_DATA
		if(ret > 0) {
			lttng_sequence_fs_data_write_data lttng_data;
			lttng_data.len = min(LTT_LOG_RW_SIZE, ret);
			lttng_data.array = buf;
			trace_fs_data_write(fd, count, &lttng_data);
		}
#endif //CONFIG_LTT_FACILITY_FS_DATA
		file_pos_write(file, pos);
		fput_light(file, fput_needed);
	}

	return ret;
}
示例#2
0
SYSCALL_DEFINE3(write, unsigned int, fd, const char __user *, buf,
		size_t, count)
{
	struct file *file;
	ssize_t ret = -EBADF;
	int fput_needed;

	file = fget_light(fd, &fput_needed);
	if (file) {
		loff_t pos = file_pos_read(file);
		ret = vfs_write(file, buf, count, &pos);
		trace_fs_write(fd, buf, count, ret);
		file_pos_write(file, pos);
		fput_light(file, fput_needed);
	}

	return ret;
}
示例#3
0
asmlinkage ssize_t
sys_writev(unsigned long fd, const struct iovec __user *vec, unsigned long vlen)
{
	struct file *file;
	ssize_t ret = -EBADF;
	int fput_needed;

	file = fget_light(fd, &fput_needed);
	if (file) {
		loff_t pos = file_pos_read(file);
		trace_fs_write(fd, vlen);
		ret = vfs_writev(file, vec, vlen, &pos);
		file_pos_write(file, pos);
		fput_light(file, fput_needed);
	}

	if (ret > 0)
		current->wchar += ret;
	current->syscw++;
	return ret;
}
示例#4
0
asmlinkage ssize_t sys_pwrite64(unsigned int fd, const char __user *buf,
			      size_t count, loff_t pos)
{
	struct file *file;
	ssize_t ret = -EBADF;
	int fput_needed;

	if (pos < 0)
		return -EINVAL;

	file = fget_light(fd, &fput_needed);
	if (file) {
		ret = -ESPIPE;
 		if (file->f_mode & FMODE_PWRITE) {
			trace_fs_write(fd, count);
			ret = vfs_write(file, buf, count, &pos);
		}
		fput_light(file, fput_needed);
	}

	return ret;
}