Linux Kernel
3.7.1
|
#include <linux/init.h>
#include <linux/types.h>
#include <linux/list.h>
#include <linux/rbtree.h>
#include <linux/sched.h>
#include <linux/wait.h>
#include <linux/mutex.h>
#include <linux/rwsem.h>
#include <linux/spinlock.h>
#include <linux/fs.h>
#include <linux/cdev.h>
#include <linux/device.h>
#include <linux/slab.h>
#include <linux/string.h>
#include <linux/vmalloc.h>
#include <linux/notifier.h>
#include <linux/mtd/mtd.h>
#include <linux/mtd/ubi.h>
#include <asm/pgtable.h>
#include "ubi-media.h"
#include "debug.h"
Go to the source code of this file.
Data Structures | |
struct | ubi_wl_entry |
struct | ubi_ltree_entry |
struct | ubi_rename_entry |
struct | ubi_fastmap_layout |
struct | ubi_fm_pool |
struct | ubi_volume |
struct | ubi_volume_desc |
struct | ubi_device |
struct | ubi_ainf_peb |
struct | ubi_ainf_volume |
struct | ubi_attach_info |
struct | ubi_work |
Macros | |
#define | UBI_MAX_DEVICES 32 |
#define | UBI_NAME_STR "ubi" |
#define | ubi_msg(fmt,...) pr_notice("UBI: " fmt "\n", ##__VA_ARGS__) |
#define | ubi_warn(fmt,...) |
#define | ubi_err(fmt,...) |
#define | UBI_BGT_NAME_PATTERN "ubi_bgt%dd" |
#define | UBI_LEB_UNMAPPED -1 |
#define | UBI_IO_RETRIES 3 |
#define | UBI_PROT_QUEUE_LEN 10 |
#define | UBI_UNKNOWN -1 |
Enumerations | |
enum | { UBI_IO_FF = 1, UBI_IO_FF_BITFLIPS, UBI_IO_BAD_HDR, UBI_IO_BAD_HDR_EBADMSG, UBI_IO_BITFLIPS } |
enum | { MOVE_CANCEL_RACE = 1, MOVE_SOURCE_RD_ERR, MOVE_TARGET_RD_ERR, MOVE_TARGET_WR_ERR, MOVE_TARGET_BITFLIPS, MOVE_RETRY } |
enum | { UBI_NO_FASTMAP = 1, UBI_BAD_FASTMAP } |
#define ubi_err | ( | fmt, | |
... | |||
) |
#define ubi_warn | ( | fmt, | |
... | |||
) |
anonymous enum |
anonymous enum |
int self_check_eba | ( | struct ubi_device * | ubi, |
struct ubi_attach_info * | ai_fastmap, | ||
struct ubi_attach_info * | ai_scan | ||
) |
self_check_eba - run a self check on the EBA table constructed by fastmap. : UBI device description object : UBI attach info object created by fastmap : UBI attach info object created by scanning
Returns < 0 in case of an internal error, 0 otherwise. If a bad EBA table entry was found it will be printed out and ubi_assert() triggers.
int ubi_add_to_av | ( | struct ubi_device * | ubi, |
struct ubi_attach_info * | ai, | ||
int | pnum, | ||
int | ec, | ||
const struct ubi_vid_hdr * | vid_hdr, | ||
int | bitflips | ||
) |
ubi_add_to_av - add used physical eraseblock to the attaching information. : UBI device description object : attaching information : the physical eraseblock number : erase counter : the volume identifier header : if bit-flips were detected when this physical eraseblock was read
This function adds information about a used physical eraseblock to the 'used' tree of the corresponding volume. The function is rather complex because it has to handle cases when this is not the first physical eraseblock belonging to the same logical eraseblock, and the newer one has to be picked, while the older one has to be dropped. This function returns zero in case of success and a negative error code in case of failure.
int ubi_add_volume | ( | struct ubi_device * | ubi, |
struct ubi_volume * | vol | ||
) |
int ubi_attach | ( | struct ubi_device * | ubi, |
int | force_scan | ||
) |
int ubi_attach_mtd_dev | ( | struct mtd_info * | mtd, |
int | ubi_num, | ||
int | vid_hdr_offset, | ||
int | max_beb_per1024 | ||
) |
ubi_attach_mtd_dev - attach an MTD device. : MTD device description object : number to assign to the new UBI device : VID header offset : maximum expected number of bad PEB per 1024 PEBs
This function attaches MTD device to UBI and assign number to the newly created UBI device, unless is UBI_DEV_NUM_AUTO, in which case this function finds a vacant device number and assigns it automatically. Returns the new UBI device number in case of success and a negative error code in case of failure.
Note, the invocations of this function has to be serialized by the .
calc_data_len - calculate how much real data is stored in a buffer. : UBI device description object : a buffer with the contents of the physical eraseblock : the buffer length
This function calculates how much "real data" is stored in and returnes the length. Continuous 0xFF bytes at the end of the buffer are not considered as "real data".
size_t ubi_calc_fm_size | ( | struct ubi_device * | ubi | ) |
void ubi_calculate_reserved | ( | struct ubi_device * | ubi | ) |
int ubi_change_vtbl_record | ( | struct ubi_device * | ubi, |
int | idx, | ||
struct ubi_vtbl_record * | vtbl_rec | ||
) |
ubi_change_vtbl_record - change volume table record. : UBI device description object : table index to change : new volume table record
This function changes volume table record . If is NULL, empty volume table record is written. The caller does not have to calculate CRC of the record as it is done by this function. Returns zero in case of success and a negative error code in case of failure.
int ubi_check_volume | ( | struct ubi_device * | ubi, |
int | vol_id | ||
) |
ubi_check_volume - check the contents of a static volume. : UBI device description object : ID of the volume to check
This function checks if static volume is corrupted by fully reading it and checking data CRC. This function returns %0 if the volume is not corrupted, %1 if it is corrupted and a negative error code in case of failure. Dynamic volumes are not checked and zero is returned immediately.
int ubi_compare_lebs | ( | struct ubi_device * | ubi, |
const struct ubi_ainf_peb * | aeb, | ||
int | pnum, | ||
const struct ubi_vid_hdr * | vid_hdr | ||
) |
ubi_compare_lebs - find out which logical eraseblock is newer. : UBI device description object : first logical eraseblock to compare : physical eraseblock number of the second logical eraseblock to compare : volume identifier header of the second logical eraseblock
This function compares 2 copies of a LEB and informs which one is newer. In case of success this function returns a positive value, in case of failure, a negative error code is returned. The success return codes use the following bits: o bit 0 is cleared: the first PEB (described by ) is newer than the second PEB (described by and ); o bit 0 is set: the second PEB is newer; o bit 1 is cleared: no bit-flips were detected in the newer LEB; o bit 1 is set: bit-flips were detected in the newer LEB; o bit 2 is cleared: the older LEB is not corrupted; o bit 2 is set: the older LEB is corrupted.
int ubi_create_volume | ( | struct ubi_device * | ubi, |
struct ubi_mkvol_req * | req | ||
) |
ubi_create_volume - create volume. : UBI device description object : volume creation request
This function creates volume described by . If ->vol_id id UBI_VOL_NUM_AUTO, this function automatically assign ID to the new volume and saves it in ->vol_id. Returns zero in case of success and a negative error code in case of failure. Note, the caller has to have the ->device_mutex locked.
void ubi_destroy_ai | ( | struct ubi_attach_info * | ai | ) |
ubi_detach_mtd_dev - detach an MTD device. : UBI device number to detach from : detach MTD even if device reference count is not zero
This function destroys an UBI device number and detaches the underlying MTD device. Returns zero in case of success and %-EBUSY if the UBI device is busy and cannot be destroyed, and %-EINVAL if it does not exist.
Note, the invocations of this function has to be serialized by the .
void ubi_do_get_device_info | ( | struct ubi_device * | ubi, |
struct ubi_device_info * | di | ||
) |
void ubi_do_get_volume_info | ( | struct ubi_device * | ubi, |
struct ubi_volume * | vol, | ||
struct ubi_volume_info * | vi | ||
) |
|
read |
ubi_early_get_peb - get a free physical eraseblock. : UBI device description object : attaching information
This function returns a free physical eraseblock. It is supposed to be called on the UBI initialization stages when the wear-leveling sub-system is not initialized yet. This function picks a physical eraseblocks from one of the lists, writes the EC header if it is needed, and removes it from the list.
This function returns a pointer to the "aeb" of the found free PEB in case of success and an error code in case of failure.
int ubi_eba_atomic_leb_change | ( | struct ubi_device * | ubi, |
struct ubi_volume * | vol, | ||
int | lnum, | ||
const void * | buf, | ||
int | len | ||
) |
int ubi_eba_copy_leb | ( | struct ubi_device * | ubi, |
int | from, | ||
int | to, | ||
struct ubi_vid_hdr * | vid_hdr | ||
) |
ubi_eba_copy_leb - copy logical eraseblock. : UBI device description object : physical eraseblock number from where to copy : physical eraseblock number where to copy : VID header of the physical eraseblock
This function copies logical eraseblock from physical eraseblock to physical eraseblock . The buffer may be changed by this function. Returns: o %0 in case of success; o MOVE_CANCEL_RACE, MOVE_TARGET_WR_ERR, MOVE_TARGET_BITFLIPS, etc; o a negative error code in case of failure.
int ubi_eba_init | ( | struct ubi_device * | ubi, |
struct ubi_attach_info * | ai | ||
) |
int ubi_eba_read_leb | ( | struct ubi_device * | ubi, |
struct ubi_volume * | vol, | ||
int | lnum, | ||
void * | buf, | ||
int | offset, | ||
int | len, | ||
int | check | ||
) |
ubi_eba_read_leb - read data. : UBI device description object : volume description object : logical eraseblock number : buffer to store the read data : offset from where to read : how many bytes to read : data CRC check flag
If the logical eraseblock is unmapped, is filled with 0xFF bytes. The flag only makes sense for static volumes and forces eraseblock data CRC checking.
In case of success this function returns zero. In case of a static volume, if data CRC mismatches - %-EBADMSG is returned. %-EBADMSG may also be returned for any volume type if an ECC error was detected by the MTD device driver. Other negative error cored may be returned in case of other errors.
int ubi_eba_unmap_leb | ( | struct ubi_device * | ubi, |
struct ubi_volume * | vol, | ||
int | lnum | ||
) |
ubi_eba_unmap_leb - un-map logical eraseblock. : UBI device description object : volume description object : logical eraseblock number
This function un-maps logical eraseblock and schedules corresponding physical eraseblock for erasure. Returns zero in case of success and a negative error code in case of failure.
int ubi_eba_write_leb | ( | struct ubi_device * | ubi, |
struct ubi_volume * | vol, | ||
int | lnum, | ||
const void * | buf, | ||
int | offset, | ||
int | len | ||
) |
ubi_eba_write_leb - write data to dynamic volume. : UBI device description object : volume description object : logical eraseblock number : the data to write : offset within the logical eraseblock where to write : how many bytes to write
This function writes data to logical eraseblock of a dynamic volume . Returns zero in case of success and a negative error code in case of failure. In case of error, it is possible that something was still written to the flash media, but may be some garbage.
int ubi_eba_write_leb_st | ( | struct ubi_device * | ubi, |
struct ubi_volume * | vol, | ||
int | lnum, | ||
const void * | buf, | ||
int | len, | ||
int | used_ebs | ||
) |
ubi_eba_write_leb_st - write data to static volume. : UBI device description object : volume description object : logical eraseblock number : data to write : how many bytes to write : how many logical eraseblocks will this volume contain
This function writes data to logical eraseblock of static volume . The argument should contain total number of logical eraseblock in this static volume.
When writing to the last logical eraseblock, the argument doesn't have to be aligned to the minimal I/O unit size. Instead, it has to be equivalent to the real data size, although the buffer has to contain the alignment. In all other cases, has to be aligned.
It is prohibited to write more than once to logical eraseblocks of static volumes. This function returns zero in case of success and a negative error code in case of failure.
int ubi_ensure_anchor_pebs | ( | struct ubi_device * | ubi | ) |
int ubi_enumerate_volumes | ( | struct notifier_block * | nb | ) |
ubi_enumerate_volumes - send "add" notification for all existing volumes. : the notifier to call
This function walks all UBI devices and volumes and sends the UBI_VOLUME_ADDED notification for each volume. If is NULL, then all registered notifiers are called, otherwise only the notifier is called. Returns the number of sent notifications.
|
read |
void ubi_free_internal_volumes | ( | struct ubi_device * | ubi | ) |
void ubi_free_volume | ( | struct ubi_device * | ubi, |
struct ubi_volume * | vol | ||
) |
|
read |
ubi_get_by_major - get UBI device by character device major number. : major number
This function is similar to 'ubi_get_device()', but it searches the device by its major number.
|
read |
ubi_get_device - get UBI device. : UBI device number
This function returns UBI device description object for UBI device number , or NULL if the device does not exist. This function increases the device reference count to prevent removal of the device. In other words, the device cannot be removed if its reference count is not zero.
int ubi_io_is_bad | ( | const struct ubi_device * | ubi, |
int | pnum | ||
) |
int ubi_io_mark_bad | ( | const struct ubi_device * | ubi, |
int | pnum | ||
) |
ubi_io_read - read data from a physical eraseblock. : UBI device description object : buffer where to store the read data : physical eraseblock number to read from : offset within the physical eraseblock from where to read : how many bytes to read
This function reads data from offset of physical eraseblock and stores the read data in the buffer. The following return codes are possible:
o %0 if all the requested data were successfully read; o UBI_IO_BITFLIPS if all the requested data were successfully read, but correctable bit-flips were detected; this is harmless but may indicate that this eraseblock may become bad soon (but do not have to); o %-EBADMSG if the MTD subsystem reported about data integrity problems, for example it can be an ECC error in case of NAND; this most probably means that the data is corrupted; o %-EIO if some I/O error occurred; o other negative error codes in case of other errors.
int ubi_io_read_ec_hdr | ( | struct ubi_device * | ubi, |
int | pnum, | ||
struct ubi_ec_hdr * | ec_hdr, | ||
int | verbose | ||
) |
ubi_io_read_ec_hdr - read and check an erase counter header. : UBI device description object : physical eraseblock to read from : a &struct ubi_ec_hdr object where to store the read erase counter header : be verbose if the header is corrupted or was not found
This function reads erase counter header from physical eraseblock and stores it in . This function also checks CRC checksum of the read erase counter header. The following codes may be returned:
o %0 if the CRC checksum is correct and the header was successfully read; o UBI_IO_BITFLIPS if the CRC is correct, but bit-flips were detected and corrected by the flash driver; this is harmless but may indicate that this eraseblock may become bad soon (but may be not); o UBI_IO_BAD_HDR if the erase counter header is corrupted (a CRC error); o UBI_IO_BAD_HDR_EBADMSG is the same as UBI_IO_BAD_HDR, but there also was a data integrity error (uncorrectable ECC error in case of NAND); o UBI_IO_FF if only 0xFF bytes were read (the PEB is supposedly empty) o a negative error code in case of failure.
int ubi_io_read_vid_hdr | ( | struct ubi_device * | ubi, |
int | pnum, | ||
struct ubi_vid_hdr * | vid_hdr, | ||
int | verbose | ||
) |
ubi_io_read_vid_hdr - read and check a volume identifier header. : UBI device description object : physical eraseblock number to read from : &struct ubi_vid_hdr object where to store the read volume identifier header : be verbose if the header is corrupted or wasn't found
This function reads the volume identifier header from physical eraseblock and stores it in . It also checks CRC checksum of the read volume identifier header. The error codes are the same as in 'ubi_io_read_ec_hdr()'.
Note, the implementation of this function is also very similar to 'ubi_io_read_ec_hdr()', so refer commentaries in 'ubi_io_read_ec_hdr()'.
int ubi_io_sync_erase | ( | struct ubi_device * | ubi, |
int | pnum, | ||
int | torture | ||
) |
ubi_io_sync_erase - synchronously erase a physical eraseblock. : UBI device description object : physical eraseblock number to erase : if this physical eraseblock has to be tortured
This function synchronously erases physical eraseblock . If flag is not zero, the physical eraseblock is checked by means of writing different patterns to it and reading them back. If the torturing is enabled, the physical eraseblock is erased more than once.
This function returns the number of erasures made in case of success, %-EIO if the erasure failed or the torturing test failed, and other negative error codes in case of other errors. Note, %-EIO means that the physical eraseblock is bad.
ubi_io_write - write data to a physical eraseblock. : UBI device description object : buffer with the data to write : physical eraseblock number to write to : offset within the physical eraseblock where to write : how many bytes to write
This function writes bytes of data from buffer to offset of physical eraseblock . If all the data were successfully written, zero is returned. If an error occurred, this function returns a negative error code. If %-EIO is returned, the physical eraseblock most probably went bad.
Note, in case of an error, it is possible that something was still written to the flash media, but may be some garbage.
int ubi_io_write_ec_hdr | ( | struct ubi_device * | ubi, |
int | pnum, | ||
struct ubi_ec_hdr * | ec_hdr | ||
) |
ubi_io_write_ec_hdr - write an erase counter header. : UBI device description object : physical eraseblock to write to : the erase counter header to write
This function writes erase counter header described by to physical eraseblock . It also fills most fields of before writing, so the caller do not have to fill them. Callers must only fill the ->ec field.
This function returns zero in case of success and a negative error code in case of failure. If %-EIO is returned, the physical eraseblock most probably went bad.
int ubi_io_write_vid_hdr | ( | struct ubi_device * | ubi, |
int | pnum, | ||
struct ubi_vid_hdr * | vid_hdr | ||
) |
ubi_io_write_vid_hdr - write a volume identifier header. : UBI device description object : the physical eraseblock number to write to : the volume identifier header to write
This function writes the volume identifier header described by to physical eraseblock . This function automatically fills the ->magic and the ->version fields, as well as calculates header CRC checksum and stores it at vid_hdr->hdr_crc.
This function returns zero in case of success and a negative error code in case of failure. If %-EIO is returned, the physical eraseblock probably went bad.
ubi_major2num - get UBI device number by character device major number. : major number
This function searches UBI device number object by its major number. If UBI device was not found, this function returns -ENODEV, otherwise the UBI device number is returned.
int ubi_more_leb_change_data | ( | struct ubi_device * | ubi, |
struct ubi_volume * | vol, | ||
const void __user * | buf, | ||
int | count | ||
) |
ubi_more_leb_change_data - accept more data for atomic LEB change. : UBI device description object : volume description object : write data (user-space memory buffer) : how much bytes to write
This function accepts more data to the volume which is being under the "atomic LEB change" operation. It may be called arbitrary number of times until all data arrives. This function returns %0 in case of success, number of bytes written during the last call if the whole "atomic LEB change" operation has been successfully finished, and a negative error code in case of failure.
int ubi_more_update_data | ( | struct ubi_device * | ubi, |
struct ubi_volume * | vol, | ||
const void __user * | buf, | ||
int | count | ||
) |
ubi_more_update_data - write more update data. : UBI device description object : volume description object : write data (user-space memory buffer) : how much bytes to write
This function writes more data to the volume which is being updated. It may be called arbitrary number of times until all the update data arriveis. This function returns %0 in case of success, number of bytes written during the last call if the whole volume update has been successfully finished, and a negative error code in case of failure.
unsigned long long ubi_next_sqnum | ( | struct ubi_device * | ubi | ) |
int ubi_notify_all | ( | struct ubi_device * | ubi, |
int | ntype, | ||
struct notifier_block * | nb | ||
) |
ubi_notify_all - send a notification to all volumes. : UBI device description object : notification type to send (UBI_VOLUME_ADDED, etc) : the notifier to call
This function walks all volumes of UBI device and sends the notification for each volume. If is NULL, then all registered notifiers are called, otherwise only the notifier is called. Returns the number of sent notifications.
void ubi_put_device | ( | struct ubi_device * | ubi | ) |
int ubi_read_volume_table | ( | struct ubi_device * | ubi, |
struct ubi_attach_info * | ai | ||
) |
ubi_read_volume_table - read the volume table. : UBI device description object : attaching information
This function reads volume table, checks it, recover from errors if needed, or creates it if needed. Returns zero in case of success and a negative error code in case of failure.
void ubi_refill_pools | ( | struct ubi_device * | ubi | ) |
void ubi_remove_av | ( | struct ubi_attach_info * | ai, |
struct ubi_ainf_volume * | av | ||
) |
int ubi_remove_volume | ( | struct ubi_volume_desc * | desc, |
int | no_vtbl | ||
) |
ubi_remove_volume - remove volume. : volume descriptor : do not change volume table if not zero
This function removes volume described by . The volume has to be opened in "exclusive" mode. Returns zero in case of success and a negative error code in case of failure. The caller has to have the ->device_mutex locked.
int ubi_rename_volumes | ( | struct ubi_device * | ubi, |
struct list_head * | rename_list | ||
) |
ubi_rename_volumes - re-name UBI volumes. : UBI device description object : list of &struct ubi_rename_entry objects
This function re-names or removes volumes specified in the re-name list. Returns zero in case of success and a negative error code in case of failure.
int ubi_resize_volume | ( | struct ubi_volume_desc * | desc, |
int | reserved_pebs | ||
) |
int ubi_scan_fastmap | ( | struct ubi_device * | ubi, |
struct ubi_attach_info * | ai, | ||
int | fm_anchor | ||
) |
int ubi_start_leb_change | ( | struct ubi_device * | ubi, |
struct ubi_volume * | vol, | ||
const struct ubi_leb_change_req * | req | ||
) |
int ubi_start_update | ( | struct ubi_device * | ubi, |
struct ubi_volume * | vol, | ||
long long | bytes | ||
) |
ubi_start_update - start volume update. : UBI device description object : volume description object : update bytes
This function starts volume update operation. If is zero, the volume is just wiped out. Returns zero in case of success and a negative error code in case of failure.
int ubi_update_fastmap | ( | struct ubi_device * | ubi | ) |
void ubi_update_reserved | ( | struct ubi_device * | ubi | ) |
ubi_update_reserved - update bad eraseblock handling accounting data. : UBI device description object
This function calculates the gap between current number of PEBs reserved for bad eraseblock handling and the required level of PEBs that must be reserved, and if necessary, reserves more PEBs to fill that gap, according to availability. Should be called with ubi->volumes_lock held.
int ubi_volume_notify | ( | struct ubi_device * | ubi, |
struct ubi_volume * | vol, | ||
int | ntype | ||
) |
ubi_volume_notify - send a volume change notification. : UBI device description object : volume description object of the changed volume : notification type to send (UBI_VOLUME_ADDED, etc)
This is a helper function which notifies all subscribers about a volume change event (creation, removal, re-sizing, re-naming, updating). Returns zero in case of success and a negative error code in case of failure.
int ubi_vtbl_rename_volumes | ( | struct ubi_device * | ubi, |
struct list_head * | rename_list | ||
) |
ubi_vtbl_rename_volumes - rename UBI volumes in the volume table. : UBI device description object : list of &struct ubi_rename_entry objects
This function re-names multiple volumes specified in in the volume table. Returns zero in case of success and a negative error code in case of failure.
void ubi_wl_close | ( | struct ubi_device * | ubi | ) |
int ubi_wl_flush | ( | struct ubi_device * | ubi, |
int | vol_id, | ||
int | lnum | ||
) |
ubi_wl_flush - flush all pending works. : UBI device description object : the volume id to flush for : the logical eraseblock number to flush for
This function executes all pending works for a particular volume id / logical eraseblock number pair. If either value is set to UBI_ALL, then it acts as a wildcard for all of the corresponding volume numbers or logical eraseblock numbers. It returns zero in case of success and a negative error code in case of failure.
|
read |
int ubi_wl_get_peb | ( | struct ubi_device * | ubi | ) |
int ubi_wl_init | ( | struct ubi_device * | ubi, |
struct ubi_attach_info * | ai | ||
) |
int ubi_wl_put_fm_peb | ( | struct ubi_device * | ubi, |
struct ubi_wl_entry * | used_e, | ||
int | lnum, | ||
int | torture | ||
) |
ubi_wl_put_peb - return a PEB to the wear-leveling sub-system. : UBI device description object : the volume ID that last used this PEB : the last used logical eraseblock number for the PEB : physical eraseblock to return : if this physical eraseblock has to be tortured
This function is called to return physical eraseblock to the pool of free physical eraseblocks. The flag has to be set if an I/O error occurred to this and it has to be tested. This function returns zero in case of success, and a negative error code in case of failure.
int ubi_wl_scrub_peb | ( | struct ubi_device * | ubi, |
int | pnum | ||
) |
ubi_wl_scrub_peb - schedule a physical eraseblock for scrubbing. : UBI device description object : the physical eraseblock to schedule
If a bit-flip in a physical eraseblock is detected, this physical eraseblock needs scrubbing. This function schedules a physical eraseblock for scrubbing which is done in background. This function returns zero in case of success and a negative error code in case of failure.
struct file_operations ubi_cdev_operations |
struct file_operations ubi_ctrl_cdev_operations |
struct blocking_notifier_head ubi_notifiers |
struct file_operations ubi_vol_cdev_operations |
struct kmem_cache* ubi_wl_entry_slab |