blob: 6b0efdbfae3ec234e1e9f60694c248fb0a69ffd7 [file] [log] [blame]
/*
* common.h
*
* Copyright (C) 2007 - 2018 Vladislav Bolkhovitin <vst@vlnb.net>
* Copyright (C) 2007 - 2018 Western Digital Corporation
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation, version 2
* of the License.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*/
#include <stdint.h>
#include <stddef.h>
#include <stdbool.h>
#include <scst_user.h>
#include "debug.h"
#ifndef WRITE_SAME_10
#define WRITE_SAME_10 0x41
#endif
/* 8 byte ASCII Vendor */
#define VENDOR "ACTIFIO"
/* 4 byte ASCII Product Revision Level - left aligned */
#define FIO_REV "350 "
#define MAX_USN_LEN (20+1) /* For '\0' */
#define INQ_BUF_SZ 128
#define EVPD 0x01
#define CMDDT 0x02
#define NAA_ID_LEN 0x10
#define MSENSE_BUF_SZ 256
#define DBD 0x08 /* disable block descriptor */
#define WP 0x80 /* write protect */
#define DPOFUA 0x10 /* DPOFUA bit */
#define WCE 0x04 /* write cache enable */
#define PF 0x10 /* page format */
#define SP 0x01 /* save pages */
#define PS 0x80 /* parameter saveable */
#define BYTE 8
#define DEF_SECTORS 56
#define DEF_HEADS 255
struct vdisk_tgt_dev {
uint64_t sess_h;
};
struct vdisk_dev {
int scst_usr_fd;
uint32_t block_size;
uint64_t nblocks;
int block_shift;
int64_t file_size; /* in bytes */
void *(*alloc_fn)(size_t size);
pthread_mutex_t dev_mutex;
/* Below flags and are protected by dev_mutex */
unsigned int rd_only_flag:1;
unsigned int wt_flag:1;
unsigned int nv_cache:1;
unsigned int o_direct_flag:1;
unsigned int media_changed:1;
unsigned int prevent_allow_medium_removal:1;
unsigned int nullio:1;
unsigned int cdrom_empty:1;
unsigned int non_blocking:1;
#if defined(DEBUG_TM_IGNORE) || defined(DEBUG_TM_IGNORE_ALL)
unsigned int debug_tm_ignore:1;
#if defined(DEBUG_TM_IGNORE_ALL)
volatile int debug_tm_ignore_all;
#endif
#endif
struct vdisk_tgt_dev tgt_devs[64];
char *name; /* Name of virtual device,
must be <= SCSI Model + 1 */
char *file_name; /* File name */
char usn[MAX_USN_LEN];
int type;
uint8_t naa_id[NAA_ID_LEN];
};
struct vdisk_cmd
{
int fd;
struct scst_user_get_cmd *cmd;
struct vdisk_dev *dev;
unsigned int may_need_to_free_pbuf:1;
struct scst_user_reply_cmd *reply;
uint8_t sense[SCST_SENSE_BUFFERSIZE];
};
/*
* min()/max() macros that also do
* strict type-checking.. See the
* "unnecessary" pointer comparison.
*/
#define min(x, y) ({ \
typeof(x) _x = (x); \
typeof(y) _y = (y); \
(void) (&_x == &_y); \
_x < _y ? _x : _y; })
#define max(x, y) ({ \
typeof(x) _x = (x); \
typeof(y) _y = (y); \
(void) (&_x == &_y); \
_x > _y ? _x : _y; })
#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
extern int vdisk_ID;
extern bool use_multi;
uint32_t crc32buf(const char *buf, size_t len);
uint64_t gen_dev_id_num(const struct vdisk_dev *dev);
void *main_loop(void *arg);