dasd_int.h
来自「linux-2.4.29操作系统的源码」· C头文件 代码 · 共 502 行 · 第 1/2 页
H
502 行
do { \ if (dasd_debug_area != NULL) \ debug_sprintf_exception(dasd_debug_area, \ d_level,\ d_str "\n", \ d_data); \} while(0)/* definition of dbf debug levels */#define DBF_EMERG 0 /* system is unusable */#define DBF_ALERT 1 /* action must be taken immediately */#define DBF_CRIT 2 /* critical conditions */#define DBF_ERR 3 /* error conditions */#define DBF_WARNING 4 /* warning conditions */#define DBF_NOTICE 5 /* normal but significant condition */#define DBF_INFO 6 /* informational */#define DBF_DEBUG 6 /* debug-level messages *//* messages to be written via klogd and dbf */#define DEV_MESSAGE(d_loglevel,d_device,d_string,d_args...)\do { \ int d_devno = d_device->devinfo.devno; \ int d_irq = d_device->devinfo.irq; \ char *d_name = d_device->name; \ int d_major = MAJOR(d_device->kdev); \ int d_minor = MINOR(d_device->kdev); \\ printk(d_loglevel PRINTK_HEADER \ " /dev/%-7s(%3d:%3d),%04x@%02x: " \ d_string "\n", \ d_name, \ d_major, \ d_minor, \ d_devno, \ d_irq, \ d_args); \\ DBF_DEV_EVENT(DBF_ALERT, \ d_device, \ d_string, \ d_args); \} while(0)/* general messages to be written via klogd and dbf */#define MESSAGE(d_loglevel,d_string,d_args...)\do { \ printk(d_loglevel PRINTK_HEADER \ " " d_string "\n", \ d_args); \\ DBF_EVENT(DBF_ALERT, \ d_string, \ d_args); \} while(0)/* general messages to be written via klogd only */#define MESSAGE_LOG(d_loglevel,d_string,d_args...)\do { \ printk(d_loglevel PRINTK_HEADER \ " " d_string "\n", \ d_args); \} while(0)struct dasd_device_t;struct request;/******************************************************************************** * SECTION: signatures for the functions of dasd_discipline_t * make typecasts much easier ********************************************************************************/typedef int (*dasd_ck_id_fn_t) (s390_dev_info_t *);typedef int (*dasd_ck_characteristics_fn_t) (struct dasd_device_t *);typedef int (*dasd_fill_geometry_fn_t) (struct dasd_device_t *, struct hd_geometry *);typedef int (*dasd_do_analysis_fn_t) (struct dasd_device_t *);typedef int (*dasd_io_starter_fn_t) (ccw_req_t *);typedef int (*dasd_io_stopper_fn_t) (ccw_req_t *);typedef int (*dasd_info_fn_t) (struct dasd_device_t *, dasd_information2_t *);typedef int (*dasd_use_count_fn_t) (int);typedef int (*dasd_get_attrib_fn_t) (struct dasd_device_t *, struct attrib_data_t *);typedef int (*dasd_set_attrib_fn_t) (struct dasd_device_t *, struct attrib_data_t *);typedef void (*dasd_int_handler_fn_t) (int irq, void *, struct pt_regs *);typedef void (*dasd_dump_sense_fn_t) (struct dasd_device_t *, ccw_req_t *);typedef ccw_req_t *(*dasd_format_fn_t) (struct dasd_device_t *, struct format_data_t *);typedef ccw_req_t *(*dasd_init_analysis_fn_t ) (struct dasd_device_t *);typedef ccw_req_t *(*dasd_cp_builder_fn_t) (struct dasd_device_t *, struct request *);typedef ccw_req_t *(*dasd_reserve_fn_t) (struct dasd_device_t *);typedef ccw_req_t *(*dasd_release_fn_t) (struct dasd_device_t *);typedef ccw_req_t *(*dasd_steal_lock_fn_t) (struct dasd_device_t *);typedef ccw_req_t *(*dasd_merge_cp_fn_t) (struct dasd_device_t *);typedef ccw_req_t *(*dasd_erp_action_fn_t) (ccw_req_t * cqr);typedef ccw_req_t *(*dasd_erp_postaction_fn_t) (ccw_req_t * cqr);typedef ccw_req_t *(*dasd_read_stats_fn_t) (struct dasd_device_t *);typedef dasd_rssd_perf_stats_t * (*dasd_ret_stats_fn_t) (ccw_req_t *);typedef dasd_era_t (*dasd_error_examine_fn_t) (ccw_req_t *, devstat_t * stat);typedef dasd_erp_action_fn_t (*dasd_error_analyse_fn_t) (ccw_req_t *);typedef dasd_erp_postaction_fn_t (*dasd_erp_analyse_fn_t) (ccw_req_t *);/* * the dasd_discipline_t is * sth like a table of virtual functions, if you think of dasd_eckd * inheriting dasd... * no, currently we are not planning to reimplement the driver in C++ */typedef struct dasd_discipline_t { struct module *owner; char ebcname[8]; /* a name used for tagging and printks */ char name[8]; /* a name used for tagging and printks */ int max_blocks; /* maximum number of blocks to be chained */ dasd_ck_id_fn_t id_check; /* check sense data */ dasd_ck_characteristics_fn_t check_characteristics; /* check the characteristics */ dasd_init_analysis_fn_t init_analysis; /* start the analysis of the volume */ dasd_do_analysis_fn_t do_analysis; /* complete the analysis of the volume */ dasd_fill_geometry_fn_t fill_geometry; /* set up hd_geometry */ dasd_io_starter_fn_t start_IO; dasd_io_stopper_fn_t term_IO; dasd_format_fn_t format_device; /* format the device */ dasd_error_examine_fn_t examine_error; dasd_error_analyse_fn_t erp_action; dasd_erp_analyse_fn_t erp_postaction; dasd_cp_builder_fn_t build_cp_from_req; dasd_dump_sense_fn_t dump_sense; dasd_int_handler_fn_t int_handler; dasd_reserve_fn_t reserve; dasd_release_fn_t release; dasd_steal_lock_fn_t steal_lock; dasd_merge_cp_fn_t merge_cp; dasd_info_fn_t fill_info; dasd_read_stats_fn_t read_stats; dasd_ret_stats_fn_t ret_stats; /* return performance statistics */ dasd_get_attrib_fn_t get_attrib; /* get attributes (cache operations */ dasd_set_attrib_fn_t set_attrib; /* set attributes (cache operations */ struct list_head list; /* used for list of disciplines */} dasd_discipline_t;/* dasd_range_t are used for ordering the DASD devices */typedef struct dasd_range_t { unsigned int from; /* first DASD in range */ unsigned int to; /* last DASD in range */ char discipline[4]; /* placeholder to force discipline */ int features; struct list_head list; /* next one in linked list */} dasd_range_t;#define DASD_MAJOR_INFO_REGISTERED 1#define DASD_MAJOR_INFO_IS_STATIC 2typedef struct major_info_t { struct list_head list; struct dasd_device_t **dasd_device; int flags; struct gendisk gendisk; /* actually contains the major number */} __attribute__ ((packed)) major_info_t;typedef struct dasd_device_t { s390_dev_info_t devinfo; dasd_discipline_t *discipline; int level; atomic_t open_count; kdev_t kdev; major_info_t *major_info; struct dasd_chanq_t queue; wait_queue_head_t wait_q; request_queue_t *request_queue; struct timer_list timer; /* used for start_IO */ struct timer_list late_timer; /* to get late devices online */ struct timer_list blocking_timer; /* used for ERP */ devstat_t dev_status; /* needed ONLY!! for request_irq */ dasd_sizes_t sizes; char name[16]; /* The name of the device in /dev */ char *private; /* to be used by the discipline internally */#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,3,98)) devfs_handle_t devfs_entry;#endif /* LINUX_IS_24 */ struct tq_struct bh_tq; atomic_t bh_scheduled; debug_info_t *debug_area; dasd_profile_info_t profile; ccw_req_t *init_cqr; atomic_t plugged; int stopped; /* device (do_IO) was stopped */ struct list_head lowmem_pool;} dasd_device_t;/* reasons why device (do_IO) was stopped */#define DASD_STOPPED_NOT_ACC 1 /* not accessible */#define DASD_STOPPED_PENDING 2 /* long busy */int dasd_init (void);void dasd_discipline_add (dasd_discipline_t *);void dasd_discipline_del (dasd_discipline_t *);int dasd_start_IO (ccw_req_t *);int dasd_term_IO (ccw_req_t *);void dasd_int_handler (int , void *, struct pt_regs *);void dasd_free_request (ccw_req_t *, dasd_device_t *);int dasd_oper_handler (int irq, devreg_t * devreg);void dasd_schedule_bh (dasd_device_t *);void dasd_schedule_bh_timed (unsigned long);int dasd_sleep_on_req (ccw_req_t*);int dasd_set_normalized_cda (ccw1_t * cp, unsigned long address, ccw_req_t* request, dasd_device_t* device );ccw_req_t * dasd_default_erp_action (ccw_req_t *);ccw_req_t * dasd_default_erp_postaction (ccw_req_t *);inline void dasd_chanq_deq (dasd_chanq_t *, ccw_req_t *);inline void dasd_chanq_enq (dasd_chanq_t *, ccw_req_t *);inline void dasd_chanq_enq_head (dasd_chanq_t *, ccw_req_t *);ccw_req_t * dasd_alloc_request (char *, int, int, dasd_device_t *);dasd_device_t * dasd_device_from_kdev (kdev_t kdev);extern debug_info_t *dasd_debug_area;extern int (*genhd_dasd_name) (char *, int, int, struct gendisk *);extern int (*genhd_dasd_ioctl) (struct inode *inp, struct file *filp, unsigned int no, unsigned long data);#endif /* __KERNEL__ */#endif /* DASD_H *//* * Overrides for Emacs so that we follow Linus's tabbing style. * Emacs will notice this stuff at the end of the file and automatically * adjust the settings for this buffer only. This must remain at the end * of the file. * --------------------------------------------------------------------------- * Local variables: * c-indent-level: 4 * c-brace-imaginary-offset: 0 * c-brace-offset: -4 * c-argdecl-indent: 4 * c-label-offset: -4 * c-continued-statement-offset: 4 * c-continued-brace-offset: 0 * indent-tabs-mode: nil * tab-width: 8 * End: */
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?