assert(addr);
BUG_ON(!addr);
static int cmnd_recv_pdu(struct iscsi_conn *conn, struct tgt_cmnd *tc,			 u32 offset, u32 size){	int idx, i;	char *addr;	struct scatterlist *sg;	dprintk(D_GENERIC, "%u,%u\n", offset, size);	assert(tc);	sg = tc->sg;	offset += sg->offset;	if (!(offset < sg->offset + tc->bufflen) ||	    !(offset + size <= sg->offset + tc->bufflen)) {		eprintk("%u %u %u %u", offset, size, sg->offset, tc->bufflen);		return -EIO;	}	assert(offset < sg->offset + tc->bufflen);	assert(offset + size <= sg->offset + tc->bufflen);	idx = offset >> PAGE_CACHE_SHIFT;	offset &= ~PAGE_CACHE_MASK;	conn->read_msg.msg_iov = conn->read_iov;	conn->read_size = (size + 3) & -4;	conn->read_overflow = 0;	i = 0;	while (1) {		assert(sg->page);		addr = page_address(sg->page);		assert(addr);		conn->read_iov[i].iov_base =  addr + offset;		if (offset + size <= PAGE_CACHE_SIZE) {			conn->read_iov[i].iov_len = size;			conn->read_msg.msg_iovlen = ++i;			break;		}		conn->read_iov[i].iov_len = PAGE_CACHE_SIZE - offset;		size -= conn->read_iov[i].iov_len;		offset = 0;		if (++i >= ISCSI_CONN_IOV_MAX) {			conn->read_msg.msg_iovlen = i;			conn->read_overflow = size;			conn->read_size -= size;			break;		}		idx++;	}	return 0;}