⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 evms.h

📁 unxi下共享内存的使用
💻 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 + -