1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23#ifndef __UBIFS_H__
24#define __UBIFS_H__
25
26#include <asm/div64.h>
27#include <linux/statfs.h>
28#include <linux/fs.h>
29#include <linux/err.h>
30#include <linux/sched.h>
31#include <linux/slab.h>
32#include <linux/vmalloc.h>
33#include <linux/spinlock.h>
34#include <linux/mutex.h>
35#include <linux/rwsem.h>
36#include <linux/mtd/ubi.h>
37#include <linux/pagemap.h>
38#include <linux/backing-dev.h>
39#include "ubifs-media.h"
40
41
42#define UBIFS_VERSION 1
43
44
45#define ubifs_msg(fmt, ...) \
46 printk(KERN_NOTICE "UBIFS: " fmt "\n", ##__VA_ARGS__)
47
48#define ubifs_err(fmt, ...) \
49 printk(KERN_ERR "UBIFS error (pid %d): %s: " fmt "\n", current->pid, \
50 __func__, ##__VA_ARGS__)
51
52#define ubifs_warn(fmt, ...) \
53 printk(KERN_WARNING "UBIFS warning (pid %d): %s: " fmt "\n", \
54 current->pid, __func__, ##__VA_ARGS__)
55
56
57#define UBIFS_SUPER_MAGIC 0x24051905
58
59
60#define UBIFS_BLOCKS_PER_PAGE (PAGE_CACHE_SIZE / UBIFS_BLOCK_SIZE)
61#define UBIFS_BLOCKS_PER_PAGE_SHIFT (PAGE_CACHE_SHIFT - UBIFS_BLOCK_SHIFT)
62
63
64#define SQNUM_WARN_WATERMARK 0xFFFFFFFF00000000ULL
65#define SQNUM_WATERMARK 0xFFFFFFFFFF000000ULL
66
67
68
69
70
71
72
73#define MIN_INDEX_LEBS 2
74
75
76#define MIN_WRITE_SZ (UBIFS_DATA_NODE_SZ + 8)
77
78
79
80
81
82
83
84#define INUM_WARN_WATERMARK 0xFFF00000
85#define INUM_WATERMARK 0xFFFFFF00
86
87
88#define CUR_MAX_KEY_LEN UBIFS_SK_LEN
89
90
91#define LPT_HEAP_SZ 256
92
93
94
95
96
97#define BGT_NAME_PATTERN "ubifs_bgt%d_%d"
98
99
100#define WBUF_TIMEOUT_SOFTLIMIT 3
101#define WBUF_TIMEOUT_HARDLIMIT 5
102
103
104#define MAX_INUM 0xFFFFFFFF
105
106
107#define NONDATA_JHEADS_CNT 2
108
109
110#define GCHD UBIFS_GC_HEAD
111#define BASEHD UBIFS_BASE_HEAD
112#define DATAHD UBIFS_DATA_HEAD
113
114
115#define LPROPS_NC 0x80000001
116
117
118
119
120
121
122
123
124
125
126#define UBIFS_TRUN_KEY UBIFS_KEY_TYPES_CNT
127#define UBIFS_INVALID_KEY UBIFS_KEY_TYPES_CNT
128
129
130
131
132
133#define CALC_DENT_SIZE(name_len) ALIGN(UBIFS_DENT_NODE_SZ + (name_len) + 1, 8)
134
135
136#define CALC_XATTR_BYTES(data_len) ALIGN(UBIFS_INO_NODE_SZ + (data_len) + 1, 8)
137
138
139
140
141
142
143
144#define OLD_ZNODE_AGE 20
145#define YOUNG_ZNODE_AGE 5
146
147
148
149
150
151
152#define WORST_COMPR_FACTOR 2
153
154
155
156
157#define COMPRESSED_DATA_NODE_BUF_SZ \
158 (UBIFS_DATA_NODE_SZ + UBIFS_BLOCK_SIZE * WORST_COMPR_FACTOR)
159
160
161#define BOTTOM_UP_HEIGHT 64
162
163
164#define UBIFS_MAX_BULK_READ 32
165
166
167
168
169enum {
170 WB_MUTEX_1 = 0,
171 WB_MUTEX_2 = 1,
172 WB_MUTEX_3 = 2,
173};
174
175
176
177
178
179
180
181
182
183
184
185enum {
186 DIRTY_ZNODE = 0,
187 COW_ZNODE = 1,
188 OBSOLETE_ZNODE = 2,
189};
190
191
192
193
194
195
196
197
198
199
200
201enum {
202 COMMIT_RESTING = 0,
203 COMMIT_BACKGROUND,
204 COMMIT_REQUIRED,
205 COMMIT_RUNNING_BACKGROUND,
206 COMMIT_RUNNING_REQUIRED,
207 COMMIT_BROKEN,
208};
209
210
211
212
213
214
215
216
217
218
219
220
221enum {
222 SCANNED_GARBAGE = 0,
223 SCANNED_EMPTY_SPACE = -1,
224 SCANNED_A_NODE = -2,
225 SCANNED_A_CORRUPT_NODE = -3,
226 SCANNED_A_BAD_PAD_NODE = -4,
227};
228
229
230
231
232
233
234
235
236
237enum {
238 DIRTY_CNODE = 0,
239 OBSOLETE_CNODE = 1,
240 COW_CNODE = 2,
241};
242
243
244
245
246
247
248
249enum {
250 LTAB_DIRTY = 1,
251 LSAVE_DIRTY = 2,
252};
253
254
255
256
257
258
259
260enum {
261 LEB_FREED,
262 LEB_FREED_IDX,
263 LEB_RETAINED,
264};
265
266
267
268
269
270
271
272struct ubifs_old_idx {
273 struct rb_node rb;
274 int lnum;
275 int offs;
276};
277
278
279union ubifs_key {
280 uint8_t u8[CUR_MAX_KEY_LEN];
281 uint32_t u32[CUR_MAX_KEY_LEN/4];
282 uint64_t u64[CUR_MAX_KEY_LEN/8];
283 __le32 j32[CUR_MAX_KEY_LEN/4];
284};
285
286
287
288
289
290
291
292
293
294
295
296struct ubifs_scan_node {
297 struct list_head list;
298 union ubifs_key key;
299 unsigned long long sqnum;
300 int type;
301 int offs;
302 int len;
303 void *node;
304};
305
306
307
308
309
310
311
312
313
314
315struct ubifs_scan_leb {
316 int lnum;
317 int nodes_cnt;
318 struct list_head nodes;
319 int endpt;
320 int ecc;
321 void *buf;
322};
323
324
325
326
327
328
329
330
331
332
333
334struct ubifs_gced_idx_leb {
335 struct list_head list;
336 int lnum;
337 int unmap;
338};
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397struct ubifs_inode {
398 struct inode vfs_inode;
399 unsigned long long creat_sqnum;
400 unsigned long long del_cmtno;
401 unsigned int xattr_size;
402 unsigned int xattr_cnt;
403 unsigned int xattr_names;
404 unsigned int dirty:1;
405 unsigned int xattr:1;
406 unsigned int bulk_read:1;
407 unsigned int compr_type:2;
408 struct mutex ui_mutex;
409 spinlock_t ui_lock;
410 loff_t synced_i_size;
411 loff_t ui_size;
412 int flags;
413 pgoff_t last_page_read;
414 pgoff_t read_in_a_row;
415 int data_len;
416 void *data;
417};
418
419
420
421
422
423
424
425
426
427
428
429struct ubifs_unclean_leb {
430 struct list_head list;
431 int lnum;
432 int endpt;
433};
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450enum {
451 LPROPS_UNCAT = 0,
452 LPROPS_DIRTY = 1,
453 LPROPS_DIRTY_IDX = 2,
454 LPROPS_FREE = 3,
455 LPROPS_HEAP_CNT = 3,
456 LPROPS_EMPTY = 4,
457 LPROPS_FREEABLE = 5,
458 LPROPS_FRDI_IDX = 6,
459 LPROPS_CAT_MASK = 15,
460 LPROPS_TAKEN = 16,
461 LPROPS_INDEX = 32,
462};
463
464
465
466
467
468
469
470
471
472
473struct ubifs_lprops {
474 int free;
475 int dirty;
476 int flags;
477 int lnum;
478 union {
479 struct list_head list;
480 int hpos;
481 };
482};
483
484
485
486
487
488
489
490
491struct ubifs_lpt_lprops {
492 int free;
493 int dirty;
494 unsigned tgc:1;
495 unsigned cmt:1;
496};
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524struct ubifs_lp_stats {
525 int empty_lebs;
526 int taken_empty_lebs;
527 int idx_lebs;
528 long long total_free;
529 long long total_dirty;
530 long long total_used;
531 long long total_dead;
532 long long total_dark;
533};
534
535struct ubifs_nnode;
536
537
538
539
540
541
542
543
544
545
546struct ubifs_cnode {
547 struct ubifs_nnode *parent;
548 struct ubifs_cnode *cnext;
549 unsigned long flags;
550 int iip;
551 int level;
552 int num;
553};
554
555
556
557
558
559
560
561
562
563
564
565struct ubifs_pnode {
566 struct ubifs_nnode *parent;
567 struct ubifs_cnode *cnext;
568 unsigned long flags;
569 int iip;
570 int level;
571 int num;
572 struct ubifs_lprops lprops[UBIFS_LPT_FANOUT];
573};
574
575
576
577
578
579
580
581
582
583struct ubifs_nbranch {
584 int lnum;
585 int offs;
586 union {
587 struct ubifs_nnode *nnode;
588 struct ubifs_pnode *pnode;
589 struct ubifs_cnode *cnode;
590 };
591};
592
593
594
595
596
597
598
599
600
601
602
603struct ubifs_nnode {
604 struct ubifs_nnode *parent;
605 struct ubifs_cnode *cnext;
606 unsigned long flags;
607 int iip;
608 int level;
609 int num;
610 struct ubifs_nbranch nbranch[UBIFS_LPT_FANOUT];
611};
612
613
614
615
616
617
618
619
620
621struct ubifs_lpt_heap {
622 struct ubifs_lprops **arr;
623 int cnt;
624 int max_cnt;
625};
626
627
628
629
630
631
632
633
634enum {
635 LPT_SCAN_CONTINUE = 0,
636 LPT_SCAN_ADD = 1,
637 LPT_SCAN_STOP = 2,
638};
639
640struct ubifs_info;
641
642
643typedef int (*ubifs_lpt_scan_callback)(struct ubifs_info *c,
644 const struct ubifs_lprops *lprops,
645 int in_tree, void *data);
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683struct ubifs_wbuf {
684 struct ubifs_info *c;
685 void *buf;
686 int lnum;
687 int offs;
688 int avail;
689 int used;
690 int size;
691 int dtype;
692 int jhead;
693 int (*sync_callback)(struct ubifs_info *c, int lnum, int free, int pad);
694 struct mutex io_mutex;
695 spinlock_t lock;
696 ktime_t softlimit;
697 unsigned long long delta;
698 struct hrtimer timer;
699 unsigned int no_timer:1;
700 unsigned int need_sync:1;
701 int next_ino;
702 ino_t *inodes;
703};
704
705
706
707
708
709
710
711
712
713struct ubifs_bud {
714 int lnum;
715 int start;
716 int jhead;
717 struct list_head list;
718 struct rb_node rb;
719};
720
721
722
723
724
725
726
727
728
729struct ubifs_jhead {
730 struct ubifs_wbuf wbuf;
731 struct list_head buds_list;
732 unsigned int grouped:1;
733};
734
735
736
737
738
739
740
741
742
743struct ubifs_zbranch {
744 union ubifs_key key;
745 union {
746 struct ubifs_znode *znode;
747 void *leaf;
748 };
749 int lnum;
750 int offs;
751 int len;
752};
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769struct ubifs_znode {
770 struct ubifs_znode *parent;
771 struct ubifs_znode *cnext;
772 unsigned long flags;
773 unsigned long time;
774 int level;
775 int child_cnt;
776 int iip;
777 int alt;
778#ifdef CONFIG_UBIFS_FS_DEBUG
779 int lnum, offs, len;
780#endif
781 struct ubifs_zbranch zbranch[];
782};
783
784
785
786
787
788
789
790
791
792
793
794
795struct bu_info {
796 union ubifs_key key;
797 struct ubifs_zbranch zbranch[UBIFS_MAX_BULK_READ];
798 void *buf;
799 int buf_len;
800 int gc_seq;
801 int cnt;
802 int blk_cnt;
803 int eof;
804};
805
806
807
808
809
810
811
812
813
814struct ubifs_node_range {
815 union {
816 int len;
817 int min_len;
818 };
819 int max_len;
820};
821
822
823
824
825
826
827
828
829
830
831struct ubifs_compressor {
832 int compr_type;
833 struct crypto_comp *cc;
834 struct mutex *comp_mutex;
835 struct mutex *decomp_mutex;
836 const char *name;
837 const char *capi_name;
838};
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874struct ubifs_budget_req {
875 unsigned int fast:1;
876 unsigned int recalculate:1;
877#ifndef UBIFS_DEBUG
878 unsigned int new_page:1;
879 unsigned int dirtied_page:1;
880 unsigned int new_dent:1;
881 unsigned int mod_dent:1;
882 unsigned int new_ino:1;
883 unsigned int new_ino_d:13;
884 unsigned int dirtied_ino:4;
885 unsigned int dirtied_ino_d:15;
886#else
887
888 unsigned int new_page;
889 unsigned int dirtied_page;
890 unsigned int new_dent;
891 unsigned int mod_dent;
892 unsigned int new_ino;
893 unsigned int new_ino_d;
894 unsigned int dirtied_ino;
895 unsigned int dirtied_ino_d;
896#endif
897 int idx_growth;
898 int data_growth;
899 int dd_growth;
900};
901
902
903
904
905
906
907
908
909
910
911
912struct ubifs_orphan {
913 struct rb_node rb;
914 struct list_head list;
915 struct list_head new_list;
916 struct ubifs_orphan *cnext;
917 struct ubifs_orphan *dnext;
918 ino_t inum;
919 int new;
920};
921
922
923
924
925
926
927
928
929
930
931
932
933
934struct ubifs_mount_opts {
935 unsigned int unmount_mode:2;
936 unsigned int bulk_read:2;
937 unsigned int chk_data_crc:2;
938 unsigned int override_compr:1;
939 unsigned int compr_type:2;
940};
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962struct ubifs_budg_info {
963 long long idx_growth;
964 long long data_growth;
965 long long dd_growth;
966 long long uncommitted_idx;
967 unsigned long long old_idx_sz;
968 int min_idx_lebs;
969 unsigned int nospace:1;
970 unsigned int nospace_rp:1;
971 int page_budget;
972 int inode_budget;
973 int dent_budget;
974};
975
976struct ubifs_debug_info;
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224struct ubifs_info {
1225 struct super_block *vfs_sb;
1226 struct backing_dev_info bdi;
1227
1228 ino_t highest_inum;
1229 unsigned long long max_sqnum;
1230 unsigned long long cmt_no;
1231 spinlock_t cnt_lock;
1232 int fmt_version;
1233 int ro_compat_version;
1234 unsigned char uuid[16];
1235
1236 int lhead_lnum;
1237 int lhead_offs;
1238 int ltail_lnum;
1239 struct mutex log_mutex;
1240 int min_log_bytes;
1241 long long cmt_bud_bytes;
1242
1243 struct rb_root buds;
1244 long long bud_bytes;
1245 spinlock_t buds_lock;
1246 int jhead_cnt;
1247 struct ubifs_jhead *jheads;
1248 long long max_bud_bytes;
1249 long long bg_bud_bytes;
1250 struct list_head old_buds;
1251 int max_bud_cnt;
1252
1253 struct rw_semaphore commit_sem;
1254 int cmt_state;
1255 spinlock_t cs_lock;
1256 wait_queue_head_t cmt_wq;
1257
1258 unsigned int big_lpt:1;
1259 unsigned int space_fixup:1;
1260 unsigned int no_chk_data_crc:1;
1261 unsigned int bulk_read:1;
1262 unsigned int default_compr:2;
1263 unsigned int rw_incompat:1;
1264
1265 struct mutex tnc_mutex;
1266 struct ubifs_zbranch zroot;
1267 struct ubifs_znode *cnext;
1268 struct ubifs_znode *enext;
1269 int *gap_lebs;
1270 void *cbuf;
1271 void *ileb_buf;
1272 int ileb_len;
1273 int ihead_lnum;
1274 int ihead_offs;
1275 int *ilebs;
1276 int ileb_cnt;
1277 int ileb_nxt;
1278 struct rb_root old_idx;
1279 int *bottom_up_buf;
1280
1281 struct ubifs_mst_node *mst_node;
1282 int mst_offs;
1283 struct mutex mst_mutex;
1284
1285 int max_bu_buf_len;
1286 struct mutex bu_mutex;
1287 struct bu_info bu;
1288
1289 struct mutex write_reserve_mutex;
1290 void *write_reserve_buf;
1291
1292 int log_lebs;
1293 long long log_bytes;
1294 int log_last;
1295 int lpt_lebs;
1296 int lpt_first;
1297 int lpt_last;
1298 int orph_lebs;
1299 int orph_first;
1300 int orph_last;
1301 int main_lebs;
1302 int main_first;
1303 long long main_bytes;
1304
1305 uint8_t key_hash_type;
1306 uint32_t (*key_hash)(const char *str, int len);
1307 int key_fmt;
1308 int key_len;
1309 int fanout;
1310
1311 int min_io_size;
1312 int min_io_shift;
1313 int max_write_size;
1314 int max_write_shift;
1315 int leb_size;
1316 int leb_start;
1317 int half_leb_size;
1318 int idx_leb_size;
1319 int leb_cnt;
1320 int max_leb_cnt;
1321 int old_leb_cnt;
1322 unsigned int ro_media:1;
1323 unsigned int ro_mount:1;
1324 unsigned int ro_error:1;
1325
1326 atomic_long_t dirty_pg_cnt;
1327 atomic_long_t dirty_zn_cnt;
1328 atomic_long_t clean_zn_cnt;
1329
1330 spinlock_t space_lock;
1331 struct ubifs_lp_stats lst;
1332 struct ubifs_budg_info bi;
1333 unsigned long long calc_idx_sz;
1334
1335 int ref_node_alsz;
1336 int mst_node_alsz;
1337 int min_idx_node_sz;
1338 int max_idx_node_sz;
1339 long long max_inode_sz;
1340 int max_znode_sz;
1341
1342 int leb_overhead;
1343 int dead_wm;
1344 int dark_wm;
1345 int block_cnt;
1346
1347 struct ubifs_node_range ranges[UBIFS_NODE_TYPES_CNT];
1348 struct ubi_volume_desc *ubi;
1349 struct ubi_device_info di;
1350 struct ubi_volume_info vi;
1351
1352 struct rb_root orph_tree;
1353 struct list_head orph_list;
1354 struct list_head orph_new;
1355 struct ubifs_orphan *orph_cnext;
1356 struct ubifs_orphan *orph_dnext;
1357 spinlock_t orphan_lock;
1358 void *orph_buf;
1359 int new_orphans;
1360 int cmt_orphans;
1361 int tot_orphans;
1362 int max_orphans;
1363 int ohead_lnum;
1364 int ohead_offs;
1365 int no_orphs;
1366
1367 struct task_struct *bgt;
1368 char bgt_name[sizeof(BGT_NAME_PATTERN) + 9];
1369 int need_bgt;
1370 int need_wbuf_sync;
1371
1372 int gc_lnum;
1373 void *sbuf;
1374 struct list_head idx_gc;
1375 int idx_gc_cnt;
1376 int gc_seq;
1377 int gced_lnum;
1378
1379 struct list_head infos_list;
1380 struct mutex umount_mutex;
1381 unsigned int shrinker_run_no;
1382
1383 int space_bits;
1384 int lpt_lnum_bits;
1385 int lpt_offs_bits;
1386 int lpt_spc_bits;
1387 int pcnt_bits;
1388 int lnum_bits;
1389 int nnode_sz;
1390 int pnode_sz;
1391 int ltab_sz;
1392 int lsave_sz;
1393 int pnode_cnt;
1394 int nnode_cnt;
1395 int lpt_hght;
1396 int pnodes_have;
1397
1398 struct mutex lp_mutex;
1399 int lpt_lnum;
1400 int lpt_offs;
1401 int nhead_lnum;
1402 int nhead_offs;
1403 int lpt_drty_flgs;
1404 int dirty_nn_cnt;
1405 int dirty_pn_cnt;
1406 int check_lpt_free;
1407 long long lpt_sz;
1408 void *lpt_nod_buf;
1409 void *lpt_buf;
1410 struct ubifs_nnode *nroot;
1411 struct ubifs_cnode *lpt_cnext;
1412 struct ubifs_lpt_heap lpt_heap[LPROPS_HEAP_CNT];
1413 struct ubifs_lpt_heap dirty_idx;
1414 struct list_head uncat_list;
1415 struct list_head empty_list;
1416 struct list_head freeable_list;
1417 struct list_head frdi_idx_list;
1418 int freeable_cnt;
1419
1420 int ltab_lnum;
1421 int ltab_offs;
1422 struct ubifs_lpt_lprops *ltab;
1423 struct ubifs_lpt_lprops *ltab_cmt;
1424 int lsave_cnt;
1425 int lsave_lnum;
1426 int lsave_offs;
1427 int *lsave;
1428 int lscan_lnum;
1429
1430 long long rp_size;
1431 long long report_rp_size;
1432 uid_t rp_uid;
1433 gid_t rp_gid;
1434
1435
1436 unsigned int empty:1;
1437 unsigned int need_recovery:1;
1438 unsigned int replaying:1;
1439 unsigned int mounting:1;
1440 unsigned int remounting_rw:1;
1441 struct list_head replay_list;
1442 struct list_head replay_buds;
1443 unsigned long long cs_sqnum;
1444 unsigned long long replay_sqnum;
1445 struct list_head unclean_leb_list;
1446 struct ubifs_mst_node *rcvrd_mst_node;
1447 struct rb_root size_tree;
1448 struct ubifs_mount_opts mount_opts;
1449
1450#ifdef CONFIG_UBIFS_FS_DEBUG
1451 struct ubifs_debug_info *dbg;
1452#endif
1453};
1454
1455extern struct list_head ubifs_infos;
1456extern spinlock_t ubifs_infos_lock;
1457extern atomic_long_t ubifs_clean_zn_cnt;
1458extern struct kmem_cache *ubifs_inode_slab;
1459extern const struct super_operations ubifs_super_operations;
1460extern const struct address_space_operations ubifs_file_address_operations;
1461extern const struct file_operations ubifs_file_operations;
1462extern const struct inode_operations ubifs_file_inode_operations;
1463extern const struct file_operations ubifs_dir_operations;
1464extern const struct inode_operations ubifs_dir_inode_operations;
1465extern const struct inode_operations ubifs_symlink_inode_operations;
1466extern struct backing_dev_info ubifs_backing_dev_info;
1467extern struct ubifs_compressor *ubifs_compressors[UBIFS_COMPR_TYPES_CNT];
1468
1469
1470void ubifs_ro_mode(struct ubifs_info *c, int err);
1471int ubifs_leb_read(const struct ubifs_info *c, int lnum, void *buf, int offs,
1472 int len, int even_ebadmsg);
1473int ubifs_leb_write(struct ubifs_info *c, int lnum, const void *buf, int offs,
1474 int len, int dtype);
1475int ubifs_leb_change(struct ubifs_info *c, int lnum, const void *buf, int len,
1476 int dtype);
1477int ubifs_leb_unmap(struct ubifs_info *c, int lnum);
1478int ubifs_leb_map(struct ubifs_info *c, int lnum, int dtype);
1479int ubifs_is_mapped(const struct ubifs_info *c, int lnum);
1480int ubifs_wbuf_write_nolock(struct ubifs_wbuf *wbuf, void *buf, int len);
1481int ubifs_wbuf_seek_nolock(struct ubifs_wbuf *wbuf, int lnum, int offs,
1482 int dtype);
1483int ubifs_wbuf_init(struct ubifs_info *c, struct ubifs_wbuf *wbuf);
1484int ubifs_read_node(const struct ubifs_info *c, void *buf, int type, int len,
1485 int lnum, int offs);
1486int ubifs_read_node_wbuf(struct ubifs_wbuf *wbuf, void *buf, int type, int len,
1487 int lnum, int offs);
1488int ubifs_write_node(struct ubifs_info *c, void *node, int len, int lnum,
1489 int offs, int dtype);
1490int ubifs_check_node(const struct ubifs_info *c, const void *buf, int lnum,
1491 int offs, int quiet, int must_chk_crc);
1492void ubifs_prepare_node(struct ubifs_info *c, void *buf, int len, int pad);
1493void ubifs_prep_grp_node(struct ubifs_info *c, void *node, int len, int last);
1494int ubifs_io_init(struct ubifs_info *c);
1495void ubifs_pad(const struct ubifs_info *c, void *buf, int pad);
1496int ubifs_wbuf_sync_nolock(struct ubifs_wbuf *wbuf);
1497int ubifs_bg_wbufs_sync(struct ubifs_info *c);
1498void ubifs_wbuf_add_ino_nolock(struct ubifs_wbuf *wbuf, ino_t inum);
1499int ubifs_sync_wbufs_by_inode(struct ubifs_info *c, struct inode *inode);
1500
1501
1502struct ubifs_scan_leb *ubifs_scan(const struct ubifs_info *c, int lnum,
1503 int offs, void *sbuf, int quiet);
1504void ubifs_scan_destroy(struct ubifs_scan_leb *sleb);
1505int ubifs_scan_a_node(const struct ubifs_info *c, void *buf, int len, int lnum,
1506 int offs, int quiet);
1507struct ubifs_scan_leb *ubifs_start_scan(const struct ubifs_info *c, int lnum,
1508 int offs, void *sbuf);
1509void ubifs_end_scan(const struct ubifs_info *c, struct ubifs_scan_leb *sleb,
1510 int lnum, int offs);
1511int ubifs_add_snod(const struct ubifs_info *c, struct ubifs_scan_leb *sleb,
1512 void *buf, int offs);
1513void ubifs_scanned_corruption(const struct ubifs_info *c, int lnum, int offs,
1514 void *buf);
1515
1516
1517void ubifs_add_bud(struct ubifs_info *c, struct ubifs_bud *bud);
1518void ubifs_create_buds_lists(struct ubifs_info *c);
1519int ubifs_add_bud_to_log(struct ubifs_info *c, int jhead, int lnum, int offs);
1520struct ubifs_bud *ubifs_search_bud(struct ubifs_info *c, int lnum);
1521struct ubifs_wbuf *ubifs_get_wbuf(struct ubifs_info *c, int lnum);
1522int ubifs_log_start_commit(struct ubifs_info *c, int *ltail_lnum);
1523int ubifs_log_end_commit(struct ubifs_info *c, int new_ltail_lnum);
1524int ubifs_log_post_commit(struct ubifs_info *c, int old_ltail_lnum);
1525int ubifs_consolidate_log(struct ubifs_info *c);
1526
1527
1528int ubifs_jnl_update(struct ubifs_info *c, const struct inode *dir,
1529 const struct qstr *nm, const struct inode *inode,
1530 int deletion, int xent);
1531int ubifs_jnl_write_data(struct ubifs_info *c, const struct inode *inode,
1532 const union ubifs_key *key, const void *buf, int len);
1533int ubifs_jnl_write_inode(struct ubifs_info *c, const struct inode *inode);
1534int ubifs_jnl_delete_inode(struct ubifs_info *c, const struct inode *inode);
1535int ubifs_jnl_rename(struct ubifs_info *c, const struct inode *old_dir,
1536 const struct dentry *old_dentry,
1537 const struct inode *new_dir,
1538 const struct dentry *new_dentry, int sync);
1539int ubifs_jnl_truncate(struct ubifs_info *c, const struct inode *inode,
1540 loff_t old_size, loff_t new_size);
1541int ubifs_jnl_delete_xattr(struct ubifs_info *c, const struct inode *host,
1542 const struct inode *inode, const struct qstr *nm);
1543int ubifs_jnl_change_xattr(struct ubifs_info *c, const struct inode *inode1,
1544 const struct inode *inode2);
1545
1546
1547int ubifs_budget_space(struct ubifs_info *c, struct ubifs_budget_req *req);
1548void ubifs_release_budget(struct ubifs_info *c, struct ubifs_budget_req *req);
1549void ubifs_release_dirty_inode_budget(struct ubifs_info *c,
1550 struct ubifs_inode *ui);
1551int ubifs_budget_inode_op(struct ubifs_info *c, struct inode *inode,
1552 struct ubifs_budget_req *req);
1553void ubifs_release_ino_dirty(struct ubifs_info *c, struct inode *inode,
1554 struct ubifs_budget_req *req);
1555void ubifs_cancel_ino_op(struct ubifs_info *c, struct inode *inode,
1556 struct ubifs_budget_req *req);
1557long long ubifs_get_free_space(struct ubifs_info *c);
1558long long ubifs_get_free_space_nolock(struct ubifs_info *c);
1559int ubifs_calc_min_idx_lebs(struct ubifs_info *c);
1560void ubifs_convert_page_budget(struct ubifs_info *c);
1561long long ubifs_reported_space(const struct ubifs_info *c, long long free);
1562long long ubifs_calc_available(const struct ubifs_info *c, int min_idx_lebs);
1563
1564
1565int ubifs_find_free_space(struct ubifs_info *c, int min_space, int *offs,
1566 int squeeze);
1567int ubifs_find_free_leb_for_idx(struct ubifs_info *c);
1568int ubifs_find_dirty_leb(struct ubifs_info *c, struct ubifs_lprops *ret_lp,
1569 int min_space, int pick_free);
1570int ubifs_find_dirty_idx_leb(struct ubifs_info *c);
1571int ubifs_save_dirty_idx_lnums(struct ubifs_info *c);
1572
1573
1574int ubifs_lookup_level0(struct ubifs_info *c, const union ubifs_key *key,
1575 struct ubifs_znode **zn, int *n);
1576int ubifs_tnc_lookup_nm(struct ubifs_info *c, const union ubifs_key *key,
1577 void *node, const struct qstr *nm);
1578int ubifs_tnc_locate(struct ubifs_info *c, const union ubifs_key *key,
1579 void *node, int *lnum, int *offs);
1580int ubifs_tnc_add(struct ubifs_info *c, const union ubifs_key *key, int lnum,
1581 int offs, int len);
1582int ubifs_tnc_replace(struct ubifs_info *c, const union ubifs_key *key,
1583 int old_lnum, int old_offs, int lnum, int offs, int len);
1584int ubifs_tnc_add_nm(struct ubifs_info *c, const union ubifs_key *key,
1585 int lnum, int offs, int len, const struct qstr *nm);
1586int ubifs_tnc_remove(struct ubifs_info *c, const union ubifs_key *key);
1587int ubifs_tnc_remove_nm(struct ubifs_info *c, const union ubifs_key *key,
1588 const struct qstr *nm);
1589int ubifs_tnc_remove_range(struct ubifs_info *c, union ubifs_key *from_key,
1590 union ubifs_key *to_key);
1591int ubifs_tnc_remove_ino(struct ubifs_info *c, ino_t inum);
1592struct ubifs_dent_node *ubifs_tnc_next_ent(struct ubifs_info *c,
1593 union ubifs_key *key,
1594 const struct qstr *nm);
1595void ubifs_tnc_close(struct ubifs_info *c);
1596int ubifs_tnc_has_node(struct ubifs_info *c, union ubifs_key *key, int level,
1597 int lnum, int offs, int is_idx);
1598int ubifs_dirty_idx_node(struct ubifs_info *c, union ubifs_key *key, int level,
1599 int lnum, int offs);
1600
1601void destroy_old_idx(struct ubifs_info *c);
1602int is_idx_node_in_tnc(struct ubifs_info *c, union ubifs_key *key, int level,
1603 int lnum, int offs);
1604int insert_old_idx_znode(struct ubifs_info *c, struct ubifs_znode *znode);
1605int ubifs_tnc_get_bu_keys(struct ubifs_info *c, struct bu_info *bu);
1606int ubifs_tnc_bulk_read(struct ubifs_info *c, struct bu_info *bu);
1607
1608
1609struct ubifs_znode *ubifs_tnc_levelorder_next(struct ubifs_znode *zr,
1610 struct ubifs_znode *znode);
1611int ubifs_search_zbranch(const struct ubifs_info *c,
1612 const struct ubifs_znode *znode,
1613 const union ubifs_key *key, int *n);
1614struct ubifs_znode *ubifs_tnc_postorder_first(struct ubifs_znode *znode);
1615struct ubifs_znode *ubifs_tnc_postorder_next(struct ubifs_znode *znode);
1616long ubifs_destroy_tnc_subtree(struct ubifs_znode *zr);
1617struct ubifs_znode *ubifs_load_znode(struct ubifs_info *c,
1618 struct ubifs_zbranch *zbr,
1619 struct ubifs_znode *parent, int iip);
1620int ubifs_tnc_read_node(struct ubifs_info *c, struct ubifs_zbranch *zbr,
1621 void *node);
1622
1623
1624int ubifs_tnc_start_commit(struct ubifs_info *c, struct ubifs_zbranch *zroot);
1625int ubifs_tnc_end_commit(struct ubifs_info *c);
1626
1627
1628int ubifs_shrinker(struct shrinker *shrink, struct shrink_control *sc);
1629
1630
1631int ubifs_bg_thread(void *info);
1632void ubifs_commit_required(struct ubifs_info *c);
1633void ubifs_request_bg_commit(struct ubifs_info *c);
1634int ubifs_run_commit(struct ubifs_info *c);
1635void ubifs_recovery_commit(struct ubifs_info *c);
1636int ubifs_gc_should_commit(struct ubifs_info *c);
1637void ubifs_wait_for_commit(struct ubifs_info *c);
1638
1639
1640int ubifs_read_master(struct ubifs_info *c);
1641int ubifs_write_master(struct ubifs_info *c);
1642
1643
1644int ubifs_read_superblock(struct ubifs_info *c);
1645struct ubifs_sb_node *ubifs_read_sb_node(struct ubifs_info *c);
1646int ubifs_write_sb_node(struct ubifs_info *c, struct ubifs_sb_node *sup);
1647int ubifs_fixup_free_space(struct ubifs_info *c);
1648
1649
1650int ubifs_validate_entry(struct ubifs_info *c,
1651 const struct ubifs_dent_node *dent);
1652int ubifs_replay_journal(struct ubifs_info *c);
1653
1654
1655int ubifs_garbage_collect(struct ubifs_info *c, int anyway);
1656int ubifs_gc_start_commit(struct ubifs_info *c);
1657int ubifs_gc_end_commit(struct ubifs_info *c);
1658void ubifs_destroy_idx_gc(struct ubifs_info *c);
1659int ubifs_get_idx_gc_leb(struct ubifs_info *c);
1660int ubifs_garbage_collect_leb(struct ubifs_info *c, struct ubifs_lprops *lp);
1661
1662
1663int ubifs_add_orphan(struct ubifs_info *c, ino_t inum);
1664void ubifs_delete_orphan(struct ubifs_info *c, ino_t inum);
1665int ubifs_orphan_start_commit(struct ubifs_info *c);
1666int ubifs_orphan_end_commit(struct ubifs_info *c);
1667int ubifs_mount_orphans(struct ubifs_info *c, int unclean, int read_only);
1668int ubifs_clear_orphans(struct ubifs_info *c);
1669
1670
1671int ubifs_calc_lpt_geom(struct ubifs_info *c);
1672int ubifs_create_dflt_lpt(struct ubifs_info *c, int *main_lebs, int lpt_first,
1673 int *lpt_lebs, int *big_lpt);
1674int ubifs_lpt_init(struct ubifs_info *c, int rd, int wr);
1675struct ubifs_lprops *ubifs_lpt_lookup(struct ubifs_info *c, int lnum);
1676struct ubifs_lprops *ubifs_lpt_lookup_dirty(struct ubifs_info *c, int lnum);
1677int ubifs_lpt_scan_nolock(struct ubifs_info *c, int start_lnum, int end_lnum,
1678 ubifs_lpt_scan_callback scan_cb, void *data);
1679
1680
1681void ubifs_pack_lsave(struct ubifs_info *c, void *buf, int *lsave);
1682void ubifs_pack_ltab(struct ubifs_info *c, void *buf,
1683 struct ubifs_lpt_lprops *ltab);
1684void ubifs_pack_pnode(struct ubifs_info *c, void *buf,
1685 struct ubifs_pnode *pnode);
1686void ubifs_pack_nnode(struct ubifs_info *c, void *buf,
1687 struct ubifs_nnode *nnode);
1688struct ubifs_pnode *ubifs_get_pnode(struct ubifs_info *c,
1689 struct ubifs_nnode *parent, int iip);
1690struct ubifs_nnode *ubifs_get_nnode(struct ubifs_info *c,
1691 struct ubifs_nnode *parent, int iip);
1692int ubifs_read_nnode(struct ubifs_info *c, struct ubifs_nnode *parent, int iip);
1693void ubifs_add_lpt_dirt(struct ubifs_info *c, int lnum, int dirty);
1694void ubifs_add_nnode_dirt(struct ubifs_info *c, struct ubifs_nnode *nnode);
1695uint32_t ubifs_unpack_bits(uint8_t **addr, int *pos, int nrbits);
1696struct ubifs_nnode *ubifs_first_nnode(struct ubifs_info *c, int *hght);
1697
1698int ubifs_unpack_nnode(const struct ubifs_info *c, void *buf,
1699 struct ubifs_nnode *nnode);
1700
1701
1702int ubifs_lpt_start_commit(struct ubifs_info *c);
1703int ubifs_lpt_end_commit(struct ubifs_info *c);
1704int ubifs_lpt_post_commit(struct ubifs_info *c);
1705void ubifs_lpt_free(struct ubifs_info *c, int wr_only);
1706
1707
1708const struct ubifs_lprops *ubifs_change_lp(struct ubifs_info *c,
1709 const struct ubifs_lprops *lp,
1710 int free, int dirty, int flags,
1711 int idx_gc_cnt);
1712void ubifs_get_lp_stats(struct ubifs_info *c, struct ubifs_lp_stats *lst);
1713void ubifs_add_to_cat(struct ubifs_info *c, struct ubifs_lprops *lprops,
1714 int cat);
1715void ubifs_replace_cat(struct ubifs_info *c, struct ubifs_lprops *old_lprops,
1716 struct ubifs_lprops *new_lprops);
1717void ubifs_ensure_cat(struct ubifs_info *c, struct ubifs_lprops *lprops);
1718int ubifs_categorize_lprops(const struct ubifs_info *c,
1719 const struct ubifs_lprops *lprops);
1720int ubifs_change_one_lp(struct ubifs_info *c, int lnum, int free, int dirty,
1721 int flags_set, int flags_clean, int idx_gc_cnt);
1722int ubifs_update_one_lp(struct ubifs_info *c, int lnum, int free, int dirty,
1723 int flags_set, int flags_clean);
1724int ubifs_read_one_lp(struct ubifs_info *c, int lnum, struct ubifs_lprops *lp);
1725const struct ubifs_lprops *ubifs_fast_find_free(struct ubifs_info *c);
1726const struct ubifs_lprops *ubifs_fast_find_empty(struct ubifs_info *c);
1727const struct ubifs_lprops *ubifs_fast_find_freeable(struct ubifs_info *c);
1728const struct ubifs_lprops *ubifs_fast_find_frdi_idx(struct ubifs_info *c);
1729int ubifs_calc_dark(const struct ubifs_info *c, int spc);
1730
1731
1732int ubifs_fsync(struct file *file, loff_t start, loff_t end, int datasync);
1733int ubifs_setattr(struct dentry *dentry, struct iattr *attr);
1734
1735
1736struct inode *ubifs_new_inode(struct ubifs_info *c, const struct inode *dir,
1737 umode_t mode);
1738int ubifs_getattr(struct vfsmount *mnt, struct dentry *dentry,
1739 struct kstat *stat);
1740
1741
1742int ubifs_setxattr(struct dentry *dentry, const char *name,
1743 const void *value, size_t size, int flags);
1744ssize_t ubifs_getxattr(struct dentry *dentry, const char *name, void *buf,
1745 size_t size);
1746ssize_t ubifs_listxattr(struct dentry *dentry, char *buffer, size_t size);
1747int ubifs_removexattr(struct dentry *dentry, const char *name);
1748
1749
1750struct inode *ubifs_iget(struct super_block *sb, unsigned long inum);
1751
1752
1753int ubifs_recover_master_node(struct ubifs_info *c);
1754int ubifs_write_rcvrd_mst_node(struct ubifs_info *c);
1755struct ubifs_scan_leb *ubifs_recover_leb(struct ubifs_info *c, int lnum,
1756 int offs, void *sbuf, int jhead);
1757struct ubifs_scan_leb *ubifs_recover_log_leb(struct ubifs_info *c, int lnum,
1758 int offs, void *sbuf);
1759int ubifs_recover_inl_heads(struct ubifs_info *c, void *sbuf);
1760int ubifs_clean_lebs(struct ubifs_info *c, void *sbuf);
1761int ubifs_rcvry_gc_commit(struct ubifs_info *c);
1762int ubifs_recover_size_accum(struct ubifs_info *c, union ubifs_key *key,
1763 int deletion, loff_t new_size);
1764int ubifs_recover_size(struct ubifs_info *c);
1765void ubifs_destroy_size_tree(struct ubifs_info *c);
1766
1767
1768long ubifs_ioctl(struct file *file, unsigned int cmd, unsigned long arg);
1769void ubifs_set_inode_flags(struct inode *inode);
1770#ifdef CONFIG_COMPAT
1771long ubifs_compat_ioctl(struct file *file, unsigned int cmd, unsigned long arg);
1772#endif
1773
1774
1775int __init ubifs_compressors_init(void);
1776void ubifs_compressors_exit(void);
1777void ubifs_compress(const void *in_buf, int in_len, void *out_buf, int *out_len,
1778 int *compr_type);
1779int ubifs_decompress(const void *buf, int len, void *out, int *out_len,
1780 int compr_type);
1781
1782#include "debug.h"
1783#include "misc.h"
1784#include "key.h"
1785
1786#endif
1787