version 1.1, 2012/02/21 16:42:02
|
version 1.1.1.2, 2012/10/09 09:13:23
|
Line 1
|
Line 1
|
/* |
/* |
* Copyright (C) 2008-2011 Daisuke Aoyama <aoyama@peach.ne.jp>. | * Copyright (C) 2008-2012 Daisuke Aoyama <aoyama@peach.ne.jp>. |
* All rights reserved. |
* All rights reserved. |
* |
* |
* Redistribution and use in source and binary forms, with or without |
* Redistribution and use in source and binary forms, with or without |
Line 30
|
Line 30
|
|
|
#include <pthread.h> |
#include <pthread.h> |
#include <time.h> |
#include <time.h> |
|
#ifdef HAVE_UUID_H |
|
#include <uuid.h> |
|
#endif |
#include "istgt.h" |
#include "istgt.h" |
|
#include "istgt_queue.h" |
|
|
#define MAX_LU_LUN 16 | #define MAX_LU_LUN 64 |
#define MAX_LU_LUN_SLOT 8 |
#define MAX_LU_LUN_SLOT 8 |
#define MAX_LU_TSIH 256 |
#define MAX_LU_TSIH 256 |
#define MAX_LU_MAP 256 |
#define MAX_LU_MAP 256 |
Line 88
|
Line 92
|
#define MAX_INQUIRY_SERIAL 16 |
#define MAX_INQUIRY_SERIAL 16 |
|
|
#define ISTGT_LU_WORK_BLOCK_SIZE (1ULL * 1024ULL * 1024ULL) |
#define ISTGT_LU_WORK_BLOCK_SIZE (1ULL * 1024ULL * 1024ULL) |
|
#define ISTGT_LU_WORK_ATS_BLOCK_SIZE (1ULL * 1024ULL * 1024ULL) |
#define ISTGT_LU_MAX_WRITE_CACHE_SIZE (8ULL * 1024ULL * 1024ULL) |
#define ISTGT_LU_MAX_WRITE_CACHE_SIZE (8ULL * 1024ULL * 1024ULL) |
#define ISTGT_LU_MEDIA_SIZE_MIN (1ULL * 1024ULL * 1024ULL) |
#define ISTGT_LU_MEDIA_SIZE_MIN (1ULL * 1024ULL * 1024ULL) |
#define ISTGT_LU_MEDIA_EXTEND_UNIT (256ULL * 1024ULL * 1024ULL) |
#define ISTGT_LU_MEDIA_EXTEND_UNIT (256ULL * 1024ULL * 1024ULL) |
Line 229 typedef struct istgt_lu_t {
|
Line 234 typedef struct istgt_lu_t {
|
int readonly; |
int readonly; |
int blocklen; |
int blocklen; |
int queue_depth; |
int queue_depth; |
|
int queue_check; |
|
|
int maxlun; |
int maxlun; |
ISTGT_LU_LUN lun[MAX_LU_LUN]; |
ISTGT_LU_LUN lun[MAX_LU_LUN]; |
Line 255 typedef struct istgt_lu_cmd_t {
|
Line 261 typedef struct istgt_lu_cmd_t {
|
uint8_t *cdb; |
uint8_t *cdb; |
|
|
uint8_t *iobuf; |
uint8_t *iobuf; |
int iobufsize; | size_t iobufsize; |
uint8_t *data; |
uint8_t *data; |
int data_len; | size_t data_len; |
int alloc_len; | size_t alloc_len; |
|
|
int status; |
int status; |
uint8_t *sense_data; |
uint8_t *sense_data; |
int sense_data_len; | size_t sense_data_len; |
int sense_alloc_len; | size_t sense_alloc_len; |
} ISTGT_LU_CMD; |
} ISTGT_LU_CMD; |
typedef ISTGT_LU_CMD *ISTGT_LU_CMD_Ptr; |
typedef ISTGT_LU_CMD *ISTGT_LU_CMD_Ptr; |
|
|
Line 276 enum {
|
Line 282 enum {
|
enum { |
enum { |
ISTGT_LU_TASK_RESPONSE = 0, |
ISTGT_LU_TASK_RESPONSE = 0, |
ISTGT_LU_TASK_REQPDU = 1, |
ISTGT_LU_TASK_REQPDU = 1, |
|
ISTGT_LU_TASK_REQUPDPDU = 2, |
} ISTGT_LU_TASK_TYPE; |
} ISTGT_LU_TASK_TYPE; |
|
|
typedef struct istgt_lu_task_t { |
typedef struct istgt_lu_task_t { |
Line 299 typedef struct istgt_lu_task_t {
|
Line 306 typedef struct istgt_lu_task_t {
|
uint8_t *iobuf; |
uint8_t *iobuf; |
uint8_t *data; |
uint8_t *data; |
uint8_t *sense_data; |
uint8_t *sense_data; |
|
size_t alloc_len; |
|
|
int offset; |
int offset; |
int req_execute; |
int req_execute; |
Line 310 typedef struct istgt_lu_task_t {
|
Line 318 typedef struct istgt_lu_task_t {
|
int lock; |
int lock; |
} ISTGT_LU_TASK; |
} ISTGT_LU_TASK; |
typedef ISTGT_LU_TASK *ISTGT_LU_TASK_Ptr; |
typedef ISTGT_LU_TASK *ISTGT_LU_TASK_Ptr; |
|
|
|
/* lu_disk.c */ |
|
typedef struct istgt_lu_pr_key_t { |
|
uint64_t key; |
|
|
|
/* transport IDs */ |
|
char *registered_initiator_port; |
|
char *registered_target_port; |
|
/* PERSISTENT RESERVE OUT received from */ |
|
int pg_idx; /* relative target port */ |
|
int pg_tag; /* target port group */ |
|
|
|
int ninitiator_ports; |
|
char **initiator_ports; |
|
int all_tpg; |
|
} ISTGT_LU_PR_KEY; |
|
|
|
typedef struct istgt_lu_disk_t { |
|
ISTGT_LU_Ptr lu; |
|
int num; |
|
int lun; |
|
|
|
int fd; |
|
const char *file; |
|
const char *disktype; |
|
void *exspec; |
|
uint64_t fsize; |
|
uint64_t foffset; |
|
uint64_t size; |
|
uint64_t blocklen; |
|
uint64_t blockcnt; |
|
|
|
#ifdef HAVE_UUID_H |
|
uuid_t uuid; |
|
#endif /* HAVE_UUID_H */ |
|
|
|
/* cache flags */ |
|
int read_cache; |
|
int write_cache; |
|
/* parts for cache */ |
|
int wbufsize; |
|
uint8_t *wbuf; |
|
uint64_t woffset; |
|
uint64_t wnbytes; |
|
int req_write_cache; |
|
int err_write_cache; |
|
|
|
/* thin provisioning */ |
|
int thin_provisioning; |
|
|
|
/* for ats */ |
|
pthread_mutex_t ats_mutex; |
|
int watssize; |
|
uint8_t *watsbuf; |
|
|
|
int queue_depth; |
|
pthread_mutex_t cmd_queue_mutex; |
|
ISTGT_QUEUE cmd_queue; |
|
pthread_mutex_t wait_lu_task_mutex; |
|
ISTGT_LU_TASK_Ptr wait_lu_task; |
|
|
|
/* PERSISTENT RESERVE */ |
|
int npr_keys; |
|
ISTGT_LU_PR_KEY pr_keys[MAX_LU_RESERVE]; |
|
uint32_t pr_generation; |
|
|
|
char *rsv_port; |
|
uint64_t rsv_key; |
|
int rsv_scope; |
|
int rsv_type; |
|
|
|
/* SCSI sense code */ |
|
volatile int sense; |
|
|
|
/* entry */ |
|
int (*open)(struct istgt_lu_disk_t *spec, int flags, int mode); |
|
int (*close)(struct istgt_lu_disk_t *spec); |
|
int64_t (*seek)(struct istgt_lu_disk_t *spec, uint64_t offset); |
|
int64_t (*read)(struct istgt_lu_disk_t *spec, void *buf, uint64_t nbytes); |
|
int64_t (*write)(struct istgt_lu_disk_t *spec, const void *buf, uint64_t nbytes); |
|
int64_t (*sync)(struct istgt_lu_disk_t *spec, uint64_t offset, uint64_t nbytes); |
|
int (*allocate)(struct istgt_lu_disk_t *spec); |
|
int (*setcache)(struct istgt_lu_disk_t *spec); |
|
} ISTGT_LU_DISK; |
|
|
#endif /* ISTGT_LU_H */ |
#endif /* ISTGT_LU_H */ |