📄 nodelist.h
字号:
{ struct jffs2_raw_node_ref *ref; int i=0; printk(KERN_NOTICE); for (ref = jeb->first_node; ref; ref = ref->next_phys) { printk("%08x->", ref_offset(ref)); if (++i == 8) { i = 0; printk("\n" KERN_NOTICE); } } printk("\n");}#define ACCT_PARANOIA_CHECK(jeb) do { \ uint32_t my_used_size = 0; \ uint32_t my_unchecked_size = 0; \ struct jffs2_raw_node_ref *ref2 = jeb->first_node; \ while (ref2) { \ if (unlikely(ref2->flash_offset < jeb->offset || \ ref2->flash_offset > jeb->offset + c->sector_size)) { \ printk(KERN_NOTICE "Node %08x shouldn't be in block at %08x!\n", \ ref_offset(ref2), jeb->offset); \ paranoia_failed_dump(jeb); \ BUG(); \ } \ if (ref_flags(ref2) == REF_UNCHECKED) \ my_unchecked_size += ref_totlen(c, jeb, ref2); \ else if (!ref_obsolete(ref2)) \ my_used_size += ref_totlen(c, jeb, ref2); \ if (unlikely((!ref2->next_phys) != (ref2 == jeb->last_node))) { \ if (!ref2->next_phys) \ printk("ref for node at %p (phys %08x) has next_phys->%p (----), last_node->%p (phys %08x)\n", \ ref2, ref_offset(ref2), ref2->next_phys, \ jeb->last_node, ref_offset(jeb->last_node)); \ else \ printk("ref for node at %p (phys %08x) has next_phys->%p (%08x), last_node->%p (phys %08x)\n", \ ref2, ref_offset(ref2), ref2->next_phys, ref_offset(ref2->next_phys), \ jeb->last_node, ref_offset(jeb->last_node)); \ paranoia_failed_dump(jeb); \ BUG(); \ } \ ref2 = ref2->next_phys; \ } \ if (my_used_size != jeb->used_size) { \ printk(KERN_NOTICE "Calculated used size %08x != stored used size %08x\n", my_used_size, jeb->used_size); \ BUG(); \ } \ if (my_unchecked_size != jeb->unchecked_size) { \ printk(KERN_NOTICE "Calculated unchecked size %08x != stored unchecked size %08x\n", my_unchecked_size, jeb->unchecked_size); \ BUG(); \ } \ } while(0)/* Calculate totlen from surrounding nodes or eraseblock */static inline uint32_t __ref_totlen(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb, struct jffs2_raw_node_ref *ref){ uint32_t ref_end; if (ref->next_phys) ref_end = ref_offset(ref->next_phys); else { if (!jeb) jeb = &c->blocks[ref->flash_offset / c->sector_size]; /* Last node in block. Use free_space */ BUG_ON(ref != jeb->last_node); ref_end = jeb->offset + c->sector_size - jeb->free_size; } return ref_end - ref_offset(ref);}static inline uint32_t ref_totlen(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb, struct jffs2_raw_node_ref *ref){ uint32_t ret; D1(if (jeb && jeb != &c->blocks[ref->flash_offset / c->sector_size]) { printk(KERN_CRIT "ref_totlen called with wrong block -- at 0x%08x instead of 0x%08x; ref 0x%08x\n", jeb->offset, c->blocks[ref->flash_offset / c->sector_size].offset, ref_offset(ref)); BUG(); })#if 1 ret = ref->__totlen;#else /* This doesn't actually work yet */ ret = __ref_totlen(c, jeb, ref); if (ret != ref->__totlen) { printk(KERN_CRIT "Totlen for ref at %p (0x%08x-0x%08x) miscalculated as 0x%x instead of %x\n", ref, ref_offset(ref), ref_offset(ref)+ref->__totlen, ret, ref->__totlen); if (!jeb) jeb = &c->blocks[ref->flash_offset / c->sector_size]; paranoia_failed_dump(jeb); BUG(); }#endif return ret;}#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 struct jffs2_inode_cache *jffs2_raw_ref_to_ic(struct jffs2_raw_node_ref *raw){ while(raw->next_in_ino) { raw = raw->next_in_ino; } return ((struct jffs2_inode_cache *)raw);}static inline struct jffs2_node_frag *frag_first(struct rb_root *root){ struct rb_node *node = root->rb_node; if (!node) return NULL; while(node->rb_left) node = node->rb_left; return rb_entry(node, struct jffs2_node_frag, rb);}#define rb_parent(rb) ((rb)->rb_parent)#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);/* nodelist.c */D1(void jffs2_print_frag_list(struct jffs2_inode_info *f));void jffs2_add_fd_to_list(struct jffs2_sb_info *c, struct jffs2_full_dirent *new, struct jffs2_full_dirent **list);int jffs2_get_inode_nodes(struct jffs2_sb_info *c, ino_t ino, struct jffs2_inode_info *f, struct jffs2_tmp_dnode_info **tnp, struct jffs2_full_dirent **fdp, uint32_t *highest_version, uint32_t *latest_mctime, uint32_t *mctime_ver);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);void jffs2_fragtree_insert(struct jffs2_node_frag *newfrag, struct jffs2_node_frag *base);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);/* 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 *ofs, uint32_t *len, int prio);int jffs2_reserve_space_gc(struct jffs2_sb_info *c, uint32_t minsize, uint32_t *ofs, uint32_t *len);int jffs2_add_physical_node_ref(struct jffs2_sb_info *c, struct jffs2_raw_node_ref *new);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);void jffs2_dump_block_lists(struct jffs2_sb_info *c);/* 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, uint32_t flash_ofs, 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, uint32_t flash_ofs, 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);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);/* readinode.c */void jffs2_truncate_fraglist (struct jffs2_sb_info *c, struct rb_root *list, uint32_t size);int jffs2_add_full_dnode_to_inode(struct jffs2_sb_info *c, struct jffs2_inode_info *f, struct jffs2_full_dnode *fn);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 *);struct jffs2_raw_node_ref *jffs2_alloc_raw_node_ref(void);void jffs2_free_raw_node_ref(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 *);/* 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);/* build.c */int jffs2_do_mount_fs(struct jffs2_sb_info *c);/* erase.c */void jffs2_erase_block(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb);void jffs2_erase_pending_blocks(struct jffs2_sb_info *c, int count);#ifdef CONFIG_JFFS2_FS_NAND/* 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#endif /* __JFFS2_NODELIST_H__ */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -