📄 nodelist.h
字号:
uint32_t mctime_ver; struct jffs2_full_dirent *fds; struct jffs2_raw_node_ref *latest_ref;};struct jffs2_full_dirent{ struct jffs2_raw_node_ref *raw; struct jffs2_full_dirent *next; uint32_t version; uint32_t ino; /* == zero for unlink */ unsigned int nhash; unsigned char type; unsigned char name[0];};/* Fragments - used to build a map of which raw node to obtain data from for each part of the ino*/struct jffs2_node_frag{ struct rb_node rb; struct jffs2_full_dnode *node; /* NULL for holes */ uint32_t size; uint32_t ofs; /* The offset to which this fragment belongs */};struct jffs2_eraseblock{ struct list_head list; int bad_count; uint32_t offset; /* of this block in the MTD */ uint32_t unchecked_size; uint32_t used_size; uint32_t dirty_size; uint32_t wasted_size; uint32_t free_size; /* Note that sector_size - free_size is the address of the first free space */ uint32_t allocated_refs; struct jffs2_raw_node_ref *first_node; struct jffs2_raw_node_ref *last_node; struct jffs2_raw_node_ref *gc_node; /* Next node to be garbage collected */};static inline int jffs2_blocks_use_vmalloc(struct jffs2_sb_info *c){ return ((c->flash_size / c->sector_size) * sizeof (struct jffs2_eraseblock)) > (128 * 1024);}#define ref_totlen(a, b, c) __jffs2_ref_totlen((a), (b), (c))#define ALLOC_NORMAL 0 /* Normal allocation */#define ALLOC_DELETION 1 /* Deletion node. Best to allow it */#define ALLOC_GC 2 /* Space requested for GC. Give it or die */#define ALLOC_NORETRY 3 /* For jffs2_write_dnode: On failure, return -EAGAIN instead of retrying *//* How much dirty space before it goes on the very_dirty_list */#define VERYDIRTY(c, size) ((size) >= ((c)->sector_size / 2))/* check if dirty space is more than 255 Byte */#define ISDIRTY(size) ((size) > sizeof (struct jffs2_raw_inode) + JFFS2_MIN_DATA_LEN)#define PAD(x) (((x)+3)&~3)static inline int jffs2_encode_dev(union jffs2_device_node *jdev, dev_t rdev){ if (old_valid_dev(rdev)) { jdev->old = cpu_to_je16(old_encode_dev(rdev)); return sizeof(jdev->old); } else { jdev->new = cpu_to_je32(new_encode_dev(rdev)); return sizeof(jdev->new); }}static inline struct jffs2_node_frag *frag_first(struct rb_root *root){ struct rb_node *node = rb_first(root); if (!node) return NULL; return rb_entry(node, struct jffs2_node_frag, rb);}static inline struct jffs2_node_frag *frag_last(struct rb_root *root){ struct rb_node *node = rb_last(root); if (!node) return NULL; return rb_entry(node, struct jffs2_node_frag, rb);}#define frag_next(frag) rb_entry(rb_next(&(frag)->rb), struct jffs2_node_frag, rb)#define frag_prev(frag) rb_entry(rb_prev(&(frag)->rb), struct jffs2_node_frag, rb)#define frag_parent(frag) rb_entry(rb_parent(&(frag)->rb), struct jffs2_node_frag, rb)#define frag_left(frag) rb_entry((frag)->rb.rb_left, struct jffs2_node_frag, rb)#define frag_right(frag) rb_entry((frag)->rb.rb_right, struct jffs2_node_frag, rb)#define frag_erase(frag, list) rb_erase(&frag->rb, list);#define tn_next(tn) rb_entry(rb_next(&(tn)->rb), struct jffs2_tmp_dnode_info, rb)#define tn_prev(tn) rb_entry(rb_prev(&(tn)->rb), struct jffs2_tmp_dnode_info, rb)#define tn_parent(tn) rb_entry(rb_parent(&(tn)->rb), struct jffs2_tmp_dnode_info, rb)#define tn_left(tn) rb_entry((tn)->rb.rb_left, struct jffs2_tmp_dnode_info, rb)#define tn_right(tn) rb_entry((tn)->rb.rb_right, struct jffs2_tmp_dnode_info, rb)#define tn_erase(tn, list) rb_erase(&tn->rb, list);#define tn_last(list) rb_entry(rb_last(list), struct jffs2_tmp_dnode_info, rb)#define tn_first(list) rb_entry(rb_first(list), struct jffs2_tmp_dnode_info, rb)/* nodelist.c */void jffs2_add_fd_to_list(struct jffs2_sb_info *c, struct jffs2_full_dirent *new, struct jffs2_full_dirent **list);void jffs2_set_inocache_state(struct jffs2_sb_info *c, struct jffs2_inode_cache *ic, int state);struct jffs2_inode_cache *jffs2_get_ino_cache(struct jffs2_sb_info *c, uint32_t ino);void jffs2_add_ino_cache (struct jffs2_sb_info *c, struct jffs2_inode_cache *new);void jffs2_del_ino_cache(struct jffs2_sb_info *c, struct jffs2_inode_cache *old);void jffs2_free_ino_caches(struct jffs2_sb_info *c);void jffs2_free_raw_node_refs(struct jffs2_sb_info *c);struct jffs2_node_frag *jffs2_lookup_node_frag(struct rb_root *fragtree, uint32_t offset);void jffs2_kill_fragtree(struct rb_root *root, struct jffs2_sb_info *c_delete);struct rb_node *rb_next(struct rb_node *);struct rb_node *rb_prev(struct rb_node *);void rb_replace_node(struct rb_node *victim, struct rb_node *new, struct rb_root *root);int jffs2_add_full_dnode_to_inode(struct jffs2_sb_info *c, struct jffs2_inode_info *f, struct jffs2_full_dnode *fn);uint32_t jffs2_truncate_fragtree (struct jffs2_sb_info *c, struct rb_root *list, uint32_t size);struct jffs2_raw_node_ref *jffs2_link_node_ref(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb, uint32_t ofs, uint32_t len, struct jffs2_inode_cache *ic);extern uint32_t __jffs2_ref_totlen(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb, struct jffs2_raw_node_ref *ref);/* nodemgmt.c */int jffs2_thread_should_wake(struct jffs2_sb_info *c);int jffs2_reserve_space(struct jffs2_sb_info *c, uint32_t minsize, uint32_t *len, int prio, uint32_t sumsize);int jffs2_reserve_space_gc(struct jffs2_sb_info *c, uint32_t minsize, uint32_t *len, uint32_t sumsize);struct jffs2_raw_node_ref *jffs2_add_physical_node_ref(struct jffs2_sb_info *c, uint32_t ofs, uint32_t len, struct jffs2_inode_cache *ic);void jffs2_complete_reservation(struct jffs2_sb_info *c);void jffs2_mark_node_obsolete(struct jffs2_sb_info *c, struct jffs2_raw_node_ref *raw);/* write.c */int jffs2_do_new_inode(struct jffs2_sb_info *c, struct jffs2_inode_info *f, uint32_t mode, struct jffs2_raw_inode *ri);struct jffs2_full_dnode *jffs2_write_dnode(struct jffs2_sb_info *c, struct jffs2_inode_info *f, struct jffs2_raw_inode *ri, const unsigned char *data, uint32_t datalen, int alloc_mode);struct jffs2_full_dirent *jffs2_write_dirent(struct jffs2_sb_info *c, struct jffs2_inode_info *f, struct jffs2_raw_dirent *rd, const unsigned char *name, uint32_t namelen, int alloc_mode);int jffs2_write_inode_range(struct jffs2_sb_info *c, struct jffs2_inode_info *f, struct jffs2_raw_inode *ri, unsigned char *buf, uint32_t offset, uint32_t writelen, uint32_t *retlen);int jffs2_do_create(struct jffs2_sb_info *c, struct jffs2_inode_info *dir_f, struct jffs2_inode_info *f, struct jffs2_raw_inode *ri, const char *name, int namelen);int jffs2_do_unlink(struct jffs2_sb_info *c, struct jffs2_inode_info *dir_f, const char *name, int namelen, struct jffs2_inode_info *dead_f, uint32_t time);int jffs2_do_link(struct jffs2_sb_info *c, struct jffs2_inode_info *dir_f, uint32_t ino, uint8_t type, const char *name, int namelen, uint32_t time);/* readinode.c */int jffs2_do_read_inode(struct jffs2_sb_info *c, struct jffs2_inode_info *f, uint32_t ino, struct jffs2_raw_inode *latest_node);int jffs2_do_crccheck_inode(struct jffs2_sb_info *c, struct jffs2_inode_cache *ic);void jffs2_do_clear_inode(struct jffs2_sb_info *c, struct jffs2_inode_info *f);/* malloc.c */int jffs2_create_slab_caches(void);void jffs2_destroy_slab_caches(void);struct jffs2_full_dirent *jffs2_alloc_full_dirent(int namesize);void jffs2_free_full_dirent(struct jffs2_full_dirent *);struct jffs2_full_dnode *jffs2_alloc_full_dnode(void);void jffs2_free_full_dnode(struct jffs2_full_dnode *);struct jffs2_raw_dirent *jffs2_alloc_raw_dirent(void);void jffs2_free_raw_dirent(struct jffs2_raw_dirent *);struct jffs2_raw_inode *jffs2_alloc_raw_inode(void);void jffs2_free_raw_inode(struct jffs2_raw_inode *);struct jffs2_tmp_dnode_info *jffs2_alloc_tmp_dnode_info(void);void jffs2_free_tmp_dnode_info(struct jffs2_tmp_dnode_info *);int jffs2_prealloc_raw_node_refs(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb, int nr);void jffs2_free_refblock(struct jffs2_raw_node_ref *);struct jffs2_node_frag *jffs2_alloc_node_frag(void);void jffs2_free_node_frag(struct jffs2_node_frag *);struct jffs2_inode_cache *jffs2_alloc_inode_cache(void);void jffs2_free_inode_cache(struct jffs2_inode_cache *);#ifdef CONFIG_JFFS2_FS_XATTRstruct jffs2_xattr_datum *jffs2_alloc_xattr_datum(void);void jffs2_free_xattr_datum(struct jffs2_xattr_datum *);struct jffs2_xattr_ref *jffs2_alloc_xattr_ref(void);void jffs2_free_xattr_ref(struct jffs2_xattr_ref *);#endif/* gc.c */int jffs2_garbage_collect_pass(struct jffs2_sb_info *c);/* read.c */int jffs2_read_dnode(struct jffs2_sb_info *c, struct jffs2_inode_info *f, struct jffs2_full_dnode *fd, unsigned char *buf, int ofs, int len);int jffs2_read_inode_range(struct jffs2_sb_info *c, struct jffs2_inode_info *f, unsigned char *buf, uint32_t offset, uint32_t len);char *jffs2_getlink(struct jffs2_sb_info *c, struct jffs2_inode_info *f);/* scan.c */int jffs2_scan_medium(struct jffs2_sb_info *c);void jffs2_rotate_lists(struct jffs2_sb_info *c);struct jffs2_inode_cache *jffs2_scan_make_ino_cache(struct jffs2_sb_info *c, uint32_t ino);int jffs2_scan_classify_jeb(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb);int jffs2_scan_dirty_space(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb, uint32_t size);/* build.c */int jffs2_do_mount_fs(struct jffs2_sb_info *c);/* erase.c */void jffs2_erase_pending_blocks(struct jffs2_sb_info *c, int count);void jffs2_free_jeb_node_refs(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb);#ifdef CONFIG_JFFS2_FS_WRITEBUFFER/* wbuf.c */int jffs2_flush_wbuf_gc(struct jffs2_sb_info *c, uint32_t ino);int jffs2_flush_wbuf_pad(struct jffs2_sb_info *c);int jffs2_check_nand_cleanmarker(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb);int jffs2_write_nand_cleanmarker(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb);#endif#include "debug.h"#endif /* __JFFS2_NODELIST_H__ */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -