mirror of
https://github.com/torvalds/linux.git
synced 2024-12-29 14:21:47 +00:00
UBIFS: improve inode dumping function
Teach 'dbg_dump_inode()' dump directory entries for directory inodes. This requires few additional changes: 1. The 'c' argument of 'dbg_dump_inode()' cannot be const any more. 2. Users of 'dbg_dump_inode()' should not have 'tnc_mutex' locked. Signed-off-by: Artem Bityutskiy <Artem.Bityutskiy@nokia.com>
This commit is contained in:
parent
bfcf677dec
commit
4315fb4072
@ -91,6 +91,28 @@ static const char *get_key_type(int type)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static const char *get_dent_type(int type)
|
||||||
|
{
|
||||||
|
switch (type) {
|
||||||
|
case UBIFS_ITYPE_REG:
|
||||||
|
return "file";
|
||||||
|
case UBIFS_ITYPE_DIR:
|
||||||
|
return "dir";
|
||||||
|
case UBIFS_ITYPE_LNK:
|
||||||
|
return "symlink";
|
||||||
|
case UBIFS_ITYPE_BLK:
|
||||||
|
return "blkdev";
|
||||||
|
case UBIFS_ITYPE_CHR:
|
||||||
|
return "char dev";
|
||||||
|
case UBIFS_ITYPE_FIFO:
|
||||||
|
return "fifo";
|
||||||
|
case UBIFS_ITYPE_SOCK:
|
||||||
|
return "socket";
|
||||||
|
default:
|
||||||
|
return "unknown/invalid type";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void sprintf_key(const struct ubifs_info *c, const union ubifs_key *key,
|
static void sprintf_key(const struct ubifs_info *c, const union ubifs_key *key,
|
||||||
char *buffer)
|
char *buffer)
|
||||||
{
|
{
|
||||||
@ -234,9 +256,13 @@ static void dump_ch(const struct ubifs_ch *ch)
|
|||||||
printk(KERN_DEBUG "\tlen %u\n", le32_to_cpu(ch->len));
|
printk(KERN_DEBUG "\tlen %u\n", le32_to_cpu(ch->len));
|
||||||
}
|
}
|
||||||
|
|
||||||
void dbg_dump_inode(const struct ubifs_info *c, const struct inode *inode)
|
void dbg_dump_inode(struct ubifs_info *c, const struct inode *inode)
|
||||||
{
|
{
|
||||||
const struct ubifs_inode *ui = ubifs_inode(inode);
|
const struct ubifs_inode *ui = ubifs_inode(inode);
|
||||||
|
struct qstr nm = { .name = NULL };
|
||||||
|
union ubifs_key key;
|
||||||
|
struct ubifs_dent_node *dent, *pdent = NULL;
|
||||||
|
int count = 2;
|
||||||
|
|
||||||
printk(KERN_DEBUG "Dump in-memory inode:");
|
printk(KERN_DEBUG "Dump in-memory inode:");
|
||||||
printk(KERN_DEBUG "\tinode %lu\n", inode->i_ino);
|
printk(KERN_DEBUG "\tinode %lu\n", inode->i_ino);
|
||||||
@ -270,6 +296,32 @@ void dbg_dump_inode(const struct ubifs_info *c, const struct inode *inode)
|
|||||||
printk(KERN_DEBUG "\tlast_page_read %lu\n", ui->last_page_read);
|
printk(KERN_DEBUG "\tlast_page_read %lu\n", ui->last_page_read);
|
||||||
printk(KERN_DEBUG "\tread_in_a_row %lu\n", ui->read_in_a_row);
|
printk(KERN_DEBUG "\tread_in_a_row %lu\n", ui->read_in_a_row);
|
||||||
printk(KERN_DEBUG "\tdata_len %d\n", ui->data_len);
|
printk(KERN_DEBUG "\tdata_len %d\n", ui->data_len);
|
||||||
|
|
||||||
|
if (!S_ISDIR(inode->i_mode))
|
||||||
|
return;
|
||||||
|
|
||||||
|
printk(KERN_DEBUG "List of directory entries:\n");
|
||||||
|
ubifs_assert(!mutex_is_locked(&c->tnc_mutex));
|
||||||
|
|
||||||
|
lowest_dent_key(c, &key, inode->i_ino);
|
||||||
|
while (1) {
|
||||||
|
dent = ubifs_tnc_next_ent(c, &key, &nm);
|
||||||
|
if (IS_ERR(dent)) {
|
||||||
|
if (PTR_ERR(dent) != -ENOENT)
|
||||||
|
printk(KERN_DEBUG "error %ld\n", PTR_ERR(dent));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
printk(KERN_DEBUG "\t%d: %s (%s)\n",
|
||||||
|
count++, dent->name, get_dent_type(dent->type));
|
||||||
|
|
||||||
|
nm.name = dent->name;
|
||||||
|
nm.len = le16_to_cpu(dent->nlen);
|
||||||
|
kfree(pdent);
|
||||||
|
pdent = dent;
|
||||||
|
key_read(c, &dent->key, &key);
|
||||||
|
}
|
||||||
|
kfree(pdent);
|
||||||
}
|
}
|
||||||
|
|
||||||
void dbg_dump_node(const struct ubifs_info *c, const void *node)
|
void dbg_dump_node(const struct ubifs_info *c, const void *node)
|
||||||
@ -1167,12 +1219,14 @@ int dbg_check_dir_size(struct ubifs_info *c, const struct inode *dir)
|
|||||||
"but calculated size is %llu", dir->i_ino,
|
"but calculated size is %llu", dir->i_ino,
|
||||||
(unsigned long long)i_size_read(dir),
|
(unsigned long long)i_size_read(dir),
|
||||||
(unsigned long long)size);
|
(unsigned long long)size);
|
||||||
|
dbg_dump_inode(c, dir);
|
||||||
dump_stack();
|
dump_stack();
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
if (dir->i_nlink != nlink) {
|
if (dir->i_nlink != nlink) {
|
||||||
ubifs_err("directory inode %lu has nlink %u, but calculated "
|
ubifs_err("directory inode %lu has nlink %u, but calculated "
|
||||||
"nlink is %u", dir->i_ino, dir->i_nlink, nlink);
|
"nlink is %u", dir->i_ino, dir->i_nlink, nlink);
|
||||||
|
dbg_dump_inode(c, dir);
|
||||||
dump_stack();
|
dump_stack();
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
@ -214,7 +214,7 @@ const char *dbg_cstate(int cmt_state);
|
|||||||
const char *dbg_jhead(int jhead);
|
const char *dbg_jhead(int jhead);
|
||||||
const char *dbg_get_key_dump(const struct ubifs_info *c,
|
const char *dbg_get_key_dump(const struct ubifs_info *c,
|
||||||
const union ubifs_key *key);
|
const union ubifs_key *key);
|
||||||
void dbg_dump_inode(const struct ubifs_info *c, const struct inode *inode);
|
void dbg_dump_inode(struct ubifs_info *c, const struct inode *inode);
|
||||||
void dbg_dump_node(const struct ubifs_info *c, const void *node);
|
void dbg_dump_node(const struct ubifs_info *c, const void *node);
|
||||||
void dbg_dump_lpt_node(const struct ubifs_info *c, void *node, int lnum,
|
void dbg_dump_lpt_node(const struct ubifs_info *c, void *node, int lnum,
|
||||||
int offs);
|
int offs);
|
||||||
@ -364,7 +364,7 @@ static inline const char *dbg_jhead(int jhead) { return ""; }
|
|||||||
static inline const char *
|
static inline const char *
|
||||||
dbg_get_key_dump(const struct ubifs_info *c,
|
dbg_get_key_dump(const struct ubifs_info *c,
|
||||||
const union ubifs_key *key) { return ""; }
|
const union ubifs_key *key) { return ""; }
|
||||||
static inline void dbg_dump_inode(const struct ubifs_info *c,
|
static inline void dbg_dump_inode(struct ubifs_info *c,
|
||||||
const struct inode *inode) { return; }
|
const struct inode *inode) { return; }
|
||||||
static inline void dbg_dump_node(const struct ubifs_info *c,
|
static inline void dbg_dump_node(const struct ubifs_info *c,
|
||||||
const void *node) { return; }
|
const void *node) { return; }
|
||||||
@ -418,7 +418,7 @@ static inline int dbg_chk_lpt_sz(struct ubifs_info *c,
|
|||||||
int action, int len) { return 0; }
|
int action, int len) { return 0; }
|
||||||
static inline int dbg_check_synced_i_size(struct inode *inode) { return 0; }
|
static inline int dbg_check_synced_i_size(struct inode *inode) { return 0; }
|
||||||
static inline int dbg_check_dir_size(struct ubifs_info *c,
|
static inline int dbg_check_dir_size(struct ubifs_info *c,
|
||||||
const struct inode *dir) { return 0; }
|
const struct inode *dir) { return 0; }
|
||||||
static inline int dbg_check_tnc(struct ubifs_info *c, int extra) { return 0; }
|
static inline int dbg_check_tnc(struct ubifs_info *c, int extra) { return 0; }
|
||||||
static inline int dbg_check_idx_size(struct ubifs_info *c,
|
static inline int dbg_check_idx_size(struct ubifs_info *c,
|
||||||
long long idx_size) { return 0; }
|
long long idx_size) { return 0; }
|
||||||
|
@ -3337,9 +3337,10 @@ out_dump:
|
|||||||
ubifs_err("inode %lu has size %lld, but there are data at offset %lld "
|
ubifs_err("inode %lu has size %lld, but there are data at offset %lld "
|
||||||
"(data key %s)", (unsigned long)inode->i_ino, size,
|
"(data key %s)", (unsigned long)inode->i_ino, size,
|
||||||
((loff_t)block) << UBIFS_BLOCK_SHIFT, DBGKEY(key));
|
((loff_t)block) << UBIFS_BLOCK_SHIFT, DBGKEY(key));
|
||||||
|
mutex_unlock(&c->tnc_mutex);
|
||||||
dbg_dump_inode(c, inode);
|
dbg_dump_inode(c, inode);
|
||||||
dbg_dump_stack();
|
dbg_dump_stack();
|
||||||
err = -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
out_unlock:
|
out_unlock:
|
||||||
mutex_unlock(&c->tnc_mutex);
|
mutex_unlock(&c->tnc_mutex);
|
||||||
|
Loading…
Reference in New Issue
Block a user