version 1.1.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 51
|
Line 51
|
#include "istgt_log.h" |
#include "istgt_log.h" |
#include "istgt_conf.h" |
#include "istgt_conf.h" |
|
|
|
#if !defined(__GNUC__) |
|
#undef __attribute__ |
|
#define __attribute__(x) |
|
#endif |
|
#if defined(__GNUC__) && defined(__GNUC_MINOR__) |
|
#define ISTGT_GNUC_PREREQ(ma,mi) \ |
|
(__GNUC__ > (ma) || (__GNUC__ == (ma) && __GNUC_MINOR__ >= (mi))) |
|
#else |
|
#define ISTGT_GNUC_PREREQ(ma,mi) 0 |
|
#endif |
|
|
#define MAX_TMPBUF 1024 |
#define MAX_TMPBUF 1024 |
#define MAX_ADDRBUF 64 |
#define MAX_ADDRBUF 64 |
#define MAX_INITIATOR_ADDR (MAX_ADDRBUF) |
#define MAX_INITIATOR_ADDR (MAX_ADDRBUF) |
Line 63
|
Line 74
|
#define MAX_PORTAL 1024 |
#define MAX_PORTAL 1024 |
#define MAX_INITIATOR 256 |
#define MAX_INITIATOR 256 |
#define MAX_NETMASK 256 |
#define MAX_NETMASK 256 |
|
#define MAX_PORTAL_GROUP 4096 |
#define MAX_INITIATOR_GROUP 4096 |
#define MAX_INITIATOR_GROUP 4096 |
#define MAX_LOGICAL_UNIT 4096 |
#define MAX_LOGICAL_UNIT 4096 |
#define MAX_R2T 256 |
#define MAX_R2T 256 |
Line 77
|
Line 89
|
#define DEFAULT_MEDIADIRECTORY BUILD_VAR_ISTGT |
#define DEFAULT_MEDIADIRECTORY BUILD_VAR_ISTGT |
#define DEFAULT_NODEBASE "iqn.2007-09.jp.ne.peach.istgt" |
#define DEFAULT_NODEBASE "iqn.2007-09.jp.ne.peach.istgt" |
#define DEFAULT_PORT 3260 |
#define DEFAULT_PORT 3260 |
#define DEFAULT_MAX_SESSIONS 16 | #define DEFAULT_MAX_SESSIONS 32 |
#define DEFAULT_MAX_CONNECTIONS 4 |
#define DEFAULT_MAX_CONNECTIONS 4 |
#define DEFAULT_MAXOUTSTANDINGR2T 16 |
#define DEFAULT_MAXOUTSTANDINGR2T 16 |
#define DEFAULT_DEFAULTTIME2WAIT 2 |
#define DEFAULT_DEFAULTTIME2WAIT 2 |
Line 90
|
Line 102
|
#define DEFAULT_DATAPDUINORDER 1 |
#define DEFAULT_DATAPDUINORDER 1 |
#define DEFAULT_DATASEQUENCEINORDER 1 |
#define DEFAULT_DATASEQUENCEINORDER 1 |
#define DEFAULT_ERRORRECOVERYLEVEL 0 |
#define DEFAULT_ERRORRECOVERYLEVEL 0 |
#define DEFAULT_TIMEOUT 30 | #define DEFAULT_TIMEOUT 60 |
#define DEFAULT_NOPININTERVAL 20 |
#define DEFAULT_NOPININTERVAL 20 |
#define DEFAULT_MAXR2T 16 |
#define DEFAULT_MAXR2T 16 |
|
|
#define ISTGT_PG_TAG_MAX 0x0000ffffU | #define ISTGT_PG_TAG_MAX 0x0000ffff |
#define ISTGT_LU_TAG_MAX 0x0000ffffU | #define ISTGT_LU_TAG_MAX 0x0000ffff |
#define ISTGT_UC_TAG 0x00010000U | #define ISTGT_UC_TAG 0x00010000 |
#define ISTGT_IOBUFSIZE (2 * 1024 * 1024) |
#define ISTGT_IOBUFSIZE (2 * 1024 * 1024) |
#define ISTGT_SNSBUFSIZE 4096 |
#define ISTGT_SNSBUFSIZE 4096 |
#define ISTGT_SHORTDATASIZE 8192 |
#define ISTGT_SHORTDATASIZE 8192 |
Line 115
|
Line 127
|
#endif |
#endif |
#if defined (__FreeBSD__) || defined (__NetBSD__) || defined (__OpenBSD__) |
#if defined (__FreeBSD__) || defined (__NetBSD__) || defined (__OpenBSD__) |
#define ISTGT_USE_KQUEUE |
#define ISTGT_USE_KQUEUE |
|
#if defined (__FreeBSD__) |
|
#define ISTGT_EV_SET(kevp,a,b,c,d,e,f) EV_SET((kevp),(a),(b),(c),(d),(e),(void *)(f)) |
|
#elif defined (__NetBSD__) |
|
#define ISTGT_EV_SET(kevp,a,b,c,d,e,f) EV_SET((kevp),(a),(b),(c),(d),(e),(intptr_t)(f)) |
|
#else |
|
#define ISTGT_EV_SET(kevp,a,b,c,d,e,f) EV_SET((kevp),(a),(b),(c),(d),(e),(f)) |
#endif |
#endif |
|
#endif |
|
|
#define MTX_LOCK(MTX) \ |
#define MTX_LOCK(MTX) \ |
do { \ |
do { \ |
Line 150 typedef struct istgt_portal_t {
|
Line 169 typedef struct istgt_portal_t {
|
char *label; |
char *label; |
char *host; |
char *host; |
char *port; |
char *port; |
|
int ref; |
int idx; |
int idx; |
int tag; |
int tag; |
int sock; |
int sock; |
} PORTAL; |
} PORTAL; |
typedef PORTAL *PORTAL_Ptr; |
typedef PORTAL *PORTAL_Ptr; |
|
|
|
typedef struct istgt_portal_group_t { |
|
int nportals; |
|
PORTAL **portals; |
|
int ref; |
|
int idx; |
|
int tag; |
|
} PORTAL_GROUP; |
|
typedef PORTAL_GROUP *PORTAL_GROUP_Ptr; |
|
|
typedef struct istgt_initiator_group_t { |
typedef struct istgt_initiator_group_t { |
int ninitiators; |
int ninitiators; |
char **initiators; |
char **initiators; |
int nnetmasks; |
int nnetmasks; |
char **netmasks; |
char **netmasks; |
|
int ref; |
int idx; |
int idx; |
int tag; |
int tag; |
} INITIATOR_GROUP; |
} INITIATOR_GROUP; |
Line 183 typedef enum {
|
Line 213 typedef enum {
|
|
|
typedef struct istgt_t { |
typedef struct istgt_t { |
CONFIG *config; |
CONFIG *config; |
|
CONFIG *config_old; |
char *pidfile; |
char *pidfile; |
char *authfile; |
char *authfile; |
#if 0 |
#if 0 |
Line 193 typedef struct istgt_t {
|
Line 224 typedef struct istgt_t {
|
char *nodebase; |
char *nodebase; |
|
|
pthread_attr_t attr; |
pthread_attr_t attr; |
|
pthread_mutexattr_t mutex_attr; |
pthread_mutex_t mutex; |
pthread_mutex_t mutex; |
|
pthread_mutex_t state_mutex; |
|
pthread_mutex_t reload_mutex; |
|
pthread_cond_t reload_cond; |
|
|
ISTGT_STATE state; |
ISTGT_STATE state; |
ISTGT_SWMODE swmode; |
ISTGT_SWMODE swmode; |
|
uint32_t generation; |
|
int sig_pipe[2]; |
|
int daemon; |
|
int pg_reload; |
|
|
int nuctl_portal; |
int nuctl_portal; |
PORTAL uctl_portal[MAX_UCPORTAL]; |
PORTAL uctl_portal[MAX_UCPORTAL]; |
int nuctl_netmasks; |
int nuctl_netmasks; |
char **uctl_netmasks; |
char **uctl_netmasks; |
|
|
int nportal; | int nportal_group; |
PORTAL portal[MAX_PORTAL]; | PORTAL_GROUP portal_group[MAX_PORTAL_GROUP]; |
int ninitiator_group; |
int ninitiator_group; |
INITIATOR_GROUP initiator_group[MAX_INITIATOR_GROUP]; |
INITIATOR_GROUP initiator_group[MAX_INITIATOR_GROUP]; |
int nlogical_unit; |
int nlogical_unit; |
Line 245 int istgt_get_nintval(CF_SECTION *sp, const char *key,
|
Line 284 int istgt_get_nintval(CF_SECTION *sp, const char *key,
|
int istgt_get_intval(CF_SECTION *sp, const char *key); |
int istgt_get_intval(CF_SECTION *sp, const char *key); |
|
|
#ifdef USE_ATOMIC |
#ifdef USE_ATOMIC |
static inline int | static inline __attribute__((__always_inline__)) int |
istgt_get_state(ISTGT_Ptr istgt) |
istgt_get_state(ISTGT_Ptr istgt) |
{ |
{ |
ISTGT_STATE state; |
ISTGT_STATE state; |
Line 258 istgt_get_state(ISTGT_Ptr istgt)
|
Line 297 istgt_get_state(ISTGT_Ptr istgt)
|
#endif |
#endif |
return state; |
return state; |
} |
} |
static inline void | static inline __attribute__((__always_inline__)) void |
istgt_set_state(ISTGT_Ptr istgt, ISTGT_STATE state) |
istgt_set_state(ISTGT_Ptr istgt, ISTGT_STATE state) |
{ |
{ |
#if defined HAVE_ATOMIC_STORE_REL_INT |
#if defined HAVE_ATOMIC_STORE_REL_INT |
Line 272 istgt_set_state(ISTGT_Ptr istgt, ISTGT_STATE state)
|
Line 311 istgt_set_state(ISTGT_Ptr istgt, ISTGT_STATE state)
|
#error "no atomic operation" |
#error "no atomic operation" |
#endif |
#endif |
} |
} |
#else | #elif defined (USE_GCC_ATOMIC) |
static inline int | /* gcc >= 4.1 builtin functions */ |
| static inline __attribute__((__always_inline__)) int |
istgt_get_state(ISTGT_Ptr istgt) |
istgt_get_state(ISTGT_Ptr istgt) |
{ |
{ |
ISTGT_STATE state; |
ISTGT_STATE state; |
MTX_LOCK(&istgt->mutex); | state = __sync_fetch_and_add((unsigned int *)&istgt->state, 0); |
| return state; |
| } |
| static inline __attribute__((__always_inline__)) void |
| istgt_set_state(ISTGT_Ptr istgt, ISTGT_STATE state) |
| { |
| ISTGT_STATE state_old; |
| do { |
| state_old = __sync_fetch_and_add((unsigned int *)&istgt->state, 0); |
| } while (__sync_val_compare_and_swap((unsigned int *)&istgt->state, |
| state_old, state) != state_old); |
| #if defined (HAVE_GCC_ATOMIC_SYNCHRONIZE) |
| __sync_synchronize(); |
| #endif |
| } |
| #else /* !USE_ATOMIC && !USE_GCC_ATOMIC */ |
| static inline __attribute__((__always_inline__)) int |
| istgt_get_state(ISTGT_Ptr istgt) |
| { |
| ISTGT_STATE state; |
| MTX_LOCK(&istgt->state_mutex); |
state = istgt->state; |
state = istgt->state; |
MTX_UNLOCK(&istgt->mutex); | MTX_UNLOCK(&istgt->state_mutex); |
return state; |
return state; |
} |
} |
|
|
static inline void | static inline __attribute__((__always_inline__)) void |
istgt_set_state(ISTGT_Ptr istgt, ISTGT_STATE state) |
istgt_set_state(ISTGT_Ptr istgt, ISTGT_STATE state) |
{ |
{ |
MTX_LOCK(&istgt->mutex); | MTX_LOCK(&istgt->state_mutex); |
istgt->state = state; |
istgt->state = state; |
MTX_UNLOCK(&istgt->mutex); | MTX_UNLOCK(&istgt->state_mutex); |
} |
} |
#endif /* USE_ATOMIC */ |
#endif /* USE_ATOMIC */ |
|
|