📄 dasd_int.h
字号:
/* Device discipline stuff. */ struct dasd_discipline *discipline; char *private; /* Device state and target state. */ int state, target; int stopped; /* device (ccw_device_start) was stopped */ /* Open and reference count. */ atomic_t ref_count; atomic_t open_count; /* ccw queue and memory for static ccw/erp buffers. */ struct list_head ccw_queue; spinlock_t mem_lock; void *ccw_mem; void *erp_mem; struct list_head ccw_chunks; struct list_head erp_chunks; atomic_t tasklet_scheduled; struct tasklet_struct tasklet; struct work_struct kick_work; struct timer_list timer; debug_info_t *debug_area; struct ccw_device *cdev;#ifdef CONFIG_DASD_PROFILE struct dasd_profile_info_t profile;#endif};/* reasons why device (ccw_device_start) was stopped */#define DASD_STOPPED_NOT_ACC 1 /* not accessible */#define DASD_STOPPED_QUIESCE 2 /* Quiesced */#define DASD_STOPPED_PENDING 4 /* long busy */#define DASD_STOPPED_DC_WAIT 8 /* disconnected, wait */#define DASD_STOPPED_DC_EIO 16 /* disconnected, return -EIO *//* per device flags */#define DASD_FLAG_DSC_ERROR 2 /* return -EIO when disconnected */#define DASD_FLAG_OFFLINE 3 /* device is in offline processing */void dasd_put_device_wake(struct dasd_device *);/* * Reference count inliners */static inline voiddasd_get_device(struct dasd_device *device){ atomic_inc(&device->ref_count);}static inline voiddasd_put_device(struct dasd_device *device){ if (atomic_dec_return(&device->ref_count) == 0) dasd_put_device_wake(device);}/* * The static memory in ccw_mem and erp_mem is managed by a sorted * list of free memory chunks. */struct dasd_mchunk{ struct list_head list; unsigned long size;} __attribute__ ((aligned(8)));static inline voiddasd_init_chunklist(struct list_head *chunk_list, void *mem, unsigned long size){ struct dasd_mchunk *chunk; INIT_LIST_HEAD(chunk_list); chunk = (struct dasd_mchunk *) mem; chunk->size = size - sizeof(struct dasd_mchunk); list_add(&chunk->list, chunk_list);}static inline void *dasd_alloc_chunk(struct list_head *chunk_list, unsigned long size){ struct dasd_mchunk *chunk, *tmp; size = (size + 7L) & -8L; list_for_each_entry(chunk, chunk_list, list) { if (chunk->size < size) continue; if (chunk->size > size + sizeof(struct dasd_mchunk)) { char *endaddr = (char *) (chunk + 1) + chunk->size; tmp = (struct dasd_mchunk *) (endaddr - size) - 1; tmp->size = size; chunk->size -= size + sizeof(struct dasd_mchunk); chunk = tmp; } else list_del(&chunk->list); return (void *) (chunk + 1); } return NULL;}static inline voiddasd_free_chunk(struct list_head *chunk_list, void *mem){ struct dasd_mchunk *chunk, *tmp; struct list_head *p, *left; chunk = (struct dasd_mchunk *) ((char *) mem - sizeof(struct dasd_mchunk)); /* Find out the left neighbour in chunk_list. */ left = chunk_list; list_for_each(p, chunk_list) { if (list_entry(p, struct dasd_mchunk, list) > chunk) break; left = p; } /* Try to merge with right neighbour = next element from left. */ if (left->next != chunk_list) { tmp = list_entry(left->next, struct dasd_mchunk, list); if ((char *) (chunk + 1) + chunk->size == (char *) tmp) { list_del(&tmp->list); chunk->size += tmp->size + sizeof(struct dasd_mchunk); } } /* Try to merge with left neighbour. */ if (left != chunk_list) { tmp = list_entry(left, struct dasd_mchunk, list); if ((char *) (tmp + 1) + tmp->size == (char *) chunk) { tmp->size += chunk->size + sizeof(struct dasd_mchunk); return; } } __list_add(&chunk->list, left, left->next);}/* * Check if bsize is in { 512, 1024, 2048, 4096 } */static inline intdasd_check_blocksize(int bsize){ if (bsize < 512 || bsize > 4096 || (bsize & (bsize - 1)) != 0) return -EMEDIUMTYPE; return 0;}/* externals in dasd.c */#define DASD_PROFILE_ON 1#define DASD_PROFILE_OFF 0extern debug_info_t *dasd_debug_area;extern struct dasd_profile_info_t dasd_global_profile;extern unsigned int dasd_profile_level;extern struct block_device_operations dasd_device_operations;extern kmem_cache_t *dasd_page_cache;struct dasd_ccw_req *dasd_kmalloc_request(char *, int, int, struct dasd_device *);struct dasd_ccw_req *dasd_smalloc_request(char *, int, int, struct dasd_device *);void dasd_kfree_request(struct dasd_ccw_req *, struct dasd_device *);void dasd_sfree_request(struct dasd_ccw_req *, struct dasd_device *);static inline intdasd_kmalloc_set_cda(struct ccw1 *ccw, void *cda, struct dasd_device *device){ return set_normalized_cda(ccw, cda);}struct dasd_device *dasd_alloc_device(void);void dasd_free_device(struct dasd_device *);void dasd_enable_device(struct dasd_device *);void dasd_set_target_state(struct dasd_device *, int);void dasd_kick_device(struct dasd_device *);void dasd_add_request_head(struct dasd_ccw_req *);void dasd_add_request_tail(struct dasd_ccw_req *);int dasd_start_IO(struct dasd_ccw_req *);int dasd_term_IO(struct dasd_ccw_req *);void dasd_schedule_bh(struct dasd_device *);int dasd_sleep_on(struct dasd_ccw_req *);int dasd_sleep_on_immediatly(struct dasd_ccw_req *);int dasd_sleep_on_interruptible(struct dasd_ccw_req *);void dasd_set_timer(struct dasd_device *, int);void dasd_clear_timer(struct dasd_device *);int dasd_cancel_req(struct dasd_ccw_req *);int dasd_generic_probe (struct ccw_device *, struct dasd_discipline *);void dasd_generic_remove (struct ccw_device *cdev);int dasd_generic_set_online(struct ccw_device *, struct dasd_discipline *);int dasd_generic_set_offline (struct ccw_device *cdev);int dasd_generic_notify(struct ccw_device *, int);void dasd_generic_auto_online (struct ccw_driver *);/* externals in dasd_devmap.c */extern int dasd_max_devindex;extern int dasd_probeonly;extern int dasd_autodetect;int dasd_devmap_init(void);void dasd_devmap_exit(void);struct dasd_device *dasd_create_device(struct ccw_device *);void dasd_delete_device(struct dasd_device *);int dasd_get_feature(struct ccw_device *, int);int dasd_set_feature(struct ccw_device *, int, int);int dasd_add_sysfs_files(struct ccw_device *);void dasd_remove_sysfs_files(struct ccw_device *);struct dasd_device *dasd_device_from_cdev(struct ccw_device *);struct dasd_device *dasd_device_from_devindex(int);int dasd_parse(void);int dasd_busid_known(char *);/* externals in dasd_gendisk.c */int dasd_gendisk_init(void);void dasd_gendisk_exit(void);int dasd_gendisk_alloc(struct dasd_device *);void dasd_gendisk_free(struct dasd_device *);int dasd_scan_partitions(struct dasd_device *);void dasd_destroy_partitions(struct dasd_device *);/* externals in dasd_ioctl.c */int dasd_ioctl_init(void);void dasd_ioctl_exit(void);int dasd_ioctl_no_register(struct module *, int, dasd_ioctl_fn_t);int dasd_ioctl_no_unregister(struct module *, int, dasd_ioctl_fn_t);int dasd_ioctl(struct inode *, struct file *, unsigned int, unsigned long);/* externals in dasd_proc.c */int dasd_proc_init(void);void dasd_proc_exit(void);/* externals in dasd_erp.c */struct dasd_ccw_req *dasd_default_erp_action(struct dasd_ccw_req *);struct dasd_ccw_req *dasd_default_erp_postaction(struct dasd_ccw_req *);struct dasd_ccw_req *dasd_alloc_erp_request(char *, int, int, struct dasd_device *);void dasd_free_erp_request(struct dasd_ccw_req *, struct dasd_device *);void dasd_log_sense(struct dasd_ccw_req *, struct irb *);void dasd_log_ccw(struct dasd_ccw_req *, int, __u32);/* externals in dasd_3370_erp.c */dasd_era_t dasd_3370_erp_examine(struct dasd_ccw_req *, struct irb *);/* externals in dasd_3990_erp.c */dasd_era_t dasd_3990_erp_examine(struct dasd_ccw_req *, struct irb *);struct dasd_ccw_req *dasd_3990_erp_action(struct dasd_ccw_req *);/* externals in dasd_9336_erp.c */dasd_era_t dasd_9336_erp_examine(struct dasd_ccw_req *, struct irb *);/* externals in dasd_9336_erp.c */dasd_era_t dasd_9343_erp_examine(struct dasd_ccw_req *, struct irb *);struct dasd_ccw_req *dasd_9343_erp_action(struct dasd_ccw_req *);#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: 1 * tab-width: 8 * End: */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -