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

📄 ubi.h

📁 基于linux-2.6.28的mtd驱动
💻 H
📖 第 1 页 / 共 2 页
字号:
 * @peb_count: count of physical eraseblocks on the MTD device * @peb_size: physical eraseblock size * @bad_peb_count: count of bad physical eraseblocks * @good_peb_count: count of good physical eraseblocks * @min_io_size: minimal input/output unit size of the underlying MTD device * @hdrs_min_io_size: minimal I/O unit size used for VID and EC headers * @ro_mode: if the UBI device is in read-only mode * @leb_size: logical eraseblock size * @leb_start: starting offset of logical eraseblocks within physical *             eraseblocks * @ec_hdr_alsize: size of the EC header aligned to @hdrs_min_io_size * @vid_hdr_alsize: size of the VID header aligned to @hdrs_min_io_size * @vid_hdr_offset: starting offset of the volume identifier header (might be *                  unaligned) * @vid_hdr_aloffset: starting offset of the VID header aligned to * @hdrs_min_io_size * @vid_hdr_shift: contains @vid_hdr_offset - @vid_hdr_aloffset * @bad_allowed: whether the MTD device admits of bad physical eraseblocks or *               not * @mtd: MTD device descriptor * * @peb_buf1: a buffer of PEB size used for different purposes * @peb_buf2: another buffer of PEB size used for different purposes * @buf_mutex: proptects @peb_buf1 and @peb_buf2 * @ckvol_mutex: serializes static volume checking when opening * @mult_mutex: serializes operations on multiple volumes, like re-nameing * @dbg_peb_buf: buffer of PEB size used for debugging * @dbg_buf_mutex: proptects @dbg_peb_buf */struct ubi_device {	struct cdev cdev;	struct device dev;	int ubi_num;	char ubi_name[sizeof(UBI_NAME_STR)+5];	int vol_count;	struct ubi_volume *volumes[UBI_MAX_VOLUMES+UBI_INT_VOL_COUNT];	spinlock_t volumes_lock;	int ref_count;	int rsvd_pebs;	int avail_pebs;	int beb_rsvd_pebs;	int beb_rsvd_level;	int autoresize_vol_id;	int vtbl_slots;	int vtbl_size;	struct ubi_vtbl_record *vtbl;	struct mutex volumes_mutex;	int max_ec;	/* Note, mean_ec is not updated run-time - should be fixed */	int mean_ec;	/* EBA sub-system's stuff */	unsigned long long global_sqnum;	spinlock_t ltree_lock;	struct rb_root ltree;	struct mutex alc_mutex;	/* Wear-leveling sub-system's stuff */	struct rb_root used;	struct rb_root free;	struct rb_root scrub;	struct {		struct rb_root pnum;		struct rb_root aec;	} prot;	spinlock_t wl_lock;	struct mutex move_mutex;	struct rw_semaphore work_sem;	int wl_scheduled;	struct ubi_wl_entry **lookuptbl;	unsigned long long abs_ec;	struct ubi_wl_entry *move_from;	struct ubi_wl_entry *move_to;	int move_to_put;	struct list_head works;	int works_count;	struct task_struct *bgt_thread;	int thread_enabled;	char bgt_name[sizeof(UBI_BGT_NAME_PATTERN)+2];	/* I/O sub-system's stuff */	long long flash_size;	int peb_count;	int peb_size;	int bad_peb_count;	int good_peb_count;	int min_io_size;	int hdrs_min_io_size;	int ro_mode;	int leb_size;	int leb_start;	int ec_hdr_alsize;	int vid_hdr_alsize;	int vid_hdr_offset;	int vid_hdr_aloffset;	int vid_hdr_shift;	int bad_allowed;	struct mtd_info *mtd;	void *peb_buf1;	void *peb_buf2;	struct mutex buf_mutex;	struct mutex ckvol_mutex;	struct mutex mult_mutex;#ifdef CONFIG_MTD_UBI_DEBUG	void *dbg_peb_buf;	struct mutex dbg_buf_mutex;#endif};extern struct kmem_cache *ubi_wl_entry_slab;extern struct file_operations ubi_ctrl_cdev_operations;extern struct file_operations ubi_cdev_operations;extern struct file_operations ubi_vol_cdev_operations;extern struct class *ubi_class;extern struct mutex ubi_devices_mutex;/* vtbl.c */int ubi_change_vtbl_record(struct ubi_device *ubi, int idx,			   struct ubi_vtbl_record *vtbl_rec);int ubi_vtbl_rename_volumes(struct ubi_device *ubi,			    struct list_head *rename_list);int ubi_read_volume_table(struct ubi_device *ubi, struct ubi_scan_info *si);/* vmt.c */int ubi_create_volume(struct ubi_device *ubi, struct ubi_mkvol_req *req);int ubi_remove_volume(struct ubi_volume_desc *desc, int no_vtbl);int ubi_resize_volume(struct ubi_volume_desc *desc, int reserved_pebs);int ubi_rename_volumes(struct ubi_device *ubi, struct list_head *rename_list);int ubi_add_volume(struct ubi_device *ubi, struct ubi_volume *vol);void ubi_free_volume(struct ubi_device *ubi, struct ubi_volume *vol);/* upd.c */int ubi_start_update(struct ubi_device *ubi, struct ubi_volume *vol,		     long long bytes);int ubi_more_update_data(struct ubi_device *ubi, struct ubi_volume *vol,			 const void __user *buf, int count);int ubi_start_leb_change(struct ubi_device *ubi, struct ubi_volume *vol,			 const struct ubi_leb_change_req *req);int ubi_more_leb_change_data(struct ubi_device *ubi, struct ubi_volume *vol,			     const void __user *buf, int count);/* misc.c */int ubi_calc_data_len(const struct ubi_device *ubi, const void *buf,		      int length);int ubi_check_volume(struct ubi_device *ubi, int vol_id);void ubi_calculate_reserved(struct ubi_device *ubi);/* gluebi.c */#ifdef CONFIG_MTD_UBI_GLUEBIint ubi_create_gluebi(struct ubi_device *ubi, struct ubi_volume *vol);int ubi_destroy_gluebi(struct ubi_volume *vol);void ubi_gluebi_updated(struct ubi_volume *vol);#else#define ubi_create_gluebi(ubi, vol) 0#define ubi_destroy_gluebi(vol) 0#define ubi_gluebi_updated(vol)#endif/* eba.c */int ubi_eba_unmap_leb(struct ubi_device *ubi, struct ubi_volume *vol,		      int lnum);int ubi_eba_read_leb(struct ubi_device *ubi, struct ubi_volume *vol, int lnum,		     void *buf, int offset, int len, int check);int ubi_eba_write_leb(struct ubi_device *ubi, struct ubi_volume *vol, int lnum,		      const void *buf, int offset, int len, int dtype);int ubi_eba_write_leb_st(struct ubi_device *ubi, struct ubi_volume *vol,			 int lnum, const void *buf, int len, int dtype,			 int used_ebs);int ubi_eba_atomic_leb_change(struct ubi_device *ubi, struct ubi_volume *vol,			      int lnum, const void *buf, int len, int dtype);int ubi_eba_copy_leb(struct ubi_device *ubi, int from, int to,		     struct ubi_vid_hdr *vid_hdr);int ubi_eba_init_scan(struct ubi_device *ubi, struct ubi_scan_info *si);/* wl.c */int ubi_wl_get_peb(struct ubi_device *ubi, int dtype);int ubi_wl_put_peb(struct ubi_device *ubi, int pnum, int torture);int ubi_wl_flush(struct ubi_device *ubi);int ubi_wl_scrub_peb(struct ubi_device *ubi, int pnum);int ubi_wl_init_scan(struct ubi_device *ubi, struct ubi_scan_info *si);void ubi_wl_close(struct ubi_device *ubi);int ubi_thread(void *u);/* io.c */int ubi_io_read(const struct ubi_device *ubi, void *buf, int pnum, int offset,		int len);int ubi_io_write(struct ubi_device *ubi, const void *buf, int pnum, int offset,		 int len);int ubi_io_sync_erase(struct ubi_device *ubi, int pnum, int torture);int ubi_io_is_bad(const struct ubi_device *ubi, int pnum);int ubi_io_mark_bad(const struct ubi_device *ubi, int pnum);int ubi_io_read_ec_hdr(struct ubi_device *ubi, int pnum,		       struct ubi_ec_hdr *ec_hdr, int verbose);int ubi_io_write_ec_hdr(struct ubi_device *ubi, int pnum,			struct ubi_ec_hdr *ec_hdr);int ubi_io_read_vid_hdr(struct ubi_device *ubi, int pnum,			struct ubi_vid_hdr *vid_hdr, int verbose);int ubi_io_write_vid_hdr(struct ubi_device *ubi, int pnum,			 struct ubi_vid_hdr *vid_hdr);/* build.c */int ubi_attach_mtd_dev(struct mtd_info *mtd, int ubi_num, int vid_hdr_offset);int ubi_detach_mtd_dev(int ubi_num, int anyway);struct ubi_device *ubi_get_device(int ubi_num);void ubi_put_device(struct ubi_device *ubi);struct ubi_device *ubi_get_by_major(int major);int ubi_major2num(int major);/* * ubi_rb_for_each_entry - walk an RB-tree. * @rb: a pointer to type 'struct rb_node' to to use as a loop counter * @pos: a pointer to RB-tree entry type to use as a loop counter * @root: RB-tree's root * @member: the name of the 'struct rb_node' within the RB-tree entry */#define ubi_rb_for_each_entry(rb, pos, root, member)                         \	for (rb = rb_first(root),                                            \	     pos = (rb ? container_of(rb, typeof(*pos), member) : NULL);     \	     rb;                                                             \	     rb = rb_next(rb), pos = container_of(rb, typeof(*pos), member))/** * ubi_zalloc_vid_hdr - allocate a volume identifier header object. * @ubi: UBI device description object * @gfp_flags: GFP flags to allocate with * * This function returns a pointer to the newly allocated and zero-filled * volume identifier header object in case of success and %NULL in case of * failure. */static inline struct ubi_vid_hdr *ubi_zalloc_vid_hdr(const struct ubi_device *ubi, gfp_t gfp_flags){	void *vid_hdr;	vid_hdr = kzalloc(ubi->vid_hdr_alsize, gfp_flags);	if (!vid_hdr)		return NULL;	/*	 * VID headers may be stored at un-aligned flash offsets, so we shift	 * the pointer.	 */	return vid_hdr + ubi->vid_hdr_shift;}/** * ubi_free_vid_hdr - free a volume identifier header object. * @ubi: UBI device description object * @vid_hdr: the object to free */static inline void ubi_free_vid_hdr(const struct ubi_device *ubi,				    struct ubi_vid_hdr *vid_hdr){	void *p = vid_hdr;	if (!p)		return;	kfree(p - ubi->vid_hdr_shift);}/* * This function is equivalent to 'ubi_io_read()', but @offset is relative to * the beginning of the logical eraseblock, not to the beginning of the * physical eraseblock. */static inline int ubi_io_read_data(const struct ubi_device *ubi, void *buf,				   int pnum, int offset, int len){	ubi_assert(offset >= 0);	return ubi_io_read(ubi, buf, pnum, offset + ubi->leb_start, len);}/* * This function is equivalent to 'ubi_io_write()', but @offset is relative to * the beginning of the logical eraseblock, not to the beginning of the * physical eraseblock. */static inline int ubi_io_write_data(struct ubi_device *ubi, const void *buf,				    int pnum, int offset, int len){	ubi_assert(offset >= 0);	return ubi_io_write(ubi, buf, pnum, offset + ubi->leb_start, len);}/** * ubi_ro_mode - switch to read-only mode. * @ubi: UBI device description object */static inline void ubi_ro_mode(struct ubi_device *ubi){	if (!ubi->ro_mode) {		ubi->ro_mode = 1;		ubi_warn("switch to read-only mode");	}}/** * vol_id2idx - get table index by volume ID. * @ubi: UBI device description object * @vol_id: volume ID */static inline int vol_id2idx(const struct ubi_device *ubi, int vol_id){	if (vol_id >= UBI_INTERNAL_VOL_START)		return vol_id - UBI_INTERNAL_VOL_START + ubi->vtbl_slots;	else		return vol_id;}/** * idx2vol_id - get volume ID by table index. * @ubi: UBI device description object * @idx: table index */static inline int idx2vol_id(const struct ubi_device *ubi, int idx){	if (idx >= ubi->vtbl_slots)		return idx - ubi->vtbl_slots + UBI_INTERNAL_VOL_START;	else		return idx;}#endif /* !__UBI_UBI_H__ */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -