RE: [RFC] [PATCH] helper function for retrieving scsi_cmd given host based block layer tag

David Somayajulu
2006-10-03T18:06:09Z

> From: linux-scsi-owner@vger.kernel.org
[mailto:linux-scsi-owner@vger.kernel.org] On Behalf Of David C
> Somayajulu
> Sent: Friday, September 22, 2006 3:01 PM
> To: Jens Axboe
> Cc: James Bottomley; linux-scsi@vger.kernel.org; Mike Christie; Doug
Maxey; David Wagner
> > I wonder if you are using the 'block' branch, not just the master
> > branch? It seems to apply perfectly there, but that is just the same
as
> > Linus' tree. So when you have cloned the block git repo, there are a
> > number of branches you can work against. The main branch with
current
> > changes is the 'block' branch, that is what you want to be making
> > patches against.
> >
> > I'll be away for the entire next week, so no rush on my end.
> >
> I think I got it right this time. Here it is.
> Thanks
> David Somayajulu
Jens,
I would appreciate if you can let me know if the last post of the above
patch was acceptable.
Thanks
David Somayajulu
> ---
>
> diff --git a/block/ll_rw_blk.c b/block/ll_rw_blk.c
> index 4475fa4..a4a72bd 100644
> --- a/block/ll_rw_blk.c
> +++ b/block/ll_rw_blk.c
> @@ -840,12 +840,7 @@ EXPORT_SYMBOL(blk_queue_dma_alignment);
> **/
> struct request *blk_queue_find_tag(request_queue_t *q, int tag)
> {
> - struct blk_queue_tag *bqt = q->queue_tags;
> -
> - if (unlikely(bqt == NULL || tag >= bqt->real_max_depth))
> - return NULL;
> -
> - return bqt->tag_index[tag];
> + return blk_map_queue_find_tag(q->queue_tags, tag);
> }
>
> EXPORT_SYMBOL(blk_queue_find_tag);
> diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h
> index c55d470..10fd39d 100644
> --- a/include/linux/blkdev.h
> +++ b/include/linux/blkdev.h
> @@ -766,6 +766,14 @@ extern int blk_queue_resize_tags(request
> extern void blk_queue_invalidate_tags(request_queue_t *);
> extern long blk_congestion_wait(int rw, long timeout);
>
> +static inline struct request *blk_map_queue_find_tag(struct
blk_queue_tag *bqt,
> + int tag)
> +{
> + if (unlikely(bqt == NULL || tag >= bqt->real_max_depth))
> + return NULL;
> + return bqt->tag_index[tag];
> +}
> +
> extern void blk_rq_bio_prep(request_queue_t *, struct request *,
struct bio *);
> extern int blkdev_issue_flush(struct block_device *, sector_t *);
>
> diff --git a/include/scsi/scsi_tcq.h b/include/scsi/scsi_tcq.h
> index d1d9b10..01b7481 100644
> --- a/include/scsi/scsi_tcq.h
> +++ b/include/scsi/scsi_tcq.h
> @@ -131,5 +131,25 @@ static inline struct scsi_cmnd *scsi_fin
> return sdev->current_cmnd;
> }
>
> +/**
> + * scsi_host_find_tag - find the tagged command by host
> + * @shost: pointer to scsi_host
> + * @tag: tag of the scsi_cmnd
> + *
> + * Notes:
> + * Only works with tags allocated by the generic blk layer.
> + **/
> +static inline struct scsi_cmnd *scsi_host_find_tag(struct Scsi_Host
*shost,
> + int tag)
> +{
> + struct request *req;
> +
> + if (tag != SCSI_NO_TAG) {
> + req = blk_map_queue_find_tag(shost->bqt, tag);
> + return req ? (struct scsi_cmnd *)req->special : NULL;
> + }
> + return NULL;
> +}
> +
> #endif /* CONFIG_BLOCK */
> #endif /* _SCSI_SCSI_TCQ_H */
>