LKML Archive on lore.kernel.org help / color / mirror / Atom feed
From: Borislav Petkov <bbpetkov@yahoo.de> To: <bzolnier@gmail.com> Cc: linux-kernel@vger.kernel.org, linux-ide@vger.kernel.org, Borislav Petkov <bbpetkov@yahoo.de> Subject: [PATCH 4/12] ide-floppy: factor out ioctl handlers from idefloppy_ioctl() Date: Sun, 13 Jan 2008 21:18:17 +0100 [thread overview] Message-ID: <1200255505-31418-5-git-send-email-bbpetkov@yahoo.de> (raw) In-Reply-To: <1200255505-31418-4-git-send-email-bbpetkov@yahoo.de> By passing idefloppy_floppy_t *floppy to the factored out functions, we get rid of (almost) all local vars so stack usage should be at minimum here. Also, we merge idefloppy_begin_format() into idefloppy_format_start() since it is its only user. Also, rename idefloppy_format_start() to idefloppy_format_unit(). Finally, rename the reworked functions to ide_floppy..(). Signed-off-by: Borislav Petkov <bbpetkov@yahoo.de> --- drivers/ide/ide-floppy.c | 153 +++++++++++++++++++++++---------------------- 1 files changed, 78 insertions(+), 75 deletions(-) diff --git a/drivers/ide/ide-floppy.c b/drivers/ide/ide-floppy.c index 276731a..00ea8d6 100644 --- a/drivers/ide/ide-floppy.c +++ b/drivers/ide/ide-floppy.c @@ -1290,44 +1290,6 @@ static int ide_floppy_get_format_capacities(ide_drive_t *drive, int __user *arg) } /* -** 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. -*/ - -static int idefloppy_begin_format(ide_drive_t *drive, int __user *arg) -{ - int blocks; - int length; - int flags; - idefloppy_pc_t pc; - - if (get_user(blocks, arg) || - get_user(length, arg+1) || - get_user(flags, arg+2)) { - return (-EFAULT); - } - - (void) idefloppy_get_sfrp_bit(drive); - idefloppy_create_format_unit_cmd(&pc, blocks, length, flags); - if (idefloppy_queue_pc_tail(drive, &pc)) { - return (-EIO); - } - - return (0); -} - -/* ** Get ATAPI_FORMAT_UNIT progress indication. ** ** Userland gives a pointer to an int. The int is set to a progress @@ -1678,64 +1640,105 @@ static int idefloppy_getgeo(struct block_device *bdev, struct hd_geometry *geo) return 0; } +static int ide_floppy_lockdoor(idefloppy_floppy_t *floppy, idefloppy_pc_t *pc, + unsigned long arg, unsigned int cmd) +{ + if (floppy->openers > 1) + return -EBUSY; + + /* The IOMEGA Clik! Drive doesn't support this command - + * no room for an eject mechanism */ + if (!test_bit(IDEFLOPPY_CLIK_DRIVE, &floppy->flags)) { + int prevent = arg ? 1 : 0; + + if (cmd == CDROMEJECT) + prevent = 0; + + idefloppy_create_prevent_cmd(pc, prevent); + (void) idefloppy_queue_pc_tail(floppy->drive, pc); + } + + if (cmd == CDROMEJECT) { + idefloppy_create_start_stop_cmd(pc, 2); + (void) idefloppy_queue_pc_tail(floppy->drive, pc); + } + + return 0; +} + +static int ide_floppy_format_unit(idefloppy_floppy_t *floppy, + int __user *arg) +{ + int blocks, length, flags, err = 0; + idefloppy_pc_t pc; + + if (floppy->openers > 1) { + /* Don't format if someone is using the disk */ + clear_bit(IDEFLOPPY_FORMAT_IN_PROGRESS, &floppy->flags); + return -EBUSY; + } + + set_bit(IDEFLOPPY_FORMAT_IN_PROGRESS, &floppy->flags); + + /* + * 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; + } + + (void) idefloppy_get_sfrp_bit(floppy->drive); + idefloppy_create_format_unit_cmd(&pc, blocks, length, flags); + + if (idefloppy_queue_pc_tail(floppy->drive, &pc)) + err = -EIO; + +out: + if (err) + clear_bit(IDEFLOPPY_FORMAT_IN_PROGRESS, &floppy->flags); + return err; +} + + static int idefloppy_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg) { struct block_device *bdev = inode->i_bdev; struct ide_floppy_obj *floppy = ide_floppy_g(bdev->bd_disk); ide_drive_t *drive = floppy->drive; + idefloppy_pc_t pc; void __user *argp = (void __user *)arg; int err; - int prevent = (arg) ? 1 : 0; - idefloppy_pc_t pc; switch (cmd) { case CDROMEJECT: - prevent = 0; /* fall through */ case CDROM_LOCKDOOR: - if (floppy->openers > 1) - return -EBUSY; - - /* The IOMEGA Clik! Drive doesn't support this command - no room for an eject mechanism */ - if (!test_bit(IDEFLOPPY_CLIK_DRIVE, &floppy->flags)) { - idefloppy_create_prevent_cmd(&pc, prevent); - (void) idefloppy_queue_pc_tail(drive, &pc); - } - if (cmd == CDROMEJECT) { - idefloppy_create_start_stop_cmd(&pc, 2); - (void) idefloppy_queue_pc_tail(drive, &pc); - } - return 0; + return ide_floppy_lockdoor(floppy, &pc, arg, cmd); case IDEFLOPPY_IOCTL_FORMAT_SUPPORTED: return 0; case IDEFLOPPY_IOCTL_FORMAT_GET_CAPACITY: return ide_floppy_get_format_capacities(drive, argp); case IDEFLOPPY_IOCTL_FORMAT_START: - if (!(file->f_mode & 2)) return -EPERM; - if (floppy->openers > 1) { - /* Don't format if someone is using the disk */ - - clear_bit(IDEFLOPPY_FORMAT_IN_PROGRESS, - &floppy->flags); - return -EBUSY; - } - - set_bit(IDEFLOPPY_FORMAT_IN_PROGRESS, &floppy->flags); - - err = idefloppy_begin_format(drive, argp); - if (err) - clear_bit(IDEFLOPPY_FORMAT_IN_PROGRESS, &floppy->flags); - return err; - /* - ** Note, the bit will be cleared when the device is - ** closed. This is the cleanest way to handle the - ** situation where the drive does not support - ** format progress reporting. - */ + return ide_floppy_format_unit(floppy, (int __user *)arg); case IDEFLOPPY_IOCTL_FORMAT_GET_PROGRESS: return idefloppy_get_format_progress(drive, argp); } -- 1.5.3.7
next prev parent reply other threads:[~2008-01-13 20:23 UTC|newest] Thread overview: 29+ messages / expand[flat|nested] mbox.gz Atom feed top 2008-01-13 20:18 [PATCH 0/12] ide-floppy redux v2.5 Borislav Petkov 2008-01-13 20:18 ` [PATCH 1/12] ide-floppy: remove struct idefloppy_mode_parameter_header Borislav Petkov 2008-01-13 20:18 ` [PATCH 2/12] ide-floppy: remove struct idefloppy_flexible_disk_page Borislav Petkov 2008-01-13 20:18 ` [PATCH 3/12] ide-floppy: remove struct idefloppy_capacity_descriptor Borislav Petkov 2008-01-13 20:18 ` Borislav Petkov [this message] 2008-01-13 20:18 ` [PATCH 5/12] ide-floppy: report DMA handling in idefloppy_pc_intr() properly Borislav Petkov 2008-01-13 20:18 ` [PATCH 6/12] ide-floppy: mv idefloppy_{should_,}report_error Borislav Petkov 2008-01-13 20:18 ` [PATCH 7/12] ide-floppy: remove IDEFLOPPY_DEBUG_BUGS macro Borislav Petkov 2008-01-13 20:18 ` [PATCH 8/12] ide-floppy: merge idefloppy_{input,output}_buffers Borislav Petkov 2008-01-13 20:18 ` [PATCH 9/12] ide-floppy: remove unused IDEFLOPPY_USE_READ12 Borislav Petkov 2008-01-13 20:18 ` [PATCH 10/12] ide-floppy: remove atomic test_*bit macros Borislav Petkov 2008-01-13 20:18 ` [PATCH 11/12] ide-floppy: remove IDEFLOPPY_DEBUG_INFO Borislav Petkov 2008-01-13 20:18 ` [PATCH 12/12] ide-floppy: fix most of the remaining checkpatch.pl issues Borislav Petkov 2008-01-15 20:12 ` (was: Re:...) [PATCH 12/12] ide-floppy: fix most of the remaining checkpatch.pl issues-v2 Borislav Petkov 2008-01-16 22:51 ` Bartlomiej Zolnierkiewicz 2008-01-14 21:51 ` [PATCH 11/12] ide-floppy: remove IDEFLOPPY_DEBUG_INFO Bartlomiej Zolnierkiewicz 2008-01-14 21:50 ` [PATCH 10/12] ide-floppy: remove atomic test_*bit macros Bartlomiej Zolnierkiewicz 2008-01-14 22:32 ` Bartlomiej Zolnierkiewicz 2008-01-15 20:09 ` Borislav Petkov 2008-01-16 22:08 ` Bartlomiej Zolnierkiewicz 2008-01-15 7:07 ` Borislav Petkov 2008-01-15 20:10 ` Borislav Petkov 2008-01-16 22:25 ` Bartlomiej Zolnierkiewicz 2008-01-14 21:38 ` [PATCH 8/12] ide-floppy: merge idefloppy_{input,output}_buffers Bartlomiej Zolnierkiewicz 2008-01-15 7:14 ` Borislav Petkov 2008-01-14 21:38 ` [PATCH 0/12] ide-floppy redux v2.5 Bartlomiej Zolnierkiewicz 2008-01-20 12:38 ` Borislav Petkov 2008-01-21 22:45 ` Bartlomiej Zolnierkiewicz 2008-01-22 5:32 ` Borislav Petkov
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=1200255505-31418-5-git-send-email-bbpetkov@yahoo.de \ --to=bbpetkov@yahoo.de \ --cc=bzolnier@gmail.com \ --cc=linux-ide@vger.kernel.org \ --cc=linux-kernel@vger.kernel.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).