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, <tng_data); } #endif //CONFIG_LTT_FACILITY_FS_DATA file_pos_write(file, pos); fput_light(file, fput_needed); } return ret; }
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; }
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; }
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; }