Patchwork [3/6] ide: always kill the whole request on error

login
register
mail settings
Submitter Bartlomiej Zolnierkiewicz
Date June 23, 2009, 9:27 p.m.
Message ID <200906232327.27610.bzolnier@gmail.com>
Download mbox | patch
Permalink /patch/29093/
State Accepted
Delegated to: David Miller
Headers show

Comments

Bartlomiej Zolnierkiewicz - June 23, 2009, 9:27 p.m.
From: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
Subject: [PATCH] ide: always kill the whole request on error

* Use blk_rq_bytes() instead of obsolete ide_rq_bytes() in ide_kill_rq()
  and ide_floppy_do_request() for failed requests.
  [ bugfix part ]

* Use blk_rq_bytes() instead of obsolete ide_rq_bytes() in ide_do_devset()
  and ide_complete_drive_reset().  Then remove ide_rq_bytes().
  [ cleanup part ]

Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
---
'cleanup part' tested, limited testing with 'bugfix part'
(using simulated failures of disk fs requests)

 drivers/ide/ide-devsets.c |    2 +-
 drivers/ide/ide-eh.c      |    2 +-
 drivers/ide/ide-floppy.c  |    2 +-
 drivers/ide/ide-io.c      |   14 ++------------
 include/linux/ide.h       |    1 -
 5 files changed, 5 insertions(+), 16 deletions(-)

--
To unsubscribe from this list: send the line "unsubscribe linux-ide" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
David Miller - June 23, 2009, 11:19 p.m.
From: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
Date: Tue, 23 Jun 2009 23:27:27 +0200

> From: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
> Subject: [PATCH] ide: always kill the whole request on error
> 
> * Use blk_rq_bytes() instead of obsolete ide_rq_bytes() in ide_kill_rq()
>   and ide_floppy_do_request() for failed requests.
>   [ bugfix part ]
> 
> * Use blk_rq_bytes() instead of obsolete ide_rq_bytes() in ide_do_devset()
>   and ide_complete_drive_reset().  Then remove ide_rq_bytes().
>   [ cleanup part ]
> 
> Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
> ---
> 'cleanup part' tested, limited testing with 'bugfix part'
> (using simulated failures of disk fs requests)

Considering this alongsize patch #2, it even more begs the
question as to why special requests on floppy and tape were
handled differently.  And that 'error <= 0' test, strange.

I have a hard time believing all of these differences are there for no
reason at all. :-)

>  drivers/ide/ide-devsets.c |    2 +-
>  drivers/ide/ide-eh.c      |    2 +-
>  drivers/ide/ide-floppy.c  |    2 +-
>  drivers/ide/ide-io.c      |   14 ++------------
>  include/linux/ide.h       |    1 -
>  5 files changed, 5 insertions(+), 16 deletions(-)
> 
> Index: b/drivers/ide/ide-devsets.c
> ===================================================================
> --- a/drivers/ide/ide-devsets.c
> +++ b/drivers/ide/ide-devsets.c
> @@ -183,6 +183,6 @@ ide_startstop_t ide_do_devset(ide_drive_
>  	err = setfunc(drive, *(int *)&rq->cmd[1]);
>  	if (err)
>  		rq->errors = err;
> -	ide_complete_rq(drive, err, ide_rq_bytes(rq));
> +	ide_complete_rq(drive, err, blk_rq_bytes(rq));
>  	return ide_stopped;
>  }
> Index: b/drivers/ide/ide-eh.c
> ===================================================================
> --- a/drivers/ide/ide-eh.c
> +++ b/drivers/ide/ide-eh.c
> @@ -149,7 +149,7 @@ static inline void ide_complete_drive_re
>  	if (rq && blk_special_request(rq) && rq->cmd[0] == REQ_DRIVE_RESET) {
>  		if (err <= 0 && rq->errors == 0)
>  			rq->errors = -EIO;
> -		ide_complete_rq(drive, err ? err : 0, ide_rq_bytes(rq));
> +		ide_complete_rq(drive, err ? err : 0, blk_rq_bytes(rq));
>  	}
>  }
>  
> Index: b/drivers/ide/ide-floppy.c
> ===================================================================
> --- a/drivers/ide/ide-floppy.c
> +++ b/drivers/ide/ide-floppy.c
> @@ -293,7 +293,7 @@ out_end:
>  	drive->failed_pc = NULL;
>  	if (blk_fs_request(rq) == 0 && rq->errors == 0)
>  		rq->errors = -EIO;
> -	ide_complete_rq(drive, -EIO, ide_rq_bytes(rq));
> +	ide_complete_rq(drive, -EIO, blk_rq_bytes(rq));
>  	return ide_stopped;
>  }
>  
> Index: b/drivers/ide/ide-io.c
> ===================================================================
> --- a/drivers/ide/ide-io.c
> +++ b/drivers/ide/ide-io.c
> @@ -112,16 +112,6 @@ void ide_complete_cmd(ide_drive_t *drive
>  	}
>  }
>  
> -/* obsolete, blk_rq_bytes() should be used instead */
> -unsigned int ide_rq_bytes(struct request *rq)
> -{
> -	if (blk_pc_request(rq))
> -		return blk_rq_bytes(rq);
> -	else
> -		return blk_rq_cur_sectors(rq) << 9;
> -}
> -EXPORT_SYMBOL_GPL(ide_rq_bytes);
> -
>  int ide_complete_rq(ide_drive_t *drive, int error, unsigned int nr_bytes)
>  {
>  	ide_hwif_t *hwif = drive->hwif;
> @@ -152,14 +142,14 @@ void ide_kill_rq(ide_drive_t *drive, str
>  
>  	if ((media == ide_floppy || media == ide_tape) && drv_req) {
>  		rq->errors = 0;
> -		ide_complete_rq(drive, -EIO, blk_rq_bytes(rq));
>  	} else {
>  		if (media == ide_tape)
>  			rq->errors = IDE_DRV_ERROR_GENERAL;
>  		else if (blk_fs_request(rq) == 0 && rq->errors == 0)
>  			rq->errors = -EIO;
> -		ide_complete_rq(drive, -EIO, ide_rq_bytes(rq));
>  	}
> +
> +	ide_complete_rq(drive, -EIO, blk_rq_bytes(rq));
>  }
>  
>  static void ide_tf_set_specify_cmd(ide_drive_t *drive, struct ide_taskfile *tf)
> Index: b/include/linux/ide.h
> ===================================================================
> --- a/include/linux/ide.h
> +++ b/include/linux/ide.h
> @@ -1062,7 +1062,6 @@ int generic_ide_ioctl(ide_drive_t *, str
>  extern int ide_vlb_clk;
>  extern int ide_pci_clk;
>  
> -unsigned int ide_rq_bytes(struct request *);
>  int ide_end_rq(ide_drive_t *, struct request *, int, unsigned int);
>  void ide_kill_rq(ide_drive_t *, struct request *);
>  
--
To unsubscribe from this list: send the line "unsubscribe linux-ide" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Joe Perches - June 23, 2009, 11:37 p.m.
On Tue, 2009-06-23 at 16:19 -0700, David Miller wrote:
> From: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
> Date: Tue, 23 Jun 2009 23:27:27 +0200
> > From: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
> > Subject: [PATCH] ide: always kill the whole request on error
> > --- a/drivers/ide/ide-eh.c
> > +++ b/drivers/ide/ide-eh.c
> > @@ -149,7 +149,7 @@ static inline void ide_complete_drive_re
> >  	if (rq && blk_special_request(rq) && rq->cmd[0] == REQ_DRIVE_RESET) {
> >  		if (err <= 0 && rq->errors == 0)
> >  			rq->errors = -EIO;
> > -		ide_complete_rq(drive, err ? err : 0, ide_rq_bytes(rq));
> > +		ide_complete_rq(drive, err ? err : 0, blk_rq_bytes(rq));

Doesn't that "err ? err : 0" look odd?
Why not just err?


--
To unsubscribe from this list: send the line "unsubscribe linux-ide" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
David Miller - June 23, 2009, 11:39 p.m.
From: Joe Perches <joe@perches.com>
Date: Tue, 23 Jun 2009 16:37:54 -0700

> On Tue, 2009-06-23 at 16:19 -0700, David Miller wrote:
>> From: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
>> Date: Tue, 23 Jun 2009 23:27:27 +0200
>> > From: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
>> > Subject: [PATCH] ide: always kill the whole request on error
>> > --- a/drivers/ide/ide-eh.c
>> > +++ b/drivers/ide/ide-eh.c
>> > @@ -149,7 +149,7 @@ static inline void ide_complete_drive_re
>> >  	if (rq && blk_special_request(rq) && rq->cmd[0] == REQ_DRIVE_RESET) {
>> >  		if (err <= 0 && rq->errors == 0)
>> >  			rq->errors = -EIO;
>> > -		ide_complete_rq(drive, err ? err : 0, ide_rq_bytes(rq));
>> > +		ide_complete_rq(drive, err ? err : 0, blk_rq_bytes(rq));
> 
> Doesn't that "err ? err : 0" look odd?
> Why not just err?

These functions are full of surprises :-)

Yes, plain 'err' should be absolutely equivalent to what's
there right now.
--
To unsubscribe from this list: send the line "unsubscribe linux-ide" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Bartlomiej Zolnierkiewicz - June 24, 2009, 12:49 a.m.
On Wednesday 24 June 2009 01:19:04 David Miller wrote:
> From: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
> Date: Tue, 23 Jun 2009 23:27:27 +0200
> 
> > From: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
> > Subject: [PATCH] ide: always kill the whole request on error
> > 
> > * Use blk_rq_bytes() instead of obsolete ide_rq_bytes() in ide_kill_rq()
> >   and ide_floppy_do_request() for failed requests.
> >   [ bugfix part ]
> > 
> > * Use blk_rq_bytes() instead of obsolete ide_rq_bytes() in ide_do_devset()
> >   and ide_complete_drive_reset().  Then remove ide_rq_bytes().
> >   [ cleanup part ]
> > 
> > Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
> > ---
> > 'cleanup part' tested, limited testing with 'bugfix part'
> > (using simulated failures of disk fs requests)
> 
> Considering this alongsize patch #2, it even more begs the
> question as to why special requests on floppy and tape were
> handled differently.  And that 'error <= 0' test, strange.

TBH I fail to see how it relates to changes present in _this_ patch
as no change in _this_ patch affects special tape/floppy requests..

> I have a hard time believing all of these differences are there for no
> reason at all. :-)

Lets keep personal believes aside in the technical discussions. ;)

> >  drivers/ide/ide-devsets.c |    2 +-
> >  drivers/ide/ide-eh.c      |    2 +-
> >  drivers/ide/ide-floppy.c  |    2 +-
> >  drivers/ide/ide-io.c      |   14 ++------------
> >  include/linux/ide.h       |    1 -
> >  5 files changed, 5 insertions(+), 16 deletions(-)
> > 
> > Index: b/drivers/ide/ide-devsets.c
> > ===================================================================
> > --- a/drivers/ide/ide-devsets.c
> > +++ b/drivers/ide/ide-devsets.c
> > @@ -183,6 +183,6 @@ ide_startstop_t ide_do_devset(ide_drive_
> >  	err = setfunc(drive, *(int *)&rq->cmd[1]);
> >  	if (err)
> >  		rq->errors = err;
> > -	ide_complete_rq(drive, err, ide_rq_bytes(rq));
> > +	ide_complete_rq(drive, err, blk_rq_bytes(rq));
> >  	return ide_stopped;
> >  }
> > Index: b/drivers/ide/ide-eh.c
> > ===================================================================
> > --- a/drivers/ide/ide-eh.c
> > +++ b/drivers/ide/ide-eh.c
> > @@ -149,7 +149,7 @@ static inline void ide_complete_drive_re
> >  	if (rq && blk_special_request(rq) && rq->cmd[0] == REQ_DRIVE_RESET) {
> >  		if (err <= 0 && rq->errors == 0)
> >  			rq->errors = -EIO;
> > -		ide_complete_rq(drive, err ? err : 0, ide_rq_bytes(rq));
> > +		ide_complete_rq(drive, err ? err : 0, blk_rq_bytes(rq));
> >  	}
> >  }
> >  
> > Index: b/drivers/ide/ide-floppy.c
> > ===================================================================
> > --- a/drivers/ide/ide-floppy.c
> > +++ b/drivers/ide/ide-floppy.c
> > @@ -293,7 +293,7 @@ out_end:
> >  	drive->failed_pc = NULL;
> >  	if (blk_fs_request(rq) == 0 && rq->errors == 0)
> >  		rq->errors = -EIO;
> > -	ide_complete_rq(drive, -EIO, ide_rq_bytes(rq));
> > +	ide_complete_rq(drive, -EIO, blk_rq_bytes(rq));
> >  	return ide_stopped;
> >  }
> >  
> > Index: b/drivers/ide/ide-io.c
> > ===================================================================
> > --- a/drivers/ide/ide-io.c
> > +++ b/drivers/ide/ide-io.c
> > @@ -112,16 +112,6 @@ void ide_complete_cmd(ide_drive_t *drive
> >  	}
> >  }
> >  
> > -/* obsolete, blk_rq_bytes() should be used instead */
> > -unsigned int ide_rq_bytes(struct request *rq)
> > -{
> > -	if (blk_pc_request(rq))
> > -		return blk_rq_bytes(rq);
> > -	else
> > -		return blk_rq_cur_sectors(rq) << 9;
> > -}
> > -EXPORT_SYMBOL_GPL(ide_rq_bytes);
> > -
> >  int ide_complete_rq(ide_drive_t *drive, int error, unsigned int nr_bytes)
> >  {
> >  	ide_hwif_t *hwif = drive->hwif;
> > @@ -152,14 +142,14 @@ void ide_kill_rq(ide_drive_t *drive, str
> >  
> >  	if ((media == ide_floppy || media == ide_tape) && drv_req) {
> >  		rq->errors = 0;
> > -		ide_complete_rq(drive, -EIO, blk_rq_bytes(rq));
> >  	} else {
> >  		if (media == ide_tape)
> >  			rq->errors = IDE_DRV_ERROR_GENERAL;
> >  		else if (blk_fs_request(rq) == 0 && rq->errors == 0)
> >  			rq->errors = -EIO;
> > -		ide_complete_rq(drive, -EIO, ide_rq_bytes(rq));
> >  	}
> > +
> > +	ide_complete_rq(drive, -EIO, blk_rq_bytes(rq));
> >  }
> >  
> >  static void ide_tf_set_specify_cmd(ide_drive_t *drive, struct ide_taskfile *tf)
> > Index: b/include/linux/ide.h
> > ===================================================================
> > --- a/include/linux/ide.h
> > +++ b/include/linux/ide.h
> > @@ -1062,7 +1062,6 @@ int generic_ide_ioctl(ide_drive_t *, str
> >  extern int ide_vlb_clk;
> >  extern int ide_pci_clk;
> >  
> > -unsigned int ide_rq_bytes(struct request *);
> >  int ide_end_rq(ide_drive_t *, struct request *, int, unsigned int);
> >  void ide_kill_rq(ide_drive_t *, struct request *);
--
To unsubscribe from this list: send the line "unsubscribe linux-ide" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
David Miller - June 24, 2009, 4:37 a.m.
From: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
Date: Wed, 24 Jun 2009 02:49:32 +0200

> On Wednesday 24 June 2009 01:19:04 David Miller wrote:
>> I have a hard time believing all of these differences are there for no
>> reason at all. :-)
> 
> Lets keep personal believes aside in the technical discussions. ;)

Sure, but every time I've ignored such possibility I've regretted
it after a long debugging session later, that's all :-)
--
To unsubscribe from this list: send the line "unsubscribe linux-ide" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
David Miller - June 24, 2009, 6:49 a.m.
From: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
Date: Wed, 24 Jun 2009 02:49:32 +0200

> On Wednesday 24 June 2009 01:19:04 David Miller wrote:
>> From: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
>> Date: Tue, 23 Jun 2009 23:27:27 +0200
>> 
>> > From: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
>> > Subject: [PATCH] ide: always kill the whole request on error
>> > 
>> > * Use blk_rq_bytes() instead of obsolete ide_rq_bytes() in ide_kill_rq()
>> >   and ide_floppy_do_request() for failed requests.
>> >   [ bugfix part ]
>> > 
>> > * Use blk_rq_bytes() instead of obsolete ide_rq_bytes() in ide_do_devset()
>> >   and ide_complete_drive_reset().  Then remove ide_rq_bytes().
>> >   [ cleanup part ]
>> > 
>> > Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
>> > ---
>> > 'cleanup part' tested, limited testing with 'bugfix part'
>> > (using simulated failures of disk fs requests)
>> 
>> Considering this alongsize patch #2, it even more begs the
>> question as to why special requests on floppy and tape were
>> handled differently.  And that 'error <= 0' test, strange.
> 
> TBH I fail to see how it relates to changes present in _this_ patch
> as no change in _this_ patch affects special tape/floppy requests..

The previous patch is a prerequesite for this one.  So we should
discuss them as a whole.  Because if we can't remove the "ide/floppy
RQ error 0 instead of -EIO" bit, then we don't make these further
consolidations either.
--
To unsubscribe from this list: send the line "unsubscribe linux-ide" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Bartlomiej Zolnierkiewicz - June 24, 2009, 9:38 a.m.
On Wednesday 24 June 2009 08:49:48 David Miller wrote:
> From: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
> Date: Wed, 24 Jun 2009 02:49:32 +0200
> 
> > On Wednesday 24 June 2009 01:19:04 David Miller wrote:
> >> From: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
> >> Date: Tue, 23 Jun 2009 23:27:27 +0200
> >> 
> >> > From: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
> >> > Subject: [PATCH] ide: always kill the whole request on error
> >> > 
> >> > * Use blk_rq_bytes() instead of obsolete ide_rq_bytes() in ide_kill_rq()
> >> >   and ide_floppy_do_request() for failed requests.
> >> >   [ bugfix part ]
> >> > 
> >> > * Use blk_rq_bytes() instead of obsolete ide_rq_bytes() in ide_do_devset()
> >> >   and ide_complete_drive_reset().  Then remove ide_rq_bytes().
> >> >   [ cleanup part ]
> >> > 
> >> > Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
> >> > ---
> >> > 'cleanup part' tested, limited testing with 'bugfix part'
> >> > (using simulated failures of disk fs requests)
> >> 
> >> Considering this alongsize patch #2, it even more begs the
> >> question as to why special requests on floppy and tape were
> >> handled differently.  And that 'error <= 0' test, strange.
> > 
> > TBH I fail to see how it relates to changes present in _this_ patch
> > as no change in _this_ patch affects special tape/floppy requests..
> 
> The previous patch is a prerequesite for this one.  So we should
> discuss them as a whole.  Because if we can't remove the "ide/floppy
> RQ error 0 instead of -EIO" bit, then we don't make these further
> consolidations either.

Untrue, we can easily redo the patch #3 to not be dependent on patch #2.

Do you prefer such version instead?
--
To unsubscribe from this list: send the line "unsubscribe linux-ide" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
David Miller - June 24, 2009, 9:56 a.m.
From: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
Date: Wed, 24 Jun 2009 11:38:00 +0200

> On Wednesday 24 June 2009 08:49:48 David Miller wrote:
>> From: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
>> Date: Wed, 24 Jun 2009 02:49:32 +0200
>> 
>> The previous patch is a prerequesite for this one.  So we should
>> discuss them as a whole.  Because if we can't remove the "ide/floppy
>> RQ error 0 instead of -EIO" bit, then we don't make these further
>> consolidations either.
> 
> Untrue, we can easily redo the patch #3 to not be dependent on patch #2.

Good point.

> Do you prefer such version instead?

Let's wait until we come to some conclusion about patch #2.
--
To unsubscribe from this list: send the line "unsubscribe linux-ide" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Patch

Index: b/drivers/ide/ide-devsets.c
===================================================================
--- a/drivers/ide/ide-devsets.c
+++ b/drivers/ide/ide-devsets.c
@@ -183,6 +183,6 @@  ide_startstop_t ide_do_devset(ide_drive_
 	err = setfunc(drive, *(int *)&rq->cmd[1]);
 	if (err)
 		rq->errors = err;
-	ide_complete_rq(drive, err, ide_rq_bytes(rq));
+	ide_complete_rq(drive, err, blk_rq_bytes(rq));
 	return ide_stopped;
 }
Index: b/drivers/ide/ide-eh.c
===================================================================
--- a/drivers/ide/ide-eh.c
+++ b/drivers/ide/ide-eh.c
@@ -149,7 +149,7 @@  static inline void ide_complete_drive_re
 	if (rq && blk_special_request(rq) && rq->cmd[0] == REQ_DRIVE_RESET) {
 		if (err <= 0 && rq->errors == 0)
 			rq->errors = -EIO;
-		ide_complete_rq(drive, err ? err : 0, ide_rq_bytes(rq));
+		ide_complete_rq(drive, err ? err : 0, blk_rq_bytes(rq));
 	}
 }
 
Index: b/drivers/ide/ide-floppy.c
===================================================================
--- a/drivers/ide/ide-floppy.c
+++ b/drivers/ide/ide-floppy.c
@@ -293,7 +293,7 @@  out_end:
 	drive->failed_pc = NULL;
 	if (blk_fs_request(rq) == 0 && rq->errors == 0)
 		rq->errors = -EIO;
-	ide_complete_rq(drive, -EIO, ide_rq_bytes(rq));
+	ide_complete_rq(drive, -EIO, blk_rq_bytes(rq));
 	return ide_stopped;
 }
 
Index: b/drivers/ide/ide-io.c
===================================================================
--- a/drivers/ide/ide-io.c
+++ b/drivers/ide/ide-io.c
@@ -112,16 +112,6 @@  void ide_complete_cmd(ide_drive_t *drive
 	}
 }
 
-/* obsolete, blk_rq_bytes() should be used instead */
-unsigned int ide_rq_bytes(struct request *rq)
-{
-	if (blk_pc_request(rq))
-		return blk_rq_bytes(rq);
-	else
-		return blk_rq_cur_sectors(rq) << 9;
-}
-EXPORT_SYMBOL_GPL(ide_rq_bytes);
-
 int ide_complete_rq(ide_drive_t *drive, int error, unsigned int nr_bytes)
 {
 	ide_hwif_t *hwif = drive->hwif;
@@ -152,14 +142,14 @@  void ide_kill_rq(ide_drive_t *drive, str
 
 	if ((media == ide_floppy || media == ide_tape) && drv_req) {
 		rq->errors = 0;
-		ide_complete_rq(drive, -EIO, blk_rq_bytes(rq));
 	} else {
 		if (media == ide_tape)
 			rq->errors = IDE_DRV_ERROR_GENERAL;
 		else if (blk_fs_request(rq) == 0 && rq->errors == 0)
 			rq->errors = -EIO;
-		ide_complete_rq(drive, -EIO, ide_rq_bytes(rq));
 	}
+
+	ide_complete_rq(drive, -EIO, blk_rq_bytes(rq));
 }
 
 static void ide_tf_set_specify_cmd(ide_drive_t *drive, struct ide_taskfile *tf)
Index: b/include/linux/ide.h
===================================================================
--- a/include/linux/ide.h
+++ b/include/linux/ide.h
@@ -1062,7 +1062,6 @@  int generic_ide_ioctl(ide_drive_t *, str
 extern int ide_vlb_clk;
 extern int ide_pci_clk;
 
-unsigned int ide_rq_bytes(struct request *);
 int ide_end_rq(ide_drive_t *, struct request *, int, unsigned int);
 void ide_kill_rq(ide_drive_t *, struct request *);