scsi_dh: Move dm device handler to SCSI layer
Subsystems (4)
cover scsi_dh: Move dm device handler to SCSI layer
Hello,
The set of patches that follow this email facilitate movement of hardware handlers from dm layer to SCSI layer.
Patches posted along with this email are based off of the patches Mike Christie posted on June 09, 2007. The first email Mike posted gives the rationale for moving the hardware handler from dm to SCSI.
Patches posted by Mike Christie:
http://marc.info/?l=linux-scsi&m=118141609715090&w=2
http://marc.info/?l=linux-scsi&m=118141614418681&w=2
http://marc.info/?l=linux-scsi&m=118141614501241&w=2
http://marc.info/?l=linux-scsi&m=118141614303990&w=2
http://marc.info/?l=linux-scsi&m=118141614425996&w=2
http://marc.info/?l=linux-scsi&m=118141802719861&w=2
http://marc.info/?l=linux-scsi&m=118141614331436&w=2
http://marc.info/?l=linux-scsi&m=118141614421759&w=2
Current set of patches has 3 additional advantages:
1. It is totally compatible with the current multipath tools.
2. Moving from dm hardware handler to SCSI hardware handler is not imposed on the user community. They can use either of those by using either of the modules.
dm hardware handler can be depracated slowly.
3. It adds a new device state SDEV_PASSIVE which avoids I/O being sent to the passive side of a multipath device, thereby reducing the device probe time and boot time.
Booting a system with 40 luns with 1 active path and 1 inactive path shows the following as the last printk before login prompt.
------------
With SCSI HW Handler
[ 171.702366] Buffer I/O error on device sdbl, logical block 262128
Without SCSI HW Handler
[ 1426.772390] end_request: I/O error, dev sdbm, sector 2097136
------------
Patches are created on top of 2.6.24-rc8-mm1.
Testing has been done with a IBM DS4800 storage device, which means the infrastructure and the lsi_rdac hardware handler has been tested. Testing by someone with the EMC hardware and/or HP hardware would be appreciated.
Comments, suggestions solicited.
Thanks,
chandra
Signature · 4 lines
----------------------------------------------------------------------
Chandra Seetharaman | Be careful what you choose....
- [email protected] | .......you may get it.
----------------------------------------------------------------------PATCH 1/9 scsi_dh: add REQ_LB_OP_TRANSITION and errors
Subject: scsi_dh: add REQ_LB_OP_TRANSITION and errors
From: Mike Christie <[email protected]>
This patch adds REQ_LB_OP_TRANSITION which is a REQ_TYPE_LINUX_BLOCK type of command. It also adds the error codes which are used by REQ_LB_OP_TRANSITION to blkdev.h.
---
block/ll_rw_blk.c | 2 1 + 1 - 0 !
include/linux/blkdev.h | 41 41 + 0 - 0 !
2 files changed, 42 insertions(+), 1 deletion(-)
block/ll_rw_blk.c +1 -1
@@ -3456,7 +3456,7 @@ static int __end_that_request_first(stru* for a REQ_BLOCK_PC request, we want to carry any eventual * sense key with us all the way through */ -if (!blk_pc_request (req)) +if (!blk_pc_request (req) && !blk_linux_request (req)) req->errors =0 ;if (!uptodate) {
include/linux/blkdev.h +41 -0
55 lines not on this page · raw message
Signature · 4 lines
----------------------------------------------------------------------
Chandra Seetharaman | Be careful what you choose....
- [email protected] | .......you may get it.
----------------------------------------------------------------------PATCH 2/9 scsi_dh: change sd_prep_fn to call common code
In reply to Chandra SeetharamanSubject: scsi_dh: change sd_prep_fn to call common code
From: Mike Anderson <[email protected]>
Have sd_prep_fn call common code if not REQ_TYPE_FS.
---
drivers/scsi/scsi_lib.c | 1 1 + 0 - 0 ! drivers/scsi/sd.c | 9 2 + 7 - 0 ! include/scsi/scsi_driver.h | 1 1 + 0 - 0 ! 3 files changed, 4 insertions(+), 7 deletions(-)
drivers/scsi/scsi_lib.c +1 -0
@@ -1334,6 +1334,7 @@ int scsi_prep_fn(struct request_queue *q ret =scsi_setup_blk_pc_cmnd (sdev, req);return scsi_prep_return (q, req, ret); } +EXPORT_SYMBOL (scsi_prep_fn);/* * scsi_dev_queue_ready: if we can send requests to sdev, return 1 else
drivers/scsi/sd.c +2 -7
@@ -354,13 +354,8 @@ static int sd_prep_fn(struct request_queunsigned int timeout = sdp->timeout;int ret; -if (rq->cmd_type ==REQ_TYPE_BLOCK_PC ) { - ret =scsi_setup_blk_pc_cmnd (sdp, rq); - goto out; - }else if (rq->cmd_type !=REQ_TYPE_FS ) { - ret =BLKPREP_KILL ; - goto out; - } +if (rq->cmd_type !=REQ_TYPE_FS ) +return scsi_prep_fn (q, rq); ret =scsi_setup_fs_cmnd (sdp, rq);if (ret !=BLKPREP_OK ) goto out;
include/scsi/scsi_driver.h +1 -0
@@ -32,5 +32,6 @@ int scsi_setup_blk_pc_cmnd(struct scsi_dint scsi_setup_fs_cmnd (struct scsi_device *sdev,struct request *req);int scsi_prep_state_check (struct scsi_device *sdev,struct request *req);int scsi_prep_return (struct request_queue *q,struct request *req,int ret); +int scsi_prep_fn (struct request_queue *q,struct request *req);#endif /* _SCSI_SCSI_DRIVER_H */
Signature · 4 lines
----------------------------------------------------------------------
Chandra Seetharaman | Be careful what you choose....
- [email protected] | .......you may get it.
----------------------------------------------------------------------PATCH 3/9 scsi_dh: scsi handling of REQ_LB_OP_TRANSITION
In reply to Chandra SeetharamanSubject: scsi_dh: scsi handling of REQ_LB_OP_TRANSITION
From: Mike Christie <[email protected]>
This patch adds a scsi handler for REQ_LB_OP_TRANSITION commands.
---
---
drivers/scsi/scsi_lib.c | 113 111 + 2 - 0 ! include/scsi/scsi_cmnd.h | 1 1 + 0 - 0 ! include/scsi/scsi_device.h | 13 13 + 0 - 0 ! 3 files changed, 125 insertions(+), 2 deletions(-)
drivers/scsi/scsi_lib.c +111 -2
@@ -1163,6 +1163,38 @@ static struct scsi_cmnd *scsi_get_cmd_frreturn cmd; } +static int scsi_setup_blk_linux_cmnd (struct scsi_device *sdev, +struct request *rq) +{ +if (!get_device (&sdev->sdev_gendev)) { + rq->errors =BLKERR_DEV_OFFLINED ; +return BLKPREP_KILL ; + } + +switch (rq->cmd[0 ]) { +case REQ_LB_OP_TRANSITION : +if (!sdev->sdev_dh || !sdev->sdev_dh->transition) { +/* set REQ_LB_OP_TRANSITION specific error */ + rq->errors =BLKERR_NOSYS ; + goto kill; + } +if (!try_module_get (sdev->sdev_dh->module)) { + rq->errors =BLKERR_DEV_OFFLINED ; + goto kill; + } + +break ; +default : + rq->errors =BLKERR_INVALID_IO ; + goto kill; + } +return BLKPREP_OK ; + +kill: +put_device (&sdev->sdev_gendev); +return BLKPREP_KILL ; +} +int scsi_setup_blk_pc_cmnd (struct scsi_device *sdev,struct request *req) {struct scsi_cmnd *cmd;
@@ -1332,6 +1364,8 @@ int scsi_prep_fn(struct request_queue *qif (req->cmd_type ==REQ_TYPE_BLOCK_PC ) ret =scsi_setup_blk_pc_cmnd (sdev, req); +else if (req->cmd_type ==REQ_TYPE_LINUX_BLOCK ) + ret =scsi_setup_blk_linux_cmnd (sdev, req);return scsi_prep_return (q, req, ret); }EXPORT_SYMBOL (scsi_prep_fn);
@@ -1445,9 +1479,24 @@ static void scsi_kill_request(struct reqstatic void scsi_softirq_done (struct request *rq) {struct scsi_cmnd *cmd = rq->completion_data; -unsigned long wait_for = (cmd->allowed +1 ) * cmd->timeout_per_command;int disposition; +struct request_queue *q; +unsigned long wait_for, flags; +if (blk_linux_request (rq)) { + q = rq->q; +spin_lock_irqsave (q->queue_lock, flags); +/* +* we always return 1 and the caller should +* check rq->errors for the complete status +*/ +end_that_request_last (rq,1 ); +spin_unlock_irqrestore (q->queue_lock, flags); +return ; + } + + + wait_for = (cmd->allowed +1 ) * cmd->timeout_per_command;INIT_LIST_HEAD (&cmd->eh_entry); disposition =scsi_decide_disposition (cmd);
@@ -1477,6 +1526,50 @@ static void scsi_softirq_done(struct req } } +/** +* scsi_blk_linux_cmd_done - Complete a REQ_TYPE_LINUX_BLOCK request. +* @req: REQ_TYPE_LINUX_BLOCK request being processed +* @err: return value +* +* This function should be called by the REQ_TYPE_LINUX_BLOCK handler +* to return the request to its caller. This function queues the +* the completion to the blk softirq so the queue lock does not have +* to be held here. +*/ +void scsi_blk_linux_cmd_done (struct request *rq,int err) +{ +struct scsi_device *sdev = rq->q->queuedata; + +switch (rq->cmd[0 ]) { +case REQ_LB_OP_TRANSITION : +module_put (sdev->sdev_dh->module); +break ; + } + +put_device (&sdev->sdev_gendev); + rq->errors = err; + rq->completion_data =NULL ; +blk_complete_request (rq); +} +EXPORT_SYMBOL_GPL (scsi_blk_linux_cmd_done); + +static void scsi_execute_blk_linux_cmd (struct request *rq) +{ +struct request_queue *q = rq->q; +struct scsi_device *sdev = q->queuedata; + +switch (rq->cmd[0 ]) { +case REQ_LB_OP_TRANSITION : +spin_unlock_irq (q->queue_lock); + sdev->sdev_dh->transition (rq); +spin_lock_irq (q->queue_lock); +break ; +default : +/* should have checked in scsi_prep_fn already */ +BUG (); + } +} +/* * Function: scsi_request_fn() *
@@ -1519,7 +1612,23 @@ static void scsi_request_fn(struct reque* accept it. */ req =elv_next_request (q); -if (!req || !scsi_dev_queue_ready (q, sdev)) +if (!req) +break ; + +/* +* We do not account for linux blk req in the device +* or host busy accounting because it is not necessarily +* a scsi command that is sent to some object. The lower +* level can translate it into a request/scsi_cmnd, if +* necessary, and then queue that up using REQ_TYPE_BLOCK_PC. +*/ +if (blk_linux_request (req)) { +blkdev_dequeue_request (req); +scsi_execute_blk_linux_cmd (req); +continue ; + } + +if (!scsi_dev_queue_ready (q, sdev))break ;if (unlikely (!scsi_device_online (sdev))) {
include/scsi/scsi_cmnd.h +1 -0
@@ -123,6 +123,7 @@ extern void __scsi_put_command(struct Sc struct device *);extern void scsi_finish_command (struct scsi_cmnd *cmd);extern void scsi_req_abort_cmd (struct scsi_cmnd *cmd); +extern void scsi_blk_linux_cmd_done (struct request *req,int err);extern void *scsi_kmap_atomic_sg (struct scatterlist *sg,int sg_count,size_t *offset,size_t *len);
include/scsi/scsi_device.h +13 -0
@@ -160,9 +160,22 @@ struct scsi_device {struct execute_work ew;/* used to get process context on put */ +struct scsi_device_handler *sdev_dh; +void *sdev_dh_data;enum scsi_device_state sdev_state;unsigned long sdev_data[0 ]; } __attribute__((aligned(sizeof(unsigned long)))); + +struct scsi_device_handler { +struct module *module; +const char *name; + +struct notifier_block nb; + +int (*check_sense)(struct scsi_device *,struct scsi_sense_hdr *); +void (*transition)(struct request *); +}; +#define to_scsi_device (d) \ container_of(d, struct scsi_device, sdev_gendev)#define class_to_sdev (d) \
Signature · 4 lines
----------------------------------------------------------------------
Chandra Seetharaman | Be careful what you choose....
- [email protected] | .......you may get it.
----------------------------------------------------------------------Re: [PATCH 3/9] scsi_dh: scsi handling of REQ_LB_OP_TRANSITION
Quoted 25 lines · Chandra Seetharaman
drivers/scsi/scsi_lib.c +16
-1@@ -1445,9 +1479,24 @@ static void scsi_kill_request(struct reqstatic void scsi_softirq_done (struct request *rq) {struct scsi_cmnd *cmd = rq->completion_data; -unsigned long wait_for = (cmd->allowed +1 ) * cmd->timeout_per_command;int disposition; +struct request_queue *q; +unsigned long wait_for, flags; +if (blk_linux_request (rq)) { + q = rq->q; +spin_lock_irqsave (q->queue_lock, flags); +/* +* we always return 1 and the caller should +* check rq->errors for the complete status +*/ +end_that_request_last (rq,1 ); +spin_unlock_irqrestore (q->queue_lock, flags); +return ; + } + + + wait_for = (cmd->allowed +1 ) * cmd->timeout_per_command;INIT_LIST_HEAD (&cmd->eh_entry);
.....
Quoted 17 lines
drivers/scsi/scsi_lib.c +9
-1+/* * Function: scsi_request_fn() * @@ -1519,7 +1612,23 @@ static void scsi_request_fn(struct reque* accept it. */ req =elv_next_request (q); -if (!req || !scsi_dev_queue_ready (q, sdev)) +if (!req) +break ; + +/* +* We do not account for linux blk req in the device +* or host busy accounting because it is not necessarily +* a scsi command that is sent to some object. The lower +* level can translate it into a request/scsi_cmnd, if
drivers/scsi/scsi_lib.c static void scsi_request_fn(struct reque · line 1632
Quoted 10 lines
drivers/scsi/scsi_lib.c +9
-0+* necessary, and then queue that up using REQ_TYPE_BLOCK_PC. +*/ +if (blk_linux_request (req)) { +blkdev_dequeue_request (req); +scsi_execute_blk_linux_cmd (req); +continue ; + } + +if (!scsi_dev_queue_ready (q, sdev))break ;
I think these two pieces are one of the reasons I have not pushed the patches. I thought the completion and execution pieces here are a little ugly and seem to just wedge themselves in where they want to be.
Is there any way to make the insertion of non-scsi commands more common? Do we have the code for being able to send requests directly to something like a fc rport done? Could we maybe inject these special commands to the hw handler using something similar to how bsg would send non scsi commands to weird objects (objects like rport, sessions, and not devices we traditionally associated with queues like scsi_devices). Just a thought with no code :) that is why the ugly code existed still :)
Re: [PATCH 3/9] scsi_dh: scsi handling of REQ_LB_OP_TRANSITION
Quoted 60 lines · Mike Christie
Quoted 25 lines · Chandra Seetharaman
drivers/scsi/scsi_lib.c +16
-1@@ -1445,9 +1479,24 @@ static void scsi_kill_request(struct reqstatic void scsi_softirq_done (struct request *rq) {struct scsi_cmnd *cmd = rq->completion_data; -unsigned long wait_for = (cmd->allowed +1 ) * cmd->timeout_per_command;int disposition; +struct request_queue *q; +unsigned long wait_for, flags; +if (blk_linux_request (rq)) { + q = rq->q; +spin_lock_irqsave (q->queue_lock, flags); +/* +* we always return 1 and the caller should +* check rq->errors for the complete status +*/ +end_that_request_last (rq,1 ); +spin_unlock_irqrestore (q->queue_lock, flags); +return ; + } + + + wait_for = (cmd->allowed +1 ) * cmd->timeout_per_command;INIT_LIST_HEAD (&cmd->eh_entry);.....
Quoted 17 lines
drivers/scsi/scsi_lib.c +9
-1+/* * Function: scsi_request_fn() * @@ -1519,7 +1612,23 @@ static void scsi_request_fn(struct reque* accept it. */ req =elv_next_request (q); -if (!req || !scsi_dev_queue_ready (q, sdev)) +if (!req) +break ; + +/* +* We do not account for linux blk req in the device +* or host busy accounting because it is not necessarily +* a scsi command that is sent to some object. The lower +* level can translate it into a request/scsi_cmnd, if drivers/scsi/scsi_lib.c static void scsi_request_fn(struct reque · line 1632
Quoted 10 lines
drivers/scsi/scsi_lib.c +9
-0+* necessary, and then queue that up using REQ_TYPE_BLOCK_PC. +*/ +if (blk_linux_request (req)) { +blkdev_dequeue_request (req); +scsi_execute_blk_linux_cmd (req); +continue ; + } + +if (!scsi_dev_queue_ready (q, sdev))break ;I think these two pieces are one of the reasons I have not pushed the patches. I thought the completion and execution pieces here are a little ugly and seem to just wedge themselves in where they want to be.
Quoted 7 lines
Is there any way to make the insertion of non-scsi commands more common? Do we have the code for being able to send requests directly to something like a fc rport done? Could we maybe inject these special commands to the hw handler using something similar to how bsg would send non scsi commands to weird objects (objects like rport, sessions, and not devices we traditionally associated with queues like
scsi_devices). Just a thought with no code :) that is why the ugly code existed still :)
Can't it be done with this code itself ?
If the underlying functionality is going to be provided by the hardware handler, then can't we add additional commands (like transition) when we need them ?
Or am I missing something ?
Signature · 4 lines
----------------------------------------------------------------------
Chandra Seetharaman | Be careful what you choose....
- [email protected] | .......you may get it.
----------------------------------------------------------------------James Bottomley
maintainerRe: [PATCH 3/9] scsi_dh: scsi handling of REQ_LB_OP_TRANSITION
In reply to Mike ChristieQuoted 60 lines · Mike Christie
Quoted 25 lines · Chandra Seetharaman
drivers/scsi/scsi_lib.c +16
-1@@ -1445,9 +1479,24 @@ static void scsi_kill_request(struct reqstatic void scsi_softirq_done (struct request *rq) {struct scsi_cmnd *cmd = rq->completion_data; -unsigned long wait_for = (cmd->allowed +1 ) * cmd->timeout_per_command;int disposition; +struct request_queue *q; +unsigned long wait_for, flags; +if (blk_linux_request (rq)) { + q = rq->q; +spin_lock_irqsave (q->queue_lock, flags); +/* +* we always return 1 and the caller should +* check rq->errors for the complete status +*/ +end_that_request_last (rq,1 ); +spin_unlock_irqrestore (q->queue_lock, flags); +return ; + } + + + wait_for = (cmd->allowed +1 ) * cmd->timeout_per_command;INIT_LIST_HEAD (&cmd->eh_entry);.....
Quoted 17 lines
drivers/scsi/scsi_lib.c +9
-1+/* * Function: scsi_request_fn() * @@ -1519,7 +1612,23 @@ static void scsi_request_fn(struct reque* accept it. */ req =elv_next_request (q); -if (!req || !scsi_dev_queue_ready (q, sdev)) +if (!req) +break ; + +/* +* We do not account for linux blk req in the device +* or host busy accounting because it is not necessarily +* a scsi command that is sent to some object. The lower +* level can translate it into a request/scsi_cmnd, if drivers/scsi/scsi_lib.c static void scsi_request_fn(struct reque · line 1632
Quoted 10 lines
drivers/scsi/scsi_lib.c +9
-0+* necessary, and then queue that up using REQ_TYPE_BLOCK_PC. +*/ +if (blk_linux_request (req)) { +blkdev_dequeue_request (req); +scsi_execute_blk_linux_cmd (req); +continue ; + } + +if (!scsi_dev_queue_ready (q, sdev))break ;I think these two pieces are one of the reasons I have not pushed the patches. I thought the completion and execution pieces here are a little ugly and seem to just wedge themselves in where they want to be.
Quoted 7 lines
Is there any way to make the insertion of non-scsi commands more common? Do we have the code for being able to send requests directly to something like a fc rport done? Could we maybe inject these special commands to the hw handler using something similar to how bsg would send non scsi commands to weird objects (objects like rport, sessions, and not devices we traditionally associated with queues like
scsi_devices). Just a thought with no code :) that is why the ugly code existed still :)
We sort of do. The bsg code in scsi_transport_sas to send SMP frames to expander devices would be an example of non-scsi commands going via a mechanism other than being encapsulated in SCSI. I don't know if that's the complete solution in this case, but you could investigate it.
James
Re: [PATCH 3/9] scsi_dh: scsi handling of REQ_LB_OP_TRANSITION
Quoted 70 lines · James Bottomley
Quoted 60 lines · Mike Christie
Quoted 25 lines · Chandra Seetharaman
drivers/scsi/scsi_lib.c +16
-1@@ -1445,9 +1479,24 @@ static void scsi_kill_request(struct reqstatic void scsi_softirq_done (struct request *rq) {struct scsi_cmnd *cmd = rq->completion_data; -unsigned long wait_for = (cmd->allowed +1 ) * cmd->timeout_per_command;int disposition; +struct request_queue *q; +unsigned long wait_for, flags; +if (blk_linux_request (rq)) { + q = rq->q; +spin_lock_irqsave (q->queue_lock, flags); +/* +* we always return 1 and the caller should +* check rq->errors for the complete status +*/ +end_that_request_last (rq,1 ); +spin_unlock_irqrestore (q->queue_lock, flags); +return ; + } + + + wait_for = (cmd->allowed +1 ) * cmd->timeout_per_command;INIT_LIST_HEAD (&cmd->eh_entry);.....
Quoted 17 lines
drivers/scsi/scsi_lib.c +9
-1+/* * Function: scsi_request_fn() * @@ -1519,7 +1612,23 @@ static void scsi_request_fn(struct reque* accept it. */ req =elv_next_request (q); -if (!req || !scsi_dev_queue_ready (q, sdev)) +if (!req) +break ; + +/* +* We do not account for linux blk req in the device +* or host busy accounting because it is not necessarily +* a scsi command that is sent to some object. The lower +* level can translate it into a request/scsi_cmnd, if drivers/scsi/scsi_lib.c static void scsi_request_fn(struct reque · line 1632
Quoted 10 lines
drivers/scsi/scsi_lib.c +9
-0+* necessary, and then queue that up using REQ_TYPE_BLOCK_PC. +*/ +if (blk_linux_request (req)) { +blkdev_dequeue_request (req); +scsi_execute_blk_linux_cmd (req); +continue ; + } + +if (!scsi_dev_queue_ready (q, sdev))break ;I think these two pieces are one of the reasons I have not pushed the patches. I thought the completion and execution pieces here are a little ugly and seem to just wedge themselves in where they want to be.
Quoted 7 lines
Is there any way to make the insertion of non-scsi commands more common? Do we have the code for being able to send requests directly to something like a fc rport done? Could we maybe inject these special commands to the hw handler using something similar to how bsg would send non scsi commands to weird objects (objects like rport, sessions, and not devices we traditionally associated with queues like
scsi_devices). Just a thought with no code :) that is why the ugly code existed still :)
Quoted 4 lines
We sort of do. The bsg code in
scsi_transport_sasto send SMP frames to expander devices would be an example of non-scsi commands going via a mechanism other than being encapsulated in SCSI. I don't know if that's the complete solution in this case, but you could investigate it.
I looked at the bsg code in scsi_transport_sas and all I see it doing is calling blk_init_queue to set the request_fn. The request_fn (*smp_request) just processes one cmd_type. Is there code is another tree that has more processing?
A idea to allow for more control / flexibility cmd_type handlers could be added inside request_fn, prep_rq_fn, softirq_done_fn.
I thought about this being at a higher level in the block layer, but it would be hard to handle the request_fn cleanly at the high level. The localized change would reduce impact on users who do not want or need per cmd_type handlers.
A SCSI example might be something like:
static void scsi_softirq_done(struct request *rq)
{
...
sdev->cmd_type_handler[rq->cmd_type]->softirq_done(rq)
...
}int scsi_prep_fn(struct request_queue *q, struct request *req)
{
...
sdev->cmd_type_handler[rq->cmd_type]->prep_fn(req)
...
}static void scsi_request_fn(struct request_queue *q)
{
...
sdev->cmd_type_handler[rq->cmd_type]->request_fn(req)
...
}This is just moving the code inside the cmd_type "if" checks, but it may reduce the number of cmd_type "if" checks in some paths (if we make multiple decisions based on cmd_type). On init of the sdev default handlers would be installed.
-andmike
--
Michael Anderson
[email protected]
James Bottomley
maintainerRe: [PATCH 3/9] scsi_dh: scsi handling of REQ_LB_OP_TRANSITION
Quoted 76 lines · Mike Anderson
Quoted 70 lines · James Bottomley
Quoted 60 lines · Mike Christie
Quoted 25 lines · Chandra Seetharaman
drivers/scsi/scsi_lib.c +16
-1@@ -1445,9 +1479,24 @@ static void scsi_kill_request(struct reqstatic void scsi_softirq_done (struct request *rq) {struct scsi_cmnd *cmd = rq->completion_data; -unsigned long wait_for = (cmd->allowed +1 ) * cmd->timeout_per_command;int disposition; +struct request_queue *q; +unsigned long wait_for, flags; +if (blk_linux_request (rq)) { + q = rq->q; +spin_lock_irqsave (q->queue_lock, flags); +/* +* we always return 1 and the caller should +* check rq->errors for the complete status +*/ +end_that_request_last (rq,1 ); +spin_unlock_irqrestore (q->queue_lock, flags); +return ; + } + + + wait_for = (cmd->allowed +1 ) * cmd->timeout_per_command;INIT_LIST_HEAD (&cmd->eh_entry);.....
Quoted 17 lines
drivers/scsi/scsi_lib.c +9
-1+/* * Function: scsi_request_fn() * @@ -1519,7 +1612,23 @@ static void scsi_request_fn(struct reque* accept it. */ req =elv_next_request (q); -if (!req || !scsi_dev_queue_ready (q, sdev)) +if (!req) +break ; + +/* +* We do not account for linux blk req in the device +* or host busy accounting because it is not necessarily +* a scsi command that is sent to some object. The lower +* level can translate it into a request/scsi_cmnd, if drivers/scsi/scsi_lib.c static void scsi_request_fn(struct reque · line 1632
Quoted 10 lines
drivers/scsi/scsi_lib.c +9
-0+* necessary, and then queue that up using REQ_TYPE_BLOCK_PC. +*/ +if (blk_linux_request (req)) { +blkdev_dequeue_request (req); +scsi_execute_blk_linux_cmd (req); +continue ; + } + +if (!scsi_dev_queue_ready (q, sdev))break ;I think these two pieces are one of the reasons I have not pushed the patches. I thought the completion and execution pieces here are a little ugly and seem to just wedge themselves in where they want to be.
Quoted 7 lines
Is there any way to make the insertion of non-scsi commands more common? Do we have the code for being able to send requests directly to something like a fc rport done? Could we maybe inject these special commands to the hw handler using something similar to how bsg would send non scsi commands to weird objects (objects like rport, sessions, and not devices we traditionally associated with queues like
scsi_devices). Just a thought with no code :) that is why the ugly code existed still :)Quoted 4 lines
We sort of do. The bsg code in
scsi_transport_sasto send SMP frames to expander devices would be an example of non-scsi commands going via a mechanism other than being encapsulated in SCSI. I don't know if that's the complete solution in this case, but you could investigate it.
Quoted 4 lines
I looked at the bsg code in
scsi_transport_sasand all I see it doing is callingblk_init_queueto set therequest_fn. Therequest_fn(*smp_request) just processes onecmd_type. Is there code is another tree that has more processing?
No ... that's it. It's designed to expose a frame driven SMP communication channel to expanders via a block tap.
Part of the problem seems to be that your current code is very much trying to do this in-band. A block tap like the SMP handlers are effectively out of band
Quoted 7 lines
A idea to allow for more control / flexibility
cmd_typehandlers could be added insiderequest_fn,prep_rq_fn,softirq_done_fn.I thought about this being at a higher level in the block layer, but it would be hard to handle the
request_fncleanly at the high level. The localized change would reduce impact on users who do not want or need percmd_typehandlers.
But this type of thinking does lead to a lot of apparent nastiness inside your actual handlers. Trying to do all of this in-band has you doing a lot of callback driven async I/O stuff using blk_execute_rq_nowait(). It might be a lot cleaner to do it out of band on a thread using the standard waiting interfaces.
James
PATCH 4/9 scsi_dh: add skeleton for SCSI Device Handlers
In reply to Chandra SeetharamanSubject: scsi_dh: add skeleton for SCSI Device Handlers
From: Mike Anderson <[email protected]>
Add base support to the SCSI subsystem for SCSI device handlers.
---
drivers/scsi/Kconfig | 2 2 + 0 - 0 ! drivers/scsi/Makefile | 1 1 + 0 - 0 ! drivers/scsi/device_handler/Kconfig | 16 16 + 0 - 0 ! drivers/scsi/device_handler/Makefile | 3 3 + 0 - 0 ! drivers/scsi/scsi_error.c | 10 10 + 0 - 0 ! drivers/scsi/scsi_sysfs.c | 43 43 + 0 - 0 ! include/scsi/scsi_device.h | 2 2 + 0 - 0 ! 7 files changed, 77 insertions(+)
drivers/scsi/Kconfig +2 -0
@@ -1822,4 +1822,6 @@ endif # SCSI_LOWLEVEL source "drivers/scsi/pcmcia/Kconfig" +source "drivers/scsi/device_handler/Kconfig" + endmenu
drivers/scsi/Makefile +1 -0
@@ -34,6 +34,7 @@ obj-$(CONFIG_SCSI_ISCSI_ATTRS) += scsi_t obj-$(CONFIG_SCSI_SAS_ATTRS) += scsi_transport_sas.o obj-$(CONFIG_SCSI_SAS_LIBSAS) += libsas/ obj-$(CONFIG_SCSI_SRP_ATTRS) += scsi_transport_srp.o +obj-$(CONFIG_SCSI_DH) += device_handler/ obj-$(CONFIG_ISCSI_TCP) += libiscsi.o iscsi_tcp.o obj-$(CONFIG_INFINIBAND_ISER) += libiscsi.o
drivers/scsi/device_handler/Kconfig new file +16 -0
@@ -0,0 +1,16 @@ +# +# SCSI Device Handler configuration +# + +menuconfig SCSI_DH + bool "SCSI Device Handlers" + depends on SCSI!=n + default n + help + SCSI Device Handlers provide device specific support for + devices utilized in multipath configurations. Say Y here to + select support for specific hardware. + +if SCSI_DH + +endif #SCSI_DH
drivers/scsi/device_handler/Makefile new file +3 -0
@@ -0,0 +1,3 @@ +# +# SCSI Device Handler +#
drivers/scsi/scsi_error.c +10 -0
@@ -298,6 +298,7 @@ static inline void scsi_eh_prt_fail_stat*/ static int scsi_check_sense (struct scsi_cmnd *scmd) { +struct scsi_device *sdev = scmd->device;struct scsi_sense_hdr sshdr;if (!scsi_command_normalize_sense (scmd, &sshdr))
@@ -306,6 +307,15 @@ static int scsi_check_sense(struct scsi_if (scsi_sense_is_deferred (&sshdr))return NEEDS_RETRY ; +if (sdev->sdev_dh && sdev->sdev_dh->check_sense) { +int rc; + + rc = sdev->sdev_dh->check_sense (sdev, &sshdr); +if (rc !=SUCCESS ) +return rc; +/* handler does not care. Drop down to default handling */ + } +/* * Previous logic looked for FILEMARK, EOM or ILI which are * mainly associated with tapes and returned SUCCESS.
drivers/scsi/scsi_sysfs.c +43 -0
49 lines not on this page · raw message
include/scsi/scsi_device.h +2 -0
@@ -241,7 +241,9 @@ extern struct scsi_device *__scsi_add_de uint, uint, uint, void *hostdata);extern int scsi_add_device (struct Scsi_Host *host,uint channel,uint target,uint lun); +extern int scsi_register_device_handler (struct scsi_device_handler *sdev_dh);extern void scsi_remove_device (struct scsi_device *); +extern int scsi_unregister_device_handler (struct scsi_device_handler *sdev_dh);extern int scsi_device_get (struct scsi_device *);extern void scsi_device_put (struct scsi_device *);
Signature · 4 lines
----------------------------------------------------------------------
Chandra Seetharaman | Be careful what you choose....
- [email protected] | .......you may get it.
----------------------------------------------------------------------Re: [PATCH 4/9] scsi_dh: add skeleton for SCSI Device Handlers
Quoted 42 lines · Chandra Seetharaman
* mainly associated with tapes and returned SUCCESS.
Index:linux-2.6.24-rc8/drivers/scsi/scsi_sysfs.c
===================================================================drivers/scsi/scsi_sysfs.c +33
-0@@ -951,6 +951,49 @@ int scsi_register_interface(struct class }EXPORT_SYMBOL (scsi_register_interface); +static int scsi_dh_notifier_add (struct device *dev,void *data) +{ +struct scsi_device_handler *sdev_dh = data; + + sdev_dh->nb.notifier_call (&sdev_dh->nb,BUS_NOTIFY_ADD_DEVICE , dev); + +return 0 ; +} + +int scsi_register_device_handler (struct scsi_device_handler *sdev_dh) +{ +int ret; + + ret =bus_register_notifier (&scsi_bus_type, &sdev_dh->nb); + +bus_for_each_dev (&scsi_bus_type,NULL , sdev_dh, scsi_dh_notifier_add); + +return ret; +} +EXPORT_SYMBOL (scsi_register_device_handler); + +static int scsi_dh_notifier_remove (struct device *dev,void *data) +{ +struct scsi_device_handler *sdev_dh = data; + + sdev_dh->nb.notifier_call (&sdev_dh->nb,BUS_NOTIFY_DEL_DEVICE , dev); + +return 0 ; +} + +int scsi_unregister_device_handler (struct scsi_device_handler *sdev_dh) +{ +int ret;
drivers/scsi/scsi_sysfs.c int scsi_register_interface(struct class · line 996
Quoted 10 lines
drivers/scsi/scsi_sysfs.c +10
-0+ + ret =bus_unregister_notifier (&scsi_bus_type, &sdev_dh->nb); + +bus_for_each_dev (&scsi_bus_type,NULL , sdev_dh, + scsi_dh_notifier_remove); + +return ret; +} +EXPORT_SYMBOL (scsi_unregister_device_handler); +
Did this end up solving the problem I was hitting where when using the other driver model stuff like is used with the SCSI upper layer drivers. The problem where the hw handler module had to be loaded before finding devices and had to be loaded before sd.c?
Re: [PATCH 4/9] scsi_dh: add skeleton for SCSI Device Handlers
Quoted 49 lines · Mike Christie
Quoted 48 lines · Chandra Seetharaman
* mainly associated with tapes and returned SUCCESS.
Index:linux-2.6.24-rc8/drivers/scsi/scsi_sysfs.c
===================================================================drivers/scsi/scsi_sysfs.c +39
-0@@ -951,6 +951,49 @@ int scsi_register_interface(struct class }EXPORT_SYMBOL (scsi_register_interface); +static int scsi_dh_notifier_add(struct device *dev, void *data) +{ +struct scsi_device_handler *sdev_dh = data; + + sdev_dh->nb.notifier_call (&sdev_dh->nb,BUS_NOTIFY_ADD_DEVICE , dev); + +return 0 ; +} + +int scsi_register_device_handler (struct scsi_device_handler *sdev_dh) +{ +int ret; + + ret =bus_register_notifier (&scsi_bus_type, &sdev_dh->nb); + +bus_for_each_dev (&scsi_bus_type,NULL , sdev_dh, scsi_dh_notifier_add); + +return ret; +} +EXPORT_SYMBOL (scsi_register_device_handler); + +static int scsi_dh_notifier_remove (struct device *dev,void *data) +{ +struct scsi_device_handler *sdev_dh = data; + + sdev_dh->nb.notifier_call (&sdev_dh->nb,BUS_NOTIFY_DEL_DEVICE , dev); + +return 0 ; +} + +int scsi_unregister_device_handler (struct scsi_device_handler *sdev_dh) +{ +int ret; + + ret =bus_unregister_notifier (&scsi_bus_type, &sdev_dh->nb); + +bus_for_each_dev (&scsi_bus_type,NULL , sdev_dh, + scsi_dh_notifier_remove); + +return ret;
Quoted 8 lines
drivers/scsi/scsi_sysfs.c int scsi_register_interface(struct class · line 996
Quoted 3 lines
drivers/scsi/scsi_sysfs.c +3
-0+} +EXPORT_SYMBOL (scsi_unregister_device_handler); +Did this end up solving the problem I was hitting where when using the other driver model stuff like is used with the SCSI upper layer drivers. The problem where the hw handler module had to be loaded before finding devices and had to be loaded before
sd.c?
Yes this update was to have the handler add routine called prior to the upper level drivers probe routine. In device_add blocking_notifier_call_chain is called prior to bus_attach_device which leads to the upper level drivers probe routine being called.
The bus_register_notifier will handle new devices showing up and the bus_for_each_dev is used to sync up with already probed devices. Obviously loading late will not be able to handle issues during the device probe if a device needs that type of handling.
-andmike
--
Michael Anderson
[email protected]
Re: [PATCH 4/9] scsi_dh: add skeleton for SCSI Device Handlers
In reply to Mike ChristieQuoted 50 lines · Mike Christie
Quoted 49 lines · Chandra Seetharaman
* mainly associated with tapes and returned SUCCESS.
Index:linux-2.6.24-rc8/drivers/scsi/scsi_sysfs.c
===================================================================drivers/scsi/scsi_sysfs.c +40
-0@@ -951,6 +951,49 @@ int scsi_register_interface(struct class }EXPORT_SYMBOL (scsi_register_interface); +static int scsi_dh_notifier_add (struct device *dev,void *data) +{ +struct scsi_device_handler *sdev_dh = data; + + sdev_dh->nb.notifier_call (&sdev_dh->nb,BUS_NOTIFY_ADD_DEVICE , dev); + +return 0 ; +} + +int scsi_register_device_handler (struct scsi_device_handler *sdev_dh) +{ +int ret; + + ret =bus_register_notifier (&scsi_bus_type, &sdev_dh->nb); + +bus_for_each_dev (&scsi_bus_type,NULL , sdev_dh, scsi_dh_notifier_add); + +return ret; +} +EXPORT_SYMBOL (scsi_register_device_handler); + +static int scsi_dh_notifier_remove (struct device *dev,void *data) +{ +struct scsi_device_handler *sdev_dh = data; + + sdev_dh->nb.notifier_call (&sdev_dh->nb,BUS_NOTIFY_DEL_DEVICE , dev); + +return 0 ; +} + +int scsi_unregister_device_handler (struct scsi_device_handler *sdev_dh) +{ +int ret; + + ret =bus_unregister_notifier (&scsi_bus_type, &sdev_dh->nb); + +bus_for_each_dev (&scsi_bus_type,NULL , sdev_dh, + scsi_dh_notifier_remove); + +return ret;
Quoted 8 lines
drivers/scsi/scsi_sysfs.c int scsi_register_interface(struct class · line 996
Quoted 3 lines
drivers/scsi/scsi_sysfs.c +3
-0+} +EXPORT_SYMBOL (scsi_unregister_device_handler); +Did this end up solving the problem I was hitting where when using the other driver model stuff like is used with the SCSI upper layer drivers. The problem where the hw handler module had to be loaded before finding devices and had to be loaded before
sd.c?
Yes, As andmike pointed, it is coded and tested.
It works in both cases, module being inserted before sd is probed and module inserted after sd.
Quoted 4 lines
-
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Signature · 4 lines
----------------------------------------------------------------------
Chandra Seetharaman | Be careful what you choose....
- [email protected] | .......you may get it.
----------------------------------------------------------------------PATCH 5/9 scsi_dh: add EMC Clariion device handler
In reply to Chandra SeetharamanSubject: scsi_dh: add EMC Clariion device handler
From: Mike Christie <[email protected]>
This adds support for EMC Clariions. It is just a port of what is in mainline. Ed's patches will be intergrated in a different patch which adds more advanced functionality.
---
drivers/scsi/device_handler/Kconfig | 6 6 + 0 - 0 ! drivers/scsi/device_handler/Makefile | 2 2 + 0 - 0 ! drivers/scsi/device_handler/scsi_dh_emc.c | 360 360 + 0 - 0 ! 3 files changed, 368 insertions(+)
drivers/scsi/device_handler/Kconfig +6 -0
@@ -13,4 +13,10 @@ menuconfig SCSI_DH if SCSI_DH +config SCSI_DH_EMC + tristate "EMC CLARiiON Device Handler" + help + If you have a EMC CLARiiON select y. Otherwise, say N. + + endif #SCSI_DH
drivers/scsi/device_handler/Makefile +2 -0
@@ -1,3 +1,5 @@ # # SCSI Device Handler # + +obj-$(CONFIG_SCSI_DH_EMC) += scsi_dh_emc.o
drivers/scsi/device_handler/scsi_dh_emc.c new file +360 -0
360 lines not on this page · raw message
Signature · 4 lines
----------------------------------------------------------------------
Chandra Seetharaman | Be careful what you choose....
- [email protected] | .......you may get it.
----------------------------------------------------------------------PATCH 6/9 scsi_dh: add hp sw device handler
In reply to Chandra SeetharamanSubject: scsi_dh: add hp sw device handler
From: Mike Christie <[email protected]>
This patch adds a very basic scsi device handler for older hp boxes which cannot be upgraded.
---
drivers/scsi/device_handler/Kconfig | 6 6 + 0 - 0 ! drivers/scsi/device_handler/Makefile | 1 1 + 0 - 0 ! drivers/scsi/device_handler/scsi_dh_hp_sw.c | 206 206 + 0 - 0 ! 3 files changed, 213 insertions(+)
drivers/scsi/device_handler/Kconfig +6 -0
@@ -18,5 +18,11 @@ config SCSI_DH_EMC help If you have a EMC CLARiiON select y. Otherwise, say N. +config SCSI_DH_HP_SW + tristate "HP/COMPAQ MSA Device Handler" + help + If you have a HP/COMPAQ MSA device that requires START_STOP to + be sent to start it and cannot upgrade the firmware then select y. + Otherwise, say N. endif #SCSI_DH
drivers/scsi/device_handler/Makefile +1 -0
@@ -3,3 +3,4 @@ # obj-$(CONFIG_SCSI_DH_EMC) += scsi_dh_emc.o +obj-$(CONFIG_SCSI_DH_HP_SW) += scsi_dh_hp_sw.o
drivers/scsi/device_handler/scsi_dh_hp_sw.c new file +206 -0
206 lines not on this page · raw message
Signature · 4 lines
----------------------------------------------------------------------
Chandra Seetharaman | Be careful what you choose....
- [email protected] | .......you may get it.
----------------------------------------------------------------------PATCH 7/9 scsi_dh: Add support for SDEV_PASSIVE
In reply to Chandra SeetharamanSubject: scsi_dh: Add support for SDEV_PASSIVE
From: Chandra Seetharaman <[email protected]>
This patch adds a new device state SDEV_PASSIVE, to correspond to the passive side access of an active/passive multipathed device.
---
---
drivers/scsi/scsi_lib.c | 14 13 + 1 - 0 !
include/scsi/scsi_device.h | 2 2 + 0 - 0 !
2 files changed, 15 insertions(+), 1 deletion(-)
drivers/scsi/scsi_lib.c +13 -1
@@ -1310,6 +1310,14 @@ int scsi_prep_state_check(struct scsi_deif (!(req->cmd_flags &REQ_PREEMPT )) ret =BLKPREP_DEFER ;break ; +case SDEV_PASSIVE : +/* +* If the device is passive, we refuse to +* process any FS commands. +*/ +if (req->cmd_type ==REQ_TYPE_FS ) + ret =BLKPREP_KILL ; +break ;default :/* * For any other not fully online state we only allow
@@ -2179,6 +2187,7 @@ scsi_device_set_state(struct scsi_devicecase SDEV_OFFLINE :case SDEV_QUIESCE :case SDEV_BLOCK : +case SDEV_PASSIVE :break ;default : goto illegal;
@@ -2241,7 +2250,10 @@ scsi_device_set_state(struct scsi_device goto illegal; }break ; - +case SDEV_PASSIVE : +if (oldstate !=SDEV_RUNNING ) + goto illegal; +break ; } sdev->sdev_state = state;return 0 ;
include/scsi/scsi_device.h +2 -0
@@ -44,6 +44,8 @@ enum scsi_device_state {SDEV_BLOCK ,/* Device blocked by scsi lld. No scsi * commands from user or midlayer should be issued * to the scsi lld. */ + SDEV_PASSIVE, /* Device is the passive side of a + * active/passive multipath storage */ }; enum scsi_device_event {
Signature · 4 lines
----------------------------------------------------------------------
Chandra Seetharaman | Be careful what you choose....
- [email protected] | .......you may get it.
----------------------------------------------------------------------James Bottomley
maintainerRe: [PATCH 7/9] scsi_dh: Add support for SDEV_PASSIVE
Quoted 6 lines · Chandra Seetharaman
Subject:
scsi_dh: Add support forSDEV_PASSIVEFrom: Chandra Seetharaman <[email protected]>
This patch adds a new device state
SDEV_PASSIVE, to correspond to the passive side access of an active/passive multipathed device.
Really, no; this isn't right. The state field of a SCSI device is for the SCSI state model. Passive might be a valid device mapper state, but it's not a valid SCSI state. If these patches can't work except by mucking with the SCSI state model, there's some layering problem elsewhere that needs sorting out.
James
Re: [PATCH 7/9] scsi_dh: Add support for SDEV_PASSIVE
Quoted 10 lines · James Bottomley
Quoted 6 lines · Chandra Seetharaman
Subject:
scsi_dh: Add support forSDEV_PASSIVEFrom: Chandra Seetharaman <[email protected]>
This patch adds a new device state
SDEV_PASSIVE, to correspond to the passive side access of an active/passive multipathed device.Really, no; this isn't right. The state field of a SCSI device is for the SCSI state model. Passive might be a valid device mapper state, but
Hi James,
It is not the "device mapper state", it is the state of the device itself. These devices have active/passive paths, the passive paths will be represented by SDEV_PASSIVE device state in SCSI.
chandra
Quoted 11 lines
it's not a valid SCSI state. If these patches can't work except by mucking with the SCSI state model, there's some layering problem elsewhere that needs sorting out.
James
-
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Signature · 4 lines
----------------------------------------------------------------------
Chandra Seetharaman | Be careful what you choose....
- [email protected] | .......you may get it.
----------------------------------------------------------------------James Bottomley
maintainerRe: [PATCH 7/9] scsi_dh: Add support for SDEV_PASSIVE
Quoted 9 lines · Chandra Seetharaman
Quoted 8 lines · James Bottomley
Quoted 6 lines · Chandra Seetharaman
Subject:
scsi_dh: Add support forSDEV_PASSIVEFrom: Chandra Seetharaman <[email protected]>
This patch adds a new device state
SDEV_PASSIVE, to correspond to the passive side access of an active/passive multipathed device.
Quoted 8 lines
Quoted 2 lines
Really, no; this isn't right. The state field of a SCSI device is for the SCSI state model. Passive might be a valid device mapper state, but
Hi James,
It is not the "device mapper state", it is the state of the device itself. These devices have active/passive paths, the passive paths will be represented by
SDEV_PASSIVEdevice state in SCSI.
Yes, it is .. you're killing commands on the basis of being in this state, which nothing in SCSI ever sets.
A proper return from a passive path is the SCSI standard NOT_READY LOGICAL UNIT NOT READY, INITIALIZING COMMAND REQUIRED. We expect to see this, not the command being killed.
James
Re: [PATCH 7/9] scsi_dh: Add support for SDEV_PASSIVE
Quoted 19 lines · James Bottomley
Quoted 9 lines · Chandra Seetharaman
Quoted 8 lines · James Bottomley
Quoted 6 lines · Chandra Seetharaman
Subject:
scsi_dh: Add support forSDEV_PASSIVEFrom: Chandra Seetharaman <[email protected]>
This patch adds a new device state
SDEV_PASSIVE, to correspond to the passive side access of an active/passive multipathed device.Quoted 8 lines
Quoted 2 lines
Really, no; this isn't right. The state field of a SCSI device is for the SCSI state model. Passive might be a valid device mapper state, but
Hi James,
It is not the "device mapper state", it is the state of the device itself. These devices have active/passive paths, the passive paths will be represented by
SDEV_PASSIVEdevice state in SCSI.
Quoted 6 lines
Yes, it is .. you're killing commands on the basis of being in this state, which nothing in SCSI ever sets.
A proper return from a passive path is the SCSI standard
NOT_READYLOGICAL UNIT NOT READY, INITIALIZING COMMAND REQUIRED. We expect to see this, not the command being killed.
The device does send these error messages currently, but it takes some time to get the check condition back, which adds up the time to boot especially when the # of LUNS is huge.
For example, in my test configuration, I had 40 luns, and the time difference (with this patch and without it) to boot is 171 seconds and 1426 seconds.
We thought we will get it short circuited so as to return the failure back faster.
Also, we only short circuit REQ_TYPE_FS.
Quoted 8 lines
James
-
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Signature · 4 lines
----------------------------------------------------------------------
Chandra Seetharaman | Be careful what you choose....
- [email protected] | .......you may get it.
----------------------------------------------------------------------Re: [PATCH 7/9] scsi_dh: Add support for SDEV_PASSIVE
Quoted 7 lines · Chandra Seetharaman
The device does send these error messages currently, but it takes some time to get the check condition back, which adds up the time to boot especially when the # of LUNS is huge.
For example, in my test configuration, I had 40 luns, and the time difference (with this patch and without it) to boot is 171 seconds and 1426 seconds.
Was that with sync or async SCSI bus scanning?
Signature · 4 lines
Intel are signing my paycheques ... these opinions are still mine "Bill, look, we understand that you're interested in selling us this operating system, but compare it to ours. We can't possibly take such a retrograde step."
Re: [PATCH 7/9] scsi_dh: Add support for SDEV_PASSIVE
Quoted 10 lines · Matthew Wilcox
Quoted 7 lines · Chandra Seetharaman
The device does send these error messages currently, but it takes some time to get the check condition back, which adds up the time to boot especially when the # of LUNS is huge.
For example, in my test configuration, I had 40 luns, and the time difference (with this patch and without it) to boot is 171 seconds and 1426 seconds.
Was that with sync or async SCSI bus scanning?
I didn't change anything, IOW, i did default scanning, which I would guess sync ?!
Quoted 1 line
Signature · 4 lines
----------------------------------------------------------------------
Chandra Seetharaman | Be careful what you choose....
- [email protected] | .......you may get it.
----------------------------------------------------------------------Re: [PATCH 7/9] scsi_dh: Add support for SDEV_PASSIVE
Quoted 6 lines · Chandra Seetharaman
Quoted 5 lines · Matthew Wilcox
Quoted 4 lines · Chandra Seetharaman
The device does send these error messages currently, but it takes some time to get the check condition back, which adds up the time to boot especially when the # of LUNS is huge.
Quoted 8 lines
Quoted 5 lines
Quoted 3 lines
For example, in my test configuration, I had 40 luns, and the time difference (with this patch and without it) to boot is 171 seconds and 1426 seconds.
Was that with sync or async SCSI bus scanning?
I didn't change anything, IOW, i did default scanning, which I would guess sync ?!
That would depend on your CONFIG_SCSI_SCAN_ASYNC setting.
Try booting with 'scsi_mod.scan=async' and without this patch, and see how long it takes.
Signature · 4 lines
Intel are signing my paycheques ... these opinions are still mine "Bill, look, we understand that you're interested in selling us this operating system, but compare it to ours. We can't possibly take such a retrograde step."
Re: [PATCH 7/9] scsi_dh: Add support for SDEV_PASSIVE
Quoted 13 lines · Matthew Wilcox
Quoted 12 lines · Chandra Seetharaman
Quoted 10 lines · Matthew Wilcox
Quoted 7 lines · Chandra Seetharaman
The device does send these error messages currently, but it takes some time to get the check condition back, which adds up the time to boot especially when the # of LUNS is huge.
For example, in my test configuration, I had 40 luns, and the time difference (with this patch and without it) to boot is 171 seconds and 1426 seconds.
Was that with sync or async SCSI bus scanning?
Quoted 7 lines
Quoted 2 lines
I didn't change anything, IOW, i did default scanning, which I would guess sync ?!
That would depend on your
CONFIG_SCSI_SCAN_ASYNCsetting.Try booting with 'scsi_mod.scan=async' and without this patch, and see how long it takes.
Hi Matthew,
scanning in async mode did not help in reducing the boot time.
I even changed the configuration, such that 20 active luns and 20 passive luns are in each path, it still didn't change the time it took to reboot.
regards,
chandra
Quoted 1 line
Signature · 4 lines
----------------------------------------------------------------------
Chandra Seetharaman | Be careful what you choose....
- [email protected] | .......you may get it.
----------------------------------------------------------------------Re: [PATCH 7/9] scsi_dh: Add support for SDEV_PASSIVE
In reply to James BottomleyQuoted 11 lines · James Bottomley
Quoted 10 lines · Chandra Seetharaman
Quoted 9 lines · James Bottomley
Quoted 6 lines · Chandra Seetharaman
Subject:
scsi_dh: Add support forSDEV_PASSIVEFrom: Chandra Seetharaman <[email protected]>
This patch adds a new device state
SDEV_PASSIVE, to correspond to the passive side access of an active/passive multipathed device.Really, no; this isn't right. The state field of a SCSI device is for the SCSI state model. Passive might be a valid device mapper state, but
Quoted 8 lines
Quoted 5 lines
Hi James,
It is not the "device mapper state", it is the state of the device itself. These devices have active/passive paths, the passive paths will be represented by
SDEV_PASSIVEdevice state in SCSI.Yes, it is .. you're killing commands on the basis of being in this state, which nothing in SCSI ever sets.
SCSI does set this. See below.
Quoted 5 lines
A proper return from a passive path is the SCSI standard
NOT_READYLOGICAL UNIT NOT READY, INITIALIZING COMMAND REQUIRED. We expect to see this, not the command being killed.
I think this part of the patch is trying to implement and detect the Target port asymetric access states from spc3 section 5.8.2.4 (it does not follow it exactly because devices like RDAC or old clarrions did not implement the spec), and then use that info to fail commands before they are even sent to the device to avoid start up delays from when programs like udev, hal, kernel partition scanning probe the device.
For the LSI patch it works like the following:
When IO is sent to a path that cannot execute IO optimally, the scsi hw handler hook for sense processing (see rdac_check_sense in "[PATCH 8/9] scsi_dh: add lsi rdac device handler" and the scsi_error.c hook in in "scsi_dh: add skeleton for SCSI Device Handlers") will detect this and set the state to passive so future IO is not execute on the path (SG_IO/passthrough is allowed).
I am not sure about alternatives. If we just exported the port access state in sysfs, but did not fail IO from scsi_prep_state_check, then the users could still check the state before sending IO. Would it be horrible to convert apps to do this?
Re: [PATCH 7/9] scsi_dh: Add support for SDEV_PASSIVE
Quoted 11 lines · Mike Christie
When IO is sent to a path that cannot execute IO optimally, the scsi hw handler hook for sense processing (see
rdac_check_sensein "[PATCH 8/9]scsi_dh: add lsi rdac device handler" and thescsi_error.chook in in "scsi_dh: add skeleton for SCSI Device Handlers") will detect this and set the state to passive so future IO is not execute on the path (SG_IO/passthrough is allowed).I am not sure about alternatives. If we just exported the port access state in sysfs, but did not fail IO from
scsi_prep_state_check, then the users could still check the state before sending IO. Would it be horrible to convert apps to do this?
The majority of the boot up delays is caused by the kernel partition scanning and other kernel init code (Chandra please correct if that is not true). Sysfs attributes would not help here. One option maybe to add handling of the newer BLKERR_ codes in the generators of IO or some similar solution with a rollout possibly focused at the top generators of IO.
A number of user apps like lvm scanning that execute media access commands already have filter capability to filter devices that one does not want to scan. Another class of device scanners just use inquiries which are not effected by the passive state (though some could probably use udevinfo and reduce the amount of repeated SCSI inquiries execute on the system.
-andmike
--
Michael Anderson
[email protected]
Re: [PATCH 7/9] scsi_dh: Add support for SDEV_PASSIVE
Quoted 8 lines · Mike Anderson
Quoted 7 lines · Mike Christie
When IO is sent to a path that cannot execute IO optimally, the scsi hw handler hook for sense processing (see
rdac_check_sensein "[PATCH 8/9]scsi_dh: add lsi rdac device handler" and thescsi_error.chook in in "scsi_dh: add skeleton for SCSI Device Handlers") will detect this and set the state to passive so future IO is not execute on the path (SG_IO/passthrough is allowed).
Quoted 7 lines
Quoted 4 lines
I am not sure about alternatives. If we just exported the port access state in sysfs, but did not fail IO from
scsi_prep_state_check, then the users could still check the state before sending IO. Would it be horrible to convert apps to do this?The majority of the boot up delays is caused by the kernel partition scanning and other kernel init code (Chandra please correct if that is not
Yes, this is the case.
Some level of scanning happens at the rc scripts level too. That can be reduced by what Mikec is suggesting. But, as andmike is suggesting, it won't be a complete solution.
Quoted 3 lines
true). Sysfs attributes would not help here. One option maybe to add handling of the newer
BLKERR_codes in the generators of IO or some similar solution with a rollout possibly focused at the top generators of
are you suggesting the partition scanners (kernel) and lvm(user space scanner) should stop sending I/Os to a passive device once they realize that the device is passive (thru BLKERR_ return codes) ?
Quoted 4 lines
IO.
A number of user apps like lvm scanning that execute media access commands already have filter capability to filter devices that one does not want to
Yes, it will help. But, it will lead to additional instructions to the users which if they do not follow (due to not knowing it or some such) will lead to a delayed boot.
IMO, It will be good if it works nicely out of the box.
Quoted 8 lines
scan. Another class of device scanners just use inquiries which are not effected by the passive state (though some could probably use udevinfo and reduce the amount of repeated SCSI inquiries execute on the system.
-andmike
--
Michael Anderson
[email protected]
Signature · 4 lines
----------------------------------------------------------------------
Chandra Seetharaman | Be careful what you choose....
- [email protected] | .......you may get it.
----------------------------------------------------------------------no INQUIRY from userspace please (was Re: [PATCH 7/9] scsi_dh: Add support for SDEV_PASSIVE)
In reply to Mike AndersonQuoted 5 lines · Mike Anderson
A number of user apps like lvm scanning that execute media access commands already have filter capability to filter devices that one does not want to scan. Another class of device scanners just use inquiries which are not effected by the passive state (though some could probably use udevinfo and reduce the amount of repeated SCSI inquiries execute on the system.
To expand on this:
At least on desktop systems and SOHO server systems, userspace should _never_ issue INQUIRY. There are too many broken firmwares out there which assume that there will never be more than one INQUIRY sent. They start to return garbled data or crash if they get a second INQUIRY.
Signature · 3 lines
Stefan Richter -=====-==--- --=- --=== http://arcgraph.de/sr/
James Bottomley
maintainerRe: no INQUIRY from userspace please (was Re: [PATCH 7/9] scsi_dh: Add support for SDEV_PASSIVE)
Quoted 7 lines · Stefan Richter
Quoted 5 lines · Mike Anderson
A number of user apps like lvm scanning that execute media access commands already have filter capability to filter devices that one does not want to scan. Another class of device scanners just use inquiries which are not effected by the passive state (though some could probably use udevinfo and reduce the amount of repeated SCSI inquiries execute on the system.
Quoted 6 lines
To expand on this:
At least on desktop systems and SOHO server systems, userspace should _never_ issue INQUIRY. There are too many broken firmwares out there which assume that there will never be more than one INQUIRY sent. They start to return garbled data or crash if they get a second INQUIRY.
It's all very well to say this, but I think if you look at what udev does, you'll find that it uses scsi_id to send a VPD inquiry to the device so it can populate /dev/disk/by-id, so the point is already conceded (and I think looking at a recent camera crash that seems to have been precipitated by this, it's already causing us problems).
This is all a tradeoff. If you want userspace *never* to issue raw SCSI commands like INQUIRY, we're going to have to provide the needed information from the kernel via sysfs ... including VPD strings. This is something we've always shovelled off into userspace before.
James
Re: no INQUIRY from userspace please
(adding Cc linux-hotplug)
Quoted 21 lines · James Bottomley
Quoted 7 lines · Stefan Richter
Quoted 5 lines · Mike Anderson
A number of user apps like lvm scanning that execute media access commands already have filter capability to filter devices that one does not want to scan. Another class of device scanners just use inquiries which are not effected by the passive state (though some could probably use udevinfo and reduce the amount of repeated SCSI inquiries execute on the system.
Quoted 6 lines
To expand on this:
At least on desktop systems and SOHO server systems, userspace should _never_ issue INQUIRY. There are too many broken firmwares out there which assume that there will never be more than one INQUIRY sent. They start to return garbled data or crash if they get a second INQUIRY.
It's all very well to say this, but I think if you look at what udev does, you'll find that it uses
scsi_idto send a VPD inquiry to the device so it can populate/dev/disk/by-id, so the point is already conceded (and I think looking at a recent camera crash that seems to have been precipitated by this, it's already causing us problems).
Quoted 4 lines
This is all a tradeoff. If you want userspace *never* to issue raw SCSI commands like INQUIRY, we're going to have to provide the needed information from the kernel via sysfs ... including VPD strings. This is something we've always shovelled off into userspace before.
Well, it's definitely awkward to have to deal with less than perfect firmwares.
But there is still potential to optimize udev based on what we already have in sysfs. For example, on Gentoo I see calls of scsi_id and usb_id for FireWire disks (by udev? by HAL? I don't know), even though udev actually also reads the FireWire driver specific sysfs attribute with the target port ID and LUN. I.e. udev knows where to look but calls pointless helpers anyway.
(BTW, how about sysfs attributes for the target port identifier and for the logical unit identifier --- at transport independent sysfs paths --- to simplify userspace's life? What else?)
Signature · 3 lines
Stefan Richter -=====-==--- --=- --=== http://arcgraph.de/sr/
Re: no INQUIRY from userspace please
Quoted 5 lines
Quoted 4 lines · James Bottomley
It's all very well to say this, but I think if you look at what udev does, you'll find that it uses
scsi_idto send a VPD inquiry to the device so it can populate/dev/disk/by-id, so the point is already conceded
PS: Alas we don't have a practicable way to know how many of the
- doesn't work with Linux but works to some degree with Windows,
- doesn't work with a 2.6 based Linux distro but did work with a 2.4 based distro
kinds of devices are those with this INQUIRY bug or similar bugs.
While non-udev distros slowly went out of fashion on the desktop, there was a certain frequency of reports of the latter kind of FireWire devices, but this was before I became aware of that kind of firmware bug, therefore I don't have any data whether it played a role for these cases.
Signature · 3 lines
Stefan Richter -=====-==--- --=- --=== http://arcgraph.de/sr/
Re: no INQUIRY from userspace please
Quoted 12 lines · Stefan Richter
Quoted 5 lines
Quoted 4 lines · James Bottomley
It's all very well to say this, but I think if you look at what udev does, you'll find that it uses
scsi_idto send a VPD inquiry to the device so it can populate/dev/disk/by-id, so the point is already concededPS: Alas we don't have a practicable way to know how many of the
- doesn't work with Linux but works to some degree with Windows,
- doesn't work with a 2.6 based Linux distro but did work with a 2.4 based distro
kinds of devices are those with this INQUIRY bug or similar bugs.
Quoted 5 lines
While non-udev distros slowly went out of fashion on the desktop, there was a certain frequency of reports of the latter kind of FireWire devices, but this was before I became aware of that kind of firmware bug, therefore I don't have any data whether it played a role for these cases.
Just a small point here. To my knowledge all devices that understand the SCSI command set will accept a 36 byte INQUIRY (i.e. an INQUIRY with an "allocation length" of 36). That is a practical consideration since they would crash on Windows otherwise.
Now scsi_id (and probably other programs of that ilk (including some of mine)) get excited when they get a response to a "36 byte" INQUIRY and go onto ask for VPD page 0x80 (serial number) or page 0x83 (device id) via an INQUIRY command with the EVPD bit set. Now if they were clever they would make sure that the "allocation length" of the _first_ such VPD inquiry was 36! That way they could have a close look at the response and if it wasn't valid for a VPD page (e.g. requested_VPD_page_num != response[1]) then they would leave the damn device alone **.
<<< Special case: removable media >>>
Since response[1] of a standard INQUIRY has RMB (removable medium bit) set in its top bit and the rest of the byte reserved, 0x80 is a possibility. That could give a false positive when the serial number VPD page is requested. So try looking for VPD page 0x83 (with alloc_len=36) first.
** The logic here is that a brain dead SCSI target interpreter doesn't look at the EVPD bit and can only handle an "allocation length" of 36. So if it receives an INQUIRY cdb with the EVPD bit set it will just respond with its standard INQUIRY response.
Doug Gilbert
Re: no INQUIRY from userspace please
Hi Doug,
Quoted 25 lines · Douglas Gilbert
Quoted 12 lines · Stefan Richter
Quoted 5 lines
Quoted 4 lines · James Bottomley
It's all very well to say this, but I think if you look at what udev does, you'll find that it uses
scsi_idto send a VPD inquiry to the device so it can populate/dev/disk/by-id, so the point is already concededPS: Alas we don't have a practicable way to know how many of the
- doesn't work with Linux but works to some degree with Windows,
- doesn't work with a 2.6 based Linux distro but did work with a 2.4 based distro
kinds of devices are those with this INQUIRY bug or similar bugs.Quoted 5 lines
While non-udev distros slowly went out of fashion on the desktop, there was a certain frequency of reports of the latter kind of FireWire devices, but this was before I became aware of that kind of firmware bug, therefore I don't have any data whether it played a role for these cases.
Just a small point here. To my knowledge all devices that understand the SCSI command set will accept a 36 byte INQUIRY (i.e. an INQUIRY with an "allocation length" of 36). That is a practical consideration since they would crash on Windows otherwise.
Quoted 12 lines
Now
scsi_id(and probably other programs of that ilk (including some of mine)) get excited when they get a response to a "36 byte" INQUIRY and go onto ask for VPD page0x80(serial number) or page0x83(device id) via an INQUIRY command with the EVPD bit set. Now if they were clever they would make sure that the "allocation length" of the _first_ such VPD inquiry was 36! That way they could have a close look at the response and if it wasn't valid for a VPD page (e.g.requested_VPD_page_num!= response[1]) then they would leave the damn device alone **.
Oh, but of course we can do this. Actually not a bad idea.
Quoted 8 lines
<<< Special case: removable media >>>
Since response[1] of a standard INQUIRY has RMB (removable medium bit) set in its top bit and the rest of the byte reserved,0x80is a possibility. That could give a false positive when the serial number VPD page is requested. So try looking for VPD page0x83(with alloc_len=36) first.
What we do is to query page 0x0 first (if no specific page has been given), and then try 0x83 or, failing that, 0x80. So we could easily modify the query to page 0x0 to get the first 36 bytes only, that should catch these type of errors.
And we can check byte 4 of the response; according to SPC it should always be 0 (as page 0 always has to be implemented).
Good idea. I'll do it.
Quoted 8 lines
** The logic here is that a brain dead SCSI target interpreter doesn't look at the EVPD bit and can only handle an "allocation length" of 36. So if it receives an INQUIRY cdb with the EVPD bit set it will just respond with its standard INQUIRY response.
Yes, but that's pretty much standard anyway.
So we're dealing with that already.
Cheers,
Hannes
Signature · 8 lines
Dr. Hannes Reinecke zSeries & Storage [email protected] +49 911 74053 688 SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg GF: Markus Rex, HRB 16746 (AG Nürnberg) -- To unsubscribe from this list: send the line "unsubscribe linux-hotplug" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: no INQUIRY from userspace please (was Re: [PATCH 7/9] scsi_dh: Add support for SDEV_PASSIVE)
In reply to James BottomleyQuoted 8 lines · James Bottomley
This is all a tradeoff. If you want userspace *never* to issue raw SCSI
commands like INQUIRY, we're going to have to provide the needed
information from the kernel via sysfs ... including VPD strings. This
is something we've always shovelled off into userspace before.
What if a user-space application client _does_ send an INQUIRY to a device anyway?
It would probably be better to preserve application client behaviour and simulate/emulate n-th INQUIRY, after the 1st for such broken device firmwares that break on any subsequent INQUIRY. Possibly in the LLDD or via blacklisting in the mid-layer.
Luben
Re: [PATCH 7/9] scsi_dh: Add support for SDEV_PASSIVE
In reply to James BottomleyQuoted 6 lines · James Bottomley
Quoted 4 lines · Chandra Seetharaman
Subject:
scsi_dh: Add support forSDEV_PASSIVEFrom: Chandra Seetharaman <[email protected]>
Quoted 9 lines
Quoted 2 lines
This patch adds a new device state
SDEV_PASSIVE, to correspond to the passive side access of an active/passive multipathed device.Really, no; this isn't right. The state field of a SCSI device is for the SCSI state model. Passive might be a valid device mapper state, but it's not a valid SCSI state. If these patches can't work except by mucking with the SCSI state model, there's some layering problem elsewhere that needs sorting out.
It is actually a valid state for this device and a number of other devices that have passive / active controller. There are differences in response capability (i.e., media access commands) on certain sds until a fail over command is given. The response behavior difference along with all the partition scanning and other commands that get generated during the probing of a device are what leads to the long boot times previously mentioned by Chandra.
Since we have created a policy to remove the vendor specific multipath drivers that handled the aggregation of the paths into a single device we need some method to handle devices that are not fully capable, but are still expose to the upper layers.
The patches are also addressing a long standing issue of sense data processing, but that is not related to the SDEV_* state comment.
-andmike
--
Michael Anderson
[email protected]
PATCH 8/9 scsi_dh: add lsi rdac device handler
In reply to Chandra SeetharamanSubject: scsi_dh: add lsi rdac device handler
From: Chandra Seetharaman <[email protected]>
add LSI RDAC SCSI device handler
---
drivers/scsi/device_handler/Kconfig | 5 5 + 0 - 0 ! drivers/scsi/device_handler/Makefile | 1 1 + 0 - 0 ! drivers/scsi/device_handler/scsi_dh_lsi_rdac.c | 766 766 + 0 - 0 ! 3 files changed, 772 insertions(+)
drivers/scsi/device_handler/Kconfig +5 -0
@@ -25,4 +25,9 @@ config SCSI_DH_HP_SW be sent to start it and cannot upgrade the firmware then select y. Otherwise, say N. +config SCSI_DH_LSI_RDAC + tristate "LSI RDAC Device Handler" + help + If you have a LSI RDAC select y. Otherwise, say N. + endif #SCSI_DH
drivers/scsi/device_handler/Makefile +1 -0
@@ -4,3 +4,4 @@ obj-$(CONFIG_SCSI_DH_EMC) += scsi_dh_emc.o obj-$(CONFIG_SCSI_DH_HP_SW) += scsi_dh_hp_sw.o +obj-$(CONFIG_SCSI_DH_LSI_RDAC) += scsi_dh_lsi_rdac.o
drivers/scsi/device_handler/scsi_dh_lsi_rdac.c new file +766 -0
766 lines not on this page · raw message
Signature · 4 lines
----------------------------------------------------------------------
Chandra Seetharaman | Be careful what you choose....
- [email protected] | .......you may get it.
----------------------------------------------------------------------PATCH 9/9 scsi_dh: add scsi device handler to dm
In reply to Chandra SeetharamanSubject: scsi_dh: add scsi device handler to dm
From: Mike Anderson <[email protected]>
This patch adds a dm hardware handler that can control SCSI device handlers.
SCSI Hardware handler for a specific device type can be invokes by using this handler.
For example, to use the lsi_rdac SCSI hardware handler, one would specify
hardware_handler "2 scsi_dh lsi_rdac"
in the device section of /etc/multipath.conf.
---
drivers/md/Kconfig | 6 6 + 0 - 0 ! drivers/md/Makefile | 2 2 + 0 - 0 ! drivers/md/dm-mpath-scsi-dh.c | 185 185 + 0 - 0 ! 3 files changed, 193 insertions(+)
drivers/md/Kconfig +6 -0
@@ -273,6 +273,12 @@ config DM_MULTIPATH_HP ---help--- Multipath support for HP MSA (Active/Passive) series hardware. +config DM_MULTIPATH_SCSI_DH + tristate "SCSI Device Handler support (EXPERIMENTAL)" + depends on DM_MULTIPATH && BLK_DEV_DM && EXPERIMENTAL + ---help--- + Multipath support for SCSI Device Handlers. + config DM_DELAY tristate "I/O delaying target (EXPERIMENTAL)" depends on BLK_DEV_DM && EXPERIMENTAL
drivers/md/Makefile +2 -0
@@ -9,6 +9,7 @@ dm-snapshot-objs := dm-snap.o dm-excepti dm-mirror-objs := dm-log.o dm-raid1.o dm-rdac-objs := dm-mpath-rdac.o dm-hp-sw-objs := dm-mpath-hp-sw.o +dm-scsi-dh-objs := dm-mpath-scsi-dh.o md-mod-objs := md.o bitmap.o raid456-objs := raid5.o raid6algos.o raid6recov.o raid6tables.o \ raid6int1.o raid6int2.o raid6int4.o \
@@ -38,6 +39,7 @@ obj-$(CONFIG_DM_MULTIPATH) += dm-multipa obj-$(CONFIG_DM_MULTIPATH_EMC) += dm-emc.o obj-$(CONFIG_DM_MULTIPATH_HP) += dm-hp-sw.o obj-$(CONFIG_DM_MULTIPATH_RDAC) += dm-rdac.o +obj-$(CONFIG_DM_MULTIPATH_SCSI_DH) += dm-scsi-dh.o obj-$(CONFIG_DM_SNAPSHOT) += dm-snapshot.o obj-$(CONFIG_DM_MIRROR) += dm-mirror.o obj-$(CONFIG_DM_ZERO) += dm-zero.o
drivers/md/dm-mpath-scsi-dh.c new file +185 -0
185 lines not on this page · raw message
Signature · 4 lines
----------------------------------------------------------------------
Chandra Seetharaman | Be careful what you choose....
- [email protected] | .......you may get it.
----------------------------------------------------------------------