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

ide: decrease size of ->pc_buf field in struct ide_atapi_pc

struct ide_atapi_pc is often allocated on the stack and size of ->pc_buf
size is 256 bytes. However since only ide_floppy_create_read_capacity_cmd()
and idetape_create_inquiry_cmd() require such size allocate buffers for
these pc-s explicitely and decrease ->pc_buf size to 64 bytes.

Cc: Borislav Petkov <petkovbb@gmail.com>
Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>

+13 -3
+4 -1
drivers/ide/ide-floppy.c
··· 385 385 struct gendisk *disk = floppy->disk; 386 386 struct ide_atapi_pc pc; 387 387 u8 *cap_desc; 388 - u8 header_len, desc_cnt; 388 + u8 pc_buf[256], header_len, desc_cnt; 389 389 int i, rc = 1, blocks, length; 390 390 391 391 drive->bios_cyl = 0; ··· 395 395 drive->capacity64 = 0; 396 396 397 397 ide_floppy_create_read_capacity_cmd(&pc); 398 + pc.buf = &pc_buf[0]; 399 + pc.buf_size = sizeof(pc_buf); 400 + 398 401 if (ide_queue_pc_tail(drive, disk, &pc)) { 399 402 printk(KERN_ERR PFX "Can't get floppy parameters\n"); 400 403 return 1;
+4 -1
drivers/ide/ide-floppy_ioctl.c
··· 36 36 int __user *arg) 37 37 { 38 38 struct ide_disk_obj *floppy = drive->driver_data; 39 - u8 header_len, desc_cnt; 40 39 int i, blocks, length, u_array_size, u_index; 41 40 int __user *argp; 41 + u8 pc_buf[256], header_len, desc_cnt; 42 42 43 43 if (get_user(u_array_size, arg)) 44 44 return -EFAULT; ··· 47 47 return -EINVAL; 48 48 49 49 ide_floppy_create_read_capacity_cmd(pc); 50 + pc->buf = &pc_buf[0]; 51 + pc->buf_size = sizeof(pc_buf); 52 + 50 53 if (ide_queue_pc_tail(drive, floppy->disk, pc)) { 51 54 printk(KERN_ERR "ide-floppy: Can't get floppy parameters\n"); 52 55 return -EIO;
+4
drivers/ide/ide-tape.c
··· 2014 2014 { 2015 2015 idetape_tape_t *tape = drive->driver_data; 2016 2016 struct ide_atapi_pc pc; 2017 + u8 pc_buf[256]; 2017 2018 char fw_rev[4], vendor_id[8], product_id[16]; 2018 2019 2019 2020 idetape_create_inquiry_cmd(&pc); 2021 + pc.buf = &pc_buf[0]; 2022 + pc.buf_size = sizeof(pc_buf); 2023 + 2020 2024 if (ide_queue_pc_tail(drive, tape->disk, &pc)) { 2021 2025 printk(KERN_ERR "ide-tape: %s: can't get INQUIRY results\n", 2022 2026 tape->name);
+1 -1
include/linux/ide.h
··· 377 377 * With each packet command, we allocate a buffer of IDE_PC_BUFFER_SIZE bytes. 378 378 * This is used for several packet commands (not for READ/WRITE commands). 379 379 */ 380 - #define IDE_PC_BUFFER_SIZE 256 380 + #define IDE_PC_BUFFER_SIZE 64 381 381 #define ATAPI_WAIT_PC (60 * HZ) 382 382 383 383 struct ide_atapi_pc {