📄 evms.h
字号:
/* -*- linux-c -*- *//* * * Copyright (c) International Business Machines Corp., 2000 * * 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; either version 2 of the License, or * (at your option) any later version. * * 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. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *//* * linux/include/linux/evms/evms.h * * EVMS public kernel header file * */#ifndef __EVMS_INCLUDED__#define __EVMS_INCLUDED__#include <linux/genhd.h>#include <linux/fs.h>#include <linux/iobuf.h>#include <linux/kdev_t.h>#include <linux/hdreg.h>#include <linux/slab.h>#include <linux/proc_fs.h>#define FALSE 0#define TRUE 1/* tracing info */#define EVMS_INFO_CRITICAL 0#define EVMS_INFO_SERIOUS 1#define EVMS_INFO_ERROR 2#define EVMS_INFO_WARNING 3#define EVMS_INFO_DEFAULT 5#define EVMS_INFO_DETAILS 6#define EVMS_INFO_DEBUG 7#define EVMS_INFO_EXTRA 8#define EVMS_INFO_ENTRY_EXIT 9#define EVMS_INFO_EVERYTHING 10extern int evms_info_level;/* information message: e.g., configuration, major event */#define evmsTRACE(info_level,prspec) { if (evms_info_level >= info_level) printk prspec; }#define evmsTRACE2(info_level,statement) { if (evms_info_level >= info_level) statement; }// sample - be sure to use enclose "prspec" or "statement" with parens ()// evmsTRACE(info_level,(KERN_INFO "evms_myfunction: name = %s\n", name));// evmsTRACE2(info_level,(print_mem( buffer_address, buffer_length))); /* LOG MACROS to make evms log messages look much * cleaner in the source. */#define EVMS_LOG_PREFIX "evms: "#define LOG_CRITICAL(msg, args...) evmsTRACE(EVMS_INFO_CRITICAL, (KERN_CRIT EVMS_LOG_PREFIX LOG_PREFIX msg, ## args))#define LOG_SERIOUS(msg, args...) evmsTRACE(EVMS_INFO_SERIOUS, (KERN_ERR EVMS_LOG_PREFIX LOG_PREFIX msg, ## args))#define LOG_ERROR(msg, args...) evmsTRACE(EVMS_INFO_ERROR, (KERN_ERR EVMS_LOG_PREFIX LOG_PREFIX msg, ## args))#define LOG_WARNING(msg, args...) evmsTRACE(EVMS_INFO_WARNING, (KERN_WARNING EVMS_LOG_PREFIX LOG_PREFIX msg, ## args))#define LOG_DEFAULT(msg, args...) evmsTRACE(EVMS_INFO_DEFAULT, (KERN_INFO EVMS_LOG_PREFIX LOG_PREFIX msg, ## args))#define LOG_DETAILS(msg, args...) evmsTRACE(EVMS_INFO_DETAILS, (KERN_INFO EVMS_LOG_PREFIX LOG_PREFIX msg, ## args))#define LOG_DEBUG(msg, args...) evmsTRACE(EVMS_INFO_DEBUG, (KERN_INFO EVMS_LOG_PREFIX LOG_PREFIX msg, ## args))#define LOG_EXTRA(msg, args...) evmsTRACE(EVMS_INFO_EXTRA, (KERN_INFO EVMS_LOG_PREFIX LOG_PREFIX msg, ## args))#define LOG_ENTRY_EXIT(msg, args...) evmsTRACE(EVMS_INFO_ENTRY_EXIT, (KERN_INFO EVMS_LOG_PREFIX LOG_PREFIX msg, ## args))#define LOG_EVERYTHING(msg, args...) evmsTRACE(EVMS_INFO_EVERYTHING, (KERN_INFO EVMS_LOG_PREFIX LOG_PREFIX msg, ## args))#ifdef CONFIG_PROC_FS#define PROCPRINT(msg, args...) (sz += sprintf(page + sz, msg, ## args))#endif#define EVMS_HANDLE_KEY 0x89ABCDEF/* Plugin structure definitions */typedef struct evms_plugin_header_s { u_int32_t id; evms_version_t version; evms_version_t required_common_services_version; struct evms_plugin_function_table_s *function_table;} evms_plugin_header_t;typedef struct evms_volume_info_s {/* 0*/ u_int64_t volume_serial_number;/* 8*/ u_int32_t volume_system_id; /* the minor is stored here *//* 12*/ char volume_name[EVMS_VOLUME_NAME_SIZE+1];/*140*/} evms_volume_info_t;/* flags field bit definitions in evms_common.h *//* iflags field used internally by the kernel only */#define EVMS_FEATURE_BOTTOM (1<<0)typedef struct evms_logical_node_s {/* 0*/ evms_sector_t total_vsectors;/* 8*/ evms_plugin_header_t * plugin;/* 12*/ void * instance_data; /* ptr to private instance data *//* 16*/ unsigned int flags;/* 20*/ unsigned int iflags;/* 24*/ int hardsector_size;/* 28*/ int block_size;/* 32*/ unsigned int system_id;/* 36*/ evms_volume_info_t * volume_info;/* 40*/ evms_feature_header_t * feature_header;/* 44*/ struct evms_logical_node_s * next;/* 48*/ char name[EVMS_VOLUME_NAME_SIZE+1];/*176*/} evms_logical_node_t;/* this macro will retrieve the appropriate kernel node name * based on the node type. */#define EVMS_GET_NODE_NAME(node) \ ((node->flags & EVMS_VOLUME_FLAG) ? \ node->volume_info->volume_name : \ node->name)/* bit definitions of FLAGS field in logical volume struct *//* NOTE: these bit field definitions can be found in * evms_ioctl.h above the evms_volume_data_t structure */typedef struct evms_logical_volume_s { char * name; /* devfs name if any */ evms_logical_node_t * node; /* ptr to top logical node */ int flags; int quiesced; int vfs_quiesced; atomic_t requests_in_progress; wait_queue_head_t wait_queue; devfs_handle_t devfs_handle;#ifdef CONFIG_SMP request_queue_t request_queue;#endif} evms_logical_volume_t;/* EVMS generic I/O structure */typedef struct eio_s { evms_sector_t rsector; evms_sector_t rsize; struct buffer_head *bh;} eio_t;/* Abstraction MACROs */#define EVMS_IO_ERROR(eio) (buffer_IO_error(eio->bh))/* * The following function table is used for all plugins. */typedef struct evms_plugin_function_table_s { int (* discover)(evms_logical_node_t **); int (* end_discover)(evms_logical_node_t **); int (* delete) (evms_logical_node_t *); void (* read) (evms_logical_node_t *, eio_t *); void (* write) (evms_logical_node_t *, eio_t *); int (* init_io) (evms_logical_node_t *, int, evms_sector_t, evms_sector_t, void *); int (* ioctl) (evms_logical_node_t *, struct inode *, struct file *, unsigned int, unsigned long); int (* direct_ioctl)(struct inode *, struct file *, unsigned int, unsigned long);} evms_plugin_function_table_t;/* * These macros facilitate easier use of the * entry points in the function table */#define DISCOVER(node, list) ((node)->plugin->function_table->discover(list))#define END_DISCOVER(node, list) ((node)->plugin->function_table->end_discover(list))#define DELETE(node) ((node)->plugin->function_table->delete(node))#define R_IO(node, eio) ((node)->plugin->function_table->read(node, eio))#define W_IO(node, eio) ((node)->plugin->function_table->write(node, eio))#define INIT_IO(node, rw_flag, start_sec, num_secs, buf_addr) ((node)->plugin->function_table->init_io(node, rw_flag, start_sec, num_secs, buf_addr))#define INT_IO(node, rw_flag, start_sec, num_secs, buf_addr) ((node)->plugin->function_table->int_io(node, rw_flag, start_sec, num_secs, buf_addr))#define IOCTL(node, inode, file, cmd, arg) ((node)->plugin->function_table->ioctl(node, inode, file, cmd, arg))#define DIRECT_IOCTL(reg_record, inode, file, cmd, arg) ((reg_record)->plugin->function_table->direct_ioctl(inode, file, cmd, arg))typedef struct evms_list_node_s { void *item; struct evms_list_node_s *next;} evms_list_node_t;/* pool management structure */typedef struct evms_pool_mgmt_s { kmem_cache_t *cachep; int member_size; void *head; atomic_t waiters; wait_queue_head_t wait_queue; /* WARNING!!! pool name MUST be less than 20 chars */ char *name;} evms_pool_mgmt_t;/* * Notes: * All of the following kernel thread functions belong to EVMS base. * These functions were copied from md_core.c */#define EVMS_THREAD_WAKEUP 0typedef struct evms_thread_s { void (*run) (void *data); void *data; wait_queue_head_t wqueue; unsigned long flags; struct completion *event; struct task_struct *tsk; const char *name;} evms_thread_t;/* EVMS (common services) exported functions prototypes */#define EVMS_COMMON_SERVICES_MAJOR 0#define EVMS_COMMON_SERVICES_MINOR 6#define EVMS_COMMON_SERVICES_PATCHLEVEL 0void evms_cs_get_version(int *, int *);int evms_cs_check_version(evms_version_t *, evms_version_t *);int evms_cs_register_plugin(evms_plugin_header_t *);int evms_cs_unregister_plugin(evms_plugin_header_t *);#ifdef EVMS_MEM_DEBUGint evms_cs_verify_memory_integrity(int);#endifint evms_cs_allocate_memory(void **, int);int evms_cs_deallocate_memory(void *);int evms_cs_allocate_logical_node(evms_logical_node_t **);void evms_cs_deallocate_volume_info(evms_logical_node_t *);int evms_cs_deallocate_logical_node(evms_logical_node_t *);int evms_cs_add_logical_node_to_list(evms_logical_node_t **, evms_logical_node_t *);int evms_cs_remove_logical_node_from_list(evms_logical_node_t **, evms_logical_node_t *);int evms_cs_kernel_ioctl(evms_logical_node_t *, unsigned int, unsigned long);int evms_cs_get_hardsect_size(evms_logical_node_t *, int *);int evms_cs_get_blocksize_size(evms_logical_node_t *, int *);unsigned long evms_cs_size_in_sectors(unsigned long, unsigned long);unsigned long evms_cs_size_in_vsectors(long long);int evms_cs_log2(long long);u_int32_t evms_cs_calculate_crc(u_int32_t, void *, u_int32_t);int evms_cs_register_for_end_io_notification(void *, struct buffer_head *, void *callback_function);evms_pool_mgmt_t * evms_cs_create_pool( int, char *, void (*ctor)(void*, kmem_cache_t *, unsigned long), void (*dtor)(void*, kmem_cache_t *, unsigned long));#define EVMS_BLOCKABLE TRUEvoid * evms_cs_allocate_from_pool(evms_pool_mgmt_t *, int);void evms_cs_deallocate_to_pool(evms_pool_mgmt_t *, void *);void evms_cs_destroy_pool(evms_pool_mgmt_t *);int evms_cs_add_item_to_list(evms_list_node_t **, void *);int evms_cs_remove_item_from_list(evms_list_node_t **, void *);int evms_cs_register_device(evms_logical_node_t *);int evms_cs_unregister_device(evms_logical_node_t *);int evms_cs_find_next_device(evms_logical_node_t *, evms_logical_node_t **);void evms_cs_signal_event(int);evms_thread_t * evms_cs_register_thread ( void (*run) (void *), void *data, const char *name);void evms_cs_unregister_thread (evms_thread_t *thread);void evms_cs_wakeup_thread(evms_thread_t *thread);void evms_cs_interrupt_thread (evms_thread_t *thread);struct proc_dir_entry *evms_cs_get_evms_proc_dir(void);int evms_cs_volume_request_in_progress(kdev_t, int, int *);/* EVMS exported global variables */extern evms_pool_mgmt_t *evms_bh_pool;extern char *evms_primary_string;extern char *evms_secondary_string;#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -