2008-10-11 00:39:38 +04:00
/*
* ide - floppy IOCTLs handling .
*/
# include <linux/kernel.h>
# include <linux/ide.h>
# include <linux/cdrom.h>
# include <asm/unaligned.h>
# include <scsi/scsi_ioctl.h>
# include "ide-floppy.h"
/*
* Obtain the list of formattable capacities .
* Very similar to ide_floppy_get_capacity , except that we push the capacity
* descriptors to userland , instead of our own structures .
*
* Userland gives us the following structure :
*
* struct idefloppy_format_capacities {
* int nformats ;
* struct {
* int nblocks ;
* int blocksize ;
* } formats [ ] ;
* } ;
*
* userland initializes nformats to the number of allocated formats [ ] records .
* On exit we set nformats to the number of records we ' ve actually initialized .
*/
ide-floppy: allocate only toplevel packet commands
This makes the top-level function just allocate a single pc entry, and then
pass it down as a pointer to all the helper functions that also need one
of those "struct ide_atapi_pc" things. As far as I can tell, the use of
these things never overlaps each other, BUT I DID NOT CHECK VERY CLOSELY!
So I'm not guaranteeing this is correct, and I don't have the hardware. It
would be good for somebody who knows the code more, and has the hardware,
could please test this?
With this, ide-floppy still has fairly big stack usage, but instead of
idefloppy_ioctl [vmlinux]: 1208
ide_floppy_get_capacity [vmlinux]: 872
idefloppy_release [vmlinux]: 408
idefloppy_open [vmlinux]: 408
where those two first ones are at the very top of the list of stack users
for me, it's now
ide_floppy_get_capacity [vmlinux]: 404
ide_floppy_ioctl [vmlinux]: 364
ie they are still high, but they are no longer at the top.
Borislav: Since ide_floppy_get_capacity is passed as a function pointer to other
parts of the kernel (e.g., block layer) we need that ide_atapi_pc to be created
on stack. Also, redid stack users numbers above. The two functions missing from
Linus' original 'make stackusage' output are due to ide being
rewritten/reorganized atm.
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Borislav Petkov <petkovbb@gmail.com>
Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
2009-01-02 18:12:51 +03:00
static int ide_floppy_get_format_capacities ( ide_drive_t * drive ,
struct ide_atapi_pc * pc ,
int __user * arg )
2008-10-11 00:39:38 +04:00
{
2008-10-17 20:09:14 +04:00
struct ide_disk_obj * floppy = drive - > driver_data ;
2008-10-11 00:39:38 +04:00
int i , blocks , length , u_array_size , u_index ;
int __user * argp ;
2009-03-31 22:15:25 +04:00
u8 pc_buf [ 256 ] , header_len , desc_cnt ;
2008-10-11 00:39:38 +04:00
if ( get_user ( u_array_size , arg ) )
return - EFAULT ;
if ( u_array_size < = 0 )
return - EINVAL ;
ide-floppy: allocate only toplevel packet commands
This makes the top-level function just allocate a single pc entry, and then
pass it down as a pointer to all the helper functions that also need one
of those "struct ide_atapi_pc" things. As far as I can tell, the use of
these things never overlaps each other, BUT I DID NOT CHECK VERY CLOSELY!
So I'm not guaranteeing this is correct, and I don't have the hardware. It
would be good for somebody who knows the code more, and has the hardware,
could please test this?
With this, ide-floppy still has fairly big stack usage, but instead of
idefloppy_ioctl [vmlinux]: 1208
ide_floppy_get_capacity [vmlinux]: 872
idefloppy_release [vmlinux]: 408
idefloppy_open [vmlinux]: 408
where those two first ones are at the very top of the list of stack users
for me, it's now
ide_floppy_get_capacity [vmlinux]: 404
ide_floppy_ioctl [vmlinux]: 364
ie they are still high, but they are no longer at the top.
Borislav: Since ide_floppy_get_capacity is passed as a function pointer to other
parts of the kernel (e.g., block layer) we need that ide_atapi_pc to be created
on stack. Also, redid stack users numbers above. The two functions missing from
Linus' original 'make stackusage' output are due to ide being
rewritten/reorganized atm.
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Borislav Petkov <petkovbb@gmail.com>
Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
2009-01-02 18:12:51 +03:00
ide_floppy_create_read_capacity_cmd ( pc ) ;
2009-03-31 22:15:25 +04:00
pc - > buf = & pc_buf [ 0 ] ;
pc - > buf_size = sizeof ( pc_buf ) ;
ide-floppy: allocate only toplevel packet commands
This makes the top-level function just allocate a single pc entry, and then
pass it down as a pointer to all the helper functions that also need one
of those "struct ide_atapi_pc" things. As far as I can tell, the use of
these things never overlaps each other, BUT I DID NOT CHECK VERY CLOSELY!
So I'm not guaranteeing this is correct, and I don't have the hardware. It
would be good for somebody who knows the code more, and has the hardware,
could please test this?
With this, ide-floppy still has fairly big stack usage, but instead of
idefloppy_ioctl [vmlinux]: 1208
ide_floppy_get_capacity [vmlinux]: 872
idefloppy_release [vmlinux]: 408
idefloppy_open [vmlinux]: 408
where those two first ones are at the very top of the list of stack users
for me, it's now
ide_floppy_get_capacity [vmlinux]: 404
ide_floppy_ioctl [vmlinux]: 364
ie they are still high, but they are no longer at the top.
Borislav: Since ide_floppy_get_capacity is passed as a function pointer to other
parts of the kernel (e.g., block layer) we need that ide_atapi_pc to be created
on stack. Also, redid stack users numbers above. The two functions missing from
Linus' original 'make stackusage' output are due to ide being
rewritten/reorganized atm.
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Borislav Petkov <petkovbb@gmail.com>
Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
2009-01-02 18:12:51 +03:00
if ( ide_queue_pc_tail ( drive , floppy - > disk , pc ) ) {
2008-10-11 00:39:38 +04:00
printk ( KERN_ERR " ide-floppy: Can't get floppy parameters \n " ) ;
return - EIO ;
}
ide-floppy: allocate only toplevel packet commands
This makes the top-level function just allocate a single pc entry, and then
pass it down as a pointer to all the helper functions that also need one
of those "struct ide_atapi_pc" things. As far as I can tell, the use of
these things never overlaps each other, BUT I DID NOT CHECK VERY CLOSELY!
So I'm not guaranteeing this is correct, and I don't have the hardware. It
would be good for somebody who knows the code more, and has the hardware,
could please test this?
With this, ide-floppy still has fairly big stack usage, but instead of
idefloppy_ioctl [vmlinux]: 1208
ide_floppy_get_capacity [vmlinux]: 872
idefloppy_release [vmlinux]: 408
idefloppy_open [vmlinux]: 408
where those two first ones are at the very top of the list of stack users
for me, it's now
ide_floppy_get_capacity [vmlinux]: 404
ide_floppy_ioctl [vmlinux]: 364
ie they are still high, but they are no longer at the top.
Borislav: Since ide_floppy_get_capacity is passed as a function pointer to other
parts of the kernel (e.g., block layer) we need that ide_atapi_pc to be created
on stack. Also, redid stack users numbers above. The two functions missing from
Linus' original 'make stackusage' output are due to ide being
rewritten/reorganized atm.
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Borislav Petkov <petkovbb@gmail.com>
Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
2009-01-02 18:12:51 +03:00
header_len = pc - > buf [ 3 ] ;
2008-10-11 00:39:38 +04:00
desc_cnt = header_len / 8 ; /* capacity descriptor of 8 bytes */
u_index = 0 ;
argp = arg + 1 ;
/*
* We always skip the first capacity descriptor . That ' s the current
* capacity . We are interested in the remaining descriptors , the
* formattable capacities .
*/
for ( i = 1 ; i < desc_cnt ; i + + ) {
unsigned int desc_start = 4 + i * 8 ;
if ( u_index > = u_array_size )
break ; /* User-supplied buffer too small */
ide-floppy: allocate only toplevel packet commands
This makes the top-level function just allocate a single pc entry, and then
pass it down as a pointer to all the helper functions that also need one
of those "struct ide_atapi_pc" things. As far as I can tell, the use of
these things never overlaps each other, BUT I DID NOT CHECK VERY CLOSELY!
So I'm not guaranteeing this is correct, and I don't have the hardware. It
would be good for somebody who knows the code more, and has the hardware,
could please test this?
With this, ide-floppy still has fairly big stack usage, but instead of
idefloppy_ioctl [vmlinux]: 1208
ide_floppy_get_capacity [vmlinux]: 872
idefloppy_release [vmlinux]: 408
idefloppy_open [vmlinux]: 408
where those two first ones are at the very top of the list of stack users
for me, it's now
ide_floppy_get_capacity [vmlinux]: 404
ide_floppy_ioctl [vmlinux]: 364
ie they are still high, but they are no longer at the top.
Borislav: Since ide_floppy_get_capacity is passed as a function pointer to other
parts of the kernel (e.g., block layer) we need that ide_atapi_pc to be created
on stack. Also, redid stack users numbers above. The two functions missing from
Linus' original 'make stackusage' output are due to ide being
rewritten/reorganized atm.
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Borislav Petkov <petkovbb@gmail.com>
Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
2009-01-02 18:12:51 +03:00
blocks = be32_to_cpup ( ( __be32 * ) & pc - > buf [ desc_start ] ) ;
length = be16_to_cpup ( ( __be16 * ) & pc - > buf [ desc_start + 6 ] ) ;
2008-10-11 00:39:38 +04:00
if ( put_user ( blocks , argp ) )
return - EFAULT ;
+ + argp ;
if ( put_user ( length , argp ) )
return - EFAULT ;
+ + argp ;
+ + u_index ;
}
if ( put_user ( u_index , arg ) )
return - EFAULT ;
return 0 ;
}
static void ide_floppy_create_format_unit_cmd ( struct ide_atapi_pc * pc , int b ,
int l , int flags )
{
ide_init_pc ( pc ) ;
pc - > c [ 0 ] = GPCMD_FORMAT_UNIT ;
pc - > c [ 1 ] = 0x17 ;
memset ( pc - > buf , 0 , 12 ) ;
pc - > buf [ 1 ] = 0xA2 ;
/* Default format list header, u8 1: FOV/DCRT/IMM bits set */
if ( flags & 1 ) /* Verify bit on... */
pc - > buf [ 1 ] ^ = 0x20 ; /* ... turn off DCRT bit */
pc - > buf [ 3 ] = 8 ;
put_unaligned ( cpu_to_be32 ( b ) , ( unsigned int * ) ( & pc - > buf [ 4 ] ) ) ;
put_unaligned ( cpu_to_be32 ( l ) , ( unsigned int * ) ( & pc - > buf [ 8 ] ) ) ;
pc - > buf_size = 12 ;
pc - > flags | = PC_FLAG_WRITING ;
}
ide-floppy: allocate only toplevel packet commands
This makes the top-level function just allocate a single pc entry, and then
pass it down as a pointer to all the helper functions that also need one
of those "struct ide_atapi_pc" things. As far as I can tell, the use of
these things never overlaps each other, BUT I DID NOT CHECK VERY CLOSELY!
So I'm not guaranteeing this is correct, and I don't have the hardware. It
would be good for somebody who knows the code more, and has the hardware,
could please test this?
With this, ide-floppy still has fairly big stack usage, but instead of
idefloppy_ioctl [vmlinux]: 1208
ide_floppy_get_capacity [vmlinux]: 872
idefloppy_release [vmlinux]: 408
idefloppy_open [vmlinux]: 408
where those two first ones are at the very top of the list of stack users
for me, it's now
ide_floppy_get_capacity [vmlinux]: 404
ide_floppy_ioctl [vmlinux]: 364
ie they are still high, but they are no longer at the top.
Borislav: Since ide_floppy_get_capacity is passed as a function pointer to other
parts of the kernel (e.g., block layer) we need that ide_atapi_pc to be created
on stack. Also, redid stack users numbers above. The two functions missing from
Linus' original 'make stackusage' output are due to ide being
rewritten/reorganized atm.
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Borislav Petkov <petkovbb@gmail.com>
Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
2009-01-02 18:12:51 +03:00
static int ide_floppy_get_sfrp_bit ( ide_drive_t * drive , struct ide_atapi_pc * pc )
2008-10-11 00:39:38 +04:00
{
2008-10-17 20:09:16 +04:00
struct ide_disk_obj * floppy = drive - > driver_data ;
2008-10-11 00:39:38 +04:00
drive - > atapi_flags & = ~ IDE_AFLAG_SRFP ;
ide-floppy: allocate only toplevel packet commands
This makes the top-level function just allocate a single pc entry, and then
pass it down as a pointer to all the helper functions that also need one
of those "struct ide_atapi_pc" things. As far as I can tell, the use of
these things never overlaps each other, BUT I DID NOT CHECK VERY CLOSELY!
So I'm not guaranteeing this is correct, and I don't have the hardware. It
would be good for somebody who knows the code more, and has the hardware,
could please test this?
With this, ide-floppy still has fairly big stack usage, but instead of
idefloppy_ioctl [vmlinux]: 1208
ide_floppy_get_capacity [vmlinux]: 872
idefloppy_release [vmlinux]: 408
idefloppy_open [vmlinux]: 408
where those two first ones are at the very top of the list of stack users
for me, it's now
ide_floppy_get_capacity [vmlinux]: 404
ide_floppy_ioctl [vmlinux]: 364
ie they are still high, but they are no longer at the top.
Borislav: Since ide_floppy_get_capacity is passed as a function pointer to other
parts of the kernel (e.g., block layer) we need that ide_atapi_pc to be created
on stack. Also, redid stack users numbers above. The two functions missing from
Linus' original 'make stackusage' output are due to ide being
rewritten/reorganized atm.
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Borislav Petkov <petkovbb@gmail.com>
Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
2009-01-02 18:12:51 +03:00
ide_floppy_create_mode_sense_cmd ( pc , IDEFLOPPY_CAPABILITIES_PAGE ) ;
pc - > flags | = PC_FLAG_SUPPRESS_ERROR ;
2008-10-11 00:39:38 +04:00
ide-floppy: allocate only toplevel packet commands
This makes the top-level function just allocate a single pc entry, and then
pass it down as a pointer to all the helper functions that also need one
of those "struct ide_atapi_pc" things. As far as I can tell, the use of
these things never overlaps each other, BUT I DID NOT CHECK VERY CLOSELY!
So I'm not guaranteeing this is correct, and I don't have the hardware. It
would be good for somebody who knows the code more, and has the hardware,
could please test this?
With this, ide-floppy still has fairly big stack usage, but instead of
idefloppy_ioctl [vmlinux]: 1208
ide_floppy_get_capacity [vmlinux]: 872
idefloppy_release [vmlinux]: 408
idefloppy_open [vmlinux]: 408
where those two first ones are at the very top of the list of stack users
for me, it's now
ide_floppy_get_capacity [vmlinux]: 404
ide_floppy_ioctl [vmlinux]: 364
ie they are still high, but they are no longer at the top.
Borislav: Since ide_floppy_get_capacity is passed as a function pointer to other
parts of the kernel (e.g., block layer) we need that ide_atapi_pc to be created
on stack. Also, redid stack users numbers above. The two functions missing from
Linus' original 'make stackusage' output are due to ide being
rewritten/reorganized atm.
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Borislav Petkov <petkovbb@gmail.com>
Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
2009-01-02 18:12:51 +03:00
if ( ide_queue_pc_tail ( drive , floppy - > disk , pc ) )
2008-10-11 00:39:38 +04:00
return 1 ;
ide-floppy: allocate only toplevel packet commands
This makes the top-level function just allocate a single pc entry, and then
pass it down as a pointer to all the helper functions that also need one
of those "struct ide_atapi_pc" things. As far as I can tell, the use of
these things never overlaps each other, BUT I DID NOT CHECK VERY CLOSELY!
So I'm not guaranteeing this is correct, and I don't have the hardware. It
would be good for somebody who knows the code more, and has the hardware,
could please test this?
With this, ide-floppy still has fairly big stack usage, but instead of
idefloppy_ioctl [vmlinux]: 1208
ide_floppy_get_capacity [vmlinux]: 872
idefloppy_release [vmlinux]: 408
idefloppy_open [vmlinux]: 408
where those two first ones are at the very top of the list of stack users
for me, it's now
ide_floppy_get_capacity [vmlinux]: 404
ide_floppy_ioctl [vmlinux]: 364
ie they are still high, but they are no longer at the top.
Borislav: Since ide_floppy_get_capacity is passed as a function pointer to other
parts of the kernel (e.g., block layer) we need that ide_atapi_pc to be created
on stack. Also, redid stack users numbers above. The two functions missing from
Linus' original 'make stackusage' output are due to ide being
rewritten/reorganized atm.
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Borislav Petkov <petkovbb@gmail.com>
Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
2009-01-02 18:12:51 +03:00
if ( pc - > buf [ 8 + 2 ] & 0x40 )
2008-10-11 00:39:38 +04:00
drive - > atapi_flags | = IDE_AFLAG_SRFP ;
return 0 ;
}
ide-floppy: allocate only toplevel packet commands
This makes the top-level function just allocate a single pc entry, and then
pass it down as a pointer to all the helper functions that also need one
of those "struct ide_atapi_pc" things. As far as I can tell, the use of
these things never overlaps each other, BUT I DID NOT CHECK VERY CLOSELY!
So I'm not guaranteeing this is correct, and I don't have the hardware. It
would be good for somebody who knows the code more, and has the hardware,
could please test this?
With this, ide-floppy still has fairly big stack usage, but instead of
idefloppy_ioctl [vmlinux]: 1208
ide_floppy_get_capacity [vmlinux]: 872
idefloppy_release [vmlinux]: 408
idefloppy_open [vmlinux]: 408
where those two first ones are at the very top of the list of stack users
for me, it's now
ide_floppy_get_capacity [vmlinux]: 404
ide_floppy_ioctl [vmlinux]: 364
ie they are still high, but they are no longer at the top.
Borislav: Since ide_floppy_get_capacity is passed as a function pointer to other
parts of the kernel (e.g., block layer) we need that ide_atapi_pc to be created
on stack. Also, redid stack users numbers above. The two functions missing from
Linus' original 'make stackusage' output are due to ide being
rewritten/reorganized atm.
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Borislav Petkov <petkovbb@gmail.com>
Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
2009-01-02 18:12:51 +03:00
static int ide_floppy_format_unit ( ide_drive_t * drive , struct ide_atapi_pc * pc ,
int __user * arg )
2008-10-11 00:39:38 +04:00
{
2008-10-17 20:09:16 +04:00
struct ide_disk_obj * floppy = drive - > driver_data ;
2008-10-11 00:39:38 +04:00
int blocks , length , flags , err = 0 ;
if ( floppy - > openers > 1 ) {
/* Don't format if someone is using the disk */
2008-10-17 20:09:11 +04:00
drive - > dev_flags & = ~ IDE_DFLAG_FORMAT_IN_PROGRESS ;
2008-10-11 00:39:38 +04:00
return - EBUSY ;
}
2008-10-17 20:09:11 +04:00
drive - > dev_flags | = IDE_DFLAG_FORMAT_IN_PROGRESS ;
2008-10-11 00:39:38 +04:00
/*
* Send ATAPI_FORMAT_UNIT to the drive .
*
* Userland gives us the following structure :
*
* struct idefloppy_format_command {
* int nblocks ;
* int blocksize ;
* int flags ;
* } ;
*
* flags is a bitmask , currently , the only defined flag is :
*
* 0x01 - verify media after format .
*/
if ( get_user ( blocks , arg ) | |
get_user ( length , arg + 1 ) | |
get_user ( flags , arg + 2 ) ) {
err = - EFAULT ;
goto out ;
}
ide-floppy: allocate only toplevel packet commands
This makes the top-level function just allocate a single pc entry, and then
pass it down as a pointer to all the helper functions that also need one
of those "struct ide_atapi_pc" things. As far as I can tell, the use of
these things never overlaps each other, BUT I DID NOT CHECK VERY CLOSELY!
So I'm not guaranteeing this is correct, and I don't have the hardware. It
would be good for somebody who knows the code more, and has the hardware,
could please test this?
With this, ide-floppy still has fairly big stack usage, but instead of
idefloppy_ioctl [vmlinux]: 1208
ide_floppy_get_capacity [vmlinux]: 872
idefloppy_release [vmlinux]: 408
idefloppy_open [vmlinux]: 408
where those two first ones are at the very top of the list of stack users
for me, it's now
ide_floppy_get_capacity [vmlinux]: 404
ide_floppy_ioctl [vmlinux]: 364
ie they are still high, but they are no longer at the top.
Borislav: Since ide_floppy_get_capacity is passed as a function pointer to other
parts of the kernel (e.g., block layer) we need that ide_atapi_pc to be created
on stack. Also, redid stack users numbers above. The two functions missing from
Linus' original 'make stackusage' output are due to ide being
rewritten/reorganized atm.
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Borislav Petkov <petkovbb@gmail.com>
Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
2009-01-02 18:12:51 +03:00
ide_floppy_get_sfrp_bit ( drive , pc ) ;
ide_floppy_create_format_unit_cmd ( pc , blocks , length , flags ) ;
2008-10-11 00:39:38 +04:00
ide-floppy: allocate only toplevel packet commands
This makes the top-level function just allocate a single pc entry, and then
pass it down as a pointer to all the helper functions that also need one
of those "struct ide_atapi_pc" things. As far as I can tell, the use of
these things never overlaps each other, BUT I DID NOT CHECK VERY CLOSELY!
So I'm not guaranteeing this is correct, and I don't have the hardware. It
would be good for somebody who knows the code more, and has the hardware,
could please test this?
With this, ide-floppy still has fairly big stack usage, but instead of
idefloppy_ioctl [vmlinux]: 1208
ide_floppy_get_capacity [vmlinux]: 872
idefloppy_release [vmlinux]: 408
idefloppy_open [vmlinux]: 408
where those two first ones are at the very top of the list of stack users
for me, it's now
ide_floppy_get_capacity [vmlinux]: 404
ide_floppy_ioctl [vmlinux]: 364
ie they are still high, but they are no longer at the top.
Borislav: Since ide_floppy_get_capacity is passed as a function pointer to other
parts of the kernel (e.g., block layer) we need that ide_atapi_pc to be created
on stack. Also, redid stack users numbers above. The two functions missing from
Linus' original 'make stackusage' output are due to ide being
rewritten/reorganized atm.
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Borislav Petkov <petkovbb@gmail.com>
Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
2009-01-02 18:12:51 +03:00
if ( ide_queue_pc_tail ( drive , floppy - > disk , pc ) )
2008-10-11 00:39:38 +04:00
err = - EIO ;
out :
if ( err )
2008-10-17 20:09:11 +04:00
drive - > dev_flags & = ~ IDE_DFLAG_FORMAT_IN_PROGRESS ;
2008-10-11 00:39:38 +04:00
return err ;
}
/*
* Get ATAPI_FORMAT_UNIT progress indication .
*
* Userland gives a pointer to an int . The int is set to a progress
* indicator 0 - 65536 , with 65536 = 100 % .
*
* If the drive does not support format progress indication , we just check
* the dsc bit , and return either 0 or 65536.
*/
ide-floppy: allocate only toplevel packet commands
This makes the top-level function just allocate a single pc entry, and then
pass it down as a pointer to all the helper functions that also need one
of those "struct ide_atapi_pc" things. As far as I can tell, the use of
these things never overlaps each other, BUT I DID NOT CHECK VERY CLOSELY!
So I'm not guaranteeing this is correct, and I don't have the hardware. It
would be good for somebody who knows the code more, and has the hardware,
could please test this?
With this, ide-floppy still has fairly big stack usage, but instead of
idefloppy_ioctl [vmlinux]: 1208
ide_floppy_get_capacity [vmlinux]: 872
idefloppy_release [vmlinux]: 408
idefloppy_open [vmlinux]: 408
where those two first ones are at the very top of the list of stack users
for me, it's now
ide_floppy_get_capacity [vmlinux]: 404
ide_floppy_ioctl [vmlinux]: 364
ie they are still high, but they are no longer at the top.
Borislav: Since ide_floppy_get_capacity is passed as a function pointer to other
parts of the kernel (e.g., block layer) we need that ide_atapi_pc to be created
on stack. Also, redid stack users numbers above. The two functions missing from
Linus' original 'make stackusage' output are due to ide being
rewritten/reorganized atm.
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Borislav Petkov <petkovbb@gmail.com>
Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
2009-01-02 18:12:51 +03:00
static int ide_floppy_get_format_progress ( ide_drive_t * drive ,
struct ide_atapi_pc * pc ,
int __user * arg )
2008-10-11 00:39:38 +04:00
{
2008-10-17 20:09:16 +04:00
struct ide_disk_obj * floppy = drive - > driver_data ;
2008-10-11 00:39:38 +04:00
int progress_indication = 0x10000 ;
if ( drive - > atapi_flags & IDE_AFLAG_SRFP ) {
ide-floppy: allocate only toplevel packet commands
This makes the top-level function just allocate a single pc entry, and then
pass it down as a pointer to all the helper functions that also need one
of those "struct ide_atapi_pc" things. As far as I can tell, the use of
these things never overlaps each other, BUT I DID NOT CHECK VERY CLOSELY!
So I'm not guaranteeing this is correct, and I don't have the hardware. It
would be good for somebody who knows the code more, and has the hardware,
could please test this?
With this, ide-floppy still has fairly big stack usage, but instead of
idefloppy_ioctl [vmlinux]: 1208
ide_floppy_get_capacity [vmlinux]: 872
idefloppy_release [vmlinux]: 408
idefloppy_open [vmlinux]: 408
where those two first ones are at the very top of the list of stack users
for me, it's now
ide_floppy_get_capacity [vmlinux]: 404
ide_floppy_ioctl [vmlinux]: 364
ie they are still high, but they are no longer at the top.
Borislav: Since ide_floppy_get_capacity is passed as a function pointer to other
parts of the kernel (e.g., block layer) we need that ide_atapi_pc to be created
on stack. Also, redid stack users numbers above. The two functions missing from
Linus' original 'make stackusage' output are due to ide being
rewritten/reorganized atm.
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Borislav Petkov <petkovbb@gmail.com>
Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
2009-01-02 18:12:51 +03:00
ide_create_request_sense_cmd ( drive , pc ) ;
if ( ide_queue_pc_tail ( drive , floppy - > disk , pc ) )
2008-10-11 00:39:38 +04:00
return - EIO ;
if ( floppy - > sense_key = = 2 & &
floppy - > asc = = 4 & &
floppy - > ascq = = 4 )
progress_indication = floppy - > progress_indication ;
/* Else assume format_unit has finished, and we're at 0x10000 */
} else {
ide_hwif_t * hwif = drive - > hwif ;
unsigned long flags ;
u8 stat ;
local_irq_save ( flags ) ;
stat = hwif - > tp_ops - > read_status ( hwif ) ;
local_irq_restore ( flags ) ;
progress_indication = ( ( stat & ATA_DSC ) = = 0 ) ? 0 : 0x10000 ;
}
if ( put_user ( progress_indication , arg ) )
return - EFAULT ;
return 0 ;
}
2008-10-13 23:39:44 +04:00
static int ide_floppy_lockdoor ( ide_drive_t * drive , struct ide_atapi_pc * pc ,
unsigned long arg , unsigned int cmd )
{
2008-10-17 20:09:16 +04:00
struct ide_disk_obj * floppy = drive - > driver_data ;
2008-10-13 23:39:44 +04:00
struct gendisk * disk = floppy - > disk ;
int prevent = ( arg & & cmd ! = CDROMEJECT ) ? 1 : 0 ;
if ( floppy - > openers > 1 )
return - EBUSY ;
ide_set_media_lock ( drive , disk , prevent ) ;
if ( cmd = = CDROMEJECT )
ide_do_start_stop ( drive , disk , 2 ) ;
return 0 ;
}
ide-floppy: allocate only toplevel packet commands
This makes the top-level function just allocate a single pc entry, and then
pass it down as a pointer to all the helper functions that also need one
of those "struct ide_atapi_pc" things. As far as I can tell, the use of
these things never overlaps each other, BUT I DID NOT CHECK VERY CLOSELY!
So I'm not guaranteeing this is correct, and I don't have the hardware. It
would be good for somebody who knows the code more, and has the hardware,
could please test this?
With this, ide-floppy still has fairly big stack usage, but instead of
idefloppy_ioctl [vmlinux]: 1208
ide_floppy_get_capacity [vmlinux]: 872
idefloppy_release [vmlinux]: 408
idefloppy_open [vmlinux]: 408
where those two first ones are at the very top of the list of stack users
for me, it's now
ide_floppy_get_capacity [vmlinux]: 404
ide_floppy_ioctl [vmlinux]: 364
ie they are still high, but they are no longer at the top.
Borislav: Since ide_floppy_get_capacity is passed as a function pointer to other
parts of the kernel (e.g., block layer) we need that ide_atapi_pc to be created
on stack. Also, redid stack users numbers above. The two functions missing from
Linus' original 'make stackusage' output are due to ide being
rewritten/reorganized atm.
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Borislav Petkov <petkovbb@gmail.com>
Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
2009-01-02 18:12:51 +03:00
static int ide_floppy_format_ioctl ( ide_drive_t * drive , struct ide_atapi_pc * pc ,
fmode_t mode , unsigned int cmd ,
void __user * argp )
2008-10-11 00:39:38 +04:00
{
switch ( cmd ) {
case IDEFLOPPY_IOCTL_FORMAT_SUPPORTED :
return 0 ;
case IDEFLOPPY_IOCTL_FORMAT_GET_CAPACITY :
ide-floppy: allocate only toplevel packet commands
This makes the top-level function just allocate a single pc entry, and then
pass it down as a pointer to all the helper functions that also need one
of those "struct ide_atapi_pc" things. As far as I can tell, the use of
these things never overlaps each other, BUT I DID NOT CHECK VERY CLOSELY!
So I'm not guaranteeing this is correct, and I don't have the hardware. It
would be good for somebody who knows the code more, and has the hardware,
could please test this?
With this, ide-floppy still has fairly big stack usage, but instead of
idefloppy_ioctl [vmlinux]: 1208
ide_floppy_get_capacity [vmlinux]: 872
idefloppy_release [vmlinux]: 408
idefloppy_open [vmlinux]: 408
where those two first ones are at the very top of the list of stack users
for me, it's now
ide_floppy_get_capacity [vmlinux]: 404
ide_floppy_ioctl [vmlinux]: 364
ie they are still high, but they are no longer at the top.
Borislav: Since ide_floppy_get_capacity is passed as a function pointer to other
parts of the kernel (e.g., block layer) we need that ide_atapi_pc to be created
on stack. Also, redid stack users numbers above. The two functions missing from
Linus' original 'make stackusage' output are due to ide being
rewritten/reorganized atm.
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Borislav Petkov <petkovbb@gmail.com>
Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
2009-01-02 18:12:51 +03:00
return ide_floppy_get_format_capacities ( drive , pc , argp ) ;
2008-10-11 00:39:38 +04:00
case IDEFLOPPY_IOCTL_FORMAT_START :
2008-10-16 18:23:20 +04:00
if ( ! ( mode & FMODE_WRITE ) )
2008-10-11 00:39:38 +04:00
return - EPERM ;
ide-floppy: allocate only toplevel packet commands
This makes the top-level function just allocate a single pc entry, and then
pass it down as a pointer to all the helper functions that also need one
of those "struct ide_atapi_pc" things. As far as I can tell, the use of
these things never overlaps each other, BUT I DID NOT CHECK VERY CLOSELY!
So I'm not guaranteeing this is correct, and I don't have the hardware. It
would be good for somebody who knows the code more, and has the hardware,
could please test this?
With this, ide-floppy still has fairly big stack usage, but instead of
idefloppy_ioctl [vmlinux]: 1208
ide_floppy_get_capacity [vmlinux]: 872
idefloppy_release [vmlinux]: 408
idefloppy_open [vmlinux]: 408
where those two first ones are at the very top of the list of stack users
for me, it's now
ide_floppy_get_capacity [vmlinux]: 404
ide_floppy_ioctl [vmlinux]: 364
ie they are still high, but they are no longer at the top.
Borislav: Since ide_floppy_get_capacity is passed as a function pointer to other
parts of the kernel (e.g., block layer) we need that ide_atapi_pc to be created
on stack. Also, redid stack users numbers above. The two functions missing from
Linus' original 'make stackusage' output are due to ide being
rewritten/reorganized atm.
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Borislav Petkov <petkovbb@gmail.com>
Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
2009-01-02 18:12:51 +03:00
return ide_floppy_format_unit ( drive , pc , ( int __user * ) argp ) ;
2008-10-11 00:39:38 +04:00
case IDEFLOPPY_IOCTL_FORMAT_GET_PROGRESS :
ide-floppy: allocate only toplevel packet commands
This makes the top-level function just allocate a single pc entry, and then
pass it down as a pointer to all the helper functions that also need one
of those "struct ide_atapi_pc" things. As far as I can tell, the use of
these things never overlaps each other, BUT I DID NOT CHECK VERY CLOSELY!
So I'm not guaranteeing this is correct, and I don't have the hardware. It
would be good for somebody who knows the code more, and has the hardware,
could please test this?
With this, ide-floppy still has fairly big stack usage, but instead of
idefloppy_ioctl [vmlinux]: 1208
ide_floppy_get_capacity [vmlinux]: 872
idefloppy_release [vmlinux]: 408
idefloppy_open [vmlinux]: 408
where those two first ones are at the very top of the list of stack users
for me, it's now
ide_floppy_get_capacity [vmlinux]: 404
ide_floppy_ioctl [vmlinux]: 364
ie they are still high, but they are no longer at the top.
Borislav: Since ide_floppy_get_capacity is passed as a function pointer to other
parts of the kernel (e.g., block layer) we need that ide_atapi_pc to be created
on stack. Also, redid stack users numbers above. The two functions missing from
Linus' original 'make stackusage' output are due to ide being
rewritten/reorganized atm.
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Borislav Petkov <petkovbb@gmail.com>
Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
2009-01-02 18:12:51 +03:00
return ide_floppy_get_format_progress ( drive , pc , argp ) ;
2008-10-11 00:39:38 +04:00
default :
return - ENOTTY ;
}
}
2008-10-13 23:39:44 +04:00
2008-10-16 18:23:20 +04:00
int ide_floppy_ioctl ( ide_drive_t * drive , struct block_device * bdev ,
fmode_t mode , unsigned int cmd , unsigned long arg )
2008-10-13 23:39:44 +04:00
{
struct ide_atapi_pc pc ;
void __user * argp = ( void __user * ) arg ;
int err ;
if ( cmd = = CDROMEJECT | | cmd = = CDROM_LOCKDOOR )
return ide_floppy_lockdoor ( drive , & pc , arg , cmd ) ;
ide-floppy: allocate only toplevel packet commands
This makes the top-level function just allocate a single pc entry, and then
pass it down as a pointer to all the helper functions that also need one
of those "struct ide_atapi_pc" things. As far as I can tell, the use of
these things never overlaps each other, BUT I DID NOT CHECK VERY CLOSELY!
So I'm not guaranteeing this is correct, and I don't have the hardware. It
would be good for somebody who knows the code more, and has the hardware,
could please test this?
With this, ide-floppy still has fairly big stack usage, but instead of
idefloppy_ioctl [vmlinux]: 1208
ide_floppy_get_capacity [vmlinux]: 872
idefloppy_release [vmlinux]: 408
idefloppy_open [vmlinux]: 408
where those two first ones are at the very top of the list of stack users
for me, it's now
ide_floppy_get_capacity [vmlinux]: 404
ide_floppy_ioctl [vmlinux]: 364
ie they are still high, but they are no longer at the top.
Borislav: Since ide_floppy_get_capacity is passed as a function pointer to other
parts of the kernel (e.g., block layer) we need that ide_atapi_pc to be created
on stack. Also, redid stack users numbers above. The two functions missing from
Linus' original 'make stackusage' output are due to ide being
rewritten/reorganized atm.
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Borislav Petkov <petkovbb@gmail.com>
Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
2009-01-02 18:12:51 +03:00
err = ide_floppy_format_ioctl ( drive , & pc , mode , cmd , argp ) ;
2008-10-13 23:39:44 +04:00
if ( err ! = - ENOTTY )
return err ;
/*
* skip SCSI_IOCTL_SEND_COMMAND ( deprecated )
* and CDROM_SEND_PACKET ( legacy ) ioctls
*/
if ( cmd ! = CDROM_SEND_PACKET & & cmd ! = SCSI_IOCTL_SEND_COMMAND )
2007-08-27 23:38:10 +04:00
err = scsi_cmd_ioctl ( bdev - > bd_disk - > queue , bdev - > bd_disk ,
2008-10-16 18:23:20 +04:00
mode , cmd , argp ) ;
2008-10-13 23:39:44 +04:00
if ( err = = - ENOTTY )
2008-09-03 01:19:43 +04:00
err = generic_ide_ioctl ( drive , bdev , cmd , arg ) ;
2008-10-13 23:39:44 +04:00
return err ;
}