From 4579893333dede61e7b6c89d5183742ac6441f9c Mon Sep 17 00:00:00 2001 From: FUJITA Tomonori Date: Sat, 3 Mar 2007 09:55:55 +0900 Subject: [PATCH] --- yaml --- r: 53631 b: refs/heads/master c: e8f8248cbadcd8cb1b737fc57a01bccca4fb7aec h: refs/heads/master i: 53629: 95a5e9661fe76cf35d5f0ba10be048ae91dd0bd9 53627: 0b25fe18f2baef372e64d1972e9cf5fbc9919feb 53623: 4eb5e98f1a83c472dab4c90397b0c56c0a7e9485 53615: 596e3ca7eec79068ad44fd33efb20076ff98990a 53599: 0094af0866b168a1ba22b37a8825d54a78235357 53567: 3011685a8813fce10021356ed8958ee11868f093 53503: 08308457d4dffbbd4c364aec1e45d63ffbeef8bc v: v3 --- [refs] | 2 +- trunk/drivers/scsi/scsi_tgt_lib.c | 23 ++++++++++++++++++++--- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/[refs] b/[refs] index 4e8b00dc817b..66ee8bd46a53 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: bc7e380a6a4c94f79a49c36bdb28062a750b3c2b +refs/heads/master: e8f8248cbadcd8cb1b737fc57a01bccca4fb7aec diff --git a/trunk/drivers/scsi/scsi_tgt_lib.c b/trunk/drivers/scsi/scsi_tgt_lib.c index dc8781a68d7c..c05dff95bd95 100644 --- a/trunk/drivers/scsi/scsi_tgt_lib.c +++ b/trunk/drivers/scsi/scsi_tgt_lib.c @@ -459,6 +459,16 @@ static struct request *tgt_cmd_hash_lookup(struct request_queue *q, u64 tag) return rq; } +static void scsi_tgt_build_sense(unsigned char *sense_buffer, unsigned char key, + unsigned char asc, unsigned char asq) +{ + sense_buffer[0] = 0x70; + sense_buffer[2] = key; + sense_buffer[7] = 0xa; + sense_buffer[12] = asc; + sense_buffer[13] = asq; +} + int scsi_tgt_kspace_exec(int host_no, int result, u64 tag, unsigned long uaddr, u32 len, unsigned long sense_uaddr, u32 sense_len, u8 rw) @@ -514,9 +524,16 @@ int scsi_tgt_kspace_exec(int host_no, int result, u64 tag, if (len) { err = scsi_map_user_pages(rq->end_io_data, cmd, uaddr, len, rw); if (err) { - eprintk("%p %d\n", cmd, err); - err = -EAGAIN; - goto done; + /* + * user-space daemon bugs or OOM + * TODO: we can do better for OOM. + */ + eprintk("cmd %p ret %d uaddr %lx len %d rw %d\n", + cmd, err, uaddr, len, rw); + cmd->result = SAM_STAT_CHECK_CONDITION; + memset(cmd->sense_buffer, 0, SCSI_SENSE_BUFFERSIZE); + scsi_tgt_build_sense(cmd->sense_buffer, + HARDWARE_ERROR, 0, 0); } } err = scsi_tgt_transfer_response(cmd);