📄 ubi.h
字号:
* @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 + -