Merge branch 'work.set_fs' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs

Pull more set_fs removal from Al Viro:
"Christoph's 'use kernel_read and friends rather than open-coding
set_fs()' series"

* 'work.set_fs' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs:
fs: unexport vfs_readv and vfs_writev
fs: unexport vfs_read and vfs_write
fs: unexport __vfs_read/__vfs_write
lustre: switch to kernel_write
gadget/f_mass_storage: stop messing with the address limit
mconsole: switch to kernel_read
btrfs: switch write_buf to kernel_write
net/9p: switch p9_fd_read to kernel_write
mm/nommu: switch do_mmap_private to kernel_read
serial2002: switch serial2002_tty_write to kernel_{read/write}
fs: make the buf argument to __kernel_write a void pointer
fs: fix kernel_write prototype
fs: fix kernel_read prototype
fs: move kernel_read to fs/read_write.c
fs: move kernel_write to fs/read_write.c
autofs4: switch autofs4_write to __kernel_write
ashmem: switch to ->read_iter

+147 -236
+4 -8
arch/mips/kernel/elf.c
··· 87 87 bool elf32; 88 88 u32 flags; 89 89 int ret; 90 + loff_t pos; 90 91 91 92 elf32 = ehdr->e32.e_ident[EI_CLASS] == ELFCLASS32; 92 93 flags = elf32 ? ehdr->e32.e_flags : ehdr->e64.e_flags; ··· 109 108 110 109 if (phdr32->p_filesz < sizeof(abiflags)) 111 110 return -EINVAL; 112 - 113 - ret = kernel_read(elf, phdr32->p_offset, 114 - (char *)&abiflags, 115 - sizeof(abiflags)); 111 + pos = phdr32->p_offset; 116 112 } else { 117 113 if (phdr64->p_type != PT_MIPS_ABIFLAGS) 118 114 return 0; 119 115 if (phdr64->p_filesz < sizeof(abiflags)) 120 116 return -EINVAL; 121 - 122 - ret = kernel_read(elf, phdr64->p_offset, 123 - (char *)&abiflags, 124 - sizeof(abiflags)); 117 + pos = phdr64->p_offset; 125 118 } 126 119 120 + ret = kernel_read(elf, &abiflags, sizeof(abiflags), &pos); 127 121 if (ret < 0) 128 122 return ret; 129 123 if (ret != sizeof(abiflags))
+1 -6
arch/um/drivers/mconsole_kern.c
··· 148 148 } 149 149 150 150 do { 151 - loff_t pos = file->f_pos; 152 - mm_segment_t old_fs = get_fs(); 153 - set_fs(KERNEL_DS); 154 - len = vfs_read(file, buf, PAGE_SIZE - 1, &pos); 155 - set_fs(old_fs); 156 - file->f_pos = pos; 151 + len = kernel_read(file, buf, PAGE_SIZE - 1, &file->f_pos); 157 152 if (len < 0) { 158 153 mconsole_reply(req, "Read of file failed", 1, 0); 159 154 goto out_free;
+2 -2
arch/x86/ia32/ia32_aout.c
··· 407 407 unsigned long bss, start_addr, len, error; 408 408 int retval; 409 409 struct exec ex; 410 - 410 + loff_t pos = 0; 411 411 412 412 retval = -ENOEXEC; 413 - error = kernel_read(file, 0, (char *) &ex, sizeof(ex)); 413 + error = kernel_read(file, &ex, sizeof(ex), &pos); 414 414 if (error != sizeof(ex)) 415 415 goto out; 416 416
+5 -8
drivers/media/pci/cx25821/cx25821-audio-upstream.c
··· 277 277 p = (char *)dev->_audiodata_buf_virt_addr + frame_offset; 278 278 279 279 for (i = 0; i < dev->_audio_lines_count; i++) { 280 - int n = kernel_read(file, file_offset, mybuf, AUDIO_LINE_SIZE); 280 + int n = kernel_read(file, mybuf, AUDIO_LINE_SIZE, &file_offset); 281 281 if (n < AUDIO_LINE_SIZE) { 282 282 pr_info("Done: exit %s() since no more bytes to read from Audio file\n", 283 283 __func__); ··· 290 290 memcpy(p, mybuf, n); 291 291 p += n; 292 292 } 293 - file_offset += n; 294 293 } 295 294 dev->_audioframe_count++; 296 295 fput(file); ··· 317 318 { 318 319 char *p = (void *)dev->_audiodata_buf_virt_addr; 319 320 struct file *file; 320 - loff_t offset; 321 + loff_t file_offset = 0; 321 322 int i, j; 322 323 323 324 file = filp_open(dev->_audiofilename, O_RDONLY | O_LARGEFILE, 0); ··· 327 328 return PTR_ERR(file); 328 329 } 329 330 330 - for (j = 0, offset = 0; j < NUM_AUDIO_FRAMES; j++) { 331 + for (j = 0; j < NUM_AUDIO_FRAMES; j++) { 331 332 for (i = 0; i < dev->_audio_lines_count; i++) { 332 333 char buf[AUDIO_LINE_SIZE]; 333 - int n = kernel_read(file, offset, buf, 334 - AUDIO_LINE_SIZE); 334 + loff_t offset = file_offset; 335 + int n = kernel_read(file, buf, AUDIO_LINE_SIZE, &file_offset); 335 336 336 337 if (n < AUDIO_LINE_SIZE) { 337 338 pr_info("Done: exit %s() since no more bytes to read from Audio file\n", ··· 343 344 344 345 if (p) 345 346 memcpy(p + offset, buf, n); 346 - 347 - offset += n; 348 347 } 349 348 dev->_audioframe_count++; 350 349 }
+2 -2
drivers/mtd/nand/nandsim.c
··· 1356 1356 if (err) 1357 1357 return err; 1358 1358 noreclaim_flag = memalloc_noreclaim_save(); 1359 - tx = kernel_read(file, pos, buf, count); 1359 + tx = kernel_read(file, buf, count, &pos); 1360 1360 memalloc_noreclaim_restore(noreclaim_flag); 1361 1361 put_pages(ns); 1362 1362 return tx; ··· 1372 1372 if (err) 1373 1373 return err; 1374 1374 noreclaim_flag = memalloc_noreclaim_save(); 1375 - tx = kernel_write(file, buf, count, pos); 1375 + tx = kernel_write(file, buf, count, &pos); 1376 1376 memalloc_noreclaim_restore(noreclaim_flag); 1377 1377 put_pages(ns); 1378 1378 return tx;
+8 -21
drivers/staging/android/ashmem.c
··· 294 294 return 0; 295 295 } 296 296 297 - /** 298 - * ashmem_read() - Reads a set of bytes from an Ashmem-enabled file 299 - * @file: The associated backing file. 300 - * @buf: The buffer of data being written to 301 - * @len: The number of bytes being read 302 - * @pos: The position of the first byte to read. 303 - * 304 - * Return: 0 if successful, or another return code if not. 305 - */ 306 - static ssize_t ashmem_read(struct file *file, char __user *buf, 307 - size_t len, loff_t *pos) 297 + static ssize_t ashmem_read_iter(struct kiocb *iocb, struct iov_iter *iter) 308 298 { 309 - struct ashmem_area *asma = file->private_data; 299 + struct ashmem_area *asma = iocb->ki_filp->private_data; 310 300 int ret = 0; 311 301 312 302 mutex_lock(&ashmem_mutex); ··· 310 320 goto out_unlock; 311 321 } 312 322 313 - mutex_unlock(&ashmem_mutex); 314 - 315 323 /* 316 324 * asma and asma->file are used outside the lock here. We assume 317 325 * once asma->file is set it will never be changed, and will not 318 326 * be destroyed until all references to the file are dropped and 319 327 * ashmem_release is called. 320 328 */ 321 - ret = __vfs_read(asma->file, buf, len, pos); 322 - if (ret >= 0) 323 - /** Update backing file pos, since f_ops->read() doesn't */ 324 - asma->file->f_pos = *pos; 325 - return ret; 326 - 329 + mutex_unlock(&ashmem_mutex); 330 + ret = vfs_iter_read(asma->file, iter, &iocb->ki_pos, 0); 331 + mutex_lock(&ashmem_mutex); 332 + if (ret > 0) 333 + asma->file->f_pos = iocb->ki_pos; 327 334 out_unlock: 328 335 mutex_unlock(&ashmem_mutex); 329 336 return ret; ··· 821 834 .owner = THIS_MODULE, 822 835 .open = ashmem_open, 823 836 .release = ashmem_release, 824 - .read = ashmem_read, 837 + .read_iter = ashmem_read_iter, 825 838 .llseek = ashmem_llseek, 826 839 .mmap = ashmem_mmap, 827 840 .unlocked_ioctl = ashmem_ioctl,
+5 -19
drivers/staging/comedi/drivers/serial2002.c
··· 106 106 107 107 static int serial2002_tty_write(struct file *f, unsigned char *buf, int count) 108 108 { 109 - const char __user *p = (__force const char __user *)buf; 110 - int result; 111 - loff_t offset = 0; 112 - mm_segment_t oldfs; 113 - 114 - oldfs = get_fs(); 115 - set_fs(KERNEL_DS); 116 - result = __vfs_write(f, p, count, &offset); 117 - set_fs(oldfs); 118 - return result; 109 + loff_t pos = 0; 110 + return kernel_write(f, buf, count, &pos); 119 111 } 120 112 121 113 static void serial2002_tty_read_poll_wait(struct file *f, int timeout) ··· 140 148 { 141 149 unsigned char ch; 142 150 int result; 151 + loff_t pos = 0; 143 152 144 153 result = -1; 145 154 if (!IS_ERR(f)) { 146 - mm_segment_t oldfs; 147 - char __user *p = (__force char __user *)&ch; 148 - loff_t offset = 0; 149 - 150 - oldfs = get_fs(); 151 - set_fs(KERNEL_DS); 152 155 if (f->f_op->poll) { 153 156 serial2002_tty_read_poll_wait(f, timeout); 154 157 155 - if (__vfs_read(f, p, 1, &offset) == 1) 158 + if (kernel_read(f, &ch, 1, &pos) == 1) 156 159 result = ch; 157 160 } else { 158 161 /* Device does not support poll, busy wait */ ··· 158 171 if (retries >= timeout) 159 172 break; 160 173 161 - if (__vfs_read(f, p, 1, &offset) == 1) { 174 + if (kernel_read(f, &ch, 1, &pos) == 1) { 162 175 result = ch; 163 176 break; 164 177 } 165 178 usleep_range(100, 1000); 166 179 } 167 180 } 168 - set_fs(oldfs); 169 181 } 170 182 return result; 171 183 }
+2 -8
drivers/staging/lustre/lnet/libcfs/tracefile.c
··· 731 731 __LASSERT_TAGE_INVARIANT(tage); 732 732 733 733 buf = kmap(tage->page); 734 - rc = vfs_write(filp, (__force const char __user *)buf, 735 - tage->used, &filp->f_pos); 734 + rc = kernel_write(filp, buf, tage->used, &filp->f_pos); 736 735 kunmap(tage->page); 737 736 738 737 if (rc != (int)tage->used) { ··· 975 976 struct tracefiled_ctl *tctl = arg; 976 977 struct cfs_trace_page *tage; 977 978 struct cfs_trace_page *tmp; 978 - mm_segment_t __oldfs; 979 979 struct file *filp; 980 980 char *buf; 981 981 int last_loop = 0; ··· 1012 1014 __LASSERT(list_empty(&pc.pc_pages)); 1013 1015 goto end_loop; 1014 1016 } 1015 - __oldfs = get_fs(); 1016 - set_fs(get_ds()); 1017 1017 1018 1018 list_for_each_entry_safe(tage, tmp, &pc.pc_pages, linkage) { 1019 1019 static loff_t f_pos; ··· 1024 1028 f_pos = i_size_read(file_inode(filp)); 1025 1029 1026 1030 buf = kmap(tage->page); 1027 - rc = vfs_write(filp, (__force const char __user *)buf, 1028 - tage->used, &f_pos); 1031 + rc = kernel_write(filp, buf, tage->used, &f_pos); 1029 1032 kunmap(tage->page); 1030 1033 1031 1034 if (rc != (int)tage->used) { ··· 1035 1040 break; 1036 1041 } 1037 1042 } 1038 - set_fs(__oldfs); 1039 1043 1040 1044 filp_close(filp, NULL); 1041 1045 put_pages_on_daemon_list(&pc);
+1 -6
drivers/staging/lustre/lustre/obdclass/kernelcomm.c
··· 52 52 struct kuc_hdr *kuch = (struct kuc_hdr *)payload; 53 53 ssize_t count = kuch->kuc_msglen; 54 54 loff_t offset = 0; 55 - mm_segment_t fs; 56 55 int rc = -ENXIO; 57 56 58 57 if (IS_ERR_OR_NULL(filp)) ··· 62 63 return rc; 63 64 } 64 65 65 - fs = get_fs(); 66 - set_fs(KERNEL_DS); 67 66 while (count > 0) { 68 - rc = vfs_write(filp, (void __force __user *)payload, 69 - count, &offset); 67 + rc = kernel_write(filp, payload, count, &offset); 70 68 if (rc < 0) 71 69 break; 72 70 count -= rc; 73 71 payload += rc; 74 72 rc = 0; 75 73 } 76 - set_fs(fs); 77 74 78 75 if (rc < 0) 79 76 CWARN("message send failed (%d)\n", rc);
+2 -1
drivers/target/target_core_alua.c
··· 896 896 u32 md_buf_len) 897 897 { 898 898 struct file *file = filp_open(path, O_RDWR | O_CREAT | O_TRUNC, 0600); 899 + loff_t pos = 0; 899 900 int ret; 900 901 901 902 if (IS_ERR(file)) { 902 903 pr_err("filp_open(%s) for ALUA metadata failed\n", path); 903 904 return -ENODEV; 904 905 } 905 - ret = kernel_write(file, md_buf, md_buf_len, 0); 906 + ret = kernel_write(file, md_buf, md_buf_len, &pos); 906 907 if (ret < 0) 907 908 pr_err("Error writing ALUA metadata file: %s\n", path); 908 909 fput(file);
+1 -1
drivers/target/target_core_file.c
··· 443 443 444 444 for (prot = 0; prot < prot_length;) { 445 445 sector_t len = min_t(sector_t, bufsize, prot_length - prot); 446 - ssize_t ret = kernel_write(prot_fd, buf, len, pos + prot); 446 + ssize_t ret = kernel_write(prot_fd, buf, len, &pos); 447 447 448 448 if (ret != len) { 449 449 pr_err("vfs_write to prot file failed: %zd\n", ret);
+2 -1
drivers/target/target_core_pr.c
··· 1974 1974 char path[512]; 1975 1975 u32 pr_aptpl_buf_len; 1976 1976 int ret; 1977 + loff_t pos = 0; 1977 1978 1978 1979 memset(path, 0, 512); 1979 1980 ··· 1994 1993 1995 1994 pr_aptpl_buf_len = (strlen(buf) + 1); /* Add extra for NULL */ 1996 1995 1997 - ret = kernel_write(file, buf, pr_aptpl_buf_len, 0); 1996 + ret = kernel_write(file, buf, pr_aptpl_buf_len, &pos); 1998 1997 1999 1998 if (ret < 0) 2000 1999 pr_debug("Error writing APTPL metadata file: %s\n", path);
+6 -15
drivers/usb/gadget/function/f_mass_storage.c
··· 686 686 687 687 /* Perform the read */ 688 688 file_offset_tmp = file_offset; 689 - nread = vfs_read(curlun->filp, 690 - (char __user *)bh->buf, 691 - amount, &file_offset_tmp); 689 + nread = kernel_read(curlun->filp, bh->buf, amount, 690 + &file_offset_tmp); 692 691 VLDBG(curlun, "file read %u @ %llu -> %d\n", amount, 693 692 (unsigned long long)file_offset, (int)nread); 694 693 if (signal_pending(current)) ··· 882 883 883 884 /* Perform the write */ 884 885 file_offset_tmp = file_offset; 885 - nwritten = vfs_write(curlun->filp, (char __user *)bh->buf, 886 - amount, &file_offset_tmp); 886 + nwritten = kernel_write(curlun->filp, bh->buf, amount, 887 + &file_offset_tmp); 887 888 VLDBG(curlun, "file write %u @ %llu -> %d\n", amount, 888 889 (unsigned long long)file_offset, (int)nwritten); 889 890 if (signal_pending(current)) ··· 1020 1021 1021 1022 /* Perform the read */ 1022 1023 file_offset_tmp = file_offset; 1023 - nread = vfs_read(curlun->filp, 1024 - (char __user *) bh->buf, 1025 - amount, &file_offset_tmp); 1024 + nread = kernel_read(curlun->filp, bh->buf, amount, 1025 + &file_offset_tmp); 1026 1026 VLDBG(curlun, "file read %u @ %llu -> %d\n", amount, 1027 1027 (unsigned long long) file_offset, 1028 1028 (int) nread); ··· 2450 2452 2451 2453 /* Allow the thread to be frozen */ 2452 2454 set_freezable(); 2453 - 2454 - /* 2455 - * Arrange for userspace references to be interpreted as kernel 2456 - * pointers. That way we can pass a kernel pointer to a routine 2457 - * that expects a __user pointer and it will work okay. 2458 - */ 2459 - set_fs(get_ds()); 2460 2455 2461 2456 /* The main loop */ 2462 2457 while (common->state != FSG_STATE_TERMINATED) {
+1 -8
fs/autofs4/waitq.c
··· 56 56 struct file *file, const void *addr, int bytes) 57 57 { 58 58 unsigned long sigpipe, flags; 59 - mm_segment_t fs; 60 59 const char *data = (const char *)addr; 61 60 ssize_t wr = 0; 62 61 63 62 sigpipe = sigismember(&current->pending.signal, SIGPIPE); 64 63 65 - /* Save pointer to user space and point back to kernel space */ 66 - fs = get_fs(); 67 - set_fs(KERNEL_DS); 68 - 69 64 mutex_lock(&sbi->pipe_mutex); 70 65 while (bytes) { 71 - wr = __vfs_write(file, data, bytes, &file->f_pos); 66 + wr = __kernel_write(file, data, bytes, &file->f_pos); 72 67 if (wr <= 0) 73 68 break; 74 69 data += wr; 75 70 bytes -= wr; 76 71 } 77 72 mutex_unlock(&sbi->pipe_mutex); 78 - 79 - set_fs(fs); 80 73 81 74 /* Keep the currently executing process from receiving a 82 75 * SIGPIPE unless it was already supposed to get one
+2 -1
fs/binfmt_aout.c
··· 341 341 unsigned long error; 342 342 int retval; 343 343 struct exec ex; 344 + loff_t pos = 0; 344 345 345 346 inode = file_inode(file); 346 347 347 348 retval = -ENOEXEC; 348 - error = kernel_read(file, 0, (char *) &ex, sizeof(ex)); 349 + error = kernel_read(file, &ex, sizeof(ex), &pos); 349 350 if (error != sizeof(ex)) 350 351 goto out; 351 352
+13 -10
fs/binfmt_elf.c
··· 409 409 { 410 410 struct elf_phdr *elf_phdata = NULL; 411 411 int retval, size, err = -1; 412 + loff_t pos = elf_ex->e_phoff; 412 413 413 414 /* 414 415 * If the size of this structure has changed, then punt, since ··· 433 432 goto out; 434 433 435 434 /* Read in the program headers */ 436 - retval = kernel_read(elf_file, elf_ex->e_phoff, 437 - (char *)elf_phdata, size); 435 + retval = kernel_read(elf_file, elf_phdata, size, &pos); 438 436 if (retval != size) { 439 437 err = (retval < 0) ? retval : -EIO; 440 438 goto out; ··· 698 698 struct elfhdr interp_elf_ex; 699 699 } *loc; 700 700 struct arch_elf_state arch_state = INIT_ARCH_ELF_STATE; 701 + loff_t pos; 701 702 702 703 loc = kmalloc(sizeof(*loc), GFP_KERNEL); 703 704 if (!loc) { ··· 751 750 if (!elf_interpreter) 752 751 goto out_free_ph; 753 752 754 - retval = kernel_read(bprm->file, elf_ppnt->p_offset, 755 - elf_interpreter, 756 - elf_ppnt->p_filesz); 753 + pos = elf_ppnt->p_offset; 754 + retval = kernel_read(bprm->file, elf_interpreter, 755 + elf_ppnt->p_filesz, &pos); 757 756 if (retval != elf_ppnt->p_filesz) { 758 757 if (retval >= 0) 759 758 retval = -EIO; ··· 777 776 would_dump(bprm, interpreter); 778 777 779 778 /* Get the exec headers */ 780 - retval = kernel_read(interpreter, 0, 781 - (void *)&loc->interp_elf_ex, 782 - sizeof(loc->interp_elf_ex)); 779 + pos = 0; 780 + retval = kernel_read(interpreter, &loc->interp_elf_ex, 781 + sizeof(loc->interp_elf_ex), &pos); 783 782 if (retval != sizeof(loc->interp_elf_ex)) { 784 783 if (retval >= 0) 785 784 retval = -EIO; ··· 1176 1175 unsigned long elf_bss, bss, len; 1177 1176 int retval, error, i, j; 1178 1177 struct elfhdr elf_ex; 1178 + loff_t pos = 0; 1179 1179 1180 1180 error = -ENOEXEC; 1181 - retval = kernel_read(file, 0, (char *)&elf_ex, sizeof(elf_ex)); 1181 + retval = kernel_read(file, &elf_ex, sizeof(elf_ex), &pos); 1182 1182 if (retval != sizeof(elf_ex)) 1183 1183 goto out; 1184 1184 ··· 1203 1201 1204 1202 eppnt = elf_phdata; 1205 1203 error = -ENOEXEC; 1206 - retval = kernel_read(file, elf_ex.e_phoff, (char *)eppnt, j); 1204 + pos = elf_ex.e_phoff; 1205 + retval = kernel_read(file, eppnt, j, &pos); 1207 1206 if (retval != j) 1208 1207 goto out_free_ph; 1209 1208
+9 -8
fs/binfmt_elf_fdpic.c
··· 145 145 struct elf32_phdr *phdr; 146 146 unsigned long size; 147 147 int retval, loop; 148 + loff_t pos = params->hdr.e_phoff; 148 149 149 150 if (params->hdr.e_phentsize != sizeof(struct elf_phdr)) 150 151 return -ENOMEM; ··· 157 156 if (!params->phdrs) 158 157 return -ENOMEM; 159 158 160 - retval = kernel_read(file, params->hdr.e_phoff, 161 - (char *) params->phdrs, size); 159 + retval = kernel_read(file, params->phdrs, size, &pos); 162 160 if (unlikely(retval != size)) 163 161 return retval < 0 ? retval : -ENOEXEC; 164 162 ··· 199 199 char *interpreter_name = NULL; 200 200 int executable_stack; 201 201 int retval, i; 202 + loff_t pos; 202 203 203 204 kdebug("____ LOAD %d ____", current->pid); 204 205 ··· 247 246 if (!interpreter_name) 248 247 goto error; 249 248 250 - retval = kernel_read(bprm->file, 251 - phdr->p_offset, 252 - interpreter_name, 253 - phdr->p_filesz); 249 + pos = phdr->p_offset; 250 + retval = kernel_read(bprm->file, interpreter_name, 251 + phdr->p_filesz, &pos); 254 252 if (unlikely(retval != phdr->p_filesz)) { 255 253 if (retval >= 0) 256 254 retval = -ENOEXEC; ··· 277 277 */ 278 278 would_dump(bprm, interpreter); 279 279 280 - retval = kernel_read(interpreter, 0, bprm->buf, 281 - BINPRM_BUF_SIZE); 280 + pos = 0; 281 + retval = kernel_read(interpreter, bprm->buf, 282 + BINPRM_BUF_SIZE, &pos); 282 283 if (unlikely(retval != BINPRM_BUF_SIZE)) { 283 284 if (retval >= 0) 284 285 retval = -ENOEXEC;
+5 -13
fs/binfmt_flat.c
··· 176 176 #define ENCRYPTED 0x20 /* bit 5 set: file is encrypted */ 177 177 #define RESERVED 0xC0 /* bit 6,7: reserved */ 178 178 179 - static int decompress_exec( 180 - struct linux_binprm *bprm, 181 - unsigned long offset, 182 - char *dst, 183 - long len, 184 - int fd) 179 + static int decompress_exec(struct linux_binprm *bprm, loff_t fpos, char *dst, 180 + long len, int fd) 185 181 { 186 182 unsigned char *buf; 187 183 z_stream strm; 188 - loff_t fpos; 189 184 int ret, retval; 190 185 191 - pr_debug("decompress_exec(offset=%lx,buf=%p,len=%lx)\n", offset, dst, len); 186 + pr_debug("decompress_exec(offset=%llx,buf=%p,len=%lx)\n", fpos, dst, len); 192 187 193 188 memset(&strm, 0, sizeof(strm)); 194 189 strm.workspace = kmalloc(zlib_inflate_workspacesize(), GFP_KERNEL); ··· 197 202 } 198 203 199 204 /* Read in first chunk of data and parse gzip header. */ 200 - fpos = offset; 201 - ret = kernel_read(bprm->file, offset, buf, LBUFSIZE); 205 + ret = kernel_read(bprm->file, buf, LBUFSIZE, &fpos); 202 206 203 207 strm.next_in = buf; 204 208 strm.avail_in = ret; 205 209 strm.total_in = 0; 206 - fpos += ret; 207 210 208 211 retval = -ENOEXEC; 209 212 ··· 267 274 } 268 275 269 276 while ((ret = zlib_inflate(&strm, Z_NO_FLUSH)) == Z_OK) { 270 - ret = kernel_read(bprm->file, fpos, buf, LBUFSIZE); 277 + ret = kernel_read(bprm->file, buf, LBUFSIZE, &fpos); 271 278 if (ret <= 0) 272 279 break; 273 280 len -= ret; ··· 275 282 strm.next_in = buf; 276 283 strm.avail_in = ret; 277 284 strm.total_in = 0; 278 - fpos += ret; 279 285 } 280 286 281 287 if (ret < 0) {
+4 -1
fs/binfmt_misc.c
··· 218 218 219 219 bprm->file = interp_file; 220 220 if (fmt->flags & MISC_FMT_CREDENTIALS) { 221 + loff_t pos = 0; 222 + 221 223 /* 222 224 * No need to call prepare_binprm(), it's already been 223 225 * done. bprm->buf is stale, update from interp_file. 224 226 */ 225 227 memset(bprm->buf, 0, BINPRM_BUF_SIZE); 226 - retval = kernel_read(bprm->file, 0, bprm->buf, BINPRM_BUF_SIZE); 228 + retval = kernel_read(bprm->file, bprm->buf, BINPRM_BUF_SIZE, 229 + &pos); 227 230 } else 228 231 retval = prepare_binprm(bprm); 229 232
+4 -14
fs/btrfs/send.c
··· 539 539 static int write_buf(struct file *filp, const void *buf, u32 len, loff_t *off) 540 540 { 541 541 int ret; 542 - mm_segment_t old_fs; 543 542 u32 pos = 0; 544 543 545 - old_fs = get_fs(); 546 - set_fs(KERNEL_DS); 547 - 548 544 while (pos < len) { 549 - ret = vfs_write(filp, (__force const char __user *)buf + pos, 550 - len - pos, off); 545 + ret = kernel_write(filp, buf + pos, len - pos, off); 551 546 /* TODO handle that correctly */ 552 547 /*if (ret == -ERESTARTSYS) { 553 548 continue; 554 549 }*/ 555 550 if (ret < 0) 556 - goto out; 551 + return ret; 557 552 if (ret == 0) { 558 - ret = -EIO; 559 - goto out; 553 + return -EIO; 560 554 } 561 555 pos += ret; 562 556 } 563 557 564 - ret = 0; 565 - 566 - out: 567 - set_fs(old_fs); 568 - return ret; 558 + return 0; 569 559 } 570 560 571 561 static int tlv_put(struct send_ctx *sctx, u16 attr, const void *data, int len)
+3 -2
fs/coda/dir.c
··· 368 368 goto out; 369 369 370 370 while (1) { 371 + loff_t pos = ctx->pos - 2; 372 + 371 373 /* read entries from the directory file */ 372 - ret = kernel_read(host_file, ctx->pos - 2, (char *)vdir, 373 - sizeof(*vdir)); 374 + ret = kernel_read(host_file, vdir, sizeof(*vdir), &pos); 374 375 if (ret < 0) { 375 376 pr_err("%s: read dir %s failed %d\n", 376 377 __func__, coda_f2s(&cii->c_fid), ret);
+2 -2
fs/ecryptfs/read_write.c
··· 47 47 lower_file = ecryptfs_inode_to_private(ecryptfs_inode)->lower_file; 48 48 if (!lower_file) 49 49 return -EIO; 50 - rc = kernel_write(lower_file, data, size, offset); 50 + rc = kernel_write(lower_file, data, size, &offset); 51 51 mark_inode_dirty_sync(ecryptfs_inode); 52 52 return rc; 53 53 } ··· 237 237 lower_file = ecryptfs_inode_to_private(ecryptfs_inode)->lower_file; 238 238 if (!lower_file) 239 239 return -EIO; 240 - return kernel_read(lower_file, offset, data, size); 240 + return kernel_read(lower_file, data, size, &offset); 241 241 } 242 242 243 243 /**
+3 -21
fs/exec.c
··· 885 885 } 886 886 EXPORT_SYMBOL(open_exec); 887 887 888 - int kernel_read(struct file *file, loff_t offset, 889 - char *addr, unsigned long count) 890 - { 891 - mm_segment_t old_fs; 892 - loff_t pos = offset; 893 - int result; 894 - 895 - old_fs = get_fs(); 896 - set_fs(get_ds()); 897 - /* The cast to a user pointer is valid due to the set_fs() */ 898 - result = vfs_read(file, (void __user *)addr, count, &pos); 899 - set_fs(old_fs); 900 - return result; 901 - } 902 - 903 - EXPORT_SYMBOL(kernel_read); 904 - 905 888 int kernel_read_file(struct file *file, void **buf, loff_t *size, 906 889 loff_t max_size, enum kernel_read_file_id id) 907 890 { ··· 922 939 923 940 pos = 0; 924 941 while (pos < i_size) { 925 - bytes = kernel_read(file, pos, (char *)(*buf) + pos, 926 - i_size - pos); 942 + bytes = kernel_read(file, *buf + pos, i_size - pos, &pos); 927 943 if (bytes < 0) { 928 944 ret = bytes; 929 945 goto out; ··· 930 948 931 949 if (bytes == 0) 932 950 break; 933 - pos += bytes; 934 951 } 935 952 936 953 if (pos != i_size) { ··· 1548 1567 int prepare_binprm(struct linux_binprm *bprm) 1549 1568 { 1550 1569 int retval; 1570 + loff_t pos = 0; 1551 1571 1552 1572 bprm_fill_uid(bprm); 1553 1573 ··· 1559 1577 bprm->called_set_creds = 1; 1560 1578 1561 1579 memset(bprm->buf, 0, BINPRM_BUF_SIZE); 1562 - return kernel_read(bprm->file, 0, bprm->buf, BINPRM_BUF_SIZE); 1580 + return kernel_read(bprm->file, bprm->buf, BINPRM_BUF_SIZE, &pos); 1563 1581 } 1564 1582 1565 1583 EXPORT_SYMBOL(prepare_binprm);
+32 -11
fs/read_write.c
··· 413 413 else 414 414 return -EINVAL; 415 415 } 416 - EXPORT_SYMBOL(__vfs_read); 416 + 417 + ssize_t kernel_read(struct file *file, void *buf, size_t count, loff_t *pos) 418 + { 419 + mm_segment_t old_fs; 420 + ssize_t result; 421 + 422 + old_fs = get_fs(); 423 + set_fs(get_ds()); 424 + /* The cast to a user pointer is valid due to the set_fs() */ 425 + result = vfs_read(file, (void __user *)buf, count, pos); 426 + set_fs(old_fs); 427 + return result; 428 + } 429 + EXPORT_SYMBOL(kernel_read); 417 430 418 431 ssize_t vfs_read(struct file *file, char __user *buf, size_t count, loff_t *pos) 419 432 { ··· 453 440 454 441 return ret; 455 442 } 456 - 457 - EXPORT_SYMBOL(vfs_read); 458 443 459 444 static ssize_t new_sync_write(struct file *filp, const char __user *buf, size_t len, loff_t *ppos) 460 445 { ··· 482 471 else 483 472 return -EINVAL; 484 473 } 485 - EXPORT_SYMBOL(__vfs_write); 486 474 487 - ssize_t __kernel_write(struct file *file, const char *buf, size_t count, loff_t *pos) 475 + ssize_t __kernel_write(struct file *file, const void *buf, size_t count, loff_t *pos) 488 476 { 489 477 mm_segment_t old_fs; 490 478 const char __user *p; ··· 506 496 inc_syscw(current); 507 497 return ret; 508 498 } 509 - 510 499 EXPORT_SYMBOL(__kernel_write); 500 + 501 + ssize_t kernel_write(struct file *file, const void *buf, size_t count, 502 + loff_t *pos) 503 + { 504 + mm_segment_t old_fs; 505 + ssize_t res; 506 + 507 + old_fs = get_fs(); 508 + set_fs(get_ds()); 509 + /* The cast to a user pointer is valid due to the set_fs() */ 510 + res = vfs_write(file, (__force const char __user *)buf, count, pos); 511 + set_fs(old_fs); 512 + 513 + return res; 514 + } 515 + EXPORT_SYMBOL(kernel_write); 511 516 512 517 ssize_t vfs_write(struct file *file, const char __user *buf, size_t count, loff_t *pos) 513 518 { ··· 551 526 552 527 return ret; 553 528 } 554 - 555 - EXPORT_SYMBOL(vfs_write); 556 529 557 530 static inline loff_t file_pos_read(struct file *file) 558 531 { ··· 982 959 983 960 return ret; 984 961 } 985 - EXPORT_SYMBOL(vfs_readv); 986 962 987 - ssize_t vfs_writev(struct file *file, const struct iovec __user *vec, 963 + static ssize_t vfs_writev(struct file *file, const struct iovec __user *vec, 988 964 unsigned long vlen, loff_t *pos, rwf_t flags) 989 965 { 990 966 struct iovec iovstack[UIO_FASTIOV]; ··· 1000 978 } 1001 979 return ret; 1002 980 } 1003 - EXPORT_SYMBOL(vfs_writev); 1004 981 1005 982 static ssize_t do_readv(unsigned long fd, const struct iovec __user *vec, 1006 983 unsigned long vlen, rwf_t flags)
-16
fs/splice.c
··· 364 364 return res; 365 365 } 366 366 367 - ssize_t kernel_write(struct file *file, const char *buf, size_t count, 368 - loff_t pos) 369 - { 370 - mm_segment_t old_fs; 371 - ssize_t res; 372 - 373 - old_fs = get_fs(); 374 - set_fs(get_ds()); 375 - /* The cast to a user pointer is valid due to the set_fs() */ 376 - res = vfs_write(file, (__force const char __user *)buf, count, &pos); 377 - set_fs(old_fs); 378 - 379 - return res; 380 - } 381 - EXPORT_SYMBOL(kernel_write); 382 - 383 367 static ssize_t default_file_splice_read(struct file *in, loff_t *ppos, 384 368 struct pipe_inode_info *pipe, size_t len, 385 369 unsigned int flags)
+3 -6
include/linux/fs.h
··· 1754 1754 struct iovec **ret_pointer); 1755 1755 1756 1756 extern ssize_t __vfs_read(struct file *, char __user *, size_t, loff_t *); 1757 - extern ssize_t __vfs_write(struct file *, const char __user *, size_t, loff_t *); 1758 1757 extern ssize_t vfs_read(struct file *, char __user *, size_t, loff_t *); 1759 1758 extern ssize_t vfs_write(struct file *, const char __user *, size_t, loff_t *); 1760 1759 extern ssize_t vfs_readv(struct file *, const struct iovec __user *, 1761 - unsigned long, loff_t *, rwf_t); 1762 - extern ssize_t vfs_writev(struct file *, const struct iovec __user *, 1763 1760 unsigned long, loff_t *, rwf_t); 1764 1761 extern ssize_t vfs_copy_file_range(struct file *, loff_t , struct file *, 1765 1762 loff_t, size_t, unsigned int); ··· 2785 2788 return kernel_read_file_str[id]; 2786 2789 } 2787 2790 2788 - extern int kernel_read(struct file *, loff_t, char *, unsigned long); 2789 2791 extern int kernel_read_file(struct file *, void **, loff_t *, loff_t, 2790 2792 enum kernel_read_file_id); 2791 2793 extern int kernel_read_file_from_path(char *, void **, loff_t *, loff_t, 2792 2794 enum kernel_read_file_id); 2793 2795 extern int kernel_read_file_from_fd(int, void **, loff_t *, loff_t, 2794 2796 enum kernel_read_file_id); 2795 - extern ssize_t kernel_write(struct file *, const char *, size_t, loff_t); 2796 - extern ssize_t __kernel_write(struct file *, const char *, size_t, loff_t *); 2797 + extern ssize_t kernel_read(struct file *, void *, size_t, loff_t *); 2798 + extern ssize_t kernel_write(struct file *, const void *, size_t, loff_t *); 2799 + extern ssize_t __kernel_write(struct file *, const void *, size_t, loff_t *); 2797 2800 extern struct file * open_exec(const char *); 2798 2801 2799 2802 /* fs/dcache.c -- generic fs support functions */
+1 -1
kernel/acct.c
··· 516 516 if (file_start_write_trylock(file)) { 517 517 /* it's been opened O_APPEND, so position is irrelevant */ 518 518 loff_t pos = 0; 519 - __kernel_write(file, (char *)&ac, sizeof(acct_t), &pos); 519 + __kernel_write(file, &ac, sizeof(acct_t), &pos); 520 520 file_end_write(file); 521 521 } 522 522 out:
+14 -7
kernel/sysctl_binary.c
··· 986 986 size_t length = oldlen / sizeof(*vec); 987 987 char *str, *end; 988 988 int i; 989 + loff_t pos = 0; 989 990 990 - result = kernel_read(file, 0, buffer, BUFSZ - 1); 991 + result = kernel_read(file, buffer, BUFSZ - 1, &pos); 991 992 if (result < 0) 992 993 goto out_kfree; 993 994 ··· 1017 1016 size_t length = newlen / sizeof(*vec); 1018 1017 char *str, *end; 1019 1018 int i; 1019 + loff_t pos = 0; 1020 1020 1021 1021 str = buffer; 1022 1022 end = str + BUFSZ; ··· 1031 1029 str += scnprintf(str, end - str, "%lu\t", value); 1032 1030 } 1033 1031 1034 - result = kernel_write(file, buffer, str - buffer, 0); 1032 + result = kernel_write(file, buffer, str - buffer, &pos); 1035 1033 if (result < 0) 1036 1034 goto out_kfree; 1037 1035 } ··· 1059 1057 size_t length = oldlen / sizeof(*vec); 1060 1058 char *str, *end; 1061 1059 int i; 1060 + loff_t pos = 0; 1062 1061 1063 - result = kernel_read(file, 0, buffer, BUFSZ - 1); 1062 + result = kernel_read(file, buffer, BUFSZ - 1, &pos); 1064 1063 if (result < 0) 1065 1064 goto out_kfree; 1066 1065 ··· 1090 1087 size_t length = newlen / sizeof(*vec); 1091 1088 char *str, *end; 1092 1089 int i; 1090 + loff_t pos = 0; 1093 1091 1094 1092 str = buffer; 1095 1093 end = str + BUFSZ; ··· 1104 1100 str += scnprintf(str, end - str, "%lu\t", value); 1105 1101 } 1106 1102 1107 - result = kernel_write(file, buffer, str - buffer, 0); 1103 + result = kernel_write(file, buffer, str - buffer, &pos); 1108 1104 if (result < 0) 1109 1105 goto out_kfree; 1110 1106 } ··· 1124 1120 if (oldval && oldlen) { 1125 1121 char buf[UUID_STRING_LEN + 1]; 1126 1122 uuid_t uuid; 1123 + loff_t pos = 0; 1127 1124 1128 - result = kernel_read(file, 0, buf, sizeof(buf) - 1); 1125 + result = kernel_read(file, buf, sizeof(buf) - 1, &pos); 1129 1126 if (result < 0) 1130 1127 goto out; 1131 1128 ··· 1159 1154 char buf[15], *nodep; 1160 1155 unsigned long area, node; 1161 1156 __le16 dnaddr; 1157 + loff_t pos = 0; 1162 1158 1163 - result = kernel_read(file, 0, buf, sizeof(buf) - 1); 1159 + result = kernel_read(file, buf, sizeof(buf) - 1, &pos); 1164 1160 if (result < 0) 1165 1161 goto out; 1166 1162 ··· 1194 1188 __le16 dnaddr; 1195 1189 char buf[15]; 1196 1190 int len; 1191 + loff_t pos = 0; 1197 1192 1198 1193 result = -EINVAL; 1199 1194 if (newlen != sizeof(dnaddr)) ··· 1208 1201 le16_to_cpu(dnaddr) >> 10, 1209 1202 le16_to_cpu(dnaddr) & 0x3ff); 1210 1203 1211 - result = kernel_write(file, buf, len, 0); 1204 + result = kernel_write(file, buf, len, &pos); 1212 1205 if (result < 0) 1213 1206 goto out; 1214 1207 }
+1 -6
mm/nommu.c
··· 1164 1164 1165 1165 if (vma->vm_file) { 1166 1166 /* read the contents of a file into the copy */ 1167 - mm_segment_t old_fs; 1168 1167 loff_t fpos; 1169 1168 1170 1169 fpos = vma->vm_pgoff; 1171 1170 fpos <<= PAGE_SHIFT; 1172 1171 1173 - old_fs = get_fs(); 1174 - set_fs(KERNEL_DS); 1175 - ret = __vfs_read(vma->vm_file, base, len, &fpos); 1176 - set_fs(old_fs); 1177 - 1172 + ret = kernel_read(vma->vm_file, base, len, &fpos); 1178 1173 if (ret < 0) 1179 1174 goto error_free; 1180 1175
+5 -9
net/9p/trans_fd.c
··· 272 272 { 273 273 int ret; 274 274 struct p9_trans_fd *ts = NULL; 275 + loff_t pos; 275 276 276 277 if (client && client->status != Disconnected) 277 278 ts = client->trans; ··· 283 282 if (!(ts->rd->f_flags & O_NONBLOCK)) 284 283 p9_debug(P9_DEBUG_ERROR, "blocking read ...\n"); 285 284 286 - ret = kernel_read(ts->rd, ts->rd->f_pos, v, len); 285 + pos = ts->rd->f_pos; 286 + ret = kernel_read(ts->rd, v, len, &pos); 287 287 if (ret <= 0 && ret != -ERESTARTSYS && ret != -EAGAIN) 288 288 client->status = Disconnected; 289 289 return ret; ··· 422 420 423 421 static int p9_fd_write(struct p9_client *client, void *v, int len) 424 422 { 425 - int ret; 426 - mm_segment_t oldfs; 423 + ssize_t ret; 427 424 struct p9_trans_fd *ts = NULL; 428 425 429 426 if (client && client->status != Disconnected) ··· 434 433 if (!(ts->wr->f_flags & O_NONBLOCK)) 435 434 p9_debug(P9_DEBUG_ERROR, "blocking write ...\n"); 436 435 437 - oldfs = get_fs(); 438 - set_fs(get_ds()); 439 - /* The cast to a user pointer is valid due to the set_fs() */ 440 - ret = vfs_write(ts->wr, (__force void __user *)v, len, &ts->wr->f_pos); 441 - set_fs(oldfs); 442 - 436 + ret = kernel_write(ts->wr, v, len, &ts->wr->f_pos); 443 437 if (ret <= 0 && ret != -ERESTARTSYS && ret != -EAGAIN) 444 438 client->status = Disconnected; 445 439 return ret;
+4 -2
security/keys/big_key.c
··· 147 147 * File content is stored encrypted with randomly generated key. 148 148 */ 149 149 size_t enclen = ALIGN(datalen, crypto_skcipher_blocksize(big_key_skcipher)); 150 + loff_t pos = 0; 150 151 151 152 /* prepare aligned data to encrypt */ 152 153 data = kmalloc(enclen, GFP_KERNEL); ··· 180 179 goto err_enckey; 181 180 } 182 181 183 - written = kernel_write(file, data, enclen, 0); 182 + written = kernel_write(file, data, enclen, &pos); 184 183 if (written != enclen) { 185 184 ret = written; 186 185 if (written >= 0) ··· 296 295 u8 *data; 297 296 u8 *enckey = (u8 *)key->payload.data[big_key_data]; 298 297 size_t enclen = ALIGN(datalen, crypto_skcipher_blocksize(big_key_skcipher)); 298 + loff_t pos = 0; 299 299 300 300 data = kmalloc(enclen, GFP_KERNEL); 301 301 if (!data) ··· 309 307 } 310 308 311 309 /* read file to kernel and decrypt */ 312 - ret = kernel_read(file, 0, data, enclen); 310 + ret = kernel_read(file, data, enclen, &pos); 313 311 if (ret >= 0 && ret != enclen) { 314 312 ret = -EIO; 315 313 goto err_fput;