diff options
Diffstat (limited to 'fs/ubifs/ubifs.h')
| -rw-r--r-- | fs/ubifs/ubifs.h | 85 |
1 files changed, 69 insertions, 16 deletions
diff --git a/fs/ubifs/ubifs.h b/fs/ubifs/ubifs.h index 17c620b93eec..a7bd32fa15b9 100644 --- a/fs/ubifs/ubifs.h +++ b/fs/ubifs/ubifs.h | |||
| @@ -142,6 +142,9 @@ | |||
| 142 | /* Maximum expected tree height for use by bottom_up_buf */ | 142 | /* Maximum expected tree height for use by bottom_up_buf */ |
| 143 | #define BOTTOM_UP_HEIGHT 64 | 143 | #define BOTTOM_UP_HEIGHT 64 |
| 144 | 144 | ||
| 145 | /* Maximum number of data nodes to bulk-read */ | ||
| 146 | #define UBIFS_MAX_BULK_READ 32 | ||
| 147 | |||
| 145 | /* | 148 | /* |
| 146 | * Lockdep classes for UBIFS inode @ui_mutex. | 149 | * Lockdep classes for UBIFS inode @ui_mutex. |
| 147 | */ | 150 | */ |
| @@ -328,9 +331,10 @@ struct ubifs_gced_idx_leb { | |||
| 328 | * this inode | 331 | * this inode |
| 329 | * @dirty: non-zero if the inode is dirty | 332 | * @dirty: non-zero if the inode is dirty |
| 330 | * @xattr: non-zero if this is an extended attribute inode | 333 | * @xattr: non-zero if this is an extended attribute inode |
| 334 | * @bulk_read: non-zero if bulk-read should be used | ||
| 331 | * @ui_mutex: serializes inode write-back with the rest of VFS operations, | 335 | * @ui_mutex: serializes inode write-back with the rest of VFS operations, |
| 332 | * serializes "clean <-> dirty" state changes, protects @dirty, | 336 | * serializes "clean <-> dirty" state changes, serializes bulk-read, |
| 333 | * @ui_size, and @xattr_size | 337 | * protects @dirty, @bulk_read, @ui_size, and @xattr_size |
| 334 | * @ui_lock: protects @synced_i_size | 338 | * @ui_lock: protects @synced_i_size |
| 335 | * @synced_i_size: synchronized size of inode, i.e. the value of inode size | 339 | * @synced_i_size: synchronized size of inode, i.e. the value of inode size |
| 336 | * currently stored on the flash; used only for regular file | 340 | * currently stored on the flash; used only for regular file |
| @@ -338,6 +342,8 @@ struct ubifs_gced_idx_leb { | |||
| 338 | * @ui_size: inode size used by UBIFS when writing to flash | 342 | * @ui_size: inode size used by UBIFS when writing to flash |
| 339 | * @flags: inode flags (@UBIFS_COMPR_FL, etc) | 343 | * @flags: inode flags (@UBIFS_COMPR_FL, etc) |
| 340 | * @compr_type: default compression type used for this inode | 344 | * @compr_type: default compression type used for this inode |
| 345 | * @last_page_read: page number of last page read (for bulk read) | ||
| 346 | * @read_in_a_row: number of consecutive pages read in a row (for bulk read) | ||
| 341 | * @data_len: length of the data attached to the inode | 347 | * @data_len: length of the data attached to the inode |
| 342 | * @data: inode's data | 348 | * @data: inode's data |
| 343 | * | 349 | * |
| @@ -379,12 +385,15 @@ struct ubifs_inode { | |||
| 379 | unsigned int xattr_names; | 385 | unsigned int xattr_names; |
| 380 | unsigned int dirty:1; | 386 | unsigned int dirty:1; |
| 381 | unsigned int xattr:1; | 387 | unsigned int xattr:1; |
| 388 | unsigned int bulk_read:1; | ||
| 382 | struct mutex ui_mutex; | 389 | struct mutex ui_mutex; |
| 383 | spinlock_t ui_lock; | 390 | spinlock_t ui_lock; |
| 384 | loff_t synced_i_size; | 391 | loff_t synced_i_size; |
| 385 | loff_t ui_size; | 392 | loff_t ui_size; |
| 386 | int flags; | 393 | int flags; |
| 387 | int compr_type; | 394 | int compr_type; |
| 395 | pgoff_t last_page_read; | ||
| 396 | pgoff_t read_in_a_row; | ||
| 388 | int data_len; | 397 | int data_len; |
| 389 | void *data; | 398 | void *data; |
| 390 | }; | 399 | }; |
| @@ -698,8 +707,8 @@ struct ubifs_jhead { | |||
| 698 | * struct ubifs_zbranch - key/coordinate/length branch stored in znodes. | 707 | * struct ubifs_zbranch - key/coordinate/length branch stored in znodes. |
| 699 | * @key: key | 708 | * @key: key |
| 700 | * @znode: znode address in memory | 709 | * @znode: znode address in memory |
| 701 | * @lnum: LEB number of the indexing node | 710 | * @lnum: LEB number of the target node (indexing node or data node) |
| 702 | * @offs: offset of the indexing node within @lnum | 711 | * @offs: target node offset within @lnum |
| 703 | * @len: target node length | 712 | * @len: target node length |
| 704 | */ | 713 | */ |
| 705 | struct ubifs_zbranch { | 714 | struct ubifs_zbranch { |
| @@ -744,6 +753,28 @@ struct ubifs_znode { | |||
| 744 | }; | 753 | }; |
| 745 | 754 | ||
| 746 | /** | 755 | /** |
| 756 | * struct bu_info - bulk-read information | ||
| 757 | * @key: first data node key | ||
| 758 | * @zbranch: zbranches of data nodes to bulk read | ||
| 759 | * @buf: buffer to read into | ||
| 760 | * @buf_len: buffer length | ||
| 761 | * @gc_seq: GC sequence number to detect races with GC | ||
| 762 | * @cnt: number of data nodes for bulk read | ||
| 763 | * @blk_cnt: number of data blocks including holes | ||
| 764 | * @oef: end of file reached | ||
| 765 | */ | ||
| 766 | struct bu_info { | ||
| 767 | union ubifs_key key; | ||
| 768 | struct ubifs_zbranch zbranch[UBIFS_MAX_BULK_READ]; | ||
| 769 | void *buf; | ||
| 770 | int buf_len; | ||
| 771 | int gc_seq; | ||
| 772 | int cnt; | ||
| 773 | int blk_cnt; | ||
| 774 | int eof; | ||
| 775 | }; | ||
| 776 | |||
| 777 | /** | ||
| 747 | * struct ubifs_node_range - node length range description data structure. | 778 | * struct ubifs_node_range - node length range description data structure. |
| 748 | * @len: fixed node length | 779 | * @len: fixed node length |
| 749 | * @min_len: minimum possible node length | 780 | * @min_len: minimum possible node length |
| @@ -862,9 +893,13 @@ struct ubifs_orphan { | |||
| 862 | /** | 893 | /** |
| 863 | * struct ubifs_mount_opts - UBIFS-specific mount options information. | 894 | * struct ubifs_mount_opts - UBIFS-specific mount options information. |
| 864 | * @unmount_mode: selected unmount mode (%0 default, %1 normal, %2 fast) | 895 | * @unmount_mode: selected unmount mode (%0 default, %1 normal, %2 fast) |
| 896 | * @bulk_read: enable bulk-reads | ||
| 897 | * @chk_data_crc: check CRCs when reading data nodes | ||
| 865 | */ | 898 | */ |
| 866 | struct ubifs_mount_opts { | 899 | struct ubifs_mount_opts { |
| 867 | unsigned int unmount_mode:2; | 900 | unsigned int unmount_mode:2; |
| 901 | unsigned int bulk_read:2; | ||
| 902 | unsigned int chk_data_crc:2; | ||
| 868 | }; | 903 | }; |
| 869 | 904 | ||
| 870 | /** | 905 | /** |
| @@ -905,13 +940,12 @@ struct ubifs_mount_opts { | |||
| 905 | * @cmt_state: commit state | 940 | * @cmt_state: commit state |
| 906 | * @cs_lock: commit state lock | 941 | * @cs_lock: commit state lock |
| 907 | * @cmt_wq: wait queue to sleep on if the log is full and a commit is running | 942 | * @cmt_wq: wait queue to sleep on if the log is full and a commit is running |
| 943 | * | ||
| 908 | * @fast_unmount: do not run journal commit before un-mounting | 944 | * @fast_unmount: do not run journal commit before un-mounting |
| 909 | * @big_lpt: flag that LPT is too big to write whole during commit | 945 | * @big_lpt: flag that LPT is too big to write whole during commit |
| 910 | * @check_lpt_free: flag that indicates LPT GC may be needed | 946 | * @no_chk_data_crc: do not check CRCs when reading data nodes (except during |
| 911 | * @nospace: non-zero if the file-system does not have flash space (used as | 947 | * recovery) |
| 912 | * optimization) | 948 | * @bulk_read: enable bulk-reads |
| 913 | * @nospace_rp: the same as @nospace, but additionally means that even reserved | ||
| 914 | * pool is full | ||
| 915 | * | 949 | * |
| 916 | * @tnc_mutex: protects the Tree Node Cache (TNC), @zroot, @cnext, @enext, and | 950 | * @tnc_mutex: protects the Tree Node Cache (TNC), @zroot, @cnext, @enext, and |
| 917 | * @calc_idx_sz | 951 | * @calc_idx_sz |
| @@ -935,6 +969,7 @@ struct ubifs_mount_opts { | |||
| 935 | * @mst_node: master node | 969 | * @mst_node: master node |
| 936 | * @mst_offs: offset of valid master node | 970 | * @mst_offs: offset of valid master node |
| 937 | * @mst_mutex: protects the master node area, @mst_node, and @mst_offs | 971 | * @mst_mutex: protects the master node area, @mst_node, and @mst_offs |
| 972 | * @bulk_read_buf_size: buffer size for bulk-reads | ||
| 938 | * | 973 | * |
| 939 | * @log_lebs: number of logical eraseblocks in the log | 974 | * @log_lebs: number of logical eraseblocks in the log |
| 940 | * @log_bytes: log size in bytes | 975 | * @log_bytes: log size in bytes |
| @@ -977,12 +1012,17 @@ struct ubifs_mount_opts { | |||
| 977 | * but which still have to be taken into account because | 1012 | * but which still have to be taken into account because |
| 978 | * the index has not been committed so far | 1013 | * the index has not been committed so far |
| 979 | * @space_lock: protects @budg_idx_growth, @budg_data_growth, @budg_dd_growth, | 1014 | * @space_lock: protects @budg_idx_growth, @budg_data_growth, @budg_dd_growth, |
| 980 | * @budg_uncommited_idx, @min_idx_lebs, @old_idx_sz, and @lst; | 1015 | * @budg_uncommited_idx, @min_idx_lebs, @old_idx_sz, @lst, |
| 1016 | * @nospace, and @nospace_rp; | ||
| 981 | * @min_idx_lebs: minimum number of LEBs required for the index | 1017 | * @min_idx_lebs: minimum number of LEBs required for the index |
| 982 | * @old_idx_sz: size of index on flash | 1018 | * @old_idx_sz: size of index on flash |
| 983 | * @calc_idx_sz: temporary variable which is used to calculate new index size | 1019 | * @calc_idx_sz: temporary variable which is used to calculate new index size |
| 984 | * (contains accurate new index size at end of TNC commit start) | 1020 | * (contains accurate new index size at end of TNC commit start) |
| 985 | * @lst: lprops statistics | 1021 | * @lst: lprops statistics |
| 1022 | * @nospace: non-zero if the file-system does not have flash space (used as | ||
| 1023 | * optimization) | ||
| 1024 | * @nospace_rp: the same as @nospace, but additionally means that even reserved | ||
| 1025 | * pool is full | ||
| 986 | * | 1026 | * |
| 987 | * @page_budget: budget for a page | 1027 | * @page_budget: budget for a page |
| 988 | * @inode_budget: budget for an inode | 1028 | * @inode_budget: budget for an inode |
| @@ -1061,6 +1101,7 @@ struct ubifs_mount_opts { | |||
| 1061 | * @lpt_drty_flgs: dirty flags for LPT special nodes e.g. ltab | 1101 | * @lpt_drty_flgs: dirty flags for LPT special nodes e.g. ltab |
| 1062 | * @dirty_nn_cnt: number of dirty nnodes | 1102 | * @dirty_nn_cnt: number of dirty nnodes |
| 1063 | * @dirty_pn_cnt: number of dirty pnodes | 1103 | * @dirty_pn_cnt: number of dirty pnodes |
| 1104 | * @check_lpt_free: flag that indicates LPT GC may be needed | ||
| 1064 | * @lpt_sz: LPT size | 1105 | * @lpt_sz: LPT size |
| 1065 | * @lpt_nod_buf: buffer for an on-flash nnode or pnode | 1106 | * @lpt_nod_buf: buffer for an on-flash nnode or pnode |
| 1066 | * @lpt_buf: buffer of LEB size used by LPT | 1107 | * @lpt_buf: buffer of LEB size used by LPT |
| @@ -1102,6 +1143,7 @@ struct ubifs_mount_opts { | |||
| 1102 | * @rcvrd_mst_node: recovered master node to write when mounting ro to rw | 1143 | * @rcvrd_mst_node: recovered master node to write when mounting ro to rw |
| 1103 | * @size_tree: inode size information for recovery | 1144 | * @size_tree: inode size information for recovery |
| 1104 | * @remounting_rw: set while remounting from ro to rw (sb flags have MS_RDONLY) | 1145 | * @remounting_rw: set while remounting from ro to rw (sb flags have MS_RDONLY) |
| 1146 | * @always_chk_crc: always check CRCs (while mounting and remounting rw) | ||
| 1105 | * @mount_opts: UBIFS-specific mount options | 1147 | * @mount_opts: UBIFS-specific mount options |
| 1106 | * | 1148 | * |
| 1107 | * @dbg_buf: a buffer of LEB size used for debugging purposes | 1149 | * @dbg_buf: a buffer of LEB size used for debugging purposes |
| @@ -1146,11 +1188,11 @@ struct ubifs_info { | |||
| 1146 | int cmt_state; | 1188 | int cmt_state; |
| 1147 | spinlock_t cs_lock; | 1189 | spinlock_t cs_lock; |
| 1148 | wait_queue_head_t cmt_wq; | 1190 | wait_queue_head_t cmt_wq; |
| 1191 | |||
| 1149 | unsigned int fast_unmount:1; | 1192 | unsigned int fast_unmount:1; |
| 1150 | unsigned int big_lpt:1; | 1193 | unsigned int big_lpt:1; |
| 1151 | unsigned int check_lpt_free:1; | 1194 | unsigned int no_chk_data_crc:1; |
| 1152 | unsigned int nospace:1; | 1195 | unsigned int bulk_read:1; |
| 1153 | unsigned int nospace_rp:1; | ||
| 1154 | 1196 | ||
| 1155 | struct mutex tnc_mutex; | 1197 | struct mutex tnc_mutex; |
| 1156 | struct ubifs_zbranch zroot; | 1198 | struct ubifs_zbranch zroot; |
| @@ -1175,6 +1217,7 @@ struct ubifs_info { | |||
| 1175 | struct ubifs_mst_node *mst_node; | 1217 | struct ubifs_mst_node *mst_node; |
| 1176 | int mst_offs; | 1218 | int mst_offs; |
| 1177 | struct mutex mst_mutex; | 1219 | struct mutex mst_mutex; |
| 1220 | int bulk_read_buf_size; | ||
| 1178 | 1221 | ||
| 1179 | int log_lebs; | 1222 | int log_lebs; |
| 1180 | long long log_bytes; | 1223 | long long log_bytes; |
| @@ -1218,6 +1261,8 @@ struct ubifs_info { | |||
| 1218 | unsigned long long old_idx_sz; | 1261 | unsigned long long old_idx_sz; |
| 1219 | unsigned long long calc_idx_sz; | 1262 | unsigned long long calc_idx_sz; |
| 1220 | struct ubifs_lp_stats lst; | 1263 | struct ubifs_lp_stats lst; |
| 1264 | unsigned int nospace:1; | ||
| 1265 | unsigned int nospace_rp:1; | ||
| 1221 | 1266 | ||
| 1222 | int page_budget; | 1267 | int page_budget; |
| 1223 | int inode_budget; | 1268 | int inode_budget; |
| @@ -1294,6 +1339,7 @@ struct ubifs_info { | |||
| 1294 | int lpt_drty_flgs; | 1339 | int lpt_drty_flgs; |
| 1295 | int dirty_nn_cnt; | 1340 | int dirty_nn_cnt; |
| 1296 | int dirty_pn_cnt; | 1341 | int dirty_pn_cnt; |
| 1342 | int check_lpt_free; | ||
| 1297 | long long lpt_sz; | 1343 | long long lpt_sz; |
| 1298 | void *lpt_nod_buf; | 1344 | void *lpt_nod_buf; |
| 1299 | void *lpt_buf; | 1345 | void *lpt_buf; |
| @@ -1335,6 +1381,7 @@ struct ubifs_info { | |||
| 1335 | struct ubifs_mst_node *rcvrd_mst_node; | 1381 | struct ubifs_mst_node *rcvrd_mst_node; |
| 1336 | struct rb_root size_tree; | 1382 | struct rb_root size_tree; |
| 1337 | int remounting_rw; | 1383 | int remounting_rw; |
| 1384 | int always_chk_crc; | ||
| 1338 | struct ubifs_mount_opts mount_opts; | 1385 | struct ubifs_mount_opts mount_opts; |
| 1339 | 1386 | ||
| 1340 | #ifdef CONFIG_UBIFS_FS_DEBUG | 1387 | #ifdef CONFIG_UBIFS_FS_DEBUG |
| @@ -1347,6 +1394,12 @@ struct ubifs_info { | |||
| 1347 | unsigned long fail_timeout; | 1394 | unsigned long fail_timeout; |
| 1348 | unsigned int fail_cnt; | 1395 | unsigned int fail_cnt; |
| 1349 | unsigned int fail_cnt_max; | 1396 | unsigned int fail_cnt_max; |
| 1397 | long long chk_lpt_sz; | ||
| 1398 | long long chk_lpt_sz2; | ||
| 1399 | long long chk_lpt_wastage; | ||
| 1400 | int chk_lpt_lebs; | ||
| 1401 | int new_nhead_lnum; | ||
| 1402 | int new_nhead_offs; | ||
| 1350 | #endif | 1403 | #endif |
| 1351 | }; | 1404 | }; |
| 1352 | 1405 | ||
| @@ -1377,7 +1430,7 @@ int ubifs_read_node_wbuf(struct ubifs_wbuf *wbuf, void *buf, int type, int len, | |||
| 1377 | int ubifs_write_node(struct ubifs_info *c, void *node, int len, int lnum, | 1430 | int ubifs_write_node(struct ubifs_info *c, void *node, int len, int lnum, |
| 1378 | int offs, int dtype); | 1431 | int offs, int dtype); |
| 1379 | int ubifs_check_node(const struct ubifs_info *c, const void *buf, int lnum, | 1432 | int ubifs_check_node(const struct ubifs_info *c, const void *buf, int lnum, |
| 1380 | int offs, int quiet); | 1433 | int offs, int quiet, int chk_crc); |
| 1381 | void ubifs_prepare_node(struct ubifs_info *c, void *buf, int len, int pad); | 1434 | void ubifs_prepare_node(struct ubifs_info *c, void *buf, int len, int pad); |
| 1382 | void ubifs_prep_grp_node(struct ubifs_info *c, void *node, int len, int last); | 1435 | void ubifs_prep_grp_node(struct ubifs_info *c, void *node, int len, int last); |
| 1383 | int ubifs_io_init(struct ubifs_info *c); | 1436 | int ubifs_io_init(struct ubifs_info *c); |
| @@ -1490,6 +1543,8 @@ void destroy_old_idx(struct ubifs_info *c); | |||
| 1490 | int is_idx_node_in_tnc(struct ubifs_info *c, union ubifs_key *key, int level, | 1543 | int is_idx_node_in_tnc(struct ubifs_info *c, union ubifs_key *key, int level, |
| 1491 | int lnum, int offs); | 1544 | int lnum, int offs); |
| 1492 | int insert_old_idx_znode(struct ubifs_info *c, struct ubifs_znode *znode); | 1545 | int insert_old_idx_znode(struct ubifs_info *c, struct ubifs_znode *znode); |
| 1546 | int ubifs_tnc_get_bu_keys(struct ubifs_info *c, struct bu_info *bu); | ||
| 1547 | int ubifs_tnc_bulk_read(struct ubifs_info *c, struct bu_info *bu); | ||
| 1493 | 1548 | ||
| 1494 | /* tnc_misc.c */ | 1549 | /* tnc_misc.c */ |
| 1495 | struct ubifs_znode *ubifs_tnc_levelorder_next(struct ubifs_znode *zr, | 1550 | struct ubifs_znode *ubifs_tnc_levelorder_next(struct ubifs_znode *zr, |
| @@ -1586,12 +1641,10 @@ int ubifs_lpt_post_commit(struct ubifs_info *c); | |||
| 1586 | void ubifs_lpt_free(struct ubifs_info *c, int wr_only); | 1641 | void ubifs_lpt_free(struct ubifs_info *c, int wr_only); |
| 1587 | 1642 | ||
| 1588 | /* lprops.c */ | 1643 | /* lprops.c */ |
| 1589 | void ubifs_get_lprops(struct ubifs_info *c); | ||
| 1590 | const struct ubifs_lprops *ubifs_change_lp(struct ubifs_info *c, | 1644 | const struct ubifs_lprops *ubifs_change_lp(struct ubifs_info *c, |
| 1591 | const struct ubifs_lprops *lp, | 1645 | const struct ubifs_lprops *lp, |
| 1592 | int free, int dirty, int flags, | 1646 | int free, int dirty, int flags, |
| 1593 | int idx_gc_cnt); | 1647 | int idx_gc_cnt); |
| 1594 | void ubifs_release_lprops(struct ubifs_info *c); | ||
| 1595 | void ubifs_get_lp_stats(struct ubifs_info *c, struct ubifs_lp_stats *stats); | 1648 | void ubifs_get_lp_stats(struct ubifs_info *c, struct ubifs_lp_stats *stats); |
| 1596 | void ubifs_add_to_cat(struct ubifs_info *c, struct ubifs_lprops *lprops, | 1649 | void ubifs_add_to_cat(struct ubifs_info *c, struct ubifs_lprops *lprops, |
| 1597 | int cat); | 1650 | int cat); |
