linux-ide.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
To: Elias Oltmanns <eo@nebensachen.de>
Cc: linux-ide@vger.kernel.org
Subject: Re: [PATCH] IDE: Fix HDIO_DRIVE_RESET handling
Date: Thu, 19 Jun 2008 22:47:24 +0200	[thread overview]
Message-ID: <200806192247.25063.bzolnier@gmail.com> (raw)
In-Reply-To: <87k5gmz596.fsf@denkblock.local>


Hi,

On Thursday 19 June 2008, Elias Oltmanns wrote:
> Hi Bart,
> 
> currently, the code path executing an HDIO_DRIVE_RESET ioctl is broken
> in various ways.  Firstly, ide_abort() is called with the ide_lock held
> and may call ide_end_request() further down the line which will try to
> grab the same lock again.  More importantly though, the whole concept of
> aborting an inflight request is flawed -- at least as far as ide_abort()
> is concerned.
> 
> The patch below tries to address these issues by handling the
> HDIO_DRIVE_RESET ioctl in-band.  I wonder whether this approach is
> acceptable and may be extended to other applications like a modified

This approach is exactly the way it should have been done. :)

> version of the disk shock protection patches.  Also, I abstained from
> using op codes 0x0 to 0x1f since at least part of this range is used by
> 
> ULDs like ide-floppy, ide-tape, etc.  On the other hand, there really
> should be no conflict because those ULDs will always set ->rq_disk thus
> preventing ide_special_rq() from snatching away what should be passed on
> to ->do_request().  So, what's you're advice on this one?  Finally,

The solution present in the patch is OK for now (+ it doesn't interfere
with some other work being done in ULDs by Borislav) but needs documenting.

> shouldn't op codes like REQ_DRIVE_RESET really be declared in a private
> header file in drivers/ide/?

I think that for such defines <linux/ide.h> is appropriate for now.

[ OTOH it sounds like a good idea in the longer term to move some
  things from <linux/ide.h> to drivers/ide/ide.h ]

One more thing, ide-2.6 is for syncing with Linus _only_ (it seems I'm to
blame for the confusion), please rebase your work on top of pata-2.6 quilt
tree (some comments which should ease the transition below):

	http://kernel.org/pub/linux/kernel/people/bart/pata-2.6/

[ This tree is pulled into linux-next so you may prefer to just use the
  latest -next snapshost instead. ]

[...]

> @@ -891,7 +904,8 @@ static ide_startstop_t start_request (ide_drive_t *drive, struct request *rq)
>  			    pm->pm_step == ide_pm_state_completed)
>  				ide_complete_pm_request(drive, rq);
>  			return startstop;
> -		}
> +		} else if (!rq->rq_disk && blk_special_request(rq))

Please document with "TODO:" why we need this rq->rq_disk check here
(as ULDs should later be fixed to only check for specific rq->cmd[0]
values of blk_special_request() requests).

> +			return ide_special_rq(drive, rq);
>  
>  		drv = *(ide_driver_t **)rq->rq_disk->private_data;
>  		return drv->do_request(drive, rq, block);
> diff --git a/drivers/ide/ide.c b/drivers/ide/ide.c
> index c758dcb..4f9c796 100644
> --- a/drivers/ide/ide.c
> +++ b/drivers/ide/ide.c
> @@ -623,6 +623,19 @@ static int generic_ide_resume(struct device *dev)
>  	return err;
>  }
>  
> +static void generic_drive_reset(ide_drive_t *drive)
> +{
> +	struct request *rq;
> +
> +	rq = blk_get_request(drive->queue, 0, __GFP_WAIT);
> +	/* Should we call ide_init_drive_cmd() here? */

blk_get_request() is sufficient (ide_init_drive_cmd() is gone now)

> +	rq->cmd[0] = REQ_DRIVE_RESET;
> +	rq->cmd_type = REQ_TYPE_SPECIAL;
> +	rq->cmd_flags |= REQ_SOFTBARRIER;
> +	ide_do_drive_cmd(drive, rq, ide_end);

ide_do_drive_cmd() now handles only ide_preempt + it seems that previously
the ioctl would wait till the reset is complete so probably this needs to
use blk_execute_rq() instead

[...]

Oh, and now that you've fixed HDIO_DRIVE_RESET you get the following bonus:
ide_abort(), __ide_abort() and ide_driver_t.abort all can be removed in the
incremental patch! ;)

Thanks,
Bart

  parent reply	other threads:[~2008-06-19 20:46 UTC|newest]

Thread overview: 30+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-06-18 23:35 [PATCH] IDE: Fix HDIO_DRIVE_RESET handling Elias Oltmanns
2008-06-18 23:41 ` Elias Oltmanns
2008-06-19 20:47 ` Bartlomiej Zolnierkiewicz [this message]
2008-06-22 23:23   ` Elias Oltmanns
2008-06-22 23:28     ` Elias Oltmanns
2008-06-23  7:47       ` Elias Oltmanns
2008-06-23 22:47         ` Bartlomiej Zolnierkiewicz
2008-06-23  9:16       ` Alan Cox
2008-06-24  7:02         ` Elias Oltmanns
2008-06-24  9:10           ` Alan Cox
2008-06-23 22:41       ` Bartlomiej Zolnierkiewicz
2008-06-24  7:12         ` Elias Oltmanns
2008-06-22 23:32     ` [PATCH 2/4] IDE: Remove unused code Elias Oltmanns
2008-06-22 23:35     ` [PATCH 3/4] Update documentation of HDIO_DRIVE_RESET ioctl Elias Oltmanns
2008-06-22 23:38     ` [PATCH 4/4] IDE: Report errors during drive reset back to user space Elias Oltmanns
2008-06-23  9:18     ` [PATCH] IDE: Fix HDIO_DRIVE_RESET handling Alan Cox
2008-06-23 22:41     ` Bartlomiej Zolnierkiewicz
2008-06-24  7:23       ` Elias Oltmanns
2008-06-24 11:06         ` Bartlomiej Zolnierkiewicz
2008-06-24 12:32           ` Alan Cox
2008-06-24 13:21             ` Bartlomiej Zolnierkiewicz
2008-06-24 13:35               ` Alan Cox
2008-06-24 14:19                 ` Bartlomiej Zolnierkiewicz
2008-06-24 14:33                   ` Bartlomiej Zolnierkiewicz
2008-06-25 11:23                   ` Elias Oltmanns
2008-06-25 11:27                     ` [PATCH 1/4 v2] " Elias Oltmanns
2008-06-25 11:28                     ` [PATCH 2/4 v2] IDE: Remove unused code Elias Oltmanns
2008-06-25 11:29                     ` [PATCH 3/4 v2] Update documentation of HDIO_DRIVE_RESET ioctl Elias Oltmanns
2008-06-25 11:30                     ` [PATCH 4/4 v2] IDE: Report errors during drive reset back to user space Elias Oltmanns
2008-06-25 20:24                     ` [PATCH] IDE: Fix HDIO_DRIVE_RESET handling Bartlomiej Zolnierkiewicz

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=200806192247.25063.bzolnier@gmail.com \
    --to=bzolnier@gmail.com \
    --cc=eo@nebensachen.de \
    --cc=linux-ide@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: link
Be 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).