1*1e51764aSArtem Bityutskiy /* 2*1e51764aSArtem Bityutskiy * This file is part of UBIFS. 3*1e51764aSArtem Bityutskiy * 4*1e51764aSArtem Bityutskiy * Copyright (C) 2006-2008 Nokia Corporation 5*1e51764aSArtem Bityutskiy * 6*1e51764aSArtem Bityutskiy * This program is free software; you can redistribute it and/or modify it 7*1e51764aSArtem Bityutskiy * under the terms of the GNU General Public License version 2 as published by 8*1e51764aSArtem Bityutskiy * the Free Software Foundation. 9*1e51764aSArtem Bityutskiy * 10*1e51764aSArtem Bityutskiy * This program is distributed in the hope that it will be useful, but WITHOUT 11*1e51764aSArtem Bityutskiy * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 12*1e51764aSArtem Bityutskiy * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 13*1e51764aSArtem Bityutskiy * more details. 14*1e51764aSArtem Bityutskiy * 15*1e51764aSArtem Bityutskiy * You should have received a copy of the GNU General Public License along with 16*1e51764aSArtem Bityutskiy * this program; if not, write to the Free Software Foundation, Inc., 51 17*1e51764aSArtem Bityutskiy * Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 18*1e51764aSArtem Bityutskiy * 19*1e51764aSArtem Bityutskiy * Authors: Artem Bityutskiy (Битюцкий Артём) 20*1e51764aSArtem Bityutskiy * Adrian Hunter 21*1e51764aSArtem Bityutskiy */ 22*1e51764aSArtem Bityutskiy 23*1e51764aSArtem Bityutskiy /* 24*1e51764aSArtem Bityutskiy * This file implements most of the debugging stuff which is compiled in only 25*1e51764aSArtem Bityutskiy * when it is enabled. But some debugging check functions are implemented in 26*1e51764aSArtem Bityutskiy * corresponding subsystem, just because they are closely related and utilize 27*1e51764aSArtem Bityutskiy * various local functions of those subsystems. 28*1e51764aSArtem Bityutskiy */ 29*1e51764aSArtem Bityutskiy 30*1e51764aSArtem Bityutskiy #define UBIFS_DBG_PRESERVE_UBI 31*1e51764aSArtem Bityutskiy 32*1e51764aSArtem Bityutskiy #include "ubifs.h" 33*1e51764aSArtem Bityutskiy #include <linux/module.h> 34*1e51764aSArtem Bityutskiy #include <linux/moduleparam.h> 35*1e51764aSArtem Bityutskiy 36*1e51764aSArtem Bityutskiy #ifdef CONFIG_UBIFS_FS_DEBUG 37*1e51764aSArtem Bityutskiy 38*1e51764aSArtem Bityutskiy DEFINE_SPINLOCK(dbg_lock); 39*1e51764aSArtem Bityutskiy 40*1e51764aSArtem Bityutskiy static char dbg_key_buf0[128]; 41*1e51764aSArtem Bityutskiy static char dbg_key_buf1[128]; 42*1e51764aSArtem Bityutskiy 43*1e51764aSArtem Bityutskiy unsigned int ubifs_msg_flags = UBIFS_MSG_FLAGS_DEFAULT; 44*1e51764aSArtem Bityutskiy unsigned int ubifs_chk_flags = UBIFS_CHK_FLAGS_DEFAULT; 45*1e51764aSArtem Bityutskiy unsigned int ubifs_tst_flags; 46*1e51764aSArtem Bityutskiy 47*1e51764aSArtem Bityutskiy module_param_named(debug_msgs, ubifs_msg_flags, uint, S_IRUGO | S_IWUSR); 48*1e51764aSArtem Bityutskiy module_param_named(debug_chks, ubifs_chk_flags, uint, S_IRUGO | S_IWUSR); 49*1e51764aSArtem Bityutskiy module_param_named(debug_tsts, ubifs_tst_flags, uint, S_IRUGO | S_IWUSR); 50*1e51764aSArtem Bityutskiy 51*1e51764aSArtem Bityutskiy MODULE_PARM_DESC(debug_msgs, "Debug message type flags"); 52*1e51764aSArtem Bityutskiy MODULE_PARM_DESC(debug_chks, "Debug check flags"); 53*1e51764aSArtem Bityutskiy MODULE_PARM_DESC(debug_tsts, "Debug special test flags"); 54*1e51764aSArtem Bityutskiy 55*1e51764aSArtem Bityutskiy static const char *get_key_fmt(int fmt) 56*1e51764aSArtem Bityutskiy { 57*1e51764aSArtem Bityutskiy switch (fmt) { 58*1e51764aSArtem Bityutskiy case UBIFS_SIMPLE_KEY_FMT: 59*1e51764aSArtem Bityutskiy return "simple"; 60*1e51764aSArtem Bityutskiy default: 61*1e51764aSArtem Bityutskiy return "unknown/invalid format"; 62*1e51764aSArtem Bityutskiy } 63*1e51764aSArtem Bityutskiy } 64*1e51764aSArtem Bityutskiy 65*1e51764aSArtem Bityutskiy static const char *get_key_hash(int hash) 66*1e51764aSArtem Bityutskiy { 67*1e51764aSArtem Bityutskiy switch (hash) { 68*1e51764aSArtem Bityutskiy case UBIFS_KEY_HASH_R5: 69*1e51764aSArtem Bityutskiy return "R5"; 70*1e51764aSArtem Bityutskiy case UBIFS_KEY_HASH_TEST: 71*1e51764aSArtem Bityutskiy return "test"; 72*1e51764aSArtem Bityutskiy default: 73*1e51764aSArtem Bityutskiy return "unknown/invalid name hash"; 74*1e51764aSArtem Bityutskiy } 75*1e51764aSArtem Bityutskiy } 76*1e51764aSArtem Bityutskiy 77*1e51764aSArtem Bityutskiy static const char *get_key_type(int type) 78*1e51764aSArtem Bityutskiy { 79*1e51764aSArtem Bityutskiy switch (type) { 80*1e51764aSArtem Bityutskiy case UBIFS_INO_KEY: 81*1e51764aSArtem Bityutskiy return "inode"; 82*1e51764aSArtem Bityutskiy case UBIFS_DENT_KEY: 83*1e51764aSArtem Bityutskiy return "direntry"; 84*1e51764aSArtem Bityutskiy case UBIFS_XENT_KEY: 85*1e51764aSArtem Bityutskiy return "xentry"; 86*1e51764aSArtem Bityutskiy case UBIFS_DATA_KEY: 87*1e51764aSArtem Bityutskiy return "data"; 88*1e51764aSArtem Bityutskiy case UBIFS_TRUN_KEY: 89*1e51764aSArtem Bityutskiy return "truncate"; 90*1e51764aSArtem Bityutskiy default: 91*1e51764aSArtem Bityutskiy return "unknown/invalid key"; 92*1e51764aSArtem Bityutskiy } 93*1e51764aSArtem Bityutskiy } 94*1e51764aSArtem Bityutskiy 95*1e51764aSArtem Bityutskiy static void sprintf_key(const struct ubifs_info *c, const union ubifs_key *key, 96*1e51764aSArtem Bityutskiy char *buffer) 97*1e51764aSArtem Bityutskiy { 98*1e51764aSArtem Bityutskiy char *p = buffer; 99*1e51764aSArtem Bityutskiy int type = key_type(c, key); 100*1e51764aSArtem Bityutskiy 101*1e51764aSArtem Bityutskiy if (c->key_fmt == UBIFS_SIMPLE_KEY_FMT) { 102*1e51764aSArtem Bityutskiy switch (type) { 103*1e51764aSArtem Bityutskiy case UBIFS_INO_KEY: 104*1e51764aSArtem Bityutskiy sprintf(p, "(%lu, %s)", key_inum(c, key), 105*1e51764aSArtem Bityutskiy get_key_type(type)); 106*1e51764aSArtem Bityutskiy break; 107*1e51764aSArtem Bityutskiy case UBIFS_DENT_KEY: 108*1e51764aSArtem Bityutskiy case UBIFS_XENT_KEY: 109*1e51764aSArtem Bityutskiy sprintf(p, "(%lu, %s, %#08x)", key_inum(c, key), 110*1e51764aSArtem Bityutskiy get_key_type(type), key_hash(c, key)); 111*1e51764aSArtem Bityutskiy break; 112*1e51764aSArtem Bityutskiy case UBIFS_DATA_KEY: 113*1e51764aSArtem Bityutskiy sprintf(p, "(%lu, %s, %u)", key_inum(c, key), 114*1e51764aSArtem Bityutskiy get_key_type(type), key_block(c, key)); 115*1e51764aSArtem Bityutskiy break; 116*1e51764aSArtem Bityutskiy case UBIFS_TRUN_KEY: 117*1e51764aSArtem Bityutskiy sprintf(p, "(%lu, %s)", 118*1e51764aSArtem Bityutskiy key_inum(c, key), get_key_type(type)); 119*1e51764aSArtem Bityutskiy break; 120*1e51764aSArtem Bityutskiy default: 121*1e51764aSArtem Bityutskiy sprintf(p, "(bad key type: %#08x, %#08x)", 122*1e51764aSArtem Bityutskiy key->u32[0], key->u32[1]); 123*1e51764aSArtem Bityutskiy } 124*1e51764aSArtem Bityutskiy } else 125*1e51764aSArtem Bityutskiy sprintf(p, "bad key format %d", c->key_fmt); 126*1e51764aSArtem Bityutskiy } 127*1e51764aSArtem Bityutskiy 128*1e51764aSArtem Bityutskiy const char *dbg_key_str0(const struct ubifs_info *c, const union ubifs_key *key) 129*1e51764aSArtem Bityutskiy { 130*1e51764aSArtem Bityutskiy /* dbg_lock must be held */ 131*1e51764aSArtem Bityutskiy sprintf_key(c, key, dbg_key_buf0); 132*1e51764aSArtem Bityutskiy return dbg_key_buf0; 133*1e51764aSArtem Bityutskiy } 134*1e51764aSArtem Bityutskiy 135*1e51764aSArtem Bityutskiy const char *dbg_key_str1(const struct ubifs_info *c, const union ubifs_key *key) 136*1e51764aSArtem Bityutskiy { 137*1e51764aSArtem Bityutskiy /* dbg_lock must be held */ 138*1e51764aSArtem Bityutskiy sprintf_key(c, key, dbg_key_buf1); 139*1e51764aSArtem Bityutskiy return dbg_key_buf1; 140*1e51764aSArtem Bityutskiy } 141*1e51764aSArtem Bityutskiy 142*1e51764aSArtem Bityutskiy const char *dbg_ntype(int type) 143*1e51764aSArtem Bityutskiy { 144*1e51764aSArtem Bityutskiy switch (type) { 145*1e51764aSArtem Bityutskiy case UBIFS_PAD_NODE: 146*1e51764aSArtem Bityutskiy return "padding node"; 147*1e51764aSArtem Bityutskiy case UBIFS_SB_NODE: 148*1e51764aSArtem Bityutskiy return "superblock node"; 149*1e51764aSArtem Bityutskiy case UBIFS_MST_NODE: 150*1e51764aSArtem Bityutskiy return "master node"; 151*1e51764aSArtem Bityutskiy case UBIFS_REF_NODE: 152*1e51764aSArtem Bityutskiy return "reference node"; 153*1e51764aSArtem Bityutskiy case UBIFS_INO_NODE: 154*1e51764aSArtem Bityutskiy return "inode node"; 155*1e51764aSArtem Bityutskiy case UBIFS_DENT_NODE: 156*1e51764aSArtem Bityutskiy return "direntry node"; 157*1e51764aSArtem Bityutskiy case UBIFS_XENT_NODE: 158*1e51764aSArtem Bityutskiy return "xentry node"; 159*1e51764aSArtem Bityutskiy case UBIFS_DATA_NODE: 160*1e51764aSArtem Bityutskiy return "data node"; 161*1e51764aSArtem Bityutskiy case UBIFS_TRUN_NODE: 162*1e51764aSArtem Bityutskiy return "truncate node"; 163*1e51764aSArtem Bityutskiy case UBIFS_IDX_NODE: 164*1e51764aSArtem Bityutskiy return "indexing node"; 165*1e51764aSArtem Bityutskiy case UBIFS_CS_NODE: 166*1e51764aSArtem Bityutskiy return "commit start node"; 167*1e51764aSArtem Bityutskiy case UBIFS_ORPH_NODE: 168*1e51764aSArtem Bityutskiy return "orphan node"; 169*1e51764aSArtem Bityutskiy default: 170*1e51764aSArtem Bityutskiy return "unknown node"; 171*1e51764aSArtem Bityutskiy } 172*1e51764aSArtem Bityutskiy } 173*1e51764aSArtem Bityutskiy 174*1e51764aSArtem Bityutskiy static const char *dbg_gtype(int type) 175*1e51764aSArtem Bityutskiy { 176*1e51764aSArtem Bityutskiy switch (type) { 177*1e51764aSArtem Bityutskiy case UBIFS_NO_NODE_GROUP: 178*1e51764aSArtem Bityutskiy return "no node group"; 179*1e51764aSArtem Bityutskiy case UBIFS_IN_NODE_GROUP: 180*1e51764aSArtem Bityutskiy return "in node group"; 181*1e51764aSArtem Bityutskiy case UBIFS_LAST_OF_NODE_GROUP: 182*1e51764aSArtem Bityutskiy return "last of node group"; 183*1e51764aSArtem Bityutskiy default: 184*1e51764aSArtem Bityutskiy return "unknown"; 185*1e51764aSArtem Bityutskiy } 186*1e51764aSArtem Bityutskiy } 187*1e51764aSArtem Bityutskiy 188*1e51764aSArtem Bityutskiy const char *dbg_cstate(int cmt_state) 189*1e51764aSArtem Bityutskiy { 190*1e51764aSArtem Bityutskiy switch (cmt_state) { 191*1e51764aSArtem Bityutskiy case COMMIT_RESTING: 192*1e51764aSArtem Bityutskiy return "commit resting"; 193*1e51764aSArtem Bityutskiy case COMMIT_BACKGROUND: 194*1e51764aSArtem Bityutskiy return "background commit requested"; 195*1e51764aSArtem Bityutskiy case COMMIT_REQUIRED: 196*1e51764aSArtem Bityutskiy return "commit required"; 197*1e51764aSArtem Bityutskiy case COMMIT_RUNNING_BACKGROUND: 198*1e51764aSArtem Bityutskiy return "BACKGROUND commit running"; 199*1e51764aSArtem Bityutskiy case COMMIT_RUNNING_REQUIRED: 200*1e51764aSArtem Bityutskiy return "commit running and required"; 201*1e51764aSArtem Bityutskiy case COMMIT_BROKEN: 202*1e51764aSArtem Bityutskiy return "broken commit"; 203*1e51764aSArtem Bityutskiy default: 204*1e51764aSArtem Bityutskiy return "unknown commit state"; 205*1e51764aSArtem Bityutskiy } 206*1e51764aSArtem Bityutskiy } 207*1e51764aSArtem Bityutskiy 208*1e51764aSArtem Bityutskiy static void dump_ch(const struct ubifs_ch *ch) 209*1e51764aSArtem Bityutskiy { 210*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "\tmagic %#x\n", le32_to_cpu(ch->magic)); 211*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "\tcrc %#x\n", le32_to_cpu(ch->crc)); 212*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "\tnode_type %d (%s)\n", ch->node_type, 213*1e51764aSArtem Bityutskiy dbg_ntype(ch->node_type)); 214*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "\tgroup_type %d (%s)\n", ch->group_type, 215*1e51764aSArtem Bityutskiy dbg_gtype(ch->group_type)); 216*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "\tsqnum %llu\n", 217*1e51764aSArtem Bityutskiy (unsigned long long)le64_to_cpu(ch->sqnum)); 218*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "\tlen %u\n", le32_to_cpu(ch->len)); 219*1e51764aSArtem Bityutskiy } 220*1e51764aSArtem Bityutskiy 221*1e51764aSArtem Bityutskiy void dbg_dump_inode(const struct ubifs_info *c, const struct inode *inode) 222*1e51764aSArtem Bityutskiy { 223*1e51764aSArtem Bityutskiy const struct ubifs_inode *ui = ubifs_inode(inode); 224*1e51764aSArtem Bityutskiy 225*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "inode %lu\n", inode->i_ino); 226*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "size %llu\n", 227*1e51764aSArtem Bityutskiy (unsigned long long)i_size_read(inode)); 228*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "nlink %u\n", inode->i_nlink); 229*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "uid %u\n", (unsigned int)inode->i_uid); 230*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "gid %u\n", (unsigned int)inode->i_gid); 231*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "atime %u.%u\n", 232*1e51764aSArtem Bityutskiy (unsigned int)inode->i_atime.tv_sec, 233*1e51764aSArtem Bityutskiy (unsigned int)inode->i_atime.tv_nsec); 234*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "mtime %u.%u\n", 235*1e51764aSArtem Bityutskiy (unsigned int)inode->i_mtime.tv_sec, 236*1e51764aSArtem Bityutskiy (unsigned int)inode->i_mtime.tv_nsec); 237*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "ctime %u.%u\n", 238*1e51764aSArtem Bityutskiy (unsigned int)inode->i_ctime.tv_sec, 239*1e51764aSArtem Bityutskiy (unsigned int)inode->i_ctime.tv_nsec); 240*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "creat_sqnum %llu\n", ui->creat_sqnum); 241*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "xattr_size %u\n", ui->xattr_size); 242*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "xattr_cnt %u\n", ui->xattr_cnt); 243*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "xattr_names %u\n", ui->xattr_names); 244*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "dirty %u\n", ui->dirty); 245*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "xattr %u\n", ui->xattr); 246*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "flags %d\n", ui->flags); 247*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "compr_type %d\n", ui->compr_type); 248*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "data_len %d\n", ui->data_len); 249*1e51764aSArtem Bityutskiy } 250*1e51764aSArtem Bityutskiy 251*1e51764aSArtem Bityutskiy void dbg_dump_node(const struct ubifs_info *c, const void *node) 252*1e51764aSArtem Bityutskiy { 253*1e51764aSArtem Bityutskiy int i, n; 254*1e51764aSArtem Bityutskiy union ubifs_key key; 255*1e51764aSArtem Bityutskiy const struct ubifs_ch *ch = node; 256*1e51764aSArtem Bityutskiy 257*1e51764aSArtem Bityutskiy if (dbg_failure_mode) 258*1e51764aSArtem Bityutskiy return; 259*1e51764aSArtem Bityutskiy 260*1e51764aSArtem Bityutskiy /* If the magic is incorrect, just hexdump the first bytes */ 261*1e51764aSArtem Bityutskiy if (le32_to_cpu(ch->magic) != UBIFS_NODE_MAGIC) { 262*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "Not a node, first %zu bytes:", UBIFS_CH_SZ); 263*1e51764aSArtem Bityutskiy print_hex_dump(KERN_DEBUG, "", DUMP_PREFIX_OFFSET, 32, 1, 264*1e51764aSArtem Bityutskiy (void *)node, UBIFS_CH_SZ, 1); 265*1e51764aSArtem Bityutskiy return; 266*1e51764aSArtem Bityutskiy } 267*1e51764aSArtem Bityutskiy 268*1e51764aSArtem Bityutskiy spin_lock(&dbg_lock); 269*1e51764aSArtem Bityutskiy dump_ch(node); 270*1e51764aSArtem Bityutskiy 271*1e51764aSArtem Bityutskiy switch (ch->node_type) { 272*1e51764aSArtem Bityutskiy case UBIFS_PAD_NODE: 273*1e51764aSArtem Bityutskiy { 274*1e51764aSArtem Bityutskiy const struct ubifs_pad_node *pad = node; 275*1e51764aSArtem Bityutskiy 276*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "\tpad_len %u\n", 277*1e51764aSArtem Bityutskiy le32_to_cpu(pad->pad_len)); 278*1e51764aSArtem Bityutskiy break; 279*1e51764aSArtem Bityutskiy } 280*1e51764aSArtem Bityutskiy case UBIFS_SB_NODE: 281*1e51764aSArtem Bityutskiy { 282*1e51764aSArtem Bityutskiy const struct ubifs_sb_node *sup = node; 283*1e51764aSArtem Bityutskiy unsigned int sup_flags = le32_to_cpu(sup->flags); 284*1e51764aSArtem Bityutskiy 285*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "\tkey_hash %d (%s)\n", 286*1e51764aSArtem Bityutskiy (int)sup->key_hash, get_key_hash(sup->key_hash)); 287*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "\tkey_fmt %d (%s)\n", 288*1e51764aSArtem Bityutskiy (int)sup->key_fmt, get_key_fmt(sup->key_fmt)); 289*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "\tflags %#x\n", sup_flags); 290*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "\t big_lpt %u\n", 291*1e51764aSArtem Bityutskiy !!(sup_flags & UBIFS_FLG_BIGLPT)); 292*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "\tmin_io_size %u\n", 293*1e51764aSArtem Bityutskiy le32_to_cpu(sup->min_io_size)); 294*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "\tleb_size %u\n", 295*1e51764aSArtem Bityutskiy le32_to_cpu(sup->leb_size)); 296*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "\tleb_cnt %u\n", 297*1e51764aSArtem Bityutskiy le32_to_cpu(sup->leb_cnt)); 298*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "\tmax_leb_cnt %u\n", 299*1e51764aSArtem Bityutskiy le32_to_cpu(sup->max_leb_cnt)); 300*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "\tmax_bud_bytes %llu\n", 301*1e51764aSArtem Bityutskiy (unsigned long long)le64_to_cpu(sup->max_bud_bytes)); 302*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "\tlog_lebs %u\n", 303*1e51764aSArtem Bityutskiy le32_to_cpu(sup->log_lebs)); 304*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "\tlpt_lebs %u\n", 305*1e51764aSArtem Bityutskiy le32_to_cpu(sup->lpt_lebs)); 306*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "\torph_lebs %u\n", 307*1e51764aSArtem Bityutskiy le32_to_cpu(sup->orph_lebs)); 308*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "\tjhead_cnt %u\n", 309*1e51764aSArtem Bityutskiy le32_to_cpu(sup->jhead_cnt)); 310*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "\tfanout %u\n", 311*1e51764aSArtem Bityutskiy le32_to_cpu(sup->fanout)); 312*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "\tlsave_cnt %u\n", 313*1e51764aSArtem Bityutskiy le32_to_cpu(sup->lsave_cnt)); 314*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "\tdefault_compr %u\n", 315*1e51764aSArtem Bityutskiy (int)le16_to_cpu(sup->default_compr)); 316*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "\trp_size %llu\n", 317*1e51764aSArtem Bityutskiy (unsigned long long)le64_to_cpu(sup->rp_size)); 318*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "\trp_uid %u\n", 319*1e51764aSArtem Bityutskiy le32_to_cpu(sup->rp_uid)); 320*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "\trp_gid %u\n", 321*1e51764aSArtem Bityutskiy le32_to_cpu(sup->rp_gid)); 322*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "\tfmt_version %u\n", 323*1e51764aSArtem Bityutskiy le32_to_cpu(sup->fmt_version)); 324*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "\ttime_gran %u\n", 325*1e51764aSArtem Bityutskiy le32_to_cpu(sup->time_gran)); 326*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "\tUUID %02X%02X%02X%02X-%02X%02X" 327*1e51764aSArtem Bityutskiy "-%02X%02X-%02X%02X-%02X%02X%02X%02X%02X%02X\n", 328*1e51764aSArtem Bityutskiy sup->uuid[0], sup->uuid[1], sup->uuid[2], sup->uuid[3], 329*1e51764aSArtem Bityutskiy sup->uuid[4], sup->uuid[5], sup->uuid[6], sup->uuid[7], 330*1e51764aSArtem Bityutskiy sup->uuid[8], sup->uuid[9], sup->uuid[10], sup->uuid[11], 331*1e51764aSArtem Bityutskiy sup->uuid[12], sup->uuid[13], sup->uuid[14], 332*1e51764aSArtem Bityutskiy sup->uuid[15]); 333*1e51764aSArtem Bityutskiy break; 334*1e51764aSArtem Bityutskiy } 335*1e51764aSArtem Bityutskiy case UBIFS_MST_NODE: 336*1e51764aSArtem Bityutskiy { 337*1e51764aSArtem Bityutskiy const struct ubifs_mst_node *mst = node; 338*1e51764aSArtem Bityutskiy 339*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "\thighest_inum %llu\n", 340*1e51764aSArtem Bityutskiy (unsigned long long)le64_to_cpu(mst->highest_inum)); 341*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "\tcommit number %llu\n", 342*1e51764aSArtem Bityutskiy (unsigned long long)le64_to_cpu(mst->cmt_no)); 343*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "\tflags %#x\n", 344*1e51764aSArtem Bityutskiy le32_to_cpu(mst->flags)); 345*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "\tlog_lnum %u\n", 346*1e51764aSArtem Bityutskiy le32_to_cpu(mst->log_lnum)); 347*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "\troot_lnum %u\n", 348*1e51764aSArtem Bityutskiy le32_to_cpu(mst->root_lnum)); 349*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "\troot_offs %u\n", 350*1e51764aSArtem Bityutskiy le32_to_cpu(mst->root_offs)); 351*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "\troot_len %u\n", 352*1e51764aSArtem Bityutskiy le32_to_cpu(mst->root_len)); 353*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "\tgc_lnum %u\n", 354*1e51764aSArtem Bityutskiy le32_to_cpu(mst->gc_lnum)); 355*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "\tihead_lnum %u\n", 356*1e51764aSArtem Bityutskiy le32_to_cpu(mst->ihead_lnum)); 357*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "\tihead_offs %u\n", 358*1e51764aSArtem Bityutskiy le32_to_cpu(mst->ihead_offs)); 359*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "\tindex_size %u\n", 360*1e51764aSArtem Bityutskiy le32_to_cpu(mst->index_size)); 361*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "\tlpt_lnum %u\n", 362*1e51764aSArtem Bityutskiy le32_to_cpu(mst->lpt_lnum)); 363*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "\tlpt_offs %u\n", 364*1e51764aSArtem Bityutskiy le32_to_cpu(mst->lpt_offs)); 365*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "\tnhead_lnum %u\n", 366*1e51764aSArtem Bityutskiy le32_to_cpu(mst->nhead_lnum)); 367*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "\tnhead_offs %u\n", 368*1e51764aSArtem Bityutskiy le32_to_cpu(mst->nhead_offs)); 369*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "\tltab_lnum %u\n", 370*1e51764aSArtem Bityutskiy le32_to_cpu(mst->ltab_lnum)); 371*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "\tltab_offs %u\n", 372*1e51764aSArtem Bityutskiy le32_to_cpu(mst->ltab_offs)); 373*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "\tlsave_lnum %u\n", 374*1e51764aSArtem Bityutskiy le32_to_cpu(mst->lsave_lnum)); 375*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "\tlsave_offs %u\n", 376*1e51764aSArtem Bityutskiy le32_to_cpu(mst->lsave_offs)); 377*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "\tlscan_lnum %u\n", 378*1e51764aSArtem Bityutskiy le32_to_cpu(mst->lscan_lnum)); 379*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "\tleb_cnt %u\n", 380*1e51764aSArtem Bityutskiy le32_to_cpu(mst->leb_cnt)); 381*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "\tempty_lebs %u\n", 382*1e51764aSArtem Bityutskiy le32_to_cpu(mst->empty_lebs)); 383*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "\tidx_lebs %u\n", 384*1e51764aSArtem Bityutskiy le32_to_cpu(mst->idx_lebs)); 385*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "\ttotal_free %llu\n", 386*1e51764aSArtem Bityutskiy (unsigned long long)le64_to_cpu(mst->total_free)); 387*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "\ttotal_dirty %llu\n", 388*1e51764aSArtem Bityutskiy (unsigned long long)le64_to_cpu(mst->total_dirty)); 389*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "\ttotal_used %llu\n", 390*1e51764aSArtem Bityutskiy (unsigned long long)le64_to_cpu(mst->total_used)); 391*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "\ttotal_dead %llu\n", 392*1e51764aSArtem Bityutskiy (unsigned long long)le64_to_cpu(mst->total_dead)); 393*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "\ttotal_dark %llu\n", 394*1e51764aSArtem Bityutskiy (unsigned long long)le64_to_cpu(mst->total_dark)); 395*1e51764aSArtem Bityutskiy break; 396*1e51764aSArtem Bityutskiy } 397*1e51764aSArtem Bityutskiy case UBIFS_REF_NODE: 398*1e51764aSArtem Bityutskiy { 399*1e51764aSArtem Bityutskiy const struct ubifs_ref_node *ref = node; 400*1e51764aSArtem Bityutskiy 401*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "\tlnum %u\n", 402*1e51764aSArtem Bityutskiy le32_to_cpu(ref->lnum)); 403*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "\toffs %u\n", 404*1e51764aSArtem Bityutskiy le32_to_cpu(ref->offs)); 405*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "\tjhead %u\n", 406*1e51764aSArtem Bityutskiy le32_to_cpu(ref->jhead)); 407*1e51764aSArtem Bityutskiy break; 408*1e51764aSArtem Bityutskiy } 409*1e51764aSArtem Bityutskiy case UBIFS_INO_NODE: 410*1e51764aSArtem Bityutskiy { 411*1e51764aSArtem Bityutskiy const struct ubifs_ino_node *ino = node; 412*1e51764aSArtem Bityutskiy 413*1e51764aSArtem Bityutskiy key_read(c, &ino->key, &key); 414*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "\tkey %s\n", DBGKEY(&key)); 415*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "\tcreat_sqnum %llu\n", 416*1e51764aSArtem Bityutskiy (unsigned long long)le64_to_cpu(ino->creat_sqnum)); 417*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "\tsize %llu\n", 418*1e51764aSArtem Bityutskiy (unsigned long long)le64_to_cpu(ino->size)); 419*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "\tnlink %u\n", 420*1e51764aSArtem Bityutskiy le32_to_cpu(ino->nlink)); 421*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "\tatime %lld.%u\n", 422*1e51764aSArtem Bityutskiy (long long)le64_to_cpu(ino->atime_sec), 423*1e51764aSArtem Bityutskiy le32_to_cpu(ino->atime_nsec)); 424*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "\tmtime %lld.%u\n", 425*1e51764aSArtem Bityutskiy (long long)le64_to_cpu(ino->mtime_sec), 426*1e51764aSArtem Bityutskiy le32_to_cpu(ino->mtime_nsec)); 427*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "\tctime %lld.%u\n", 428*1e51764aSArtem Bityutskiy (long long)le64_to_cpu(ino->ctime_sec), 429*1e51764aSArtem Bityutskiy le32_to_cpu(ino->ctime_nsec)); 430*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "\tuid %u\n", 431*1e51764aSArtem Bityutskiy le32_to_cpu(ino->uid)); 432*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "\tgid %u\n", 433*1e51764aSArtem Bityutskiy le32_to_cpu(ino->gid)); 434*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "\tmode %u\n", 435*1e51764aSArtem Bityutskiy le32_to_cpu(ino->mode)); 436*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "\tflags %#x\n", 437*1e51764aSArtem Bityutskiy le32_to_cpu(ino->flags)); 438*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "\txattr_cnt %u\n", 439*1e51764aSArtem Bityutskiy le32_to_cpu(ino->xattr_cnt)); 440*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "\txattr_size %u\n", 441*1e51764aSArtem Bityutskiy le32_to_cpu(ino->xattr_size)); 442*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "\txattr_names %u\n", 443*1e51764aSArtem Bityutskiy le32_to_cpu(ino->xattr_names)); 444*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "\tcompr_type %#x\n", 445*1e51764aSArtem Bityutskiy (int)le16_to_cpu(ino->compr_type)); 446*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "\tdata len %u\n", 447*1e51764aSArtem Bityutskiy le32_to_cpu(ino->data_len)); 448*1e51764aSArtem Bityutskiy break; 449*1e51764aSArtem Bityutskiy } 450*1e51764aSArtem Bityutskiy case UBIFS_DENT_NODE: 451*1e51764aSArtem Bityutskiy case UBIFS_XENT_NODE: 452*1e51764aSArtem Bityutskiy { 453*1e51764aSArtem Bityutskiy const struct ubifs_dent_node *dent = node; 454*1e51764aSArtem Bityutskiy int nlen = le16_to_cpu(dent->nlen); 455*1e51764aSArtem Bityutskiy 456*1e51764aSArtem Bityutskiy key_read(c, &dent->key, &key); 457*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "\tkey %s\n", DBGKEY(&key)); 458*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "\tinum %llu\n", 459*1e51764aSArtem Bityutskiy (unsigned long long)le64_to_cpu(dent->inum)); 460*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "\ttype %d\n", (int)dent->type); 461*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "\tnlen %d\n", nlen); 462*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "\tname "); 463*1e51764aSArtem Bityutskiy 464*1e51764aSArtem Bityutskiy if (nlen > UBIFS_MAX_NLEN) 465*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "(bad name length, not printing, " 466*1e51764aSArtem Bityutskiy "bad or corrupted node)"); 467*1e51764aSArtem Bityutskiy else { 468*1e51764aSArtem Bityutskiy for (i = 0; i < nlen && dent->name[i]; i++) 469*1e51764aSArtem Bityutskiy printk("%c", dent->name[i]); 470*1e51764aSArtem Bityutskiy } 471*1e51764aSArtem Bityutskiy printk("\n"); 472*1e51764aSArtem Bityutskiy 473*1e51764aSArtem Bityutskiy break; 474*1e51764aSArtem Bityutskiy } 475*1e51764aSArtem Bityutskiy case UBIFS_DATA_NODE: 476*1e51764aSArtem Bityutskiy { 477*1e51764aSArtem Bityutskiy const struct ubifs_data_node *dn = node; 478*1e51764aSArtem Bityutskiy int dlen = le32_to_cpu(ch->len) - UBIFS_DATA_NODE_SZ; 479*1e51764aSArtem Bityutskiy 480*1e51764aSArtem Bityutskiy key_read(c, &dn->key, &key); 481*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "\tkey %s\n", DBGKEY(&key)); 482*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "\tsize %u\n", 483*1e51764aSArtem Bityutskiy le32_to_cpu(dn->size)); 484*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "\tcompr_typ %d\n", 485*1e51764aSArtem Bityutskiy (int)le16_to_cpu(dn->compr_type)); 486*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "\tdata size %d\n", 487*1e51764aSArtem Bityutskiy dlen); 488*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "\tdata:\n"); 489*1e51764aSArtem Bityutskiy print_hex_dump(KERN_DEBUG, "\t", DUMP_PREFIX_OFFSET, 32, 1, 490*1e51764aSArtem Bityutskiy (void *)&dn->data, dlen, 0); 491*1e51764aSArtem Bityutskiy break; 492*1e51764aSArtem Bityutskiy } 493*1e51764aSArtem Bityutskiy case UBIFS_TRUN_NODE: 494*1e51764aSArtem Bityutskiy { 495*1e51764aSArtem Bityutskiy const struct ubifs_trun_node *trun = node; 496*1e51764aSArtem Bityutskiy 497*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "\tinum %u\n", 498*1e51764aSArtem Bityutskiy le32_to_cpu(trun->inum)); 499*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "\told_size %llu\n", 500*1e51764aSArtem Bityutskiy (unsigned long long)le64_to_cpu(trun->old_size)); 501*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "\tnew_size %llu\n", 502*1e51764aSArtem Bityutskiy (unsigned long long)le64_to_cpu(trun->new_size)); 503*1e51764aSArtem Bityutskiy break; 504*1e51764aSArtem Bityutskiy } 505*1e51764aSArtem Bityutskiy case UBIFS_IDX_NODE: 506*1e51764aSArtem Bityutskiy { 507*1e51764aSArtem Bityutskiy const struct ubifs_idx_node *idx = node; 508*1e51764aSArtem Bityutskiy 509*1e51764aSArtem Bityutskiy n = le16_to_cpu(idx->child_cnt); 510*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "\tchild_cnt %d\n", n); 511*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "\tlevel %d\n", 512*1e51764aSArtem Bityutskiy (int)le16_to_cpu(idx->level)); 513*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "\tBranches:\n"); 514*1e51764aSArtem Bityutskiy 515*1e51764aSArtem Bityutskiy for (i = 0; i < n && i < c->fanout - 1; i++) { 516*1e51764aSArtem Bityutskiy const struct ubifs_branch *br; 517*1e51764aSArtem Bityutskiy 518*1e51764aSArtem Bityutskiy br = ubifs_idx_branch(c, idx, i); 519*1e51764aSArtem Bityutskiy key_read(c, &br->key, &key); 520*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "\t%d: LEB %d:%d len %d key %s\n", 521*1e51764aSArtem Bityutskiy i, le32_to_cpu(br->lnum), le32_to_cpu(br->offs), 522*1e51764aSArtem Bityutskiy le32_to_cpu(br->len), DBGKEY(&key)); 523*1e51764aSArtem Bityutskiy } 524*1e51764aSArtem Bityutskiy break; 525*1e51764aSArtem Bityutskiy } 526*1e51764aSArtem Bityutskiy case UBIFS_CS_NODE: 527*1e51764aSArtem Bityutskiy break; 528*1e51764aSArtem Bityutskiy case UBIFS_ORPH_NODE: 529*1e51764aSArtem Bityutskiy { 530*1e51764aSArtem Bityutskiy const struct ubifs_orph_node *orph = node; 531*1e51764aSArtem Bityutskiy 532*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "\tcommit number %llu\n", 533*1e51764aSArtem Bityutskiy (unsigned long long) 534*1e51764aSArtem Bityutskiy le64_to_cpu(orph->cmt_no) & LLONG_MAX); 535*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "\tlast node flag %llu\n", 536*1e51764aSArtem Bityutskiy (unsigned long long)(le64_to_cpu(orph->cmt_no)) >> 63); 537*1e51764aSArtem Bityutskiy n = (le32_to_cpu(ch->len) - UBIFS_ORPH_NODE_SZ) >> 3; 538*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "\t%d orphan inode numbers:\n", n); 539*1e51764aSArtem Bityutskiy for (i = 0; i < n; i++) 540*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "\t ino %llu\n", 541*1e51764aSArtem Bityutskiy le64_to_cpu(orph->inos[i])); 542*1e51764aSArtem Bityutskiy break; 543*1e51764aSArtem Bityutskiy } 544*1e51764aSArtem Bityutskiy default: 545*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "node type %d was not recognized\n", 546*1e51764aSArtem Bityutskiy (int)ch->node_type); 547*1e51764aSArtem Bityutskiy } 548*1e51764aSArtem Bityutskiy spin_unlock(&dbg_lock); 549*1e51764aSArtem Bityutskiy } 550*1e51764aSArtem Bityutskiy 551*1e51764aSArtem Bityutskiy void dbg_dump_budget_req(const struct ubifs_budget_req *req) 552*1e51764aSArtem Bityutskiy { 553*1e51764aSArtem Bityutskiy spin_lock(&dbg_lock); 554*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "Budgeting request: new_ino %d, dirtied_ino %d\n", 555*1e51764aSArtem Bityutskiy req->new_ino, req->dirtied_ino); 556*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "\tnew_ino_d %d, dirtied_ino_d %d\n", 557*1e51764aSArtem Bityutskiy req->new_ino_d, req->dirtied_ino_d); 558*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "\tnew_page %d, dirtied_page %d\n", 559*1e51764aSArtem Bityutskiy req->new_page, req->dirtied_page); 560*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "\tnew_dent %d, mod_dent %d\n", 561*1e51764aSArtem Bityutskiy req->new_dent, req->mod_dent); 562*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "\tidx_growth %d\n", req->idx_growth); 563*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "\tdata_growth %d dd_growth %d\n", 564*1e51764aSArtem Bityutskiy req->data_growth, req->dd_growth); 565*1e51764aSArtem Bityutskiy spin_unlock(&dbg_lock); 566*1e51764aSArtem Bityutskiy } 567*1e51764aSArtem Bityutskiy 568*1e51764aSArtem Bityutskiy void dbg_dump_lstats(const struct ubifs_lp_stats *lst) 569*1e51764aSArtem Bityutskiy { 570*1e51764aSArtem Bityutskiy spin_lock(&dbg_lock); 571*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "Lprops statistics: empty_lebs %d, idx_lebs %d\n", 572*1e51764aSArtem Bityutskiy lst->empty_lebs, lst->idx_lebs); 573*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "\ttaken_empty_lebs %d, total_free %lld, " 574*1e51764aSArtem Bityutskiy "total_dirty %lld\n", lst->taken_empty_lebs, lst->total_free, 575*1e51764aSArtem Bityutskiy lst->total_dirty); 576*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "\ttotal_used %lld, total_dark %lld, " 577*1e51764aSArtem Bityutskiy "total_dead %lld\n", lst->total_used, lst->total_dark, 578*1e51764aSArtem Bityutskiy lst->total_dead); 579*1e51764aSArtem Bityutskiy spin_unlock(&dbg_lock); 580*1e51764aSArtem Bityutskiy } 581*1e51764aSArtem Bityutskiy 582*1e51764aSArtem Bityutskiy void dbg_dump_budg(struct ubifs_info *c) 583*1e51764aSArtem Bityutskiy { 584*1e51764aSArtem Bityutskiy int i; 585*1e51764aSArtem Bityutskiy struct rb_node *rb; 586*1e51764aSArtem Bityutskiy struct ubifs_bud *bud; 587*1e51764aSArtem Bityutskiy struct ubifs_gced_idx_leb *idx_gc; 588*1e51764aSArtem Bityutskiy 589*1e51764aSArtem Bityutskiy spin_lock(&dbg_lock); 590*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "Budgeting info: budg_data_growth %lld, " 591*1e51764aSArtem Bityutskiy "budg_dd_growth %lld, budg_idx_growth %lld\n", 592*1e51764aSArtem Bityutskiy c->budg_data_growth, c->budg_dd_growth, c->budg_idx_growth); 593*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "\tdata budget sum %lld, total budget sum %lld, " 594*1e51764aSArtem Bityutskiy "freeable_cnt %d\n", c->budg_data_growth + c->budg_dd_growth, 595*1e51764aSArtem Bityutskiy c->budg_data_growth + c->budg_dd_growth + c->budg_idx_growth, 596*1e51764aSArtem Bityutskiy c->freeable_cnt); 597*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "\tmin_idx_lebs %d, old_idx_sz %lld, " 598*1e51764aSArtem Bityutskiy "calc_idx_sz %lld, idx_gc_cnt %d\n", c->min_idx_lebs, 599*1e51764aSArtem Bityutskiy c->old_idx_sz, c->calc_idx_sz, c->idx_gc_cnt); 600*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "\tdirty_pg_cnt %ld, dirty_zn_cnt %ld, " 601*1e51764aSArtem Bityutskiy "clean_zn_cnt %ld\n", atomic_long_read(&c->dirty_pg_cnt), 602*1e51764aSArtem Bityutskiy atomic_long_read(&c->dirty_zn_cnt), 603*1e51764aSArtem Bityutskiy atomic_long_read(&c->clean_zn_cnt)); 604*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "\tdark_wm %d, dead_wm %d, max_idx_node_sz %d\n", 605*1e51764aSArtem Bityutskiy c->dark_wm, c->dead_wm, c->max_idx_node_sz); 606*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "\tgc_lnum %d, ihead_lnum %d\n", 607*1e51764aSArtem Bityutskiy c->gc_lnum, c->ihead_lnum); 608*1e51764aSArtem Bityutskiy for (i = 0; i < c->jhead_cnt; i++) 609*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "\tjhead %d\t LEB %d\n", 610*1e51764aSArtem Bityutskiy c->jheads[i].wbuf.jhead, c->jheads[i].wbuf.lnum); 611*1e51764aSArtem Bityutskiy for (rb = rb_first(&c->buds); rb; rb = rb_next(rb)) { 612*1e51764aSArtem Bityutskiy bud = rb_entry(rb, struct ubifs_bud, rb); 613*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "\tbud LEB %d\n", bud->lnum); 614*1e51764aSArtem Bityutskiy } 615*1e51764aSArtem Bityutskiy list_for_each_entry(bud, &c->old_buds, list) 616*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "\told bud LEB %d\n", bud->lnum); 617*1e51764aSArtem Bityutskiy list_for_each_entry(idx_gc, &c->idx_gc, list) 618*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "\tGC'ed idx LEB %d unmap %d\n", 619*1e51764aSArtem Bityutskiy idx_gc->lnum, idx_gc->unmap); 620*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "\tcommit state %d\n", c->cmt_state); 621*1e51764aSArtem Bityutskiy spin_unlock(&dbg_lock); 622*1e51764aSArtem Bityutskiy } 623*1e51764aSArtem Bityutskiy 624*1e51764aSArtem Bityutskiy void dbg_dump_lprop(const struct ubifs_info *c, const struct ubifs_lprops *lp) 625*1e51764aSArtem Bityutskiy { 626*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "LEB %d lprops: free %d, dirty %d (used %d), " 627*1e51764aSArtem Bityutskiy "flags %#x\n", lp->lnum, lp->free, lp->dirty, 628*1e51764aSArtem Bityutskiy c->leb_size - lp->free - lp->dirty, lp->flags); 629*1e51764aSArtem Bityutskiy } 630*1e51764aSArtem Bityutskiy 631*1e51764aSArtem Bityutskiy void dbg_dump_lprops(struct ubifs_info *c) 632*1e51764aSArtem Bityutskiy { 633*1e51764aSArtem Bityutskiy int lnum, err; 634*1e51764aSArtem Bityutskiy struct ubifs_lprops lp; 635*1e51764aSArtem Bityutskiy struct ubifs_lp_stats lst; 636*1e51764aSArtem Bityutskiy 637*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "Dumping LEB properties\n"); 638*1e51764aSArtem Bityutskiy ubifs_get_lp_stats(c, &lst); 639*1e51764aSArtem Bityutskiy dbg_dump_lstats(&lst); 640*1e51764aSArtem Bityutskiy 641*1e51764aSArtem Bityutskiy for (lnum = c->main_first; lnum < c->leb_cnt; lnum++) { 642*1e51764aSArtem Bityutskiy err = ubifs_read_one_lp(c, lnum, &lp); 643*1e51764aSArtem Bityutskiy if (err) 644*1e51764aSArtem Bityutskiy ubifs_err("cannot read lprops for LEB %d", lnum); 645*1e51764aSArtem Bityutskiy 646*1e51764aSArtem Bityutskiy dbg_dump_lprop(c, &lp); 647*1e51764aSArtem Bityutskiy } 648*1e51764aSArtem Bityutskiy } 649*1e51764aSArtem Bityutskiy 650*1e51764aSArtem Bityutskiy void dbg_dump_leb(const struct ubifs_info *c, int lnum) 651*1e51764aSArtem Bityutskiy { 652*1e51764aSArtem Bityutskiy struct ubifs_scan_leb *sleb; 653*1e51764aSArtem Bityutskiy struct ubifs_scan_node *snod; 654*1e51764aSArtem Bityutskiy 655*1e51764aSArtem Bityutskiy if (dbg_failure_mode) 656*1e51764aSArtem Bityutskiy return; 657*1e51764aSArtem Bityutskiy 658*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "Dumping LEB %d\n", lnum); 659*1e51764aSArtem Bityutskiy 660*1e51764aSArtem Bityutskiy sleb = ubifs_scan(c, lnum, 0, c->dbg_buf); 661*1e51764aSArtem Bityutskiy if (IS_ERR(sleb)) { 662*1e51764aSArtem Bityutskiy ubifs_err("scan error %d", (int)PTR_ERR(sleb)); 663*1e51764aSArtem Bityutskiy return; 664*1e51764aSArtem Bityutskiy } 665*1e51764aSArtem Bityutskiy 666*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "LEB %d has %d nodes ending at %d\n", lnum, 667*1e51764aSArtem Bityutskiy sleb->nodes_cnt, sleb->endpt); 668*1e51764aSArtem Bityutskiy 669*1e51764aSArtem Bityutskiy list_for_each_entry(snod, &sleb->nodes, list) { 670*1e51764aSArtem Bityutskiy cond_resched(); 671*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "Dumping node at LEB %d:%d len %d\n", lnum, 672*1e51764aSArtem Bityutskiy snod->offs, snod->len); 673*1e51764aSArtem Bityutskiy dbg_dump_node(c, snod->node); 674*1e51764aSArtem Bityutskiy } 675*1e51764aSArtem Bityutskiy 676*1e51764aSArtem Bityutskiy ubifs_scan_destroy(sleb); 677*1e51764aSArtem Bityutskiy return; 678*1e51764aSArtem Bityutskiy } 679*1e51764aSArtem Bityutskiy 680*1e51764aSArtem Bityutskiy void dbg_dump_znode(const struct ubifs_info *c, 681*1e51764aSArtem Bityutskiy const struct ubifs_znode *znode) 682*1e51764aSArtem Bityutskiy { 683*1e51764aSArtem Bityutskiy int n; 684*1e51764aSArtem Bityutskiy const struct ubifs_zbranch *zbr; 685*1e51764aSArtem Bityutskiy 686*1e51764aSArtem Bityutskiy spin_lock(&dbg_lock); 687*1e51764aSArtem Bityutskiy if (znode->parent) 688*1e51764aSArtem Bityutskiy zbr = &znode->parent->zbranch[znode->iip]; 689*1e51764aSArtem Bityutskiy else 690*1e51764aSArtem Bityutskiy zbr = &c->zroot; 691*1e51764aSArtem Bityutskiy 692*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "znode %p, LEB %d:%d len %d parent %p iip %d level %d" 693*1e51764aSArtem Bityutskiy " child_cnt %d flags %lx\n", znode, zbr->lnum, zbr->offs, 694*1e51764aSArtem Bityutskiy zbr->len, znode->parent, znode->iip, znode->level, 695*1e51764aSArtem Bityutskiy znode->child_cnt, znode->flags); 696*1e51764aSArtem Bityutskiy 697*1e51764aSArtem Bityutskiy if (znode->child_cnt <= 0 || znode->child_cnt > c->fanout) { 698*1e51764aSArtem Bityutskiy spin_unlock(&dbg_lock); 699*1e51764aSArtem Bityutskiy return; 700*1e51764aSArtem Bityutskiy } 701*1e51764aSArtem Bityutskiy 702*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "zbranches:\n"); 703*1e51764aSArtem Bityutskiy for (n = 0; n < znode->child_cnt; n++) { 704*1e51764aSArtem Bityutskiy zbr = &znode->zbranch[n]; 705*1e51764aSArtem Bityutskiy if (znode->level > 0) 706*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "\t%d: znode %p LEB %d:%d len %d key " 707*1e51764aSArtem Bityutskiy "%s\n", n, zbr->znode, zbr->lnum, 708*1e51764aSArtem Bityutskiy zbr->offs, zbr->len, 709*1e51764aSArtem Bityutskiy DBGKEY(&zbr->key)); 710*1e51764aSArtem Bityutskiy else 711*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "\t%d: LNC %p LEB %d:%d len %d key " 712*1e51764aSArtem Bityutskiy "%s\n", n, zbr->znode, zbr->lnum, 713*1e51764aSArtem Bityutskiy zbr->offs, zbr->len, 714*1e51764aSArtem Bityutskiy DBGKEY(&zbr->key)); 715*1e51764aSArtem Bityutskiy } 716*1e51764aSArtem Bityutskiy spin_unlock(&dbg_lock); 717*1e51764aSArtem Bityutskiy } 718*1e51764aSArtem Bityutskiy 719*1e51764aSArtem Bityutskiy void dbg_dump_heap(struct ubifs_info *c, struct ubifs_lpt_heap *heap, int cat) 720*1e51764aSArtem Bityutskiy { 721*1e51764aSArtem Bityutskiy int i; 722*1e51764aSArtem Bityutskiy 723*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "Dumping heap cat %d (%d elements)\n", 724*1e51764aSArtem Bityutskiy cat, heap->cnt); 725*1e51764aSArtem Bityutskiy for (i = 0; i < heap->cnt; i++) { 726*1e51764aSArtem Bityutskiy struct ubifs_lprops *lprops = heap->arr[i]; 727*1e51764aSArtem Bityutskiy 728*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "\t%d. LEB %d hpos %d free %d dirty %d " 729*1e51764aSArtem Bityutskiy "flags %d\n", i, lprops->lnum, lprops->hpos, 730*1e51764aSArtem Bityutskiy lprops->free, lprops->dirty, lprops->flags); 731*1e51764aSArtem Bityutskiy } 732*1e51764aSArtem Bityutskiy } 733*1e51764aSArtem Bityutskiy 734*1e51764aSArtem Bityutskiy void dbg_dump_pnode(struct ubifs_info *c, struct ubifs_pnode *pnode, 735*1e51764aSArtem Bityutskiy struct ubifs_nnode *parent, int iip) 736*1e51764aSArtem Bityutskiy { 737*1e51764aSArtem Bityutskiy int i; 738*1e51764aSArtem Bityutskiy 739*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "Dumping pnode:\n"); 740*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "\taddress %zx parent %zx cnext %zx\n", 741*1e51764aSArtem Bityutskiy (size_t)pnode, (size_t)parent, (size_t)pnode->cnext); 742*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "\tflags %lu iip %d level %d num %d\n", 743*1e51764aSArtem Bityutskiy pnode->flags, iip, pnode->level, pnode->num); 744*1e51764aSArtem Bityutskiy for (i = 0; i < UBIFS_LPT_FANOUT; i++) { 745*1e51764aSArtem Bityutskiy struct ubifs_lprops *lp = &pnode->lprops[i]; 746*1e51764aSArtem Bityutskiy 747*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "\t%d: free %d dirty %d flags %d lnum %d\n", 748*1e51764aSArtem Bityutskiy i, lp->free, lp->dirty, lp->flags, lp->lnum); 749*1e51764aSArtem Bityutskiy } 750*1e51764aSArtem Bityutskiy } 751*1e51764aSArtem Bityutskiy 752*1e51764aSArtem Bityutskiy void dbg_dump_tnc(struct ubifs_info *c) 753*1e51764aSArtem Bityutskiy { 754*1e51764aSArtem Bityutskiy struct ubifs_znode *znode; 755*1e51764aSArtem Bityutskiy int level; 756*1e51764aSArtem Bityutskiy 757*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "\n"); 758*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "Dumping the TNC tree\n"); 759*1e51764aSArtem Bityutskiy znode = ubifs_tnc_levelorder_next(c->zroot.znode, NULL); 760*1e51764aSArtem Bityutskiy level = znode->level; 761*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "== Level %d ==\n", level); 762*1e51764aSArtem Bityutskiy while (znode) { 763*1e51764aSArtem Bityutskiy if (level != znode->level) { 764*1e51764aSArtem Bityutskiy level = znode->level; 765*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "== Level %d ==\n", level); 766*1e51764aSArtem Bityutskiy } 767*1e51764aSArtem Bityutskiy dbg_dump_znode(c, znode); 768*1e51764aSArtem Bityutskiy znode = ubifs_tnc_levelorder_next(c->zroot.znode, znode); 769*1e51764aSArtem Bityutskiy } 770*1e51764aSArtem Bityutskiy 771*1e51764aSArtem Bityutskiy printk(KERN_DEBUG "\n"); 772*1e51764aSArtem Bityutskiy } 773*1e51764aSArtem Bityutskiy 774*1e51764aSArtem Bityutskiy static int dump_znode(struct ubifs_info *c, struct ubifs_znode *znode, 775*1e51764aSArtem Bityutskiy void *priv) 776*1e51764aSArtem Bityutskiy { 777*1e51764aSArtem Bityutskiy dbg_dump_znode(c, znode); 778*1e51764aSArtem Bityutskiy return 0; 779*1e51764aSArtem Bityutskiy } 780*1e51764aSArtem Bityutskiy 781*1e51764aSArtem Bityutskiy /** 782*1e51764aSArtem Bityutskiy * dbg_dump_index - dump the on-flash index. 783*1e51764aSArtem Bityutskiy * @c: UBIFS file-system description object 784*1e51764aSArtem Bityutskiy * 785*1e51764aSArtem Bityutskiy * This function dumps whole UBIFS indexing B-tree, unlike 'dbg_dump_tnc()' 786*1e51764aSArtem Bityutskiy * which dumps only in-memory znodes and does not read znodes which from flash. 787*1e51764aSArtem Bityutskiy */ 788*1e51764aSArtem Bityutskiy void dbg_dump_index(struct ubifs_info *c) 789*1e51764aSArtem Bityutskiy { 790*1e51764aSArtem Bityutskiy dbg_walk_index(c, NULL, dump_znode, NULL); 791*1e51764aSArtem Bityutskiy } 792*1e51764aSArtem Bityutskiy 793*1e51764aSArtem Bityutskiy /** 794*1e51764aSArtem Bityutskiy * dbg_check_synced_i_size - check synchronized inode size. 795*1e51764aSArtem Bityutskiy * @inode: inode to check 796*1e51764aSArtem Bityutskiy * 797*1e51764aSArtem Bityutskiy * If inode is clean, synchronized inode size has to be equivalent to current 798*1e51764aSArtem Bityutskiy * inode size. This function has to be called only for locked inodes (@i_mutex 799*1e51764aSArtem Bityutskiy * has to be locked). Returns %0 if synchronized inode size if correct, and 800*1e51764aSArtem Bityutskiy * %-EINVAL if not. 801*1e51764aSArtem Bityutskiy */ 802*1e51764aSArtem Bityutskiy int dbg_check_synced_i_size(struct inode *inode) 803*1e51764aSArtem Bityutskiy { 804*1e51764aSArtem Bityutskiy int err = 0; 805*1e51764aSArtem Bityutskiy struct ubifs_inode *ui = ubifs_inode(inode); 806*1e51764aSArtem Bityutskiy 807*1e51764aSArtem Bityutskiy if (!(ubifs_chk_flags & UBIFS_CHK_GEN)) 808*1e51764aSArtem Bityutskiy return 0; 809*1e51764aSArtem Bityutskiy if (!S_ISREG(inode->i_mode)) 810*1e51764aSArtem Bityutskiy return 0; 811*1e51764aSArtem Bityutskiy 812*1e51764aSArtem Bityutskiy mutex_lock(&ui->ui_mutex); 813*1e51764aSArtem Bityutskiy spin_lock(&ui->ui_lock); 814*1e51764aSArtem Bityutskiy if (ui->ui_size != ui->synced_i_size && !ui->dirty) { 815*1e51764aSArtem Bityutskiy ubifs_err("ui_size is %lld, synced_i_size is %lld, but inode " 816*1e51764aSArtem Bityutskiy "is clean", ui->ui_size, ui->synced_i_size); 817*1e51764aSArtem Bityutskiy ubifs_err("i_ino %lu, i_mode %#x, i_size %lld", inode->i_ino, 818*1e51764aSArtem Bityutskiy inode->i_mode, i_size_read(inode)); 819*1e51764aSArtem Bityutskiy dbg_dump_stack(); 820*1e51764aSArtem Bityutskiy err = -EINVAL; 821*1e51764aSArtem Bityutskiy } 822*1e51764aSArtem Bityutskiy spin_unlock(&ui->ui_lock); 823*1e51764aSArtem Bityutskiy mutex_unlock(&ui->ui_mutex); 824*1e51764aSArtem Bityutskiy return err; 825*1e51764aSArtem Bityutskiy } 826*1e51764aSArtem Bityutskiy 827*1e51764aSArtem Bityutskiy /* 828*1e51764aSArtem Bityutskiy * dbg_check_dir - check directory inode size and link count. 829*1e51764aSArtem Bityutskiy * @c: UBIFS file-system description object 830*1e51764aSArtem Bityutskiy * @dir: the directory to calculate size for 831*1e51764aSArtem Bityutskiy * @size: the result is returned here 832*1e51764aSArtem Bityutskiy * 833*1e51764aSArtem Bityutskiy * This function makes sure that directory size and link count are correct. 834*1e51764aSArtem Bityutskiy * Returns zero in case of success and a negative error code in case of 835*1e51764aSArtem Bityutskiy * failure. 836*1e51764aSArtem Bityutskiy * 837*1e51764aSArtem Bityutskiy * Note, it is good idea to make sure the @dir->i_mutex is locked before 838*1e51764aSArtem Bityutskiy * calling this function. 839*1e51764aSArtem Bityutskiy */ 840*1e51764aSArtem Bityutskiy int dbg_check_dir_size(struct ubifs_info *c, const struct inode *dir) 841*1e51764aSArtem Bityutskiy { 842*1e51764aSArtem Bityutskiy unsigned int nlink = 2; 843*1e51764aSArtem Bityutskiy union ubifs_key key; 844*1e51764aSArtem Bityutskiy struct ubifs_dent_node *dent, *pdent = NULL; 845*1e51764aSArtem Bityutskiy struct qstr nm = { .name = NULL }; 846*1e51764aSArtem Bityutskiy loff_t size = UBIFS_INO_NODE_SZ; 847*1e51764aSArtem Bityutskiy 848*1e51764aSArtem Bityutskiy if (!(ubifs_chk_flags & UBIFS_CHK_GEN)) 849*1e51764aSArtem Bityutskiy return 0; 850*1e51764aSArtem Bityutskiy 851*1e51764aSArtem Bityutskiy if (!S_ISDIR(dir->i_mode)) 852*1e51764aSArtem Bityutskiy return 0; 853*1e51764aSArtem Bityutskiy 854*1e51764aSArtem Bityutskiy lowest_dent_key(c, &key, dir->i_ino); 855*1e51764aSArtem Bityutskiy while (1) { 856*1e51764aSArtem Bityutskiy int err; 857*1e51764aSArtem Bityutskiy 858*1e51764aSArtem Bityutskiy dent = ubifs_tnc_next_ent(c, &key, &nm); 859*1e51764aSArtem Bityutskiy if (IS_ERR(dent)) { 860*1e51764aSArtem Bityutskiy err = PTR_ERR(dent); 861*1e51764aSArtem Bityutskiy if (err == -ENOENT) 862*1e51764aSArtem Bityutskiy break; 863*1e51764aSArtem Bityutskiy return err; 864*1e51764aSArtem Bityutskiy } 865*1e51764aSArtem Bityutskiy 866*1e51764aSArtem Bityutskiy nm.name = dent->name; 867*1e51764aSArtem Bityutskiy nm.len = le16_to_cpu(dent->nlen); 868*1e51764aSArtem Bityutskiy size += CALC_DENT_SIZE(nm.len); 869*1e51764aSArtem Bityutskiy if (dent->type == UBIFS_ITYPE_DIR) 870*1e51764aSArtem Bityutskiy nlink += 1; 871*1e51764aSArtem Bityutskiy kfree(pdent); 872*1e51764aSArtem Bityutskiy pdent = dent; 873*1e51764aSArtem Bityutskiy key_read(c, &dent->key, &key); 874*1e51764aSArtem Bityutskiy } 875*1e51764aSArtem Bityutskiy kfree(pdent); 876*1e51764aSArtem Bityutskiy 877*1e51764aSArtem Bityutskiy if (i_size_read(dir) != size) { 878*1e51764aSArtem Bityutskiy ubifs_err("directory inode %lu has size %llu, " 879*1e51764aSArtem Bityutskiy "but calculated size is %llu", dir->i_ino, 880*1e51764aSArtem Bityutskiy (unsigned long long)i_size_read(dir), 881*1e51764aSArtem Bityutskiy (unsigned long long)size); 882*1e51764aSArtem Bityutskiy dump_stack(); 883*1e51764aSArtem Bityutskiy return -EINVAL; 884*1e51764aSArtem Bityutskiy } 885*1e51764aSArtem Bityutskiy if (dir->i_nlink != nlink) { 886*1e51764aSArtem Bityutskiy ubifs_err("directory inode %lu has nlink %u, but calculated " 887*1e51764aSArtem Bityutskiy "nlink is %u", dir->i_ino, dir->i_nlink, nlink); 888*1e51764aSArtem Bityutskiy dump_stack(); 889*1e51764aSArtem Bityutskiy return -EINVAL; 890*1e51764aSArtem Bityutskiy } 891*1e51764aSArtem Bityutskiy 892*1e51764aSArtem Bityutskiy return 0; 893*1e51764aSArtem Bityutskiy } 894*1e51764aSArtem Bityutskiy 895*1e51764aSArtem Bityutskiy /** 896*1e51764aSArtem Bityutskiy * dbg_check_key_order - make sure that colliding keys are properly ordered. 897*1e51764aSArtem Bityutskiy * @c: UBIFS file-system description object 898*1e51764aSArtem Bityutskiy * @zbr1: first zbranch 899*1e51764aSArtem Bityutskiy * @zbr2: following zbranch 900*1e51764aSArtem Bityutskiy * 901*1e51764aSArtem Bityutskiy * In UBIFS indexing B-tree colliding keys has to be sorted in binary order of 902*1e51764aSArtem Bityutskiy * names of the direntries/xentries which are referred by the keys. This 903*1e51764aSArtem Bityutskiy * function reads direntries/xentries referred by @zbr1 and @zbr2 and makes 904*1e51764aSArtem Bityutskiy * sure the name of direntry/xentry referred by @zbr1 is less than 905*1e51764aSArtem Bityutskiy * direntry/xentry referred by @zbr2. Returns zero if this is true, %1 if not, 906*1e51764aSArtem Bityutskiy * and a negative error code in case of failure. 907*1e51764aSArtem Bityutskiy */ 908*1e51764aSArtem Bityutskiy static int dbg_check_key_order(struct ubifs_info *c, struct ubifs_zbranch *zbr1, 909*1e51764aSArtem Bityutskiy struct ubifs_zbranch *zbr2) 910*1e51764aSArtem Bityutskiy { 911*1e51764aSArtem Bityutskiy int err, nlen1, nlen2, cmp; 912*1e51764aSArtem Bityutskiy struct ubifs_dent_node *dent1, *dent2; 913*1e51764aSArtem Bityutskiy union ubifs_key key; 914*1e51764aSArtem Bityutskiy 915*1e51764aSArtem Bityutskiy ubifs_assert(!keys_cmp(c, &zbr1->key, &zbr2->key)); 916*1e51764aSArtem Bityutskiy dent1 = kmalloc(UBIFS_MAX_DENT_NODE_SZ, GFP_NOFS); 917*1e51764aSArtem Bityutskiy if (!dent1) 918*1e51764aSArtem Bityutskiy return -ENOMEM; 919*1e51764aSArtem Bityutskiy dent2 = kmalloc(UBIFS_MAX_DENT_NODE_SZ, GFP_NOFS); 920*1e51764aSArtem Bityutskiy if (!dent2) { 921*1e51764aSArtem Bityutskiy err = -ENOMEM; 922*1e51764aSArtem Bityutskiy goto out_free; 923*1e51764aSArtem Bityutskiy } 924*1e51764aSArtem Bityutskiy 925*1e51764aSArtem Bityutskiy err = ubifs_tnc_read_node(c, zbr1, dent1); 926*1e51764aSArtem Bityutskiy if (err) 927*1e51764aSArtem Bityutskiy goto out_free; 928*1e51764aSArtem Bityutskiy err = ubifs_validate_entry(c, dent1); 929*1e51764aSArtem Bityutskiy if (err) 930*1e51764aSArtem Bityutskiy goto out_free; 931*1e51764aSArtem Bityutskiy 932*1e51764aSArtem Bityutskiy err = ubifs_tnc_read_node(c, zbr2, dent2); 933*1e51764aSArtem Bityutskiy if (err) 934*1e51764aSArtem Bityutskiy goto out_free; 935*1e51764aSArtem Bityutskiy err = ubifs_validate_entry(c, dent2); 936*1e51764aSArtem Bityutskiy if (err) 937*1e51764aSArtem Bityutskiy goto out_free; 938*1e51764aSArtem Bityutskiy 939*1e51764aSArtem Bityutskiy /* Make sure node keys are the same as in zbranch */ 940*1e51764aSArtem Bityutskiy err = 1; 941*1e51764aSArtem Bityutskiy key_read(c, &dent1->key, &key); 942*1e51764aSArtem Bityutskiy if (keys_cmp(c, &zbr1->key, &key)) { 943*1e51764aSArtem Bityutskiy dbg_err("1st entry at %d:%d has key %s", zbr1->lnum, 944*1e51764aSArtem Bityutskiy zbr1->offs, DBGKEY(&key)); 945*1e51764aSArtem Bityutskiy dbg_err("but it should have key %s according to tnc", 946*1e51764aSArtem Bityutskiy DBGKEY(&zbr1->key)); 947*1e51764aSArtem Bityutskiy dbg_dump_node(c, dent1); 948*1e51764aSArtem Bityutskiy goto out_free; 949*1e51764aSArtem Bityutskiy } 950*1e51764aSArtem Bityutskiy 951*1e51764aSArtem Bityutskiy key_read(c, &dent2->key, &key); 952*1e51764aSArtem Bityutskiy if (keys_cmp(c, &zbr2->key, &key)) { 953*1e51764aSArtem Bityutskiy dbg_err("2nd entry at %d:%d has key %s", zbr1->lnum, 954*1e51764aSArtem Bityutskiy zbr1->offs, DBGKEY(&key)); 955*1e51764aSArtem Bityutskiy dbg_err("but it should have key %s according to tnc", 956*1e51764aSArtem Bityutskiy DBGKEY(&zbr2->key)); 957*1e51764aSArtem Bityutskiy dbg_dump_node(c, dent2); 958*1e51764aSArtem Bityutskiy goto out_free; 959*1e51764aSArtem Bityutskiy } 960*1e51764aSArtem Bityutskiy 961*1e51764aSArtem Bityutskiy nlen1 = le16_to_cpu(dent1->nlen); 962*1e51764aSArtem Bityutskiy nlen2 = le16_to_cpu(dent2->nlen); 963*1e51764aSArtem Bityutskiy 964*1e51764aSArtem Bityutskiy cmp = memcmp(dent1->name, dent2->name, min_t(int, nlen1, nlen2)); 965*1e51764aSArtem Bityutskiy if (cmp < 0 || (cmp == 0 && nlen1 < nlen2)) { 966*1e51764aSArtem Bityutskiy err = 0; 967*1e51764aSArtem Bityutskiy goto out_free; 968*1e51764aSArtem Bityutskiy } 969*1e51764aSArtem Bityutskiy if (cmp == 0 && nlen1 == nlen2) 970*1e51764aSArtem Bityutskiy dbg_err("2 xent/dent nodes with the same name"); 971*1e51764aSArtem Bityutskiy else 972*1e51764aSArtem Bityutskiy dbg_err("bad order of colliding key %s", 973*1e51764aSArtem Bityutskiy DBGKEY(&key)); 974*1e51764aSArtem Bityutskiy 975*1e51764aSArtem Bityutskiy dbg_msg("first node at %d:%d\n", zbr1->lnum, zbr1->offs); 976*1e51764aSArtem Bityutskiy dbg_dump_node(c, dent1); 977*1e51764aSArtem Bityutskiy dbg_msg("second node at %d:%d\n", zbr2->lnum, zbr2->offs); 978*1e51764aSArtem Bityutskiy dbg_dump_node(c, dent2); 979*1e51764aSArtem Bityutskiy 980*1e51764aSArtem Bityutskiy out_free: 981*1e51764aSArtem Bityutskiy kfree(dent2); 982*1e51764aSArtem Bityutskiy kfree(dent1); 983*1e51764aSArtem Bityutskiy return err; 984*1e51764aSArtem Bityutskiy } 985*1e51764aSArtem Bityutskiy 986*1e51764aSArtem Bityutskiy /** 987*1e51764aSArtem Bityutskiy * dbg_check_znode - check if znode is all right. 988*1e51764aSArtem Bityutskiy * @c: UBIFS file-system description object 989*1e51764aSArtem Bityutskiy * @zbr: zbranch which points to this znode 990*1e51764aSArtem Bityutskiy * 991*1e51764aSArtem Bityutskiy * This function makes sure that znode referred to by @zbr is all right. 992*1e51764aSArtem Bityutskiy * Returns zero if it is, and %-EINVAL if it is not. 993*1e51764aSArtem Bityutskiy */ 994*1e51764aSArtem Bityutskiy static int dbg_check_znode(struct ubifs_info *c, struct ubifs_zbranch *zbr) 995*1e51764aSArtem Bityutskiy { 996*1e51764aSArtem Bityutskiy struct ubifs_znode *znode = zbr->znode; 997*1e51764aSArtem Bityutskiy struct ubifs_znode *zp = znode->parent; 998*1e51764aSArtem Bityutskiy int n, err, cmp; 999*1e51764aSArtem Bityutskiy 1000*1e51764aSArtem Bityutskiy if (znode->child_cnt <= 0 || znode->child_cnt > c->fanout) { 1001*1e51764aSArtem Bityutskiy err = 1; 1002*1e51764aSArtem Bityutskiy goto out; 1003*1e51764aSArtem Bityutskiy } 1004*1e51764aSArtem Bityutskiy if (znode->level < 0) { 1005*1e51764aSArtem Bityutskiy err = 2; 1006*1e51764aSArtem Bityutskiy goto out; 1007*1e51764aSArtem Bityutskiy } 1008*1e51764aSArtem Bityutskiy if (znode->iip < 0 || znode->iip >= c->fanout) { 1009*1e51764aSArtem Bityutskiy err = 3; 1010*1e51764aSArtem Bityutskiy goto out; 1011*1e51764aSArtem Bityutskiy } 1012*1e51764aSArtem Bityutskiy 1013*1e51764aSArtem Bityutskiy if (zbr->len == 0) 1014*1e51764aSArtem Bityutskiy /* Only dirty zbranch may have no on-flash nodes */ 1015*1e51764aSArtem Bityutskiy if (!ubifs_zn_dirty(znode)) { 1016*1e51764aSArtem Bityutskiy err = 4; 1017*1e51764aSArtem Bityutskiy goto out; 1018*1e51764aSArtem Bityutskiy } 1019*1e51764aSArtem Bityutskiy 1020*1e51764aSArtem Bityutskiy if (ubifs_zn_dirty(znode)) { 1021*1e51764aSArtem Bityutskiy /* 1022*1e51764aSArtem Bityutskiy * If znode is dirty, its parent has to be dirty as well. The 1023*1e51764aSArtem Bityutskiy * order of the operation is important, so we have to have 1024*1e51764aSArtem Bityutskiy * memory barriers. 1025*1e51764aSArtem Bityutskiy */ 1026*1e51764aSArtem Bityutskiy smp_mb(); 1027*1e51764aSArtem Bityutskiy if (zp && !ubifs_zn_dirty(zp)) { 1028*1e51764aSArtem Bityutskiy /* 1029*1e51764aSArtem Bityutskiy * The dirty flag is atomic and is cleared outside the 1030*1e51764aSArtem Bityutskiy * TNC mutex, so znode's dirty flag may now have 1031*1e51764aSArtem Bityutskiy * been cleared. The child is always cleared before the 1032*1e51764aSArtem Bityutskiy * parent, so we just need to check again. 1033*1e51764aSArtem Bityutskiy */ 1034*1e51764aSArtem Bityutskiy smp_mb(); 1035*1e51764aSArtem Bityutskiy if (ubifs_zn_dirty(znode)) { 1036*1e51764aSArtem Bityutskiy err = 5; 1037*1e51764aSArtem Bityutskiy goto out; 1038*1e51764aSArtem Bityutskiy } 1039*1e51764aSArtem Bityutskiy } 1040*1e51764aSArtem Bityutskiy } 1041*1e51764aSArtem Bityutskiy 1042*1e51764aSArtem Bityutskiy if (zp) { 1043*1e51764aSArtem Bityutskiy const union ubifs_key *min, *max; 1044*1e51764aSArtem Bityutskiy 1045*1e51764aSArtem Bityutskiy if (znode->level != zp->level - 1) { 1046*1e51764aSArtem Bityutskiy err = 6; 1047*1e51764aSArtem Bityutskiy goto out; 1048*1e51764aSArtem Bityutskiy } 1049*1e51764aSArtem Bityutskiy 1050*1e51764aSArtem Bityutskiy /* Make sure the 'parent' pointer in our znode is correct */ 1051*1e51764aSArtem Bityutskiy err = ubifs_search_zbranch(c, zp, &zbr->key, &n); 1052*1e51764aSArtem Bityutskiy if (!err) { 1053*1e51764aSArtem Bityutskiy /* This zbranch does not exist in the parent */ 1054*1e51764aSArtem Bityutskiy err = 7; 1055*1e51764aSArtem Bityutskiy goto out; 1056*1e51764aSArtem Bityutskiy } 1057*1e51764aSArtem Bityutskiy 1058*1e51764aSArtem Bityutskiy if (znode->iip >= zp->child_cnt) { 1059*1e51764aSArtem Bityutskiy err = 8; 1060*1e51764aSArtem Bityutskiy goto out; 1061*1e51764aSArtem Bityutskiy } 1062*1e51764aSArtem Bityutskiy 1063*1e51764aSArtem Bityutskiy if (znode->iip != n) { 1064*1e51764aSArtem Bityutskiy /* This may happen only in case of collisions */ 1065*1e51764aSArtem Bityutskiy if (keys_cmp(c, &zp->zbranch[n].key, 1066*1e51764aSArtem Bityutskiy &zp->zbranch[znode->iip].key)) { 1067*1e51764aSArtem Bityutskiy err = 9; 1068*1e51764aSArtem Bityutskiy goto out; 1069*1e51764aSArtem Bityutskiy } 1070*1e51764aSArtem Bityutskiy n = znode->iip; 1071*1e51764aSArtem Bityutskiy } 1072*1e51764aSArtem Bityutskiy 1073*1e51764aSArtem Bityutskiy /* 1074*1e51764aSArtem Bityutskiy * Make sure that the first key in our znode is greater than or 1075*1e51764aSArtem Bityutskiy * equal to the key in the pointing zbranch. 1076*1e51764aSArtem Bityutskiy */ 1077*1e51764aSArtem Bityutskiy min = &zbr->key; 1078*1e51764aSArtem Bityutskiy cmp = keys_cmp(c, min, &znode->zbranch[0].key); 1079*1e51764aSArtem Bityutskiy if (cmp == 1) { 1080*1e51764aSArtem Bityutskiy err = 10; 1081*1e51764aSArtem Bityutskiy goto out; 1082*1e51764aSArtem Bityutskiy } 1083*1e51764aSArtem Bityutskiy 1084*1e51764aSArtem Bityutskiy if (n + 1 < zp->child_cnt) { 1085*1e51764aSArtem Bityutskiy max = &zp->zbranch[n + 1].key; 1086*1e51764aSArtem Bityutskiy 1087*1e51764aSArtem Bityutskiy /* 1088*1e51764aSArtem Bityutskiy * Make sure the last key in our znode is less or 1089*1e51764aSArtem Bityutskiy * equivalent than the the key in zbranch which goes 1090*1e51764aSArtem Bityutskiy * after our pointing zbranch. 1091*1e51764aSArtem Bityutskiy */ 1092*1e51764aSArtem Bityutskiy cmp = keys_cmp(c, max, 1093*1e51764aSArtem Bityutskiy &znode->zbranch[znode->child_cnt - 1].key); 1094*1e51764aSArtem Bityutskiy if (cmp == -1) { 1095*1e51764aSArtem Bityutskiy err = 11; 1096*1e51764aSArtem Bityutskiy goto out; 1097*1e51764aSArtem Bityutskiy } 1098*1e51764aSArtem Bityutskiy } 1099*1e51764aSArtem Bityutskiy } else { 1100*1e51764aSArtem Bityutskiy /* This may only be root znode */ 1101*1e51764aSArtem Bityutskiy if (zbr != &c->zroot) { 1102*1e51764aSArtem Bityutskiy err = 12; 1103*1e51764aSArtem Bityutskiy goto out; 1104*1e51764aSArtem Bityutskiy } 1105*1e51764aSArtem Bityutskiy } 1106*1e51764aSArtem Bityutskiy 1107*1e51764aSArtem Bityutskiy /* 1108*1e51764aSArtem Bityutskiy * Make sure that next key is greater or equivalent then the previous 1109*1e51764aSArtem Bityutskiy * one. 1110*1e51764aSArtem Bityutskiy */ 1111*1e51764aSArtem Bityutskiy for (n = 1; n < znode->child_cnt; n++) { 1112*1e51764aSArtem Bityutskiy cmp = keys_cmp(c, &znode->zbranch[n - 1].key, 1113*1e51764aSArtem Bityutskiy &znode->zbranch[n].key); 1114*1e51764aSArtem Bityutskiy if (cmp > 0) { 1115*1e51764aSArtem Bityutskiy err = 13; 1116*1e51764aSArtem Bityutskiy goto out; 1117*1e51764aSArtem Bityutskiy } 1118*1e51764aSArtem Bityutskiy if (cmp == 0) { 1119*1e51764aSArtem Bityutskiy /* This can only be keys with colliding hash */ 1120*1e51764aSArtem Bityutskiy if (!is_hash_key(c, &znode->zbranch[n].key)) { 1121*1e51764aSArtem Bityutskiy err = 14; 1122*1e51764aSArtem Bityutskiy goto out; 1123*1e51764aSArtem Bityutskiy } 1124*1e51764aSArtem Bityutskiy 1125*1e51764aSArtem Bityutskiy if (znode->level != 0 || c->replaying) 1126*1e51764aSArtem Bityutskiy continue; 1127*1e51764aSArtem Bityutskiy 1128*1e51764aSArtem Bityutskiy /* 1129*1e51764aSArtem Bityutskiy * Colliding keys should follow binary order of 1130*1e51764aSArtem Bityutskiy * corresponding xentry/dentry names. 1131*1e51764aSArtem Bityutskiy */ 1132*1e51764aSArtem Bityutskiy err = dbg_check_key_order(c, &znode->zbranch[n - 1], 1133*1e51764aSArtem Bityutskiy &znode->zbranch[n]); 1134*1e51764aSArtem Bityutskiy if (err < 0) 1135*1e51764aSArtem Bityutskiy return err; 1136*1e51764aSArtem Bityutskiy if (err) { 1137*1e51764aSArtem Bityutskiy err = 15; 1138*1e51764aSArtem Bityutskiy goto out; 1139*1e51764aSArtem Bityutskiy } 1140*1e51764aSArtem Bityutskiy } 1141*1e51764aSArtem Bityutskiy } 1142*1e51764aSArtem Bityutskiy 1143*1e51764aSArtem Bityutskiy for (n = 0; n < znode->child_cnt; n++) { 1144*1e51764aSArtem Bityutskiy if (!znode->zbranch[n].znode && 1145*1e51764aSArtem Bityutskiy (znode->zbranch[n].lnum == 0 || 1146*1e51764aSArtem Bityutskiy znode->zbranch[n].len == 0)) { 1147*1e51764aSArtem Bityutskiy err = 16; 1148*1e51764aSArtem Bityutskiy goto out; 1149*1e51764aSArtem Bityutskiy } 1150*1e51764aSArtem Bityutskiy 1151*1e51764aSArtem Bityutskiy if (znode->zbranch[n].lnum != 0 && 1152*1e51764aSArtem Bityutskiy znode->zbranch[n].len == 0) { 1153*1e51764aSArtem Bityutskiy err = 17; 1154*1e51764aSArtem Bityutskiy goto out; 1155*1e51764aSArtem Bityutskiy } 1156*1e51764aSArtem Bityutskiy 1157*1e51764aSArtem Bityutskiy if (znode->zbranch[n].lnum == 0 && 1158*1e51764aSArtem Bityutskiy znode->zbranch[n].len != 0) { 1159*1e51764aSArtem Bityutskiy err = 18; 1160*1e51764aSArtem Bityutskiy goto out; 1161*1e51764aSArtem Bityutskiy } 1162*1e51764aSArtem Bityutskiy 1163*1e51764aSArtem Bityutskiy if (znode->zbranch[n].lnum == 0 && 1164*1e51764aSArtem Bityutskiy znode->zbranch[n].offs != 0) { 1165*1e51764aSArtem Bityutskiy err = 19; 1166*1e51764aSArtem Bityutskiy goto out; 1167*1e51764aSArtem Bityutskiy } 1168*1e51764aSArtem Bityutskiy 1169*1e51764aSArtem Bityutskiy if (znode->level != 0 && znode->zbranch[n].znode) 1170*1e51764aSArtem Bityutskiy if (znode->zbranch[n].znode->parent != znode) { 1171*1e51764aSArtem Bityutskiy err = 20; 1172*1e51764aSArtem Bityutskiy goto out; 1173*1e51764aSArtem Bityutskiy } 1174*1e51764aSArtem Bityutskiy } 1175*1e51764aSArtem Bityutskiy 1176*1e51764aSArtem Bityutskiy return 0; 1177*1e51764aSArtem Bityutskiy 1178*1e51764aSArtem Bityutskiy out: 1179*1e51764aSArtem Bityutskiy ubifs_err("failed, error %d", err); 1180*1e51764aSArtem Bityutskiy ubifs_msg("dump of the znode"); 1181*1e51764aSArtem Bityutskiy dbg_dump_znode(c, znode); 1182*1e51764aSArtem Bityutskiy if (zp) { 1183*1e51764aSArtem Bityutskiy ubifs_msg("dump of the parent znode"); 1184*1e51764aSArtem Bityutskiy dbg_dump_znode(c, zp); 1185*1e51764aSArtem Bityutskiy } 1186*1e51764aSArtem Bityutskiy dump_stack(); 1187*1e51764aSArtem Bityutskiy return -EINVAL; 1188*1e51764aSArtem Bityutskiy } 1189*1e51764aSArtem Bityutskiy 1190*1e51764aSArtem Bityutskiy /** 1191*1e51764aSArtem Bityutskiy * dbg_check_tnc - check TNC tree. 1192*1e51764aSArtem Bityutskiy * @c: UBIFS file-system description object 1193*1e51764aSArtem Bityutskiy * @extra: do extra checks that are possible at start commit 1194*1e51764aSArtem Bityutskiy * 1195*1e51764aSArtem Bityutskiy * This function traverses whole TNC tree and checks every znode. Returns zero 1196*1e51764aSArtem Bityutskiy * if everything is all right and %-EINVAL if something is wrong with TNC. 1197*1e51764aSArtem Bityutskiy */ 1198*1e51764aSArtem Bityutskiy int dbg_check_tnc(struct ubifs_info *c, int extra) 1199*1e51764aSArtem Bityutskiy { 1200*1e51764aSArtem Bityutskiy struct ubifs_znode *znode; 1201*1e51764aSArtem Bityutskiy long clean_cnt = 0, dirty_cnt = 0; 1202*1e51764aSArtem Bityutskiy int err, last; 1203*1e51764aSArtem Bityutskiy 1204*1e51764aSArtem Bityutskiy if (!(ubifs_chk_flags & UBIFS_CHK_TNC)) 1205*1e51764aSArtem Bityutskiy return 0; 1206*1e51764aSArtem Bityutskiy 1207*1e51764aSArtem Bityutskiy ubifs_assert(mutex_is_locked(&c->tnc_mutex)); 1208*1e51764aSArtem Bityutskiy if (!c->zroot.znode) 1209*1e51764aSArtem Bityutskiy return 0; 1210*1e51764aSArtem Bityutskiy 1211*1e51764aSArtem Bityutskiy znode = ubifs_tnc_postorder_first(c->zroot.znode); 1212*1e51764aSArtem Bityutskiy while (1) { 1213*1e51764aSArtem Bityutskiy struct ubifs_znode *prev; 1214*1e51764aSArtem Bityutskiy struct ubifs_zbranch *zbr; 1215*1e51764aSArtem Bityutskiy 1216*1e51764aSArtem Bityutskiy if (!znode->parent) 1217*1e51764aSArtem Bityutskiy zbr = &c->zroot; 1218*1e51764aSArtem Bityutskiy else 1219*1e51764aSArtem Bityutskiy zbr = &znode->parent->zbranch[znode->iip]; 1220*1e51764aSArtem Bityutskiy 1221*1e51764aSArtem Bityutskiy err = dbg_check_znode(c, zbr); 1222*1e51764aSArtem Bityutskiy if (err) 1223*1e51764aSArtem Bityutskiy return err; 1224*1e51764aSArtem Bityutskiy 1225*1e51764aSArtem Bityutskiy if (extra) { 1226*1e51764aSArtem Bityutskiy if (ubifs_zn_dirty(znode)) 1227*1e51764aSArtem Bityutskiy dirty_cnt += 1; 1228*1e51764aSArtem Bityutskiy else 1229*1e51764aSArtem Bityutskiy clean_cnt += 1; 1230*1e51764aSArtem Bityutskiy } 1231*1e51764aSArtem Bityutskiy 1232*1e51764aSArtem Bityutskiy prev = znode; 1233*1e51764aSArtem Bityutskiy znode = ubifs_tnc_postorder_next(znode); 1234*1e51764aSArtem Bityutskiy if (!znode) 1235*1e51764aSArtem Bityutskiy break; 1236*1e51764aSArtem Bityutskiy 1237*1e51764aSArtem Bityutskiy /* 1238*1e51764aSArtem Bityutskiy * If the last key of this znode is equivalent to the first key 1239*1e51764aSArtem Bityutskiy * of the next znode (collision), then check order of the keys. 1240*1e51764aSArtem Bityutskiy */ 1241*1e51764aSArtem Bityutskiy last = prev->child_cnt - 1; 1242*1e51764aSArtem Bityutskiy if (prev->level == 0 && znode->level == 0 && !c->replaying && 1243*1e51764aSArtem Bityutskiy !keys_cmp(c, &prev->zbranch[last].key, 1244*1e51764aSArtem Bityutskiy &znode->zbranch[0].key)) { 1245*1e51764aSArtem Bityutskiy err = dbg_check_key_order(c, &prev->zbranch[last], 1246*1e51764aSArtem Bityutskiy &znode->zbranch[0]); 1247*1e51764aSArtem Bityutskiy if (err < 0) 1248*1e51764aSArtem Bityutskiy return err; 1249*1e51764aSArtem Bityutskiy if (err) { 1250*1e51764aSArtem Bityutskiy ubifs_msg("first znode"); 1251*1e51764aSArtem Bityutskiy dbg_dump_znode(c, prev); 1252*1e51764aSArtem Bityutskiy ubifs_msg("second znode"); 1253*1e51764aSArtem Bityutskiy dbg_dump_znode(c, znode); 1254*1e51764aSArtem Bityutskiy return -EINVAL; 1255*1e51764aSArtem Bityutskiy } 1256*1e51764aSArtem Bityutskiy } 1257*1e51764aSArtem Bityutskiy } 1258*1e51764aSArtem Bityutskiy 1259*1e51764aSArtem Bityutskiy if (extra) { 1260*1e51764aSArtem Bityutskiy if (clean_cnt != atomic_long_read(&c->clean_zn_cnt)) { 1261*1e51764aSArtem Bityutskiy ubifs_err("incorrect clean_zn_cnt %ld, calculated %ld", 1262*1e51764aSArtem Bityutskiy atomic_long_read(&c->clean_zn_cnt), 1263*1e51764aSArtem Bityutskiy clean_cnt); 1264*1e51764aSArtem Bityutskiy return -EINVAL; 1265*1e51764aSArtem Bityutskiy } 1266*1e51764aSArtem Bityutskiy if (dirty_cnt != atomic_long_read(&c->dirty_zn_cnt)) { 1267*1e51764aSArtem Bityutskiy ubifs_err("incorrect dirty_zn_cnt %ld, calculated %ld", 1268*1e51764aSArtem Bityutskiy atomic_long_read(&c->dirty_zn_cnt), 1269*1e51764aSArtem Bityutskiy dirty_cnt); 1270*1e51764aSArtem Bityutskiy return -EINVAL; 1271*1e51764aSArtem Bityutskiy } 1272*1e51764aSArtem Bityutskiy } 1273*1e51764aSArtem Bityutskiy 1274*1e51764aSArtem Bityutskiy return 0; 1275*1e51764aSArtem Bityutskiy } 1276*1e51764aSArtem Bityutskiy 1277*1e51764aSArtem Bityutskiy /** 1278*1e51764aSArtem Bityutskiy * dbg_walk_index - walk the on-flash index. 1279*1e51764aSArtem Bityutskiy * @c: UBIFS file-system description object 1280*1e51764aSArtem Bityutskiy * @leaf_cb: called for each leaf node 1281*1e51764aSArtem Bityutskiy * @znode_cb: called for each indexing node 1282*1e51764aSArtem Bityutskiy * @priv: private date which is passed to callbacks 1283*1e51764aSArtem Bityutskiy * 1284*1e51764aSArtem Bityutskiy * This function walks the UBIFS index and calls the @leaf_cb for each leaf 1285*1e51764aSArtem Bityutskiy * node and @znode_cb for each indexing node. Returns zero in case of success 1286*1e51764aSArtem Bityutskiy * and a negative error code in case of failure. 1287*1e51764aSArtem Bityutskiy * 1288*1e51764aSArtem Bityutskiy * It would be better if this function removed every znode it pulled to into 1289*1e51764aSArtem Bityutskiy * the TNC, so that the behavior more closely matched the non-debugging 1290*1e51764aSArtem Bityutskiy * behavior. 1291*1e51764aSArtem Bityutskiy */ 1292*1e51764aSArtem Bityutskiy int dbg_walk_index(struct ubifs_info *c, dbg_leaf_callback leaf_cb, 1293*1e51764aSArtem Bityutskiy dbg_znode_callback znode_cb, void *priv) 1294*1e51764aSArtem Bityutskiy { 1295*1e51764aSArtem Bityutskiy int err; 1296*1e51764aSArtem Bityutskiy struct ubifs_zbranch *zbr; 1297*1e51764aSArtem Bityutskiy struct ubifs_znode *znode, *child; 1298*1e51764aSArtem Bityutskiy 1299*1e51764aSArtem Bityutskiy mutex_lock(&c->tnc_mutex); 1300*1e51764aSArtem Bityutskiy /* If the root indexing node is not in TNC - pull it */ 1301*1e51764aSArtem Bityutskiy if (!c->zroot.znode) { 1302*1e51764aSArtem Bityutskiy c->zroot.znode = ubifs_load_znode(c, &c->zroot, NULL, 0); 1303*1e51764aSArtem Bityutskiy if (IS_ERR(c->zroot.znode)) { 1304*1e51764aSArtem Bityutskiy err = PTR_ERR(c->zroot.znode); 1305*1e51764aSArtem Bityutskiy c->zroot.znode = NULL; 1306*1e51764aSArtem Bityutskiy goto out_unlock; 1307*1e51764aSArtem Bityutskiy } 1308*1e51764aSArtem Bityutskiy } 1309*1e51764aSArtem Bityutskiy 1310*1e51764aSArtem Bityutskiy /* 1311*1e51764aSArtem Bityutskiy * We are going to traverse the indexing tree in the postorder manner. 1312*1e51764aSArtem Bityutskiy * Go down and find the leftmost indexing node where we are going to 1313*1e51764aSArtem Bityutskiy * start from. 1314*1e51764aSArtem Bityutskiy */ 1315*1e51764aSArtem Bityutskiy znode = c->zroot.znode; 1316*1e51764aSArtem Bityutskiy while (znode->level > 0) { 1317*1e51764aSArtem Bityutskiy zbr = &znode->zbranch[0]; 1318*1e51764aSArtem Bityutskiy child = zbr->znode; 1319*1e51764aSArtem Bityutskiy if (!child) { 1320*1e51764aSArtem Bityutskiy child = ubifs_load_znode(c, zbr, znode, 0); 1321*1e51764aSArtem Bityutskiy if (IS_ERR(child)) { 1322*1e51764aSArtem Bityutskiy err = PTR_ERR(child); 1323*1e51764aSArtem Bityutskiy goto out_unlock; 1324*1e51764aSArtem Bityutskiy } 1325*1e51764aSArtem Bityutskiy zbr->znode = child; 1326*1e51764aSArtem Bityutskiy } 1327*1e51764aSArtem Bityutskiy 1328*1e51764aSArtem Bityutskiy znode = child; 1329*1e51764aSArtem Bityutskiy } 1330*1e51764aSArtem Bityutskiy 1331*1e51764aSArtem Bityutskiy /* Iterate over all indexing nodes */ 1332*1e51764aSArtem Bityutskiy while (1) { 1333*1e51764aSArtem Bityutskiy int idx; 1334*1e51764aSArtem Bityutskiy 1335*1e51764aSArtem Bityutskiy cond_resched(); 1336*1e51764aSArtem Bityutskiy 1337*1e51764aSArtem Bityutskiy if (znode_cb) { 1338*1e51764aSArtem Bityutskiy err = znode_cb(c, znode, priv); 1339*1e51764aSArtem Bityutskiy if (err) { 1340*1e51764aSArtem Bityutskiy ubifs_err("znode checking function returned " 1341*1e51764aSArtem Bityutskiy "error %d", err); 1342*1e51764aSArtem Bityutskiy dbg_dump_znode(c, znode); 1343*1e51764aSArtem Bityutskiy goto out_dump; 1344*1e51764aSArtem Bityutskiy } 1345*1e51764aSArtem Bityutskiy } 1346*1e51764aSArtem Bityutskiy if (leaf_cb && znode->level == 0) { 1347*1e51764aSArtem Bityutskiy for (idx = 0; idx < znode->child_cnt; idx++) { 1348*1e51764aSArtem Bityutskiy zbr = &znode->zbranch[idx]; 1349*1e51764aSArtem Bityutskiy err = leaf_cb(c, zbr, priv); 1350*1e51764aSArtem Bityutskiy if (err) { 1351*1e51764aSArtem Bityutskiy ubifs_err("leaf checking function " 1352*1e51764aSArtem Bityutskiy "returned error %d, for leaf " 1353*1e51764aSArtem Bityutskiy "at LEB %d:%d", 1354*1e51764aSArtem Bityutskiy err, zbr->lnum, zbr->offs); 1355*1e51764aSArtem Bityutskiy goto out_dump; 1356*1e51764aSArtem Bityutskiy } 1357*1e51764aSArtem Bityutskiy } 1358*1e51764aSArtem Bityutskiy } 1359*1e51764aSArtem Bityutskiy 1360*1e51764aSArtem Bityutskiy if (!znode->parent) 1361*1e51764aSArtem Bityutskiy break; 1362*1e51764aSArtem Bityutskiy 1363*1e51764aSArtem Bityutskiy idx = znode->iip + 1; 1364*1e51764aSArtem Bityutskiy znode = znode->parent; 1365*1e51764aSArtem Bityutskiy if (idx < znode->child_cnt) { 1366*1e51764aSArtem Bityutskiy /* Switch to the next index in the parent */ 1367*1e51764aSArtem Bityutskiy zbr = &znode->zbranch[idx]; 1368*1e51764aSArtem Bityutskiy child = zbr->znode; 1369*1e51764aSArtem Bityutskiy if (!child) { 1370*1e51764aSArtem Bityutskiy child = ubifs_load_znode(c, zbr, znode, idx); 1371*1e51764aSArtem Bityutskiy if (IS_ERR(child)) { 1372*1e51764aSArtem Bityutskiy err = PTR_ERR(child); 1373*1e51764aSArtem Bityutskiy goto out_unlock; 1374*1e51764aSArtem Bityutskiy } 1375*1e51764aSArtem Bityutskiy zbr->znode = child; 1376*1e51764aSArtem Bityutskiy } 1377*1e51764aSArtem Bityutskiy znode = child; 1378*1e51764aSArtem Bityutskiy } else 1379*1e51764aSArtem Bityutskiy /* 1380*1e51764aSArtem Bityutskiy * This is the last child, switch to the parent and 1381*1e51764aSArtem Bityutskiy * continue. 1382*1e51764aSArtem Bityutskiy */ 1383*1e51764aSArtem Bityutskiy continue; 1384*1e51764aSArtem Bityutskiy 1385*1e51764aSArtem Bityutskiy /* Go to the lowest leftmost znode in the new sub-tree */ 1386*1e51764aSArtem Bityutskiy while (znode->level > 0) { 1387*1e51764aSArtem Bityutskiy zbr = &znode->zbranch[0]; 1388*1e51764aSArtem Bityutskiy child = zbr->znode; 1389*1e51764aSArtem Bityutskiy if (!child) { 1390*1e51764aSArtem Bityutskiy child = ubifs_load_znode(c, zbr, znode, 0); 1391*1e51764aSArtem Bityutskiy if (IS_ERR(child)) { 1392*1e51764aSArtem Bityutskiy err = PTR_ERR(child); 1393*1e51764aSArtem Bityutskiy goto out_unlock; 1394*1e51764aSArtem Bityutskiy } 1395*1e51764aSArtem Bityutskiy zbr->znode = child; 1396*1e51764aSArtem Bityutskiy } 1397*1e51764aSArtem Bityutskiy znode = child; 1398*1e51764aSArtem Bityutskiy } 1399*1e51764aSArtem Bityutskiy } 1400*1e51764aSArtem Bityutskiy 1401*1e51764aSArtem Bityutskiy mutex_unlock(&c->tnc_mutex); 1402*1e51764aSArtem Bityutskiy return 0; 1403*1e51764aSArtem Bityutskiy 1404*1e51764aSArtem Bityutskiy out_dump: 1405*1e51764aSArtem Bityutskiy if (znode->parent) 1406*1e51764aSArtem Bityutskiy zbr = &znode->parent->zbranch[znode->iip]; 1407*1e51764aSArtem Bityutskiy else 1408*1e51764aSArtem Bityutskiy zbr = &c->zroot; 1409*1e51764aSArtem Bityutskiy ubifs_msg("dump of znode at LEB %d:%d", zbr->lnum, zbr->offs); 1410*1e51764aSArtem Bityutskiy dbg_dump_znode(c, znode); 1411*1e51764aSArtem Bityutskiy out_unlock: 1412*1e51764aSArtem Bityutskiy mutex_unlock(&c->tnc_mutex); 1413*1e51764aSArtem Bityutskiy return err; 1414*1e51764aSArtem Bityutskiy } 1415*1e51764aSArtem Bityutskiy 1416*1e51764aSArtem Bityutskiy /** 1417*1e51764aSArtem Bityutskiy * add_size - add znode size to partially calculated index size. 1418*1e51764aSArtem Bityutskiy * @c: UBIFS file-system description object 1419*1e51764aSArtem Bityutskiy * @znode: znode to add size for 1420*1e51764aSArtem Bityutskiy * @priv: partially calculated index size 1421*1e51764aSArtem Bityutskiy * 1422*1e51764aSArtem Bityutskiy * This is a helper function for 'dbg_check_idx_size()' which is called for 1423*1e51764aSArtem Bityutskiy * every indexing node and adds its size to the 'long long' variable pointed to 1424*1e51764aSArtem Bityutskiy * by @priv. 1425*1e51764aSArtem Bityutskiy */ 1426*1e51764aSArtem Bityutskiy static int add_size(struct ubifs_info *c, struct ubifs_znode *znode, void *priv) 1427*1e51764aSArtem Bityutskiy { 1428*1e51764aSArtem Bityutskiy long long *idx_size = priv; 1429*1e51764aSArtem Bityutskiy int add; 1430*1e51764aSArtem Bityutskiy 1431*1e51764aSArtem Bityutskiy add = ubifs_idx_node_sz(c, znode->child_cnt); 1432*1e51764aSArtem Bityutskiy add = ALIGN(add, 8); 1433*1e51764aSArtem Bityutskiy *idx_size += add; 1434*1e51764aSArtem Bityutskiy return 0; 1435*1e51764aSArtem Bityutskiy } 1436*1e51764aSArtem Bityutskiy 1437*1e51764aSArtem Bityutskiy /** 1438*1e51764aSArtem Bityutskiy * dbg_check_idx_size - check index size. 1439*1e51764aSArtem Bityutskiy * @c: UBIFS file-system description object 1440*1e51764aSArtem Bityutskiy * @idx_size: size to check 1441*1e51764aSArtem Bityutskiy * 1442*1e51764aSArtem Bityutskiy * This function walks the UBIFS index, calculates its size and checks that the 1443*1e51764aSArtem Bityutskiy * size is equivalent to @idx_size. Returns zero in case of success and a 1444*1e51764aSArtem Bityutskiy * negative error code in case of failure. 1445*1e51764aSArtem Bityutskiy */ 1446*1e51764aSArtem Bityutskiy int dbg_check_idx_size(struct ubifs_info *c, long long idx_size) 1447*1e51764aSArtem Bityutskiy { 1448*1e51764aSArtem Bityutskiy int err; 1449*1e51764aSArtem Bityutskiy long long calc = 0; 1450*1e51764aSArtem Bityutskiy 1451*1e51764aSArtem Bityutskiy if (!(ubifs_chk_flags & UBIFS_CHK_IDX_SZ)) 1452*1e51764aSArtem Bityutskiy return 0; 1453*1e51764aSArtem Bityutskiy 1454*1e51764aSArtem Bityutskiy err = dbg_walk_index(c, NULL, add_size, &calc); 1455*1e51764aSArtem Bityutskiy if (err) { 1456*1e51764aSArtem Bityutskiy ubifs_err("error %d while walking the index", err); 1457*1e51764aSArtem Bityutskiy return err; 1458*1e51764aSArtem Bityutskiy } 1459*1e51764aSArtem Bityutskiy 1460*1e51764aSArtem Bityutskiy if (calc != idx_size) { 1461*1e51764aSArtem Bityutskiy ubifs_err("index size check failed: calculated size is %lld, " 1462*1e51764aSArtem Bityutskiy "should be %lld", calc, idx_size); 1463*1e51764aSArtem Bityutskiy dump_stack(); 1464*1e51764aSArtem Bityutskiy return -EINVAL; 1465*1e51764aSArtem Bityutskiy } 1466*1e51764aSArtem Bityutskiy 1467*1e51764aSArtem Bityutskiy return 0; 1468*1e51764aSArtem Bityutskiy } 1469*1e51764aSArtem Bityutskiy 1470*1e51764aSArtem Bityutskiy /** 1471*1e51764aSArtem Bityutskiy * struct fsck_inode - information about an inode used when checking the file-system. 1472*1e51764aSArtem Bityutskiy * @rb: link in the RB-tree of inodes 1473*1e51764aSArtem Bityutskiy * @inum: inode number 1474*1e51764aSArtem Bityutskiy * @mode: inode type, permissions, etc 1475*1e51764aSArtem Bityutskiy * @nlink: inode link count 1476*1e51764aSArtem Bityutskiy * @xattr_cnt: count of extended attributes 1477*1e51764aSArtem Bityutskiy * @references: how many directory/xattr entries refer this inode (calculated 1478*1e51764aSArtem Bityutskiy * while walking the index) 1479*1e51764aSArtem Bityutskiy * @calc_cnt: for directory inode count of child directories 1480*1e51764aSArtem Bityutskiy * @size: inode size (read from on-flash inode) 1481*1e51764aSArtem Bityutskiy * @xattr_sz: summary size of all extended attributes (read from on-flash 1482*1e51764aSArtem Bityutskiy * inode) 1483*1e51764aSArtem Bityutskiy * @calc_sz: for directories calculated directory size 1484*1e51764aSArtem Bityutskiy * @calc_xcnt: count of extended attributes 1485*1e51764aSArtem Bityutskiy * @calc_xsz: calculated summary size of all extended attributes 1486*1e51764aSArtem Bityutskiy * @xattr_nms: sum of lengths of all extended attribute names belonging to this 1487*1e51764aSArtem Bityutskiy * inode (read from on-flash inode) 1488*1e51764aSArtem Bityutskiy * @calc_xnms: calculated sum of lengths of all extended attribute names 1489*1e51764aSArtem Bityutskiy */ 1490*1e51764aSArtem Bityutskiy struct fsck_inode { 1491*1e51764aSArtem Bityutskiy struct rb_node rb; 1492*1e51764aSArtem Bityutskiy ino_t inum; 1493*1e51764aSArtem Bityutskiy umode_t mode; 1494*1e51764aSArtem Bityutskiy unsigned int nlink; 1495*1e51764aSArtem Bityutskiy unsigned int xattr_cnt; 1496*1e51764aSArtem Bityutskiy int references; 1497*1e51764aSArtem Bityutskiy int calc_cnt; 1498*1e51764aSArtem Bityutskiy long long size; 1499*1e51764aSArtem Bityutskiy unsigned int xattr_sz; 1500*1e51764aSArtem Bityutskiy long long calc_sz; 1501*1e51764aSArtem Bityutskiy long long calc_xcnt; 1502*1e51764aSArtem Bityutskiy long long calc_xsz; 1503*1e51764aSArtem Bityutskiy unsigned int xattr_nms; 1504*1e51764aSArtem Bityutskiy long long calc_xnms; 1505*1e51764aSArtem Bityutskiy }; 1506*1e51764aSArtem Bityutskiy 1507*1e51764aSArtem Bityutskiy /** 1508*1e51764aSArtem Bityutskiy * struct fsck_data - private FS checking information. 1509*1e51764aSArtem Bityutskiy * @inodes: RB-tree of all inodes (contains @struct fsck_inode objects) 1510*1e51764aSArtem Bityutskiy */ 1511*1e51764aSArtem Bityutskiy struct fsck_data { 1512*1e51764aSArtem Bityutskiy struct rb_root inodes; 1513*1e51764aSArtem Bityutskiy }; 1514*1e51764aSArtem Bityutskiy 1515*1e51764aSArtem Bityutskiy /** 1516*1e51764aSArtem Bityutskiy * add_inode - add inode information to RB-tree of inodes. 1517*1e51764aSArtem Bityutskiy * @c: UBIFS file-system description object 1518*1e51764aSArtem Bityutskiy * @fsckd: FS checking information 1519*1e51764aSArtem Bityutskiy * @ino: raw UBIFS inode to add 1520*1e51764aSArtem Bityutskiy * 1521*1e51764aSArtem Bityutskiy * This is a helper function for 'check_leaf()' which adds information about 1522*1e51764aSArtem Bityutskiy * inode @ino to the RB-tree of inodes. Returns inode information pointer in 1523*1e51764aSArtem Bityutskiy * case of success and a negative error code in case of failure. 1524*1e51764aSArtem Bityutskiy */ 1525*1e51764aSArtem Bityutskiy static struct fsck_inode *add_inode(struct ubifs_info *c, 1526*1e51764aSArtem Bityutskiy struct fsck_data *fsckd, 1527*1e51764aSArtem Bityutskiy struct ubifs_ino_node *ino) 1528*1e51764aSArtem Bityutskiy { 1529*1e51764aSArtem Bityutskiy struct rb_node **p, *parent = NULL; 1530*1e51764aSArtem Bityutskiy struct fsck_inode *fscki; 1531*1e51764aSArtem Bityutskiy ino_t inum = key_inum_flash(c, &ino->key); 1532*1e51764aSArtem Bityutskiy 1533*1e51764aSArtem Bityutskiy p = &fsckd->inodes.rb_node; 1534*1e51764aSArtem Bityutskiy while (*p) { 1535*1e51764aSArtem Bityutskiy parent = *p; 1536*1e51764aSArtem Bityutskiy fscki = rb_entry(parent, struct fsck_inode, rb); 1537*1e51764aSArtem Bityutskiy if (inum < fscki->inum) 1538*1e51764aSArtem Bityutskiy p = &(*p)->rb_left; 1539*1e51764aSArtem Bityutskiy else if (inum > fscki->inum) 1540*1e51764aSArtem Bityutskiy p = &(*p)->rb_right; 1541*1e51764aSArtem Bityutskiy else 1542*1e51764aSArtem Bityutskiy return fscki; 1543*1e51764aSArtem Bityutskiy } 1544*1e51764aSArtem Bityutskiy 1545*1e51764aSArtem Bityutskiy if (inum > c->highest_inum) { 1546*1e51764aSArtem Bityutskiy ubifs_err("too high inode number, max. is %lu", 1547*1e51764aSArtem Bityutskiy c->highest_inum); 1548*1e51764aSArtem Bityutskiy return ERR_PTR(-EINVAL); 1549*1e51764aSArtem Bityutskiy } 1550*1e51764aSArtem Bityutskiy 1551*1e51764aSArtem Bityutskiy fscki = kzalloc(sizeof(struct fsck_inode), GFP_NOFS); 1552*1e51764aSArtem Bityutskiy if (!fscki) 1553*1e51764aSArtem Bityutskiy return ERR_PTR(-ENOMEM); 1554*1e51764aSArtem Bityutskiy 1555*1e51764aSArtem Bityutskiy fscki->inum = inum; 1556*1e51764aSArtem Bityutskiy fscki->nlink = le32_to_cpu(ino->nlink); 1557*1e51764aSArtem Bityutskiy fscki->size = le64_to_cpu(ino->size); 1558*1e51764aSArtem Bityutskiy fscki->xattr_cnt = le32_to_cpu(ino->xattr_cnt); 1559*1e51764aSArtem Bityutskiy fscki->xattr_sz = le32_to_cpu(ino->xattr_size); 1560*1e51764aSArtem Bityutskiy fscki->xattr_nms = le32_to_cpu(ino->xattr_names); 1561*1e51764aSArtem Bityutskiy fscki->mode = le32_to_cpu(ino->mode); 1562*1e51764aSArtem Bityutskiy if (S_ISDIR(fscki->mode)) { 1563*1e51764aSArtem Bityutskiy fscki->calc_sz = UBIFS_INO_NODE_SZ; 1564*1e51764aSArtem Bityutskiy fscki->calc_cnt = 2; 1565*1e51764aSArtem Bityutskiy } 1566*1e51764aSArtem Bityutskiy rb_link_node(&fscki->rb, parent, p); 1567*1e51764aSArtem Bityutskiy rb_insert_color(&fscki->rb, &fsckd->inodes); 1568*1e51764aSArtem Bityutskiy return fscki; 1569*1e51764aSArtem Bityutskiy } 1570*1e51764aSArtem Bityutskiy 1571*1e51764aSArtem Bityutskiy /** 1572*1e51764aSArtem Bityutskiy * search_inode - search inode in the RB-tree of inodes. 1573*1e51764aSArtem Bityutskiy * @fsckd: FS checking information 1574*1e51764aSArtem Bityutskiy * @inum: inode number to search 1575*1e51764aSArtem Bityutskiy * 1576*1e51764aSArtem Bityutskiy * This is a helper function for 'check_leaf()' which searches inode @inum in 1577*1e51764aSArtem Bityutskiy * the RB-tree of inodes and returns an inode information pointer or %NULL if 1578*1e51764aSArtem Bityutskiy * the inode was not found. 1579*1e51764aSArtem Bityutskiy */ 1580*1e51764aSArtem Bityutskiy static struct fsck_inode *search_inode(struct fsck_data *fsckd, ino_t inum) 1581*1e51764aSArtem Bityutskiy { 1582*1e51764aSArtem Bityutskiy struct rb_node *p; 1583*1e51764aSArtem Bityutskiy struct fsck_inode *fscki; 1584*1e51764aSArtem Bityutskiy 1585*1e51764aSArtem Bityutskiy p = fsckd->inodes.rb_node; 1586*1e51764aSArtem Bityutskiy while (p) { 1587*1e51764aSArtem Bityutskiy fscki = rb_entry(p, struct fsck_inode, rb); 1588*1e51764aSArtem Bityutskiy if (inum < fscki->inum) 1589*1e51764aSArtem Bityutskiy p = p->rb_left; 1590*1e51764aSArtem Bityutskiy else if (inum > fscki->inum) 1591*1e51764aSArtem Bityutskiy p = p->rb_right; 1592*1e51764aSArtem Bityutskiy else 1593*1e51764aSArtem Bityutskiy return fscki; 1594*1e51764aSArtem Bityutskiy } 1595*1e51764aSArtem Bityutskiy return NULL; 1596*1e51764aSArtem Bityutskiy } 1597*1e51764aSArtem Bityutskiy 1598*1e51764aSArtem Bityutskiy /** 1599*1e51764aSArtem Bityutskiy * read_add_inode - read inode node and add it to RB-tree of inodes. 1600*1e51764aSArtem Bityutskiy * @c: UBIFS file-system description object 1601*1e51764aSArtem Bityutskiy * @fsckd: FS checking information 1602*1e51764aSArtem Bityutskiy * @inum: inode number to read 1603*1e51764aSArtem Bityutskiy * 1604*1e51764aSArtem Bityutskiy * This is a helper function for 'check_leaf()' which finds inode node @inum in 1605*1e51764aSArtem Bityutskiy * the index, reads it, and adds it to the RB-tree of inodes. Returns inode 1606*1e51764aSArtem Bityutskiy * information pointer in case of success and a negative error code in case of 1607*1e51764aSArtem Bityutskiy * failure. 1608*1e51764aSArtem Bityutskiy */ 1609*1e51764aSArtem Bityutskiy static struct fsck_inode *read_add_inode(struct ubifs_info *c, 1610*1e51764aSArtem Bityutskiy struct fsck_data *fsckd, ino_t inum) 1611*1e51764aSArtem Bityutskiy { 1612*1e51764aSArtem Bityutskiy int n, err; 1613*1e51764aSArtem Bityutskiy union ubifs_key key; 1614*1e51764aSArtem Bityutskiy struct ubifs_znode *znode; 1615*1e51764aSArtem Bityutskiy struct ubifs_zbranch *zbr; 1616*1e51764aSArtem Bityutskiy struct ubifs_ino_node *ino; 1617*1e51764aSArtem Bityutskiy struct fsck_inode *fscki; 1618*1e51764aSArtem Bityutskiy 1619*1e51764aSArtem Bityutskiy fscki = search_inode(fsckd, inum); 1620*1e51764aSArtem Bityutskiy if (fscki) 1621*1e51764aSArtem Bityutskiy return fscki; 1622*1e51764aSArtem Bityutskiy 1623*1e51764aSArtem Bityutskiy ino_key_init(c, &key, inum); 1624*1e51764aSArtem Bityutskiy err = ubifs_lookup_level0(c, &key, &znode, &n); 1625*1e51764aSArtem Bityutskiy if (!err) { 1626*1e51764aSArtem Bityutskiy ubifs_err("inode %lu not found in index", inum); 1627*1e51764aSArtem Bityutskiy return ERR_PTR(-ENOENT); 1628*1e51764aSArtem Bityutskiy } else if (err < 0) { 1629*1e51764aSArtem Bityutskiy ubifs_err("error %d while looking up inode %lu", err, inum); 1630*1e51764aSArtem Bityutskiy return ERR_PTR(err); 1631*1e51764aSArtem Bityutskiy } 1632*1e51764aSArtem Bityutskiy 1633*1e51764aSArtem Bityutskiy zbr = &znode->zbranch[n]; 1634*1e51764aSArtem Bityutskiy if (zbr->len < UBIFS_INO_NODE_SZ) { 1635*1e51764aSArtem Bityutskiy ubifs_err("bad node %lu node length %d", inum, zbr->len); 1636*1e51764aSArtem Bityutskiy return ERR_PTR(-EINVAL); 1637*1e51764aSArtem Bityutskiy } 1638*1e51764aSArtem Bityutskiy 1639*1e51764aSArtem Bityutskiy ino = kmalloc(zbr->len, GFP_NOFS); 1640*1e51764aSArtem Bityutskiy if (!ino) 1641*1e51764aSArtem Bityutskiy return ERR_PTR(-ENOMEM); 1642*1e51764aSArtem Bityutskiy 1643*1e51764aSArtem Bityutskiy err = ubifs_tnc_read_node(c, zbr, ino); 1644*1e51764aSArtem Bityutskiy if (err) { 1645*1e51764aSArtem Bityutskiy ubifs_err("cannot read inode node at LEB %d:%d, error %d", 1646*1e51764aSArtem Bityutskiy zbr->lnum, zbr->offs, err); 1647*1e51764aSArtem Bityutskiy kfree(ino); 1648*1e51764aSArtem Bityutskiy return ERR_PTR(err); 1649*1e51764aSArtem Bityutskiy } 1650*1e51764aSArtem Bityutskiy 1651*1e51764aSArtem Bityutskiy fscki = add_inode(c, fsckd, ino); 1652*1e51764aSArtem Bityutskiy kfree(ino); 1653*1e51764aSArtem Bityutskiy if (IS_ERR(fscki)) { 1654*1e51764aSArtem Bityutskiy ubifs_err("error %ld while adding inode %lu node", 1655*1e51764aSArtem Bityutskiy PTR_ERR(fscki), inum); 1656*1e51764aSArtem Bityutskiy return fscki; 1657*1e51764aSArtem Bityutskiy } 1658*1e51764aSArtem Bityutskiy 1659*1e51764aSArtem Bityutskiy return fscki; 1660*1e51764aSArtem Bityutskiy } 1661*1e51764aSArtem Bityutskiy 1662*1e51764aSArtem Bityutskiy /** 1663*1e51764aSArtem Bityutskiy * check_leaf - check leaf node. 1664*1e51764aSArtem Bityutskiy * @c: UBIFS file-system description object 1665*1e51764aSArtem Bityutskiy * @zbr: zbranch of the leaf node to check 1666*1e51764aSArtem Bityutskiy * @priv: FS checking information 1667*1e51764aSArtem Bityutskiy * 1668*1e51764aSArtem Bityutskiy * This is a helper function for 'dbg_check_filesystem()' which is called for 1669*1e51764aSArtem Bityutskiy * every single leaf node while walking the indexing tree. It checks that the 1670*1e51764aSArtem Bityutskiy * leaf node referred from the indexing tree exists, has correct CRC, and does 1671*1e51764aSArtem Bityutskiy * some other basic validation. This function is also responsible for building 1672*1e51764aSArtem Bityutskiy * an RB-tree of inodes - it adds all inodes into the RB-tree. It also 1673*1e51764aSArtem Bityutskiy * calculates reference count, size, etc for each inode in order to later 1674*1e51764aSArtem Bityutskiy * compare them to the information stored inside the inodes and detect possible 1675*1e51764aSArtem Bityutskiy * inconsistencies. Returns zero in case of success and a negative error code 1676*1e51764aSArtem Bityutskiy * in case of failure. 1677*1e51764aSArtem Bityutskiy */ 1678*1e51764aSArtem Bityutskiy static int check_leaf(struct ubifs_info *c, struct ubifs_zbranch *zbr, 1679*1e51764aSArtem Bityutskiy void *priv) 1680*1e51764aSArtem Bityutskiy { 1681*1e51764aSArtem Bityutskiy ino_t inum; 1682*1e51764aSArtem Bityutskiy void *node; 1683*1e51764aSArtem Bityutskiy struct ubifs_ch *ch; 1684*1e51764aSArtem Bityutskiy int err, type = key_type(c, &zbr->key); 1685*1e51764aSArtem Bityutskiy struct fsck_inode *fscki; 1686*1e51764aSArtem Bityutskiy 1687*1e51764aSArtem Bityutskiy if (zbr->len < UBIFS_CH_SZ) { 1688*1e51764aSArtem Bityutskiy ubifs_err("bad leaf length %d (LEB %d:%d)", 1689*1e51764aSArtem Bityutskiy zbr->len, zbr->lnum, zbr->offs); 1690*1e51764aSArtem Bityutskiy return -EINVAL; 1691*1e51764aSArtem Bityutskiy } 1692*1e51764aSArtem Bityutskiy 1693*1e51764aSArtem Bityutskiy node = kmalloc(zbr->len, GFP_NOFS); 1694*1e51764aSArtem Bityutskiy if (!node) 1695*1e51764aSArtem Bityutskiy return -ENOMEM; 1696*1e51764aSArtem Bityutskiy 1697*1e51764aSArtem Bityutskiy err = ubifs_tnc_read_node(c, zbr, node); 1698*1e51764aSArtem Bityutskiy if (err) { 1699*1e51764aSArtem Bityutskiy ubifs_err("cannot read leaf node at LEB %d:%d, error %d", 1700*1e51764aSArtem Bityutskiy zbr->lnum, zbr->offs, err); 1701*1e51764aSArtem Bityutskiy goto out_free; 1702*1e51764aSArtem Bityutskiy } 1703*1e51764aSArtem Bityutskiy 1704*1e51764aSArtem Bityutskiy /* If this is an inode node, add it to RB-tree of inodes */ 1705*1e51764aSArtem Bityutskiy if (type == UBIFS_INO_KEY) { 1706*1e51764aSArtem Bityutskiy fscki = add_inode(c, priv, node); 1707*1e51764aSArtem Bityutskiy if (IS_ERR(fscki)) { 1708*1e51764aSArtem Bityutskiy err = PTR_ERR(fscki); 1709*1e51764aSArtem Bityutskiy ubifs_err("error %d while adding inode node", err); 1710*1e51764aSArtem Bityutskiy goto out_dump; 1711*1e51764aSArtem Bityutskiy } 1712*1e51764aSArtem Bityutskiy goto out; 1713*1e51764aSArtem Bityutskiy } 1714*1e51764aSArtem Bityutskiy 1715*1e51764aSArtem Bityutskiy if (type != UBIFS_DENT_KEY && type != UBIFS_XENT_KEY && 1716*1e51764aSArtem Bityutskiy type != UBIFS_DATA_KEY) { 1717*1e51764aSArtem Bityutskiy ubifs_err("unexpected node type %d at LEB %d:%d", 1718*1e51764aSArtem Bityutskiy type, zbr->lnum, zbr->offs); 1719*1e51764aSArtem Bityutskiy err = -EINVAL; 1720*1e51764aSArtem Bityutskiy goto out_free; 1721*1e51764aSArtem Bityutskiy } 1722*1e51764aSArtem Bityutskiy 1723*1e51764aSArtem Bityutskiy ch = node; 1724*1e51764aSArtem Bityutskiy if (le64_to_cpu(ch->sqnum) > c->max_sqnum) { 1725*1e51764aSArtem Bityutskiy ubifs_err("too high sequence number, max. is %llu", 1726*1e51764aSArtem Bityutskiy c->max_sqnum); 1727*1e51764aSArtem Bityutskiy err = -EINVAL; 1728*1e51764aSArtem Bityutskiy goto out_dump; 1729*1e51764aSArtem Bityutskiy } 1730*1e51764aSArtem Bityutskiy 1731*1e51764aSArtem Bityutskiy if (type == UBIFS_DATA_KEY) { 1732*1e51764aSArtem Bityutskiy long long blk_offs; 1733*1e51764aSArtem Bityutskiy struct ubifs_data_node *dn = node; 1734*1e51764aSArtem Bityutskiy 1735*1e51764aSArtem Bityutskiy /* 1736*1e51764aSArtem Bityutskiy * Search the inode node this data node belongs to and insert 1737*1e51764aSArtem Bityutskiy * it to the RB-tree of inodes. 1738*1e51764aSArtem Bityutskiy */ 1739*1e51764aSArtem Bityutskiy inum = key_inum_flash(c, &dn->key); 1740*1e51764aSArtem Bityutskiy fscki = read_add_inode(c, priv, inum); 1741*1e51764aSArtem Bityutskiy if (IS_ERR(fscki)) { 1742*1e51764aSArtem Bityutskiy err = PTR_ERR(fscki); 1743*1e51764aSArtem Bityutskiy ubifs_err("error %d while processing data node and " 1744*1e51764aSArtem Bityutskiy "trying to find inode node %lu", err, inum); 1745*1e51764aSArtem Bityutskiy goto out_dump; 1746*1e51764aSArtem Bityutskiy } 1747*1e51764aSArtem Bityutskiy 1748*1e51764aSArtem Bityutskiy /* Make sure the data node is within inode size */ 1749*1e51764aSArtem Bityutskiy blk_offs = key_block_flash(c, &dn->key); 1750*1e51764aSArtem Bityutskiy blk_offs <<= UBIFS_BLOCK_SHIFT; 1751*1e51764aSArtem Bityutskiy blk_offs += le32_to_cpu(dn->size); 1752*1e51764aSArtem Bityutskiy if (blk_offs > fscki->size) { 1753*1e51764aSArtem Bityutskiy ubifs_err("data node at LEB %d:%d is not within inode " 1754*1e51764aSArtem Bityutskiy "size %lld", zbr->lnum, zbr->offs, 1755*1e51764aSArtem Bityutskiy fscki->size); 1756*1e51764aSArtem Bityutskiy err = -EINVAL; 1757*1e51764aSArtem Bityutskiy goto out_dump; 1758*1e51764aSArtem Bityutskiy } 1759*1e51764aSArtem Bityutskiy } else { 1760*1e51764aSArtem Bityutskiy int nlen; 1761*1e51764aSArtem Bityutskiy struct ubifs_dent_node *dent = node; 1762*1e51764aSArtem Bityutskiy struct fsck_inode *fscki1; 1763*1e51764aSArtem Bityutskiy 1764*1e51764aSArtem Bityutskiy err = ubifs_validate_entry(c, dent); 1765*1e51764aSArtem Bityutskiy if (err) 1766*1e51764aSArtem Bityutskiy goto out_dump; 1767*1e51764aSArtem Bityutskiy 1768*1e51764aSArtem Bityutskiy /* 1769*1e51764aSArtem Bityutskiy * Search the inode node this entry refers to and the parent 1770*1e51764aSArtem Bityutskiy * inode node and insert them to the RB-tree of inodes. 1771*1e51764aSArtem Bityutskiy */ 1772*1e51764aSArtem Bityutskiy inum = le64_to_cpu(dent->inum); 1773*1e51764aSArtem Bityutskiy fscki = read_add_inode(c, priv, inum); 1774*1e51764aSArtem Bityutskiy if (IS_ERR(fscki)) { 1775*1e51764aSArtem Bityutskiy err = PTR_ERR(fscki); 1776*1e51764aSArtem Bityutskiy ubifs_err("error %d while processing entry node and " 1777*1e51764aSArtem Bityutskiy "trying to find inode node %lu", err, inum); 1778*1e51764aSArtem Bityutskiy goto out_dump; 1779*1e51764aSArtem Bityutskiy } 1780*1e51764aSArtem Bityutskiy 1781*1e51764aSArtem Bityutskiy /* Count how many direntries or xentries refers this inode */ 1782*1e51764aSArtem Bityutskiy fscki->references += 1; 1783*1e51764aSArtem Bityutskiy 1784*1e51764aSArtem Bityutskiy inum = key_inum_flash(c, &dent->key); 1785*1e51764aSArtem Bityutskiy fscki1 = read_add_inode(c, priv, inum); 1786*1e51764aSArtem Bityutskiy if (IS_ERR(fscki1)) { 1787*1e51764aSArtem Bityutskiy err = PTR_ERR(fscki); 1788*1e51764aSArtem Bityutskiy ubifs_err("error %d while processing entry node and " 1789*1e51764aSArtem Bityutskiy "trying to find parent inode node %lu", 1790*1e51764aSArtem Bityutskiy err, inum); 1791*1e51764aSArtem Bityutskiy goto out_dump; 1792*1e51764aSArtem Bityutskiy } 1793*1e51764aSArtem Bityutskiy 1794*1e51764aSArtem Bityutskiy nlen = le16_to_cpu(dent->nlen); 1795*1e51764aSArtem Bityutskiy if (type == UBIFS_XENT_KEY) { 1796*1e51764aSArtem Bityutskiy fscki1->calc_xcnt += 1; 1797*1e51764aSArtem Bityutskiy fscki1->calc_xsz += CALC_DENT_SIZE(nlen); 1798*1e51764aSArtem Bityutskiy fscki1->calc_xsz += CALC_XATTR_BYTES(fscki->size); 1799*1e51764aSArtem Bityutskiy fscki1->calc_xnms += nlen; 1800*1e51764aSArtem Bityutskiy } else { 1801*1e51764aSArtem Bityutskiy fscki1->calc_sz += CALC_DENT_SIZE(nlen); 1802*1e51764aSArtem Bityutskiy if (dent->type == UBIFS_ITYPE_DIR) 1803*1e51764aSArtem Bityutskiy fscki1->calc_cnt += 1; 1804*1e51764aSArtem Bityutskiy } 1805*1e51764aSArtem Bityutskiy } 1806*1e51764aSArtem Bityutskiy 1807*1e51764aSArtem Bityutskiy out: 1808*1e51764aSArtem Bityutskiy kfree(node); 1809*1e51764aSArtem Bityutskiy return 0; 1810*1e51764aSArtem Bityutskiy 1811*1e51764aSArtem Bityutskiy out_dump: 1812*1e51764aSArtem Bityutskiy ubifs_msg("dump of node at LEB %d:%d", zbr->lnum, zbr->offs); 1813*1e51764aSArtem Bityutskiy dbg_dump_node(c, node); 1814*1e51764aSArtem Bityutskiy out_free: 1815*1e51764aSArtem Bityutskiy kfree(node); 1816*1e51764aSArtem Bityutskiy return err; 1817*1e51764aSArtem Bityutskiy } 1818*1e51764aSArtem Bityutskiy 1819*1e51764aSArtem Bityutskiy /** 1820*1e51764aSArtem Bityutskiy * free_inodes - free RB-tree of inodes. 1821*1e51764aSArtem Bityutskiy * @fsckd: FS checking information 1822*1e51764aSArtem Bityutskiy */ 1823*1e51764aSArtem Bityutskiy static void free_inodes(struct fsck_data *fsckd) 1824*1e51764aSArtem Bityutskiy { 1825*1e51764aSArtem Bityutskiy struct rb_node *this = fsckd->inodes.rb_node; 1826*1e51764aSArtem Bityutskiy struct fsck_inode *fscki; 1827*1e51764aSArtem Bityutskiy 1828*1e51764aSArtem Bityutskiy while (this) { 1829*1e51764aSArtem Bityutskiy if (this->rb_left) 1830*1e51764aSArtem Bityutskiy this = this->rb_left; 1831*1e51764aSArtem Bityutskiy else if (this->rb_right) 1832*1e51764aSArtem Bityutskiy this = this->rb_right; 1833*1e51764aSArtem Bityutskiy else { 1834*1e51764aSArtem Bityutskiy fscki = rb_entry(this, struct fsck_inode, rb); 1835*1e51764aSArtem Bityutskiy this = rb_parent(this); 1836*1e51764aSArtem Bityutskiy if (this) { 1837*1e51764aSArtem Bityutskiy if (this->rb_left == &fscki->rb) 1838*1e51764aSArtem Bityutskiy this->rb_left = NULL; 1839*1e51764aSArtem Bityutskiy else 1840*1e51764aSArtem Bityutskiy this->rb_right = NULL; 1841*1e51764aSArtem Bityutskiy } 1842*1e51764aSArtem Bityutskiy kfree(fscki); 1843*1e51764aSArtem Bityutskiy } 1844*1e51764aSArtem Bityutskiy } 1845*1e51764aSArtem Bityutskiy } 1846*1e51764aSArtem Bityutskiy 1847*1e51764aSArtem Bityutskiy /** 1848*1e51764aSArtem Bityutskiy * check_inodes - checks all inodes. 1849*1e51764aSArtem Bityutskiy * @c: UBIFS file-system description object 1850*1e51764aSArtem Bityutskiy * @fsckd: FS checking information 1851*1e51764aSArtem Bityutskiy * 1852*1e51764aSArtem Bityutskiy * This is a helper function for 'dbg_check_filesystem()' which walks the 1853*1e51764aSArtem Bityutskiy * RB-tree of inodes after the index scan has been finished, and checks that 1854*1e51764aSArtem Bityutskiy * inode nlink, size, etc are correct. Returns zero if inodes are fine, 1855*1e51764aSArtem Bityutskiy * %-EINVAL if not, and a negative error code in case of failure. 1856*1e51764aSArtem Bityutskiy */ 1857*1e51764aSArtem Bityutskiy static int check_inodes(struct ubifs_info *c, struct fsck_data *fsckd) 1858*1e51764aSArtem Bityutskiy { 1859*1e51764aSArtem Bityutskiy int n, err; 1860*1e51764aSArtem Bityutskiy union ubifs_key key; 1861*1e51764aSArtem Bityutskiy struct ubifs_znode *znode; 1862*1e51764aSArtem Bityutskiy struct ubifs_zbranch *zbr; 1863*1e51764aSArtem Bityutskiy struct ubifs_ino_node *ino; 1864*1e51764aSArtem Bityutskiy struct fsck_inode *fscki; 1865*1e51764aSArtem Bityutskiy struct rb_node *this = rb_first(&fsckd->inodes); 1866*1e51764aSArtem Bityutskiy 1867*1e51764aSArtem Bityutskiy while (this) { 1868*1e51764aSArtem Bityutskiy fscki = rb_entry(this, struct fsck_inode, rb); 1869*1e51764aSArtem Bityutskiy this = rb_next(this); 1870*1e51764aSArtem Bityutskiy 1871*1e51764aSArtem Bityutskiy if (S_ISDIR(fscki->mode)) { 1872*1e51764aSArtem Bityutskiy /* 1873*1e51764aSArtem Bityutskiy * Directories have to have exactly one reference (they 1874*1e51764aSArtem Bityutskiy * cannot have hardlinks), although root inode is an 1875*1e51764aSArtem Bityutskiy * exception. 1876*1e51764aSArtem Bityutskiy */ 1877*1e51764aSArtem Bityutskiy if (fscki->inum != UBIFS_ROOT_INO && 1878*1e51764aSArtem Bityutskiy fscki->references != 1) { 1879*1e51764aSArtem Bityutskiy ubifs_err("directory inode %lu has %d " 1880*1e51764aSArtem Bityutskiy "direntries which refer it, but " 1881*1e51764aSArtem Bityutskiy "should be 1", fscki->inum, 1882*1e51764aSArtem Bityutskiy fscki->references); 1883*1e51764aSArtem Bityutskiy goto out_dump; 1884*1e51764aSArtem Bityutskiy } 1885*1e51764aSArtem Bityutskiy if (fscki->inum == UBIFS_ROOT_INO && 1886*1e51764aSArtem Bityutskiy fscki->references != 0) { 1887*1e51764aSArtem Bityutskiy ubifs_err("root inode %lu has non-zero (%d) " 1888*1e51764aSArtem Bityutskiy "direntries which refer it", 1889*1e51764aSArtem Bityutskiy fscki->inum, fscki->references); 1890*1e51764aSArtem Bityutskiy goto out_dump; 1891*1e51764aSArtem Bityutskiy } 1892*1e51764aSArtem Bityutskiy if (fscki->calc_sz != fscki->size) { 1893*1e51764aSArtem Bityutskiy ubifs_err("directory inode %lu size is %lld, " 1894*1e51764aSArtem Bityutskiy "but calculated size is %lld", 1895*1e51764aSArtem Bityutskiy fscki->inum, fscki->size, 1896*1e51764aSArtem Bityutskiy fscki->calc_sz); 1897*1e51764aSArtem Bityutskiy goto out_dump; 1898*1e51764aSArtem Bityutskiy } 1899*1e51764aSArtem Bityutskiy if (fscki->calc_cnt != fscki->nlink) { 1900*1e51764aSArtem Bityutskiy ubifs_err("directory inode %lu nlink is %d, " 1901*1e51764aSArtem Bityutskiy "but calculated nlink is %d", 1902*1e51764aSArtem Bityutskiy fscki->inum, fscki->nlink, 1903*1e51764aSArtem Bityutskiy fscki->calc_cnt); 1904*1e51764aSArtem Bityutskiy goto out_dump; 1905*1e51764aSArtem Bityutskiy } 1906*1e51764aSArtem Bityutskiy } else { 1907*1e51764aSArtem Bityutskiy if (fscki->references != fscki->nlink) { 1908*1e51764aSArtem Bityutskiy ubifs_err("inode %lu nlink is %d, but " 1909*1e51764aSArtem Bityutskiy "calculated nlink is %d", fscki->inum, 1910*1e51764aSArtem Bityutskiy fscki->nlink, fscki->references); 1911*1e51764aSArtem Bityutskiy goto out_dump; 1912*1e51764aSArtem Bityutskiy } 1913*1e51764aSArtem Bityutskiy } 1914*1e51764aSArtem Bityutskiy if (fscki->xattr_sz != fscki->calc_xsz) { 1915*1e51764aSArtem Bityutskiy ubifs_err("inode %lu has xattr size %u, but " 1916*1e51764aSArtem Bityutskiy "calculated size is %lld", 1917*1e51764aSArtem Bityutskiy fscki->inum, fscki->xattr_sz, 1918*1e51764aSArtem Bityutskiy fscki->calc_xsz); 1919*1e51764aSArtem Bityutskiy goto out_dump; 1920*1e51764aSArtem Bityutskiy } 1921*1e51764aSArtem Bityutskiy if (fscki->xattr_cnt != fscki->calc_xcnt) { 1922*1e51764aSArtem Bityutskiy ubifs_err("inode %lu has %u xattrs, but " 1923*1e51764aSArtem Bityutskiy "calculated count is %lld", fscki->inum, 1924*1e51764aSArtem Bityutskiy fscki->xattr_cnt, fscki->calc_xcnt); 1925*1e51764aSArtem Bityutskiy goto out_dump; 1926*1e51764aSArtem Bityutskiy } 1927*1e51764aSArtem Bityutskiy if (fscki->xattr_nms != fscki->calc_xnms) { 1928*1e51764aSArtem Bityutskiy ubifs_err("inode %lu has xattr names' size %u, but " 1929*1e51764aSArtem Bityutskiy "calculated names' size is %lld", 1930*1e51764aSArtem Bityutskiy fscki->inum, fscki->xattr_nms, 1931*1e51764aSArtem Bityutskiy fscki->calc_xnms); 1932*1e51764aSArtem Bityutskiy goto out_dump; 1933*1e51764aSArtem Bityutskiy } 1934*1e51764aSArtem Bityutskiy } 1935*1e51764aSArtem Bityutskiy 1936*1e51764aSArtem Bityutskiy return 0; 1937*1e51764aSArtem Bityutskiy 1938*1e51764aSArtem Bityutskiy out_dump: 1939*1e51764aSArtem Bityutskiy /* Read the bad inode and dump it */ 1940*1e51764aSArtem Bityutskiy ino_key_init(c, &key, fscki->inum); 1941*1e51764aSArtem Bityutskiy err = ubifs_lookup_level0(c, &key, &znode, &n); 1942*1e51764aSArtem Bityutskiy if (!err) { 1943*1e51764aSArtem Bityutskiy ubifs_err("inode %lu not found in index", fscki->inum); 1944*1e51764aSArtem Bityutskiy return -ENOENT; 1945*1e51764aSArtem Bityutskiy } else if (err < 0) { 1946*1e51764aSArtem Bityutskiy ubifs_err("error %d while looking up inode %lu", 1947*1e51764aSArtem Bityutskiy err, fscki->inum); 1948*1e51764aSArtem Bityutskiy return err; 1949*1e51764aSArtem Bityutskiy } 1950*1e51764aSArtem Bityutskiy 1951*1e51764aSArtem Bityutskiy zbr = &znode->zbranch[n]; 1952*1e51764aSArtem Bityutskiy ino = kmalloc(zbr->len, GFP_NOFS); 1953*1e51764aSArtem Bityutskiy if (!ino) 1954*1e51764aSArtem Bityutskiy return -ENOMEM; 1955*1e51764aSArtem Bityutskiy 1956*1e51764aSArtem Bityutskiy err = ubifs_tnc_read_node(c, zbr, ino); 1957*1e51764aSArtem Bityutskiy if (err) { 1958*1e51764aSArtem Bityutskiy ubifs_err("cannot read inode node at LEB %d:%d, error %d", 1959*1e51764aSArtem Bityutskiy zbr->lnum, zbr->offs, err); 1960*1e51764aSArtem Bityutskiy kfree(ino); 1961*1e51764aSArtem Bityutskiy return err; 1962*1e51764aSArtem Bityutskiy } 1963*1e51764aSArtem Bityutskiy 1964*1e51764aSArtem Bityutskiy ubifs_msg("dump of the inode %lu sitting in LEB %d:%d", 1965*1e51764aSArtem Bityutskiy fscki->inum, zbr->lnum, zbr->offs); 1966*1e51764aSArtem Bityutskiy dbg_dump_node(c, ino); 1967*1e51764aSArtem Bityutskiy kfree(ino); 1968*1e51764aSArtem Bityutskiy return -EINVAL; 1969*1e51764aSArtem Bityutskiy } 1970*1e51764aSArtem Bityutskiy 1971*1e51764aSArtem Bityutskiy /** 1972*1e51764aSArtem Bityutskiy * dbg_check_filesystem - check the file-system. 1973*1e51764aSArtem Bityutskiy * @c: UBIFS file-system description object 1974*1e51764aSArtem Bityutskiy * 1975*1e51764aSArtem Bityutskiy * This function checks the file system, namely: 1976*1e51764aSArtem Bityutskiy * o makes sure that all leaf nodes exist and their CRCs are correct; 1977*1e51764aSArtem Bityutskiy * o makes sure inode nlink, size, xattr size/count are correct (for all 1978*1e51764aSArtem Bityutskiy * inodes). 1979*1e51764aSArtem Bityutskiy * 1980*1e51764aSArtem Bityutskiy * The function reads whole indexing tree and all nodes, so it is pretty 1981*1e51764aSArtem Bityutskiy * heavy-weight. Returns zero if the file-system is consistent, %-EINVAL if 1982*1e51764aSArtem Bityutskiy * not, and a negative error code in case of failure. 1983*1e51764aSArtem Bityutskiy */ 1984*1e51764aSArtem Bityutskiy int dbg_check_filesystem(struct ubifs_info *c) 1985*1e51764aSArtem Bityutskiy { 1986*1e51764aSArtem Bityutskiy int err; 1987*1e51764aSArtem Bityutskiy struct fsck_data fsckd; 1988*1e51764aSArtem Bityutskiy 1989*1e51764aSArtem Bityutskiy if (!(ubifs_chk_flags & UBIFS_CHK_FS)) 1990*1e51764aSArtem Bityutskiy return 0; 1991*1e51764aSArtem Bityutskiy 1992*1e51764aSArtem Bityutskiy fsckd.inodes = RB_ROOT; 1993*1e51764aSArtem Bityutskiy err = dbg_walk_index(c, check_leaf, NULL, &fsckd); 1994*1e51764aSArtem Bityutskiy if (err) 1995*1e51764aSArtem Bityutskiy goto out_free; 1996*1e51764aSArtem Bityutskiy 1997*1e51764aSArtem Bityutskiy err = check_inodes(c, &fsckd); 1998*1e51764aSArtem Bityutskiy if (err) 1999*1e51764aSArtem Bityutskiy goto out_free; 2000*1e51764aSArtem Bityutskiy 2001*1e51764aSArtem Bityutskiy free_inodes(&fsckd); 2002*1e51764aSArtem Bityutskiy return 0; 2003*1e51764aSArtem Bityutskiy 2004*1e51764aSArtem Bityutskiy out_free: 2005*1e51764aSArtem Bityutskiy ubifs_err("file-system check failed with error %d", err); 2006*1e51764aSArtem Bityutskiy dump_stack(); 2007*1e51764aSArtem Bityutskiy free_inodes(&fsckd); 2008*1e51764aSArtem Bityutskiy return err; 2009*1e51764aSArtem Bityutskiy } 2010*1e51764aSArtem Bityutskiy 2011*1e51764aSArtem Bityutskiy static int invocation_cnt; 2012*1e51764aSArtem Bityutskiy 2013*1e51764aSArtem Bityutskiy int dbg_force_in_the_gaps(void) 2014*1e51764aSArtem Bityutskiy { 2015*1e51764aSArtem Bityutskiy if (!dbg_force_in_the_gaps_enabled) 2016*1e51764aSArtem Bityutskiy return 0; 2017*1e51764aSArtem Bityutskiy /* Force in-the-gaps every 8th commit */ 2018*1e51764aSArtem Bityutskiy return !((invocation_cnt++) & 0x7); 2019*1e51764aSArtem Bityutskiy } 2020*1e51764aSArtem Bityutskiy 2021*1e51764aSArtem Bityutskiy /* Failure mode for recovery testing */ 2022*1e51764aSArtem Bityutskiy 2023*1e51764aSArtem Bityutskiy #define chance(n, d) (simple_rand() <= (n) * 32768LL / (d)) 2024*1e51764aSArtem Bityutskiy 2025*1e51764aSArtem Bityutskiy struct failure_mode_info { 2026*1e51764aSArtem Bityutskiy struct list_head list; 2027*1e51764aSArtem Bityutskiy struct ubifs_info *c; 2028*1e51764aSArtem Bityutskiy }; 2029*1e51764aSArtem Bityutskiy 2030*1e51764aSArtem Bityutskiy static LIST_HEAD(fmi_list); 2031*1e51764aSArtem Bityutskiy static DEFINE_SPINLOCK(fmi_lock); 2032*1e51764aSArtem Bityutskiy 2033*1e51764aSArtem Bityutskiy static unsigned int next; 2034*1e51764aSArtem Bityutskiy 2035*1e51764aSArtem Bityutskiy static int simple_rand(void) 2036*1e51764aSArtem Bityutskiy { 2037*1e51764aSArtem Bityutskiy if (next == 0) 2038*1e51764aSArtem Bityutskiy next = current->pid; 2039*1e51764aSArtem Bityutskiy next = next * 1103515245 + 12345; 2040*1e51764aSArtem Bityutskiy return (next >> 16) & 32767; 2041*1e51764aSArtem Bityutskiy } 2042*1e51764aSArtem Bityutskiy 2043*1e51764aSArtem Bityutskiy void dbg_failure_mode_registration(struct ubifs_info *c) 2044*1e51764aSArtem Bityutskiy { 2045*1e51764aSArtem Bityutskiy struct failure_mode_info *fmi; 2046*1e51764aSArtem Bityutskiy 2047*1e51764aSArtem Bityutskiy fmi = kmalloc(sizeof(struct failure_mode_info), GFP_NOFS); 2048*1e51764aSArtem Bityutskiy if (!fmi) { 2049*1e51764aSArtem Bityutskiy dbg_err("Failed to register failure mode - no memory"); 2050*1e51764aSArtem Bityutskiy return; 2051*1e51764aSArtem Bityutskiy } 2052*1e51764aSArtem Bityutskiy fmi->c = c; 2053*1e51764aSArtem Bityutskiy spin_lock(&fmi_lock); 2054*1e51764aSArtem Bityutskiy list_add_tail(&fmi->list, &fmi_list); 2055*1e51764aSArtem Bityutskiy spin_unlock(&fmi_lock); 2056*1e51764aSArtem Bityutskiy } 2057*1e51764aSArtem Bityutskiy 2058*1e51764aSArtem Bityutskiy void dbg_failure_mode_deregistration(struct ubifs_info *c) 2059*1e51764aSArtem Bityutskiy { 2060*1e51764aSArtem Bityutskiy struct failure_mode_info *fmi, *tmp; 2061*1e51764aSArtem Bityutskiy 2062*1e51764aSArtem Bityutskiy spin_lock(&fmi_lock); 2063*1e51764aSArtem Bityutskiy list_for_each_entry_safe(fmi, tmp, &fmi_list, list) 2064*1e51764aSArtem Bityutskiy if (fmi->c == c) { 2065*1e51764aSArtem Bityutskiy list_del(&fmi->list); 2066*1e51764aSArtem Bityutskiy kfree(fmi); 2067*1e51764aSArtem Bityutskiy } 2068*1e51764aSArtem Bityutskiy spin_unlock(&fmi_lock); 2069*1e51764aSArtem Bityutskiy } 2070*1e51764aSArtem Bityutskiy 2071*1e51764aSArtem Bityutskiy static struct ubifs_info *dbg_find_info(struct ubi_volume_desc *desc) 2072*1e51764aSArtem Bityutskiy { 2073*1e51764aSArtem Bityutskiy struct failure_mode_info *fmi; 2074*1e51764aSArtem Bityutskiy 2075*1e51764aSArtem Bityutskiy spin_lock(&fmi_lock); 2076*1e51764aSArtem Bityutskiy list_for_each_entry(fmi, &fmi_list, list) 2077*1e51764aSArtem Bityutskiy if (fmi->c->ubi == desc) { 2078*1e51764aSArtem Bityutskiy struct ubifs_info *c = fmi->c; 2079*1e51764aSArtem Bityutskiy 2080*1e51764aSArtem Bityutskiy spin_unlock(&fmi_lock); 2081*1e51764aSArtem Bityutskiy return c; 2082*1e51764aSArtem Bityutskiy } 2083*1e51764aSArtem Bityutskiy spin_unlock(&fmi_lock); 2084*1e51764aSArtem Bityutskiy return NULL; 2085*1e51764aSArtem Bityutskiy } 2086*1e51764aSArtem Bityutskiy 2087*1e51764aSArtem Bityutskiy static int in_failure_mode(struct ubi_volume_desc *desc) 2088*1e51764aSArtem Bityutskiy { 2089*1e51764aSArtem Bityutskiy struct ubifs_info *c = dbg_find_info(desc); 2090*1e51764aSArtem Bityutskiy 2091*1e51764aSArtem Bityutskiy if (c && dbg_failure_mode) 2092*1e51764aSArtem Bityutskiy return c->failure_mode; 2093*1e51764aSArtem Bityutskiy return 0; 2094*1e51764aSArtem Bityutskiy } 2095*1e51764aSArtem Bityutskiy 2096*1e51764aSArtem Bityutskiy static int do_fail(struct ubi_volume_desc *desc, int lnum, int write) 2097*1e51764aSArtem Bityutskiy { 2098*1e51764aSArtem Bityutskiy struct ubifs_info *c = dbg_find_info(desc); 2099*1e51764aSArtem Bityutskiy 2100*1e51764aSArtem Bityutskiy if (!c || !dbg_failure_mode) 2101*1e51764aSArtem Bityutskiy return 0; 2102*1e51764aSArtem Bityutskiy if (c->failure_mode) 2103*1e51764aSArtem Bityutskiy return 1; 2104*1e51764aSArtem Bityutskiy if (!c->fail_cnt) { 2105*1e51764aSArtem Bityutskiy /* First call - decide delay to failure */ 2106*1e51764aSArtem Bityutskiy if (chance(1, 2)) { 2107*1e51764aSArtem Bityutskiy unsigned int delay = 1 << (simple_rand() >> 11); 2108*1e51764aSArtem Bityutskiy 2109*1e51764aSArtem Bityutskiy if (chance(1, 2)) { 2110*1e51764aSArtem Bityutskiy c->fail_delay = 1; 2111*1e51764aSArtem Bityutskiy c->fail_timeout = jiffies + 2112*1e51764aSArtem Bityutskiy msecs_to_jiffies(delay); 2113*1e51764aSArtem Bityutskiy dbg_rcvry("failing after %ums", delay); 2114*1e51764aSArtem Bityutskiy } else { 2115*1e51764aSArtem Bityutskiy c->fail_delay = 2; 2116*1e51764aSArtem Bityutskiy c->fail_cnt_max = delay; 2117*1e51764aSArtem Bityutskiy dbg_rcvry("failing after %u calls", delay); 2118*1e51764aSArtem Bityutskiy } 2119*1e51764aSArtem Bityutskiy } 2120*1e51764aSArtem Bityutskiy c->fail_cnt += 1; 2121*1e51764aSArtem Bityutskiy } 2122*1e51764aSArtem Bityutskiy /* Determine if failure delay has expired */ 2123*1e51764aSArtem Bityutskiy if (c->fail_delay == 1) { 2124*1e51764aSArtem Bityutskiy if (time_before(jiffies, c->fail_timeout)) 2125*1e51764aSArtem Bityutskiy return 0; 2126*1e51764aSArtem Bityutskiy } else if (c->fail_delay == 2) 2127*1e51764aSArtem Bityutskiy if (c->fail_cnt++ < c->fail_cnt_max) 2128*1e51764aSArtem Bityutskiy return 0; 2129*1e51764aSArtem Bityutskiy if (lnum == UBIFS_SB_LNUM) { 2130*1e51764aSArtem Bityutskiy if (write) { 2131*1e51764aSArtem Bityutskiy if (chance(1, 2)) 2132*1e51764aSArtem Bityutskiy return 0; 2133*1e51764aSArtem Bityutskiy } else if (chance(19, 20)) 2134*1e51764aSArtem Bityutskiy return 0; 2135*1e51764aSArtem Bityutskiy dbg_rcvry("failing in super block LEB %d", lnum); 2136*1e51764aSArtem Bityutskiy } else if (lnum == UBIFS_MST_LNUM || lnum == UBIFS_MST_LNUM + 1) { 2137*1e51764aSArtem Bityutskiy if (chance(19, 20)) 2138*1e51764aSArtem Bityutskiy return 0; 2139*1e51764aSArtem Bityutskiy dbg_rcvry("failing in master LEB %d", lnum); 2140*1e51764aSArtem Bityutskiy } else if (lnum >= UBIFS_LOG_LNUM && lnum <= c->log_last) { 2141*1e51764aSArtem Bityutskiy if (write) { 2142*1e51764aSArtem Bityutskiy if (chance(99, 100)) 2143*1e51764aSArtem Bityutskiy return 0; 2144*1e51764aSArtem Bityutskiy } else if (chance(399, 400)) 2145*1e51764aSArtem Bityutskiy return 0; 2146*1e51764aSArtem Bityutskiy dbg_rcvry("failing in log LEB %d", lnum); 2147*1e51764aSArtem Bityutskiy } else if (lnum >= c->lpt_first && lnum <= c->lpt_last) { 2148*1e51764aSArtem Bityutskiy if (write) { 2149*1e51764aSArtem Bityutskiy if (chance(7, 8)) 2150*1e51764aSArtem Bityutskiy return 0; 2151*1e51764aSArtem Bityutskiy } else if (chance(19, 20)) 2152*1e51764aSArtem Bityutskiy return 0; 2153*1e51764aSArtem Bityutskiy dbg_rcvry("failing in LPT LEB %d", lnum); 2154*1e51764aSArtem Bityutskiy } else if (lnum >= c->orph_first && lnum <= c->orph_last) { 2155*1e51764aSArtem Bityutskiy if (write) { 2156*1e51764aSArtem Bityutskiy if (chance(1, 2)) 2157*1e51764aSArtem Bityutskiy return 0; 2158*1e51764aSArtem Bityutskiy } else if (chance(9, 10)) 2159*1e51764aSArtem Bityutskiy return 0; 2160*1e51764aSArtem Bityutskiy dbg_rcvry("failing in orphan LEB %d", lnum); 2161*1e51764aSArtem Bityutskiy } else if (lnum == c->ihead_lnum) { 2162*1e51764aSArtem Bityutskiy if (chance(99, 100)) 2163*1e51764aSArtem Bityutskiy return 0; 2164*1e51764aSArtem Bityutskiy dbg_rcvry("failing in index head LEB %d", lnum); 2165*1e51764aSArtem Bityutskiy } else if (c->jheads && lnum == c->jheads[GCHD].wbuf.lnum) { 2166*1e51764aSArtem Bityutskiy if (chance(9, 10)) 2167*1e51764aSArtem Bityutskiy return 0; 2168*1e51764aSArtem Bityutskiy dbg_rcvry("failing in GC head LEB %d", lnum); 2169*1e51764aSArtem Bityutskiy } else if (write && !RB_EMPTY_ROOT(&c->buds) && 2170*1e51764aSArtem Bityutskiy !ubifs_search_bud(c, lnum)) { 2171*1e51764aSArtem Bityutskiy if (chance(19, 20)) 2172*1e51764aSArtem Bityutskiy return 0; 2173*1e51764aSArtem Bityutskiy dbg_rcvry("failing in non-bud LEB %d", lnum); 2174*1e51764aSArtem Bityutskiy } else if (c->cmt_state == COMMIT_RUNNING_BACKGROUND || 2175*1e51764aSArtem Bityutskiy c->cmt_state == COMMIT_RUNNING_REQUIRED) { 2176*1e51764aSArtem Bityutskiy if (chance(999, 1000)) 2177*1e51764aSArtem Bityutskiy return 0; 2178*1e51764aSArtem Bityutskiy dbg_rcvry("failing in bud LEB %d commit running", lnum); 2179*1e51764aSArtem Bityutskiy } else { 2180*1e51764aSArtem Bityutskiy if (chance(9999, 10000)) 2181*1e51764aSArtem Bityutskiy return 0; 2182*1e51764aSArtem Bityutskiy dbg_rcvry("failing in bud LEB %d commit not running", lnum); 2183*1e51764aSArtem Bityutskiy } 2184*1e51764aSArtem Bityutskiy ubifs_err("*** SETTING FAILURE MODE ON (LEB %d) ***", lnum); 2185*1e51764aSArtem Bityutskiy c->failure_mode = 1; 2186*1e51764aSArtem Bityutskiy dump_stack(); 2187*1e51764aSArtem Bityutskiy return 1; 2188*1e51764aSArtem Bityutskiy } 2189*1e51764aSArtem Bityutskiy 2190*1e51764aSArtem Bityutskiy static void cut_data(const void *buf, int len) 2191*1e51764aSArtem Bityutskiy { 2192*1e51764aSArtem Bityutskiy int flen, i; 2193*1e51764aSArtem Bityutskiy unsigned char *p = (void *)buf; 2194*1e51764aSArtem Bityutskiy 2195*1e51764aSArtem Bityutskiy flen = (len * (long long)simple_rand()) >> 15; 2196*1e51764aSArtem Bityutskiy for (i = flen; i < len; i++) 2197*1e51764aSArtem Bityutskiy p[i] = 0xff; 2198*1e51764aSArtem Bityutskiy } 2199*1e51764aSArtem Bityutskiy 2200*1e51764aSArtem Bityutskiy int dbg_leb_read(struct ubi_volume_desc *desc, int lnum, char *buf, int offset, 2201*1e51764aSArtem Bityutskiy int len, int check) 2202*1e51764aSArtem Bityutskiy { 2203*1e51764aSArtem Bityutskiy if (in_failure_mode(desc)) 2204*1e51764aSArtem Bityutskiy return -EIO; 2205*1e51764aSArtem Bityutskiy return ubi_leb_read(desc, lnum, buf, offset, len, check); 2206*1e51764aSArtem Bityutskiy } 2207*1e51764aSArtem Bityutskiy 2208*1e51764aSArtem Bityutskiy int dbg_leb_write(struct ubi_volume_desc *desc, int lnum, const void *buf, 2209*1e51764aSArtem Bityutskiy int offset, int len, int dtype) 2210*1e51764aSArtem Bityutskiy { 2211*1e51764aSArtem Bityutskiy int err; 2212*1e51764aSArtem Bityutskiy 2213*1e51764aSArtem Bityutskiy if (in_failure_mode(desc)) 2214*1e51764aSArtem Bityutskiy return -EIO; 2215*1e51764aSArtem Bityutskiy if (do_fail(desc, lnum, 1)) 2216*1e51764aSArtem Bityutskiy cut_data(buf, len); 2217*1e51764aSArtem Bityutskiy err = ubi_leb_write(desc, lnum, buf, offset, len, dtype); 2218*1e51764aSArtem Bityutskiy if (err) 2219*1e51764aSArtem Bityutskiy return err; 2220*1e51764aSArtem Bityutskiy if (in_failure_mode(desc)) 2221*1e51764aSArtem Bityutskiy return -EIO; 2222*1e51764aSArtem Bityutskiy return 0; 2223*1e51764aSArtem Bityutskiy } 2224*1e51764aSArtem Bityutskiy 2225*1e51764aSArtem Bityutskiy int dbg_leb_change(struct ubi_volume_desc *desc, int lnum, const void *buf, 2226*1e51764aSArtem Bityutskiy int len, int dtype) 2227*1e51764aSArtem Bityutskiy { 2228*1e51764aSArtem Bityutskiy int err; 2229*1e51764aSArtem Bityutskiy 2230*1e51764aSArtem Bityutskiy if (do_fail(desc, lnum, 1)) 2231*1e51764aSArtem Bityutskiy return -EIO; 2232*1e51764aSArtem Bityutskiy err = ubi_leb_change(desc, lnum, buf, len, dtype); 2233*1e51764aSArtem Bityutskiy if (err) 2234*1e51764aSArtem Bityutskiy return err; 2235*1e51764aSArtem Bityutskiy if (do_fail(desc, lnum, 1)) 2236*1e51764aSArtem Bityutskiy return -EIO; 2237*1e51764aSArtem Bityutskiy return 0; 2238*1e51764aSArtem Bityutskiy } 2239*1e51764aSArtem Bityutskiy 2240*1e51764aSArtem Bityutskiy int dbg_leb_erase(struct ubi_volume_desc *desc, int lnum) 2241*1e51764aSArtem Bityutskiy { 2242*1e51764aSArtem Bityutskiy int err; 2243*1e51764aSArtem Bityutskiy 2244*1e51764aSArtem Bityutskiy if (do_fail(desc, lnum, 0)) 2245*1e51764aSArtem Bityutskiy return -EIO; 2246*1e51764aSArtem Bityutskiy err = ubi_leb_erase(desc, lnum); 2247*1e51764aSArtem Bityutskiy if (err) 2248*1e51764aSArtem Bityutskiy return err; 2249*1e51764aSArtem Bityutskiy if (do_fail(desc, lnum, 0)) 2250*1e51764aSArtem Bityutskiy return -EIO; 2251*1e51764aSArtem Bityutskiy return 0; 2252*1e51764aSArtem Bityutskiy } 2253*1e51764aSArtem Bityutskiy 2254*1e51764aSArtem Bityutskiy int dbg_leb_unmap(struct ubi_volume_desc *desc, int lnum) 2255*1e51764aSArtem Bityutskiy { 2256*1e51764aSArtem Bityutskiy int err; 2257*1e51764aSArtem Bityutskiy 2258*1e51764aSArtem Bityutskiy if (do_fail(desc, lnum, 0)) 2259*1e51764aSArtem Bityutskiy return -EIO; 2260*1e51764aSArtem Bityutskiy err = ubi_leb_unmap(desc, lnum); 2261*1e51764aSArtem Bityutskiy if (err) 2262*1e51764aSArtem Bityutskiy return err; 2263*1e51764aSArtem Bityutskiy if (do_fail(desc, lnum, 0)) 2264*1e51764aSArtem Bityutskiy return -EIO; 2265*1e51764aSArtem Bityutskiy return 0; 2266*1e51764aSArtem Bityutskiy } 2267*1e51764aSArtem Bityutskiy 2268*1e51764aSArtem Bityutskiy int dbg_is_mapped(struct ubi_volume_desc *desc, int lnum) 2269*1e51764aSArtem Bityutskiy { 2270*1e51764aSArtem Bityutskiy if (in_failure_mode(desc)) 2271*1e51764aSArtem Bityutskiy return -EIO; 2272*1e51764aSArtem Bityutskiy return ubi_is_mapped(desc, lnum); 2273*1e51764aSArtem Bityutskiy } 2274*1e51764aSArtem Bityutskiy 2275*1e51764aSArtem Bityutskiy int dbg_leb_map(struct ubi_volume_desc *desc, int lnum, int dtype) 2276*1e51764aSArtem Bityutskiy { 2277*1e51764aSArtem Bityutskiy int err; 2278*1e51764aSArtem Bityutskiy 2279*1e51764aSArtem Bityutskiy if (do_fail(desc, lnum, 0)) 2280*1e51764aSArtem Bityutskiy return -EIO; 2281*1e51764aSArtem Bityutskiy err = ubi_leb_map(desc, lnum, dtype); 2282*1e51764aSArtem Bityutskiy if (err) 2283*1e51764aSArtem Bityutskiy return err; 2284*1e51764aSArtem Bityutskiy if (do_fail(desc, lnum, 0)) 2285*1e51764aSArtem Bityutskiy return -EIO; 2286*1e51764aSArtem Bityutskiy return 0; 2287*1e51764aSArtem Bityutskiy } 2288*1e51764aSArtem Bityutskiy 2289*1e51764aSArtem Bityutskiy #endif /* CONFIG_UBIFS_FS_DEBUG */ 2290