Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

fs: fix kernel_read prototype

Use proper ssize_t and size_t types for the return value and count
argument, move the offset last and make it an in/out argument like
all other read/write helpers, and make the buf argument a void pointer
to get rid of lots of casts in the callers.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>

authored by

Christoph Hellwig and committed by
Al Viro
bdd1d2d3 c41fbad0

+69 -71
+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))
+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 }
+1 -1
drivers/mtd/nand/nandsim.c
··· 1379 1379 if (err) 1380 1380 return err; 1381 1381 noreclaim_flag = memalloc_noreclaim_save(); 1382 - tx = kernel_read(file, pos, buf, count); 1382 + tx = kernel_read(file, buf, count, &pos); 1383 1383 memalloc_noreclaim_restore(noreclaim_flag); 1384 1384 put_pages(ns); 1385 1385 return tx;
+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); ··· 199 204 } 200 205 201 206 /* Read in first chunk of data and parse gzip header. */ 202 - fpos = offset; 203 - ret = kernel_read(bprm->file, offset, buf, LBUFSIZE); 207 + ret = kernel_read(bprm->file, buf, LBUFSIZE, &fpos); 204 208 205 209 strm.next_in = buf; 206 210 strm.avail_in = ret; 207 211 strm.total_in = 0; 208 - fpos += ret; 209 212 210 213 retval = -ENOEXEC; 211 214 ··· 269 276 } 270 277 271 278 while ((ret = zlib_inflate(&strm, Z_NO_FLUSH)) == Z_OK) { 272 - ret = kernel_read(bprm->file, fpos, buf, LBUFSIZE); 279 + ret = kernel_read(bprm->file, buf, LBUFSIZE, &fpos); 273 280 if (ret <= 0) 274 281 break; 275 282 len -= ret; ··· 277 284 strm.next_in = buf; 278 285 strm.avail_in = ret; 279 286 strm.total_in = 0; 280 - fpos += ret; 281 287 } 282 288 283 289 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
+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);
+1 -1
fs/ecryptfs/read_write.c
··· 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 -4
fs/exec.c
··· 922 922 923 923 pos = 0; 924 924 while (pos < i_size) { 925 - bytes = kernel_read(file, pos, (char *)(*buf) + pos, 926 - i_size - pos); 925 + bytes = kernel_read(file, *buf + pos, i_size - pos, &pos); 927 926 if (bytes < 0) { 928 927 ret = bytes; 929 928 goto out; ··· 930 931 931 932 if (bytes == 0) 932 933 break; 933 - pos += bytes; 934 934 } 935 935 936 936 if (pos != i_size) { ··· 1522 1524 int prepare_binprm(struct linux_binprm *bprm) 1523 1525 { 1524 1526 int retval; 1527 + loff_t pos = 0; 1525 1528 1526 1529 bprm_fill_uid(bprm); 1527 1530 ··· 1533 1534 bprm->cred_prepared = 1; 1534 1535 1535 1536 memset(bprm->buf, 0, BINPRM_BUF_SIZE); 1536 - return kernel_read(bprm->file, 0, bprm->buf, BINPRM_BUF_SIZE); 1537 + return kernel_read(bprm->file, bprm->buf, BINPRM_BUF_SIZE, &pos); 1537 1538 } 1538 1539 1539 1540 EXPORT_SYMBOL(prepare_binprm);
+3 -5
fs/read_write.c
··· 415 415 } 416 416 EXPORT_SYMBOL(__vfs_read); 417 417 418 - int kernel_read(struct file *file, loff_t offset, char *addr, 419 - unsigned long count) 418 + ssize_t kernel_read(struct file *file, void *buf, size_t count, loff_t *pos) 420 419 { 421 420 mm_segment_t old_fs; 422 - loff_t pos = offset; 423 - int result; 421 + ssize_t result; 424 422 425 423 old_fs = get_fs(); 426 424 set_fs(get_ds()); 427 425 /* The cast to a user pointer is valid due to the set_fs() */ 428 - result = vfs_read(file, (void __user *)addr, count, &pos); 426 + result = vfs_read(file, (void __user *)buf, count, pos); 429 427 set_fs(old_fs); 430 428 return result; 431 429 }
+1 -1
include/linux/fs.h
··· 2772 2772 return kernel_read_file_str[id]; 2773 2773 } 2774 2774 2775 - extern int kernel_read(struct file *, loff_t, char *, unsigned long); 2776 2775 extern int kernel_read_file(struct file *, void **, loff_t *, loff_t, 2777 2776 enum kernel_read_file_id); 2778 2777 extern int kernel_read_file_from_path(char *, void **, loff_t *, loff_t, 2779 2778 enum kernel_read_file_id); 2780 2779 extern int kernel_read_file_from_fd(int, void **, loff_t *, loff_t, 2781 2780 enum kernel_read_file_id); 2781 + extern ssize_t kernel_read(struct file *, void *, size_t, loff_t *); 2782 2782 extern ssize_t kernel_write(struct file *, const char *, size_t, loff_t); 2783 2783 extern ssize_t __kernel_write(struct file *, const char *, size_t, loff_t *); 2784 2784 extern struct file * open_exec(const char *);
+8 -4
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 ··· 1058 1057 size_t length = oldlen / sizeof(*vec); 1059 1058 char *str, *end; 1060 1059 int i; 1060 + loff_t pos = 0; 1061 1061 1062 - result = kernel_read(file, 0, buffer, BUFSZ - 1); 1062 + result = kernel_read(file, buffer, BUFSZ - 1, &pos); 1063 1063 if (result < 0) 1064 1064 goto out_kfree; 1065 1065 ··· 1122 1120 if (oldval && oldlen) { 1123 1121 char buf[UUID_STRING_LEN + 1]; 1124 1122 uuid_t uuid; 1123 + loff_t pos = 0; 1125 1124 1126 - result = kernel_read(file, 0, buf, sizeof(buf) - 1); 1125 + result = kernel_read(file, buf, sizeof(buf) - 1, &pos); 1127 1126 if (result < 0) 1128 1127 goto out; 1129 1128 ··· 1157 1154 char buf[15], *nodep; 1158 1155 unsigned long area, node; 1159 1156 __le16 dnaddr; 1157 + loff_t pos = 0; 1160 1158 1161 - result = kernel_read(file, 0, buf, sizeof(buf) - 1); 1159 + result = kernel_read(file, buf, sizeof(buf) - 1, &pos); 1162 1160 if (result < 0) 1163 1161 goto out; 1164 1162
+3 -1
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;
+2 -1
security/keys/big_key.c
··· 295 295 u8 *data; 296 296 u8 *enckey = (u8 *)key->payload.data[big_key_data]; 297 297 size_t enclen = ALIGN(datalen, crypto_skcipher_blocksize(big_key_skcipher)); 298 + loff_t pos = 0; 298 299 299 300 data = kmalloc(enclen, GFP_KERNEL); 300 301 if (!data) ··· 308 307 } 309 308 310 309 /* read file to kernel and decrypt */ 311 - ret = kernel_read(file, 0, data, enclen); 310 + ret = kernel_read(file, data, enclen, &pos); 312 311 if (ret >= 0 && ret != enclen) { 313 312 ret = -EIO; 314 313 goto err_fput;