mirror of
https://github.com/FEX-Emu/linux.git
synced 2024-11-27 17:41:49 +00:00
This pull request contains changes for JFFS2, UBI and UBIFS:
JFFS2: - Fix for a remount regression - Fix for an abnormal GC exit - Fix for a possible NULL pointer issue while mounting UBI: - Add support ECC-ed NOR flash - Removal of dead code UBIFS: - Make node dumping debug code more reliable - Various cleanups: less ifdefs, less typos - Fix for an info leak -----BEGIN PGP SIGNATURE----- iQJKBAABCAA0FiEEdgfidid8lnn52cLTZvlZhesYu8EFAl/bz/QWHHJpY2hhcmRA c2lnbWEtc3Rhci5hdAAKCRBm+VmF6xi7we/oEACXviHbzozgU1tSWrkBnekgya/b U3SgPF/IbwSKf1ChV8kiZNiSuMVeulEKi3aaXMaM2uOlH7tSjlQC4sWLJwi5Uq01 fCdS+NcCPuVp52mtoYRDb5rnfRJ8c4KTq9sIOfQ2gUvUYo0zQXRbR3csrOC/94hS +m/0Ms+oUgvZKj1TVPEoNwsXHsEmqz/vR3VbpJBOlAdcRL39ZbLVHGYq4WFwFK4u m2ZDFgUkopMDhp2f4cWa5QDsfh+gHU/+PKh+KnLAtTvUgjrBg19aCoLDiaHpVmjH Zc3XRi37skTsNeGaAFH7McegT2Gvgsux/cFDn9kMNd8GOJadl8ZhGZU1qfXR0lNW XYfpcZ0/WFiNVV68+vv773A2VE3MTNICHZNW1WvH4gUtZN9EDsqV1XhzqHxXufuo flmGR/AQj2SyUB51B+b1OW1PsqW+rO/5tZx+EqaguHtzGCIO+3VYdEJ/+JDdNrix ucxYzqD1DubBo2TDJzw9GWBYotOj6kGaBzpOdjBr3b9izS2lBbh1/cP0LL+cbSY0 wqksyYG+24GKr20dXLPYIfHGRYHm5yQcJ4ihx4BLGwogKPp/OnVWPsjZIIY7mN17 ib2twE5UoOD2U7goAi1Iqfjj8YAWFehzQvu+f/EjJZVenKmA8n2JAtFDhgn5C4gE Gr51WeHfa2gbnKjh4A== =rWLy -----END PGP SIGNATURE----- Merge tag 'for-linus-5.11-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/rw/ubifs Pull jffs2, ubi and ubifs updates from Richard Weinberger: "JFFS2: - Fix for a remount regression - Fix for an abnormal GC exit - Fix for a possible NULL pointer issue while mounting UBI: - Add support ECC-ed NOR flash - Removal of dead code UBIFS: - Make node dumping debug code more reliable - Various cleanups: less ifdefs, less typos - Fix for an info leak" * tag 'for-linus-5.11-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/rw/ubifs: ubifs: ubifs_dump_node: Dump all branches of the index node ubifs: ubifs_dump_sleb: Remove unused function ubifs: Pass node length in all node dumping callers Revert "ubifs: Fix out-of-bounds memory access caused by abnormal value of node_len" ubifs: Limit dumping length by size of memory which is allocated for the node ubifs: Remove the redundant return in dbg_check_nondata_nodes_order jffs2: Fix NULL pointer dereference in rp_size fs option parsing ubifs: Fixed print foramt mismatch in ubifs ubi: Do not zero out EC and VID on ECC-ed NOR flashes jffs2: remove trailing semicolon in macro definition ubifs: Fix error return code in ubifs_init_authentication() ubifs: wbuf: Don't leak kernel memory to flash ubi: Remove useless code in bytes_str_to_int ubifs: Fix the printing type of c->big_lpt jffs2: Allow setting rp_size to zero during remounting jffs2: Fix ignoring mounting options problem during remounting jffs2: Fix GC exit abnormally ubifs: Code cleanup by removing ifdef macro surrounding jffs2: Fix if/else empty body warnings ubifs: Delete duplicated words + other fixes
This commit is contained in:
commit
787fec8ac1
@ -629,10 +629,8 @@ static int io_init(struct ubi_device *ubi, int max_beb_per1024)
|
||||
ubi->bad_peb_limit = get_bad_peb_limit(ubi, max_beb_per1024);
|
||||
}
|
||||
|
||||
if (ubi->mtd->type == MTD_NORFLASH) {
|
||||
ubi_assert(ubi->mtd->writesize == 1);
|
||||
if (ubi->mtd->type == MTD_NORFLASH)
|
||||
ubi->nor_flash = 1;
|
||||
}
|
||||
|
||||
ubi->min_io_size = ubi->mtd->writesize;
|
||||
ubi->hdrs_min_io_size = ubi->mtd->writesize >> ubi->mtd->subpage_sft;
|
||||
@ -1352,8 +1350,6 @@ static int bytes_str_to_int(const char *str)
|
||||
fallthrough;
|
||||
case 'K':
|
||||
result *= 1024;
|
||||
if (endp[1] == 'i' && endp[2] == 'B')
|
||||
endp += 2;
|
||||
case '\0':
|
||||
break;
|
||||
default:
|
||||
|
@ -535,7 +535,14 @@ int ubi_io_sync_erase(struct ubi_device *ubi, int pnum, int torture)
|
||||
return -EROFS;
|
||||
}
|
||||
|
||||
if (ubi->nor_flash) {
|
||||
/*
|
||||
* If the flash is ECC-ed then we have to erase the ECC block before we
|
||||
* can write to it. But the write is in preparation to an erase in the
|
||||
* first place. This means we cannot zero out EC and VID before the
|
||||
* erase and we just have to hope the flash starts erasing from the
|
||||
* start of the page.
|
||||
*/
|
||||
if (ubi->nor_flash && ubi->mtd->writesize == 1) {
|
||||
err = nor_erase_prepare(ubi, pnum);
|
||||
if (err)
|
||||
return err;
|
||||
|
@ -13,6 +13,7 @@
|
||||
#ifndef _JFFS2_DEBUG_H_
|
||||
#define _JFFS2_DEBUG_H_
|
||||
|
||||
#include <linux/printk.h>
|
||||
#include <linux/sched.h>
|
||||
|
||||
#ifndef CONFIG_JFFS2_FS_DEBUG
|
||||
@ -99,73 +100,73 @@ do { \
|
||||
#ifdef JFFS2_DBG_READINODE_MESSAGES
|
||||
#define dbg_readinode(fmt, ...) JFFS2_DEBUG(fmt, ##__VA_ARGS__)
|
||||
#else
|
||||
#define dbg_readinode(fmt, ...)
|
||||
#define dbg_readinode(fmt, ...) no_printk(fmt, ##__VA_ARGS__)
|
||||
#endif
|
||||
#ifdef JFFS2_DBG_READINODE2_MESSAGES
|
||||
#define dbg_readinode2(fmt, ...) JFFS2_DEBUG(fmt, ##__VA_ARGS__)
|
||||
#else
|
||||
#define dbg_readinode2(fmt, ...)
|
||||
#define dbg_readinode2(fmt, ...) no_printk(fmt, ##__VA_ARGS__)
|
||||
#endif
|
||||
|
||||
/* Fragtree build debugging messages */
|
||||
#ifdef JFFS2_DBG_FRAGTREE_MESSAGES
|
||||
#define dbg_fragtree(fmt, ...) JFFS2_DEBUG(fmt, ##__VA_ARGS__)
|
||||
#else
|
||||
#define dbg_fragtree(fmt, ...)
|
||||
#define dbg_fragtree(fmt, ...) no_printk(fmt, ##__VA_ARGS__)
|
||||
#endif
|
||||
#ifdef JFFS2_DBG_FRAGTREE2_MESSAGES
|
||||
#define dbg_fragtree2(fmt, ...) JFFS2_DEBUG(fmt, ##__VA_ARGS__)
|
||||
#else
|
||||
#define dbg_fragtree2(fmt, ...)
|
||||
#define dbg_fragtree2(fmt, ...) no_printk(fmt, ##__VA_ARGS__)
|
||||
#endif
|
||||
|
||||
/* Directory entry list manilulation debugging messages */
|
||||
#ifdef JFFS2_DBG_DENTLIST_MESSAGES
|
||||
#define dbg_dentlist(fmt, ...) JFFS2_DEBUG(fmt, ##__VA_ARGS__)
|
||||
#else
|
||||
#define dbg_dentlist(fmt, ...)
|
||||
#define dbg_dentlist(fmt, ...) no_printk(fmt, ##__VA_ARGS__)
|
||||
#endif
|
||||
|
||||
/* Print the messages about manipulating node_refs */
|
||||
#ifdef JFFS2_DBG_NODEREF_MESSAGES
|
||||
#define dbg_noderef(fmt, ...) JFFS2_DEBUG(fmt, ##__VA_ARGS__)
|
||||
#else
|
||||
#define dbg_noderef(fmt, ...)
|
||||
#define dbg_noderef(fmt, ...) no_printk(fmt, ##__VA_ARGS__)
|
||||
#endif
|
||||
|
||||
/* Manipulations with the list of inodes (JFFS2 inocache) */
|
||||
#ifdef JFFS2_DBG_INOCACHE_MESSAGES
|
||||
#define dbg_inocache(fmt, ...) JFFS2_DEBUG(fmt, ##__VA_ARGS__)
|
||||
#else
|
||||
#define dbg_inocache(fmt, ...)
|
||||
#define dbg_inocache(fmt, ...) no_printk(fmt, ##__VA_ARGS__)
|
||||
#endif
|
||||
|
||||
/* Summary debugging messages */
|
||||
#ifdef JFFS2_DBG_SUMMARY_MESSAGES
|
||||
#define dbg_summary(fmt, ...) JFFS2_DEBUG(fmt, ##__VA_ARGS__)
|
||||
#else
|
||||
#define dbg_summary(fmt, ...)
|
||||
#define dbg_summary(fmt, ...) no_printk(fmt, ##__VA_ARGS__)
|
||||
#endif
|
||||
|
||||
/* File system build messages */
|
||||
#ifdef JFFS2_DBG_FSBUILD_MESSAGES
|
||||
#define dbg_fsbuild(fmt, ...) JFFS2_DEBUG(fmt, ##__VA_ARGS__)
|
||||
#else
|
||||
#define dbg_fsbuild(fmt, ...)
|
||||
#define dbg_fsbuild(fmt, ...) no_printk(fmt, ##__VA_ARGS__)
|
||||
#endif
|
||||
|
||||
/* Watch the object allocations */
|
||||
#ifdef JFFS2_DBG_MEMALLOC_MESSAGES
|
||||
#define dbg_memalloc(fmt, ...) JFFS2_DEBUG(fmt, ##__VA_ARGS__)
|
||||
#else
|
||||
#define dbg_memalloc(fmt, ...)
|
||||
#define dbg_memalloc(fmt, ...) no_printk(fmt, ##__VA_ARGS__)
|
||||
#endif
|
||||
|
||||
/* Watch the XATTR subsystem */
|
||||
#ifdef JFFS2_DBG_XATTR_MESSAGES
|
||||
#define dbg_xattr(fmt, ...) JFFS2_DEBUG(fmt, ##__VA_ARGS__)
|
||||
#else
|
||||
#define dbg_xattr(fmt, ...)
|
||||
#define dbg_xattr(fmt, ...) no_printk(fmt, ##__VA_ARGS__)
|
||||
#endif
|
||||
|
||||
/* "Sanity" checks */
|
||||
|
@ -38,6 +38,7 @@ struct jffs2_mount_opts {
|
||||
* users. This is implemented simply by means of not allowing the
|
||||
* latter users to write to the file system if the amount if the
|
||||
* available space is less then 'rp_size'. */
|
||||
bool set_rp_size;
|
||||
unsigned int rp_size;
|
||||
};
|
||||
|
||||
|
@ -349,14 +349,14 @@ static inline struct jffs2_node_frag *frag_last(struct rb_root *root)
|
||||
#define frag_parent(frag) rb_entry(rb_parent(&(frag)->rb), struct jffs2_node_frag, rb)
|
||||
#define frag_left(frag) rb_entry((frag)->rb.rb_left, struct jffs2_node_frag, rb)
|
||||
#define frag_right(frag) rb_entry((frag)->rb.rb_right, struct jffs2_node_frag, rb)
|
||||
#define frag_erase(frag, list) rb_erase(&frag->rb, list);
|
||||
#define frag_erase(frag, list) rb_erase(&frag->rb, list)
|
||||
|
||||
#define tn_next(tn) rb_entry(rb_next(&(tn)->rb), struct jffs2_tmp_dnode_info, rb)
|
||||
#define tn_prev(tn) rb_entry(rb_prev(&(tn)->rb), struct jffs2_tmp_dnode_info, rb)
|
||||
#define tn_parent(tn) rb_entry(rb_parent(&(tn)->rb), struct jffs2_tmp_dnode_info, rb)
|
||||
#define tn_left(tn) rb_entry((tn)->rb.rb_left, struct jffs2_tmp_dnode_info, rb)
|
||||
#define tn_right(tn) rb_entry((tn)->rb.rb_right, struct jffs2_tmp_dnode_info, rb)
|
||||
#define tn_erase(tn, list) rb_erase(&tn->rb, list);
|
||||
#define tn_erase(tn, list) rb_erase(&tn->rb, list)
|
||||
#define tn_last(list) rb_entry(rb_last(list), struct jffs2_tmp_dnode_info, rb)
|
||||
#define tn_first(list) rb_entry(rb_first(list), struct jffs2_tmp_dnode_info, rb)
|
||||
|
||||
|
@ -672,6 +672,22 @@ static inline int read_direntry(struct jffs2_sb_info *c, struct jffs2_raw_node_r
|
||||
jffs2_free_full_dirent(fd);
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_JFFS2_SUMMARY
|
||||
/*
|
||||
* we use CONFIG_JFFS2_SUMMARY because without it, we
|
||||
* have checked it while mounting
|
||||
*/
|
||||
crc = crc32(0, fd->name, rd->nsize);
|
||||
if (unlikely(crc != je32_to_cpu(rd->name_crc))) {
|
||||
JFFS2_NOTICE("name CRC failed on dirent node at"
|
||||
"%#08x: read %#08x,calculated %#08x\n",
|
||||
ref_offset(ref), je32_to_cpu(rd->node_crc), crc);
|
||||
jffs2_mark_node_obsolete(c, ref);
|
||||
jffs2_free_full_dirent(fd);
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
fd->nhash = full_name_hash(NULL, fd->name, rd->nsize);
|
||||
|
@ -88,7 +88,7 @@ static int jffs2_show_options(struct seq_file *s, struct dentry *root)
|
||||
|
||||
if (opts->override_compr)
|
||||
seq_printf(s, ",compr=%s", jffs2_compr_name(opts->compr));
|
||||
if (opts->rp_size)
|
||||
if (opts->set_rp_size)
|
||||
seq_printf(s, ",rp_size=%u", opts->rp_size / 1024);
|
||||
|
||||
return 0;
|
||||
@ -202,11 +202,8 @@ static int jffs2_parse_param(struct fs_context *fc, struct fs_parameter *param)
|
||||
case Opt_rp_size:
|
||||
if (result.uint_32 > UINT_MAX / 1024)
|
||||
return invalf(fc, "jffs2: rp_size unrepresentable");
|
||||
opt = result.uint_32 * 1024;
|
||||
if (opt > c->mtd->size)
|
||||
return invalf(fc, "jffs2: Too large reserve pool specified, max is %llu KB",
|
||||
c->mtd->size / 1024);
|
||||
c->mount_opts.rp_size = opt;
|
||||
c->mount_opts.rp_size = result.uint_32 * 1024;
|
||||
c->mount_opts.set_rp_size = true;
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
@ -215,11 +212,30 @@ static int jffs2_parse_param(struct fs_context *fc, struct fs_parameter *param)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void jffs2_update_mount_opts(struct fs_context *fc)
|
||||
{
|
||||
struct jffs2_sb_info *new_c = fc->s_fs_info;
|
||||
struct jffs2_sb_info *c = JFFS2_SB_INFO(fc->root->d_sb);
|
||||
|
||||
mutex_lock(&c->alloc_sem);
|
||||
if (new_c->mount_opts.override_compr) {
|
||||
c->mount_opts.override_compr = new_c->mount_opts.override_compr;
|
||||
c->mount_opts.compr = new_c->mount_opts.compr;
|
||||
}
|
||||
if (new_c->mount_opts.set_rp_size) {
|
||||
c->mount_opts.set_rp_size = new_c->mount_opts.set_rp_size;
|
||||
c->mount_opts.rp_size = new_c->mount_opts.rp_size;
|
||||
}
|
||||
mutex_unlock(&c->alloc_sem);
|
||||
}
|
||||
|
||||
static int jffs2_reconfigure(struct fs_context *fc)
|
||||
{
|
||||
struct super_block *sb = fc->root->d_sb;
|
||||
|
||||
sync_filesystem(sb);
|
||||
jffs2_update_mount_opts(fc);
|
||||
|
||||
return jffs2_do_remount_fs(sb, fc);
|
||||
}
|
||||
|
||||
@ -249,6 +265,10 @@ static int jffs2_fill_super(struct super_block *sb, struct fs_context *fc)
|
||||
c->mtd = sb->s_mtd;
|
||||
c->os_priv = sb;
|
||||
|
||||
if (c->mount_opts.rp_size > c->mtd->size)
|
||||
return invalf(fc, "jffs2: Too large reserve pool specified, max is %llu KB",
|
||||
c->mtd->size / 1024);
|
||||
|
||||
/* Initialize JFFS2 superblock locks, the further initialization will
|
||||
* be done later */
|
||||
mutex_init(&c->alloc_sem);
|
||||
|
@ -337,8 +337,10 @@ int ubifs_init_authentication(struct ubifs_info *c)
|
||||
c->authenticated = true;
|
||||
|
||||
c->log_hash = ubifs_hash_get_desc(c);
|
||||
if (IS_ERR(c->log_hash))
|
||||
if (IS_ERR(c->log_hash)) {
|
||||
err = PTR_ERR(c->log_hash);
|
||||
goto out_free_hmac;
|
||||
}
|
||||
|
||||
err = 0;
|
||||
|
||||
|
@ -701,13 +701,13 @@ out:
|
||||
|
||||
out_dump:
|
||||
ubifs_err(c, "dumping index node (iip=%d)", i->iip);
|
||||
ubifs_dump_node(c, idx);
|
||||
ubifs_dump_node(c, idx, ubifs_idx_node_sz(c, c->fanout));
|
||||
list_del(&i->list);
|
||||
kfree(i);
|
||||
if (!list_empty(&list)) {
|
||||
i = list_entry(list.prev, struct idx_node, list);
|
||||
ubifs_err(c, "dumping parent index node");
|
||||
ubifs_dump_node(c, &i->idx);
|
||||
ubifs_dump_node(c, &i->idx, ubifs_idx_node_sz(c, c->fanout));
|
||||
}
|
||||
out_free:
|
||||
while (!list_empty(&list)) {
|
||||
|
116
fs/ubifs/debug.c
116
fs/ubifs/debug.c
@ -291,9 +291,9 @@ void ubifs_dump_inode(struct ubifs_info *c, const struct inode *inode)
|
||||
kfree(pdent);
|
||||
}
|
||||
|
||||
void ubifs_dump_node(const struct ubifs_info *c, const void *node)
|
||||
void ubifs_dump_node(const struct ubifs_info *c, const void *node, int node_len)
|
||||
{
|
||||
int i, n;
|
||||
int i, n, type, safe_len, max_node_len, min_node_len;
|
||||
union ubifs_key key;
|
||||
const struct ubifs_ch *ch = node;
|
||||
char key_buf[DBG_KEY_BUF_LEN];
|
||||
@ -306,10 +306,40 @@ void ubifs_dump_node(const struct ubifs_info *c, const void *node)
|
||||
return;
|
||||
}
|
||||
|
||||
/* Skip dumping unknown type node */
|
||||
type = ch->node_type;
|
||||
if (type < 0 || type >= UBIFS_NODE_TYPES_CNT) {
|
||||
pr_err("node type %d was not recognized\n", type);
|
||||
return;
|
||||
}
|
||||
|
||||
spin_lock(&dbg_lock);
|
||||
dump_ch(node);
|
||||
|
||||
switch (ch->node_type) {
|
||||
if (c->ranges[type].max_len == 0) {
|
||||
max_node_len = min_node_len = c->ranges[type].len;
|
||||
} else {
|
||||
max_node_len = c->ranges[type].max_len;
|
||||
min_node_len = c->ranges[type].min_len;
|
||||
}
|
||||
safe_len = le32_to_cpu(ch->len);
|
||||
safe_len = safe_len > 0 ? safe_len : 0;
|
||||
safe_len = min3(safe_len, max_node_len, node_len);
|
||||
if (safe_len < min_node_len) {
|
||||
pr_err("node len(%d) is too short for %s, left %d bytes:\n",
|
||||
safe_len, dbg_ntype(type),
|
||||
safe_len > UBIFS_CH_SZ ?
|
||||
safe_len - (int)UBIFS_CH_SZ : 0);
|
||||
if (safe_len > UBIFS_CH_SZ)
|
||||
print_hex_dump(KERN_ERR, "", DUMP_PREFIX_OFFSET, 32, 1,
|
||||
(void *)node + UBIFS_CH_SZ,
|
||||
safe_len - UBIFS_CH_SZ, 0);
|
||||
goto out_unlock;
|
||||
}
|
||||
if (safe_len != le32_to_cpu(ch->len))
|
||||
pr_err("\ttruncated node length %d\n", safe_len);
|
||||
|
||||
switch (type) {
|
||||
case UBIFS_PAD_NODE:
|
||||
{
|
||||
const struct ubifs_pad_node *pad = node;
|
||||
@ -453,7 +483,8 @@ void ubifs_dump_node(const struct ubifs_info *c, const void *node)
|
||||
pr_err("\tnlen %d\n", nlen);
|
||||
pr_err("\tname ");
|
||||
|
||||
if (nlen > UBIFS_MAX_NLEN)
|
||||
if (nlen > UBIFS_MAX_NLEN ||
|
||||
nlen > safe_len - UBIFS_DENT_NODE_SZ)
|
||||
pr_err("(bad name length, not printing, bad or corrupted node)");
|
||||
else {
|
||||
for (i = 0; i < nlen && dent->name[i]; i++)
|
||||
@ -467,7 +498,6 @@ void ubifs_dump_node(const struct ubifs_info *c, const void *node)
|
||||
case UBIFS_DATA_NODE:
|
||||
{
|
||||
const struct ubifs_data_node *dn = node;
|
||||
int dlen = le32_to_cpu(ch->len) - UBIFS_DATA_NODE_SZ;
|
||||
|
||||
key_read(c, &dn->key, &key);
|
||||
pr_err("\tkey %s\n",
|
||||
@ -475,10 +505,13 @@ void ubifs_dump_node(const struct ubifs_info *c, const void *node)
|
||||
pr_err("\tsize %u\n", le32_to_cpu(dn->size));
|
||||
pr_err("\tcompr_typ %d\n",
|
||||
(int)le16_to_cpu(dn->compr_type));
|
||||
pr_err("\tdata size %d\n", dlen);
|
||||
pr_err("\tdata:\n");
|
||||
pr_err("\tdata size %u\n",
|
||||
le32_to_cpu(ch->len) - (unsigned int)UBIFS_DATA_NODE_SZ);
|
||||
pr_err("\tdata (length = %d):\n",
|
||||
safe_len - (int)UBIFS_DATA_NODE_SZ);
|
||||
print_hex_dump(KERN_ERR, "\t", DUMP_PREFIX_OFFSET, 32, 1,
|
||||
(void *)&dn->data, dlen, 0);
|
||||
(void *)&dn->data,
|
||||
safe_len - (int)UBIFS_DATA_NODE_SZ, 0);
|
||||
break;
|
||||
}
|
||||
case UBIFS_TRUN_NODE:
|
||||
@ -495,13 +528,16 @@ void ubifs_dump_node(const struct ubifs_info *c, const void *node)
|
||||
case UBIFS_IDX_NODE:
|
||||
{
|
||||
const struct ubifs_idx_node *idx = node;
|
||||
int max_child_cnt = (safe_len - UBIFS_IDX_NODE_SZ) /
|
||||
(ubifs_idx_node_sz(c, 1) -
|
||||
UBIFS_IDX_NODE_SZ);
|
||||
|
||||
n = le16_to_cpu(idx->child_cnt);
|
||||
pr_err("\tchild_cnt %d\n", n);
|
||||
n = min_t(int, le16_to_cpu(idx->child_cnt), max_child_cnt);
|
||||
pr_err("\tchild_cnt %d\n", (int)le16_to_cpu(idx->child_cnt));
|
||||
pr_err("\tlevel %d\n", (int)le16_to_cpu(idx->level));
|
||||
pr_err("\tBranches:\n");
|
||||
|
||||
for (i = 0; i < n && i < c->fanout - 1; i++) {
|
||||
for (i = 0; i < n && i < c->fanout; i++) {
|
||||
const struct ubifs_branch *br;
|
||||
|
||||
br = ubifs_idx_branch(c, idx, i);
|
||||
@ -525,7 +561,7 @@ void ubifs_dump_node(const struct ubifs_info *c, const void *node)
|
||||
le64_to_cpu(orph->cmt_no) & LLONG_MAX);
|
||||
pr_err("\tlast node flag %llu\n",
|
||||
(unsigned long long)(le64_to_cpu(orph->cmt_no)) >> 63);
|
||||
n = (le32_to_cpu(ch->len) - UBIFS_ORPH_NODE_SZ) >> 3;
|
||||
n = (safe_len - UBIFS_ORPH_NODE_SZ) >> 3;
|
||||
pr_err("\t%d orphan inode numbers:\n", n);
|
||||
for (i = 0; i < n; i++)
|
||||
pr_err("\t ino %llu\n",
|
||||
@ -537,9 +573,10 @@ void ubifs_dump_node(const struct ubifs_info *c, const void *node)
|
||||
break;
|
||||
}
|
||||
default:
|
||||
pr_err("node type %d was not recognized\n",
|
||||
(int)ch->node_type);
|
||||
pr_err("node type %d was not recognized\n", type);
|
||||
}
|
||||
|
||||
out_unlock:
|
||||
spin_unlock(&dbg_lock);
|
||||
}
|
||||
|
||||
@ -764,7 +801,7 @@ void ubifs_dump_lpt_info(struct ubifs_info *c)
|
||||
pr_err("\tnnode_sz: %d\n", c->nnode_sz);
|
||||
pr_err("\tltab_sz: %d\n", c->ltab_sz);
|
||||
pr_err("\tlsave_sz: %d\n", c->lsave_sz);
|
||||
pr_err("\tbig_lpt: %d\n", c->big_lpt);
|
||||
pr_err("\tbig_lpt: %u\n", c->big_lpt);
|
||||
pr_err("\tlpt_hght: %d\n", c->lpt_hght);
|
||||
pr_err("\tpnode_cnt: %d\n", c->pnode_cnt);
|
||||
pr_err("\tnnode_cnt: %d\n", c->nnode_cnt);
|
||||
@ -791,22 +828,6 @@ void ubifs_dump_lpt_info(struct ubifs_info *c)
|
||||
spin_unlock(&dbg_lock);
|
||||
}
|
||||
|
||||
void ubifs_dump_sleb(const struct ubifs_info *c,
|
||||
const struct ubifs_scan_leb *sleb, int offs)
|
||||
{
|
||||
struct ubifs_scan_node *snod;
|
||||
|
||||
pr_err("(pid %d) start dumping scanned data from LEB %d:%d\n",
|
||||
current->pid, sleb->lnum, offs);
|
||||
|
||||
list_for_each_entry(snod, &sleb->nodes, list) {
|
||||
cond_resched();
|
||||
pr_err("Dumping node at LEB %d:%d len %d\n",
|
||||
sleb->lnum, snod->offs, snod->len);
|
||||
ubifs_dump_node(c, snod->node);
|
||||
}
|
||||
}
|
||||
|
||||
void ubifs_dump_leb(const struct ubifs_info *c, int lnum)
|
||||
{
|
||||
struct ubifs_scan_leb *sleb;
|
||||
@ -834,7 +855,7 @@ void ubifs_dump_leb(const struct ubifs_info *c, int lnum)
|
||||
cond_resched();
|
||||
pr_err("Dumping node at LEB %d:%d len %d\n", lnum,
|
||||
snod->offs, snod->len);
|
||||
ubifs_dump_node(c, snod->node);
|
||||
ubifs_dump_node(c, snod->node, c->leb_size - snod->offs);
|
||||
}
|
||||
|
||||
pr_err("(pid %d) finish dumping LEB %d\n", current->pid, lnum);
|
||||
@ -1012,7 +1033,7 @@ void dbg_save_space_info(struct ubifs_info *c)
|
||||
*
|
||||
* This function compares current flash space information with the information
|
||||
* which was saved when the 'dbg_save_space_info()' function was called.
|
||||
* Returns zero if the information has not changed, and %-EINVAL it it has
|
||||
* Returns zero if the information has not changed, and %-EINVAL if it has
|
||||
* changed.
|
||||
*/
|
||||
int dbg_check_space_info(struct ubifs_info *c)
|
||||
@ -1212,7 +1233,7 @@ static int dbg_check_key_order(struct ubifs_info *c, struct ubifs_zbranch *zbr1,
|
||||
ubifs_err(c, "but it should have key %s according to tnc",
|
||||
dbg_snprintf_key(c, &zbr1->key, key_buf,
|
||||
DBG_KEY_BUF_LEN));
|
||||
ubifs_dump_node(c, dent1);
|
||||
ubifs_dump_node(c, dent1, UBIFS_MAX_DENT_NODE_SZ);
|
||||
goto out_free;
|
||||
}
|
||||
|
||||
@ -1224,7 +1245,7 @@ static int dbg_check_key_order(struct ubifs_info *c, struct ubifs_zbranch *zbr1,
|
||||
ubifs_err(c, "but it should have key %s according to tnc",
|
||||
dbg_snprintf_key(c, &zbr2->key, key_buf,
|
||||
DBG_KEY_BUF_LEN));
|
||||
ubifs_dump_node(c, dent2);
|
||||
ubifs_dump_node(c, dent2, UBIFS_MAX_DENT_NODE_SZ);
|
||||
goto out_free;
|
||||
}
|
||||
|
||||
@ -1243,9 +1264,9 @@ static int dbg_check_key_order(struct ubifs_info *c, struct ubifs_zbranch *zbr1,
|
||||
dbg_snprintf_key(c, &key, key_buf, DBG_KEY_BUF_LEN));
|
||||
|
||||
ubifs_msg(c, "first node at %d:%d\n", zbr1->lnum, zbr1->offs);
|
||||
ubifs_dump_node(c, dent1);
|
||||
ubifs_dump_node(c, dent1, UBIFS_MAX_DENT_NODE_SZ);
|
||||
ubifs_msg(c, "second node at %d:%d\n", zbr2->lnum, zbr2->offs);
|
||||
ubifs_dump_node(c, dent2);
|
||||
ubifs_dump_node(c, dent2, UBIFS_MAX_DENT_NODE_SZ);
|
||||
|
||||
out_free:
|
||||
kfree(dent2);
|
||||
@ -2110,7 +2131,7 @@ out:
|
||||
|
||||
out_dump:
|
||||
ubifs_msg(c, "dump of node at LEB %d:%d", zbr->lnum, zbr->offs);
|
||||
ubifs_dump_node(c, node);
|
||||
ubifs_dump_node(c, node, zbr->len);
|
||||
out_free:
|
||||
kfree(node);
|
||||
return err;
|
||||
@ -2243,7 +2264,7 @@ out_dump:
|
||||
|
||||
ubifs_msg(c, "dump of the inode %lu sitting in LEB %d:%d",
|
||||
(unsigned long)fscki->inum, zbr->lnum, zbr->offs);
|
||||
ubifs_dump_node(c, ino);
|
||||
ubifs_dump_node(c, ino, zbr->len);
|
||||
kfree(ino);
|
||||
return -EINVAL;
|
||||
}
|
||||
@ -2314,12 +2335,12 @@ int dbg_check_data_nodes_order(struct ubifs_info *c, struct list_head *head)
|
||||
|
||||
if (sa->type != UBIFS_DATA_NODE) {
|
||||
ubifs_err(c, "bad node type %d", sa->type);
|
||||
ubifs_dump_node(c, sa->node);
|
||||
ubifs_dump_node(c, sa->node, c->leb_size - sa->offs);
|
||||
return -EINVAL;
|
||||
}
|
||||
if (sb->type != UBIFS_DATA_NODE) {
|
||||
ubifs_err(c, "bad node type %d", sb->type);
|
||||
ubifs_dump_node(c, sb->node);
|
||||
ubifs_dump_node(c, sb->node, c->leb_size - sb->offs);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
@ -2350,8 +2371,8 @@ int dbg_check_data_nodes_order(struct ubifs_info *c, struct list_head *head)
|
||||
return 0;
|
||||
|
||||
error_dump:
|
||||
ubifs_dump_node(c, sa->node);
|
||||
ubifs_dump_node(c, sb->node);
|
||||
ubifs_dump_node(c, sa->node, c->leb_size - sa->offs);
|
||||
ubifs_dump_node(c, sb->node, c->leb_size - sb->offs);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
@ -2382,13 +2403,13 @@ int dbg_check_nondata_nodes_order(struct ubifs_info *c, struct list_head *head)
|
||||
if (sa->type != UBIFS_INO_NODE && sa->type != UBIFS_DENT_NODE &&
|
||||
sa->type != UBIFS_XENT_NODE) {
|
||||
ubifs_err(c, "bad node type %d", sa->type);
|
||||
ubifs_dump_node(c, sa->node);
|
||||
ubifs_dump_node(c, sa->node, c->leb_size - sa->offs);
|
||||
return -EINVAL;
|
||||
}
|
||||
if (sb->type != UBIFS_INO_NODE && sb->type != UBIFS_DENT_NODE &&
|
||||
sb->type != UBIFS_XENT_NODE) {
|
||||
ubifs_err(c, "bad node type %d", sb->type);
|
||||
ubifs_dump_node(c, sb->node);
|
||||
ubifs_dump_node(c, sb->node, c->leb_size - sb->offs);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
@ -2438,11 +2459,10 @@ int dbg_check_nondata_nodes_order(struct ubifs_info *c, struct list_head *head)
|
||||
|
||||
error_dump:
|
||||
ubifs_msg(c, "dumping first node");
|
||||
ubifs_dump_node(c, sa->node);
|
||||
ubifs_dump_node(c, sa->node, c->leb_size - sa->offs);
|
||||
ubifs_msg(c, "dumping second node");
|
||||
ubifs_dump_node(c, sb->node);
|
||||
ubifs_dump_node(c, sb->node, c->leb_size - sb->offs);
|
||||
return -EINVAL;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int chance(unsigned int n, unsigned int out_of)
|
||||
|
@ -242,7 +242,8 @@ const char *dbg_get_key_dump(const struct ubifs_info *c,
|
||||
const char *dbg_snprintf_key(const struct ubifs_info *c,
|
||||
const union ubifs_key *key, char *buffer, int len);
|
||||
void ubifs_dump_inode(struct ubifs_info *c, const struct inode *inode);
|
||||
void ubifs_dump_node(const struct ubifs_info *c, const void *node);
|
||||
void ubifs_dump_node(const struct ubifs_info *c, const void *node,
|
||||
int node_len);
|
||||
void ubifs_dump_budget_req(const struct ubifs_budget_req *req);
|
||||
void ubifs_dump_lstats(const struct ubifs_lp_stats *lst);
|
||||
void ubifs_dump_budg(struct ubifs_info *c, const struct ubifs_budg_info *bi);
|
||||
@ -251,8 +252,6 @@ void ubifs_dump_lprop(const struct ubifs_info *c,
|
||||
void ubifs_dump_lprops(struct ubifs_info *c);
|
||||
void ubifs_dump_lpt_info(struct ubifs_info *c);
|
||||
void ubifs_dump_leb(const struct ubifs_info *c, int lnum);
|
||||
void ubifs_dump_sleb(const struct ubifs_info *c,
|
||||
const struct ubifs_scan_leb *sleb, int offs);
|
||||
void ubifs_dump_znode(const struct ubifs_info *c,
|
||||
const struct ubifs_znode *znode);
|
||||
void ubifs_dump_heap(struct ubifs_info *c, struct ubifs_lpt_heap *heap,
|
||||
|
@ -844,7 +844,7 @@ out_fname:
|
||||
*
|
||||
* This function checks if directory @dir is empty. Returns zero if the
|
||||
* directory is empty, %-ENOTEMPTY if it is not, and other negative error codes
|
||||
* in case of of errors.
|
||||
* in case of errors.
|
||||
*/
|
||||
int ubifs_check_dir_empty(struct inode *dir)
|
||||
{
|
||||
@ -1632,9 +1632,7 @@ const struct inode_operations ubifs_dir_inode_operations = {
|
||||
.rename = ubifs_rename,
|
||||
.setattr = ubifs_setattr,
|
||||
.getattr = ubifs_getattr,
|
||||
#ifdef CONFIG_UBIFS_FS_XATTR
|
||||
.listxattr = ubifs_listxattr,
|
||||
#endif
|
||||
.update_time = ubifs_update_time,
|
||||
.tmpfile = ubifs_tmpfile,
|
||||
};
|
||||
|
@ -92,7 +92,7 @@ static int read_block(struct inode *inode, void *addr, unsigned int block,
|
||||
dump:
|
||||
ubifs_err(c, "bad data node (block %u, inode %lu)",
|
||||
block, inode->i_ino);
|
||||
ubifs_dump_node(c, dn);
|
||||
ubifs_dump_node(c, dn, UBIFS_MAX_DATA_NODE_SZ);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
@ -205,7 +205,7 @@ static void release_new_page_budget(struct ubifs_info *c)
|
||||
* @c: UBIFS file-system description object
|
||||
*
|
||||
* This is a helper function which releases budget corresponding to the budget
|
||||
* of changing one one page of data which already exists on the flash media.
|
||||
* of changing one page of data which already exists on the flash media.
|
||||
*/
|
||||
static void release_existing_page_budget(struct ubifs_info *c)
|
||||
{
|
||||
@ -1645,9 +1645,7 @@ const struct address_space_operations ubifs_file_address_operations = {
|
||||
const struct inode_operations ubifs_file_inode_operations = {
|
||||
.setattr = ubifs_setattr,
|
||||
.getattr = ubifs_getattr,
|
||||
#ifdef CONFIG_UBIFS_FS_XATTR
|
||||
.listxattr = ubifs_listxattr,
|
||||
#endif
|
||||
.update_time = ubifs_update_time,
|
||||
};
|
||||
|
||||
@ -1655,9 +1653,7 @@ const struct inode_operations ubifs_symlink_inode_operations = {
|
||||
.get_link = ubifs_get_link,
|
||||
.setattr = ubifs_setattr,
|
||||
.getattr = ubifs_getattr,
|
||||
#ifdef CONFIG_UBIFS_FS_XATTR
|
||||
.listxattr = ubifs_listxattr,
|
||||
#endif
|
||||
.update_time = ubifs_update_time,
|
||||
};
|
||||
|
||||
|
@ -198,6 +198,7 @@ int ubifs_is_mapped(const struct ubifs_info *c, int lnum)
|
||||
* ubifs_check_node - check node.
|
||||
* @c: UBIFS file-system description object
|
||||
* @buf: node to check
|
||||
* @len: node length
|
||||
* @lnum: logical eraseblock number
|
||||
* @offs: offset within the logical eraseblock
|
||||
* @quiet: print no messages
|
||||
@ -222,10 +223,10 @@ int ubifs_is_mapped(const struct ubifs_info *c, int lnum)
|
||||
* This function returns zero in case of success and %-EUCLEAN in case of bad
|
||||
* CRC or magic.
|
||||
*/
|
||||
int ubifs_check_node(const struct ubifs_info *c, const void *buf, int lnum,
|
||||
int offs, int quiet, int must_chk_crc)
|
||||
int ubifs_check_node(const struct ubifs_info *c, const void *buf, int len,
|
||||
int lnum, int offs, int quiet, int must_chk_crc)
|
||||
{
|
||||
int err = -EINVAL, type, node_len, dump_node = 1;
|
||||
int err = -EINVAL, type, node_len;
|
||||
uint32_t crc, node_crc, magic;
|
||||
const struct ubifs_ch *ch = buf;
|
||||
|
||||
@ -278,22 +279,10 @@ int ubifs_check_node(const struct ubifs_info *c, const void *buf, int lnum,
|
||||
out_len:
|
||||
if (!quiet)
|
||||
ubifs_err(c, "bad node length %d", node_len);
|
||||
if (type == UBIFS_DATA_NODE && node_len > UBIFS_DATA_NODE_SZ)
|
||||
dump_node = 0;
|
||||
out:
|
||||
if (!quiet) {
|
||||
ubifs_err(c, "bad node at LEB %d:%d", lnum, offs);
|
||||
if (dump_node) {
|
||||
ubifs_dump_node(c, buf);
|
||||
} else {
|
||||
int safe_len = min3(node_len, c->leb_size - offs,
|
||||
(int)UBIFS_MAX_DATA_NODE_SZ);
|
||||
pr_err("\tprevent out-of-bounds memory access\n");
|
||||
pr_err("\ttruncated data node length %d\n", safe_len);
|
||||
pr_err("\tcorrupted data node:\n");
|
||||
print_hex_dump(KERN_ERR, "\t", DUMP_PREFIX_OFFSET, 32, 1,
|
||||
buf, safe_len, 0);
|
||||
}
|
||||
ubifs_dump_node(c, buf, len);
|
||||
dump_stack();
|
||||
}
|
||||
return err;
|
||||
@ -319,7 +308,7 @@ void ubifs_pad(const struct ubifs_info *c, void *buf, int pad)
|
||||
{
|
||||
uint32_t crc;
|
||||
|
||||
ubifs_assert(c, pad >= 0 && !(pad & 7));
|
||||
ubifs_assert(c, pad >= 0);
|
||||
|
||||
if (pad >= UBIFS_PAD_NODE_SZ) {
|
||||
struct ubifs_ch *ch = buf;
|
||||
@ -730,7 +719,7 @@ out_timers:
|
||||
int ubifs_wbuf_write_nolock(struct ubifs_wbuf *wbuf, void *buf, int len)
|
||||
{
|
||||
struct ubifs_info *c = wbuf->c;
|
||||
int err, written, n, aligned_len = ALIGN(len, 8);
|
||||
int err, n, written = 0, aligned_len = ALIGN(len, 8);
|
||||
|
||||
dbg_io("%d bytes (%s) to jhead %s wbuf at LEB %d:%d", len,
|
||||
dbg_ntype(((struct ubifs_ch *)buf)->node_type),
|
||||
@ -764,6 +753,10 @@ int ubifs_wbuf_write_nolock(struct ubifs_wbuf *wbuf, void *buf, int len)
|
||||
* write-buffer.
|
||||
*/
|
||||
memcpy(wbuf->buf + wbuf->used, buf, len);
|
||||
if (aligned_len > len) {
|
||||
ubifs_assert(c, aligned_len - len < 8);
|
||||
ubifs_pad(c, wbuf->buf + wbuf->used + len, aligned_len - len);
|
||||
}
|
||||
|
||||
if (aligned_len == wbuf->avail) {
|
||||
dbg_io("flush jhead %s wbuf to LEB %d:%d",
|
||||
@ -793,8 +786,6 @@ int ubifs_wbuf_write_nolock(struct ubifs_wbuf *wbuf, void *buf, int len)
|
||||
goto exit;
|
||||
}
|
||||
|
||||
written = 0;
|
||||
|
||||
if (wbuf->used) {
|
||||
/*
|
||||
* The node is large enough and does not fit entirely within
|
||||
@ -856,13 +847,18 @@ int ubifs_wbuf_write_nolock(struct ubifs_wbuf *wbuf, void *buf, int len)
|
||||
}
|
||||
|
||||
spin_lock(&wbuf->lock);
|
||||
if (aligned_len)
|
||||
if (aligned_len) {
|
||||
/*
|
||||
* And now we have what's left and what does not take whole
|
||||
* max. write unit, so write it to the write-buffer and we are
|
||||
* done.
|
||||
*/
|
||||
memcpy(wbuf->buf, buf + written, len);
|
||||
if (aligned_len > len) {
|
||||
ubifs_assert(c, aligned_len - len < 8);
|
||||
ubifs_pad(c, wbuf->buf + len, aligned_len - len);
|
||||
}
|
||||
}
|
||||
|
||||
if (c->leb_size - wbuf->offs >= c->max_write_size)
|
||||
wbuf->size = c->max_write_size;
|
||||
@ -890,7 +886,7 @@ exit:
|
||||
out:
|
||||
ubifs_err(c, "cannot write %d bytes to LEB %d:%d, error %d",
|
||||
len, wbuf->lnum, wbuf->offs, err);
|
||||
ubifs_dump_node(c, buf);
|
||||
ubifs_dump_node(c, buf, written + len);
|
||||
dump_stack();
|
||||
ubifs_dump_leb(c, wbuf->lnum);
|
||||
return err;
|
||||
@ -933,7 +929,7 @@ int ubifs_write_node_hmac(struct ubifs_info *c, void *buf, int len, int lnum,
|
||||
|
||||
err = ubifs_leb_write(c, lnum, buf, offs, buf_len);
|
||||
if (err)
|
||||
ubifs_dump_node(c, buf);
|
||||
ubifs_dump_node(c, buf, len);
|
||||
|
||||
return err;
|
||||
}
|
||||
@ -1016,7 +1012,7 @@ int ubifs_read_node_wbuf(struct ubifs_wbuf *wbuf, void *buf, int type, int len,
|
||||
goto out;
|
||||
}
|
||||
|
||||
err = ubifs_check_node(c, buf, lnum, offs, 0, 0);
|
||||
err = ubifs_check_node(c, buf, len, lnum, offs, 0, 0);
|
||||
if (err) {
|
||||
ubifs_err(c, "expected node type %d", type);
|
||||
return err;
|
||||
@ -1032,7 +1028,7 @@ int ubifs_read_node_wbuf(struct ubifs_wbuf *wbuf, void *buf, int type, int len,
|
||||
|
||||
out:
|
||||
ubifs_err(c, "bad node at LEB %d:%d", lnum, offs);
|
||||
ubifs_dump_node(c, buf);
|
||||
ubifs_dump_node(c, buf, len);
|
||||
dump_stack();
|
||||
return -EINVAL;
|
||||
}
|
||||
@ -1046,7 +1042,7 @@ out:
|
||||
* @lnum: logical eraseblock number
|
||||
* @offs: offset within the logical eraseblock
|
||||
*
|
||||
* This function reads a node of known type and and length, checks it and
|
||||
* This function reads a node of known type and length, checks it and
|
||||
* stores in @buf. Returns zero in case of success, %-EUCLEAN if CRC mismatched
|
||||
* and a negative error code in case of failure.
|
||||
*/
|
||||
@ -1072,7 +1068,7 @@ int ubifs_read_node(const struct ubifs_info *c, void *buf, int type, int len,
|
||||
goto out;
|
||||
}
|
||||
|
||||
err = ubifs_check_node(c, buf, lnum, offs, 0, 0);
|
||||
err = ubifs_check_node(c, buf, len, lnum, offs, 0, 0);
|
||||
if (err) {
|
||||
ubifs_errc(c, "expected node type %d", type);
|
||||
return err;
|
||||
@ -1090,7 +1086,7 @@ out:
|
||||
ubifs_errc(c, "bad node at LEB %d:%d, LEB mapping status %d", lnum,
|
||||
offs, ubi_is_mapped(c->ubi, lnum));
|
||||
if (!c->probing) {
|
||||
ubifs_dump_node(c, buf);
|
||||
ubifs_dump_node(c, buf, len);
|
||||
dump_stack();
|
||||
}
|
||||
return -EINVAL;
|
||||
|
@ -1559,7 +1559,8 @@ int ubifs_jnl_truncate(struct ubifs_info *c, const struct inode *inode,
|
||||
if (dn_len <= 0 || dn_len > UBIFS_BLOCK_SIZE) {
|
||||
ubifs_err(c, "bad data node (block %u, inode %lu)",
|
||||
blk, inode->i_ino);
|
||||
ubifs_dump_node(c, dn);
|
||||
ubifs_dump_node(c, dn, sz - UBIFS_INO_NODE_SZ -
|
||||
UBIFS_TRUN_NODE_SZ);
|
||||
goto out_free;
|
||||
}
|
||||
|
||||
|
@ -851,7 +851,7 @@ int ubifs_create_dflt_lpt(struct ubifs_info *c, int *main_lebs, int lpt_first,
|
||||
dbg_lp("lsave_sz %d", c->lsave_sz);
|
||||
dbg_lp("lsave_cnt %d", c->lsave_cnt);
|
||||
dbg_lp("lpt_hght %d", c->lpt_hght);
|
||||
dbg_lp("big_lpt %d", c->big_lpt);
|
||||
dbg_lp("big_lpt %u", c->big_lpt);
|
||||
dbg_lp("LPT root is at %d:%d", c->lpt_lnum, c->lpt_offs);
|
||||
dbg_lp("LPT head is at %d:%d", c->nhead_lnum, c->nhead_offs);
|
||||
dbg_lp("LPT ltab is at %d:%d", c->ltab_lnum, c->ltab_offs);
|
||||
@ -1824,7 +1824,7 @@ static int lpt_init_rd(struct ubifs_info *c)
|
||||
dbg_lp("lsave_sz %d", c->lsave_sz);
|
||||
dbg_lp("lsave_cnt %d", c->lsave_cnt);
|
||||
dbg_lp("lpt_hght %d", c->lpt_hght);
|
||||
dbg_lp("big_lpt %d", c->big_lpt);
|
||||
dbg_lp("big_lpt %u", c->big_lpt);
|
||||
dbg_lp("LPT root is at %d:%d", c->lpt_lnum, c->lpt_offs);
|
||||
dbg_lp("LPT head is at %d:%d", c->nhead_lnum, c->nhead_offs);
|
||||
dbg_lp("LPT ltab is at %d:%d", c->ltab_lnum, c->ltab_offs);
|
||||
|
@ -314,7 +314,7 @@ static int validate_master(const struct ubifs_info *c)
|
||||
|
||||
out:
|
||||
ubifs_err(c, "bad master node at offset %d error %d", c->mst_offs, err);
|
||||
ubifs_dump_node(c, c->mst_node);
|
||||
ubifs_dump_node(c, c->mst_node, c->mst_node_alsz);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
@ -392,7 +392,7 @@ int ubifs_read_master(struct ubifs_info *c)
|
||||
if (c->leb_cnt < old_leb_cnt ||
|
||||
c->leb_cnt < UBIFS_MIN_LEB_CNT) {
|
||||
ubifs_err(c, "bad leb_cnt on master node");
|
||||
ubifs_dump_node(c, c->mst_node);
|
||||
ubifs_dump_node(c, c->mst_node, c->mst_node_alsz);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
|
@ -646,7 +646,8 @@ static int do_kill_orphans(struct ubifs_info *c, struct ubifs_scan_leb *sleb,
|
||||
if (snod->type != UBIFS_ORPH_NODE) {
|
||||
ubifs_err(c, "invalid node type %d in orphan area at %d:%d",
|
||||
snod->type, sleb->lnum, snod->offs);
|
||||
ubifs_dump_node(c, snod->node);
|
||||
ubifs_dump_node(c, snod->node,
|
||||
c->leb_size - snod->offs);
|
||||
err = -EINVAL;
|
||||
goto out_free;
|
||||
}
|
||||
@ -674,7 +675,8 @@ static int do_kill_orphans(struct ubifs_info *c, struct ubifs_scan_leb *sleb,
|
||||
if (!first) {
|
||||
ubifs_err(c, "out of order commit number %llu in orphan node at %d:%d",
|
||||
cmt_no, sleb->lnum, snod->offs);
|
||||
ubifs_dump_node(c, snod->node);
|
||||
ubifs_dump_node(c, snod->node,
|
||||
c->leb_size - snod->offs);
|
||||
err = -EINVAL;
|
||||
goto out_free;
|
||||
}
|
||||
|
@ -352,11 +352,11 @@ out_free:
|
||||
ubifs_err(c, "failed to recover master node");
|
||||
if (mst1) {
|
||||
ubifs_err(c, "dumping first master node");
|
||||
ubifs_dump_node(c, mst1);
|
||||
ubifs_dump_node(c, mst1, c->leb_size - ((void *)mst1 - buf1));
|
||||
}
|
||||
if (mst2) {
|
||||
ubifs_err(c, "dumping second master node");
|
||||
ubifs_dump_node(c, mst2);
|
||||
ubifs_dump_node(c, mst2, c->leb_size - ((void *)mst2 - buf2));
|
||||
}
|
||||
vfree(buf2);
|
||||
vfree(buf1);
|
||||
@ -469,7 +469,7 @@ static int no_more_nodes(const struct ubifs_info *c, void *buf, int len,
|
||||
* The area after the common header size is not empty, so the common
|
||||
* header must be intact. Check it.
|
||||
*/
|
||||
if (ubifs_check_node(c, buf, lnum, offs, 1, 0) != -EUCLEAN) {
|
||||
if (ubifs_check_node(c, buf, len, lnum, offs, 1, 0) != -EUCLEAN) {
|
||||
dbg_rcvry("unexpected bad common header at %d:%d", lnum, offs);
|
||||
return 0;
|
||||
}
|
||||
|
@ -574,7 +574,7 @@ static int authenticate_sleb_hash(struct ubifs_info *c, struct shash_desc *log_h
|
||||
* @c: UBIFS file-system description object
|
||||
* @sleb: the scan LEB to authenticate
|
||||
* @log_hash:
|
||||
* @is_last: if true, this is is the last LEB
|
||||
* @is_last: if true, this is the last LEB
|
||||
*
|
||||
* This function iterates over the buds of a single LEB authenticating all buds
|
||||
* with the authentication nodes on this LEB. Authentication nodes are written
|
||||
@ -827,7 +827,7 @@ out:
|
||||
|
||||
out_dump:
|
||||
ubifs_err(c, "bad node is at LEB %d:%d", lnum, snod->offs);
|
||||
ubifs_dump_node(c, snod->node);
|
||||
ubifs_dump_node(c, snod->node, c->leb_size - snod->offs);
|
||||
ubifs_scan_destroy(sleb);
|
||||
return -EINVAL;
|
||||
}
|
||||
@ -1123,7 +1123,7 @@ out:
|
||||
out_dump:
|
||||
ubifs_err(c, "log error detected while replaying the log at LEB %d:%d",
|
||||
lnum, offs + snod->offs);
|
||||
ubifs_dump_node(c, snod->node);
|
||||
ubifs_dump_node(c, snod->node, c->leb_size - snod->offs);
|
||||
ubifs_scan_destroy(sleb);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
@ -503,7 +503,7 @@ static int validate_sb(struct ubifs_info *c, struct ubifs_sb_node *sup)
|
||||
|
||||
failed:
|
||||
ubifs_err(c, "bad superblock, error %d", err);
|
||||
ubifs_dump_node(c, sup);
|
||||
ubifs_dump_node(c, sup, ALIGN(UBIFS_SB_NODE_SZ, c->min_io_size));
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
|
@ -76,7 +76,7 @@ int ubifs_scan_a_node(const struct ubifs_info *c, void *buf, int len, int lnum,
|
||||
dbg_scan("scanning %s at LEB %d:%d",
|
||||
dbg_ntype(ch->node_type), lnum, offs);
|
||||
|
||||
if (ubifs_check_node(c, buf, lnum, offs, quiet, 1))
|
||||
if (ubifs_check_node(c, buf, len, lnum, offs, quiet, 1))
|
||||
return SCANNED_A_CORRUPT_NODE;
|
||||
|
||||
if (ch->node_type == UBIFS_PAD_NODE) {
|
||||
@ -90,7 +90,7 @@ int ubifs_scan_a_node(const struct ubifs_info *c, void *buf, int len, int lnum,
|
||||
if (!quiet) {
|
||||
ubifs_err(c, "bad pad node at LEB %d:%d",
|
||||
lnum, offs);
|
||||
ubifs_dump_node(c, pad);
|
||||
ubifs_dump_node(c, pad, len);
|
||||
}
|
||||
return SCANNED_A_BAD_PAD_NODE;
|
||||
}
|
||||
|
@ -253,7 +253,7 @@ struct inode *ubifs_iget(struct super_block *sb, unsigned long inum)
|
||||
|
||||
out_invalid:
|
||||
ubifs_err(c, "inode %lu validation failed, error %d", inode->i_ino, err);
|
||||
ubifs_dump_node(c, ino);
|
||||
ubifs_dump_node(c, ino, UBIFS_MAX_INO_NODE_SZ);
|
||||
ubifs_dump_inode(c, inode);
|
||||
err = -EINVAL;
|
||||
out_ino:
|
||||
@ -1572,7 +1572,7 @@ static int mount_ubifs(struct ubifs_info *c)
|
||||
dbg_gen("main area LEBs: %d (%d - %d)",
|
||||
c->main_lebs, c->main_first, c->leb_cnt - 1);
|
||||
dbg_gen("index LEBs: %d", c->lst.idx_lebs);
|
||||
dbg_gen("total index bytes: %lld (%lld KiB, %lld MiB)",
|
||||
dbg_gen("total index bytes: %llu (%llu KiB, %llu MiB)",
|
||||
c->bi.old_idx_sz, c->bi.old_idx_sz >> 10,
|
||||
c->bi.old_idx_sz >> 20);
|
||||
dbg_gen("key hash type: %d", c->key_hash_type);
|
||||
@ -2207,9 +2207,7 @@ static int ubifs_fill_super(struct super_block *sb, void *data, int silent)
|
||||
if (c->max_inode_sz > MAX_LFS_FILESIZE)
|
||||
sb->s_maxbytes = c->max_inode_sz = MAX_LFS_FILESIZE;
|
||||
sb->s_op = &ubifs_super_operations;
|
||||
#ifdef CONFIG_UBIFS_FS_XATTR
|
||||
sb->s_xattr = ubifs_xattr_handlers;
|
||||
#endif
|
||||
fscrypt_set_ops(sb, &ubifs_crypt_operations);
|
||||
|
||||
mutex_lock(&c->umount_mutex);
|
||||
|
@ -316,7 +316,7 @@ static int lnc_add(struct ubifs_info *c, struct ubifs_zbranch *zbr,
|
||||
err = ubifs_validate_entry(c, dent);
|
||||
if (err) {
|
||||
dump_stack();
|
||||
ubifs_dump_node(c, dent);
|
||||
ubifs_dump_node(c, dent, zbr->len);
|
||||
return err;
|
||||
}
|
||||
|
||||
@ -349,7 +349,7 @@ static int lnc_add_directly(struct ubifs_info *c, struct ubifs_zbranch *zbr,
|
||||
err = ubifs_validate_entry(c, node);
|
||||
if (err) {
|
||||
dump_stack();
|
||||
ubifs_dump_node(c, node);
|
||||
ubifs_dump_node(c, node, zbr->len);
|
||||
return err;
|
||||
}
|
||||
|
||||
@ -377,7 +377,7 @@ static void lnc_free(struct ubifs_zbranch *zbr)
|
||||
*
|
||||
* This function reads a "hashed" node defined by @zbr from the leaf node cache
|
||||
* (in it is there) or from the hash media, in which case the node is also
|
||||
* added to LNC. Returns zero in case of success or a negative negative error
|
||||
* added to LNC. Returns zero in case of success or a negative error
|
||||
* code in case of failure.
|
||||
*/
|
||||
static int tnc_read_hashed_node(struct ubifs_info *c, struct ubifs_zbranch *zbr,
|
||||
@ -1699,7 +1699,7 @@ static int validate_data_node(struct ubifs_info *c, void *buf,
|
||||
goto out_err;
|
||||
}
|
||||
|
||||
err = ubifs_check_node(c, buf, zbr->lnum, zbr->offs, 0, 0);
|
||||
err = ubifs_check_node(c, buf, zbr->len, zbr->lnum, zbr->offs, 0, 0);
|
||||
if (err) {
|
||||
ubifs_err(c, "expected node type %d", UBIFS_DATA_NODE);
|
||||
goto out;
|
||||
@ -1733,7 +1733,7 @@ out_err:
|
||||
err = -EINVAL;
|
||||
out:
|
||||
ubifs_err(c, "bad node at LEB %d:%d", zbr->lnum, zbr->offs);
|
||||
ubifs_dump_node(c, buf);
|
||||
ubifs_dump_node(c, buf, zbr->len);
|
||||
dump_stack();
|
||||
return err;
|
||||
}
|
||||
|
@ -390,7 +390,7 @@ static int read_znode(struct ubifs_info *c, struct ubifs_zbranch *zzbr,
|
||||
|
||||
out_dump:
|
||||
ubifs_err(c, "bad indexing node at LEB %d:%d, error %d", lnum, offs, err);
|
||||
ubifs_dump_node(c, idx);
|
||||
ubifs_dump_node(c, idx, c->max_idx_node_sz);
|
||||
kfree(idx);
|
||||
return -EINVAL;
|
||||
}
|
||||
@ -455,8 +455,7 @@ out:
|
||||
* @node: node is returned here
|
||||
*
|
||||
* This function reads a node defined by @zbr from the flash media. Returns
|
||||
* zero in case of success or a negative negative error code in case of
|
||||
* failure.
|
||||
* zero in case of success or a negative error code in case of failure.
|
||||
*/
|
||||
int ubifs_tnc_read_node(struct ubifs_info *c, struct ubifs_zbranch *zbr,
|
||||
void *node)
|
||||
@ -489,7 +488,7 @@ int ubifs_tnc_read_node(struct ubifs_info *c, struct ubifs_zbranch *zbr,
|
||||
zbr->lnum, zbr->offs);
|
||||
dbg_tnck(key, "looked for key ");
|
||||
dbg_tnck(&key1, "but found node's key ");
|
||||
ubifs_dump_node(c, node);
|
||||
ubifs_dump_node(c, node, zbr->len);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
|
@ -1719,8 +1719,8 @@ int ubifs_write_node(struct ubifs_info *c, void *node, int len, int lnum,
|
||||
int offs);
|
||||
int ubifs_write_node_hmac(struct ubifs_info *c, void *buf, int len, int lnum,
|
||||
int offs, int hmac_offs);
|
||||
int ubifs_check_node(const struct ubifs_info *c, const void *buf, int lnum,
|
||||
int offs, int quiet, int must_chk_crc);
|
||||
int ubifs_check_node(const struct ubifs_info *c, const void *buf, int len,
|
||||
int lnum, int offs, int quiet, int must_chk_crc);
|
||||
void ubifs_init_node(struct ubifs_info *c, void *buf, int len, int pad);
|
||||
void ubifs_crc_node(struct ubifs_info *c, void *buf, int len);
|
||||
void ubifs_prepare_node(struct ubifs_info *c, void *buf, int len, int pad);
|
||||
@ -2000,17 +2000,19 @@ int ubifs_getattr(const struct path *path, struct kstat *stat,
|
||||
int ubifs_check_dir_empty(struct inode *dir);
|
||||
|
||||
/* xattr.c */
|
||||
extern const struct xattr_handler *ubifs_xattr_handlers[];
|
||||
ssize_t ubifs_listxattr(struct dentry *dentry, char *buffer, size_t size);
|
||||
int ubifs_xattr_set(struct inode *host, const char *name, const void *value,
|
||||
size_t size, int flags, bool check_lock);
|
||||
ssize_t ubifs_xattr_get(struct inode *host, const char *name, void *buf,
|
||||
size_t size);
|
||||
|
||||
#ifdef CONFIG_UBIFS_FS_XATTR
|
||||
extern const struct xattr_handler *ubifs_xattr_handlers[];
|
||||
ssize_t ubifs_listxattr(struct dentry *dentry, char *buffer, size_t size);
|
||||
void ubifs_evict_xattr_inode(struct ubifs_info *c, ino_t xattr_inum);
|
||||
int ubifs_purge_xattrs(struct inode *host);
|
||||
#else
|
||||
#define ubifs_listxattr NULL
|
||||
#define ubifs_xattr_handlers NULL
|
||||
static inline void ubifs_evict_xattr_inode(struct ubifs_info *c,
|
||||
ino_t xattr_inum) { }
|
||||
static inline int ubifs_purge_xattrs(struct inode *host)
|
||||
|
Loading…
Reference in New Issue
Block a user