示例#1
0
/*
 * Handle incoming FCP command.
 */
static void ft_recv_cmd(struct ft_sess *sess, struct fc_frame *fp)
{
	struct ft_cmd *cmd;
	struct fc_lport *lport = sess->tport->lport;
	struct se_session *se_sess = sess->se_sess;
	int tag;

	tag = percpu_ida_alloc(&se_sess->sess_tag_pool, TASK_RUNNING);
	if (tag < 0)
		goto busy;

	cmd = &((struct ft_cmd *)se_sess->sess_cmd_map)[tag];
	memset(cmd, 0, sizeof(struct ft_cmd));

	cmd->se_cmd.map_tag = tag;
	cmd->sess = sess;
	cmd->seq = lport->tt.seq_assign(lport, fp);
	if (!cmd->seq) {
		percpu_ida_free(&se_sess->sess_tag_pool, tag);
		goto busy;
	}
	cmd->req_frame = fp;		/* hold frame during cmd */

	INIT_WORK(&cmd->work, ft_send_work);
	queue_work(sess->tport->tpg->workqueue, &cmd->work);
	return;

busy:
	pr_debug("cmd or seq allocation failure - sending BUSY\n");
	ft_send_resp_status(lport, fp, SAM_STAT_BUSY, 0);
	fc_frame_free(fp);
	ft_sess_put(sess);		/* undo get from lookup */
}
static unsigned int __blk_mq_get_tag(struct blk_mq_tags *tags, gfp_t gfp)
{
	int tag;

	tag = percpu_ida_alloc(&tags->free_tags, gfp);
	if (tag < 0)
		return BLK_MQ_TAG_FAIL;
	return tag + tags->nr_reserved_tags;
}
示例#3
0
static unsigned int __blk_mq_get_tag(struct blk_mq_tags *tags, gfp_t gfp)
{
    int tag;

    tag = percpu_ida_alloc(&tags->free_tags, (gfp & __GFP_WAIT) ?
                           TASK_UNINTERRUPTIBLE : TASK_RUNNING);
    if (tag < 0)
        return BLK_MQ_TAG_FAIL;
    return tag + tags->nr_reserved_tags;
}
static unsigned int __blk_mq_get_reserved_tag(struct blk_mq_tags *tags,
					      gfp_t gfp)
{
	int tag;

	if (unlikely(!tags->nr_reserved_tags)) {
		WARN_ON_ONCE(1);
		return BLK_MQ_TAG_FAIL;
	}

	tag = percpu_ida_alloc(&tags->reserved_tags, gfp);
	if (tag < 0)
		return BLK_MQ_TAG_FAIL;
	return tag;
}
示例#5
0
static unsigned int __blk_mq_get_reserved_tag(struct blk_mq_tags *tags,
        gfp_t gfp)
{
    int tag;

    if (unlikely(!tags->nr_reserved_tags)) {
        WARN_ON_ONCE(1);
        return BLK_MQ_TAG_FAIL;
    }

    tag = percpu_ida_alloc(&tags->reserved_tags, (gfp & __GFP_WAIT) ?
                           TASK_UNINTERRUPTIBLE : TASK_RUNNING);
    if (tag < 0)
        return BLK_MQ_TAG_FAIL;
    return tag;
}