Home
last modified time | relevance | path

Searched refs:ubifs_info (Results 1 – 25 of 30) sorted by relevance

12

/fs/ubifs/
Ddebug.h27 typedef int (*dbg_leaf_callback)(struct ubifs_info *c,
29 typedef int (*dbg_znode_callback)(struct ubifs_info *c,
220 static inline int dbg_is_chk_gen(const struct ubifs_info *c) in dbg_is_chk_gen()
224 static inline int dbg_is_chk_index(const struct ubifs_info *c) in dbg_is_chk_index()
228 static inline int dbg_is_chk_orph(const struct ubifs_info *c) in dbg_is_chk_orph()
232 static inline int dbg_is_chk_lprops(const struct ubifs_info *c) in dbg_is_chk_lprops()
236 static inline int dbg_is_chk_fs(const struct ubifs_info *c) in dbg_is_chk_fs()
240 static inline int dbg_is_tst_rcvry(const struct ubifs_info *c) in dbg_is_tst_rcvry()
244 static inline int dbg_is_power_cut(const struct ubifs_info *c) in dbg_is_power_cut()
249 int ubifs_debugging_init(struct ubifs_info *c);
[all …]
Dubifs.h637 struct ubifs_info;
640 typedef int (*ubifs_lpt_scan_callback)(struct ubifs_info *c,
681 struct ubifs_info *c;
690 int (*sync_callback)(struct ubifs_info *c, int lnum, int free, int pad);
1223 struct ubifs_info { struct
1470 void ubifs_ro_mode(struct ubifs_info *c, int err); argument
1471 int ubifs_leb_read(const struct ubifs_info *c, int lnum, void *buf, int offs,
1473 int ubifs_leb_write(struct ubifs_info *c, int lnum, const void *buf, int offs,
1475 int ubifs_leb_change(struct ubifs_info *c, int lnum, const void *buf, int len,
1477 int ubifs_leb_unmap(struct ubifs_info *c, int lnum);
[all …]
Dkey.h96 static inline void ino_key_init(const struct ubifs_info *c, in ino_key_init()
109 static inline void ino_key_init_flash(const struct ubifs_info *c, void *k, in ino_key_init_flash()
125 static inline void lowest_ino_key(const struct ubifs_info *c, in lowest_ino_key()
138 static inline void highest_ino_key(const struct ubifs_info *c, in highest_ino_key()
152 static inline void dent_key_init(const struct ubifs_info *c, in dent_key_init()
171 static inline void dent_key_init_hash(const struct ubifs_info *c, in dent_key_init_hash()
187 static inline void dent_key_init_flash(const struct ubifs_info *c, void *k, in dent_key_init_flash()
206 static inline void lowest_dent_key(const struct ubifs_info *c, in lowest_dent_key()
220 static inline void xent_key_init(const struct ubifs_info *c, in xent_key_init()
238 static inline void xent_key_init_flash(const struct ubifs_info *c, void *k, in xent_key_init_flash()
[all …]
Dmisc.h68 static inline void ubifs_wake_up_bgt(struct ubifs_info *c) in ubifs_wake_up_bgt()
176 static inline int ubifs_add_dirt(struct ubifs_info *c, int lnum, int dirty) in ubifs_add_dirt()
190 static inline int ubifs_return_leb(struct ubifs_info *c, int lnum) in ubifs_return_leb()
201 static inline int ubifs_idx_node_sz(const struct ubifs_info *c, int child_cnt) in ubifs_idx_node_sz()
213 struct ubifs_branch *ubifs_idx_branch(const struct ubifs_info *c, in ubifs_idx_branch()
226 static inline void *ubifs_idx_key(const struct ubifs_info *c, in ubifs_idx_key()
253 static inline int ubifs_tnc_lookup(struct ubifs_info *c, in ubifs_tnc_lookup()
266 static inline void ubifs_get_lprops(struct ubifs_info *c) in ubifs_get_lprops()
278 static inline void ubifs_release_lprops(struct ubifs_info *c) in ubifs_release_lprops()
294 static inline int ubifs_next_log_lnum(const struct ubifs_info *c, int lnum) in ubifs_next_log_lnum()
Dbudget.c63 static void shrink_liability(struct ubifs_info *c, int nr_to_write) in shrink_liability()
78 static int run_gc(struct ubifs_info *c) in run_gc()
104 static long long get_liability(struct ubifs_info *c) in get_liability()
132 static int make_free_space(struct ubifs_info *c) in make_free_space()
178 int ubifs_calc_min_idx_lebs(struct ubifs_info *c) in ubifs_calc_min_idx_lebs()
209 long long ubifs_calc_available(const struct ubifs_info *c, int min_idx_lebs) in ubifs_calc_available()
273 static int can_use_rp(struct ubifs_info *c) in can_use_rp()
306 static int do_budget_space(struct ubifs_info *c) in do_budget_space()
375 static int calc_idx_growth(const struct ubifs_info *c, in calc_idx_growth()
391 static int calc_data_growth(const struct ubifs_info *c, in calc_data_growth()
[all …]
Dlpt_commit.c34 static int dbg_populate_lsave(struct ubifs_info *c);
103 static int get_cnodes_to_commit(struct ubifs_info *c) in get_cnodes_to_commit()
144 static void upd_ltab(struct ubifs_info *c, int lnum, int free, int dirty) in upd_ltab()
164 static int alloc_lpt_leb(struct ubifs_info *c, int *lnum) in alloc_lpt_leb()
197 static int layout_cnodes(struct ubifs_info *c) in layout_cnodes()
350 static int realloc_lpt_leb(struct ubifs_info *c, int *lnum) in realloc_lpt_leb()
377 static int write_cnodes(struct ubifs_info *c) in write_cnodes()
573 static struct ubifs_pnode *next_pnode_to_dirty(struct ubifs_info *c, in next_pnode_to_dirty()
638 static struct ubifs_pnode *pnode_lookup(struct ubifs_info *c, int i) in pnode_lookup()
667 static void add_pnode_dirt(struct ubifs_info *c, struct ubifs_pnode *pnode) in add_pnode_dirt()
[all …]
Dorphan.c56 static int dbg_check_orphans(struct ubifs_info *c);
69 int ubifs_add_orphan(struct ubifs_info *c, ino_t inum) in ubifs_add_orphan()
119 void ubifs_delete_orphan(struct ubifs_info *c, ino_t inum) in ubifs_delete_orphan()
171 int ubifs_orphan_start_commit(struct ubifs_info *c) in ubifs_orphan_start_commit()
203 static int avail_orphs(struct ubifs_info *c) in avail_orphs()
223 static int tot_avail_orphs(struct ubifs_info *c) in tot_avail_orphs()
243 static int do_write_orph_node(struct ubifs_info *c, int len, int atomic) in do_write_orph_node()
275 static int write_orph_node(struct ubifs_info *c, int atomic) in write_orph_node()
336 static int write_orph_nodes(struct ubifs_info *c, int atomic) in write_orph_nodes()
370 static int consolidate(struct ubifs_info *c) in consolidate()
[all …]
Dtnc.c77 static int insert_old_idx(struct ubifs_info *c, int lnum, int offs) in insert_old_idx()
118 int insert_old_idx_znode(struct ubifs_info *c, struct ubifs_znode *znode) in insert_old_idx_znode()
140 static int ins_clr_old_idx_znode(struct ubifs_info *c, in ins_clr_old_idx_znode()
179 void destroy_old_idx(struct ubifs_info *c) in destroy_old_idx()
212 static struct ubifs_znode *copy_znode(struct ubifs_info *c, in copy_znode()
254 static int add_idx_dirt(struct ubifs_info *c, int lnum, int dirt) in add_idx_dirt()
267 static struct ubifs_znode *dirty_cow_znode(struct ubifs_info *c, in dirty_cow_znode()
329 static int lnc_add(struct ubifs_info *c, struct ubifs_zbranch *zbr, in lnc_add()
365 static int lnc_add_directly(struct ubifs_info *c, struct ubifs_zbranch *zbr, in lnc_add_directly()
408 static int tnc_read_node_nm(struct ubifs_info *c, struct ubifs_zbranch *zbr, in tnc_read_node_nm()
[all …]
Dlprops.c62 static void move_up_lpt_heap(struct ubifs_info *c, struct ubifs_lpt_heap *heap, in move_up_lpt_heap()
99 static void adjust_lpt_heap(struct ubifs_info *c, struct ubifs_lpt_heap *heap, in adjust_lpt_heap()
178 static int add_to_lpt_heap(struct ubifs_info *c, struct ubifs_lprops *lprops, in add_to_lpt_heap()
226 static void remove_from_lpt_heap(struct ubifs_info *c, in remove_from_lpt_heap()
256 static void lpt_heap_replace(struct ubifs_info *c, in lpt_heap_replace()
275 void ubifs_add_to_cat(struct ubifs_info *c, struct ubifs_lprops *lprops, in ubifs_add_to_cat()
318 static void ubifs_remove_from_cat(struct ubifs_info *c, in ubifs_remove_from_cat()
355 void ubifs_replace_cat(struct ubifs_info *c, struct ubifs_lprops *old_lprops, in ubifs_replace_cat()
387 void ubifs_ensure_cat(struct ubifs_info *c, struct ubifs_lprops *lprops) in ubifs_ensure_cat()
410 int ubifs_categorize_lprops(const struct ubifs_info *c, in ubifs_categorize_lprops()
[all …]
Dreplay.c97 static int set_bud_lprops(struct ubifs_info *c, struct bud_entry *b) in set_bud_lprops()
172 static int set_buds_lprops(struct ubifs_info *c) in set_buds_lprops()
191 static int trun_remove_range(struct ubifs_info *c, struct replay_entry *r) in trun_remove_range()
220 static int apply_replay_entry(struct ubifs_info *c, struct replay_entry *r) in apply_replay_entry()
301 static int apply_replay_list(struct ubifs_info *c) in apply_replay_list()
325 static void destroy_replay_list(struct ubifs_info *c) in destroy_replay_list()
357 static int insert_node(struct ubifs_info *c, int lnum, int offs, int len, in insert_node()
405 static int insert_dent(struct ubifs_info *c, int lnum, int offs, int len, in insert_dent()
451 int ubifs_validate_entry(struct ubifs_info *c, in ubifs_validate_entry()
485 static int is_last_bud(struct ubifs_info *c, struct ubifs_bud *bud) in is_last_bud()
[all …]
Drecovery.c109 static int get_master_node(const struct ubifs_info *c, int lnum, void **pbuf, in get_master_node()
204 static int write_rcvrd_mst_node(struct ubifs_info *c, in write_rcvrd_mst_node()
236 int ubifs_recover_master_node(struct ubifs_info *c) in ubifs_recover_master_node()
386 int ubifs_write_rcvrd_mst_node(struct ubifs_info *c) in ubifs_write_rcvrd_mst_node()
413 static int is_last_write(const struct ubifs_info *c, void *buf, int offs) in is_last_write()
440 static void clean_buf(const struct ubifs_info *c, void **buf, int lnum, in clean_buf()
470 static int no_more_nodes(const struct ubifs_info *c, void *buf, int len, in no_more_nodes()
503 static int fix_unclean_leb(struct ubifs_info *c, struct ubifs_scan_leb *sleb, in fix_unclean_leb()
635 struct ubifs_scan_leb *ubifs_recover_leb(struct ubifs_info *c, int lnum, in ubifs_recover_leb()
812 static int get_cs_sqnum(struct ubifs_info *c, int lnum, int offs, in get_cs_sqnum()
[all …]
Dio.c82 void ubifs_ro_mode(struct ubifs_info *c, int err) in ubifs_ro_mode()
99 int ubifs_leb_read(const struct ubifs_info *c, int lnum, void *buf, int offs, in ubifs_leb_read()
117 int ubifs_leb_write(struct ubifs_info *c, int lnum, const void *buf, int offs, in ubifs_leb_write()
138 int ubifs_leb_change(struct ubifs_info *c, int lnum, const void *buf, int len, in ubifs_leb_change()
159 int ubifs_leb_unmap(struct ubifs_info *c, int lnum) in ubifs_leb_unmap()
178 int ubifs_leb_map(struct ubifs_info *c, int lnum, int dtype) in ubifs_leb_map()
197 int ubifs_is_mapped(const struct ubifs_info *c, int lnum) in ubifs_is_mapped()
238 int ubifs_check_node(const struct ubifs_info *c, const void *buf, int lnum, in ubifs_check_node()
319 void ubifs_pad(const struct ubifs_info *c, void *buf, int pad) in ubifs_pad()
349 static unsigned long long next_sqnum(struct ubifs_info *c) in next_sqnum()
[all …]
Dlpt.c58 static void do_calc_lpt_geom(struct ubifs_info *c) in do_calc_lpt_geom()
137 int ubifs_calc_lpt_geom(struct ubifs_info *c) in ubifs_calc_lpt_geom()
174 static int calc_dflt_lpt_geom(struct ubifs_info *c, int *main_lebs, in calc_dflt_lpt_geom()
350 void ubifs_pack_pnode(struct ubifs_info *c, void *buf, in ubifs_pack_pnode()
383 void ubifs_pack_nnode(struct ubifs_info *c, void *buf, in ubifs_pack_nnode()
415 void ubifs_pack_ltab(struct ubifs_info *c, void *buf, in ubifs_pack_ltab()
440 void ubifs_pack_lsave(struct ubifs_info *c, void *buf, int *lsave) in ubifs_pack_lsave()
462 void ubifs_add_lpt_dirt(struct ubifs_info *c, int lnum, int dirty) in ubifs_add_lpt_dirt()
479 static void set_ltab(struct ubifs_info *c, int lnum, int free, int dirty) in set_ltab()
494 void ubifs_add_nnode_dirt(struct ubifs_info *c, struct ubifs_nnode *nnode) in ubifs_add_nnode_dirt()
[all …]
Dtnc_commit.c37 static int make_idx_node(struct ubifs_info *c, struct ubifs_idx_node *idx, in make_idx_node()
113 static int fill_gap(struct ubifs_info *c, int lnum, int gap_start, int gap_end, in fill_gap()
170 static int find_old_idx(struct ubifs_info *c, int lnum, int offs) in find_old_idx()
205 static int is_idx_node_in_use(struct ubifs_info *c, union ubifs_key *key, in is_idx_node_in_use()
231 static int layout_leb_in_gaps(struct ubifs_info *c, int *p) in layout_leb_in_gaps()
342 static int get_leb_cnt(struct ubifs_info *c, int cnt) in get_leb_cnt()
364 static int layout_in_gaps(struct ubifs_info *c, int cnt) in layout_in_gaps()
417 static int layout_in_empty_space(struct ubifs_info *c) in layout_in_empty_space()
560 static int layout_commit(struct ubifs_info *c, int no_space, int cnt) in layout_commit()
634 static int get_znodes_to_commit(struct ubifs_info *c) in get_znodes_to_commit()
[all …]
Dfind.c54 static int valuable(struct ubifs_info *c, const struct ubifs_lprops *lprops) in valuable()
95 static int scan_for_dirty_cb(struct ubifs_info *c, in scan_for_dirty_cb()
136 static const struct ubifs_lprops *scan_for_dirty(struct ubifs_info *c, in scan_for_dirty()
233 int ubifs_find_dirty_leb(struct ubifs_info *c, struct ubifs_lprops *ret_lp, in ubifs_find_dirty_leb()
362 static int scan_for_free_cb(struct ubifs_info *c, in scan_for_free_cb()
407 const struct ubifs_lprops *do_find_free_space(struct ubifs_info *c, in do_find_free_space()
493 int ubifs_find_free_space(struct ubifs_info *c, int min_space, int *offs, in ubifs_find_free_space()
602 static int scan_for_idx_cb(struct ubifs_info *c, in scan_for_idx_cb()
633 static const struct ubifs_lprops *scan_for_leb_for_idx(struct ubifs_info *c) in scan_for_leb_for_idx()
673 int ubifs_find_free_leb_for_idx(struct ubifs_info *c) in ubifs_find_free_leb_for_idx()
[all …]
Dsuper.c66 static int validate_inode(struct ubifs_info *c, const struct inode *inode) in validate_inode()
106 struct ubifs_info *c = sb->s_fs_info; in ubifs_iget()
296 struct ubifs_info *c = inode->i_sb->s_fs_info; in ubifs_write_inode()
340 struct ubifs_info *c = inode->i_sb->s_fs_info; in ubifs_evict_inode()
397 struct ubifs_info *c = dentry->d_sb->s_fs_info; in ubifs_statfs()
424 struct ubifs_info *c = root->d_sb->s_fs_info; in ubifs_show_options()
452 struct ubifs_info *c = sb->s_fs_info; in ubifs_sync_fs()
495 static int init_constants_early(struct ubifs_info *c) in init_constants_early()
636 static int bud_wbuf_callback(struct ubifs_info *c, int lnum, int free, int pad) in bud_wbuf_callback()
650 static int init_constants_sb(struct ubifs_info *c) in init_constants_sb()
[all …]
Dlog.c33 static int dbg_check_bud_bytes(struct ubifs_info *c);
46 struct ubifs_bud *ubifs_search_bud(struct ubifs_info *c, int lnum) in ubifs_search_bud()
75 struct ubifs_wbuf *ubifs_get_wbuf(struct ubifs_info *c, int lnum) in ubifs_get_wbuf()
106 static inline long long empty_log_bytes(const struct ubifs_info *c) in empty_log_bytes()
124 void ubifs_add_bud(struct ubifs_info *c, struct ubifs_bud *bud) in ubifs_add_bud()
176 int ubifs_add_bud_to_log(struct ubifs_info *c, int jhead, int lnum, int offs) in ubifs_add_bud_to_log()
299 static void remove_buds(struct ubifs_info *c) in remove_buds()
360 int ubifs_log_start_commit(struct ubifs_info *c, int *ltail_lnum) in ubifs_log_start_commit()
460 int ubifs_log_end_commit(struct ubifs_info *c, int ltail_lnum) in ubifs_log_end_commit()
504 int ubifs_log_post_commit(struct ubifs_info *c, int old_ltail_lnum) in ubifs_log_post_commit()
[all …]
Dgc.c81 static int switch_gc_head(struct ubifs_info *c) in switch_gc_head()
128 struct ubifs_info *c = priv; in data_nodes_cmp()
172 struct ubifs_info *c = priv; in nondata_nodes_cmp()
247 static int sort_nodes(struct ubifs_info *c, struct ubifs_scan_leb *sleb, in sort_nodes()
321 static int move_node(struct ubifs_info *c, struct ubifs_scan_leb *sleb, in move_node()
349 static int move_nodes(struct ubifs_info *c, struct ubifs_scan_leb *sleb) in move_nodes()
446 static int gc_sync_wbufs(struct ubifs_info *c) in gc_sync_wbufs()
469 int ubifs_garbage_collect_leb(struct ubifs_info *c, struct ubifs_lprops *lp) in ubifs_garbage_collect_leb()
648 int ubifs_garbage_collect(struct ubifs_info *c, int anyway) in ubifs_garbage_collect()
840 int ubifs_gc_start_commit(struct ubifs_info *c) in ubifs_gc_start_commit()
[all …]
Ddebug.c103 const char *dbg_snprintf_key(const struct ubifs_info *c, in dbg_snprintf_key()
235 void dbg_dump_inode(struct ubifs_info *c, const struct inode *inode) in dbg_dump_inode()
303 void dbg_dump_node(const struct ubifs_info *c, const void *node) in dbg_dump_node()
637 void dbg_dump_budg(struct ubifs_info *c, const struct ubifs_budg_info *bi) in dbg_dump_budg()
710 void dbg_dump_lprop(const struct ubifs_info *c, const struct ubifs_lprops *lp) in dbg_dump_lprop()
804 void dbg_dump_lprops(struct ubifs_info *c) in dbg_dump_lprops()
826 void dbg_dump_lpt_info(struct ubifs_info *c) in dbg_dump_lpt_info()
865 void dbg_dump_sleb(const struct ubifs_info *c, in dbg_dump_sleb()
881 void dbg_dump_leb(const struct ubifs_info *c, int lnum) in dbg_dump_leb()
924 void dbg_dump_znode(const struct ubifs_info *c, in dbg_dump_znode()
[all …]
Dcommit.c68 static int nothing_to_commit(struct ubifs_info *c) in nothing_to_commit()
109 static int do_commit(struct ubifs_info *c) in do_commit()
248 static int run_bg_commit(struct ubifs_info *c) in run_bg_commit()
294 struct ubifs_info *c = info; in ubifs_bg_thread()
342 void ubifs_commit_required(struct ubifs_info *c) in ubifs_commit_required()
372 void ubifs_request_bg_commit(struct ubifs_info *c) in ubifs_request_bg_commit()
391 static int wait_for_commit(struct ubifs_info *c) in wait_for_commit()
415 int ubifs_run_commit(struct ubifs_info *c) in ubifs_run_commit()
483 int ubifs_gc_should_commit(struct ubifs_info *c) in ubifs_gc_should_commit()
528 int dbg_old_index_check_init(struct ubifs_info *c, struct ubifs_zbranch *zroot) in dbg_old_index_check_init()
[all …]
Dfile.c60 struct ubifs_info *c = inode->i_sb->s_fs_info; in read_block()
199 static void release_new_page_budget(struct ubifs_info *c) in release_new_page_budget()
213 static void release_existing_page_budget(struct ubifs_info *c) in release_existing_page_budget()
225 struct ubifs_info *c = inode->i_sb->s_fs_info; in write_begin_slow()
327 static int allocate_budget(struct ubifs_info *c, struct page *page, in allocate_budget()
428 struct ubifs_info *c = inode->i_sb->s_fs_info; in ubifs_write_begin()
522 static void cancel_budget(struct ubifs_info *c, struct page *page, in cancel_budget()
544 struct ubifs_info *c = inode->i_sb->s_fs_info; in ubifs_write_end()
608 static int populate_page(struct ubifs_info *c, struct page *page, in populate_page()
712 static int ubifs_do_bulk_read(struct ubifs_info *c, struct bu_info *bu, in ubifs_do_bulk_read()
[all …]
Dscan.c69 int ubifs_scan_a_node(const struct ubifs_info *c, void *buf, int len, int lnum, in ubifs_scan_a_node()
135 struct ubifs_scan_leb *ubifs_start_scan(const struct ubifs_info *c, int lnum, in ubifs_start_scan()
174 void ubifs_end_scan(const struct ubifs_info *c, struct ubifs_scan_leb *sleb, in ubifs_end_scan()
193 int ubifs_add_snod(const struct ubifs_info *c, struct ubifs_scan_leb *sleb, in ubifs_add_snod()
237 void ubifs_scanned_corruption(const struct ubifs_info *c, int lnum, int offs, in ubifs_scanned_corruption()
268 struct ubifs_scan_leb *ubifs_scan(const struct ubifs_info *c, int lnum, in ubifs_scan()
Dxattr.c100 static int create_xattr(struct ubifs_info *c, struct inode *host, in create_xattr()
191 static int change_xattr(struct ubifs_info *c, struct inode *host, in change_xattr()
279 static struct inode *iget_xattr(struct ubifs_info *c, ino_t inum) in iget_xattr()
300 struct ubifs_info *c = host->i_sb->s_fs_info; in ubifs_setxattr()
363 struct ubifs_info *c = host->i_sb->s_fs_info; in ubifs_getxattr()
423 struct ubifs_info *c = host->i_sb->s_fs_info; in ubifs_listxattr()
483 static int remove_xattr(struct ubifs_info *c, struct inode *host, in remove_xattr()
526 struct ubifs_info *c = host->i_sb->s_fs_info; in ubifs_removexattr()
Dshrinker.c70 static int shrink_tnc(struct ubifs_info *c, int nr, int age, int *contention) in shrink_tnc()
159 struct ubifs_info *c; in shrink_tnc_trees()
171 c = list_entry(p, struct ubifs_info, infos_list); in shrink_tnc_trees()
229 struct ubifs_info *c; in kick_a_thread()
Djournal.c115 static int reserve_space(struct ubifs_info *c, int jhead, int len) in reserve_space()
255 static int write_node(struct ubifs_info *c, int jhead, void *node, int len, in write_node()
286 static int write_head(struct ubifs_info *c, int jhead, void *buf, int len, in write_head()
323 static int make_reservation(struct ubifs_info *c, int jhead, int len) in make_reservation()
406 static inline void release_head(struct ubifs_info *c, int jhead) in release_head()
418 static void finish_reservation(struct ubifs_info *c) in finish_reservation()
457 static void pack_inode(struct ubifs_info *c, struct ubifs_ino_node *ino, in pack_inode()
507 static void mark_inode_clean(struct ubifs_info *c, struct ubifs_inode *ui) in mark_inode_clean()
541 int ubifs_jnl_update(struct ubifs_info *c, const struct inode *dir, in ubifs_jnl_update()
692 int ubifs_jnl_write_data(struct ubifs_info *c, const struct inode *inode, in ubifs_jnl_write_data()
[all …]

12