Skip to contentSkip to conversation

ide: always kill the whole request on error

PATCH In review Bartlomiej Zolnierkiewicz 3 participants 9 messages Jun 23, 2009 – Jun 24, 2009 libata

lore
Share & tools
lore
#0 lore raw

PATCH 3/6 ide: always kill the whole request on error

From: Bartlomiej Zolnierkiewicz <[email protected]>
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 ]

---
'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(-)
drivers/ide/ide-devsets.c +1 -1
Index: 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;
 }
drivers/ide/ide-eh.c +1 -1
Index: 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));
 	}
 }
 
drivers/ide/ide-floppy.c +1 -1
Index: 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;
 }
 
drivers/ide/ide-io.c +2 -12
Index: 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)
include/linux/ide.h +0 -1
Index: 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 *);
 
#1 lore raw

From: Bartlomiej Zolnierkiewicz <[email protected]>
Date: Tue, 23 Jun 2009 23:27:27 +0200

Quoted 7 lines

From: Bartlomiej Zolnierkiewicz <[email protected]>
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 ]

Quoted 8 lines

* 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 ]

---
'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. :-)

Quoted 95 lines
 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
===================================================================

drivers/ide/ide-devsets.c +1 -1
@@ -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
===================================================================

drivers/ide/ide-eh.c +1 -1
@@ -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
===================================================================

drivers/ide/ide-floppy.c +1 -1
@@ -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
===================================================================

drivers/ide/ide-io.c +2 -12
@@ -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
===================================================================

include/linux/ide.h +0 -1
@@ -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 *);
 
#2 lore raw
Quoted 12 lines · David Miller

From: Bartlomiej Zolnierkiewicz <[email protected]>
Date: Tue, 23 Jun 2009 23:27:27 +0200

drivers/ide/ide-eh.c static inline void ide_complete_drive_re · line 152

Quoted 10 lines

From: Bartlomiej Zolnierkiewicz <[email protected]>
Subject: [PATCH] ide: always kill the whole request on error

drivers/ide/ide-eh.c +1 -1
@@ -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?

#3 lore raw

From: Joe Perches <[email protected]>
Date: Tue, 23 Jun 2009 16:37:54 -0700

Quoted 16 lines · David Miller
Quoted 12 lines

From: Bartlomiej Zolnierkiewicz <[email protected]>
Date: Tue, 23 Jun 2009 23:27:27 +0200

drivers/ide/ide-eh.c static inline void ide_complete_drive_re · line 152

Quoted 10 lines

From: Bartlomiej Zolnierkiewicz <[email protected]>
Subject: [PATCH] ide: always kill the whole request on error

drivers/ide/ide-eh.c +1 -1
@@ -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.

#4 lore raw
In reply to David Miller
Quoted 14 lines · On Wednesday 24 June 2009 01:19:04 David Miller wrote:

From: Bartlomiej Zolnierkiewicz <[email protected]>
Date: Tue, 23 Jun 2009 23:27:27 +0200

Quoted 11 lines

From: Bartlomiej Zolnierkiewicz <[email protected]>
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 ]

Quoted 8 lines
Quoted 4 lines

---
'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..

Quoted 2 lines

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. ;)

Quoted 94 lines
Quoted 94 lines
 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
===================================================================

drivers/ide/ide-devsets.c +1 -1
@@ -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
===================================================================

drivers/ide/ide-eh.c +1 -1
@@ -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
===================================================================

drivers/ide/ide-floppy.c +1 -1
@@ -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
===================================================================

drivers/ide/ide-io.c +2 -12
@@ -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
===================================================================

include/linux/ide.h +0 -1
@@ -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 *);
#5 lore raw

From: Bartlomiej Zolnierkiewicz <[email protected]>
Date: Wed, 24 Jun 2009 02:49:32 +0200

Quoted 5 lines · On Wednesday 24 June 2009 01:19:04 David Miller wrote:
Quoted 2 lines

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 :-)

#6 lore raw
In reply to Bartlomiej Zolnierkiewicz

From: Bartlomiej Zolnierkiewicz <[email protected]>
Date: Wed, 24 Jun 2009 02:49:32 +0200

Quoted 20 lines · On Wednesday 24 June 2009 01:19:04 David Miller wrote:
Quoted 19 lines

From: Bartlomiej Zolnierkiewicz <[email protected]>
Date: Tue, 23 Jun 2009 23:27:27 +0200

Quoted 15 lines

From: Bartlomiej Zolnierkiewicz <[email protected]>
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 ]

---
'cleanup part' tested, limited testing with 'bugfix part' (using simulated failures of disk fs requests)

Quoted 6 lines
Quoted 3 lines

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.

#7 lore raw
Quoted 27 lines · On Wednesday 24 June 2009 08:49:48 David Miller wrote:

From: Bartlomiej Zolnierkiewicz <[email protected]>
Date: Wed, 24 Jun 2009 02:49:32 +0200

Quoted 24 lines · On Wednesday 24 June 2009 01:19:04 David Miller wrote:
Quoted 22 lines

From: Bartlomiej Zolnierkiewicz <[email protected]>
Date: Tue, 23 Jun 2009 23:27:27 +0200

Quoted 7 lines

From: Bartlomiej Zolnierkiewicz <[email protected]>
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 ]

Quoted 8 lines

* 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 ]

---
'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.

Quoted 7 lines
Quoted 2 lines

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?

#8 lore raw

From: Bartlomiej Zolnierkiewicz <[email protected]>
Date: Wed, 24 Jun 2009 11:38:00 +0200

Quoted 10 lines · On Wednesday 24 June 2009 08:49:48 David Miller wrote:
Quoted 7 lines

From: Bartlomiej Zolnierkiewicz <[email protected]>
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.

Quoted 1 line

Do you prefer such version instead?

Let's wait until we come to some conclusion about patch #2.