Re: [Suspected SPAM] Re: [Suspected SPAM] Re: [PATCH] fc-transport: BSG clean-up changes for normal and timeout completions (scsi-post-merge tree)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 




On Jun 18, 2009, at 4:27 PM, FUJITA Tomonori wrote:

On Thu, 18 Jun 2009 12:05:24 -0700
Giridhar Malavali <giridhar.malavali@xxxxxxxxxx> wrote:

/**
 * fc_bsg_job_timeout - handler for when a bsg request timesout
 * @req:	request that timed out
@@ -3471,19 +3479,10 @@ fc_bsg_job_timeout(struct request *req)
				"abort failed with status %d\n", err);
	}

-	if (!done) {
-		spin_lock_irqsave(&job->job_lock, flags);
-		job->ref_cnt--;
-		spin_unlock_irqrestore(&job->job_lock, flags);
-		fc_destroy_bsgjob(job);
-	}
-
	/* the blk_end_sync_io() doesn't check the error */
	return BLK_EH_HANDLED;

I think that you need to return a proper value here; see my previous
patch. If a job is done, we need to return BLK_EH_NOT_HANDLED here;
otherwise the block layer calls __blk_complete_request for the job
(and later we call blk_complete_request for the same job).

The rest looks fine by me.

static void blk_rq_timed_out(struct request *req)
{
        struct request_queue *q = req->q;
        enum blk_eh_timer_return ret;

        ret = q->rq_timed_out_fn(req);
        switch (ret) {
        case BLK_EH_HANDLED:
                __blk_complete_request(req);
                break;
        case BLK_EH_RESET_TIMER:
                blk_clear_rq_complete(req);
                blk_add_timer(req);
                break;
        case BLK_EH_NOT_HANDLED:
                /*
                 * LLD handles this for now but in the future
                 * we can send a request msg to abort the command
* and we can move more of the generic scsi eh code to
                 * the blk layer.
                 */
                break;

	As per this code, the completion routine will be called only if we
return BLK_EH_HANDLED from fc transport.

Correct.


In our case the abort of the
timed out request
has been completed and handled. That's the reason I returned
BLK_EH_HANDLED always.

Hmm, if the 'done' is not zero in fc_bsg_job_timeout, the request
should not be aborted or completed?

I mean that if (job->state_flags & FC_RQST_STATE_DONE) is true, the
low level driver handler (such as zfcp_fc_generic_els_handler) is
performing the request. So fc_bsg_job_timeout() can't abort or
complete that request. fc_bsg_job_timeout() needs to ignore the
request.

I agree, the code has to be changed to
if (done)
	return BLK_EH_NOT_HANDLED;
else
	return BLK_EH_HANDLED;


- Giridhar.M.B



	In case of returning BLK_EH_NOT_HANDLED when does the bsg job
completion happens? I did see that by returning BLK_EH_NOT_HANDLED the
application never got response back.

The low level driver handler will call job->job_done later.

--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [SCSI Target Devel]     [Linux SCSI Target Infrastructure]     [Kernel Newbies]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Linux IIO]     [Samba]     [Device Mapper]
  Powered by Linux