This source file includes following definitions.
- ubi_leb_valid
- ubi_update_fastmap
- ubi_fastmap_init_checkmap
- ubi_fastmap_destroy_checkmap
- ubiblock_init
- ubiblock_exit
- ubiblock_create
- ubiblock_remove
- ubi_move_aeb_to_list
- ubi_init_vid_buf
- ubi_alloc_vid_buf
- ubi_free_vid_buf
- ubi_get_vid_hdr
- ubi_io_read_data
- ubi_io_write_data
- ubi_ro_mode
- vol_id2idx
- idx2vol_id
- ubi_is_fm_vol
- ubi_find_fm_block
1
2
3
4
5
6
7
8
9 #ifndef __UBI_UBI_H__
10 #define __UBI_UBI_H__
11
12 #include <linux/types.h>
13 #include <linux/list.h>
14 #include <linux/rbtree.h>
15 #include <linux/sched.h>
16 #include <linux/wait.h>
17 #include <linux/mutex.h>
18 #include <linux/rwsem.h>
19 #include <linux/spinlock.h>
20 #include <linux/fs.h>
21 #include <linux/cdev.h>
22 #include <linux/device.h>
23 #include <linux/slab.h>
24 #include <linux/string.h>
25 #include <linux/vmalloc.h>
26 #include <linux/notifier.h>
27 #include <linux/mtd/mtd.h>
28 #include <linux/mtd/ubi.h>
29 #include <asm/pgtable.h>
30
31 #include "ubi-media.h"
32
33
34 #define UBI_MAX_DEVICES 32
35
36
37 #define UBI_NAME_STR "ubi"
38
39 struct ubi_device;
40
41
42 __printf(2, 3)
43 void ubi_msg(const struct ubi_device *ubi, const char *fmt, ...);
44
45
46 __printf(2, 3)
47 void ubi_warn(const struct ubi_device *ubi, const char *fmt, ...);
48
49
50 __printf(2, 3)
51 void ubi_err(const struct ubi_device *ubi, const char *fmt, ...);
52
53
54 #define UBI_BGT_NAME_PATTERN "ubi_bgt%dd"
55
56
57
58
59
60 #define UBI_LEB_UNMAPPED -1
61
62
63
64
65
66 #define UBI_IO_RETRIES 3
67
68
69
70
71
72
73 #define UBI_PROT_QUEUE_LEN 10
74
75
76 #define UBI_UNKNOWN -1
77
78
79
80
81
82 #define UBI_DFS_DIR_NAME "ubi%d"
83 #define UBI_DFS_DIR_LEN (3 + 2 + 1)
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102 enum {
103 UBI_IO_FF = 1,
104 UBI_IO_FF_BITFLIPS,
105 UBI_IO_BAD_HDR,
106 UBI_IO_BAD_HDR_EBADMSG,
107 UBI_IO_BITFLIPS,
108 };
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125 enum {
126 MOVE_CANCEL_RACE = 1,
127 MOVE_SOURCE_RD_ERR,
128 MOVE_TARGET_RD_ERR,
129 MOVE_TARGET_WR_ERR,
130 MOVE_TARGET_BITFLIPS,
131 MOVE_RETRY,
132 };
133
134
135
136
137
138
139
140 enum {
141 UBI_NO_FASTMAP = 1,
142 UBI_BAD_FASTMAP,
143 };
144
145
146
147
148
149
150
151 enum {
152 POWER_CUT_EC_WRITE = 0x01,
153 POWER_CUT_VID_WRITE = 0x02,
154 };
155
156
157
158
159
160
161
162 struct ubi_vid_io_buf {
163 struct ubi_vid_hdr *hdr;
164 void *buffer;
165 };
166
167
168
169
170
171
172
173
174
175
176
177
178 struct ubi_wl_entry {
179 union {
180 struct rb_node rb;
181 struct list_head list;
182 } u;
183 int ec;
184 int pnum;
185 };
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201 struct ubi_ltree_entry {
202 struct rb_node rb;
203 int vol_id;
204 int lnum;
205 int users;
206 struct rw_semaphore mutex;
207 };
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222 struct ubi_rename_entry {
223 int new_name_len;
224 char new_name[UBI_VOL_NAME_MAX + 1];
225 int remove;
226 struct ubi_volume_desc *desc;
227 struct list_head list;
228 };
229
230 struct ubi_volume_desc;
231
232
233
234
235
236
237
238
239
240 struct ubi_fastmap_layout {
241 struct ubi_wl_entry *e[UBI_FM_MAX_BLOCKS];
242 int to_be_tortured[UBI_FM_MAX_BLOCKS];
243 int used_blocks;
244 int max_pool_size;
245 int max_wl_pool_size;
246 };
247
248
249
250
251
252
253
254
255
256
257
258
259
260 struct ubi_fm_pool {
261 int pebs[UBI_FM_MAX_POOL_SIZE];
262 int used;
263 int size;
264 int max_size;
265 };
266
267
268
269
270
271
272
273
274
275
276
277 struct ubi_eba_leb_desc {
278 int lnum;
279 int pnum;
280 };
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338 struct ubi_volume {
339 struct device dev;
340 struct cdev cdev;
341 struct ubi_device *ubi;
342 int vol_id;
343 int ref_count;
344 int readers;
345 int writers;
346 int exclusive;
347 int metaonly;
348
349 int reserved_pebs;
350 int vol_type;
351 int usable_leb_size;
352 int used_ebs;
353 int last_eb_bytes;
354 long long used_bytes;
355 int alignment;
356 int data_pad;
357 int name_len;
358 char name[UBI_VOL_NAME_MAX + 1];
359
360 int upd_ebs;
361 int ch_lnum;
362 long long upd_bytes;
363 long long upd_received;
364 void *upd_buf;
365
366 struct ubi_eba_table *eba_tbl;
367 unsigned int skip_check:1;
368 unsigned int checked:1;
369 unsigned int corrupted:1;
370 unsigned int upd_marker:1;
371 unsigned int updating:1;
372 unsigned int changing_leb:1;
373 unsigned int direct_writes:1;
374
375 #ifdef CONFIG_MTD_UBI_FASTMAP
376 unsigned long *checkmap;
377 #endif
378 };
379
380
381
382
383
384
385
386 struct ubi_volume_desc {
387 struct ubi_volume *vol;
388 int mode;
389 };
390
391 struct ubi_wl_entry;
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418 struct ubi_debug_info {
419 unsigned int chk_gen:1;
420 unsigned int chk_io:1;
421 unsigned int chk_fastmap:1;
422 unsigned int disable_bgt:1;
423 unsigned int emulate_bitflips:1;
424 unsigned int emulate_io_failures:1;
425 unsigned int emulate_power_cut:2;
426 unsigned int power_cut_counter;
427 unsigned int power_cut_min;
428 unsigned int power_cut_max;
429 char dfs_dir_name[UBI_DFS_DIR_LEN + 1];
430 struct dentry *dfs_dir;
431 struct dentry *dfs_chk_gen;
432 struct dentry *dfs_chk_io;
433 struct dentry *dfs_chk_fastmap;
434 struct dentry *dfs_disable_bgt;
435 struct dentry *dfs_emulate_bitflips;
436 struct dentry *dfs_emulate_io_failures;
437 struct dentry *dfs_emulate_power_cut;
438 struct dentry *dfs_power_cut_min;
439 struct dentry *dfs_power_cut_max;
440 };
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
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
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557 struct ubi_device {
558 struct cdev cdev;
559 struct device dev;
560 int ubi_num;
561 char ubi_name[sizeof(UBI_NAME_STR)+5];
562 int vol_count;
563 struct ubi_volume *volumes[UBI_MAX_VOLUMES+UBI_INT_VOL_COUNT];
564 spinlock_t volumes_lock;
565 int ref_count;
566 int image_seq;
567
568 int rsvd_pebs;
569 int avail_pebs;
570 int beb_rsvd_pebs;
571 int beb_rsvd_level;
572 int bad_peb_limit;
573
574 int autoresize_vol_id;
575 int vtbl_slots;
576 int vtbl_size;
577 struct ubi_vtbl_record *vtbl;
578 struct mutex device_mutex;
579
580 int max_ec;
581
582 int mean_ec;
583
584
585 unsigned long long global_sqnum;
586 spinlock_t ltree_lock;
587 struct rb_root ltree;
588 struct mutex alc_mutex;
589
590
591 int fm_disabled;
592 struct ubi_fastmap_layout *fm;
593 struct ubi_fm_pool fm_pool;
594 struct ubi_fm_pool fm_wl_pool;
595 struct rw_semaphore fm_eba_sem;
596 struct rw_semaphore fm_protect;
597 void *fm_buf;
598 size_t fm_size;
599 struct work_struct fm_work;
600 int fm_work_scheduled;
601 int fast_attach;
602
603
604 struct rb_root used;
605 struct rb_root erroneous;
606 struct rb_root free;
607 int free_count;
608 struct rb_root scrub;
609 struct list_head pq[UBI_PROT_QUEUE_LEN];
610 int pq_head;
611 spinlock_t wl_lock;
612 struct mutex move_mutex;
613 struct rw_semaphore work_sem;
614 int wl_scheduled;
615 struct ubi_wl_entry **lookuptbl;
616 struct ubi_wl_entry *move_from;
617 struct ubi_wl_entry *move_to;
618 int move_to_put;
619 struct list_head works;
620 int works_count;
621 struct task_struct *bgt_thread;
622 int thread_enabled;
623 char bgt_name[sizeof(UBI_BGT_NAME_PATTERN)+2];
624
625
626 long long flash_size;
627 int peb_count;
628 int peb_size;
629 int bad_peb_count;
630 int good_peb_count;
631 int corr_peb_count;
632 int erroneous_peb_count;
633 int max_erroneous;
634 int min_io_size;
635 int hdrs_min_io_size;
636 int ro_mode;
637 int leb_size;
638 int leb_start;
639 int ec_hdr_alsize;
640 int vid_hdr_alsize;
641 int vid_hdr_offset;
642 int vid_hdr_aloffset;
643 int vid_hdr_shift;
644 unsigned int bad_allowed:1;
645 unsigned int nor_flash:1;
646 int max_write_size;
647 struct mtd_info *mtd;
648
649 void *peb_buf;
650 struct mutex buf_mutex;
651 struct mutex ckvol_mutex;
652
653 struct ubi_debug_info dbg;
654 };
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673 struct ubi_ainf_peb {
674 int ec;
675 int pnum;
676 int vol_id;
677 int lnum;
678 unsigned int scrub:1;
679 unsigned int copy_flag:1;
680 unsigned long long sqnum;
681 union {
682 struct rb_node rb;
683 struct list_head list;
684 } u;
685 };
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708 struct ubi_ainf_volume {
709 int vol_id;
710 int highest_lnum;
711 int leb_count;
712 int vol_type;
713 int used_ebs;
714 int last_data_size;
715 int data_pad;
716 int compat;
717 struct rb_node rb;
718 struct rb_root root;
719 };
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757 struct ubi_attach_info {
758 struct rb_root volumes;
759 struct list_head corr;
760 struct list_head free;
761 struct list_head erase;
762 struct list_head alien;
763 struct list_head fastmap;
764 int corr_peb_count;
765 int empty_peb_count;
766 int alien_peb_count;
767 int bad_peb_count;
768 int maybe_bad_peb_count;
769 int vols_found;
770 int highest_vol_id;
771 int is_empty;
772 int force_full_scan;
773 int min_ec;
774 int max_ec;
775 unsigned long long max_sqnum;
776 int mean_ec;
777 uint64_t ec_sum;
778 int ec_count;
779 struct kmem_cache *aeb_slab_cache;
780 struct ubi_ec_hdr *ech;
781 struct ubi_vid_io_buf *vidb;
782 };
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800 struct ubi_work {
801 struct list_head list;
802 int (*func)(struct ubi_device *ubi, struct ubi_work *wrk, int shutdown);
803
804 struct ubi_wl_entry *e;
805 int vol_id;
806 int lnum;
807 int torture;
808 int anchor;
809 };
810
811 #include "debug.h"
812
813 extern struct kmem_cache *ubi_wl_entry_slab;
814 extern const struct file_operations ubi_ctrl_cdev_operations;
815 extern const struct file_operations ubi_cdev_operations;
816 extern const struct file_operations ubi_vol_cdev_operations;
817 extern struct class ubi_class;
818 extern struct mutex ubi_devices_mutex;
819 extern struct blocking_notifier_head ubi_notifiers;
820
821
822 struct ubi_ainf_peb *ubi_alloc_aeb(struct ubi_attach_info *ai, int pnum,
823 int ec);
824 void ubi_free_aeb(struct ubi_attach_info *ai, struct ubi_ainf_peb *aeb);
825 int ubi_add_to_av(struct ubi_device *ubi, struct ubi_attach_info *ai, int pnum,
826 int ec, const struct ubi_vid_hdr *vid_hdr, int bitflips);
827 struct ubi_ainf_volume *ubi_add_av(struct ubi_attach_info *ai, int vol_id);
828 struct ubi_ainf_volume *ubi_find_av(const struct ubi_attach_info *ai,
829 int vol_id);
830 void ubi_remove_av(struct ubi_attach_info *ai, struct ubi_ainf_volume *av);
831 struct ubi_ainf_peb *ubi_early_get_peb(struct ubi_device *ubi,
832 struct ubi_attach_info *ai);
833 int ubi_attach(struct ubi_device *ubi, int force_scan);
834 void ubi_destroy_ai(struct ubi_attach_info *ai);
835
836
837 int ubi_change_vtbl_record(struct ubi_device *ubi, int idx,
838 struct ubi_vtbl_record *vtbl_rec);
839 int ubi_vtbl_rename_volumes(struct ubi_device *ubi,
840 struct list_head *rename_list);
841 int ubi_read_volume_table(struct ubi_device *ubi, struct ubi_attach_info *ai);
842
843
844 int ubi_create_volume(struct ubi_device *ubi, struct ubi_mkvol_req *req);
845 int ubi_remove_volume(struct ubi_volume_desc *desc, int no_vtbl);
846 int ubi_resize_volume(struct ubi_volume_desc *desc, int reserved_pebs);
847 int ubi_rename_volumes(struct ubi_device *ubi, struct list_head *rename_list);
848 int ubi_add_volume(struct ubi_device *ubi, struct ubi_volume *vol);
849 void ubi_free_volume(struct ubi_device *ubi, struct ubi_volume *vol);
850
851
852 int ubi_start_update(struct ubi_device *ubi, struct ubi_volume *vol,
853 long long bytes);
854 int ubi_more_update_data(struct ubi_device *ubi, struct ubi_volume *vol,
855 const void __user *buf, int count);
856 int ubi_start_leb_change(struct ubi_device *ubi, struct ubi_volume *vol,
857 const struct ubi_leb_change_req *req);
858 int ubi_more_leb_change_data(struct ubi_device *ubi, struct ubi_volume *vol,
859 const void __user *buf, int count);
860
861
862 int ubi_calc_data_len(const struct ubi_device *ubi, const void *buf,
863 int length);
864 int ubi_check_volume(struct ubi_device *ubi, int vol_id);
865 void ubi_update_reserved(struct ubi_device *ubi);
866 void ubi_calculate_reserved(struct ubi_device *ubi);
867 int ubi_check_pattern(const void *buf, uint8_t patt, int size);
868
869 static inline bool ubi_leb_valid(struct ubi_volume *vol, int lnum)
870 {
871 return lnum >= 0 && lnum < vol->reserved_pebs;
872 }
873
874
875 struct ubi_eba_table *ubi_eba_create_table(struct ubi_volume *vol,
876 int nentries);
877 void ubi_eba_destroy_table(struct ubi_eba_table *tbl);
878 void ubi_eba_copy_table(struct ubi_volume *vol, struct ubi_eba_table *dst,
879 int nentries);
880 void ubi_eba_replace_table(struct ubi_volume *vol, struct ubi_eba_table *tbl);
881 void ubi_eba_get_ldesc(struct ubi_volume *vol, int lnum,
882 struct ubi_eba_leb_desc *ldesc);
883 bool ubi_eba_is_mapped(struct ubi_volume *vol, int lnum);
884 int ubi_eba_unmap_leb(struct ubi_device *ubi, struct ubi_volume *vol,
885 int lnum);
886 int ubi_eba_read_leb(struct ubi_device *ubi, struct ubi_volume *vol, int lnum,
887 void *buf, int offset, int len, int check);
888 int ubi_eba_read_leb_sg(struct ubi_device *ubi, struct ubi_volume *vol,
889 struct ubi_sgl *sgl, int lnum, int offset, int len,
890 int check);
891 int ubi_eba_write_leb(struct ubi_device *ubi, struct ubi_volume *vol, int lnum,
892 const void *buf, int offset, int len);
893 int ubi_eba_write_leb_st(struct ubi_device *ubi, struct ubi_volume *vol,
894 int lnum, const void *buf, int len, int used_ebs);
895 int ubi_eba_atomic_leb_change(struct ubi_device *ubi, struct ubi_volume *vol,
896 int lnum, const void *buf, int len);
897 int ubi_eba_copy_leb(struct ubi_device *ubi, int from, int to,
898 struct ubi_vid_io_buf *vidb);
899 int ubi_eba_init(struct ubi_device *ubi, struct ubi_attach_info *ai);
900 unsigned long long ubi_next_sqnum(struct ubi_device *ubi);
901 int self_check_eba(struct ubi_device *ubi, struct ubi_attach_info *ai_fastmap,
902 struct ubi_attach_info *ai_scan);
903
904
905 int ubi_wl_get_peb(struct ubi_device *ubi);
906 int ubi_wl_put_peb(struct ubi_device *ubi, int vol_id, int lnum,
907 int pnum, int torture);
908 int ubi_wl_flush(struct ubi_device *ubi, int vol_id, int lnum);
909 int ubi_wl_scrub_peb(struct ubi_device *ubi, int pnum);
910 int ubi_wl_init(struct ubi_device *ubi, struct ubi_attach_info *ai);
911 void ubi_wl_close(struct ubi_device *ubi);
912 int ubi_thread(void *u);
913 struct ubi_wl_entry *ubi_wl_get_fm_peb(struct ubi_device *ubi, int anchor);
914 int ubi_wl_put_fm_peb(struct ubi_device *ubi, struct ubi_wl_entry *used_e,
915 int lnum, int torture);
916 int ubi_is_erase_work(struct ubi_work *wrk);
917 void ubi_refill_pools(struct ubi_device *ubi);
918 int ubi_ensure_anchor_pebs(struct ubi_device *ubi);
919 int ubi_bitflip_check(struct ubi_device *ubi, int pnum, int force_scrub);
920
921
922 int ubi_io_read(const struct ubi_device *ubi, void *buf, int pnum, int offset,
923 int len);
924 int ubi_io_write(struct ubi_device *ubi, const void *buf, int pnum, int offset,
925 int len);
926 int ubi_io_sync_erase(struct ubi_device *ubi, int pnum, int torture);
927 int ubi_io_is_bad(const struct ubi_device *ubi, int pnum);
928 int ubi_io_mark_bad(const struct ubi_device *ubi, int pnum);
929 int ubi_io_read_ec_hdr(struct ubi_device *ubi, int pnum,
930 struct ubi_ec_hdr *ec_hdr, int verbose);
931 int ubi_io_write_ec_hdr(struct ubi_device *ubi, int pnum,
932 struct ubi_ec_hdr *ec_hdr);
933 int ubi_io_read_vid_hdr(struct ubi_device *ubi, int pnum,
934 struct ubi_vid_io_buf *vidb, int verbose);
935 int ubi_io_write_vid_hdr(struct ubi_device *ubi, int pnum,
936 struct ubi_vid_io_buf *vidb);
937
938
939 int ubi_attach_mtd_dev(struct mtd_info *mtd, int ubi_num,
940 int vid_hdr_offset, int max_beb_per1024);
941 int ubi_detach_mtd_dev(int ubi_num, int anyway);
942 struct ubi_device *ubi_get_device(int ubi_num);
943 void ubi_put_device(struct ubi_device *ubi);
944 struct ubi_device *ubi_get_by_major(int major);
945 int ubi_major2num(int major);
946 int ubi_volume_notify(struct ubi_device *ubi, struct ubi_volume *vol,
947 int ntype);
948 int ubi_notify_all(struct ubi_device *ubi, int ntype,
949 struct notifier_block *nb);
950 int ubi_enumerate_volumes(struct notifier_block *nb);
951 void ubi_free_internal_volumes(struct ubi_device *ubi);
952
953
954 void ubi_do_get_device_info(struct ubi_device *ubi, struct ubi_device_info *di);
955 void ubi_do_get_volume_info(struct ubi_device *ubi, struct ubi_volume *vol,
956 struct ubi_volume_info *vi);
957
958 int ubi_compare_lebs(struct ubi_device *ubi, const struct ubi_ainf_peb *aeb,
959 int pnum, const struct ubi_vid_hdr *vid_hdr);
960
961
962 #ifdef CONFIG_MTD_UBI_FASTMAP
963 size_t ubi_calc_fm_size(struct ubi_device *ubi);
964 int ubi_update_fastmap(struct ubi_device *ubi);
965 int ubi_scan_fastmap(struct ubi_device *ubi, struct ubi_attach_info *ai,
966 struct ubi_attach_info *scan_ai);
967 int ubi_fastmap_init_checkmap(struct ubi_volume *vol, int leb_count);
968 void ubi_fastmap_destroy_checkmap(struct ubi_volume *vol);
969 #else
970 static inline int ubi_update_fastmap(struct ubi_device *ubi) { return 0; }
971 int static inline ubi_fastmap_init_checkmap(struct ubi_volume *vol, int leb_count) { return 0; }
972 static inline void ubi_fastmap_destroy_checkmap(struct ubi_volume *vol) {}
973 #endif
974
975
976 #ifdef CONFIG_MTD_UBI_BLOCK
977 int ubiblock_init(void);
978 void ubiblock_exit(void);
979 int ubiblock_create(struct ubi_volume_info *vi);
980 int ubiblock_remove(struct ubi_volume_info *vi);
981 #else
982 static inline int ubiblock_init(void) { return 0; }
983 static inline void ubiblock_exit(void) {}
984 static inline int ubiblock_create(struct ubi_volume_info *vi)
985 {
986 return -ENOSYS;
987 }
988 static inline int ubiblock_remove(struct ubi_volume_info *vi)
989 {
990 return -ENOSYS;
991 }
992 #endif
993
994
995
996
997
998
999
1000 #define ubi_for_each_free_peb(ubi, e, tmp_rb) \
1001 ubi_rb_for_each_entry((tmp_rb), (e), &(ubi)->free, u.rb)
1002
1003
1004
1005
1006
1007
1008
1009 #define ubi_for_each_used_peb(ubi, e, tmp_rb) \
1010 ubi_rb_for_each_entry((tmp_rb), (e), &(ubi)->used, u.rb)
1011
1012
1013
1014
1015
1016
1017
1018 #define ubi_for_each_scrub_peb(ubi, e, tmp_rb) \
1019 ubi_rb_for_each_entry((tmp_rb), (e), &(ubi)->scrub, u.rb)
1020
1021
1022
1023
1024
1025
1026
1027 #define ubi_for_each_protected_peb(ubi, i, e) \
1028 for ((i) = 0; (i) < UBI_PROT_QUEUE_LEN; (i)++) \
1029 list_for_each_entry((e), &(ubi->pq[(i)]), u.list)
1030
1031
1032
1033
1034
1035
1036
1037
1038 #define ubi_rb_for_each_entry(rb, pos, root, member) \
1039 for (rb = rb_first(root), \
1040 pos = (rb ? container_of(rb, typeof(*pos), member) : NULL); \
1041 rb; \
1042 rb = rb_next(rb), \
1043 pos = (rb ? container_of(rb, typeof(*pos), member) : NULL))
1044
1045
1046
1047
1048
1049
1050
1051
1052 static inline void ubi_move_aeb_to_list(struct ubi_ainf_volume *av,
1053 struct ubi_ainf_peb *aeb,
1054 struct list_head *list)
1055 {
1056 rb_erase(&aeb->u.rb, &av->root);
1057 list_add_tail(&aeb->u.list, list);
1058 }
1059
1060
1061
1062
1063
1064
1065
1066 static inline void ubi_init_vid_buf(const struct ubi_device *ubi,
1067 struct ubi_vid_io_buf *vidb,
1068 void *buf)
1069 {
1070 if (buf)
1071 memset(buf, 0, ubi->vid_hdr_alsize);
1072
1073 vidb->buffer = buf;
1074 vidb->hdr = buf + ubi->vid_hdr_shift;
1075 }
1076
1077
1078
1079
1080
1081
1082 static inline struct ubi_vid_io_buf *
1083 ubi_alloc_vid_buf(const struct ubi_device *ubi, gfp_t gfp_flags)
1084 {
1085 struct ubi_vid_io_buf *vidb;
1086 void *buf;
1087
1088 vidb = kzalloc(sizeof(*vidb), gfp_flags);
1089 if (!vidb)
1090 return NULL;
1091
1092 buf = kmalloc(ubi->vid_hdr_alsize, gfp_flags);
1093 if (!buf) {
1094 kfree(vidb);
1095 return NULL;
1096 }
1097
1098 ubi_init_vid_buf(ubi, vidb, buf);
1099
1100 return vidb;
1101 }
1102
1103
1104
1105
1106
1107 static inline void ubi_free_vid_buf(struct ubi_vid_io_buf *vidb)
1108 {
1109 if (!vidb)
1110 return;
1111
1112 kfree(vidb->buffer);
1113 kfree(vidb);
1114 }
1115
1116
1117
1118
1119
1120 static inline struct ubi_vid_hdr *ubi_get_vid_hdr(struct ubi_vid_io_buf *vidb)
1121 {
1122 return vidb->hdr;
1123 }
1124
1125
1126
1127
1128
1129
1130 static inline int ubi_io_read_data(const struct ubi_device *ubi, void *buf,
1131 int pnum, int offset, int len)
1132 {
1133 ubi_assert(offset >= 0);
1134 return ubi_io_read(ubi, buf, pnum, offset + ubi->leb_start, len);
1135 }
1136
1137
1138
1139
1140
1141
1142 static inline int ubi_io_write_data(struct ubi_device *ubi, const void *buf,
1143 int pnum, int offset, int len)
1144 {
1145 ubi_assert(offset >= 0);
1146 return ubi_io_write(ubi, buf, pnum, offset + ubi->leb_start, len);
1147 }
1148
1149
1150
1151
1152
1153 static inline void ubi_ro_mode(struct ubi_device *ubi)
1154 {
1155 if (!ubi->ro_mode) {
1156 ubi->ro_mode = 1;
1157 ubi_warn(ubi, "switch to read-only mode");
1158 dump_stack();
1159 }
1160 }
1161
1162
1163
1164
1165
1166
1167 static inline int vol_id2idx(const struct ubi_device *ubi, int vol_id)
1168 {
1169 if (vol_id >= UBI_INTERNAL_VOL_START)
1170 return vol_id - UBI_INTERNAL_VOL_START + ubi->vtbl_slots;
1171 else
1172 return vol_id;
1173 }
1174
1175
1176
1177
1178
1179
1180 static inline int idx2vol_id(const struct ubi_device *ubi, int idx)
1181 {
1182 if (idx >= ubi->vtbl_slots)
1183 return idx - ubi->vtbl_slots + UBI_INTERNAL_VOL_START;
1184 else
1185 return idx;
1186 }
1187
1188
1189
1190
1191
1192 static inline bool ubi_is_fm_vol(int vol_id)
1193 {
1194 switch (vol_id) {
1195 case UBI_FM_SB_VOLUME_ID:
1196 case UBI_FM_DATA_VOLUME_ID:
1197 return true;
1198 }
1199
1200 return false;
1201 }
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211 static inline struct ubi_wl_entry *ubi_find_fm_block(const struct ubi_device *ubi,
1212 int pnum)
1213 {
1214 int i;
1215
1216 if (ubi->fm) {
1217 for (i = 0; i < ubi->fm->used_blocks; i++) {
1218 if (ubi->fm->e[i]->pnum == pnum)
1219 return ubi->fm->e[i];
1220 }
1221 }
1222
1223 return NULL;
1224 }
1225
1226 #endif