mirror of
https://github.com/SCST-project/scst.git
synced 2026-08-29 12:17:15 +00:00
There is a regular need in the kernel to provide a way to declare
having a dynamically sized set of trailing elements in a structure.
Kernel code should always use “flexible array members”[1] for these
cases. The older style of one-element or zero-length arrays should
no longer be used[2].
This code was transformed with the help of Coccinelle:
($ spatch --jobs $(getconf _NPROCESSORS_ONLN) --sp-file script.cocci --include-headers --dir . > output.patch)
@@
identifier S, member, array;
type T1, T2;
@@
struct S {
...
T1 member;
T2 array[
- 0
];
};
[1] https://en.wikipedia.org/wiki/Flexible_array_member
[2] https://www.kernel.org/doc/html/v5.16/process/deprecated.html#zero-length-and-one-element-arrays
Link: https://github.com/KSPP/linux/issues/78
161 lines
3.9 KiB
C
161 lines
3.9 KiB
C
/*
|
|
* include/scst_event.h
|
|
*
|
|
* Copyright (C) 2014 - 2018 Western Digital Corporation
|
|
*
|
|
* Contains constants and data structures for scst_event module.
|
|
*/
|
|
|
|
#ifndef __SCST_EVENT_H
|
|
#define __SCST_EVENT_H
|
|
|
|
#ifdef __KERNEL__
|
|
#include <linux/types.h>
|
|
#endif
|
|
|
|
#ifdef INSIDE_KERNEL_TREE
|
|
#include <scst/scst_const.h>
|
|
#else
|
|
#include "scst_const.h"
|
|
#endif
|
|
|
|
#define SCST_EVENT_NAME "scst_event"
|
|
#define SCST_EVENT_PATH "/dev/"
|
|
#define SCST_EVENT_DEV SCST_EVENT_PATH SCST_EVENT_NAME
|
|
#define SCST_EVENT_VERSION_NAME SCST_VERSION_NAME
|
|
|
|
#ifndef aligned_u64
|
|
#define aligned_u64 uint64_t __attribute__((aligned(8)))
|
|
#endif
|
|
|
|
/*
|
|
* Due to variable size, this structure must always be last in any outer
|
|
* structure!
|
|
*/
|
|
struct scst_event {
|
|
int32_t payload_len;
|
|
|
|
uint32_t event_code;
|
|
|
|
uint32_t event_id; /* ID uniquely identifying this event */
|
|
|
|
/*
|
|
* Event's issuer's name, i.e. SCST name of the corresponding module
|
|
* (target driver or dev handler). SCST_EVENT_SCST_CORE_ISSUER for SCST
|
|
* core.
|
|
*/
|
|
char issuer_name[SCST_MAX_NAME];
|
|
|
|
uint8_t payload[]; /* event's payload */
|
|
};
|
|
|
|
#ifdef __KERNEL__
|
|
typedef void (*scst_event_done_notify_fn) (struct scst_event *event,
|
|
void *priv, int status);
|
|
|
|
struct scst_event_entry {
|
|
struct list_head events_list_entry;
|
|
scst_event_done_notify_fn event_notify_fn;
|
|
void *notify_fn_priv;
|
|
unsigned long event_timeout; /* in jiffies */
|
|
int *pqueued_events_cnt;
|
|
union {
|
|
struct work_struct scst_event_queue_work;
|
|
struct delayed_work event_timeout_work;
|
|
};
|
|
|
|
struct scst_event event;
|
|
/* event's payload */
|
|
};
|
|
#endif
|
|
|
|
struct scst_event_user {
|
|
int32_t max_event_size;
|
|
struct scst_event out_event;
|
|
};
|
|
|
|
struct scst_event_notify_done {
|
|
uint32_t event_id;
|
|
int status;
|
|
};
|
|
|
|
/* IOCTLs */
|
|
#define SCST_EVENT_ALLOW_EVENT _IOW('u', 1, struct scst_event)
|
|
#define SCST_EVENT_DISALLOW_EVENT _IOW('u', 2, struct scst_event)
|
|
#define SCST_EVENT_GET_NEXT_EVENT _IOWR('u', 3, struct scst_event_user)
|
|
#define SCST_EVENT_NOTIFY_DONE _IOW('u', 4, struct scst_event_notify_done)
|
|
|
|
#ifdef __KERNEL__
|
|
void scst_event_queue(uint32_t event_code, const char *issuer_name,
|
|
struct scst_event_entry *e);
|
|
#endif
|
|
|
|
/*************************************************************
|
|
** SCST events
|
|
*************************************************************/
|
|
|
|
/* SCST core issuer name */
|
|
#define SCST_EVENT_SCST_CORE_ISSUER "SCST core"
|
|
|
|
/** SCST core's events **/
|
|
|
|
#define SCST_EVENT_LUN_NOT_FOUND 1
|
|
struct scst_event_lun_not_found_payload {
|
|
aligned_u64 lun;
|
|
uint8_t initiator_name[SCST_MAX_EXTERNAL_NAME];
|
|
uint8_t target_name[SCST_MAX_EXTERNAL_NAME];
|
|
};
|
|
|
|
#define SCST_EVENT_NEGATIVE_LUNS_INQUIRY 2
|
|
struct scst_event_negative_luns_inquiry_payload {
|
|
uint8_t initiator_name[SCST_MAX_EXTERNAL_NAME];
|
|
uint8_t target_name[SCST_MAX_EXTERNAL_NAME];
|
|
};
|
|
|
|
#define SCST_EVENT_EXT_BLOCKING_DONE 3
|
|
struct scst_event_ext_blocking_done_payload {
|
|
uint8_t device_name[SCST_MAX_EXTERNAL_NAME];
|
|
uint32_t data_len;
|
|
uint8_t data[];
|
|
};
|
|
|
|
#define SCST_EVENT_TM_FN_RECEIVED 4
|
|
struct scst_event_tm_fn_received_payload {
|
|
uint32_t fn; /* TM fn */
|
|
aligned_u64 lun;
|
|
uint8_t device_name[SCST_MAX_EXTERNAL_NAME];
|
|
uint8_t initiator_name[SCST_MAX_EXTERNAL_NAME];
|
|
uint8_t target_name[SCST_MAX_EXTERNAL_NAME];
|
|
uint8_t session_sysfs_name[SCST_MAX_EXTERNAL_NAME];
|
|
struct { /* if ABORT TASK, then tag and CDB of cmd to abort */
|
|
aligned_u64 cmd_to_abort_tag;
|
|
uint8_t cdb[SCST_MAX_CDB_SIZE];
|
|
};
|
|
};
|
|
|
|
#define SCST_EVENT_STPG_USER_INVOKE 5
|
|
struct scst_event_stpg_descr {
|
|
uint16_t group_id;
|
|
/*
|
|
* Better to keep below fields as small as possible to fit
|
|
* in single page as many descriptors as possible.
|
|
*/
|
|
uint8_t prev_state[32];
|
|
uint8_t new_state[32];
|
|
uint8_t dg_name[64];
|
|
uint8_t tg_name[64];
|
|
};
|
|
struct scst_event_stpg_payload {
|
|
aligned_u64 stpg_cmd_tag;
|
|
uint8_t device_name[64];
|
|
uint16_t stpg_descriptors_cnt;
|
|
struct scst_event_stpg_descr stpg_descriptors[];
|
|
};
|
|
|
|
#define SCST_EVENT_REG_VIRT_DEV 6
|
|
struct scst_event_reg_vdev_payload {
|
|
uint8_t device_name[SCST_MAX_NAME+10];
|
|
};
|
|
|
|
#endif /* __SCST_EVENT_H */
|