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 <linux/security.h>
40#include <linux/xattr.h>
41#include <linux/random.h>
42
43#define __FS_HAS_ENCRYPTION IS_ENABLED(CONFIG_UBIFS_FS_ENCRYPTION)
44#include <linux/fscrypt.h>
45
46#include "ubifs-media.h"
47
48
49#define UBIFS_VERSION 1
50
51
52#define UBIFS_SUPER_MAGIC 0x24051905
53
54
55#define UBIFS_BLOCKS_PER_PAGE (PAGE_SIZE / UBIFS_BLOCK_SIZE)
56#define UBIFS_BLOCKS_PER_PAGE_SHIFT (PAGE_SHIFT - UBIFS_BLOCK_SHIFT)
57
58
59#define SQNUM_WARN_WATERMARK 0xFFFFFFFF00000000ULL
60#define SQNUM_WATERMARK 0xFFFFFFFFFF000000ULL
61
62
63
64
65
66
67
68#define MIN_INDEX_LEBS 2
69
70
71#define MIN_WRITE_SZ (UBIFS_DATA_NODE_SZ + 8)
72
73
74
75
76
77
78
79#define INUM_WARN_WATERMARK 0xFFF00000
80#define INUM_WATERMARK 0xFFFFFF00
81
82
83#define LPT_HEAP_SZ 256
84
85
86
87
88
89#define BGT_NAME_PATTERN "ubifs_bgt%d_%d"
90
91
92#define MAX_INUM 0xFFFFFFFF
93
94
95#define NONDATA_JHEADS_CNT 2
96
97
98#define GCHD UBIFS_GC_HEAD
99#define BASEHD UBIFS_BASE_HEAD
100#define DATAHD UBIFS_DATA_HEAD
101
102
103#define LPROPS_NC 0x80000001
104
105
106
107
108
109
110
111
112
113
114#define UBIFS_TRUN_KEY UBIFS_KEY_TYPES_CNT
115#define UBIFS_INVALID_KEY UBIFS_KEY_TYPES_CNT
116
117
118
119
120
121#define CALC_DENT_SIZE(name_len) ALIGN(UBIFS_DENT_NODE_SZ + (name_len) + 1, 8)
122
123
124#define CALC_XATTR_BYTES(data_len) ALIGN(UBIFS_INO_NODE_SZ + (data_len) + 1, 8)
125
126
127
128
129
130
131
132#define OLD_ZNODE_AGE 20
133#define YOUNG_ZNODE_AGE 5
134
135
136
137
138
139
140#define WORST_COMPR_FACTOR 2
141
142#ifdef CONFIG_UBIFS_FS_ENCRYPTION
143#define UBIFS_CIPHER_BLOCK_SIZE FS_CRYPTO_BLOCK_SIZE
144#else
145#define UBIFS_CIPHER_BLOCK_SIZE 0
146#endif
147
148
149
150
151#define COMPRESSED_DATA_NODE_BUF_SZ \
152 (UBIFS_DATA_NODE_SZ + UBIFS_BLOCK_SIZE * WORST_COMPR_FACTOR)
153
154
155#define BOTTOM_UP_HEIGHT 64
156
157
158#define UBIFS_MAX_BULK_READ 32
159
160
161
162
163enum {
164 WB_MUTEX_1 = 0,
165 WB_MUTEX_2 = 1,
166 WB_MUTEX_3 = 2,
167 WB_MUTEX_4 = 3,
168};
169
170
171
172
173
174
175
176
177
178
179
180enum {
181 DIRTY_ZNODE = 0,
182 COW_ZNODE = 1,
183 OBSOLETE_ZNODE = 2,
184};
185
186
187
188
189
190
191
192
193
194
195
196enum {
197 COMMIT_RESTING = 0,
198 COMMIT_BACKGROUND,
199 COMMIT_REQUIRED,
200 COMMIT_RUNNING_BACKGROUND,
201 COMMIT_RUNNING_REQUIRED,
202 COMMIT_BROKEN,
203};
204
205
206
207
208
209
210
211
212
213
214
215
216enum {
217 SCANNED_GARBAGE = 0,
218 SCANNED_EMPTY_SPACE = -1,
219 SCANNED_A_NODE = -2,
220 SCANNED_A_CORRUPT_NODE = -3,
221 SCANNED_A_BAD_PAD_NODE = -4,
222};
223
224
225
226
227
228
229
230
231
232enum {
233 DIRTY_CNODE = 0,
234 OBSOLETE_CNODE = 1,
235 COW_CNODE = 2,
236};
237
238
239
240
241
242
243
244enum {
245 LTAB_DIRTY = 1,
246 LSAVE_DIRTY = 2,
247};
248
249
250
251
252
253
254
255enum {
256 LEB_FREED,
257 LEB_FREED_IDX,
258 LEB_RETAINED,
259};
260
261
262
263
264
265
266
267enum {
268 ASSACT_REPORT = 0,
269 ASSACT_RO,
270 ASSACT_PANIC,
271};
272
273
274
275
276
277
278
279struct ubifs_old_idx {
280 struct rb_node rb;
281 int lnum;
282 int offs;
283};
284
285
286union ubifs_key {
287 uint8_t u8[UBIFS_SK_LEN];
288 uint32_t u32[UBIFS_SK_LEN/4];
289 uint64_t u64[UBIFS_SK_LEN/8];
290 __le32 j32[UBIFS_SK_LEN/4];
291};
292
293
294
295
296
297
298
299
300
301
302
303struct ubifs_scan_node {
304 struct list_head list;
305 union ubifs_key key;
306 unsigned long long sqnum;
307 int type;
308 int offs;
309 int len;
310 void *node;
311};
312
313
314
315
316
317
318
319
320
321struct ubifs_scan_leb {
322 int lnum;
323 int nodes_cnt;
324 struct list_head nodes;
325 int endpt;
326 void *buf;
327};
328
329
330
331
332
333
334
335
336
337
338
339struct ubifs_gced_idx_leb {
340 struct list_head list;
341 int lnum;
342 int unmap;
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
397
398
399
400
401
402struct ubifs_inode {
403 struct inode vfs_inode;
404 unsigned long long creat_sqnum;
405 unsigned long long del_cmtno;
406 unsigned int xattr_size;
407 unsigned int xattr_cnt;
408 unsigned int xattr_names;
409 unsigned int dirty:1;
410 unsigned int xattr:1;
411 unsigned int bulk_read:1;
412 unsigned int compr_type:2;
413 struct mutex ui_mutex;
414 spinlock_t ui_lock;
415 loff_t synced_i_size;
416 loff_t ui_size;
417 int flags;
418 pgoff_t last_page_read;
419 pgoff_t read_in_a_row;
420 int data_len;
421 void *data;
422};
423
424
425
426
427
428
429
430
431
432
433
434struct ubifs_unclean_leb {
435 struct list_head list;
436 int lnum;
437 int endpt;
438};
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455enum {
456 LPROPS_UNCAT = 0,
457 LPROPS_DIRTY = 1,
458 LPROPS_DIRTY_IDX = 2,
459 LPROPS_FREE = 3,
460 LPROPS_HEAP_CNT = 3,
461 LPROPS_EMPTY = 4,
462 LPROPS_FREEABLE = 5,
463 LPROPS_FRDI_IDX = 6,
464 LPROPS_CAT_MASK = 15,
465 LPROPS_TAKEN = 16,
466 LPROPS_INDEX = 32,
467};
468
469
470
471
472
473
474
475
476
477
478struct ubifs_lprops {
479 int free;
480 int dirty;
481 int flags;
482 int lnum;
483 union {
484 struct list_head list;
485 int hpos;
486 };
487};
488
489
490
491
492
493
494
495
496struct ubifs_lpt_lprops {
497 int free;
498 int dirty;
499 unsigned tgc:1;
500 unsigned cmt:1;
501};
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529struct ubifs_lp_stats {
530 int empty_lebs;
531 int taken_empty_lebs;
532 int idx_lebs;
533 long long total_free;
534 long long total_dirty;
535 long long total_used;
536 long long total_dead;
537 long long total_dark;
538};
539
540struct ubifs_nnode;
541
542
543
544
545
546
547
548
549
550
551struct ubifs_cnode {
552 struct ubifs_nnode *parent;
553 struct ubifs_cnode *cnext;
554 unsigned long flags;
555 int iip;
556 int level;
557 int num;
558};
559
560
561
562
563
564
565
566
567
568
569
570struct ubifs_pnode {
571 struct ubifs_nnode *parent;
572 struct ubifs_cnode *cnext;
573 unsigned long flags;
574 int iip;
575 int level;
576 int num;
577 struct ubifs_lprops lprops[UBIFS_LPT_FANOUT];
578};
579
580
581
582
583
584
585
586
587
588struct ubifs_nbranch {
589 int lnum;
590 int offs;
591 union {
592 struct ubifs_nnode *nnode;
593 struct ubifs_pnode *pnode;
594 struct ubifs_cnode *cnode;
595 };
596};
597
598
599
600
601
602
603
604
605
606
607
608struct ubifs_nnode {
609 struct ubifs_nnode *parent;
610 struct ubifs_cnode *cnext;
611 unsigned long flags;
612 int iip;
613 int level;
614 int num;
615 struct ubifs_nbranch nbranch[UBIFS_LPT_FANOUT];
616};
617
618
619
620
621
622
623
624
625
626struct ubifs_lpt_heap {
627 struct ubifs_lprops **arr;
628 int cnt;
629 int max_cnt;
630};
631
632
633
634
635
636
637
638
639enum {
640 LPT_SCAN_CONTINUE = 0,
641 LPT_SCAN_ADD = 1,
642 LPT_SCAN_STOP = 2,
643};
644
645struct ubifs_info;
646
647
648typedef int (*ubifs_lpt_scan_callback)(struct ubifs_info *c,
649 const struct ubifs_lprops *lprops,
650 int in_tree, void *data);
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 jhead;
692 int (*sync_callback)(struct ubifs_info *c, int lnum, int free, int pad);
693 struct mutex io_mutex;
694 spinlock_t lock;
695 struct hrtimer timer;
696 unsigned int no_timer:1;
697 unsigned int need_sync:1;
698 int next_ino;
699 ino_t *inodes;
700};
701
702
703
704
705
706
707
708
709
710struct ubifs_bud {
711 int lnum;
712 int start;
713 int jhead;
714 struct list_head list;
715 struct rb_node rb;
716};
717
718
719
720
721
722
723
724
725
726struct ubifs_jhead {
727 struct ubifs_wbuf wbuf;
728 struct list_head buds_list;
729 unsigned int grouped:1;
730};
731
732
733
734
735
736
737
738
739
740struct ubifs_zbranch {
741 union ubifs_key key;
742 union {
743 struct ubifs_znode *znode;
744 void *leaf;
745 };
746 int lnum;
747 int offs;
748 int len;
749};
750
751
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 time64_t time;
774 int level;
775 int child_cnt;
776 int iip;
777 int alt;
778 int lnum;
779 int offs;
780 int len;
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
912
913
914struct ubifs_orphan {
915 struct rb_node rb;
916 struct list_head list;
917 struct list_head new_list;
918 struct ubifs_orphan *cnext;
919 struct ubifs_orphan *dnext;
920 ino_t inum;
921 unsigned new:1;
922 unsigned cmt:1;
923 unsigned del:1;
924};
925
926
927
928
929
930
931
932
933
934
935
936
937
938struct ubifs_mount_opts {
939 unsigned int unmount_mode:2;
940 unsigned int bulk_read:2;
941 unsigned int chk_data_crc:2;
942 unsigned int override_compr:1;
943 unsigned int compr_type:2;
944};
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966struct ubifs_budg_info {
967 long long idx_growth;
968 long long data_growth;
969 long long dd_growth;
970 long long uncommitted_idx;
971 unsigned long long old_idx_sz;
972 int min_idx_lebs;
973 unsigned int nospace:1;
974 unsigned int nospace_rp:1;
975 int page_budget;
976 int inode_budget;
977 int dent_budget;
978};
979
980struct ubifs_debug_info;
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
1224
1225
1226
1227
1228
1229
1230
1231struct ubifs_info {
1232 struct super_block *vfs_sb;
1233
1234 ino_t highest_inum;
1235 unsigned long long max_sqnum;
1236 unsigned long long cmt_no;
1237 spinlock_t cnt_lock;
1238 int fmt_version;
1239 int ro_compat_version;
1240 unsigned char uuid[16];
1241
1242 int lhead_lnum;
1243 int lhead_offs;
1244 int ltail_lnum;
1245 struct mutex log_mutex;
1246 int min_log_bytes;
1247 long long cmt_bud_bytes;
1248
1249 struct rb_root buds;
1250 long long bud_bytes;
1251 spinlock_t buds_lock;
1252 int jhead_cnt;
1253 struct ubifs_jhead *jheads;
1254 long long max_bud_bytes;
1255 long long bg_bud_bytes;
1256 struct list_head old_buds;
1257 int max_bud_cnt;
1258
1259 struct rw_semaphore commit_sem;
1260 int cmt_state;
1261 spinlock_t cs_lock;
1262 wait_queue_head_t cmt_wq;
1263
1264 unsigned int big_lpt:1;
1265 unsigned int space_fixup:1;
1266 unsigned int double_hash:1;
1267 unsigned int encrypted:1;
1268 unsigned int no_chk_data_crc:1;
1269 unsigned int bulk_read:1;
1270 unsigned int default_compr:2;
1271 unsigned int rw_incompat:1;
1272 unsigned int assert_action:2;
1273
1274 struct mutex tnc_mutex;
1275 struct ubifs_zbranch zroot;
1276 struct ubifs_znode *cnext;
1277 struct ubifs_znode *enext;
1278 int *gap_lebs;
1279 void *cbuf;
1280 void *ileb_buf;
1281 int ileb_len;
1282 int ihead_lnum;
1283 int ihead_offs;
1284 int *ilebs;
1285 int ileb_cnt;
1286 int ileb_nxt;
1287 struct rb_root old_idx;
1288 int *bottom_up_buf;
1289
1290 struct ubifs_mst_node *mst_node;
1291 int mst_offs;
1292
1293 int max_bu_buf_len;
1294 struct mutex bu_mutex;
1295 struct bu_info bu;
1296
1297 struct mutex write_reserve_mutex;
1298 void *write_reserve_buf;
1299
1300 int log_lebs;
1301 long long log_bytes;
1302 int log_last;
1303 int lpt_lebs;
1304 int lpt_first;
1305 int lpt_last;
1306 int orph_lebs;
1307 int orph_first;
1308 int orph_last;
1309 int main_lebs;
1310 int main_first;
1311 long long main_bytes;
1312
1313 uint8_t key_hash_type;
1314 uint32_t (*key_hash)(const char *str, int len);
1315 int key_fmt;
1316 int key_len;
1317 int fanout;
1318
1319 int min_io_size;
1320 int min_io_shift;
1321 int max_write_size;
1322 int max_write_shift;
1323 int leb_size;
1324 int leb_start;
1325 int half_leb_size;
1326 int idx_leb_size;
1327 int leb_cnt;
1328 int max_leb_cnt;
1329 int old_leb_cnt;
1330 unsigned int ro_media:1;
1331 unsigned int ro_mount:1;
1332 unsigned int ro_error:1;
1333
1334 atomic_long_t dirty_pg_cnt;
1335 atomic_long_t dirty_zn_cnt;
1336 atomic_long_t clean_zn_cnt;
1337
1338 spinlock_t space_lock;
1339 struct ubifs_lp_stats lst;
1340 struct ubifs_budg_info bi;
1341 unsigned long long calc_idx_sz;
1342
1343 int ref_node_alsz;
1344 int mst_node_alsz;
1345 int min_idx_node_sz;
1346 int max_idx_node_sz;
1347 long long max_inode_sz;
1348 int max_znode_sz;
1349
1350 int leb_overhead;
1351 int dead_wm;
1352 int dark_wm;
1353 int block_cnt;
1354
1355 struct ubifs_node_range ranges[UBIFS_NODE_TYPES_CNT];
1356 struct ubi_volume_desc *ubi;
1357 struct ubi_device_info di;
1358 struct ubi_volume_info vi;
1359
1360 struct rb_root orph_tree;
1361 struct list_head orph_list;
1362 struct list_head orph_new;
1363 struct ubifs_orphan *orph_cnext;
1364 struct ubifs_orphan *orph_dnext;
1365 spinlock_t orphan_lock;
1366 void *orph_buf;
1367 int new_orphans;
1368 int cmt_orphans;
1369 int tot_orphans;
1370 int max_orphans;
1371 int ohead_lnum;
1372 int ohead_offs;
1373 int no_orphs;
1374
1375 struct task_struct *bgt;
1376 char bgt_name[sizeof(BGT_NAME_PATTERN) + 9];
1377 int need_bgt;
1378 int need_wbuf_sync;
1379
1380 int gc_lnum;
1381 void *sbuf;
1382 struct list_head idx_gc;
1383 int idx_gc_cnt;
1384 int gc_seq;
1385 int gced_lnum;
1386
1387 struct list_head infos_list;
1388 struct mutex umount_mutex;
1389 unsigned int shrinker_run_no;
1390
1391 int space_bits;
1392 int lpt_lnum_bits;
1393 int lpt_offs_bits;
1394 int lpt_spc_bits;
1395 int pcnt_bits;
1396 int lnum_bits;
1397 int nnode_sz;
1398 int pnode_sz;
1399 int ltab_sz;
1400 int lsave_sz;
1401 int pnode_cnt;
1402 int nnode_cnt;
1403 int lpt_hght;
1404 int pnodes_have;
1405
1406 struct mutex lp_mutex;
1407 int lpt_lnum;
1408 int lpt_offs;
1409 int nhead_lnum;
1410 int nhead_offs;
1411 int lpt_drty_flgs;
1412 int dirty_nn_cnt;
1413 int dirty_pn_cnt;
1414 int check_lpt_free;
1415 long long lpt_sz;
1416 void *lpt_nod_buf;
1417 void *lpt_buf;
1418 struct ubifs_nnode *nroot;
1419 struct ubifs_cnode *lpt_cnext;
1420 struct ubifs_lpt_heap lpt_heap[LPROPS_HEAP_CNT];
1421 struct ubifs_lpt_heap dirty_idx;
1422 struct list_head uncat_list;
1423 struct list_head empty_list;
1424 struct list_head freeable_list;
1425 struct list_head frdi_idx_list;
1426 int freeable_cnt;
1427 int in_a_category_cnt;
1428
1429 int ltab_lnum;
1430 int ltab_offs;
1431 struct ubifs_lpt_lprops *ltab;
1432 struct ubifs_lpt_lprops *ltab_cmt;
1433 int lsave_cnt;
1434 int lsave_lnum;
1435 int lsave_offs;
1436 int *lsave;
1437 int lscan_lnum;
1438
1439 long long rp_size;
1440 long long report_rp_size;
1441 kuid_t rp_uid;
1442 kgid_t rp_gid;
1443
1444
1445 unsigned int empty:1;
1446 unsigned int need_recovery:1;
1447 unsigned int replaying:1;
1448 unsigned int mounting:1;
1449 unsigned int remounting_rw:1;
1450 unsigned int probing:1;
1451 struct list_head replay_list;
1452 struct list_head replay_buds;
1453 unsigned long long cs_sqnum;
1454 struct list_head unclean_leb_list;
1455 struct ubifs_mst_node *rcvrd_mst_node;
1456 struct rb_root size_tree;
1457 struct ubifs_mount_opts mount_opts;
1458
1459 struct ubifs_debug_info *dbg;
1460};
1461
1462extern struct list_head ubifs_infos;
1463extern spinlock_t ubifs_infos_lock;
1464extern atomic_long_t ubifs_clean_zn_cnt;
1465extern const struct super_operations ubifs_super_operations;
1466extern const struct address_space_operations ubifs_file_address_operations;
1467extern const struct file_operations ubifs_file_operations;
1468extern const struct inode_operations ubifs_file_inode_operations;
1469extern const struct file_operations ubifs_dir_operations;
1470extern const struct inode_operations ubifs_dir_inode_operations;
1471extern const struct inode_operations ubifs_symlink_inode_operations;
1472extern struct ubifs_compressor *ubifs_compressors[UBIFS_COMPR_TYPES_CNT];
1473
1474
1475void ubifs_ro_mode(struct ubifs_info *c, int err);
1476int ubifs_leb_read(const struct ubifs_info *c, int lnum, void *buf, int offs,
1477 int len, int even_ebadmsg);
1478int ubifs_leb_write(struct ubifs_info *c, int lnum, const void *buf, int offs,
1479 int len);
1480int ubifs_leb_change(struct ubifs_info *c, int lnum, const void *buf, int len);
1481int ubifs_leb_unmap(struct ubifs_info *c, int lnum);
1482int ubifs_leb_map(struct ubifs_info *c, int lnum);
1483int ubifs_is_mapped(const struct ubifs_info *c, int lnum);
1484int ubifs_wbuf_write_nolock(struct ubifs_wbuf *wbuf, void *buf, int len);
1485int ubifs_wbuf_seek_nolock(struct ubifs_wbuf *wbuf, int lnum, int offs);
1486int ubifs_wbuf_init(struct ubifs_info *c, struct ubifs_wbuf *wbuf);
1487int ubifs_read_node(const struct ubifs_info *c, void *buf, int type, int len,
1488 int lnum, int offs);
1489int ubifs_read_node_wbuf(struct ubifs_wbuf *wbuf, void *buf, int type, int len,
1490 int lnum, int offs);
1491int ubifs_write_node(struct ubifs_info *c, void *node, int len, int lnum,
1492 int offs);
1493int ubifs_check_node(const struct ubifs_info *c, const void *buf, int lnum,
1494 int offs, int quiet, int must_chk_crc);
1495void ubifs_prepare_node(struct ubifs_info *c, void *buf, int len, int pad);
1496void ubifs_prep_grp_node(struct ubifs_info *c, void *node, int len, int last);
1497int ubifs_io_init(struct ubifs_info *c);
1498void ubifs_pad(const struct ubifs_info *c, void *buf, int pad);
1499int ubifs_wbuf_sync_nolock(struct ubifs_wbuf *wbuf);
1500int ubifs_bg_wbufs_sync(struct ubifs_info *c);
1501void ubifs_wbuf_add_ino_nolock(struct ubifs_wbuf *wbuf, ino_t inum);
1502int ubifs_sync_wbufs_by_inode(struct ubifs_info *c, struct inode *inode);
1503
1504
1505struct ubifs_scan_leb *ubifs_scan(const struct ubifs_info *c, int lnum,
1506 int offs, void *sbuf, int quiet);
1507void ubifs_scan_destroy(struct ubifs_scan_leb *sleb);
1508int ubifs_scan_a_node(const struct ubifs_info *c, void *buf, int len, int lnum,
1509 int offs, int quiet);
1510struct ubifs_scan_leb *ubifs_start_scan(const struct ubifs_info *c, int lnum,
1511 int offs, void *sbuf);
1512void ubifs_end_scan(const struct ubifs_info *c, struct ubifs_scan_leb *sleb,
1513 int lnum, int offs);
1514int ubifs_add_snod(const struct ubifs_info *c, struct ubifs_scan_leb *sleb,
1515 void *buf, int offs);
1516void ubifs_scanned_corruption(const struct ubifs_info *c, int lnum, int offs,
1517 void *buf);
1518
1519
1520void ubifs_add_bud(struct ubifs_info *c, struct ubifs_bud *bud);
1521void ubifs_create_buds_lists(struct ubifs_info *c);
1522int ubifs_add_bud_to_log(struct ubifs_info *c, int jhead, int lnum, int offs);
1523struct ubifs_bud *ubifs_search_bud(struct ubifs_info *c, int lnum);
1524struct ubifs_wbuf *ubifs_get_wbuf(struct ubifs_info *c, int lnum);
1525int ubifs_log_start_commit(struct ubifs_info *c, int *ltail_lnum);
1526int ubifs_log_end_commit(struct ubifs_info *c, int new_ltail_lnum);
1527int ubifs_log_post_commit(struct ubifs_info *c, int old_ltail_lnum);
1528int ubifs_consolidate_log(struct ubifs_info *c);
1529
1530
1531int ubifs_jnl_update(struct ubifs_info *c, const struct inode *dir,
1532 const struct fscrypt_name *nm, const struct inode *inode,
1533 int deletion, int xent);
1534int ubifs_jnl_write_data(struct ubifs_info *c, const struct inode *inode,
1535 const union ubifs_key *key, const void *buf, int len);
1536int ubifs_jnl_write_inode(struct ubifs_info *c, const struct inode *inode);
1537int ubifs_jnl_delete_inode(struct ubifs_info *c, const struct inode *inode);
1538int ubifs_jnl_xrename(struct ubifs_info *c, const struct inode *fst_dir,
1539 const struct inode *fst_inode,
1540 const struct fscrypt_name *fst_nm,
1541 const struct inode *snd_dir,
1542 const struct inode *snd_inode,
1543 const struct fscrypt_name *snd_nm, int sync);
1544int ubifs_jnl_rename(struct ubifs_info *c, const struct inode *old_dir,
1545 const struct inode *old_inode,
1546 const struct fscrypt_name *old_nm,
1547 const struct inode *new_dir,
1548 const struct inode *new_inode,
1549 const struct fscrypt_name *new_nm,
1550 const struct inode *whiteout, int sync);
1551int ubifs_jnl_truncate(struct ubifs_info *c, const struct inode *inode,
1552 loff_t old_size, loff_t new_size);
1553int ubifs_jnl_delete_xattr(struct ubifs_info *c, const struct inode *host,
1554 const struct inode *inode, const struct fscrypt_name *nm);
1555int ubifs_jnl_change_xattr(struct ubifs_info *c, const struct inode *inode1,
1556 const struct inode *inode2);
1557
1558
1559int ubifs_budget_space(struct ubifs_info *c, struct ubifs_budget_req *req);
1560void ubifs_release_budget(struct ubifs_info *c, struct ubifs_budget_req *req);
1561void ubifs_release_dirty_inode_budget(struct ubifs_info *c,
1562 struct ubifs_inode *ui);
1563int ubifs_budget_inode_op(struct ubifs_info *c, struct inode *inode,
1564 struct ubifs_budget_req *req);
1565void ubifs_release_ino_dirty(struct ubifs_info *c, struct inode *inode,
1566 struct ubifs_budget_req *req);
1567void ubifs_cancel_ino_op(struct ubifs_info *c, struct inode *inode,
1568 struct ubifs_budget_req *req);
1569long long ubifs_get_free_space(struct ubifs_info *c);
1570long long ubifs_get_free_space_nolock(struct ubifs_info *c);
1571int ubifs_calc_min_idx_lebs(struct ubifs_info *c);
1572void ubifs_convert_page_budget(struct ubifs_info *c);
1573long long ubifs_reported_space(const struct ubifs_info *c, long long free);
1574long long ubifs_calc_available(const struct ubifs_info *c, int min_idx_lebs);
1575
1576
1577int ubifs_find_free_space(struct ubifs_info *c, int min_space, int *offs,
1578 int squeeze);
1579int ubifs_find_free_leb_for_idx(struct ubifs_info *c);
1580int ubifs_find_dirty_leb(struct ubifs_info *c, struct ubifs_lprops *ret_lp,
1581 int min_space, int pick_free);
1582int ubifs_find_dirty_idx_leb(struct ubifs_info *c);
1583int ubifs_save_dirty_idx_lnums(struct ubifs_info *c);
1584
1585
1586int ubifs_lookup_level0(struct ubifs_info *c, const union ubifs_key *key,
1587 struct ubifs_znode **zn, int *n);
1588int ubifs_tnc_lookup_nm(struct ubifs_info *c, const union ubifs_key *key,
1589 void *node, const struct fscrypt_name *nm);
1590int ubifs_tnc_lookup_dh(struct ubifs_info *c, const union ubifs_key *key,
1591 void *node, uint32_t secondary_hash);
1592int ubifs_tnc_locate(struct ubifs_info *c, const union ubifs_key *key,
1593 void *node, int *lnum, int *offs);
1594int ubifs_tnc_add(struct ubifs_info *c, const union ubifs_key *key, int lnum,
1595 int offs, int len);
1596int ubifs_tnc_replace(struct ubifs_info *c, const union ubifs_key *key,
1597 int old_lnum, int old_offs, int lnum, int offs, int len);
1598int ubifs_tnc_add_nm(struct ubifs_info *c, const union ubifs_key *key,
1599 int lnum, int offs, int len, const struct fscrypt_name *nm);
1600int ubifs_tnc_remove(struct ubifs_info *c, const union ubifs_key *key);
1601int ubifs_tnc_remove_nm(struct ubifs_info *c, const union ubifs_key *key,
1602 const struct fscrypt_name *nm);
1603int ubifs_tnc_remove_dh(struct ubifs_info *c, const union ubifs_key *key,
1604 uint32_t cookie);
1605int ubifs_tnc_remove_range(struct ubifs_info *c, union ubifs_key *from_key,
1606 union ubifs_key *to_key);
1607int ubifs_tnc_remove_ino(struct ubifs_info *c, ino_t inum);
1608struct ubifs_dent_node *ubifs_tnc_next_ent(struct ubifs_info *c,
1609 union ubifs_key *key,
1610 const struct fscrypt_name *nm);
1611void ubifs_tnc_close(struct ubifs_info *c);
1612int ubifs_tnc_has_node(struct ubifs_info *c, union ubifs_key *key, int level,
1613 int lnum, int offs, int is_idx);
1614int ubifs_dirty_idx_node(struct ubifs_info *c, union ubifs_key *key, int level,
1615 int lnum, int offs);
1616
1617void destroy_old_idx(struct ubifs_info *c);
1618int is_idx_node_in_tnc(struct ubifs_info *c, union ubifs_key *key, int level,
1619 int lnum, int offs);
1620int insert_old_idx_znode(struct ubifs_info *c, struct ubifs_znode *znode);
1621int ubifs_tnc_get_bu_keys(struct ubifs_info *c, struct bu_info *bu);
1622int ubifs_tnc_bulk_read(struct ubifs_info *c, struct bu_info *bu);
1623
1624
1625struct ubifs_znode *ubifs_tnc_levelorder_next(const struct ubifs_info *c,
1626 struct ubifs_znode *zr,
1627 struct ubifs_znode *znode);
1628int ubifs_search_zbranch(const struct ubifs_info *c,
1629 const struct ubifs_znode *znode,
1630 const union ubifs_key *key, int *n);
1631struct ubifs_znode *ubifs_tnc_postorder_first(struct ubifs_znode *znode);
1632struct ubifs_znode *ubifs_tnc_postorder_next(const struct ubifs_info *c,
1633 struct ubifs_znode *znode);
1634long ubifs_destroy_tnc_subtree(const struct ubifs_info *c,
1635 struct ubifs_znode *zr);
1636struct ubifs_znode *ubifs_load_znode(struct ubifs_info *c,
1637 struct ubifs_zbranch *zbr,
1638 struct ubifs_znode *parent, int iip);
1639int ubifs_tnc_read_node(struct ubifs_info *c, struct ubifs_zbranch *zbr,
1640 void *node);
1641
1642
1643int ubifs_tnc_start_commit(struct ubifs_info *c, struct ubifs_zbranch *zroot);
1644int ubifs_tnc_end_commit(struct ubifs_info *c);
1645
1646
1647unsigned long ubifs_shrink_scan(struct shrinker *shrink,
1648 struct shrink_control *sc);
1649unsigned long ubifs_shrink_count(struct shrinker *shrink,
1650 struct shrink_control *sc);
1651
1652
1653int ubifs_bg_thread(void *info);
1654void ubifs_commit_required(struct ubifs_info *c);
1655void ubifs_request_bg_commit(struct ubifs_info *c);
1656int ubifs_run_commit(struct ubifs_info *c);
1657void ubifs_recovery_commit(struct ubifs_info *c);
1658int ubifs_gc_should_commit(struct ubifs_info *c);
1659void ubifs_wait_for_commit(struct ubifs_info *c);
1660
1661
1662int ubifs_read_master(struct ubifs_info *c);
1663int ubifs_write_master(struct ubifs_info *c);
1664
1665
1666int ubifs_read_superblock(struct ubifs_info *c);
1667struct ubifs_sb_node *ubifs_read_sb_node(struct ubifs_info *c);
1668int ubifs_write_sb_node(struct ubifs_info *c, struct ubifs_sb_node *sup);
1669int ubifs_fixup_free_space(struct ubifs_info *c);
1670int ubifs_enable_encryption(struct ubifs_info *c);
1671
1672
1673int ubifs_validate_entry(struct ubifs_info *c,
1674 const struct ubifs_dent_node *dent);
1675int ubifs_replay_journal(struct ubifs_info *c);
1676
1677
1678int ubifs_garbage_collect(struct ubifs_info *c, int anyway);
1679int ubifs_gc_start_commit(struct ubifs_info *c);
1680int ubifs_gc_end_commit(struct ubifs_info *c);
1681void ubifs_destroy_idx_gc(struct ubifs_info *c);
1682int ubifs_get_idx_gc_leb(struct ubifs_info *c);
1683int ubifs_garbage_collect_leb(struct ubifs_info *c, struct ubifs_lprops *lp);
1684
1685
1686int ubifs_add_orphan(struct ubifs_info *c, ino_t inum);
1687void ubifs_delete_orphan(struct ubifs_info *c, ino_t inum);
1688int ubifs_orphan_start_commit(struct ubifs_info *c);
1689int ubifs_orphan_end_commit(struct ubifs_info *c);
1690int ubifs_mount_orphans(struct ubifs_info *c, int unclean, int read_only);
1691int ubifs_clear_orphans(struct ubifs_info *c);
1692
1693
1694int ubifs_calc_lpt_geom(struct ubifs_info *c);
1695int ubifs_create_dflt_lpt(struct ubifs_info *c, int *main_lebs, int lpt_first,
1696 int *lpt_lebs, int *big_lpt);
1697int ubifs_lpt_init(struct ubifs_info *c, int rd, int wr);
1698struct ubifs_lprops *ubifs_lpt_lookup(struct ubifs_info *c, int lnum);
1699struct ubifs_lprops *ubifs_lpt_lookup_dirty(struct ubifs_info *c, int lnum);
1700int ubifs_lpt_scan_nolock(struct ubifs_info *c, int start_lnum, int end_lnum,
1701 ubifs_lpt_scan_callback scan_cb, void *data);
1702
1703
1704void ubifs_pack_lsave(struct ubifs_info *c, void *buf, int *lsave);
1705void ubifs_pack_ltab(struct ubifs_info *c, void *buf,
1706 struct ubifs_lpt_lprops *ltab);
1707void ubifs_pack_pnode(struct ubifs_info *c, void *buf,
1708 struct ubifs_pnode *pnode);
1709void ubifs_pack_nnode(struct ubifs_info *c, void *buf,
1710 struct ubifs_nnode *nnode);
1711struct ubifs_pnode *ubifs_get_pnode(struct ubifs_info *c,
1712 struct ubifs_nnode *parent, int iip);
1713struct ubifs_nnode *ubifs_get_nnode(struct ubifs_info *c,
1714 struct ubifs_nnode *parent, int iip);
1715int ubifs_read_nnode(struct ubifs_info *c, struct ubifs_nnode *parent, int iip);
1716void ubifs_add_lpt_dirt(struct ubifs_info *c, int lnum, int dirty);
1717void ubifs_add_nnode_dirt(struct ubifs_info *c, struct ubifs_nnode *nnode);
1718uint32_t ubifs_unpack_bits(const struct ubifs_info *c, uint8_t **addr, int *pos, int nrbits);
1719struct ubifs_nnode *ubifs_first_nnode(struct ubifs_info *c, int *hght);
1720
1721int ubifs_unpack_nnode(const struct ubifs_info *c, void *buf,
1722 struct ubifs_nnode *nnode);
1723
1724
1725int ubifs_lpt_start_commit(struct ubifs_info *c);
1726int ubifs_lpt_end_commit(struct ubifs_info *c);
1727int ubifs_lpt_post_commit(struct ubifs_info *c);
1728void ubifs_lpt_free(struct ubifs_info *c, int wr_only);
1729
1730
1731const struct ubifs_lprops *ubifs_change_lp(struct ubifs_info *c,
1732 const struct ubifs_lprops *lp,
1733 int free, int dirty, int flags,
1734 int idx_gc_cnt);
1735void ubifs_get_lp_stats(struct ubifs_info *c, struct ubifs_lp_stats *lst);
1736void ubifs_add_to_cat(struct ubifs_info *c, struct ubifs_lprops *lprops,
1737 int cat);
1738void ubifs_replace_cat(struct ubifs_info *c, struct ubifs_lprops *old_lprops,
1739 struct ubifs_lprops *new_lprops);
1740void ubifs_ensure_cat(struct ubifs_info *c, struct ubifs_lprops *lprops);
1741int ubifs_categorize_lprops(const struct ubifs_info *c,
1742 const struct ubifs_lprops *lprops);
1743int ubifs_change_one_lp(struct ubifs_info *c, int lnum, int free, int dirty,
1744 int flags_set, int flags_clean, int idx_gc_cnt);
1745int ubifs_update_one_lp(struct ubifs_info *c, int lnum, int free, int dirty,
1746 int flags_set, int flags_clean);
1747int ubifs_read_one_lp(struct ubifs_info *c, int lnum, struct ubifs_lprops *lp);
1748const struct ubifs_lprops *ubifs_fast_find_free(struct ubifs_info *c);
1749const struct ubifs_lprops *ubifs_fast_find_empty(struct ubifs_info *c);
1750const struct ubifs_lprops *ubifs_fast_find_freeable(struct ubifs_info *c);
1751const struct ubifs_lprops *ubifs_fast_find_frdi_idx(struct ubifs_info *c);
1752int ubifs_calc_dark(const struct ubifs_info *c, int spc);
1753
1754
1755int ubifs_fsync(struct file *file, loff_t start, loff_t end, int datasync);
1756int ubifs_setattr(struct dentry *dentry, struct iattr *attr);
1757#ifdef CONFIG_UBIFS_ATIME_SUPPORT
1758int ubifs_update_time(struct inode *inode, struct timespec64 *time, int flags);
1759#endif
1760
1761
1762struct inode *ubifs_new_inode(struct ubifs_info *c, struct inode *dir,
1763 umode_t mode);
1764int ubifs_getattr(const struct path *path, struct kstat *stat,
1765 u32 request_mask, unsigned int flags);
1766int ubifs_check_dir_empty(struct inode *dir);
1767
1768
1769extern const struct xattr_handler *ubifs_xattr_handlers[];
1770ssize_t ubifs_listxattr(struct dentry *dentry, char *buffer, size_t size);
1771int ubifs_xattr_set(struct inode *host, const char *name, const void *value,
1772 size_t size, int flags, bool check_lock);
1773ssize_t ubifs_xattr_get(struct inode *host, const char *name, void *buf,
1774 size_t size);
1775
1776#ifdef CONFIG_UBIFS_FS_XATTR
1777void ubifs_evict_xattr_inode(struct ubifs_info *c, ino_t xattr_inum);
1778#else
1779static inline void ubifs_evict_xattr_inode(struct ubifs_info *c,
1780 ino_t xattr_inum) { }
1781#endif
1782
1783#ifdef CONFIG_UBIFS_FS_SECURITY
1784extern int ubifs_init_security(struct inode *dentry, struct inode *inode,
1785 const struct qstr *qstr);
1786#else
1787static inline int ubifs_init_security(struct inode *dentry,
1788 struct inode *inode, const struct qstr *qstr)
1789{
1790 return 0;
1791}
1792#endif
1793
1794
1795
1796struct inode *ubifs_iget(struct super_block *sb, unsigned long inum);
1797
1798
1799int ubifs_recover_master_node(struct ubifs_info *c);
1800int ubifs_write_rcvrd_mst_node(struct ubifs_info *c);
1801struct ubifs_scan_leb *ubifs_recover_leb(struct ubifs_info *c, int lnum,
1802 int offs, void *sbuf, int jhead);
1803struct ubifs_scan_leb *ubifs_recover_log_leb(struct ubifs_info *c, int lnum,
1804 int offs, void *sbuf);
1805int ubifs_recover_inl_heads(struct ubifs_info *c, void *sbuf);
1806int ubifs_clean_lebs(struct ubifs_info *c, void *sbuf);
1807int ubifs_rcvry_gc_commit(struct ubifs_info *c);
1808int ubifs_recover_size_accum(struct ubifs_info *c, union ubifs_key *key,
1809 int deletion, loff_t new_size);
1810int ubifs_recover_size(struct ubifs_info *c);
1811void ubifs_destroy_size_tree(struct ubifs_info *c);
1812
1813
1814long ubifs_ioctl(struct file *file, unsigned int cmd, unsigned long arg);
1815void ubifs_set_inode_flags(struct inode *inode);
1816#ifdef CONFIG_COMPAT
1817long ubifs_compat_ioctl(struct file *file, unsigned int cmd, unsigned long arg);
1818#endif
1819
1820
1821int __init ubifs_compressors_init(void);
1822void ubifs_compressors_exit(void);
1823void ubifs_compress(const struct ubifs_info *c, const void *in_buf, int in_len,
1824 void *out_buf, int *out_len, int *compr_type);
1825int ubifs_decompress(const struct ubifs_info *c, const void *buf, int len,
1826 void *out, int *out_len, int compr_type);
1827
1828#include "debug.h"
1829#include "misc.h"
1830#include "key.h"
1831
1832#ifndef CONFIG_UBIFS_FS_ENCRYPTION
1833static inline int ubifs_encrypt(const struct inode *inode,
1834 struct ubifs_data_node *dn,
1835 unsigned int in_len, unsigned int *out_len,
1836 int block)
1837{
1838 struct ubifs_info *c = inode->i_sb->s_fs_info;
1839 ubifs_assert(c, 0);
1840 return -EOPNOTSUPP;
1841}
1842static inline int ubifs_decrypt(const struct inode *inode,
1843 struct ubifs_data_node *dn,
1844 unsigned int *out_len, int block)
1845{
1846 struct ubifs_info *c = inode->i_sb->s_fs_info;
1847 ubifs_assert(c, 0);
1848 return -EOPNOTSUPP;
1849}
1850#else
1851
1852int ubifs_encrypt(const struct inode *inode, struct ubifs_data_node *dn,
1853 unsigned int in_len, unsigned int *out_len, int block);
1854int ubifs_decrypt(const struct inode *inode, struct ubifs_data_node *dn,
1855 unsigned int *out_len, int block);
1856#endif
1857
1858extern const struct fscrypt_operations ubifs_crypt_operations;
1859
1860static inline bool ubifs_crypt_is_encrypted(const struct inode *inode)
1861{
1862 const struct ubifs_inode *ui = ubifs_inode(inode);
1863
1864 return ui->flags & UBIFS_CRYPT_FL;
1865}
1866
1867
1868__printf(2, 3)
1869void ubifs_msg(const struct ubifs_info *c, const char *fmt, ...);
1870__printf(2, 3)
1871void ubifs_err(const struct ubifs_info *c, const char *fmt, ...);
1872__printf(2, 3)
1873void ubifs_warn(const struct ubifs_info *c, const char *fmt, ...);
1874
1875
1876
1877
1878#define ubifs_errc(c, fmt, ...) \
1879do { \
1880 if (!(c)->probing) \
1881 ubifs_err(c, fmt, ##__VA_ARGS__); \
1882} while (0)
1883
1884#endif
1885