1*9eefe2a2SStefan Roese /* 2*9eefe2a2SStefan Roese * This file is part of UBIFS. 3*9eefe2a2SStefan Roese * 4*9eefe2a2SStefan Roese * Copyright (C) 2006-2008 Nokia Corporation 5*9eefe2a2SStefan Roese * 6*9eefe2a2SStefan Roese * (C) Copyright 2008-2009 7*9eefe2a2SStefan Roese * Stefan Roese, DENX Software Engineering, sr@denx.de. 8*9eefe2a2SStefan Roese * 9*9eefe2a2SStefan Roese * This program is free software; you can redistribute it and/or modify it 10*9eefe2a2SStefan Roese * under the terms of the GNU General Public License version 2 as published by 11*9eefe2a2SStefan Roese * the Free Software Foundation. 12*9eefe2a2SStefan Roese * 13*9eefe2a2SStefan Roese * This program is distributed in the hope that it will be useful, but WITHOUT 14*9eefe2a2SStefan Roese * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 15*9eefe2a2SStefan Roese * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 16*9eefe2a2SStefan Roese * more details. 17*9eefe2a2SStefan Roese * 18*9eefe2a2SStefan Roese * You should have received a copy of the GNU General Public License along with 19*9eefe2a2SStefan Roese * this program; if not, write to the Free Software Foundation, Inc., 51 20*9eefe2a2SStefan Roese * Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 21*9eefe2a2SStefan Roese * 22*9eefe2a2SStefan Roese * Authors: Artem Bityutskiy (Битюцкий Артём) 23*9eefe2a2SStefan Roese * Adrian Hunter 24*9eefe2a2SStefan Roese */ 25*9eefe2a2SStefan Roese 26*9eefe2a2SStefan Roese #ifndef __UBIFS_H__ 27*9eefe2a2SStefan Roese #define __UBIFS_H__ 28*9eefe2a2SStefan Roese 29*9eefe2a2SStefan Roese #if 0 /* Enable for debugging output */ 30*9eefe2a2SStefan Roese #define CONFIG_UBIFS_FS_DEBUG 31*9eefe2a2SStefan Roese #define CONFIG_UBIFS_FS_DEBUG_MSG_LVL 3 32*9eefe2a2SStefan Roese #endif 33*9eefe2a2SStefan Roese 34*9eefe2a2SStefan Roese #include <ubi_uboot.h> 35*9eefe2a2SStefan Roese #include <linux/ctype.h> 36*9eefe2a2SStefan Roese #include <linux/time.h> 37*9eefe2a2SStefan Roese #include <linux/math64.h> 38*9eefe2a2SStefan Roese #include "ubifs-media.h" 39*9eefe2a2SStefan Roese 40*9eefe2a2SStefan Roese struct dentry; 41*9eefe2a2SStefan Roese struct file; 42*9eefe2a2SStefan Roese struct iattr; 43*9eefe2a2SStefan Roese struct kstat; 44*9eefe2a2SStefan Roese struct vfsmount; 45*9eefe2a2SStefan Roese 46*9eefe2a2SStefan Roese extern struct super_block *ubifs_sb; 47*9eefe2a2SStefan Roese 48*9eefe2a2SStefan Roese extern unsigned int ubifs_msg_flags; 49*9eefe2a2SStefan Roese extern unsigned int ubifs_chk_flags; 50*9eefe2a2SStefan Roese extern unsigned int ubifs_tst_flags; 51*9eefe2a2SStefan Roese 52*9eefe2a2SStefan Roese #define pgoff_t unsigned long 53*9eefe2a2SStefan Roese 54*9eefe2a2SStefan Roese /* 55*9eefe2a2SStefan Roese * We "simulate" the Linux page struct much simpler here 56*9eefe2a2SStefan Roese */ 57*9eefe2a2SStefan Roese struct page { 58*9eefe2a2SStefan Roese pgoff_t index; 59*9eefe2a2SStefan Roese void *addr; 60*9eefe2a2SStefan Roese struct inode *inode; 61*9eefe2a2SStefan Roese }; 62*9eefe2a2SStefan Roese 63*9eefe2a2SStefan Roese void iput(struct inode *inode); 64*9eefe2a2SStefan Roese 65*9eefe2a2SStefan Roese /* 66*9eefe2a2SStefan Roese * The atomic operations are used for budgeting etc which is not 67*9eefe2a2SStefan Roese * needed for the read-only U-Boot implementation: 68*9eefe2a2SStefan Roese */ 69*9eefe2a2SStefan Roese #define atomic_long_inc(a) 70*9eefe2a2SStefan Roese #define atomic_long_dec(a) 71*9eefe2a2SStefan Roese #define atomic_long_sub(a, b) 72*9eefe2a2SStefan Roese 73*9eefe2a2SStefan Roese /* linux/include/time.h */ 74*9eefe2a2SStefan Roese 75*9eefe2a2SStefan Roese struct timespec { 76*9eefe2a2SStefan Roese time_t tv_sec; /* seconds */ 77*9eefe2a2SStefan Roese long tv_nsec; /* nanoseconds */ 78*9eefe2a2SStefan Roese }; 79*9eefe2a2SStefan Roese 80*9eefe2a2SStefan Roese /* linux/include/dcache.h */ 81*9eefe2a2SStefan Roese 82*9eefe2a2SStefan Roese /* 83*9eefe2a2SStefan Roese * "quick string" -- eases parameter passing, but more importantly 84*9eefe2a2SStefan Roese * saves "metadata" about the string (ie length and the hash). 85*9eefe2a2SStefan Roese * 86*9eefe2a2SStefan Roese * hash comes first so it snuggles against d_parent in the 87*9eefe2a2SStefan Roese * dentry. 88*9eefe2a2SStefan Roese */ 89*9eefe2a2SStefan Roese struct qstr { 90*9eefe2a2SStefan Roese unsigned int hash; 91*9eefe2a2SStefan Roese unsigned int len; 92*9eefe2a2SStefan Roese const char *name; 93*9eefe2a2SStefan Roese }; 94*9eefe2a2SStefan Roese 95*9eefe2a2SStefan Roese struct inode { 96*9eefe2a2SStefan Roese struct hlist_node i_hash; 97*9eefe2a2SStefan Roese struct list_head i_list; 98*9eefe2a2SStefan Roese struct list_head i_sb_list; 99*9eefe2a2SStefan Roese struct list_head i_dentry; 100*9eefe2a2SStefan Roese unsigned long i_ino; 101*9eefe2a2SStefan Roese unsigned int i_nlink; 102*9eefe2a2SStefan Roese uid_t i_uid; 103*9eefe2a2SStefan Roese gid_t i_gid; 104*9eefe2a2SStefan Roese dev_t i_rdev; 105*9eefe2a2SStefan Roese u64 i_version; 106*9eefe2a2SStefan Roese loff_t i_size; 107*9eefe2a2SStefan Roese #ifdef __NEED_I_SIZE_ORDERED 108*9eefe2a2SStefan Roese seqcount_t i_size_seqcount; 109*9eefe2a2SStefan Roese #endif 110*9eefe2a2SStefan Roese struct timespec i_atime; 111*9eefe2a2SStefan Roese struct timespec i_mtime; 112*9eefe2a2SStefan Roese struct timespec i_ctime; 113*9eefe2a2SStefan Roese unsigned int i_blkbits; 114*9eefe2a2SStefan Roese unsigned short i_bytes; 115*9eefe2a2SStefan Roese umode_t i_mode; 116*9eefe2a2SStefan Roese spinlock_t i_lock; /* i_blocks, i_bytes, maybe i_size */ 117*9eefe2a2SStefan Roese struct mutex i_mutex; 118*9eefe2a2SStefan Roese struct rw_semaphore i_alloc_sem; 119*9eefe2a2SStefan Roese const struct inode_operations *i_op; 120*9eefe2a2SStefan Roese const struct file_operations *i_fop; /* former ->i_op->default_file_ops */ 121*9eefe2a2SStefan Roese struct super_block *i_sb; 122*9eefe2a2SStefan Roese struct file_lock *i_flock; 123*9eefe2a2SStefan Roese #ifdef CONFIG_QUOTA 124*9eefe2a2SStefan Roese struct dquot *i_dquot[MAXQUOTAS]; 125*9eefe2a2SStefan Roese #endif 126*9eefe2a2SStefan Roese struct list_head i_devices; 127*9eefe2a2SStefan Roese int i_cindex; 128*9eefe2a2SStefan Roese 129*9eefe2a2SStefan Roese __u32 i_generation; 130*9eefe2a2SStefan Roese 131*9eefe2a2SStefan Roese #ifdef CONFIG_DNOTIFY 132*9eefe2a2SStefan Roese unsigned long i_dnotify_mask; /* Directory notify events */ 133*9eefe2a2SStefan Roese struct dnotify_struct *i_dnotify; /* for directory notifications */ 134*9eefe2a2SStefan Roese #endif 135*9eefe2a2SStefan Roese 136*9eefe2a2SStefan Roese #ifdef CONFIG_INOTIFY 137*9eefe2a2SStefan Roese struct list_head inotify_watches; /* watches on this inode */ 138*9eefe2a2SStefan Roese struct mutex inotify_mutex; /* protects the watches list */ 139*9eefe2a2SStefan Roese #endif 140*9eefe2a2SStefan Roese 141*9eefe2a2SStefan Roese unsigned long i_state; 142*9eefe2a2SStefan Roese unsigned long dirtied_when; /* jiffies of first dirtying */ 143*9eefe2a2SStefan Roese 144*9eefe2a2SStefan Roese unsigned int i_flags; 145*9eefe2a2SStefan Roese 146*9eefe2a2SStefan Roese #ifdef CONFIG_SECURITY 147*9eefe2a2SStefan Roese void *i_security; 148*9eefe2a2SStefan Roese #endif 149*9eefe2a2SStefan Roese void *i_private; /* fs or device private pointer */ 150*9eefe2a2SStefan Roese }; 151*9eefe2a2SStefan Roese 152*9eefe2a2SStefan Roese struct super_block { 153*9eefe2a2SStefan Roese struct list_head s_list; /* Keep this first */ 154*9eefe2a2SStefan Roese dev_t s_dev; /* search index; _not_ kdev_t */ 155*9eefe2a2SStefan Roese unsigned long s_blocksize; 156*9eefe2a2SStefan Roese unsigned char s_blocksize_bits; 157*9eefe2a2SStefan Roese unsigned char s_dirt; 158*9eefe2a2SStefan Roese unsigned long long s_maxbytes; /* Max file size */ 159*9eefe2a2SStefan Roese struct file_system_type *s_type; 160*9eefe2a2SStefan Roese const struct super_operations *s_op; 161*9eefe2a2SStefan Roese struct dquot_operations *dq_op; 162*9eefe2a2SStefan Roese struct quotactl_ops *s_qcop; 163*9eefe2a2SStefan Roese const struct export_operations *s_export_op; 164*9eefe2a2SStefan Roese unsigned long s_flags; 165*9eefe2a2SStefan Roese unsigned long s_magic; 166*9eefe2a2SStefan Roese struct dentry *s_root; 167*9eefe2a2SStefan Roese struct rw_semaphore s_umount; 168*9eefe2a2SStefan Roese struct mutex s_lock; 169*9eefe2a2SStefan Roese int s_count; 170*9eefe2a2SStefan Roese int s_syncing; 171*9eefe2a2SStefan Roese int s_need_sync_fs; 172*9eefe2a2SStefan Roese #ifdef CONFIG_SECURITY 173*9eefe2a2SStefan Roese void *s_security; 174*9eefe2a2SStefan Roese #endif 175*9eefe2a2SStefan Roese struct xattr_handler **s_xattr; 176*9eefe2a2SStefan Roese 177*9eefe2a2SStefan Roese struct list_head s_inodes; /* all inodes */ 178*9eefe2a2SStefan Roese struct list_head s_dirty; /* dirty inodes */ 179*9eefe2a2SStefan Roese struct list_head s_io; /* parked for writeback */ 180*9eefe2a2SStefan Roese struct list_head s_more_io; /* parked for more writeback */ 181*9eefe2a2SStefan Roese struct hlist_head s_anon; /* anonymous dentries for (nfs) exporting */ 182*9eefe2a2SStefan Roese struct list_head s_files; 183*9eefe2a2SStefan Roese /* s_dentry_lru and s_nr_dentry_unused are protected by dcache_lock */ 184*9eefe2a2SStefan Roese struct list_head s_dentry_lru; /* unused dentry lru */ 185*9eefe2a2SStefan Roese int s_nr_dentry_unused; /* # of dentry on lru */ 186*9eefe2a2SStefan Roese 187*9eefe2a2SStefan Roese struct block_device *s_bdev; 188*9eefe2a2SStefan Roese struct mtd_info *s_mtd; 189*9eefe2a2SStefan Roese struct list_head s_instances; 190*9eefe2a2SStefan Roese 191*9eefe2a2SStefan Roese int s_frozen; 192*9eefe2a2SStefan Roese wait_queue_head_t s_wait_unfrozen; 193*9eefe2a2SStefan Roese 194*9eefe2a2SStefan Roese char s_id[32]; /* Informational name */ 195*9eefe2a2SStefan Roese 196*9eefe2a2SStefan Roese void *s_fs_info; /* Filesystem private info */ 197*9eefe2a2SStefan Roese 198*9eefe2a2SStefan Roese /* 199*9eefe2a2SStefan Roese * The next field is for VFS *only*. No filesystems have any business 200*9eefe2a2SStefan Roese * even looking at it. You had been warned. 201*9eefe2a2SStefan Roese */ 202*9eefe2a2SStefan Roese struct mutex s_vfs_rename_mutex; /* Kludge */ 203*9eefe2a2SStefan Roese 204*9eefe2a2SStefan Roese /* Granularity of c/m/atime in ns. 205*9eefe2a2SStefan Roese Cannot be worse than a second */ 206*9eefe2a2SStefan Roese u32 s_time_gran; 207*9eefe2a2SStefan Roese 208*9eefe2a2SStefan Roese /* 209*9eefe2a2SStefan Roese * Filesystem subtype. If non-empty the filesystem type field 210*9eefe2a2SStefan Roese * in /proc/mounts will be "type.subtype" 211*9eefe2a2SStefan Roese */ 212*9eefe2a2SStefan Roese char *s_subtype; 213*9eefe2a2SStefan Roese 214*9eefe2a2SStefan Roese /* 215*9eefe2a2SStefan Roese * Saved mount options for lazy filesystems using 216*9eefe2a2SStefan Roese * generic_show_options() 217*9eefe2a2SStefan Roese */ 218*9eefe2a2SStefan Roese char *s_options; 219*9eefe2a2SStefan Roese }; 220*9eefe2a2SStefan Roese 221*9eefe2a2SStefan Roese struct file_system_type { 222*9eefe2a2SStefan Roese const char *name; 223*9eefe2a2SStefan Roese int fs_flags; 224*9eefe2a2SStefan Roese int (*get_sb) (struct file_system_type *, int, 225*9eefe2a2SStefan Roese const char *, void *, struct vfsmount *); 226*9eefe2a2SStefan Roese void (*kill_sb) (struct super_block *); 227*9eefe2a2SStefan Roese struct module *owner; 228*9eefe2a2SStefan Roese struct file_system_type * next; 229*9eefe2a2SStefan Roese struct list_head fs_supers; 230*9eefe2a2SStefan Roese }; 231*9eefe2a2SStefan Roese 232*9eefe2a2SStefan Roese struct vfsmount { 233*9eefe2a2SStefan Roese struct list_head mnt_hash; 234*9eefe2a2SStefan Roese struct vfsmount *mnt_parent; /* fs we are mounted on */ 235*9eefe2a2SStefan Roese struct dentry *mnt_mountpoint; /* dentry of mountpoint */ 236*9eefe2a2SStefan Roese struct dentry *mnt_root; /* root of the mounted tree */ 237*9eefe2a2SStefan Roese struct super_block *mnt_sb; /* pointer to superblock */ 238*9eefe2a2SStefan Roese struct list_head mnt_mounts; /* list of children, anchored here */ 239*9eefe2a2SStefan Roese struct list_head mnt_child; /* and going through their mnt_child */ 240*9eefe2a2SStefan Roese int mnt_flags; 241*9eefe2a2SStefan Roese /* 4 bytes hole on 64bits arches */ 242*9eefe2a2SStefan Roese const char *mnt_devname; /* Name of device e.g. /dev/dsk/hda1 */ 243*9eefe2a2SStefan Roese struct list_head mnt_list; 244*9eefe2a2SStefan Roese struct list_head mnt_expire; /* link in fs-specific expiry list */ 245*9eefe2a2SStefan Roese struct list_head mnt_share; /* circular list of shared mounts */ 246*9eefe2a2SStefan Roese struct list_head mnt_slave_list;/* list of slave mounts */ 247*9eefe2a2SStefan Roese struct list_head mnt_slave; /* slave list entry */ 248*9eefe2a2SStefan Roese struct vfsmount *mnt_master; /* slave is on master->mnt_slave_list */ 249*9eefe2a2SStefan Roese struct mnt_namespace *mnt_ns; /* containing namespace */ 250*9eefe2a2SStefan Roese int mnt_id; /* mount identifier */ 251*9eefe2a2SStefan Roese int mnt_group_id; /* peer group identifier */ 252*9eefe2a2SStefan Roese /* 253*9eefe2a2SStefan Roese * We put mnt_count & mnt_expiry_mark at the end of struct vfsmount 254*9eefe2a2SStefan Roese * to let these frequently modified fields in a separate cache line 255*9eefe2a2SStefan Roese * (so that reads of mnt_flags wont ping-pong on SMP machines) 256*9eefe2a2SStefan Roese */ 257*9eefe2a2SStefan Roese int mnt_expiry_mark; /* true if marked for expiry */ 258*9eefe2a2SStefan Roese int mnt_pinned; 259*9eefe2a2SStefan Roese int mnt_ghosts; 260*9eefe2a2SStefan Roese /* 261*9eefe2a2SStefan Roese * This value is not stable unless all of the mnt_writers[] spinlocks 262*9eefe2a2SStefan Roese * are held, and all mnt_writer[]s on this mount have 0 as their ->count 263*9eefe2a2SStefan Roese */ 264*9eefe2a2SStefan Roese }; 265*9eefe2a2SStefan Roese 266*9eefe2a2SStefan Roese struct path { 267*9eefe2a2SStefan Roese struct vfsmount *mnt; 268*9eefe2a2SStefan Roese struct dentry *dentry; 269*9eefe2a2SStefan Roese }; 270*9eefe2a2SStefan Roese 271*9eefe2a2SStefan Roese struct file { 272*9eefe2a2SStefan Roese struct path f_path; 273*9eefe2a2SStefan Roese #define f_dentry f_path.dentry 274*9eefe2a2SStefan Roese #define f_vfsmnt f_path.mnt 275*9eefe2a2SStefan Roese const struct file_operations *f_op; 276*9eefe2a2SStefan Roese unsigned int f_flags; 277*9eefe2a2SStefan Roese loff_t f_pos; 278*9eefe2a2SStefan Roese unsigned int f_uid, f_gid; 279*9eefe2a2SStefan Roese 280*9eefe2a2SStefan Roese u64 f_version; 281*9eefe2a2SStefan Roese #ifdef CONFIG_SECURITY 282*9eefe2a2SStefan Roese void *f_security; 283*9eefe2a2SStefan Roese #endif 284*9eefe2a2SStefan Roese /* needed for tty driver, and maybe others */ 285*9eefe2a2SStefan Roese void *private_data; 286*9eefe2a2SStefan Roese 287*9eefe2a2SStefan Roese #ifdef CONFIG_EPOLL 288*9eefe2a2SStefan Roese /* Used by fs/eventpoll.c to link all the hooks to this file */ 289*9eefe2a2SStefan Roese struct list_head f_ep_links; 290*9eefe2a2SStefan Roese spinlock_t f_ep_lock; 291*9eefe2a2SStefan Roese #endif /* #ifdef CONFIG_EPOLL */ 292*9eefe2a2SStefan Roese #ifdef CONFIG_DEBUG_WRITECOUNT 293*9eefe2a2SStefan Roese unsigned long f_mnt_write_state; 294*9eefe2a2SStefan Roese #endif 295*9eefe2a2SStefan Roese }; 296*9eefe2a2SStefan Roese 297*9eefe2a2SStefan Roese /* 298*9eefe2a2SStefan Roese * get_seconds() not really needed in the read-only implmentation 299*9eefe2a2SStefan Roese */ 300*9eefe2a2SStefan Roese #define get_seconds() 0 301*9eefe2a2SStefan Roese 302*9eefe2a2SStefan Roese /* 4k page size */ 303*9eefe2a2SStefan Roese #define PAGE_CACHE_SHIFT 12 304*9eefe2a2SStefan Roese #define PAGE_CACHE_SIZE (1 << PAGE_CACHE_SHIFT) 305*9eefe2a2SStefan Roese 306*9eefe2a2SStefan Roese /* Page cache limit. The filesystems should put that into their s_maxbytes 307*9eefe2a2SStefan Roese limits, otherwise bad things can happen in VM. */ 308*9eefe2a2SStefan Roese #if BITS_PER_LONG==32 309*9eefe2a2SStefan Roese #define MAX_LFS_FILESIZE (((u64)PAGE_CACHE_SIZE << (BITS_PER_LONG-1))-1) 310*9eefe2a2SStefan Roese #elif BITS_PER_LONG==64 311*9eefe2a2SStefan Roese #define MAX_LFS_FILESIZE 0x7fffffffffffffffUL 312*9eefe2a2SStefan Roese #endif 313*9eefe2a2SStefan Roese 314*9eefe2a2SStefan Roese #define INT_MAX ((int)(~0U>>1)) 315*9eefe2a2SStefan Roese #define INT_MIN (-INT_MAX - 1) 316*9eefe2a2SStefan Roese #define LLONG_MAX ((long long)(~0ULL>>1)) 317*9eefe2a2SStefan Roese 318*9eefe2a2SStefan Roese /* 319*9eefe2a2SStefan Roese * These are the fs-independent mount-flags: up to 32 flags are supported 320*9eefe2a2SStefan Roese */ 321*9eefe2a2SStefan Roese #define MS_RDONLY 1 /* Mount read-only */ 322*9eefe2a2SStefan Roese #define MS_NOSUID 2 /* Ignore suid and sgid bits */ 323*9eefe2a2SStefan Roese #define MS_NODEV 4 /* Disallow access to device special files */ 324*9eefe2a2SStefan Roese #define MS_NOEXEC 8 /* Disallow program execution */ 325*9eefe2a2SStefan Roese #define MS_SYNCHRONOUS 16 /* Writes are synced at once */ 326*9eefe2a2SStefan Roese #define MS_REMOUNT 32 /* Alter flags of a mounted FS */ 327*9eefe2a2SStefan Roese #define MS_MANDLOCK 64 /* Allow mandatory locks on an FS */ 328*9eefe2a2SStefan Roese #define MS_DIRSYNC 128 /* Directory modifications are synchronous */ 329*9eefe2a2SStefan Roese #define MS_NOATIME 1024 /* Do not update access times. */ 330*9eefe2a2SStefan Roese #define MS_NODIRATIME 2048 /* Do not update directory access times */ 331*9eefe2a2SStefan Roese #define MS_BIND 4096 332*9eefe2a2SStefan Roese #define MS_MOVE 8192 333*9eefe2a2SStefan Roese #define MS_REC 16384 334*9eefe2a2SStefan Roese #define MS_VERBOSE 32768 /* War is peace. Verbosity is silence. 335*9eefe2a2SStefan Roese MS_VERBOSE is deprecated. */ 336*9eefe2a2SStefan Roese #define MS_SILENT 32768 337*9eefe2a2SStefan Roese #define MS_POSIXACL (1<<16) /* VFS does not apply the umask */ 338*9eefe2a2SStefan Roese #define MS_UNBINDABLE (1<<17) /* change to unbindable */ 339*9eefe2a2SStefan Roese #define MS_PRIVATE (1<<18) /* change to private */ 340*9eefe2a2SStefan Roese #define MS_SLAVE (1<<19) /* change to slave */ 341*9eefe2a2SStefan Roese #define MS_SHARED (1<<20) /* change to shared */ 342*9eefe2a2SStefan Roese #define MS_RELATIME (1<<21) /* Update atime relative to mtime/ctime. */ 343*9eefe2a2SStefan Roese #define MS_KERNMOUNT (1<<22) /* this is a kern_mount call */ 344*9eefe2a2SStefan Roese #define MS_I_VERSION (1<<23) /* Update inode I_version field */ 345*9eefe2a2SStefan Roese #define MS_ACTIVE (1<<30) 346*9eefe2a2SStefan Roese #define MS_NOUSER (1<<31) 347*9eefe2a2SStefan Roese 348*9eefe2a2SStefan Roese #define I_NEW 8 349*9eefe2a2SStefan Roese 350*9eefe2a2SStefan Roese /* Inode flags - they have nothing to superblock flags now */ 351*9eefe2a2SStefan Roese 352*9eefe2a2SStefan Roese #define S_SYNC 1 /* Writes are synced at once */ 353*9eefe2a2SStefan Roese #define S_NOATIME 2 /* Do not update access times */ 354*9eefe2a2SStefan Roese #define S_APPEND 4 /* Append-only file */ 355*9eefe2a2SStefan Roese #define S_IMMUTABLE 8 /* Immutable file */ 356*9eefe2a2SStefan Roese #define S_DEAD 16 /* removed, but still open directory */ 357*9eefe2a2SStefan Roese #define S_NOQUOTA 32 /* Inode is not counted to quota */ 358*9eefe2a2SStefan Roese #define S_DIRSYNC 64 /* Directory modifications are synchronous */ 359*9eefe2a2SStefan Roese #define S_NOCMTIME 128 /* Do not update file c/mtime */ 360*9eefe2a2SStefan Roese #define S_SWAPFILE 256 /* Do not truncate: swapon got its bmaps */ 361*9eefe2a2SStefan Roese #define S_PRIVATE 512 /* Inode is fs-internal */ 362*9eefe2a2SStefan Roese 363*9eefe2a2SStefan Roese /* include/linux/stat.h */ 364*9eefe2a2SStefan Roese 365*9eefe2a2SStefan Roese #define S_IFMT 00170000 366*9eefe2a2SStefan Roese #define S_IFSOCK 0140000 367*9eefe2a2SStefan Roese #define S_IFLNK 0120000 368*9eefe2a2SStefan Roese #define S_IFREG 0100000 369*9eefe2a2SStefan Roese #define S_IFBLK 0060000 370*9eefe2a2SStefan Roese #define S_IFDIR 0040000 371*9eefe2a2SStefan Roese #define S_IFCHR 0020000 372*9eefe2a2SStefan Roese #define S_IFIFO 0010000 373*9eefe2a2SStefan Roese #define S_ISUID 0004000 374*9eefe2a2SStefan Roese #define S_ISGID 0002000 375*9eefe2a2SStefan Roese #define S_ISVTX 0001000 376*9eefe2a2SStefan Roese 377*9eefe2a2SStefan Roese /* include/linux/fs.h */ 378*9eefe2a2SStefan Roese 379*9eefe2a2SStefan Roese /* 380*9eefe2a2SStefan Roese * File types 381*9eefe2a2SStefan Roese * 382*9eefe2a2SStefan Roese * NOTE! These match bits 12..15 of stat.st_mode 383*9eefe2a2SStefan Roese * (ie "(i_mode >> 12) & 15"). 384*9eefe2a2SStefan Roese */ 385*9eefe2a2SStefan Roese #define DT_UNKNOWN 0 386*9eefe2a2SStefan Roese #define DT_FIFO 1 387*9eefe2a2SStefan Roese #define DT_CHR 2 388*9eefe2a2SStefan Roese #define DT_DIR 4 389*9eefe2a2SStefan Roese #define DT_BLK 6 390*9eefe2a2SStefan Roese #define DT_REG 8 391*9eefe2a2SStefan Roese #define DT_LNK 10 392*9eefe2a2SStefan Roese #define DT_SOCK 12 393*9eefe2a2SStefan Roese #define DT_WHT 14 394*9eefe2a2SStefan Roese 395*9eefe2a2SStefan Roese #define I_DIRTY_SYNC 1 396*9eefe2a2SStefan Roese #define I_DIRTY_DATASYNC 2 397*9eefe2a2SStefan Roese #define I_DIRTY_PAGES 4 398*9eefe2a2SStefan Roese #define I_NEW 8 399*9eefe2a2SStefan Roese #define I_WILL_FREE 16 400*9eefe2a2SStefan Roese #define I_FREEING 32 401*9eefe2a2SStefan Roese #define I_CLEAR 64 402*9eefe2a2SStefan Roese #define __I_LOCK 7 403*9eefe2a2SStefan Roese #define I_LOCK (1 << __I_LOCK) 404*9eefe2a2SStefan Roese #define __I_SYNC 8 405*9eefe2a2SStefan Roese #define I_SYNC (1 << __I_SYNC) 406*9eefe2a2SStefan Roese 407*9eefe2a2SStefan Roese #define I_DIRTY (I_DIRTY_SYNC | I_DIRTY_DATASYNC | I_DIRTY_PAGES) 408*9eefe2a2SStefan Roese 409*9eefe2a2SStefan Roese /* linux/include/dcache.h */ 410*9eefe2a2SStefan Roese 411*9eefe2a2SStefan Roese #define DNAME_INLINE_LEN_MIN 36 412*9eefe2a2SStefan Roese 413*9eefe2a2SStefan Roese struct dentry { 414*9eefe2a2SStefan Roese unsigned int d_flags; /* protected by d_lock */ 415*9eefe2a2SStefan Roese spinlock_t d_lock; /* per dentry lock */ 416*9eefe2a2SStefan Roese struct inode *d_inode; /* Where the name belongs to - NULL is 417*9eefe2a2SStefan Roese * negative */ 418*9eefe2a2SStefan Roese /* 419*9eefe2a2SStefan Roese * The next three fields are touched by __d_lookup. Place them here 420*9eefe2a2SStefan Roese * so they all fit in a cache line. 421*9eefe2a2SStefan Roese */ 422*9eefe2a2SStefan Roese struct hlist_node d_hash; /* lookup hash list */ 423*9eefe2a2SStefan Roese struct dentry *d_parent; /* parent directory */ 424*9eefe2a2SStefan Roese struct qstr d_name; 425*9eefe2a2SStefan Roese 426*9eefe2a2SStefan Roese struct list_head d_lru; /* LRU list */ 427*9eefe2a2SStefan Roese /* 428*9eefe2a2SStefan Roese * d_child and d_rcu can share memory 429*9eefe2a2SStefan Roese */ 430*9eefe2a2SStefan Roese struct list_head d_subdirs; /* our children */ 431*9eefe2a2SStefan Roese struct list_head d_alias; /* inode alias list */ 432*9eefe2a2SStefan Roese unsigned long d_time; /* used by d_revalidate */ 433*9eefe2a2SStefan Roese struct super_block *d_sb; /* The root of the dentry tree */ 434*9eefe2a2SStefan Roese void *d_fsdata; /* fs-specific data */ 435*9eefe2a2SStefan Roese #ifdef CONFIG_PROFILING 436*9eefe2a2SStefan Roese struct dcookie_struct *d_cookie; /* cookie, if any */ 437*9eefe2a2SStefan Roese #endif 438*9eefe2a2SStefan Roese int d_mounted; 439*9eefe2a2SStefan Roese unsigned char d_iname[DNAME_INLINE_LEN_MIN]; /* small names */ 440*9eefe2a2SStefan Roese }; 441*9eefe2a2SStefan Roese 442*9eefe2a2SStefan Roese static inline ino_t parent_ino(struct dentry *dentry) 443*9eefe2a2SStefan Roese { 444*9eefe2a2SStefan Roese ino_t res; 445*9eefe2a2SStefan Roese 446*9eefe2a2SStefan Roese spin_lock(&dentry->d_lock); 447*9eefe2a2SStefan Roese res = dentry->d_parent->d_inode->i_ino; 448*9eefe2a2SStefan Roese spin_unlock(&dentry->d_lock); 449*9eefe2a2SStefan Roese return res; 450*9eefe2a2SStefan Roese } 451*9eefe2a2SStefan Roese 452*9eefe2a2SStefan Roese /* linux/include/linux/bitops.h */ 453*9eefe2a2SStefan Roese 454*9eefe2a2SStefan Roese #define BIT_MASK(nr) (1UL << ((nr) % BITS_PER_LONG)) 455*9eefe2a2SStefan Roese #define BIT_WORD(nr) ((nr) / BITS_PER_LONG) 456*9eefe2a2SStefan Roese 457*9eefe2a2SStefan Roese /* linux/include/asm-generic/bitops/non-atomic.h */ 458*9eefe2a2SStefan Roese 459*9eefe2a2SStefan Roese /** 460*9eefe2a2SStefan Roese * __set_bit - Set a bit in memory 461*9eefe2a2SStefan Roese * @nr: the bit to set 462*9eefe2a2SStefan Roese * @addr: the address to start counting from 463*9eefe2a2SStefan Roese * 464*9eefe2a2SStefan Roese * Unlike set_bit(), this function is non-atomic and may be reordered. 465*9eefe2a2SStefan Roese * If it's called on the same region of memory simultaneously, the effect 466*9eefe2a2SStefan Roese * may be that only one operation succeeds. 467*9eefe2a2SStefan Roese */ 468*9eefe2a2SStefan Roese static inline void __set_bit(int nr, volatile unsigned long *addr) 469*9eefe2a2SStefan Roese { 470*9eefe2a2SStefan Roese unsigned long mask = BIT_MASK(nr); 471*9eefe2a2SStefan Roese unsigned long *p = ((unsigned long *)addr) + BIT_WORD(nr); 472*9eefe2a2SStefan Roese 473*9eefe2a2SStefan Roese *p |= mask; 474*9eefe2a2SStefan Roese } 475*9eefe2a2SStefan Roese 476*9eefe2a2SStefan Roese static inline void __clear_bit(int nr, volatile unsigned long *addr) 477*9eefe2a2SStefan Roese { 478*9eefe2a2SStefan Roese unsigned long mask = BIT_MASK(nr); 479*9eefe2a2SStefan Roese unsigned long *p = ((unsigned long *)addr) + BIT_WORD(nr); 480*9eefe2a2SStefan Roese 481*9eefe2a2SStefan Roese *p &= ~mask; 482*9eefe2a2SStefan Roese } 483*9eefe2a2SStefan Roese 484*9eefe2a2SStefan Roese /* debug.c */ 485*9eefe2a2SStefan Roese 486*9eefe2a2SStefan Roese #define DEFINE_SPINLOCK(...) 487*9eefe2a2SStefan Roese #define module_param_named(...) 488*9eefe2a2SStefan Roese 489*9eefe2a2SStefan Roese /* misc.h */ 490*9eefe2a2SStefan Roese #define mutex_lock_nested(...) 491*9eefe2a2SStefan Roese #define mutex_unlock_nested(...) 492*9eefe2a2SStefan Roese #define mutex_is_locked(...) 0 493*9eefe2a2SStefan Roese 494*9eefe2a2SStefan Roese /* Version of this UBIFS implementation */ 495*9eefe2a2SStefan Roese #define UBIFS_VERSION 1 496*9eefe2a2SStefan Roese 497*9eefe2a2SStefan Roese /* Normal UBIFS messages */ 498*9eefe2a2SStefan Roese #define ubifs_msg(fmt, ...) \ 499*9eefe2a2SStefan Roese printk(KERN_NOTICE "UBIFS: " fmt "\n", ##__VA_ARGS__) 500*9eefe2a2SStefan Roese /* UBIFS error messages */ 501*9eefe2a2SStefan Roese #define ubifs_err(fmt, ...) \ 502*9eefe2a2SStefan Roese printk(KERN_ERR "UBIFS error (pid %d): %s: " fmt "\n", 0, \ 503*9eefe2a2SStefan Roese __func__, ##__VA_ARGS__) 504*9eefe2a2SStefan Roese /* UBIFS warning messages */ 505*9eefe2a2SStefan Roese #define ubifs_warn(fmt, ...) \ 506*9eefe2a2SStefan Roese printk(KERN_WARNING "UBIFS warning (pid %d): %s: " fmt "\n", \ 507*9eefe2a2SStefan Roese 0, __func__, ##__VA_ARGS__) 508*9eefe2a2SStefan Roese 509*9eefe2a2SStefan Roese /* UBIFS file system VFS magic number */ 510*9eefe2a2SStefan Roese #define UBIFS_SUPER_MAGIC 0x24051905 511*9eefe2a2SStefan Roese 512*9eefe2a2SStefan Roese /* Number of UBIFS blocks per VFS page */ 513*9eefe2a2SStefan Roese #define UBIFS_BLOCKS_PER_PAGE (PAGE_CACHE_SIZE / UBIFS_BLOCK_SIZE) 514*9eefe2a2SStefan Roese #define UBIFS_BLOCKS_PER_PAGE_SHIFT (PAGE_CACHE_SHIFT - UBIFS_BLOCK_SHIFT) 515*9eefe2a2SStefan Roese 516*9eefe2a2SStefan Roese /* "File system end of life" sequence number watermark */ 517*9eefe2a2SStefan Roese #define SQNUM_WARN_WATERMARK 0xFFFFFFFF00000000ULL 518*9eefe2a2SStefan Roese #define SQNUM_WATERMARK 0xFFFFFFFFFF000000ULL 519*9eefe2a2SStefan Roese 520*9eefe2a2SStefan Roese /* 521*9eefe2a2SStefan Roese * Minimum amount of LEBs reserved for the index. At present the index needs at 522*9eefe2a2SStefan Roese * least 2 LEBs: one for the index head and one for in-the-gaps method (which 523*9eefe2a2SStefan Roese * currently does not cater for the index head and so excludes it from 524*9eefe2a2SStefan Roese * consideration). 525*9eefe2a2SStefan Roese */ 526*9eefe2a2SStefan Roese #define MIN_INDEX_LEBS 2 527*9eefe2a2SStefan Roese 528*9eefe2a2SStefan Roese /* Minimum amount of data UBIFS writes to the flash */ 529*9eefe2a2SStefan Roese #define MIN_WRITE_SZ (UBIFS_DATA_NODE_SZ + 8) 530*9eefe2a2SStefan Roese 531*9eefe2a2SStefan Roese /* 532*9eefe2a2SStefan Roese * Currently we do not support inode number overlapping and re-using, so this 533*9eefe2a2SStefan Roese * watermark defines dangerous inode number level. This should be fixed later, 534*9eefe2a2SStefan Roese * although it is difficult to exceed current limit. Another option is to use 535*9eefe2a2SStefan Roese * 64-bit inode numbers, but this means more overhead. 536*9eefe2a2SStefan Roese */ 537*9eefe2a2SStefan Roese #define INUM_WARN_WATERMARK 0xFFF00000 538*9eefe2a2SStefan Roese #define INUM_WATERMARK 0xFFFFFF00 539*9eefe2a2SStefan Roese 540*9eefe2a2SStefan Roese /* Largest key size supported in this implementation */ 541*9eefe2a2SStefan Roese #define CUR_MAX_KEY_LEN UBIFS_SK_LEN 542*9eefe2a2SStefan Roese 543*9eefe2a2SStefan Roese /* Maximum number of entries in each LPT (LEB category) heap */ 544*9eefe2a2SStefan Roese #define LPT_HEAP_SZ 256 545*9eefe2a2SStefan Roese 546*9eefe2a2SStefan Roese /* 547*9eefe2a2SStefan Roese * Background thread name pattern. The numbers are UBI device and volume 548*9eefe2a2SStefan Roese * numbers. 549*9eefe2a2SStefan Roese */ 550*9eefe2a2SStefan Roese #define BGT_NAME_PATTERN "ubifs_bgt%d_%d" 551*9eefe2a2SStefan Roese 552*9eefe2a2SStefan Roese /* Default write-buffer synchronization timeout (5 secs) */ 553*9eefe2a2SStefan Roese #define DEFAULT_WBUF_TIMEOUT (5 * HZ) 554*9eefe2a2SStefan Roese 555*9eefe2a2SStefan Roese /* Maximum possible inode number (only 32-bit inodes are supported now) */ 556*9eefe2a2SStefan Roese #define MAX_INUM 0xFFFFFFFF 557*9eefe2a2SStefan Roese 558*9eefe2a2SStefan Roese /* Number of non-data journal heads */ 559*9eefe2a2SStefan Roese #define NONDATA_JHEADS_CNT 2 560*9eefe2a2SStefan Roese 561*9eefe2a2SStefan Roese /* Garbage collector head */ 562*9eefe2a2SStefan Roese #define GCHD 0 563*9eefe2a2SStefan Roese /* Base journal head number */ 564*9eefe2a2SStefan Roese #define BASEHD 1 565*9eefe2a2SStefan Roese /* First "general purpose" journal head */ 566*9eefe2a2SStefan Roese #define DATAHD 2 567*9eefe2a2SStefan Roese 568*9eefe2a2SStefan Roese /* 'No change' value for 'ubifs_change_lp()' */ 569*9eefe2a2SStefan Roese #define LPROPS_NC 0x80000001 570*9eefe2a2SStefan Roese 571*9eefe2a2SStefan Roese /* 572*9eefe2a2SStefan Roese * There is no notion of truncation key because truncation nodes do not exist 573*9eefe2a2SStefan Roese * in TNC. However, when replaying, it is handy to introduce fake "truncation" 574*9eefe2a2SStefan Roese * keys for truncation nodes because the code becomes simpler. So we define 575*9eefe2a2SStefan Roese * %UBIFS_TRUN_KEY type. 576*9eefe2a2SStefan Roese */ 577*9eefe2a2SStefan Roese #define UBIFS_TRUN_KEY UBIFS_KEY_TYPES_CNT 578*9eefe2a2SStefan Roese 579*9eefe2a2SStefan Roese /* 580*9eefe2a2SStefan Roese * How much a directory entry/extended attribute entry adds to the parent/host 581*9eefe2a2SStefan Roese * inode. 582*9eefe2a2SStefan Roese */ 583*9eefe2a2SStefan Roese #define CALC_DENT_SIZE(name_len) ALIGN(UBIFS_DENT_NODE_SZ + (name_len) + 1, 8) 584*9eefe2a2SStefan Roese 585*9eefe2a2SStefan Roese /* How much an extended attribute adds to the host inode */ 586*9eefe2a2SStefan Roese #define CALC_XATTR_BYTES(data_len) ALIGN(UBIFS_INO_NODE_SZ + (data_len) + 1, 8) 587*9eefe2a2SStefan Roese 588*9eefe2a2SStefan Roese /* 589*9eefe2a2SStefan Roese * Znodes which were not touched for 'OLD_ZNODE_AGE' seconds are considered 590*9eefe2a2SStefan Roese * "old", and znode which were touched last 'YOUNG_ZNODE_AGE' seconds ago are 591*9eefe2a2SStefan Roese * considered "young". This is used by shrinker when selecting znode to trim 592*9eefe2a2SStefan Roese * off. 593*9eefe2a2SStefan Roese */ 594*9eefe2a2SStefan Roese #define OLD_ZNODE_AGE 20 595*9eefe2a2SStefan Roese #define YOUNG_ZNODE_AGE 5 596*9eefe2a2SStefan Roese 597*9eefe2a2SStefan Roese /* 598*9eefe2a2SStefan Roese * Some compressors, like LZO, may end up with more data then the input buffer. 599*9eefe2a2SStefan Roese * So UBIFS always allocates larger output buffer, to be sure the compressor 600*9eefe2a2SStefan Roese * will not corrupt memory in case of worst case compression. 601*9eefe2a2SStefan Roese */ 602*9eefe2a2SStefan Roese #define WORST_COMPR_FACTOR 2 603*9eefe2a2SStefan Roese 604*9eefe2a2SStefan Roese /* Maximum expected tree height for use by bottom_up_buf */ 605*9eefe2a2SStefan Roese #define BOTTOM_UP_HEIGHT 64 606*9eefe2a2SStefan Roese 607*9eefe2a2SStefan Roese /* Maximum number of data nodes to bulk-read */ 608*9eefe2a2SStefan Roese #define UBIFS_MAX_BULK_READ 32 609*9eefe2a2SStefan Roese 610*9eefe2a2SStefan Roese /* 611*9eefe2a2SStefan Roese * Lockdep classes for UBIFS inode @ui_mutex. 612*9eefe2a2SStefan Roese */ 613*9eefe2a2SStefan Roese enum { 614*9eefe2a2SStefan Roese WB_MUTEX_1 = 0, 615*9eefe2a2SStefan Roese WB_MUTEX_2 = 1, 616*9eefe2a2SStefan Roese WB_MUTEX_3 = 2, 617*9eefe2a2SStefan Roese }; 618*9eefe2a2SStefan Roese 619*9eefe2a2SStefan Roese /* 620*9eefe2a2SStefan Roese * Znode flags (actually, bit numbers which store the flags). 621*9eefe2a2SStefan Roese * 622*9eefe2a2SStefan Roese * DIRTY_ZNODE: znode is dirty 623*9eefe2a2SStefan Roese * COW_ZNODE: znode is being committed and a new instance of this znode has to 624*9eefe2a2SStefan Roese * be created before changing this znode 625*9eefe2a2SStefan Roese * OBSOLETE_ZNODE: znode is obsolete, which means it was deleted, but it is 626*9eefe2a2SStefan Roese * still in the commit list and the ongoing commit operation 627*9eefe2a2SStefan Roese * will commit it, and delete this znode after it is done 628*9eefe2a2SStefan Roese */ 629*9eefe2a2SStefan Roese enum { 630*9eefe2a2SStefan Roese DIRTY_ZNODE = 0, 631*9eefe2a2SStefan Roese COW_ZNODE = 1, 632*9eefe2a2SStefan Roese OBSOLETE_ZNODE = 2, 633*9eefe2a2SStefan Roese }; 634*9eefe2a2SStefan Roese 635*9eefe2a2SStefan Roese /* 636*9eefe2a2SStefan Roese * Commit states. 637*9eefe2a2SStefan Roese * 638*9eefe2a2SStefan Roese * COMMIT_RESTING: commit is not wanted 639*9eefe2a2SStefan Roese * COMMIT_BACKGROUND: background commit has been requested 640*9eefe2a2SStefan Roese * COMMIT_REQUIRED: commit is required 641*9eefe2a2SStefan Roese * COMMIT_RUNNING_BACKGROUND: background commit is running 642*9eefe2a2SStefan Roese * COMMIT_RUNNING_REQUIRED: commit is running and it is required 643*9eefe2a2SStefan Roese * COMMIT_BROKEN: commit failed 644*9eefe2a2SStefan Roese */ 645*9eefe2a2SStefan Roese enum { 646*9eefe2a2SStefan Roese COMMIT_RESTING = 0, 647*9eefe2a2SStefan Roese COMMIT_BACKGROUND, 648*9eefe2a2SStefan Roese COMMIT_REQUIRED, 649*9eefe2a2SStefan Roese COMMIT_RUNNING_BACKGROUND, 650*9eefe2a2SStefan Roese COMMIT_RUNNING_REQUIRED, 651*9eefe2a2SStefan Roese COMMIT_BROKEN, 652*9eefe2a2SStefan Roese }; 653*9eefe2a2SStefan Roese 654*9eefe2a2SStefan Roese /* 655*9eefe2a2SStefan Roese * 'ubifs_scan_a_node()' return values. 656*9eefe2a2SStefan Roese * 657*9eefe2a2SStefan Roese * SCANNED_GARBAGE: scanned garbage 658*9eefe2a2SStefan Roese * SCANNED_EMPTY_SPACE: scanned empty space 659*9eefe2a2SStefan Roese * SCANNED_A_NODE: scanned a valid node 660*9eefe2a2SStefan Roese * SCANNED_A_CORRUPT_NODE: scanned a corrupted node 661*9eefe2a2SStefan Roese * SCANNED_A_BAD_PAD_NODE: scanned a padding node with invalid pad length 662*9eefe2a2SStefan Roese * 663*9eefe2a2SStefan Roese * Greater than zero means: 'scanned that number of padding bytes' 664*9eefe2a2SStefan Roese */ 665*9eefe2a2SStefan Roese enum { 666*9eefe2a2SStefan Roese SCANNED_GARBAGE = 0, 667*9eefe2a2SStefan Roese SCANNED_EMPTY_SPACE = -1, 668*9eefe2a2SStefan Roese SCANNED_A_NODE = -2, 669*9eefe2a2SStefan Roese SCANNED_A_CORRUPT_NODE = -3, 670*9eefe2a2SStefan Roese SCANNED_A_BAD_PAD_NODE = -4, 671*9eefe2a2SStefan Roese }; 672*9eefe2a2SStefan Roese 673*9eefe2a2SStefan Roese /* 674*9eefe2a2SStefan Roese * LPT cnode flag bits. 675*9eefe2a2SStefan Roese * 676*9eefe2a2SStefan Roese * DIRTY_CNODE: cnode is dirty 677*9eefe2a2SStefan Roese * COW_CNODE: cnode is being committed and must be copied before writing 678*9eefe2a2SStefan Roese * OBSOLETE_CNODE: cnode is being committed and has been copied (or deleted), 679*9eefe2a2SStefan Roese * so it can (and must) be freed when the commit is finished 680*9eefe2a2SStefan Roese */ 681*9eefe2a2SStefan Roese enum { 682*9eefe2a2SStefan Roese DIRTY_CNODE = 0, 683*9eefe2a2SStefan Roese COW_CNODE = 1, 684*9eefe2a2SStefan Roese OBSOLETE_CNODE = 2, 685*9eefe2a2SStefan Roese }; 686*9eefe2a2SStefan Roese 687*9eefe2a2SStefan Roese /* 688*9eefe2a2SStefan Roese * Dirty flag bits (lpt_drty_flgs) for LPT special nodes. 689*9eefe2a2SStefan Roese * 690*9eefe2a2SStefan Roese * LTAB_DIRTY: ltab node is dirty 691*9eefe2a2SStefan Roese * LSAVE_DIRTY: lsave node is dirty 692*9eefe2a2SStefan Roese */ 693*9eefe2a2SStefan Roese enum { 694*9eefe2a2SStefan Roese LTAB_DIRTY = 1, 695*9eefe2a2SStefan Roese LSAVE_DIRTY = 2, 696*9eefe2a2SStefan Roese }; 697*9eefe2a2SStefan Roese 698*9eefe2a2SStefan Roese /* 699*9eefe2a2SStefan Roese * Return codes used by the garbage collector. 700*9eefe2a2SStefan Roese * @LEB_FREED: the logical eraseblock was freed and is ready to use 701*9eefe2a2SStefan Roese * @LEB_FREED_IDX: indexing LEB was freed and can be used only after the commit 702*9eefe2a2SStefan Roese * @LEB_RETAINED: the logical eraseblock was freed and retained for GC purposes 703*9eefe2a2SStefan Roese */ 704*9eefe2a2SStefan Roese enum { 705*9eefe2a2SStefan Roese LEB_FREED, 706*9eefe2a2SStefan Roese LEB_FREED_IDX, 707*9eefe2a2SStefan Roese LEB_RETAINED, 708*9eefe2a2SStefan Roese }; 709*9eefe2a2SStefan Roese 710*9eefe2a2SStefan Roese /** 711*9eefe2a2SStefan Roese * struct ubifs_old_idx - index node obsoleted since last commit start. 712*9eefe2a2SStefan Roese * @rb: rb-tree node 713*9eefe2a2SStefan Roese * @lnum: LEB number of obsoleted index node 714*9eefe2a2SStefan Roese * @offs: offset of obsoleted index node 715*9eefe2a2SStefan Roese */ 716*9eefe2a2SStefan Roese struct ubifs_old_idx { 717*9eefe2a2SStefan Roese struct rb_node rb; 718*9eefe2a2SStefan Roese int lnum; 719*9eefe2a2SStefan Roese int offs; 720*9eefe2a2SStefan Roese }; 721*9eefe2a2SStefan Roese 722*9eefe2a2SStefan Roese /* The below union makes it easier to deal with keys */ 723*9eefe2a2SStefan Roese union ubifs_key { 724*9eefe2a2SStefan Roese uint8_t u8[CUR_MAX_KEY_LEN]; 725*9eefe2a2SStefan Roese uint32_t u32[CUR_MAX_KEY_LEN/4]; 726*9eefe2a2SStefan Roese uint64_t u64[CUR_MAX_KEY_LEN/8]; 727*9eefe2a2SStefan Roese __le32 j32[CUR_MAX_KEY_LEN/4]; 728*9eefe2a2SStefan Roese }; 729*9eefe2a2SStefan Roese 730*9eefe2a2SStefan Roese /** 731*9eefe2a2SStefan Roese * struct ubifs_scan_node - UBIFS scanned node information. 732*9eefe2a2SStefan Roese * @list: list of scanned nodes 733*9eefe2a2SStefan Roese * @key: key of node scanned (if it has one) 734*9eefe2a2SStefan Roese * @sqnum: sequence number 735*9eefe2a2SStefan Roese * @type: type of node scanned 736*9eefe2a2SStefan Roese * @offs: offset with LEB of node scanned 737*9eefe2a2SStefan Roese * @len: length of node scanned 738*9eefe2a2SStefan Roese * @node: raw node 739*9eefe2a2SStefan Roese */ 740*9eefe2a2SStefan Roese struct ubifs_scan_node { 741*9eefe2a2SStefan Roese struct list_head list; 742*9eefe2a2SStefan Roese union ubifs_key key; 743*9eefe2a2SStefan Roese unsigned long long sqnum; 744*9eefe2a2SStefan Roese int type; 745*9eefe2a2SStefan Roese int offs; 746*9eefe2a2SStefan Roese int len; 747*9eefe2a2SStefan Roese void *node; 748*9eefe2a2SStefan Roese }; 749*9eefe2a2SStefan Roese 750*9eefe2a2SStefan Roese /** 751*9eefe2a2SStefan Roese * struct ubifs_scan_leb - UBIFS scanned LEB information. 752*9eefe2a2SStefan Roese * @lnum: logical eraseblock number 753*9eefe2a2SStefan Roese * @nodes_cnt: number of nodes scanned 754*9eefe2a2SStefan Roese * @nodes: list of struct ubifs_scan_node 755*9eefe2a2SStefan Roese * @endpt: end point (and therefore the start of empty space) 756*9eefe2a2SStefan Roese * @ecc: read returned -EBADMSG 757*9eefe2a2SStefan Roese * @buf: buffer containing entire LEB scanned 758*9eefe2a2SStefan Roese */ 759*9eefe2a2SStefan Roese struct ubifs_scan_leb { 760*9eefe2a2SStefan Roese int lnum; 761*9eefe2a2SStefan Roese int nodes_cnt; 762*9eefe2a2SStefan Roese struct list_head nodes; 763*9eefe2a2SStefan Roese int endpt; 764*9eefe2a2SStefan Roese int ecc; 765*9eefe2a2SStefan Roese void *buf; 766*9eefe2a2SStefan Roese }; 767*9eefe2a2SStefan Roese 768*9eefe2a2SStefan Roese /** 769*9eefe2a2SStefan Roese * struct ubifs_gced_idx_leb - garbage-collected indexing LEB. 770*9eefe2a2SStefan Roese * @list: list 771*9eefe2a2SStefan Roese * @lnum: LEB number 772*9eefe2a2SStefan Roese * @unmap: OK to unmap this LEB 773*9eefe2a2SStefan Roese * 774*9eefe2a2SStefan Roese * This data structure is used to temporary store garbage-collected indexing 775*9eefe2a2SStefan Roese * LEBs - they are not released immediately, but only after the next commit. 776*9eefe2a2SStefan Roese * This is needed to guarantee recoverability. 777*9eefe2a2SStefan Roese */ 778*9eefe2a2SStefan Roese struct ubifs_gced_idx_leb { 779*9eefe2a2SStefan Roese struct list_head list; 780*9eefe2a2SStefan Roese int lnum; 781*9eefe2a2SStefan Roese int unmap; 782*9eefe2a2SStefan Roese }; 783*9eefe2a2SStefan Roese 784*9eefe2a2SStefan Roese /** 785*9eefe2a2SStefan Roese * struct ubifs_inode - UBIFS in-memory inode description. 786*9eefe2a2SStefan Roese * @vfs_inode: VFS inode description object 787*9eefe2a2SStefan Roese * @creat_sqnum: sequence number at time of creation 788*9eefe2a2SStefan Roese * @del_cmtno: commit number corresponding to the time the inode was deleted, 789*9eefe2a2SStefan Roese * protected by @c->commit_sem; 790*9eefe2a2SStefan Roese * @xattr_size: summarized size of all extended attributes in bytes 791*9eefe2a2SStefan Roese * @xattr_cnt: count of extended attributes this inode has 792*9eefe2a2SStefan Roese * @xattr_names: sum of lengths of all extended attribute names belonging to 793*9eefe2a2SStefan Roese * this inode 794*9eefe2a2SStefan Roese * @dirty: non-zero if the inode is dirty 795*9eefe2a2SStefan Roese * @xattr: non-zero if this is an extended attribute inode 796*9eefe2a2SStefan Roese * @bulk_read: non-zero if bulk-read should be used 797*9eefe2a2SStefan Roese * @ui_mutex: serializes inode write-back with the rest of VFS operations, 798*9eefe2a2SStefan Roese * serializes "clean <-> dirty" state changes, serializes bulk-read, 799*9eefe2a2SStefan Roese * protects @dirty, @bulk_read, @ui_size, and @xattr_size 800*9eefe2a2SStefan Roese * @ui_lock: protects @synced_i_size 801*9eefe2a2SStefan Roese * @synced_i_size: synchronized size of inode, i.e. the value of inode size 802*9eefe2a2SStefan Roese * currently stored on the flash; used only for regular file 803*9eefe2a2SStefan Roese * inodes 804*9eefe2a2SStefan Roese * @ui_size: inode size used by UBIFS when writing to flash 805*9eefe2a2SStefan Roese * @flags: inode flags (@UBIFS_COMPR_FL, etc) 806*9eefe2a2SStefan Roese * @compr_type: default compression type used for this inode 807*9eefe2a2SStefan Roese * @last_page_read: page number of last page read (for bulk read) 808*9eefe2a2SStefan Roese * @read_in_a_row: number of consecutive pages read in a row (for bulk read) 809*9eefe2a2SStefan Roese * @data_len: length of the data attached to the inode 810*9eefe2a2SStefan Roese * @data: inode's data 811*9eefe2a2SStefan Roese * 812*9eefe2a2SStefan Roese * @ui_mutex exists for two main reasons. At first it prevents inodes from 813*9eefe2a2SStefan Roese * being written back while UBIFS changing them, being in the middle of an VFS 814*9eefe2a2SStefan Roese * operation. This way UBIFS makes sure the inode fields are consistent. For 815*9eefe2a2SStefan Roese * example, in 'ubifs_rename()' we change 3 inodes simultaneously, and 816*9eefe2a2SStefan Roese * write-back must not write any of them before we have finished. 817*9eefe2a2SStefan Roese * 818*9eefe2a2SStefan Roese * The second reason is budgeting - UBIFS has to budget all operations. If an 819*9eefe2a2SStefan Roese * operation is going to mark an inode dirty, it has to allocate budget for 820*9eefe2a2SStefan Roese * this. It cannot just mark it dirty because there is no guarantee there will 821*9eefe2a2SStefan Roese * be enough flash space to write the inode back later. This means UBIFS has 822*9eefe2a2SStefan Roese * to have full control over inode "clean <-> dirty" transitions (and pages 823*9eefe2a2SStefan Roese * actually). But unfortunately, VFS marks inodes dirty in many places, and it 824*9eefe2a2SStefan Roese * does not ask the file-system if it is allowed to do so (there is a notifier, 825*9eefe2a2SStefan Roese * but it is not enough), i.e., there is no mechanism to synchronize with this. 826*9eefe2a2SStefan Roese * So UBIFS has its own inode dirty flag and its own mutex to serialize 827*9eefe2a2SStefan Roese * "clean <-> dirty" transitions. 828*9eefe2a2SStefan Roese * 829*9eefe2a2SStefan Roese * The @synced_i_size field is used to make sure we never write pages which are 830*9eefe2a2SStefan Roese * beyond last synchronized inode size. See 'ubifs_writepage()' for more 831*9eefe2a2SStefan Roese * information. 832*9eefe2a2SStefan Roese * 833*9eefe2a2SStefan Roese * The @ui_size is a "shadow" variable for @inode->i_size and UBIFS uses 834*9eefe2a2SStefan Roese * @ui_size instead of @inode->i_size. The reason for this is that UBIFS cannot 835*9eefe2a2SStefan Roese * make sure @inode->i_size is always changed under @ui_mutex, because it 836*9eefe2a2SStefan Roese * cannot call 'vmtruncate()' with @ui_mutex locked, because it would deadlock 837*9eefe2a2SStefan Roese * with 'ubifs_writepage()' (see file.c). All the other inode fields are 838*9eefe2a2SStefan Roese * changed under @ui_mutex, so they do not need "shadow" fields. Note, one 839*9eefe2a2SStefan Roese * could consider to rework locking and base it on "shadow" fields. 840*9eefe2a2SStefan Roese */ 841*9eefe2a2SStefan Roese struct ubifs_inode { 842*9eefe2a2SStefan Roese struct inode vfs_inode; 843*9eefe2a2SStefan Roese unsigned long long creat_sqnum; 844*9eefe2a2SStefan Roese unsigned long long del_cmtno; 845*9eefe2a2SStefan Roese unsigned int xattr_size; 846*9eefe2a2SStefan Roese unsigned int xattr_cnt; 847*9eefe2a2SStefan Roese unsigned int xattr_names; 848*9eefe2a2SStefan Roese unsigned int dirty:1; 849*9eefe2a2SStefan Roese unsigned int xattr:1; 850*9eefe2a2SStefan Roese unsigned int bulk_read:1; 851*9eefe2a2SStefan Roese unsigned int compr_type:2; 852*9eefe2a2SStefan Roese struct mutex ui_mutex; 853*9eefe2a2SStefan Roese spinlock_t ui_lock; 854*9eefe2a2SStefan Roese loff_t synced_i_size; 855*9eefe2a2SStefan Roese loff_t ui_size; 856*9eefe2a2SStefan Roese int flags; 857*9eefe2a2SStefan Roese pgoff_t last_page_read; 858*9eefe2a2SStefan Roese pgoff_t read_in_a_row; 859*9eefe2a2SStefan Roese int data_len; 860*9eefe2a2SStefan Roese void *data; 861*9eefe2a2SStefan Roese }; 862*9eefe2a2SStefan Roese 863*9eefe2a2SStefan Roese /** 864*9eefe2a2SStefan Roese * struct ubifs_unclean_leb - records a LEB recovered under read-only mode. 865*9eefe2a2SStefan Roese * @list: list 866*9eefe2a2SStefan Roese * @lnum: LEB number of recovered LEB 867*9eefe2a2SStefan Roese * @endpt: offset where recovery ended 868*9eefe2a2SStefan Roese * 869*9eefe2a2SStefan Roese * This structure records a LEB identified during recovery that needs to be 870*9eefe2a2SStefan Roese * cleaned but was not because UBIFS was mounted read-only. The information 871*9eefe2a2SStefan Roese * is used to clean the LEB when remounting to read-write mode. 872*9eefe2a2SStefan Roese */ 873*9eefe2a2SStefan Roese struct ubifs_unclean_leb { 874*9eefe2a2SStefan Roese struct list_head list; 875*9eefe2a2SStefan Roese int lnum; 876*9eefe2a2SStefan Roese int endpt; 877*9eefe2a2SStefan Roese }; 878*9eefe2a2SStefan Roese 879*9eefe2a2SStefan Roese /* 880*9eefe2a2SStefan Roese * LEB properties flags. 881*9eefe2a2SStefan Roese * 882*9eefe2a2SStefan Roese * LPROPS_UNCAT: not categorized 883*9eefe2a2SStefan Roese * LPROPS_DIRTY: dirty > free, dirty >= @c->dead_wm, not index 884*9eefe2a2SStefan Roese * LPROPS_DIRTY_IDX: dirty + free > @c->min_idx_node_sze and index 885*9eefe2a2SStefan Roese * LPROPS_FREE: free > 0, dirty < @c->dead_wm, not empty, not index 886*9eefe2a2SStefan Roese * LPROPS_HEAP_CNT: number of heaps used for storing categorized LEBs 887*9eefe2a2SStefan Roese * LPROPS_EMPTY: LEB is empty, not taken 888*9eefe2a2SStefan Roese * LPROPS_FREEABLE: free + dirty == leb_size, not index, not taken 889*9eefe2a2SStefan Roese * LPROPS_FRDI_IDX: free + dirty == leb_size and index, may be taken 890*9eefe2a2SStefan Roese * LPROPS_CAT_MASK: mask for the LEB categories above 891*9eefe2a2SStefan Roese * LPROPS_TAKEN: LEB was taken (this flag is not saved on the media) 892*9eefe2a2SStefan Roese * LPROPS_INDEX: LEB contains indexing nodes (this flag also exists on flash) 893*9eefe2a2SStefan Roese */ 894*9eefe2a2SStefan Roese enum { 895*9eefe2a2SStefan Roese LPROPS_UNCAT = 0, 896*9eefe2a2SStefan Roese LPROPS_DIRTY = 1, 897*9eefe2a2SStefan Roese LPROPS_DIRTY_IDX = 2, 898*9eefe2a2SStefan Roese LPROPS_FREE = 3, 899*9eefe2a2SStefan Roese LPROPS_HEAP_CNT = 3, 900*9eefe2a2SStefan Roese LPROPS_EMPTY = 4, 901*9eefe2a2SStefan Roese LPROPS_FREEABLE = 5, 902*9eefe2a2SStefan Roese LPROPS_FRDI_IDX = 6, 903*9eefe2a2SStefan Roese LPROPS_CAT_MASK = 15, 904*9eefe2a2SStefan Roese LPROPS_TAKEN = 16, 905*9eefe2a2SStefan Roese LPROPS_INDEX = 32, 906*9eefe2a2SStefan Roese }; 907*9eefe2a2SStefan Roese 908*9eefe2a2SStefan Roese /** 909*9eefe2a2SStefan Roese * struct ubifs_lprops - logical eraseblock properties. 910*9eefe2a2SStefan Roese * @free: amount of free space in bytes 911*9eefe2a2SStefan Roese * @dirty: amount of dirty space in bytes 912*9eefe2a2SStefan Roese * @flags: LEB properties flags (see above) 913*9eefe2a2SStefan Roese * @lnum: LEB number 914*9eefe2a2SStefan Roese * @list: list of same-category lprops (for LPROPS_EMPTY and LPROPS_FREEABLE) 915*9eefe2a2SStefan Roese * @hpos: heap position in heap of same-category lprops (other categories) 916*9eefe2a2SStefan Roese */ 917*9eefe2a2SStefan Roese struct ubifs_lprops { 918*9eefe2a2SStefan Roese int free; 919*9eefe2a2SStefan Roese int dirty; 920*9eefe2a2SStefan Roese int flags; 921*9eefe2a2SStefan Roese int lnum; 922*9eefe2a2SStefan Roese union { 923*9eefe2a2SStefan Roese struct list_head list; 924*9eefe2a2SStefan Roese int hpos; 925*9eefe2a2SStefan Roese }; 926*9eefe2a2SStefan Roese }; 927*9eefe2a2SStefan Roese 928*9eefe2a2SStefan Roese /** 929*9eefe2a2SStefan Roese * struct ubifs_lpt_lprops - LPT logical eraseblock properties. 930*9eefe2a2SStefan Roese * @free: amount of free space in bytes 931*9eefe2a2SStefan Roese * @dirty: amount of dirty space in bytes 932*9eefe2a2SStefan Roese * @tgc: trivial GC flag (1 => unmap after commit end) 933*9eefe2a2SStefan Roese * @cmt: commit flag (1 => reserved for commit) 934*9eefe2a2SStefan Roese */ 935*9eefe2a2SStefan Roese struct ubifs_lpt_lprops { 936*9eefe2a2SStefan Roese int free; 937*9eefe2a2SStefan Roese int dirty; 938*9eefe2a2SStefan Roese unsigned tgc:1; 939*9eefe2a2SStefan Roese unsigned cmt:1; 940*9eefe2a2SStefan Roese }; 941*9eefe2a2SStefan Roese 942*9eefe2a2SStefan Roese /** 943*9eefe2a2SStefan Roese * struct ubifs_lp_stats - statistics of eraseblocks in the main area. 944*9eefe2a2SStefan Roese * @empty_lebs: number of empty LEBs 945*9eefe2a2SStefan Roese * @taken_empty_lebs: number of taken LEBs 946*9eefe2a2SStefan Roese * @idx_lebs: number of indexing LEBs 947*9eefe2a2SStefan Roese * @total_free: total free space in bytes (includes all LEBs) 948*9eefe2a2SStefan Roese * @total_dirty: total dirty space in bytes (includes all LEBs) 949*9eefe2a2SStefan Roese * @total_used: total used space in bytes (does not include index LEBs) 950*9eefe2a2SStefan Roese * @total_dead: total dead space in bytes (does not include index LEBs) 951*9eefe2a2SStefan Roese * @total_dark: total dark space in bytes (does not include index LEBs) 952*9eefe2a2SStefan Roese * 953*9eefe2a2SStefan Roese * The @taken_empty_lebs field counts the LEBs that are in the transient state 954*9eefe2a2SStefan Roese * of having been "taken" for use but not yet written to. @taken_empty_lebs is 955*9eefe2a2SStefan Roese * needed to account correctly for @gc_lnum, otherwise @empty_lebs could be 956*9eefe2a2SStefan Roese * used by itself (in which case 'unused_lebs' would be a better name). In the 957*9eefe2a2SStefan Roese * case of @gc_lnum, it is "taken" at mount time or whenever a LEB is retained 958*9eefe2a2SStefan Roese * by GC, but unlike other empty LEBs that are "taken", it may not be written 959*9eefe2a2SStefan Roese * straight away (i.e. before the next commit start or unmount), so either 960*9eefe2a2SStefan Roese * @gc_lnum must be specially accounted for, or the current approach followed 961*9eefe2a2SStefan Roese * i.e. count it under @taken_empty_lebs. 962*9eefe2a2SStefan Roese * 963*9eefe2a2SStefan Roese * @empty_lebs includes @taken_empty_lebs. 964*9eefe2a2SStefan Roese * 965*9eefe2a2SStefan Roese * @total_used, @total_dead and @total_dark fields do not account indexing 966*9eefe2a2SStefan Roese * LEBs. 967*9eefe2a2SStefan Roese */ 968*9eefe2a2SStefan Roese struct ubifs_lp_stats { 969*9eefe2a2SStefan Roese int empty_lebs; 970*9eefe2a2SStefan Roese int taken_empty_lebs; 971*9eefe2a2SStefan Roese int idx_lebs; 972*9eefe2a2SStefan Roese long long total_free; 973*9eefe2a2SStefan Roese long long total_dirty; 974*9eefe2a2SStefan Roese long long total_used; 975*9eefe2a2SStefan Roese long long total_dead; 976*9eefe2a2SStefan Roese long long total_dark; 977*9eefe2a2SStefan Roese }; 978*9eefe2a2SStefan Roese 979*9eefe2a2SStefan Roese struct ubifs_nnode; 980*9eefe2a2SStefan Roese 981*9eefe2a2SStefan Roese /** 982*9eefe2a2SStefan Roese * struct ubifs_cnode - LEB Properties Tree common node. 983*9eefe2a2SStefan Roese * @parent: parent nnode 984*9eefe2a2SStefan Roese * @cnext: next cnode to commit 985*9eefe2a2SStefan Roese * @flags: flags (%DIRTY_LPT_NODE or %OBSOLETE_LPT_NODE) 986*9eefe2a2SStefan Roese * @iip: index in parent 987*9eefe2a2SStefan Roese * @level: level in the tree (zero for pnodes, greater than zero for nnodes) 988*9eefe2a2SStefan Roese * @num: node number 989*9eefe2a2SStefan Roese */ 990*9eefe2a2SStefan Roese struct ubifs_cnode { 991*9eefe2a2SStefan Roese struct ubifs_nnode *parent; 992*9eefe2a2SStefan Roese struct ubifs_cnode *cnext; 993*9eefe2a2SStefan Roese unsigned long flags; 994*9eefe2a2SStefan Roese int iip; 995*9eefe2a2SStefan Roese int level; 996*9eefe2a2SStefan Roese int num; 997*9eefe2a2SStefan Roese }; 998*9eefe2a2SStefan Roese 999*9eefe2a2SStefan Roese /** 1000*9eefe2a2SStefan Roese * struct ubifs_pnode - LEB Properties Tree leaf node. 1001*9eefe2a2SStefan Roese * @parent: parent nnode 1002*9eefe2a2SStefan Roese * @cnext: next cnode to commit 1003*9eefe2a2SStefan Roese * @flags: flags (%DIRTY_LPT_NODE or %OBSOLETE_LPT_NODE) 1004*9eefe2a2SStefan Roese * @iip: index in parent 1005*9eefe2a2SStefan Roese * @level: level in the tree (always zero for pnodes) 1006*9eefe2a2SStefan Roese * @num: node number 1007*9eefe2a2SStefan Roese * @lprops: LEB properties array 1008*9eefe2a2SStefan Roese */ 1009*9eefe2a2SStefan Roese struct ubifs_pnode { 1010*9eefe2a2SStefan Roese struct ubifs_nnode *parent; 1011*9eefe2a2SStefan Roese struct ubifs_cnode *cnext; 1012*9eefe2a2SStefan Roese unsigned long flags; 1013*9eefe2a2SStefan Roese int iip; 1014*9eefe2a2SStefan Roese int level; 1015*9eefe2a2SStefan Roese int num; 1016*9eefe2a2SStefan Roese struct ubifs_lprops lprops[UBIFS_LPT_FANOUT]; 1017*9eefe2a2SStefan Roese }; 1018*9eefe2a2SStefan Roese 1019*9eefe2a2SStefan Roese /** 1020*9eefe2a2SStefan Roese * struct ubifs_nbranch - LEB Properties Tree internal node branch. 1021*9eefe2a2SStefan Roese * @lnum: LEB number of child 1022*9eefe2a2SStefan Roese * @offs: offset of child 1023*9eefe2a2SStefan Roese * @nnode: nnode child 1024*9eefe2a2SStefan Roese * @pnode: pnode child 1025*9eefe2a2SStefan Roese * @cnode: cnode child 1026*9eefe2a2SStefan Roese */ 1027*9eefe2a2SStefan Roese struct ubifs_nbranch { 1028*9eefe2a2SStefan Roese int lnum; 1029*9eefe2a2SStefan Roese int offs; 1030*9eefe2a2SStefan Roese union { 1031*9eefe2a2SStefan Roese struct ubifs_nnode *nnode; 1032*9eefe2a2SStefan Roese struct ubifs_pnode *pnode; 1033*9eefe2a2SStefan Roese struct ubifs_cnode *cnode; 1034*9eefe2a2SStefan Roese }; 1035*9eefe2a2SStefan Roese }; 1036*9eefe2a2SStefan Roese 1037*9eefe2a2SStefan Roese /** 1038*9eefe2a2SStefan Roese * struct ubifs_nnode - LEB Properties Tree internal node. 1039*9eefe2a2SStefan Roese * @parent: parent nnode 1040*9eefe2a2SStefan Roese * @cnext: next cnode to commit 1041*9eefe2a2SStefan Roese * @flags: flags (%DIRTY_LPT_NODE or %OBSOLETE_LPT_NODE) 1042*9eefe2a2SStefan Roese * @iip: index in parent 1043*9eefe2a2SStefan Roese * @level: level in the tree (always greater than zero for nnodes) 1044*9eefe2a2SStefan Roese * @num: node number 1045*9eefe2a2SStefan Roese * @nbranch: branches to child nodes 1046*9eefe2a2SStefan Roese */ 1047*9eefe2a2SStefan Roese struct ubifs_nnode { 1048*9eefe2a2SStefan Roese struct ubifs_nnode *parent; 1049*9eefe2a2SStefan Roese struct ubifs_cnode *cnext; 1050*9eefe2a2SStefan Roese unsigned long flags; 1051*9eefe2a2SStefan Roese int iip; 1052*9eefe2a2SStefan Roese int level; 1053*9eefe2a2SStefan Roese int num; 1054*9eefe2a2SStefan Roese struct ubifs_nbranch nbranch[UBIFS_LPT_FANOUT]; 1055*9eefe2a2SStefan Roese }; 1056*9eefe2a2SStefan Roese 1057*9eefe2a2SStefan Roese /** 1058*9eefe2a2SStefan Roese * struct ubifs_lpt_heap - heap of categorized lprops. 1059*9eefe2a2SStefan Roese * @arr: heap array 1060*9eefe2a2SStefan Roese * @cnt: number in heap 1061*9eefe2a2SStefan Roese * @max_cnt: maximum number allowed in heap 1062*9eefe2a2SStefan Roese * 1063*9eefe2a2SStefan Roese * There are %LPROPS_HEAP_CNT heaps. 1064*9eefe2a2SStefan Roese */ 1065*9eefe2a2SStefan Roese struct ubifs_lpt_heap { 1066*9eefe2a2SStefan Roese struct ubifs_lprops **arr; 1067*9eefe2a2SStefan Roese int cnt; 1068*9eefe2a2SStefan Roese int max_cnt; 1069*9eefe2a2SStefan Roese }; 1070*9eefe2a2SStefan Roese 1071*9eefe2a2SStefan Roese /* 1072*9eefe2a2SStefan Roese * Return codes for LPT scan callback function. 1073*9eefe2a2SStefan Roese * 1074*9eefe2a2SStefan Roese * LPT_SCAN_CONTINUE: continue scanning 1075*9eefe2a2SStefan Roese * LPT_SCAN_ADD: add the LEB properties scanned to the tree in memory 1076*9eefe2a2SStefan Roese * LPT_SCAN_STOP: stop scanning 1077*9eefe2a2SStefan Roese */ 1078*9eefe2a2SStefan Roese enum { 1079*9eefe2a2SStefan Roese LPT_SCAN_CONTINUE = 0, 1080*9eefe2a2SStefan Roese LPT_SCAN_ADD = 1, 1081*9eefe2a2SStefan Roese LPT_SCAN_STOP = 2, 1082*9eefe2a2SStefan Roese }; 1083*9eefe2a2SStefan Roese 1084*9eefe2a2SStefan Roese struct ubifs_info; 1085*9eefe2a2SStefan Roese 1086*9eefe2a2SStefan Roese /* Callback used by the 'ubifs_lpt_scan_nolock()' function */ 1087*9eefe2a2SStefan Roese typedef int (*ubifs_lpt_scan_callback)(struct ubifs_info *c, 1088*9eefe2a2SStefan Roese const struct ubifs_lprops *lprops, 1089*9eefe2a2SStefan Roese int in_tree, void *data); 1090*9eefe2a2SStefan Roese 1091*9eefe2a2SStefan Roese /** 1092*9eefe2a2SStefan Roese * struct ubifs_wbuf - UBIFS write-buffer. 1093*9eefe2a2SStefan Roese * @c: UBIFS file-system description object 1094*9eefe2a2SStefan Roese * @buf: write-buffer (of min. flash I/O unit size) 1095*9eefe2a2SStefan Roese * @lnum: logical eraseblock number the write-buffer points to 1096*9eefe2a2SStefan Roese * @offs: write-buffer offset in this logical eraseblock 1097*9eefe2a2SStefan Roese * @avail: number of bytes available in the write-buffer 1098*9eefe2a2SStefan Roese * @used: number of used bytes in the write-buffer 1099*9eefe2a2SStefan Roese * @dtype: type of data stored in this LEB (%UBI_LONGTERM, %UBI_SHORTTERM, 1100*9eefe2a2SStefan Roese * %UBI_UNKNOWN) 1101*9eefe2a2SStefan Roese * @jhead: journal head the mutex belongs to (note, needed only to shut lockdep 1102*9eefe2a2SStefan Roese * up by 'mutex_lock_nested()). 1103*9eefe2a2SStefan Roese * @sync_callback: write-buffer synchronization callback 1104*9eefe2a2SStefan Roese * @io_mutex: serializes write-buffer I/O 1105*9eefe2a2SStefan Roese * @lock: serializes @buf, @lnum, @offs, @avail, @used, @next_ino and @inodes 1106*9eefe2a2SStefan Roese * fields 1107*9eefe2a2SStefan Roese * @timer: write-buffer timer 1108*9eefe2a2SStefan Roese * @timeout: timer expire interval in jiffies 1109*9eefe2a2SStefan Roese * @need_sync: it is set if its timer expired and needs sync 1110*9eefe2a2SStefan Roese * @next_ino: points to the next position of the following inode number 1111*9eefe2a2SStefan Roese * @inodes: stores the inode numbers of the nodes which are in wbuf 1112*9eefe2a2SStefan Roese * 1113*9eefe2a2SStefan Roese * The write-buffer synchronization callback is called when the write-buffer is 1114*9eefe2a2SStefan Roese * synchronized in order to notify how much space was wasted due to 1115*9eefe2a2SStefan Roese * write-buffer padding and how much free space is left in the LEB. 1116*9eefe2a2SStefan Roese * 1117*9eefe2a2SStefan Roese * Note: the fields @buf, @lnum, @offs, @avail and @used can be read under 1118*9eefe2a2SStefan Roese * spin-lock or mutex because they are written under both mutex and spin-lock. 1119*9eefe2a2SStefan Roese * @buf is appended to under mutex but overwritten under both mutex and 1120*9eefe2a2SStefan Roese * spin-lock. Thus the data between @buf and @buf + @used can be read under 1121*9eefe2a2SStefan Roese * spinlock. 1122*9eefe2a2SStefan Roese */ 1123*9eefe2a2SStefan Roese struct ubifs_wbuf { 1124*9eefe2a2SStefan Roese struct ubifs_info *c; 1125*9eefe2a2SStefan Roese void *buf; 1126*9eefe2a2SStefan Roese int lnum; 1127*9eefe2a2SStefan Roese int offs; 1128*9eefe2a2SStefan Roese int avail; 1129*9eefe2a2SStefan Roese int used; 1130*9eefe2a2SStefan Roese int dtype; 1131*9eefe2a2SStefan Roese int jhead; 1132*9eefe2a2SStefan Roese int (*sync_callback)(struct ubifs_info *c, int lnum, int free, int pad); 1133*9eefe2a2SStefan Roese struct mutex io_mutex; 1134*9eefe2a2SStefan Roese spinlock_t lock; 1135*9eefe2a2SStefan Roese int timeout; 1136*9eefe2a2SStefan Roese int need_sync; 1137*9eefe2a2SStefan Roese int next_ino; 1138*9eefe2a2SStefan Roese ino_t *inodes; 1139*9eefe2a2SStefan Roese }; 1140*9eefe2a2SStefan Roese 1141*9eefe2a2SStefan Roese /** 1142*9eefe2a2SStefan Roese * struct ubifs_bud - bud logical eraseblock. 1143*9eefe2a2SStefan Roese * @lnum: logical eraseblock number 1144*9eefe2a2SStefan Roese * @start: where the (uncommitted) bud data starts 1145*9eefe2a2SStefan Roese * @jhead: journal head number this bud belongs to 1146*9eefe2a2SStefan Roese * @list: link in the list buds belonging to the same journal head 1147*9eefe2a2SStefan Roese * @rb: link in the tree of all buds 1148*9eefe2a2SStefan Roese */ 1149*9eefe2a2SStefan Roese struct ubifs_bud { 1150*9eefe2a2SStefan Roese int lnum; 1151*9eefe2a2SStefan Roese int start; 1152*9eefe2a2SStefan Roese int jhead; 1153*9eefe2a2SStefan Roese struct list_head list; 1154*9eefe2a2SStefan Roese struct rb_node rb; 1155*9eefe2a2SStefan Roese }; 1156*9eefe2a2SStefan Roese 1157*9eefe2a2SStefan Roese /** 1158*9eefe2a2SStefan Roese * struct ubifs_jhead - journal head. 1159*9eefe2a2SStefan Roese * @wbuf: head's write-buffer 1160*9eefe2a2SStefan Roese * @buds_list: list of bud LEBs belonging to this journal head 1161*9eefe2a2SStefan Roese * 1162*9eefe2a2SStefan Roese * Note, the @buds list is protected by the @c->buds_lock. 1163*9eefe2a2SStefan Roese */ 1164*9eefe2a2SStefan Roese struct ubifs_jhead { 1165*9eefe2a2SStefan Roese struct ubifs_wbuf wbuf; 1166*9eefe2a2SStefan Roese struct list_head buds_list; 1167*9eefe2a2SStefan Roese }; 1168*9eefe2a2SStefan Roese 1169*9eefe2a2SStefan Roese /** 1170*9eefe2a2SStefan Roese * struct ubifs_zbranch - key/coordinate/length branch stored in znodes. 1171*9eefe2a2SStefan Roese * @key: key 1172*9eefe2a2SStefan Roese * @znode: znode address in memory 1173*9eefe2a2SStefan Roese * @lnum: LEB number of the target node (indexing node or data node) 1174*9eefe2a2SStefan Roese * @offs: target node offset within @lnum 1175*9eefe2a2SStefan Roese * @len: target node length 1176*9eefe2a2SStefan Roese */ 1177*9eefe2a2SStefan Roese struct ubifs_zbranch { 1178*9eefe2a2SStefan Roese union ubifs_key key; 1179*9eefe2a2SStefan Roese union { 1180*9eefe2a2SStefan Roese struct ubifs_znode *znode; 1181*9eefe2a2SStefan Roese void *leaf; 1182*9eefe2a2SStefan Roese }; 1183*9eefe2a2SStefan Roese int lnum; 1184*9eefe2a2SStefan Roese int offs; 1185*9eefe2a2SStefan Roese int len; 1186*9eefe2a2SStefan Roese }; 1187*9eefe2a2SStefan Roese 1188*9eefe2a2SStefan Roese /** 1189*9eefe2a2SStefan Roese * struct ubifs_znode - in-memory representation of an indexing node. 1190*9eefe2a2SStefan Roese * @parent: parent znode or NULL if it is the root 1191*9eefe2a2SStefan Roese * @cnext: next znode to commit 1192*9eefe2a2SStefan Roese * @flags: znode flags (%DIRTY_ZNODE, %COW_ZNODE or %OBSOLETE_ZNODE) 1193*9eefe2a2SStefan Roese * @time: last access time (seconds) 1194*9eefe2a2SStefan Roese * @level: level of the entry in the TNC tree 1195*9eefe2a2SStefan Roese * @child_cnt: count of child znodes 1196*9eefe2a2SStefan Roese * @iip: index in parent's zbranch array 1197*9eefe2a2SStefan Roese * @alt: lower bound of key range has altered i.e. child inserted at slot 0 1198*9eefe2a2SStefan Roese * @lnum: LEB number of the corresponding indexing node 1199*9eefe2a2SStefan Roese * @offs: offset of the corresponding indexing node 1200*9eefe2a2SStefan Roese * @len: length of the corresponding indexing node 1201*9eefe2a2SStefan Roese * @zbranch: array of znode branches (@c->fanout elements) 1202*9eefe2a2SStefan Roese */ 1203*9eefe2a2SStefan Roese struct ubifs_znode { 1204*9eefe2a2SStefan Roese struct ubifs_znode *parent; 1205*9eefe2a2SStefan Roese struct ubifs_znode *cnext; 1206*9eefe2a2SStefan Roese unsigned long flags; 1207*9eefe2a2SStefan Roese unsigned long time; 1208*9eefe2a2SStefan Roese int level; 1209*9eefe2a2SStefan Roese int child_cnt; 1210*9eefe2a2SStefan Roese int iip; 1211*9eefe2a2SStefan Roese int alt; 1212*9eefe2a2SStefan Roese #ifdef CONFIG_UBIFS_FS_DEBUG 1213*9eefe2a2SStefan Roese int lnum, offs, len; 1214*9eefe2a2SStefan Roese #endif 1215*9eefe2a2SStefan Roese struct ubifs_zbranch zbranch[]; 1216*9eefe2a2SStefan Roese }; 1217*9eefe2a2SStefan Roese 1218*9eefe2a2SStefan Roese /** 1219*9eefe2a2SStefan Roese * struct bu_info - bulk-read information. 1220*9eefe2a2SStefan Roese * @key: first data node key 1221*9eefe2a2SStefan Roese * @zbranch: zbranches of data nodes to bulk read 1222*9eefe2a2SStefan Roese * @buf: buffer to read into 1223*9eefe2a2SStefan Roese * @buf_len: buffer length 1224*9eefe2a2SStefan Roese * @gc_seq: GC sequence number to detect races with GC 1225*9eefe2a2SStefan Roese * @cnt: number of data nodes for bulk read 1226*9eefe2a2SStefan Roese * @blk_cnt: number of data blocks including holes 1227*9eefe2a2SStefan Roese * @oef: end of file reached 1228*9eefe2a2SStefan Roese */ 1229*9eefe2a2SStefan Roese struct bu_info { 1230*9eefe2a2SStefan Roese union ubifs_key key; 1231*9eefe2a2SStefan Roese struct ubifs_zbranch zbranch[UBIFS_MAX_BULK_READ]; 1232*9eefe2a2SStefan Roese void *buf; 1233*9eefe2a2SStefan Roese int buf_len; 1234*9eefe2a2SStefan Roese int gc_seq; 1235*9eefe2a2SStefan Roese int cnt; 1236*9eefe2a2SStefan Roese int blk_cnt; 1237*9eefe2a2SStefan Roese int eof; 1238*9eefe2a2SStefan Roese }; 1239*9eefe2a2SStefan Roese 1240*9eefe2a2SStefan Roese /** 1241*9eefe2a2SStefan Roese * struct ubifs_node_range - node length range description data structure. 1242*9eefe2a2SStefan Roese * @len: fixed node length 1243*9eefe2a2SStefan Roese * @min_len: minimum possible node length 1244*9eefe2a2SStefan Roese * @max_len: maximum possible node length 1245*9eefe2a2SStefan Roese * 1246*9eefe2a2SStefan Roese * If @max_len is %0, the node has fixed length @len. 1247*9eefe2a2SStefan Roese */ 1248*9eefe2a2SStefan Roese struct ubifs_node_range { 1249*9eefe2a2SStefan Roese union { 1250*9eefe2a2SStefan Roese int len; 1251*9eefe2a2SStefan Roese int min_len; 1252*9eefe2a2SStefan Roese }; 1253*9eefe2a2SStefan Roese int max_len; 1254*9eefe2a2SStefan Roese }; 1255*9eefe2a2SStefan Roese 1256*9eefe2a2SStefan Roese /** 1257*9eefe2a2SStefan Roese * struct ubifs_compressor - UBIFS compressor description structure. 1258*9eefe2a2SStefan Roese * @compr_type: compressor type (%UBIFS_COMPR_LZO, etc) 1259*9eefe2a2SStefan Roese * @cc: cryptoapi compressor handle 1260*9eefe2a2SStefan Roese * @comp_mutex: mutex used during compression 1261*9eefe2a2SStefan Roese * @decomp_mutex: mutex used during decompression 1262*9eefe2a2SStefan Roese * @name: compressor name 1263*9eefe2a2SStefan Roese * @capi_name: cryptoapi compressor name 1264*9eefe2a2SStefan Roese */ 1265*9eefe2a2SStefan Roese struct ubifs_compressor { 1266*9eefe2a2SStefan Roese int compr_type; 1267*9eefe2a2SStefan Roese char *name; 1268*9eefe2a2SStefan Roese char *capi_name; 1269*9eefe2a2SStefan Roese int (*decompress)(const unsigned char *in, size_t in_len, 1270*9eefe2a2SStefan Roese unsigned char *out, size_t *out_len); 1271*9eefe2a2SStefan Roese }; 1272*9eefe2a2SStefan Roese 1273*9eefe2a2SStefan Roese /** 1274*9eefe2a2SStefan Roese * struct ubifs_budget_req - budget requirements of an operation. 1275*9eefe2a2SStefan Roese * 1276*9eefe2a2SStefan Roese * @fast: non-zero if the budgeting should try to acquire budget quickly and 1277*9eefe2a2SStefan Roese * should not try to call write-back 1278*9eefe2a2SStefan Roese * @recalculate: non-zero if @idx_growth, @data_growth, and @dd_growth fields 1279*9eefe2a2SStefan Roese * have to be re-calculated 1280*9eefe2a2SStefan Roese * @new_page: non-zero if the operation adds a new page 1281*9eefe2a2SStefan Roese * @dirtied_page: non-zero if the operation makes a page dirty 1282*9eefe2a2SStefan Roese * @new_dent: non-zero if the operation adds a new directory entry 1283*9eefe2a2SStefan Roese * @mod_dent: non-zero if the operation removes or modifies an existing 1284*9eefe2a2SStefan Roese * directory entry 1285*9eefe2a2SStefan Roese * @new_ino: non-zero if the operation adds a new inode 1286*9eefe2a2SStefan Roese * @new_ino_d: now much data newly created inode contains 1287*9eefe2a2SStefan Roese * @dirtied_ino: how many inodes the operation makes dirty 1288*9eefe2a2SStefan Roese * @dirtied_ino_d: now much data dirtied inode contains 1289*9eefe2a2SStefan Roese * @idx_growth: how much the index will supposedly grow 1290*9eefe2a2SStefan Roese * @data_growth: how much new data the operation will supposedly add 1291*9eefe2a2SStefan Roese * @dd_growth: how much data that makes other data dirty the operation will 1292*9eefe2a2SStefan Roese * supposedly add 1293*9eefe2a2SStefan Roese * 1294*9eefe2a2SStefan Roese * @idx_growth, @data_growth and @dd_growth are not used in budget request. The 1295*9eefe2a2SStefan Roese * budgeting subsystem caches index and data growth values there to avoid 1296*9eefe2a2SStefan Roese * re-calculating them when the budget is released. However, if @idx_growth is 1297*9eefe2a2SStefan Roese * %-1, it is calculated by the release function using other fields. 1298*9eefe2a2SStefan Roese * 1299*9eefe2a2SStefan Roese * An inode may contain 4KiB of data at max., thus the widths of @new_ino_d 1300*9eefe2a2SStefan Roese * is 13 bits, and @dirtied_ino_d - 15, because up to 4 inodes may be made 1301*9eefe2a2SStefan Roese * dirty by the re-name operation. 1302*9eefe2a2SStefan Roese * 1303*9eefe2a2SStefan Roese * Note, UBIFS aligns node lengths to 8-bytes boundary, so the requester has to 1304*9eefe2a2SStefan Roese * make sure the amount of inode data which contribute to @new_ino_d and 1305*9eefe2a2SStefan Roese * @dirtied_ino_d fields are aligned. 1306*9eefe2a2SStefan Roese */ 1307*9eefe2a2SStefan Roese struct ubifs_budget_req { 1308*9eefe2a2SStefan Roese unsigned int fast:1; 1309*9eefe2a2SStefan Roese unsigned int recalculate:1; 1310*9eefe2a2SStefan Roese #ifndef UBIFS_DEBUG 1311*9eefe2a2SStefan Roese unsigned int new_page:1; 1312*9eefe2a2SStefan Roese unsigned int dirtied_page:1; 1313*9eefe2a2SStefan Roese unsigned int new_dent:1; 1314*9eefe2a2SStefan Roese unsigned int mod_dent:1; 1315*9eefe2a2SStefan Roese unsigned int new_ino:1; 1316*9eefe2a2SStefan Roese unsigned int new_ino_d:13; 1317*9eefe2a2SStefan Roese unsigned int dirtied_ino:4; 1318*9eefe2a2SStefan Roese unsigned int dirtied_ino_d:15; 1319*9eefe2a2SStefan Roese #else 1320*9eefe2a2SStefan Roese /* Not bit-fields to check for overflows */ 1321*9eefe2a2SStefan Roese unsigned int new_page; 1322*9eefe2a2SStefan Roese unsigned int dirtied_page; 1323*9eefe2a2SStefan Roese unsigned int new_dent; 1324*9eefe2a2SStefan Roese unsigned int mod_dent; 1325*9eefe2a2SStefan Roese unsigned int new_ino; 1326*9eefe2a2SStefan Roese unsigned int new_ino_d; 1327*9eefe2a2SStefan Roese unsigned int dirtied_ino; 1328*9eefe2a2SStefan Roese unsigned int dirtied_ino_d; 1329*9eefe2a2SStefan Roese #endif 1330*9eefe2a2SStefan Roese int idx_growth; 1331*9eefe2a2SStefan Roese int data_growth; 1332*9eefe2a2SStefan Roese int dd_growth; 1333*9eefe2a2SStefan Roese }; 1334*9eefe2a2SStefan Roese 1335*9eefe2a2SStefan Roese /** 1336*9eefe2a2SStefan Roese * struct ubifs_orphan - stores the inode number of an orphan. 1337*9eefe2a2SStefan Roese * @rb: rb-tree node of rb-tree of orphans sorted by inode number 1338*9eefe2a2SStefan Roese * @list: list head of list of orphans in order added 1339*9eefe2a2SStefan Roese * @new_list: list head of list of orphans added since the last commit 1340*9eefe2a2SStefan Roese * @cnext: next orphan to commit 1341*9eefe2a2SStefan Roese * @dnext: next orphan to delete 1342*9eefe2a2SStefan Roese * @inum: inode number 1343*9eefe2a2SStefan Roese * @new: %1 => added since the last commit, otherwise %0 1344*9eefe2a2SStefan Roese */ 1345*9eefe2a2SStefan Roese struct ubifs_orphan { 1346*9eefe2a2SStefan Roese struct rb_node rb; 1347*9eefe2a2SStefan Roese struct list_head list; 1348*9eefe2a2SStefan Roese struct list_head new_list; 1349*9eefe2a2SStefan Roese struct ubifs_orphan *cnext; 1350*9eefe2a2SStefan Roese struct ubifs_orphan *dnext; 1351*9eefe2a2SStefan Roese ino_t inum; 1352*9eefe2a2SStefan Roese int new; 1353*9eefe2a2SStefan Roese }; 1354*9eefe2a2SStefan Roese 1355*9eefe2a2SStefan Roese /** 1356*9eefe2a2SStefan Roese * struct ubifs_mount_opts - UBIFS-specific mount options information. 1357*9eefe2a2SStefan Roese * @unmount_mode: selected unmount mode (%0 default, %1 normal, %2 fast) 1358*9eefe2a2SStefan Roese * @bulk_read: enable/disable bulk-reads (%0 default, %1 disabe, %2 enable) 1359*9eefe2a2SStefan Roese * @chk_data_crc: enable/disable CRC data checking when reading data nodes 1360*9eefe2a2SStefan Roese * (%0 default, %1 disabe, %2 enable) 1361*9eefe2a2SStefan Roese * @override_compr: override default compressor (%0 - do not override and use 1362*9eefe2a2SStefan Roese * superblock compressor, %1 - override and use compressor 1363*9eefe2a2SStefan Roese * specified in @compr_type) 1364*9eefe2a2SStefan Roese * @compr_type: compressor type to override the superblock compressor with 1365*9eefe2a2SStefan Roese * (%UBIFS_COMPR_NONE, etc) 1366*9eefe2a2SStefan Roese */ 1367*9eefe2a2SStefan Roese struct ubifs_mount_opts { 1368*9eefe2a2SStefan Roese unsigned int unmount_mode:2; 1369*9eefe2a2SStefan Roese unsigned int bulk_read:2; 1370*9eefe2a2SStefan Roese unsigned int chk_data_crc:2; 1371*9eefe2a2SStefan Roese unsigned int override_compr:1; 1372*9eefe2a2SStefan Roese unsigned int compr_type:2; 1373*9eefe2a2SStefan Roese }; 1374*9eefe2a2SStefan Roese 1375*9eefe2a2SStefan Roese struct ubifs_debug_info; 1376*9eefe2a2SStefan Roese 1377*9eefe2a2SStefan Roese /** 1378*9eefe2a2SStefan Roese * struct ubifs_info - UBIFS file-system description data structure 1379*9eefe2a2SStefan Roese * (per-superblock). 1380*9eefe2a2SStefan Roese * @vfs_sb: VFS @struct super_block object 1381*9eefe2a2SStefan Roese * @bdi: backing device info object to make VFS happy and disable read-ahead 1382*9eefe2a2SStefan Roese * 1383*9eefe2a2SStefan Roese * @highest_inum: highest used inode number 1384*9eefe2a2SStefan Roese * @max_sqnum: current global sequence number 1385*9eefe2a2SStefan Roese * @cmt_no: commit number of the last successfully completed commit, protected 1386*9eefe2a2SStefan Roese * by @commit_sem 1387*9eefe2a2SStefan Roese * @cnt_lock: protects @highest_inum and @max_sqnum counters 1388*9eefe2a2SStefan Roese * @fmt_version: UBIFS on-flash format version 1389*9eefe2a2SStefan Roese * @uuid: UUID from super block 1390*9eefe2a2SStefan Roese * 1391*9eefe2a2SStefan Roese * @lhead_lnum: log head logical eraseblock number 1392*9eefe2a2SStefan Roese * @lhead_offs: log head offset 1393*9eefe2a2SStefan Roese * @ltail_lnum: log tail logical eraseblock number (offset is always 0) 1394*9eefe2a2SStefan Roese * @log_mutex: protects the log, @lhead_lnum, @lhead_offs, @ltail_lnum, and 1395*9eefe2a2SStefan Roese * @bud_bytes 1396*9eefe2a2SStefan Roese * @min_log_bytes: minimum required number of bytes in the log 1397*9eefe2a2SStefan Roese * @cmt_bud_bytes: used during commit to temporarily amount of bytes in 1398*9eefe2a2SStefan Roese * committed buds 1399*9eefe2a2SStefan Roese * 1400*9eefe2a2SStefan Roese * @buds: tree of all buds indexed by bud LEB number 1401*9eefe2a2SStefan Roese * @bud_bytes: how many bytes of flash is used by buds 1402*9eefe2a2SStefan Roese * @buds_lock: protects the @buds tree, @bud_bytes, and per-journal head bud 1403*9eefe2a2SStefan Roese * lists 1404*9eefe2a2SStefan Roese * @jhead_cnt: count of journal heads 1405*9eefe2a2SStefan Roese * @jheads: journal heads (head zero is base head) 1406*9eefe2a2SStefan Roese * @max_bud_bytes: maximum number of bytes allowed in buds 1407*9eefe2a2SStefan Roese * @bg_bud_bytes: number of bud bytes when background commit is initiated 1408*9eefe2a2SStefan Roese * @old_buds: buds to be released after commit ends 1409*9eefe2a2SStefan Roese * @max_bud_cnt: maximum number of buds 1410*9eefe2a2SStefan Roese * 1411*9eefe2a2SStefan Roese * @commit_sem: synchronizes committer with other processes 1412*9eefe2a2SStefan Roese * @cmt_state: commit state 1413*9eefe2a2SStefan Roese * @cs_lock: commit state lock 1414*9eefe2a2SStefan Roese * @cmt_wq: wait queue to sleep on if the log is full and a commit is running 1415*9eefe2a2SStefan Roese * 1416*9eefe2a2SStefan Roese * @big_lpt: flag that LPT is too big to write whole during commit 1417*9eefe2a2SStefan Roese * @no_chk_data_crc: do not check CRCs when reading data nodes (except during 1418*9eefe2a2SStefan Roese * recovery) 1419*9eefe2a2SStefan Roese * @bulk_read: enable bulk-reads 1420*9eefe2a2SStefan Roese * @default_compr: default compression algorithm (%UBIFS_COMPR_LZO, etc) 1421*9eefe2a2SStefan Roese * 1422*9eefe2a2SStefan Roese * @tnc_mutex: protects the Tree Node Cache (TNC), @zroot, @cnext, @enext, and 1423*9eefe2a2SStefan Roese * @calc_idx_sz 1424*9eefe2a2SStefan Roese * @zroot: zbranch which points to the root index node and znode 1425*9eefe2a2SStefan Roese * @cnext: next znode to commit 1426*9eefe2a2SStefan Roese * @enext: next znode to commit to empty space 1427*9eefe2a2SStefan Roese * @gap_lebs: array of LEBs used by the in-gaps commit method 1428*9eefe2a2SStefan Roese * @cbuf: commit buffer 1429*9eefe2a2SStefan Roese * @ileb_buf: buffer for commit in-the-gaps method 1430*9eefe2a2SStefan Roese * @ileb_len: length of data in ileb_buf 1431*9eefe2a2SStefan Roese * @ihead_lnum: LEB number of index head 1432*9eefe2a2SStefan Roese * @ihead_offs: offset of index head 1433*9eefe2a2SStefan Roese * @ilebs: pre-allocated index LEBs 1434*9eefe2a2SStefan Roese * @ileb_cnt: number of pre-allocated index LEBs 1435*9eefe2a2SStefan Roese * @ileb_nxt: next pre-allocated index LEBs 1436*9eefe2a2SStefan Roese * @old_idx: tree of index nodes obsoleted since the last commit start 1437*9eefe2a2SStefan Roese * @bottom_up_buf: a buffer which is used by 'dirty_cow_bottom_up()' in tnc.c 1438*9eefe2a2SStefan Roese * 1439*9eefe2a2SStefan Roese * @mst_node: master node 1440*9eefe2a2SStefan Roese * @mst_offs: offset of valid master node 1441*9eefe2a2SStefan Roese * @mst_mutex: protects the master node area, @mst_node, and @mst_offs 1442*9eefe2a2SStefan Roese * 1443*9eefe2a2SStefan Roese * @max_bu_buf_len: maximum bulk-read buffer length 1444*9eefe2a2SStefan Roese * @bu_mutex: protects the pre-allocated bulk-read buffer and @c->bu 1445*9eefe2a2SStefan Roese * @bu: pre-allocated bulk-read information 1446*9eefe2a2SStefan Roese * 1447*9eefe2a2SStefan Roese * @log_lebs: number of logical eraseblocks in the log 1448*9eefe2a2SStefan Roese * @log_bytes: log size in bytes 1449*9eefe2a2SStefan Roese * @log_last: last LEB of the log 1450*9eefe2a2SStefan Roese * @lpt_lebs: number of LEBs used for lprops table 1451*9eefe2a2SStefan Roese * @lpt_first: first LEB of the lprops table area 1452*9eefe2a2SStefan Roese * @lpt_last: last LEB of the lprops table area 1453*9eefe2a2SStefan Roese * @orph_lebs: number of LEBs used for the orphan area 1454*9eefe2a2SStefan Roese * @orph_first: first LEB of the orphan area 1455*9eefe2a2SStefan Roese * @orph_last: last LEB of the orphan area 1456*9eefe2a2SStefan Roese * @main_lebs: count of LEBs in the main area 1457*9eefe2a2SStefan Roese * @main_first: first LEB of the main area 1458*9eefe2a2SStefan Roese * @main_bytes: main area size in bytes 1459*9eefe2a2SStefan Roese * 1460*9eefe2a2SStefan Roese * @key_hash_type: type of the key hash 1461*9eefe2a2SStefan Roese * @key_hash: direntry key hash function 1462*9eefe2a2SStefan Roese * @key_fmt: key format 1463*9eefe2a2SStefan Roese * @key_len: key length 1464*9eefe2a2SStefan Roese * @fanout: fanout of the index tree (number of links per indexing node) 1465*9eefe2a2SStefan Roese * 1466*9eefe2a2SStefan Roese * @min_io_size: minimal input/output unit size 1467*9eefe2a2SStefan Roese * @min_io_shift: number of bits in @min_io_size minus one 1468*9eefe2a2SStefan Roese * @leb_size: logical eraseblock size in bytes 1469*9eefe2a2SStefan Roese * @half_leb_size: half LEB size 1470*9eefe2a2SStefan Roese * @leb_cnt: count of logical eraseblocks 1471*9eefe2a2SStefan Roese * @max_leb_cnt: maximum count of logical eraseblocks 1472*9eefe2a2SStefan Roese * @old_leb_cnt: count of logical eraseblocks before re-size 1473*9eefe2a2SStefan Roese * @ro_media: the underlying UBI volume is read-only 1474*9eefe2a2SStefan Roese * 1475*9eefe2a2SStefan Roese * @dirty_pg_cnt: number of dirty pages (not used) 1476*9eefe2a2SStefan Roese * @dirty_zn_cnt: number of dirty znodes 1477*9eefe2a2SStefan Roese * @clean_zn_cnt: number of clean znodes 1478*9eefe2a2SStefan Roese * 1479*9eefe2a2SStefan Roese * @budg_idx_growth: amount of bytes budgeted for index growth 1480*9eefe2a2SStefan Roese * @budg_data_growth: amount of bytes budgeted for cached data 1481*9eefe2a2SStefan Roese * @budg_dd_growth: amount of bytes budgeted for cached data that will make 1482*9eefe2a2SStefan Roese * other data dirty 1483*9eefe2a2SStefan Roese * @budg_uncommitted_idx: amount of bytes were budgeted for growth of the index, 1484*9eefe2a2SStefan Roese * but which still have to be taken into account because 1485*9eefe2a2SStefan Roese * the index has not been committed so far 1486*9eefe2a2SStefan Roese * @space_lock: protects @budg_idx_growth, @budg_data_growth, @budg_dd_growth, 1487*9eefe2a2SStefan Roese * @budg_uncommited_idx, @min_idx_lebs, @old_idx_sz, @lst, 1488*9eefe2a2SStefan Roese * @nospace, and @nospace_rp; 1489*9eefe2a2SStefan Roese * @min_idx_lebs: minimum number of LEBs required for the index 1490*9eefe2a2SStefan Roese * @old_idx_sz: size of index on flash 1491*9eefe2a2SStefan Roese * @calc_idx_sz: temporary variable which is used to calculate new index size 1492*9eefe2a2SStefan Roese * (contains accurate new index size at end of TNC commit start) 1493*9eefe2a2SStefan Roese * @lst: lprops statistics 1494*9eefe2a2SStefan Roese * @nospace: non-zero if the file-system does not have flash space (used as 1495*9eefe2a2SStefan Roese * optimization) 1496*9eefe2a2SStefan Roese * @nospace_rp: the same as @nospace, but additionally means that even reserved 1497*9eefe2a2SStefan Roese * pool is full 1498*9eefe2a2SStefan Roese * 1499*9eefe2a2SStefan Roese * @page_budget: budget for a page 1500*9eefe2a2SStefan Roese * @inode_budget: budget for an inode 1501*9eefe2a2SStefan Roese * @dent_budget: budget for a directory entry 1502*9eefe2a2SStefan Roese * 1503*9eefe2a2SStefan Roese * @ref_node_alsz: size of the LEB reference node aligned to the min. flash 1504*9eefe2a2SStefan Roese * I/O unit 1505*9eefe2a2SStefan Roese * @mst_node_alsz: master node aligned size 1506*9eefe2a2SStefan Roese * @min_idx_node_sz: minimum indexing node aligned on 8-bytes boundary 1507*9eefe2a2SStefan Roese * @max_idx_node_sz: maximum indexing node aligned on 8-bytes boundary 1508*9eefe2a2SStefan Roese * @max_inode_sz: maximum possible inode size in bytes 1509*9eefe2a2SStefan Roese * @max_znode_sz: size of znode in bytes 1510*9eefe2a2SStefan Roese * 1511*9eefe2a2SStefan Roese * @leb_overhead: how many bytes are wasted in an LEB when it is filled with 1512*9eefe2a2SStefan Roese * data nodes of maximum size - used in free space reporting 1513*9eefe2a2SStefan Roese * @dead_wm: LEB dead space watermark 1514*9eefe2a2SStefan Roese * @dark_wm: LEB dark space watermark 1515*9eefe2a2SStefan Roese * @block_cnt: count of 4KiB blocks on the FS 1516*9eefe2a2SStefan Roese * 1517*9eefe2a2SStefan Roese * @ranges: UBIFS node length ranges 1518*9eefe2a2SStefan Roese * @ubi: UBI volume descriptor 1519*9eefe2a2SStefan Roese * @di: UBI device information 1520*9eefe2a2SStefan Roese * @vi: UBI volume information 1521*9eefe2a2SStefan Roese * 1522*9eefe2a2SStefan Roese * @orph_tree: rb-tree of orphan inode numbers 1523*9eefe2a2SStefan Roese * @orph_list: list of orphan inode numbers in order added 1524*9eefe2a2SStefan Roese * @orph_new: list of orphan inode numbers added since last commit 1525*9eefe2a2SStefan Roese * @orph_cnext: next orphan to commit 1526*9eefe2a2SStefan Roese * @orph_dnext: next orphan to delete 1527*9eefe2a2SStefan Roese * @orphan_lock: lock for orph_tree and orph_new 1528*9eefe2a2SStefan Roese * @orph_buf: buffer for orphan nodes 1529*9eefe2a2SStefan Roese * @new_orphans: number of orphans since last commit 1530*9eefe2a2SStefan Roese * @cmt_orphans: number of orphans being committed 1531*9eefe2a2SStefan Roese * @tot_orphans: number of orphans in the rb_tree 1532*9eefe2a2SStefan Roese * @max_orphans: maximum number of orphans allowed 1533*9eefe2a2SStefan Roese * @ohead_lnum: orphan head LEB number 1534*9eefe2a2SStefan Roese * @ohead_offs: orphan head offset 1535*9eefe2a2SStefan Roese * @no_orphs: non-zero if there are no orphans 1536*9eefe2a2SStefan Roese * 1537*9eefe2a2SStefan Roese * @bgt: UBIFS background thread 1538*9eefe2a2SStefan Roese * @bgt_name: background thread name 1539*9eefe2a2SStefan Roese * @need_bgt: if background thread should run 1540*9eefe2a2SStefan Roese * @need_wbuf_sync: if write-buffers have to be synchronized 1541*9eefe2a2SStefan Roese * 1542*9eefe2a2SStefan Roese * @gc_lnum: LEB number used for garbage collection 1543*9eefe2a2SStefan Roese * @sbuf: a buffer of LEB size used by GC and replay for scanning 1544*9eefe2a2SStefan Roese * @idx_gc: list of index LEBs that have been garbage collected 1545*9eefe2a2SStefan Roese * @idx_gc_cnt: number of elements on the idx_gc list 1546*9eefe2a2SStefan Roese * @gc_seq: incremented for every non-index LEB garbage collected 1547*9eefe2a2SStefan Roese * @gced_lnum: last non-index LEB that was garbage collected 1548*9eefe2a2SStefan Roese * 1549*9eefe2a2SStefan Roese * @infos_list: links all 'ubifs_info' objects 1550*9eefe2a2SStefan Roese * @umount_mutex: serializes shrinker and un-mount 1551*9eefe2a2SStefan Roese * @shrinker_run_no: shrinker run number 1552*9eefe2a2SStefan Roese * 1553*9eefe2a2SStefan Roese * @space_bits: number of bits needed to record free or dirty space 1554*9eefe2a2SStefan Roese * @lpt_lnum_bits: number of bits needed to record a LEB number in the LPT 1555*9eefe2a2SStefan Roese * @lpt_offs_bits: number of bits needed to record an offset in the LPT 1556*9eefe2a2SStefan Roese * @lpt_spc_bits: number of bits needed to space in the LPT 1557*9eefe2a2SStefan Roese * @pcnt_bits: number of bits needed to record pnode or nnode number 1558*9eefe2a2SStefan Roese * @lnum_bits: number of bits needed to record LEB number 1559*9eefe2a2SStefan Roese * @nnode_sz: size of on-flash nnode 1560*9eefe2a2SStefan Roese * @pnode_sz: size of on-flash pnode 1561*9eefe2a2SStefan Roese * @ltab_sz: size of on-flash LPT lprops table 1562*9eefe2a2SStefan Roese * @lsave_sz: size of on-flash LPT save table 1563*9eefe2a2SStefan Roese * @pnode_cnt: number of pnodes 1564*9eefe2a2SStefan Roese * @nnode_cnt: number of nnodes 1565*9eefe2a2SStefan Roese * @lpt_hght: height of the LPT 1566*9eefe2a2SStefan Roese * @pnodes_have: number of pnodes in memory 1567*9eefe2a2SStefan Roese * 1568*9eefe2a2SStefan Roese * @lp_mutex: protects lprops table and all the other lprops-related fields 1569*9eefe2a2SStefan Roese * @lpt_lnum: LEB number of the root nnode of the LPT 1570*9eefe2a2SStefan Roese * @lpt_offs: offset of the root nnode of the LPT 1571*9eefe2a2SStefan Roese * @nhead_lnum: LEB number of LPT head 1572*9eefe2a2SStefan Roese * @nhead_offs: offset of LPT head 1573*9eefe2a2SStefan Roese * @lpt_drty_flgs: dirty flags for LPT special nodes e.g. ltab 1574*9eefe2a2SStefan Roese * @dirty_nn_cnt: number of dirty nnodes 1575*9eefe2a2SStefan Roese * @dirty_pn_cnt: number of dirty pnodes 1576*9eefe2a2SStefan Roese * @check_lpt_free: flag that indicates LPT GC may be needed 1577*9eefe2a2SStefan Roese * @lpt_sz: LPT size 1578*9eefe2a2SStefan Roese * @lpt_nod_buf: buffer for an on-flash nnode or pnode 1579*9eefe2a2SStefan Roese * @lpt_buf: buffer of LEB size used by LPT 1580*9eefe2a2SStefan Roese * @nroot: address in memory of the root nnode of the LPT 1581*9eefe2a2SStefan Roese * @lpt_cnext: next LPT node to commit 1582*9eefe2a2SStefan Roese * @lpt_heap: array of heaps of categorized lprops 1583*9eefe2a2SStefan Roese * @dirty_idx: a (reverse sorted) copy of the LPROPS_DIRTY_IDX heap as at 1584*9eefe2a2SStefan Roese * previous commit start 1585*9eefe2a2SStefan Roese * @uncat_list: list of un-categorized LEBs 1586*9eefe2a2SStefan Roese * @empty_list: list of empty LEBs 1587*9eefe2a2SStefan Roese * @freeable_list: list of freeable non-index LEBs (free + dirty == leb_size) 1588*9eefe2a2SStefan Roese * @frdi_idx_list: list of freeable index LEBs (free + dirty == leb_size) 1589*9eefe2a2SStefan Roese * @freeable_cnt: number of freeable LEBs in @freeable_list 1590*9eefe2a2SStefan Roese * 1591*9eefe2a2SStefan Roese * @ltab_lnum: LEB number of LPT's own lprops table 1592*9eefe2a2SStefan Roese * @ltab_offs: offset of LPT's own lprops table 1593*9eefe2a2SStefan Roese * @ltab: LPT's own lprops table 1594*9eefe2a2SStefan Roese * @ltab_cmt: LPT's own lprops table (commit copy) 1595*9eefe2a2SStefan Roese * @lsave_cnt: number of LEB numbers in LPT's save table 1596*9eefe2a2SStefan Roese * @lsave_lnum: LEB number of LPT's save table 1597*9eefe2a2SStefan Roese * @lsave_offs: offset of LPT's save table 1598*9eefe2a2SStefan Roese * @lsave: LPT's save table 1599*9eefe2a2SStefan Roese * @lscan_lnum: LEB number of last LPT scan 1600*9eefe2a2SStefan Roese * 1601*9eefe2a2SStefan Roese * @rp_size: size of the reserved pool in bytes 1602*9eefe2a2SStefan Roese * @report_rp_size: size of the reserved pool reported to user-space 1603*9eefe2a2SStefan Roese * @rp_uid: reserved pool user ID 1604*9eefe2a2SStefan Roese * @rp_gid: reserved pool group ID 1605*9eefe2a2SStefan Roese * 1606*9eefe2a2SStefan Roese * @empty: if the UBI device is empty 1607*9eefe2a2SStefan Roese * @replay_tree: temporary tree used during journal replay 1608*9eefe2a2SStefan Roese * @replay_list: temporary list used during journal replay 1609*9eefe2a2SStefan Roese * @replay_buds: list of buds to replay 1610*9eefe2a2SStefan Roese * @cs_sqnum: sequence number of first node in the log (commit start node) 1611*9eefe2a2SStefan Roese * @replay_sqnum: sequence number of node currently being replayed 1612*9eefe2a2SStefan Roese * @need_recovery: file-system needs recovery 1613*9eefe2a2SStefan Roese * @replaying: set to %1 during journal replay 1614*9eefe2a2SStefan Roese * @unclean_leb_list: LEBs to recover when mounting ro to rw 1615*9eefe2a2SStefan Roese * @rcvrd_mst_node: recovered master node to write when mounting ro to rw 1616*9eefe2a2SStefan Roese * @size_tree: inode size information for recovery 1617*9eefe2a2SStefan Roese * @remounting_rw: set while remounting from ro to rw (sb flags have MS_RDONLY) 1618*9eefe2a2SStefan Roese * @always_chk_crc: always check CRCs (while mounting and remounting rw) 1619*9eefe2a2SStefan Roese * @mount_opts: UBIFS-specific mount options 1620*9eefe2a2SStefan Roese * 1621*9eefe2a2SStefan Roese * @dbg: debugging-related information 1622*9eefe2a2SStefan Roese */ 1623*9eefe2a2SStefan Roese struct ubifs_info { 1624*9eefe2a2SStefan Roese struct super_block *vfs_sb; 1625*9eefe2a2SStefan Roese 1626*9eefe2a2SStefan Roese ino_t highest_inum; 1627*9eefe2a2SStefan Roese unsigned long long max_sqnum; 1628*9eefe2a2SStefan Roese unsigned long long cmt_no; 1629*9eefe2a2SStefan Roese spinlock_t cnt_lock; 1630*9eefe2a2SStefan Roese int fmt_version; 1631*9eefe2a2SStefan Roese unsigned char uuid[16]; 1632*9eefe2a2SStefan Roese 1633*9eefe2a2SStefan Roese int lhead_lnum; 1634*9eefe2a2SStefan Roese int lhead_offs; 1635*9eefe2a2SStefan Roese int ltail_lnum; 1636*9eefe2a2SStefan Roese struct mutex log_mutex; 1637*9eefe2a2SStefan Roese int min_log_bytes; 1638*9eefe2a2SStefan Roese long long cmt_bud_bytes; 1639*9eefe2a2SStefan Roese 1640*9eefe2a2SStefan Roese struct rb_root buds; 1641*9eefe2a2SStefan Roese long long bud_bytes; 1642*9eefe2a2SStefan Roese spinlock_t buds_lock; 1643*9eefe2a2SStefan Roese int jhead_cnt; 1644*9eefe2a2SStefan Roese struct ubifs_jhead *jheads; 1645*9eefe2a2SStefan Roese long long max_bud_bytes; 1646*9eefe2a2SStefan Roese long long bg_bud_bytes; 1647*9eefe2a2SStefan Roese struct list_head old_buds; 1648*9eefe2a2SStefan Roese int max_bud_cnt; 1649*9eefe2a2SStefan Roese 1650*9eefe2a2SStefan Roese struct rw_semaphore commit_sem; 1651*9eefe2a2SStefan Roese int cmt_state; 1652*9eefe2a2SStefan Roese spinlock_t cs_lock; 1653*9eefe2a2SStefan Roese wait_queue_head_t cmt_wq; 1654*9eefe2a2SStefan Roese 1655*9eefe2a2SStefan Roese unsigned int big_lpt:1; 1656*9eefe2a2SStefan Roese unsigned int no_chk_data_crc:1; 1657*9eefe2a2SStefan Roese unsigned int bulk_read:1; 1658*9eefe2a2SStefan Roese unsigned int default_compr:2; 1659*9eefe2a2SStefan Roese 1660*9eefe2a2SStefan Roese struct mutex tnc_mutex; 1661*9eefe2a2SStefan Roese struct ubifs_zbranch zroot; 1662*9eefe2a2SStefan Roese struct ubifs_znode *cnext; 1663*9eefe2a2SStefan Roese struct ubifs_znode *enext; 1664*9eefe2a2SStefan Roese int *gap_lebs; 1665*9eefe2a2SStefan Roese void *cbuf; 1666*9eefe2a2SStefan Roese void *ileb_buf; 1667*9eefe2a2SStefan Roese int ileb_len; 1668*9eefe2a2SStefan Roese int ihead_lnum; 1669*9eefe2a2SStefan Roese int ihead_offs; 1670*9eefe2a2SStefan Roese int *ilebs; 1671*9eefe2a2SStefan Roese int ileb_cnt; 1672*9eefe2a2SStefan Roese int ileb_nxt; 1673*9eefe2a2SStefan Roese struct rb_root old_idx; 1674*9eefe2a2SStefan Roese int *bottom_up_buf; 1675*9eefe2a2SStefan Roese 1676*9eefe2a2SStefan Roese struct ubifs_mst_node *mst_node; 1677*9eefe2a2SStefan Roese int mst_offs; 1678*9eefe2a2SStefan Roese struct mutex mst_mutex; 1679*9eefe2a2SStefan Roese 1680*9eefe2a2SStefan Roese int max_bu_buf_len; 1681*9eefe2a2SStefan Roese struct mutex bu_mutex; 1682*9eefe2a2SStefan Roese struct bu_info bu; 1683*9eefe2a2SStefan Roese 1684*9eefe2a2SStefan Roese int log_lebs; 1685*9eefe2a2SStefan Roese long long log_bytes; 1686*9eefe2a2SStefan Roese int log_last; 1687*9eefe2a2SStefan Roese int lpt_lebs; 1688*9eefe2a2SStefan Roese int lpt_first; 1689*9eefe2a2SStefan Roese int lpt_last; 1690*9eefe2a2SStefan Roese int orph_lebs; 1691*9eefe2a2SStefan Roese int orph_first; 1692*9eefe2a2SStefan Roese int orph_last; 1693*9eefe2a2SStefan Roese int main_lebs; 1694*9eefe2a2SStefan Roese int main_first; 1695*9eefe2a2SStefan Roese long long main_bytes; 1696*9eefe2a2SStefan Roese 1697*9eefe2a2SStefan Roese uint8_t key_hash_type; 1698*9eefe2a2SStefan Roese uint32_t (*key_hash)(const char *str, int len); 1699*9eefe2a2SStefan Roese int key_fmt; 1700*9eefe2a2SStefan Roese int key_len; 1701*9eefe2a2SStefan Roese int fanout; 1702*9eefe2a2SStefan Roese 1703*9eefe2a2SStefan Roese int min_io_size; 1704*9eefe2a2SStefan Roese int min_io_shift; 1705*9eefe2a2SStefan Roese int leb_size; 1706*9eefe2a2SStefan Roese int half_leb_size; 1707*9eefe2a2SStefan Roese int leb_cnt; 1708*9eefe2a2SStefan Roese int max_leb_cnt; 1709*9eefe2a2SStefan Roese int old_leb_cnt; 1710*9eefe2a2SStefan Roese int ro_media; 1711*9eefe2a2SStefan Roese 1712*9eefe2a2SStefan Roese long long budg_idx_growth; 1713*9eefe2a2SStefan Roese long long budg_data_growth; 1714*9eefe2a2SStefan Roese long long budg_dd_growth; 1715*9eefe2a2SStefan Roese long long budg_uncommitted_idx; 1716*9eefe2a2SStefan Roese spinlock_t space_lock; 1717*9eefe2a2SStefan Roese int min_idx_lebs; 1718*9eefe2a2SStefan Roese unsigned long long old_idx_sz; 1719*9eefe2a2SStefan Roese unsigned long long calc_idx_sz; 1720*9eefe2a2SStefan Roese struct ubifs_lp_stats lst; 1721*9eefe2a2SStefan Roese unsigned int nospace:1; 1722*9eefe2a2SStefan Roese unsigned int nospace_rp:1; 1723*9eefe2a2SStefan Roese 1724*9eefe2a2SStefan Roese int page_budget; 1725*9eefe2a2SStefan Roese int inode_budget; 1726*9eefe2a2SStefan Roese int dent_budget; 1727*9eefe2a2SStefan Roese 1728*9eefe2a2SStefan Roese int ref_node_alsz; 1729*9eefe2a2SStefan Roese int mst_node_alsz; 1730*9eefe2a2SStefan Roese int min_idx_node_sz; 1731*9eefe2a2SStefan Roese int max_idx_node_sz; 1732*9eefe2a2SStefan Roese long long max_inode_sz; 1733*9eefe2a2SStefan Roese int max_znode_sz; 1734*9eefe2a2SStefan Roese 1735*9eefe2a2SStefan Roese int leb_overhead; 1736*9eefe2a2SStefan Roese int dead_wm; 1737*9eefe2a2SStefan Roese int dark_wm; 1738*9eefe2a2SStefan Roese int block_cnt; 1739*9eefe2a2SStefan Roese 1740*9eefe2a2SStefan Roese struct ubifs_node_range ranges[UBIFS_NODE_TYPES_CNT]; 1741*9eefe2a2SStefan Roese struct ubi_volume_desc *ubi; 1742*9eefe2a2SStefan Roese struct ubi_device_info di; 1743*9eefe2a2SStefan Roese struct ubi_volume_info vi; 1744*9eefe2a2SStefan Roese 1745*9eefe2a2SStefan Roese struct rb_root orph_tree; 1746*9eefe2a2SStefan Roese struct list_head orph_list; 1747*9eefe2a2SStefan Roese struct list_head orph_new; 1748*9eefe2a2SStefan Roese struct ubifs_orphan *orph_cnext; 1749*9eefe2a2SStefan Roese struct ubifs_orphan *orph_dnext; 1750*9eefe2a2SStefan Roese spinlock_t orphan_lock; 1751*9eefe2a2SStefan Roese void *orph_buf; 1752*9eefe2a2SStefan Roese int new_orphans; 1753*9eefe2a2SStefan Roese int cmt_orphans; 1754*9eefe2a2SStefan Roese int tot_orphans; 1755*9eefe2a2SStefan Roese int max_orphans; 1756*9eefe2a2SStefan Roese int ohead_lnum; 1757*9eefe2a2SStefan Roese int ohead_offs; 1758*9eefe2a2SStefan Roese int no_orphs; 1759*9eefe2a2SStefan Roese 1760*9eefe2a2SStefan Roese struct task_struct *bgt; 1761*9eefe2a2SStefan Roese char bgt_name[sizeof(BGT_NAME_PATTERN) + 9]; 1762*9eefe2a2SStefan Roese int need_bgt; 1763*9eefe2a2SStefan Roese int need_wbuf_sync; 1764*9eefe2a2SStefan Roese 1765*9eefe2a2SStefan Roese int gc_lnum; 1766*9eefe2a2SStefan Roese void *sbuf; 1767*9eefe2a2SStefan Roese struct list_head idx_gc; 1768*9eefe2a2SStefan Roese int idx_gc_cnt; 1769*9eefe2a2SStefan Roese int gc_seq; 1770*9eefe2a2SStefan Roese int gced_lnum; 1771*9eefe2a2SStefan Roese 1772*9eefe2a2SStefan Roese struct list_head infos_list; 1773*9eefe2a2SStefan Roese struct mutex umount_mutex; 1774*9eefe2a2SStefan Roese unsigned int shrinker_run_no; 1775*9eefe2a2SStefan Roese 1776*9eefe2a2SStefan Roese int space_bits; 1777*9eefe2a2SStefan Roese int lpt_lnum_bits; 1778*9eefe2a2SStefan Roese int lpt_offs_bits; 1779*9eefe2a2SStefan Roese int lpt_spc_bits; 1780*9eefe2a2SStefan Roese int pcnt_bits; 1781*9eefe2a2SStefan Roese int lnum_bits; 1782*9eefe2a2SStefan Roese int nnode_sz; 1783*9eefe2a2SStefan Roese int pnode_sz; 1784*9eefe2a2SStefan Roese int ltab_sz; 1785*9eefe2a2SStefan Roese int lsave_sz; 1786*9eefe2a2SStefan Roese int pnode_cnt; 1787*9eefe2a2SStefan Roese int nnode_cnt; 1788*9eefe2a2SStefan Roese int lpt_hght; 1789*9eefe2a2SStefan Roese int pnodes_have; 1790*9eefe2a2SStefan Roese 1791*9eefe2a2SStefan Roese struct mutex lp_mutex; 1792*9eefe2a2SStefan Roese int lpt_lnum; 1793*9eefe2a2SStefan Roese int lpt_offs; 1794*9eefe2a2SStefan Roese int nhead_lnum; 1795*9eefe2a2SStefan Roese int nhead_offs; 1796*9eefe2a2SStefan Roese int lpt_drty_flgs; 1797*9eefe2a2SStefan Roese int dirty_nn_cnt; 1798*9eefe2a2SStefan Roese int dirty_pn_cnt; 1799*9eefe2a2SStefan Roese int check_lpt_free; 1800*9eefe2a2SStefan Roese long long lpt_sz; 1801*9eefe2a2SStefan Roese void *lpt_nod_buf; 1802*9eefe2a2SStefan Roese void *lpt_buf; 1803*9eefe2a2SStefan Roese struct ubifs_nnode *nroot; 1804*9eefe2a2SStefan Roese struct ubifs_cnode *lpt_cnext; 1805*9eefe2a2SStefan Roese struct ubifs_lpt_heap lpt_heap[LPROPS_HEAP_CNT]; 1806*9eefe2a2SStefan Roese struct ubifs_lpt_heap dirty_idx; 1807*9eefe2a2SStefan Roese struct list_head uncat_list; 1808*9eefe2a2SStefan Roese struct list_head empty_list; 1809*9eefe2a2SStefan Roese struct list_head freeable_list; 1810*9eefe2a2SStefan Roese struct list_head frdi_idx_list; 1811*9eefe2a2SStefan Roese int freeable_cnt; 1812*9eefe2a2SStefan Roese 1813*9eefe2a2SStefan Roese int ltab_lnum; 1814*9eefe2a2SStefan Roese int ltab_offs; 1815*9eefe2a2SStefan Roese struct ubifs_lpt_lprops *ltab; 1816*9eefe2a2SStefan Roese struct ubifs_lpt_lprops *ltab_cmt; 1817*9eefe2a2SStefan Roese int lsave_cnt; 1818*9eefe2a2SStefan Roese int lsave_lnum; 1819*9eefe2a2SStefan Roese int lsave_offs; 1820*9eefe2a2SStefan Roese int *lsave; 1821*9eefe2a2SStefan Roese int lscan_lnum; 1822*9eefe2a2SStefan Roese 1823*9eefe2a2SStefan Roese long long rp_size; 1824*9eefe2a2SStefan Roese long long report_rp_size; 1825*9eefe2a2SStefan Roese uid_t rp_uid; 1826*9eefe2a2SStefan Roese gid_t rp_gid; 1827*9eefe2a2SStefan Roese 1828*9eefe2a2SStefan Roese /* The below fields are used only during mounting and re-mounting */ 1829*9eefe2a2SStefan Roese int empty; 1830*9eefe2a2SStefan Roese struct rb_root replay_tree; 1831*9eefe2a2SStefan Roese struct list_head replay_list; 1832*9eefe2a2SStefan Roese struct list_head replay_buds; 1833*9eefe2a2SStefan Roese unsigned long long cs_sqnum; 1834*9eefe2a2SStefan Roese unsigned long long replay_sqnum; 1835*9eefe2a2SStefan Roese int need_recovery; 1836*9eefe2a2SStefan Roese int replaying; 1837*9eefe2a2SStefan Roese struct list_head unclean_leb_list; 1838*9eefe2a2SStefan Roese struct ubifs_mst_node *rcvrd_mst_node; 1839*9eefe2a2SStefan Roese struct rb_root size_tree; 1840*9eefe2a2SStefan Roese int remounting_rw; 1841*9eefe2a2SStefan Roese int always_chk_crc; 1842*9eefe2a2SStefan Roese struct ubifs_mount_opts mount_opts; 1843*9eefe2a2SStefan Roese 1844*9eefe2a2SStefan Roese #ifdef CONFIG_UBIFS_FS_DEBUG 1845*9eefe2a2SStefan Roese struct ubifs_debug_info *dbg; 1846*9eefe2a2SStefan Roese #endif 1847*9eefe2a2SStefan Roese }; 1848*9eefe2a2SStefan Roese 1849*9eefe2a2SStefan Roese extern spinlock_t ubifs_infos_lock; 1850*9eefe2a2SStefan Roese extern struct kmem_cache *ubifs_inode_slab; 1851*9eefe2a2SStefan Roese extern const struct super_operations ubifs_super_operations; 1852*9eefe2a2SStefan Roese extern const struct address_space_operations ubifs_file_address_operations; 1853*9eefe2a2SStefan Roese extern const struct file_operations ubifs_file_operations; 1854*9eefe2a2SStefan Roese extern const struct inode_operations ubifs_file_inode_operations; 1855*9eefe2a2SStefan Roese extern const struct file_operations ubifs_dir_operations; 1856*9eefe2a2SStefan Roese extern const struct inode_operations ubifs_dir_inode_operations; 1857*9eefe2a2SStefan Roese extern const struct inode_operations ubifs_symlink_inode_operations; 1858*9eefe2a2SStefan Roese extern struct backing_dev_info ubifs_backing_dev_info; 1859*9eefe2a2SStefan Roese extern struct ubifs_compressor *ubifs_compressors[UBIFS_COMPR_TYPES_CNT]; 1860*9eefe2a2SStefan Roese 1861*9eefe2a2SStefan Roese /* io.c */ 1862*9eefe2a2SStefan Roese void ubifs_ro_mode(struct ubifs_info *c, int err); 1863*9eefe2a2SStefan Roese int ubifs_wbuf_write_nolock(struct ubifs_wbuf *wbuf, void *buf, int len); 1864*9eefe2a2SStefan Roese int ubifs_wbuf_seek_nolock(struct ubifs_wbuf *wbuf, int lnum, int offs, 1865*9eefe2a2SStefan Roese int dtype); 1866*9eefe2a2SStefan Roese int ubifs_wbuf_init(struct ubifs_info *c, struct ubifs_wbuf *wbuf); 1867*9eefe2a2SStefan Roese int ubifs_read_node(const struct ubifs_info *c, void *buf, int type, int len, 1868*9eefe2a2SStefan Roese int lnum, int offs); 1869*9eefe2a2SStefan Roese int ubifs_read_node_wbuf(struct ubifs_wbuf *wbuf, void *buf, int type, int len, 1870*9eefe2a2SStefan Roese int lnum, int offs); 1871*9eefe2a2SStefan Roese int ubifs_write_node(struct ubifs_info *c, void *node, int len, int lnum, 1872*9eefe2a2SStefan Roese int offs, int dtype); 1873*9eefe2a2SStefan Roese int ubifs_check_node(const struct ubifs_info *c, const void *buf, int lnum, 1874*9eefe2a2SStefan Roese int offs, int quiet, int must_chk_crc); 1875*9eefe2a2SStefan Roese void ubifs_prepare_node(struct ubifs_info *c, void *buf, int len, int pad); 1876*9eefe2a2SStefan Roese void ubifs_prep_grp_node(struct ubifs_info *c, void *node, int len, int last); 1877*9eefe2a2SStefan Roese int ubifs_io_init(struct ubifs_info *c); 1878*9eefe2a2SStefan Roese void ubifs_pad(const struct ubifs_info *c, void *buf, int pad); 1879*9eefe2a2SStefan Roese int ubifs_wbuf_sync_nolock(struct ubifs_wbuf *wbuf); 1880*9eefe2a2SStefan Roese int ubifs_bg_wbufs_sync(struct ubifs_info *c); 1881*9eefe2a2SStefan Roese void ubifs_wbuf_add_ino_nolock(struct ubifs_wbuf *wbuf, ino_t inum); 1882*9eefe2a2SStefan Roese int ubifs_sync_wbufs_by_inode(struct ubifs_info *c, struct inode *inode); 1883*9eefe2a2SStefan Roese 1884*9eefe2a2SStefan Roese /* scan.c */ 1885*9eefe2a2SStefan Roese struct ubifs_scan_leb *ubifs_scan(const struct ubifs_info *c, int lnum, 1886*9eefe2a2SStefan Roese int offs, void *sbuf); 1887*9eefe2a2SStefan Roese void ubifs_scan_destroy(struct ubifs_scan_leb *sleb); 1888*9eefe2a2SStefan Roese int ubifs_scan_a_node(const struct ubifs_info *c, void *buf, int len, int lnum, 1889*9eefe2a2SStefan Roese int offs, int quiet); 1890*9eefe2a2SStefan Roese struct ubifs_scan_leb *ubifs_start_scan(const struct ubifs_info *c, int lnum, 1891*9eefe2a2SStefan Roese int offs, void *sbuf); 1892*9eefe2a2SStefan Roese void ubifs_end_scan(const struct ubifs_info *c, struct ubifs_scan_leb *sleb, 1893*9eefe2a2SStefan Roese int lnum, int offs); 1894*9eefe2a2SStefan Roese int ubifs_add_snod(const struct ubifs_info *c, struct ubifs_scan_leb *sleb, 1895*9eefe2a2SStefan Roese void *buf, int offs); 1896*9eefe2a2SStefan Roese void ubifs_scanned_corruption(const struct ubifs_info *c, int lnum, int offs, 1897*9eefe2a2SStefan Roese void *buf); 1898*9eefe2a2SStefan Roese 1899*9eefe2a2SStefan Roese /* log.c */ 1900*9eefe2a2SStefan Roese void ubifs_add_bud(struct ubifs_info *c, struct ubifs_bud *bud); 1901*9eefe2a2SStefan Roese void ubifs_create_buds_lists(struct ubifs_info *c); 1902*9eefe2a2SStefan Roese int ubifs_add_bud_to_log(struct ubifs_info *c, int jhead, int lnum, int offs); 1903*9eefe2a2SStefan Roese struct ubifs_bud *ubifs_search_bud(struct ubifs_info *c, int lnum); 1904*9eefe2a2SStefan Roese struct ubifs_wbuf *ubifs_get_wbuf(struct ubifs_info *c, int lnum); 1905*9eefe2a2SStefan Roese int ubifs_log_start_commit(struct ubifs_info *c, int *ltail_lnum); 1906*9eefe2a2SStefan Roese int ubifs_log_end_commit(struct ubifs_info *c, int new_ltail_lnum); 1907*9eefe2a2SStefan Roese int ubifs_log_post_commit(struct ubifs_info *c, int old_ltail_lnum); 1908*9eefe2a2SStefan Roese int ubifs_consolidate_log(struct ubifs_info *c); 1909*9eefe2a2SStefan Roese 1910*9eefe2a2SStefan Roese /* journal.c */ 1911*9eefe2a2SStefan Roese int ubifs_jnl_update(struct ubifs_info *c, const struct inode *dir, 1912*9eefe2a2SStefan Roese const struct qstr *nm, const struct inode *inode, 1913*9eefe2a2SStefan Roese int deletion, int xent); 1914*9eefe2a2SStefan Roese int ubifs_jnl_write_data(struct ubifs_info *c, const struct inode *inode, 1915*9eefe2a2SStefan Roese const union ubifs_key *key, const void *buf, int len); 1916*9eefe2a2SStefan Roese int ubifs_jnl_write_inode(struct ubifs_info *c, const struct inode *inode); 1917*9eefe2a2SStefan Roese int ubifs_jnl_delete_inode(struct ubifs_info *c, const struct inode *inode); 1918*9eefe2a2SStefan Roese int ubifs_jnl_rename(struct ubifs_info *c, const struct inode *old_dir, 1919*9eefe2a2SStefan Roese const struct dentry *old_dentry, 1920*9eefe2a2SStefan Roese const struct inode *new_dir, 1921*9eefe2a2SStefan Roese const struct dentry *new_dentry, int sync); 1922*9eefe2a2SStefan Roese int ubifs_jnl_truncate(struct ubifs_info *c, const struct inode *inode, 1923*9eefe2a2SStefan Roese loff_t old_size, loff_t new_size); 1924*9eefe2a2SStefan Roese int ubifs_jnl_delete_xattr(struct ubifs_info *c, const struct inode *host, 1925*9eefe2a2SStefan Roese const struct inode *inode, const struct qstr *nm); 1926*9eefe2a2SStefan Roese int ubifs_jnl_change_xattr(struct ubifs_info *c, const struct inode *inode1, 1927*9eefe2a2SStefan Roese const struct inode *inode2); 1928*9eefe2a2SStefan Roese 1929*9eefe2a2SStefan Roese /* budget.c */ 1930*9eefe2a2SStefan Roese int ubifs_budget_space(struct ubifs_info *c, struct ubifs_budget_req *req); 1931*9eefe2a2SStefan Roese void ubifs_release_budget(struct ubifs_info *c, struct ubifs_budget_req *req); 1932*9eefe2a2SStefan Roese void ubifs_release_dirty_inode_budget(struct ubifs_info *c, 1933*9eefe2a2SStefan Roese struct ubifs_inode *ui); 1934*9eefe2a2SStefan Roese int ubifs_budget_inode_op(struct ubifs_info *c, struct inode *inode, 1935*9eefe2a2SStefan Roese struct ubifs_budget_req *req); 1936*9eefe2a2SStefan Roese void ubifs_release_ino_dirty(struct ubifs_info *c, struct inode *inode, 1937*9eefe2a2SStefan Roese struct ubifs_budget_req *req); 1938*9eefe2a2SStefan Roese void ubifs_cancel_ino_op(struct ubifs_info *c, struct inode *inode, 1939*9eefe2a2SStefan Roese struct ubifs_budget_req *req); 1940*9eefe2a2SStefan Roese long long ubifs_get_free_space(struct ubifs_info *c); 1941*9eefe2a2SStefan Roese long long ubifs_get_free_space_nolock(struct ubifs_info *c); 1942*9eefe2a2SStefan Roese int ubifs_calc_min_idx_lebs(struct ubifs_info *c); 1943*9eefe2a2SStefan Roese void ubifs_convert_page_budget(struct ubifs_info *c); 1944*9eefe2a2SStefan Roese long long ubifs_reported_space(const struct ubifs_info *c, long long free); 1945*9eefe2a2SStefan Roese long long ubifs_calc_available(const struct ubifs_info *c, int min_idx_lebs); 1946*9eefe2a2SStefan Roese 1947*9eefe2a2SStefan Roese /* find.c */ 1948*9eefe2a2SStefan Roese int ubifs_find_free_space(struct ubifs_info *c, int min_space, int *free, 1949*9eefe2a2SStefan Roese int squeeze); 1950*9eefe2a2SStefan Roese int ubifs_find_free_leb_for_idx(struct ubifs_info *c); 1951*9eefe2a2SStefan Roese int ubifs_find_dirty_leb(struct ubifs_info *c, struct ubifs_lprops *ret_lp, 1952*9eefe2a2SStefan Roese int min_space, int pick_free); 1953*9eefe2a2SStefan Roese int ubifs_find_dirty_idx_leb(struct ubifs_info *c); 1954*9eefe2a2SStefan Roese int ubifs_save_dirty_idx_lnums(struct ubifs_info *c); 1955*9eefe2a2SStefan Roese 1956*9eefe2a2SStefan Roese /* tnc.c */ 1957*9eefe2a2SStefan Roese int ubifs_lookup_level0(struct ubifs_info *c, const union ubifs_key *key, 1958*9eefe2a2SStefan Roese struct ubifs_znode **zn, int *n); 1959*9eefe2a2SStefan Roese int ubifs_tnc_lookup_nm(struct ubifs_info *c, const union ubifs_key *key, 1960*9eefe2a2SStefan Roese void *node, const struct qstr *nm); 1961*9eefe2a2SStefan Roese int ubifs_tnc_locate(struct ubifs_info *c, const union ubifs_key *key, 1962*9eefe2a2SStefan Roese void *node, int *lnum, int *offs); 1963*9eefe2a2SStefan Roese int ubifs_tnc_add(struct ubifs_info *c, const union ubifs_key *key, int lnum, 1964*9eefe2a2SStefan Roese int offs, int len); 1965*9eefe2a2SStefan Roese int ubifs_tnc_replace(struct ubifs_info *c, const union ubifs_key *key, 1966*9eefe2a2SStefan Roese int old_lnum, int old_offs, int lnum, int offs, int len); 1967*9eefe2a2SStefan Roese int ubifs_tnc_add_nm(struct ubifs_info *c, const union ubifs_key *key, 1968*9eefe2a2SStefan Roese int lnum, int offs, int len, const struct qstr *nm); 1969*9eefe2a2SStefan Roese int ubifs_tnc_remove(struct ubifs_info *c, const union ubifs_key *key); 1970*9eefe2a2SStefan Roese int ubifs_tnc_remove_nm(struct ubifs_info *c, const union ubifs_key *key, 1971*9eefe2a2SStefan Roese const struct qstr *nm); 1972*9eefe2a2SStefan Roese int ubifs_tnc_remove_range(struct ubifs_info *c, union ubifs_key *from_key, 1973*9eefe2a2SStefan Roese union ubifs_key *to_key); 1974*9eefe2a2SStefan Roese int ubifs_tnc_remove_ino(struct ubifs_info *c, ino_t inum); 1975*9eefe2a2SStefan Roese struct ubifs_dent_node *ubifs_tnc_next_ent(struct ubifs_info *c, 1976*9eefe2a2SStefan Roese union ubifs_key *key, 1977*9eefe2a2SStefan Roese const struct qstr *nm); 1978*9eefe2a2SStefan Roese void ubifs_tnc_close(struct ubifs_info *c); 1979*9eefe2a2SStefan Roese int ubifs_tnc_has_node(struct ubifs_info *c, union ubifs_key *key, int level, 1980*9eefe2a2SStefan Roese int lnum, int offs, int is_idx); 1981*9eefe2a2SStefan Roese int ubifs_dirty_idx_node(struct ubifs_info *c, union ubifs_key *key, int level, 1982*9eefe2a2SStefan Roese int lnum, int offs); 1983*9eefe2a2SStefan Roese /* Shared by tnc.c for tnc_commit.c */ 1984*9eefe2a2SStefan Roese void destroy_old_idx(struct ubifs_info *c); 1985*9eefe2a2SStefan Roese int is_idx_node_in_tnc(struct ubifs_info *c, union ubifs_key *key, int level, 1986*9eefe2a2SStefan Roese int lnum, int offs); 1987*9eefe2a2SStefan Roese int insert_old_idx_znode(struct ubifs_info *c, struct ubifs_znode *znode); 1988*9eefe2a2SStefan Roese int ubifs_tnc_get_bu_keys(struct ubifs_info *c, struct bu_info *bu); 1989*9eefe2a2SStefan Roese int ubifs_tnc_bulk_read(struct ubifs_info *c, struct bu_info *bu); 1990*9eefe2a2SStefan Roese 1991*9eefe2a2SStefan Roese /* tnc_misc.c */ 1992*9eefe2a2SStefan Roese struct ubifs_znode *ubifs_tnc_levelorder_next(struct ubifs_znode *zr, 1993*9eefe2a2SStefan Roese struct ubifs_znode *znode); 1994*9eefe2a2SStefan Roese int ubifs_search_zbranch(const struct ubifs_info *c, 1995*9eefe2a2SStefan Roese const struct ubifs_znode *znode, 1996*9eefe2a2SStefan Roese const union ubifs_key *key, int *n); 1997*9eefe2a2SStefan Roese struct ubifs_znode *ubifs_tnc_postorder_first(struct ubifs_znode *znode); 1998*9eefe2a2SStefan Roese struct ubifs_znode *ubifs_tnc_postorder_next(struct ubifs_znode *znode); 1999*9eefe2a2SStefan Roese long ubifs_destroy_tnc_subtree(struct ubifs_znode *zr); 2000*9eefe2a2SStefan Roese struct ubifs_znode *ubifs_load_znode(struct ubifs_info *c, 2001*9eefe2a2SStefan Roese struct ubifs_zbranch *zbr, 2002*9eefe2a2SStefan Roese struct ubifs_znode *parent, int iip); 2003*9eefe2a2SStefan Roese int ubifs_tnc_read_node(struct ubifs_info *c, struct ubifs_zbranch *zbr, 2004*9eefe2a2SStefan Roese void *node); 2005*9eefe2a2SStefan Roese 2006*9eefe2a2SStefan Roese /* tnc_commit.c */ 2007*9eefe2a2SStefan Roese int ubifs_tnc_start_commit(struct ubifs_info *c, struct ubifs_zbranch *zroot); 2008*9eefe2a2SStefan Roese int ubifs_tnc_end_commit(struct ubifs_info *c); 2009*9eefe2a2SStefan Roese 2010*9eefe2a2SStefan Roese /* shrinker.c */ 2011*9eefe2a2SStefan Roese int ubifs_shrinker(int nr_to_scan, gfp_t gfp_mask); 2012*9eefe2a2SStefan Roese 2013*9eefe2a2SStefan Roese /* commit.c */ 2014*9eefe2a2SStefan Roese int ubifs_bg_thread(void *info); 2015*9eefe2a2SStefan Roese void ubifs_commit_required(struct ubifs_info *c); 2016*9eefe2a2SStefan Roese void ubifs_request_bg_commit(struct ubifs_info *c); 2017*9eefe2a2SStefan Roese int ubifs_run_commit(struct ubifs_info *c); 2018*9eefe2a2SStefan Roese void ubifs_recovery_commit(struct ubifs_info *c); 2019*9eefe2a2SStefan Roese int ubifs_gc_should_commit(struct ubifs_info *c); 2020*9eefe2a2SStefan Roese void ubifs_wait_for_commit(struct ubifs_info *c); 2021*9eefe2a2SStefan Roese 2022*9eefe2a2SStefan Roese /* master.c */ 2023*9eefe2a2SStefan Roese int ubifs_read_master(struct ubifs_info *c); 2024*9eefe2a2SStefan Roese int ubifs_write_master(struct ubifs_info *c); 2025*9eefe2a2SStefan Roese 2026*9eefe2a2SStefan Roese /* sb.c */ 2027*9eefe2a2SStefan Roese int ubifs_read_superblock(struct ubifs_info *c); 2028*9eefe2a2SStefan Roese struct ubifs_sb_node *ubifs_read_sb_node(struct ubifs_info *c); 2029*9eefe2a2SStefan Roese int ubifs_write_sb_node(struct ubifs_info *c, struct ubifs_sb_node *sup); 2030*9eefe2a2SStefan Roese 2031*9eefe2a2SStefan Roese /* replay.c */ 2032*9eefe2a2SStefan Roese int ubifs_validate_entry(struct ubifs_info *c, 2033*9eefe2a2SStefan Roese const struct ubifs_dent_node *dent); 2034*9eefe2a2SStefan Roese int ubifs_replay_journal(struct ubifs_info *c); 2035*9eefe2a2SStefan Roese 2036*9eefe2a2SStefan Roese /* gc.c */ 2037*9eefe2a2SStefan Roese int ubifs_garbage_collect(struct ubifs_info *c, int anyway); 2038*9eefe2a2SStefan Roese int ubifs_gc_start_commit(struct ubifs_info *c); 2039*9eefe2a2SStefan Roese int ubifs_gc_end_commit(struct ubifs_info *c); 2040*9eefe2a2SStefan Roese void ubifs_destroy_idx_gc(struct ubifs_info *c); 2041*9eefe2a2SStefan Roese int ubifs_get_idx_gc_leb(struct ubifs_info *c); 2042*9eefe2a2SStefan Roese int ubifs_garbage_collect_leb(struct ubifs_info *c, struct ubifs_lprops *lp); 2043*9eefe2a2SStefan Roese 2044*9eefe2a2SStefan Roese /* orphan.c */ 2045*9eefe2a2SStefan Roese int ubifs_add_orphan(struct ubifs_info *c, ino_t inum); 2046*9eefe2a2SStefan Roese void ubifs_delete_orphan(struct ubifs_info *c, ino_t inum); 2047*9eefe2a2SStefan Roese int ubifs_orphan_start_commit(struct ubifs_info *c); 2048*9eefe2a2SStefan Roese int ubifs_orphan_end_commit(struct ubifs_info *c); 2049*9eefe2a2SStefan Roese int ubifs_mount_orphans(struct ubifs_info *c, int unclean, int read_only); 2050*9eefe2a2SStefan Roese int ubifs_clear_orphans(struct ubifs_info *c); 2051*9eefe2a2SStefan Roese 2052*9eefe2a2SStefan Roese /* lpt.c */ 2053*9eefe2a2SStefan Roese int ubifs_calc_lpt_geom(struct ubifs_info *c); 2054*9eefe2a2SStefan Roese int ubifs_create_dflt_lpt(struct ubifs_info *c, int *main_lebs, int lpt_first, 2055*9eefe2a2SStefan Roese int *lpt_lebs, int *big_lpt); 2056*9eefe2a2SStefan Roese int ubifs_lpt_init(struct ubifs_info *c, int rd, int wr); 2057*9eefe2a2SStefan Roese struct ubifs_lprops *ubifs_lpt_lookup(struct ubifs_info *c, int lnum); 2058*9eefe2a2SStefan Roese struct ubifs_lprops *ubifs_lpt_lookup_dirty(struct ubifs_info *c, int lnum); 2059*9eefe2a2SStefan Roese int ubifs_lpt_scan_nolock(struct ubifs_info *c, int start_lnum, int end_lnum, 2060*9eefe2a2SStefan Roese ubifs_lpt_scan_callback scan_cb, void *data); 2061*9eefe2a2SStefan Roese 2062*9eefe2a2SStefan Roese /* Shared by lpt.c for lpt_commit.c */ 2063*9eefe2a2SStefan Roese void ubifs_pack_lsave(struct ubifs_info *c, void *buf, int *lsave); 2064*9eefe2a2SStefan Roese void ubifs_pack_ltab(struct ubifs_info *c, void *buf, 2065*9eefe2a2SStefan Roese struct ubifs_lpt_lprops *ltab); 2066*9eefe2a2SStefan Roese void ubifs_pack_pnode(struct ubifs_info *c, void *buf, 2067*9eefe2a2SStefan Roese struct ubifs_pnode *pnode); 2068*9eefe2a2SStefan Roese void ubifs_pack_nnode(struct ubifs_info *c, void *buf, 2069*9eefe2a2SStefan Roese struct ubifs_nnode *nnode); 2070*9eefe2a2SStefan Roese struct ubifs_pnode *ubifs_get_pnode(struct ubifs_info *c, 2071*9eefe2a2SStefan Roese struct ubifs_nnode *parent, int iip); 2072*9eefe2a2SStefan Roese struct ubifs_nnode *ubifs_get_nnode(struct ubifs_info *c, 2073*9eefe2a2SStefan Roese struct ubifs_nnode *parent, int iip); 2074*9eefe2a2SStefan Roese int ubifs_read_nnode(struct ubifs_info *c, struct ubifs_nnode *parent, int iip); 2075*9eefe2a2SStefan Roese void ubifs_add_lpt_dirt(struct ubifs_info *c, int lnum, int dirty); 2076*9eefe2a2SStefan Roese void ubifs_add_nnode_dirt(struct ubifs_info *c, struct ubifs_nnode *nnode); 2077*9eefe2a2SStefan Roese uint32_t ubifs_unpack_bits(uint8_t **addr, int *pos, int nrbits); 2078*9eefe2a2SStefan Roese struct ubifs_nnode *ubifs_first_nnode(struct ubifs_info *c, int *hght); 2079*9eefe2a2SStefan Roese /* Needed only in debugging code in lpt_commit.c */ 2080*9eefe2a2SStefan Roese int ubifs_unpack_nnode(const struct ubifs_info *c, void *buf, 2081*9eefe2a2SStefan Roese struct ubifs_nnode *nnode); 2082*9eefe2a2SStefan Roese 2083*9eefe2a2SStefan Roese /* lpt_commit.c */ 2084*9eefe2a2SStefan Roese int ubifs_lpt_start_commit(struct ubifs_info *c); 2085*9eefe2a2SStefan Roese int ubifs_lpt_end_commit(struct ubifs_info *c); 2086*9eefe2a2SStefan Roese int ubifs_lpt_post_commit(struct ubifs_info *c); 2087*9eefe2a2SStefan Roese void ubifs_lpt_free(struct ubifs_info *c, int wr_only); 2088*9eefe2a2SStefan Roese 2089*9eefe2a2SStefan Roese /* lprops.c */ 2090*9eefe2a2SStefan Roese const struct ubifs_lprops *ubifs_change_lp(struct ubifs_info *c, 2091*9eefe2a2SStefan Roese const struct ubifs_lprops *lp, 2092*9eefe2a2SStefan Roese int free, int dirty, int flags, 2093*9eefe2a2SStefan Roese int idx_gc_cnt); 2094*9eefe2a2SStefan Roese void ubifs_get_lp_stats(struct ubifs_info *c, struct ubifs_lp_stats *lst); 2095*9eefe2a2SStefan Roese void ubifs_add_to_cat(struct ubifs_info *c, struct ubifs_lprops *lprops, 2096*9eefe2a2SStefan Roese int cat); 2097*9eefe2a2SStefan Roese void ubifs_replace_cat(struct ubifs_info *c, struct ubifs_lprops *old_lprops, 2098*9eefe2a2SStefan Roese struct ubifs_lprops *new_lprops); 2099*9eefe2a2SStefan Roese void ubifs_ensure_cat(struct ubifs_info *c, struct ubifs_lprops *lprops); 2100*9eefe2a2SStefan Roese int ubifs_categorize_lprops(const struct ubifs_info *c, 2101*9eefe2a2SStefan Roese const struct ubifs_lprops *lprops); 2102*9eefe2a2SStefan Roese int ubifs_change_one_lp(struct ubifs_info *c, int lnum, int free, int dirty, 2103*9eefe2a2SStefan Roese int flags_set, int flags_clean, int idx_gc_cnt); 2104*9eefe2a2SStefan Roese int ubifs_update_one_lp(struct ubifs_info *c, int lnum, int free, int dirty, 2105*9eefe2a2SStefan Roese int flags_set, int flags_clean); 2106*9eefe2a2SStefan Roese int ubifs_read_one_lp(struct ubifs_info *c, int lnum, struct ubifs_lprops *lp); 2107*9eefe2a2SStefan Roese const struct ubifs_lprops *ubifs_fast_find_free(struct ubifs_info *c); 2108*9eefe2a2SStefan Roese const struct ubifs_lprops *ubifs_fast_find_empty(struct ubifs_info *c); 2109*9eefe2a2SStefan Roese const struct ubifs_lprops *ubifs_fast_find_freeable(struct ubifs_info *c); 2110*9eefe2a2SStefan Roese const struct ubifs_lprops *ubifs_fast_find_frdi_idx(struct ubifs_info *c); 2111*9eefe2a2SStefan Roese 2112*9eefe2a2SStefan Roese /* file.c */ 2113*9eefe2a2SStefan Roese int ubifs_fsync(struct file *file, struct dentry *dentry, int datasync); 2114*9eefe2a2SStefan Roese int ubifs_setattr(struct dentry *dentry, struct iattr *attr); 2115*9eefe2a2SStefan Roese 2116*9eefe2a2SStefan Roese /* dir.c */ 2117*9eefe2a2SStefan Roese struct inode *ubifs_new_inode(struct ubifs_info *c, const struct inode *dir, 2118*9eefe2a2SStefan Roese int mode); 2119*9eefe2a2SStefan Roese int ubifs_getattr(struct vfsmount *mnt, struct dentry *dentry, 2120*9eefe2a2SStefan Roese struct kstat *stat); 2121*9eefe2a2SStefan Roese 2122*9eefe2a2SStefan Roese /* xattr.c */ 2123*9eefe2a2SStefan Roese int ubifs_setxattr(struct dentry *dentry, const char *name, 2124*9eefe2a2SStefan Roese const void *value, size_t size, int flags); 2125*9eefe2a2SStefan Roese ssize_t ubifs_getxattr(struct dentry *dentry, const char *name, void *buf, 2126*9eefe2a2SStefan Roese size_t size); 2127*9eefe2a2SStefan Roese ssize_t ubifs_listxattr(struct dentry *dentry, char *buffer, size_t size); 2128*9eefe2a2SStefan Roese int ubifs_removexattr(struct dentry *dentry, const char *name); 2129*9eefe2a2SStefan Roese 2130*9eefe2a2SStefan Roese /* super.c */ 2131*9eefe2a2SStefan Roese struct inode *ubifs_iget(struct super_block *sb, unsigned long inum); 2132*9eefe2a2SStefan Roese int ubifs_iput(struct inode *inode); 2133*9eefe2a2SStefan Roese 2134*9eefe2a2SStefan Roese /* recovery.c */ 2135*9eefe2a2SStefan Roese int ubifs_recover_master_node(struct ubifs_info *c); 2136*9eefe2a2SStefan Roese int ubifs_write_rcvrd_mst_node(struct ubifs_info *c); 2137*9eefe2a2SStefan Roese struct ubifs_scan_leb *ubifs_recover_leb(struct ubifs_info *c, int lnum, 2138*9eefe2a2SStefan Roese int offs, void *sbuf, int grouped); 2139*9eefe2a2SStefan Roese struct ubifs_scan_leb *ubifs_recover_log_leb(struct ubifs_info *c, int lnum, 2140*9eefe2a2SStefan Roese int offs, void *sbuf); 2141*9eefe2a2SStefan Roese int ubifs_recover_inl_heads(const struct ubifs_info *c, void *sbuf); 2142*9eefe2a2SStefan Roese int ubifs_clean_lebs(const struct ubifs_info *c, void *sbuf); 2143*9eefe2a2SStefan Roese int ubifs_rcvry_gc_commit(struct ubifs_info *c); 2144*9eefe2a2SStefan Roese int ubifs_recover_size_accum(struct ubifs_info *c, union ubifs_key *key, 2145*9eefe2a2SStefan Roese int deletion, loff_t new_size); 2146*9eefe2a2SStefan Roese int ubifs_recover_size(struct ubifs_info *c); 2147*9eefe2a2SStefan Roese void ubifs_destroy_size_tree(struct ubifs_info *c); 2148*9eefe2a2SStefan Roese 2149*9eefe2a2SStefan Roese /* ioctl.c */ 2150*9eefe2a2SStefan Roese long ubifs_ioctl(struct file *file, unsigned int cmd, unsigned long arg); 2151*9eefe2a2SStefan Roese void ubifs_set_inode_flags(struct inode *inode); 2152*9eefe2a2SStefan Roese #ifdef CONFIG_COMPAT 2153*9eefe2a2SStefan Roese long ubifs_compat_ioctl(struct file *file, unsigned int cmd, unsigned long arg); 2154*9eefe2a2SStefan Roese #endif 2155*9eefe2a2SStefan Roese 2156*9eefe2a2SStefan Roese /* compressor.c */ 2157*9eefe2a2SStefan Roese int __init ubifs_compressors_init(void); 2158*9eefe2a2SStefan Roese void __exit ubifs_compressors_exit(void); 2159*9eefe2a2SStefan Roese void ubifs_compress(const void *in_buf, int in_len, void *out_buf, int *out_len, 2160*9eefe2a2SStefan Roese int *compr_type); 2161*9eefe2a2SStefan Roese int ubifs_decompress(const void *buf, int len, void *out, int *out_len, 2162*9eefe2a2SStefan Roese int compr_type); 2163*9eefe2a2SStefan Roese 2164*9eefe2a2SStefan Roese #include "debug.h" 2165*9eefe2a2SStefan Roese #include "misc.h" 2166*9eefe2a2SStefan Roese #include "key.h" 2167*9eefe2a2SStefan Roese 2168*9eefe2a2SStefan Roese /* todo: Move these to a common U-Boot header */ 2169*9eefe2a2SStefan Roese int lzo1x_decompress_safe(const unsigned char *in, size_t in_len, 2170*9eefe2a2SStefan Roese unsigned char *out, size_t *out_len); 2171*9eefe2a2SStefan Roese int gunzip(void *dst, int dstlen, unsigned char *src, unsigned long *lenp); 2172*9eefe2a2SStefan Roese 2173*9eefe2a2SStefan Roese #endif /* !__UBIFS_H__ */ 2174