diff options
Diffstat (limited to 'fs/ubifs/ubifs.h')
-rw-r--r-- | fs/ubifs/ubifs.h | 111 |
1 files changed, 53 insertions, 58 deletions
diff --git a/fs/ubifs/ubifs.h b/fs/ubifs/ubifs.h index 46b172560a06..fc2a4cc66d03 100644 --- a/fs/ubifs/ubifs.h +++ b/fs/ubifs/ubifs.h | |||
@@ -63,6 +63,14 @@ | |||
63 | #define SQNUM_WARN_WATERMARK 0xFFFFFFFF00000000ULL | 63 | #define SQNUM_WARN_WATERMARK 0xFFFFFFFF00000000ULL |
64 | #define SQNUM_WATERMARK 0xFFFFFFFFFF000000ULL | 64 | #define SQNUM_WATERMARK 0xFFFFFFFFFF000000ULL |
65 | 65 | ||
66 | /* | ||
67 | * Minimum amount of LEBs reserved for the index. At present the index needs at | ||
68 | * least 2 LEBs: one for the index head and one for in-the-gaps method (which | ||
69 | * currently does not cater for the index head and so excludes it from | ||
70 | * consideration). | ||
71 | */ | ||
72 | #define MIN_INDEX_LEBS 2 | ||
73 | |||
66 | /* Minimum amount of data UBIFS writes to the flash */ | 74 | /* Minimum amount of data UBIFS writes to the flash */ |
67 | #define MIN_WRITE_SZ (UBIFS_DATA_NODE_SZ + 8) | 75 | #define MIN_WRITE_SZ (UBIFS_DATA_NODE_SZ + 8) |
68 | 76 | ||
@@ -386,12 +394,12 @@ struct ubifs_inode { | |||
386 | unsigned int dirty:1; | 394 | unsigned int dirty:1; |
387 | unsigned int xattr:1; | 395 | unsigned int xattr:1; |
388 | unsigned int bulk_read:1; | 396 | unsigned int bulk_read:1; |
397 | unsigned int compr_type:2; | ||
389 | struct mutex ui_mutex; | 398 | struct mutex ui_mutex; |
390 | spinlock_t ui_lock; | 399 | spinlock_t ui_lock; |
391 | loff_t synced_i_size; | 400 | loff_t synced_i_size; |
392 | loff_t ui_size; | 401 | loff_t ui_size; |
393 | int flags; | 402 | int flags; |
394 | int compr_type; | ||
395 | pgoff_t last_page_read; | 403 | pgoff_t last_page_read; |
396 | pgoff_t read_in_a_row; | 404 | pgoff_t read_in_a_row; |
397 | int data_len; | 405 | int data_len; |
@@ -419,7 +427,7 @@ struct ubifs_unclean_leb { | |||
419 | * | 427 | * |
420 | * LPROPS_UNCAT: not categorized | 428 | * LPROPS_UNCAT: not categorized |
421 | * LPROPS_DIRTY: dirty > 0, not index | 429 | * LPROPS_DIRTY: dirty > 0, not index |
422 | * LPROPS_DIRTY_IDX: dirty + free > UBIFS_CH_SZ and index | 430 | * LPROPS_DIRTY_IDX: dirty + free > @c->min_idx_node_sze and index |
423 | * LPROPS_FREE: free > 0, not empty, not index | 431 | * LPROPS_FREE: free > 0, not empty, not index |
424 | * LPROPS_HEAP_CNT: number of heaps used for storing categorized LEBs | 432 | * LPROPS_HEAP_CNT: number of heaps used for storing categorized LEBs |
425 | * LPROPS_EMPTY: LEB is empty, not taken | 433 | * LPROPS_EMPTY: LEB is empty, not taken |
@@ -473,8 +481,8 @@ struct ubifs_lprops { | |||
473 | struct ubifs_lpt_lprops { | 481 | struct ubifs_lpt_lprops { |
474 | int free; | 482 | int free; |
475 | int dirty; | 483 | int dirty; |
476 | unsigned tgc : 1; | 484 | unsigned tgc:1; |
477 | unsigned cmt : 1; | 485 | unsigned cmt:1; |
478 | }; | 486 | }; |
479 | 487 | ||
480 | /** | 488 | /** |
@@ -482,24 +490,26 @@ struct ubifs_lpt_lprops { | |||
482 | * @empty_lebs: number of empty LEBs | 490 | * @empty_lebs: number of empty LEBs |
483 | * @taken_empty_lebs: number of taken LEBs | 491 | * @taken_empty_lebs: number of taken LEBs |
484 | * @idx_lebs: number of indexing LEBs | 492 | * @idx_lebs: number of indexing LEBs |
485 | * @total_free: total free space in bytes | 493 | * @total_free: total free space in bytes (includes all LEBs) |
486 | * @total_dirty: total dirty space in bytes | 494 | * @total_dirty: total dirty space in bytes (includes all LEBs) |
487 | * @total_used: total used space in bytes (includes only data LEBs) | 495 | * @total_used: total used space in bytes (does not include index LEBs) |
488 | * @total_dead: total dead space in bytes (includes only data LEBs) | 496 | * @total_dead: total dead space in bytes (does not include index LEBs) |
489 | * @total_dark: total dark space in bytes (includes only data LEBs) | 497 | * @total_dark: total dark space in bytes (does not include index LEBs) |
498 | * | ||
499 | * The @taken_empty_lebs field counts the LEBs that are in the transient state | ||
500 | * of having been "taken" for use but not yet written to. @taken_empty_lebs is | ||
501 | * needed to account correctly for @gc_lnum, otherwise @empty_lebs could be | ||
502 | * used by itself (in which case 'unused_lebs' would be a better name). In the | ||
503 | * case of @gc_lnum, it is "taken" at mount time or whenever a LEB is retained | ||
504 | * by GC, but unlike other empty LEBs that are "taken", it may not be written | ||
505 | * straight away (i.e. before the next commit start or unmount), so either | ||
506 | * @gc_lnum must be specially accounted for, or the current approach followed | ||
507 | * i.e. count it under @taken_empty_lebs. | ||
490 | * | 508 | * |
491 | * N.B. total_dirty and total_used are different to other total_* fields, | 509 | * @empty_lebs includes @taken_empty_lebs. |
492 | * because they account _all_ LEBs, not just data LEBs. | ||
493 | * | 510 | * |
494 | * 'taken_empty_lebs' counts the LEBs that are in the transient state of having | 511 | * @total_used, @total_dead and @total_dark fields do not account indexing |
495 | * been 'taken' for use but not yet written to. 'taken_empty_lebs' is needed | 512 | * LEBs. |
496 | * to account correctly for gc_lnum, otherwise 'empty_lebs' could be used | ||
497 | * by itself (in which case 'unused_lebs' would be a better name). In the case | ||
498 | * of gc_lnum, it is 'taken' at mount time or whenever a LEB is retained by GC, | ||
499 | * but unlike other empty LEBs that are 'taken', it may not be written straight | ||
500 | * away (i.e. before the next commit start or unmount), so either gc_lnum must | ||
501 | * be specially accounted for, or the current approach followed i.e. count it | ||
502 | * under 'taken_empty_lebs'. | ||
503 | */ | 513 | */ |
504 | struct ubifs_lp_stats { | 514 | struct ubifs_lp_stats { |
505 | int empty_lebs; | 515 | int empty_lebs; |
@@ -893,15 +903,25 @@ struct ubifs_orphan { | |||
893 | /** | 903 | /** |
894 | * struct ubifs_mount_opts - UBIFS-specific mount options information. | 904 | * struct ubifs_mount_opts - UBIFS-specific mount options information. |
895 | * @unmount_mode: selected unmount mode (%0 default, %1 normal, %2 fast) | 905 | * @unmount_mode: selected unmount mode (%0 default, %1 normal, %2 fast) |
896 | * @bulk_read: enable bulk-reads | 906 | * @bulk_read: enable/disable bulk-reads (%0 default, %1 disabe, %2 enable) |
897 | * @chk_data_crc: check CRCs when reading data nodes | 907 | * @chk_data_crc: enable/disable CRC data checking when reading data nodes |
908 | * (%0 default, %1 disabe, %2 enable) | ||
909 | * @override_compr: override default compressor (%0 - do not override and use | ||
910 | * superblock compressor, %1 - override and use compressor | ||
911 | * specified in @compr_type) | ||
912 | * @compr_type: compressor type to override the superblock compressor with | ||
913 | * (%UBIFS_COMPR_NONE, etc) | ||
898 | */ | 914 | */ |
899 | struct ubifs_mount_opts { | 915 | struct ubifs_mount_opts { |
900 | unsigned int unmount_mode:2; | 916 | unsigned int unmount_mode:2; |
901 | unsigned int bulk_read:2; | 917 | unsigned int bulk_read:2; |
902 | unsigned int chk_data_crc:2; | 918 | unsigned int chk_data_crc:2; |
919 | unsigned int override_compr:1; | ||
920 | unsigned int compr_type:2; | ||
903 | }; | 921 | }; |
904 | 922 | ||
923 | struct ubifs_debug_info; | ||
924 | |||
905 | /** | 925 | /** |
906 | * struct ubifs_info - UBIFS file-system description data structure | 926 | * struct ubifs_info - UBIFS file-system description data structure |
907 | * (per-superblock). | 927 | * (per-superblock). |
@@ -946,6 +966,7 @@ struct ubifs_mount_opts { | |||
946 | * @no_chk_data_crc: do not check CRCs when reading data nodes (except during | 966 | * @no_chk_data_crc: do not check CRCs when reading data nodes (except during |
947 | * recovery) | 967 | * recovery) |
948 | * @bulk_read: enable bulk-reads | 968 | * @bulk_read: enable bulk-reads |
969 | * @default_compr: default compression algorithm (%UBIFS_COMPR_LZO, etc) | ||
949 | * | 970 | * |
950 | * @tnc_mutex: protects the Tree Node Cache (TNC), @zroot, @cnext, @enext, and | 971 | * @tnc_mutex: protects the Tree Node Cache (TNC), @zroot, @cnext, @enext, and |
951 | * @calc_idx_sz | 972 | * @calc_idx_sz |
@@ -963,8 +984,6 @@ struct ubifs_mount_opts { | |||
963 | * @ileb_nxt: next pre-allocated index LEBs | 984 | * @ileb_nxt: next pre-allocated index LEBs |
964 | * @old_idx: tree of index nodes obsoleted since the last commit start | 985 | * @old_idx: tree of index nodes obsoleted since the last commit start |
965 | * @bottom_up_buf: a buffer which is used by 'dirty_cow_bottom_up()' in tnc.c | 986 | * @bottom_up_buf: a buffer which is used by 'dirty_cow_bottom_up()' in tnc.c |
966 | * @new_ihead_lnum: used by debugging to check ihead_lnum | ||
967 | * @new_ihead_offs: used by debugging to check ihead_offs | ||
968 | * | 987 | * |
969 | * @mst_node: master node | 988 | * @mst_node: master node |
970 | * @mst_offs: offset of valid master node | 989 | * @mst_offs: offset of valid master node |
@@ -986,7 +1005,6 @@ struct ubifs_mount_opts { | |||
986 | * @main_lebs: count of LEBs in the main area | 1005 | * @main_lebs: count of LEBs in the main area |
987 | * @main_first: first LEB of the main area | 1006 | * @main_first: first LEB of the main area |
988 | * @main_bytes: main area size in bytes | 1007 | * @main_bytes: main area size in bytes |
989 | * @default_compr: default compression algorithm (%UBIFS_COMPR_LZO, etc) | ||
990 | * | 1008 | * |
991 | * @key_hash_type: type of the key hash | 1009 | * @key_hash_type: type of the key hash |
992 | * @key_hash: direntry key hash function | 1010 | * @key_hash: direntry key hash function |
@@ -1149,15 +1167,7 @@ struct ubifs_mount_opts { | |||
1149 | * @always_chk_crc: always check CRCs (while mounting and remounting rw) | 1167 | * @always_chk_crc: always check CRCs (while mounting and remounting rw) |
1150 | * @mount_opts: UBIFS-specific mount options | 1168 | * @mount_opts: UBIFS-specific mount options |
1151 | * | 1169 | * |
1152 | * @dbg_buf: a buffer of LEB size used for debugging purposes | 1170 | * @dbg: debugging-related information |
1153 | * @old_zroot: old index root - used by 'dbg_check_old_index()' | ||
1154 | * @old_zroot_level: old index root level - used by 'dbg_check_old_index()' | ||
1155 | * @old_zroot_sqnum: old index root sqnum - used by 'dbg_check_old_index()' | ||
1156 | * @failure_mode: failure mode for recovery testing | ||
1157 | * @fail_delay: 0=>don't delay, 1=>delay a time, 2=>delay a number of calls | ||
1158 | * @fail_timeout: time in jiffies when delay of failure mode expires | ||
1159 | * @fail_cnt: current number of calls to failure mode I/O functions | ||
1160 | * @fail_cnt_max: number of calls by which to delay failure mode | ||
1161 | */ | 1171 | */ |
1162 | struct ubifs_info { | 1172 | struct ubifs_info { |
1163 | struct super_block *vfs_sb; | 1173 | struct super_block *vfs_sb; |
@@ -1196,6 +1206,7 @@ struct ubifs_info { | |||
1196 | unsigned int big_lpt:1; | 1206 | unsigned int big_lpt:1; |
1197 | unsigned int no_chk_data_crc:1; | 1207 | unsigned int no_chk_data_crc:1; |
1198 | unsigned int bulk_read:1; | 1208 | unsigned int bulk_read:1; |
1209 | unsigned int default_compr:2; | ||
1199 | 1210 | ||
1200 | struct mutex tnc_mutex; | 1211 | struct mutex tnc_mutex; |
1201 | struct ubifs_zbranch zroot; | 1212 | struct ubifs_zbranch zroot; |
@@ -1212,10 +1223,6 @@ struct ubifs_info { | |||
1212 | int ileb_nxt; | 1223 | int ileb_nxt; |
1213 | struct rb_root old_idx; | 1224 | struct rb_root old_idx; |
1214 | int *bottom_up_buf; | 1225 | int *bottom_up_buf; |
1215 | #ifdef CONFIG_UBIFS_FS_DEBUG | ||
1216 | int new_ihead_lnum; | ||
1217 | int new_ihead_offs; | ||
1218 | #endif | ||
1219 | 1226 | ||
1220 | struct ubifs_mst_node *mst_node; | 1227 | struct ubifs_mst_node *mst_node; |
1221 | int mst_offs; | 1228 | int mst_offs; |
@@ -1237,7 +1244,6 @@ struct ubifs_info { | |||
1237 | int main_lebs; | 1244 | int main_lebs; |
1238 | int main_first; | 1245 | int main_first; |
1239 | long long main_bytes; | 1246 | long long main_bytes; |
1240 | int default_compr; | ||
1241 | 1247 | ||
1242 | uint8_t key_hash_type; | 1248 | uint8_t key_hash_type; |
1243 | uint32_t (*key_hash)(const char *str, int len); | 1249 | uint32_t (*key_hash)(const char *str, int len); |
@@ -1315,8 +1321,8 @@ struct ubifs_info { | |||
1315 | void *sbuf; | 1321 | void *sbuf; |
1316 | struct list_head idx_gc; | 1322 | struct list_head idx_gc; |
1317 | int idx_gc_cnt; | 1323 | int idx_gc_cnt; |
1318 | volatile int gc_seq; | 1324 | int gc_seq; |
1319 | volatile int gced_lnum; | 1325 | int gced_lnum; |
1320 | 1326 | ||
1321 | struct list_head infos_list; | 1327 | struct list_head infos_list; |
1322 | struct mutex umount_mutex; | 1328 | struct mutex umount_mutex; |
@@ -1391,21 +1397,7 @@ struct ubifs_info { | |||
1391 | struct ubifs_mount_opts mount_opts; | 1397 | struct ubifs_mount_opts mount_opts; |
1392 | 1398 | ||
1393 | #ifdef CONFIG_UBIFS_FS_DEBUG | 1399 | #ifdef CONFIG_UBIFS_FS_DEBUG |
1394 | void *dbg_buf; | 1400 | struct ubifs_debug_info *dbg; |
1395 | struct ubifs_zbranch old_zroot; | ||
1396 | int old_zroot_level; | ||
1397 | unsigned long long old_zroot_sqnum; | ||
1398 | int failure_mode; | ||
1399 | int fail_delay; | ||
1400 | unsigned long fail_timeout; | ||
1401 | unsigned int fail_cnt; | ||
1402 | unsigned int fail_cnt_max; | ||
1403 | long long chk_lpt_sz; | ||
1404 | long long chk_lpt_sz2; | ||
1405 | long long chk_lpt_wastage; | ||
1406 | int chk_lpt_lebs; | ||
1407 | int new_nhead_lnum; | ||
1408 | int new_nhead_offs; | ||
1409 | #endif | 1401 | #endif |
1410 | }; | 1402 | }; |
1411 | 1403 | ||
@@ -1505,7 +1497,7 @@ void ubifs_cancel_ino_op(struct ubifs_info *c, struct inode *inode, | |||
1505 | long long ubifs_get_free_space(struct ubifs_info *c); | 1497 | long long ubifs_get_free_space(struct ubifs_info *c); |
1506 | int ubifs_calc_min_idx_lebs(struct ubifs_info *c); | 1498 | int ubifs_calc_min_idx_lebs(struct ubifs_info *c); |
1507 | void ubifs_convert_page_budget(struct ubifs_info *c); | 1499 | void ubifs_convert_page_budget(struct ubifs_info *c); |
1508 | long long ubifs_reported_space(const struct ubifs_info *c, uint64_t free); | 1500 | long long ubifs_reported_space(const struct ubifs_info *c, long long free); |
1509 | long long ubifs_calc_available(const struct ubifs_info *c, int min_idx_lebs); | 1501 | long long ubifs_calc_available(const struct ubifs_info *c, int min_idx_lebs); |
1510 | 1502 | ||
1511 | /* find.c */ | 1503 | /* find.c */ |
@@ -1639,6 +1631,9 @@ void ubifs_add_lpt_dirt(struct ubifs_info *c, int lnum, int dirty); | |||
1639 | void ubifs_add_nnode_dirt(struct ubifs_info *c, struct ubifs_nnode *nnode); | 1631 | void ubifs_add_nnode_dirt(struct ubifs_info *c, struct ubifs_nnode *nnode); |
1640 | uint32_t ubifs_unpack_bits(uint8_t **addr, int *pos, int nrbits); | 1632 | uint32_t ubifs_unpack_bits(uint8_t **addr, int *pos, int nrbits); |
1641 | struct ubifs_nnode *ubifs_first_nnode(struct ubifs_info *c, int *hght); | 1633 | struct ubifs_nnode *ubifs_first_nnode(struct ubifs_info *c, int *hght); |
1634 | /* Needed only in debugging code in lpt_commit.c */ | ||
1635 | int ubifs_unpack_nnode(const struct ubifs_info *c, void *buf, | ||
1636 | struct ubifs_nnode *nnode); | ||
1642 | 1637 | ||
1643 | /* lpt_commit.c */ | 1638 | /* lpt_commit.c */ |
1644 | int ubifs_lpt_start_commit(struct ubifs_info *c); | 1639 | int ubifs_lpt_start_commit(struct ubifs_info *c); |
@@ -1714,7 +1709,7 @@ long ubifs_compat_ioctl(struct file *file, unsigned int cmd, unsigned long arg); | |||
1714 | 1709 | ||
1715 | /* compressor.c */ | 1710 | /* compressor.c */ |
1716 | int __init ubifs_compressors_init(void); | 1711 | int __init ubifs_compressors_init(void); |
1717 | void __exit ubifs_compressors_exit(void); | 1712 | void ubifs_compressors_exit(void); |
1718 | void ubifs_compress(const void *in_buf, int in_len, void *out_buf, int *out_len, | 1713 | void ubifs_compress(const void *in_buf, int in_len, void *out_buf, int *out_len, |
1719 | int *compr_type); | 1714 | int *compr_type); |
1720 | int ubifs_decompress(const void *buf, int len, void *out, int *out_len, | 1715 | int ubifs_decompress(const void *buf, int len, void *out, int *out_len, |