c->bi.nospace_rp = 1;
                smp_wmb();
        } else
-               ubifs_err("cannot budget space, error %d", err);
+               ubifs_err(c, "cannot budget space, error %d", err);
        return err;
 }
 
 
 out_up:
        up_write(&c->commit_sem);
 out:
-       ubifs_err("commit failed, error %d", err);
+       ubifs_err(c, "commit failed, error %d", err);
        spin_lock(&c->cs_lock);
        c->cmt_state = COMMIT_BROKEN;
        wake_up(&c->cmt_wq);
        int err;
        struct ubifs_info *c = info;
 
-       ubifs_msg("background thread \"%s\" started, PID %d",
+       ubifs_msg(c, "background thread \"%s\" started, PID %d",
                  c->bgt_name, current->pid);
        set_freezable();
 
                cond_resched();
        }
 
-       ubifs_msg("background thread \"%s\" stops", c->bgt_name);
+       ubifs_msg(c, "background thread \"%s\" stops", c->bgt_name);
        return 0;
 }
 
        return 0;
 
 out_dump:
-       ubifs_err("dumping index node (iip=%d)", i->iip);
+       ubifs_err(c, "dumping index node (iip=%d)", i->iip);
        ubifs_dump_node(c, idx);
        list_del(&i->list);
        kfree(i);
        if (!list_empty(&list)) {
                i = list_entry(list.prev, struct idx_node, list);
-               ubifs_err("dumping parent index node");
+               ubifs_err(c, "dumping parent index node");
                ubifs_dump_node(c, &i->idx);
        }
 out_free:
                list_del(&i->list);
                kfree(i);
        }
-       ubifs_err("failed, error %d", err);
+       ubifs_err(c, "failed, error %d", err);
        if (err > 0)
                err = -EINVAL;
        return err;
 
  * Note, if the input buffer was not compressed, it is copied to the output
  * buffer and %UBIFS_COMPR_NONE is returned in @compr_type.
  */
-void ubifs_compress(const void *in_buf, int in_len, void *out_buf, int *out_len,
-                   int *compr_type)
+void ubifs_compress(const struct ubifs_info *c, const void *in_buf,
+                   int in_len, void *out_buf, int *out_len, int *compr_type)
 {
        int err;
        struct ubifs_compressor *compr = ubifs_compressors[*compr_type];
        if (compr->comp_mutex)
                mutex_unlock(compr->comp_mutex);
        if (unlikely(err)) {
-               ubifs_warn("cannot compress %d bytes, compressor %s, error %d, leave data uncompressed",
+               ubifs_warn(c, "cannot compress %d bytes, compressor %s, error %d, leave data uncompressed",
                           in_len, compr->name, err);
-                goto no_compr;
+               goto no_compr;
        }
 
        /*
  * The length of the uncompressed data is returned in @out_len. This functions
  * returns %0 on success or a negative error code on failure.
  */
-int ubifs_decompress(const void *in_buf, int in_len, void *out_buf,
-                    int *out_len, int compr_type)
+int ubifs_decompress(const struct ubifs_info *c, const void *in_buf,
+                    int in_len, void *out_buf, int *out_len, int compr_type)
 {
        int err;
        struct ubifs_compressor *compr;
 
        if (unlikely(compr_type < 0 || compr_type >= UBIFS_COMPR_TYPES_CNT)) {
-               ubifs_err("invalid compression type %d", compr_type);
+               ubifs_err(c, "invalid compression type %d", compr_type);
                return -EINVAL;
        }
 
        compr = ubifs_compressors[compr_type];
 
        if (unlikely(!compr->capi_name)) {
-               ubifs_err("%s compression is not compiled in", compr->name);
+               ubifs_err(c, "%s compression is not compiled in", compr->name);
                return -EINVAL;
        }
 
        if (compr->decomp_mutex)
                mutex_unlock(compr->decomp_mutex);
        if (err)
-               ubifs_err("cannot decompress %d bytes, compressor %s, error %d",
+               ubifs_err(c, "cannot decompress %d bytes, compressor %s, error %d",
                          in_len, compr->name, err);
 
        return err;
        if (compr->capi_name) {
                compr->cc = crypto_alloc_comp(compr->capi_name, 0, 0);
                if (IS_ERR(compr->cc)) {
-                       ubifs_err("cannot initialize compressor %s, error %ld",
-                                 compr->name, PTR_ERR(compr->cc));
+                       pr_err("UBIFS error (pid %d): cannot initialize compressor %s, error %ld",
+                              current->pid, compr->name, PTR_ERR(compr->cc));
                        return PTR_ERR(compr->cc);
                }
        }
 
        for (lnum = c->main_first; lnum < c->leb_cnt; lnum++) {
                err = ubifs_read_one_lp(c, lnum, &lp);
                if (err) {
-                       ubifs_err("cannot read lprops for LEB %d", lnum);
+                       ubifs_err(c, "cannot read lprops for LEB %d", lnum);
                        continue;
                }
 
 
        buf = __vmalloc(c->leb_size, GFP_NOFS, PAGE_KERNEL);
        if (!buf) {
-               ubifs_err("cannot allocate memory for dumping LEB %d", lnum);
+               ubifs_err(c, "cannot allocate memory for dumping LEB %d", lnum);
                return;
        }
 
        sleb = ubifs_scan(c, lnum, 0, buf, 0);
        if (IS_ERR(sleb)) {
-               ubifs_err("scan error %d", (int)PTR_ERR(sleb));
+               ubifs_err(c, "scan error %d", (int)PTR_ERR(sleb));
                goto out;
        }
 
        spin_unlock(&c->space_lock);
 
        if (free != d->saved_free) {
-               ubifs_err("free space changed from %lld to %lld",
+               ubifs_err(c, "free space changed from %lld to %lld",
                          d->saved_free, free);
                goto out;
        }
        return 0;
 
 out:
-       ubifs_msg("saved lprops statistics dump");
+       ubifs_msg(c, "saved lprops statistics dump");
        ubifs_dump_lstats(&d->saved_lst);
-       ubifs_msg("saved budgeting info dump");
+       ubifs_msg(c, "saved budgeting info dump");
        ubifs_dump_budg(c, &d->saved_bi);
-       ubifs_msg("saved idx_gc_cnt %d", d->saved_idx_gc_cnt);
-       ubifs_msg("current lprops statistics dump");
+       ubifs_msg(c, "saved idx_gc_cnt %d", d->saved_idx_gc_cnt);
+       ubifs_msg(c, "current lprops statistics dump");
        ubifs_get_lp_stats(c, &lst);
        ubifs_dump_lstats(&lst);
-       ubifs_msg("current budgeting info dump");
+       ubifs_msg(c, "current budgeting info dump");
        ubifs_dump_budg(c, &c->bi);
        dump_stack();
        return -EINVAL;
        mutex_lock(&ui->ui_mutex);
        spin_lock(&ui->ui_lock);
        if (ui->ui_size != ui->synced_i_size && !ui->dirty) {
-               ubifs_err("ui_size is %lld, synced_i_size is %lld, but inode is clean",
+               ubifs_err(c, "ui_size is %lld, synced_i_size is %lld, but inode is clean",
                          ui->ui_size, ui->synced_i_size);
-               ubifs_err("i_ino %lu, i_mode %#x, i_size %lld", inode->i_ino,
+               ubifs_err(c, "i_ino %lu, i_mode %#x, i_size %lld", inode->i_ino,
                          inode->i_mode, i_size_read(inode));
                dump_stack();
                err = -EINVAL;
        kfree(pdent);
 
        if (i_size_read(dir) != size) {
-               ubifs_err("directory inode %lu has size %llu, but calculated size is %llu",
+               ubifs_err(c, "directory inode %lu has size %llu, but calculated size is %llu",
                          dir->i_ino, (unsigned long long)i_size_read(dir),
                          (unsigned long long)size);
                ubifs_dump_inode(c, dir);
                return -EINVAL;
        }
        if (dir->i_nlink != nlink) {
-               ubifs_err("directory inode %lu has nlink %u, but calculated nlink is %u",
+               ubifs_err(c, "directory inode %lu has nlink %u, but calculated nlink is %u",
                          dir->i_ino, dir->i_nlink, nlink);
                ubifs_dump_inode(c, dir);
                dump_stack();
        err = 1;
        key_read(c, &dent1->key, &key);
        if (keys_cmp(c, &zbr1->key, &key)) {
-               ubifs_err("1st entry at %d:%d has key %s", zbr1->lnum,
+               ubifs_err(c, "1st entry at %d:%d has key %s", zbr1->lnum,
                          zbr1->offs, dbg_snprintf_key(c, &key, key_buf,
                                                       DBG_KEY_BUF_LEN));
-               ubifs_err("but it should have key %s according to tnc",
+               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);
 
        key_read(c, &dent2->key, &key);
        if (keys_cmp(c, &zbr2->key, &key)) {
-               ubifs_err("2nd entry at %d:%d has key %s", zbr1->lnum,
+               ubifs_err(c, "2nd entry at %d:%d has key %s", zbr1->lnum,
                          zbr1->offs, dbg_snprintf_key(c, &key, key_buf,
                                                       DBG_KEY_BUF_LEN));
-               ubifs_err("but it should have key %s according to tnc",
+               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);
                goto out_free;
        }
        if (cmp == 0 && nlen1 == nlen2)
-               ubifs_err("2 xent/dent nodes with the same name");
+               ubifs_err(c, "2 xent/dent nodes with the same name");
        else
-               ubifs_err("bad order of colliding key %s",
+               ubifs_err(c, "bad order of colliding key %s",
                          dbg_snprintf_key(c, &key, key_buf, DBG_KEY_BUF_LEN));
 
-       ubifs_msg("first node at %d:%d\n", zbr1->lnum, zbr1->offs);
+       ubifs_msg(c, "first node at %d:%d\n", zbr1->lnum, zbr1->offs);
        ubifs_dump_node(c, dent1);
-       ubifs_msg("second node at %d:%d\n", zbr2->lnum, zbr2->offs);
+       ubifs_msg(c, "second node at %d:%d\n", zbr2->lnum, zbr2->offs);
        ubifs_dump_node(c, dent2);
 
 out_free:
        return 0;
 
 out:
-       ubifs_err("failed, error %d", err);
-       ubifs_msg("dump of the znode");
+       ubifs_err(c, "failed, error %d", err);
+       ubifs_msg(c, "dump of the znode");
        ubifs_dump_znode(c, znode);
        if (zp) {
-               ubifs_msg("dump of the parent znode");
+               ubifs_msg(c, "dump of the parent znode");
                ubifs_dump_znode(c, zp);
        }
        dump_stack();
                        if (err < 0)
                                return err;
                        if (err) {
-                               ubifs_msg("first znode");
+                               ubifs_msg(c, "first znode");
                                ubifs_dump_znode(c, prev);
-                               ubifs_msg("second znode");
+                               ubifs_msg(c, "second znode");
                                ubifs_dump_znode(c, znode);
                                return -EINVAL;
                        }
 
        if (extra) {
                if (clean_cnt != atomic_long_read(&c->clean_zn_cnt)) {
-                       ubifs_err("incorrect clean_zn_cnt %ld, calculated %ld",
+                       ubifs_err(c, "incorrect clean_zn_cnt %ld, calculated %ld",
                                  atomic_long_read(&c->clean_zn_cnt),
                                  clean_cnt);
                        return -EINVAL;
                }
                if (dirty_cnt != atomic_long_read(&c->dirty_zn_cnt)) {
-                       ubifs_err("incorrect dirty_zn_cnt %ld, calculated %ld",
+                       ubifs_err(c, "incorrect dirty_zn_cnt %ld, calculated %ld",
                                  atomic_long_read(&c->dirty_zn_cnt),
                                  dirty_cnt);
                        return -EINVAL;
                if (znode_cb) {
                        err = znode_cb(c, znode, priv);
                        if (err) {
-                               ubifs_err("znode checking function returned error %d",
+                               ubifs_err(c, "znode checking function returned error %d",
                                          err);
                                ubifs_dump_znode(c, znode);
                                goto out_dump;
                                zbr = &znode->zbranch[idx];
                                err = leaf_cb(c, zbr, priv);
                                if (err) {
-                                       ubifs_err("leaf checking function returned error %d, for leaf at LEB %d:%d",
+                                       ubifs_err(c, "leaf checking function returned error %d, for leaf at LEB %d:%d",
                                                  err, zbr->lnum, zbr->offs);
                                        goto out_dump;
                                }
                zbr = &znode->parent->zbranch[znode->iip];
        else
                zbr = &c->zroot;
-       ubifs_msg("dump of znode at LEB %d:%d", zbr->lnum, zbr->offs);
+       ubifs_msg(c, "dump of znode at LEB %d:%d", zbr->lnum, zbr->offs);
        ubifs_dump_znode(c, znode);
 out_unlock:
        mutex_unlock(&c->tnc_mutex);
 
        err = dbg_walk_index(c, NULL, add_size, &calc);
        if (err) {
-               ubifs_err("error %d while walking the index", err);
+               ubifs_err(c, "error %d while walking the index", err);
                return err;
        }
 
        if (calc != idx_size) {
-               ubifs_err("index size check failed: calculated size is %lld, should be %lld",
+               ubifs_err(c, "index size check failed: calculated size is %lld, should be %lld",
                          calc, idx_size);
                dump_stack();
                return -EINVAL;
        }
 
        if (inum > c->highest_inum) {
-               ubifs_err("too high inode number, max. is %lu",
+               ubifs_err(c, "too high inode number, max. is %lu",
                          (unsigned long)c->highest_inum);
                return ERR_PTR(-EINVAL);
        }
        ino_key_init(c, &key, inum);
        err = ubifs_lookup_level0(c, &key, &znode, &n);
        if (!err) {
-               ubifs_err("inode %lu not found in index", (unsigned long)inum);
+               ubifs_err(c, "inode %lu not found in index", (unsigned long)inum);
                return ERR_PTR(-ENOENT);
        } else if (err < 0) {
-               ubifs_err("error %d while looking up inode %lu",
+               ubifs_err(c, "error %d while looking up inode %lu",
                          err, (unsigned long)inum);
                return ERR_PTR(err);
        }
 
        zbr = &znode->zbranch[n];
        if (zbr->len < UBIFS_INO_NODE_SZ) {
-               ubifs_err("bad node %lu node length %d",
+               ubifs_err(c, "bad node %lu node length %d",
                          (unsigned long)inum, zbr->len);
                return ERR_PTR(-EINVAL);
        }
 
        err = ubifs_tnc_read_node(c, zbr, ino);
        if (err) {
-               ubifs_err("cannot read inode node at LEB %d:%d, error %d",
+               ubifs_err(c, "cannot read inode node at LEB %d:%d, error %d",
                          zbr->lnum, zbr->offs, err);
                kfree(ino);
                return ERR_PTR(err);
        fscki = add_inode(c, fsckd, ino);
        kfree(ino);
        if (IS_ERR(fscki)) {
-               ubifs_err("error %ld while adding inode %lu node",
+               ubifs_err(c, "error %ld while adding inode %lu node",
                          PTR_ERR(fscki), (unsigned long)inum);
                return fscki;
        }
        struct fsck_inode *fscki;
 
        if (zbr->len < UBIFS_CH_SZ) {
-               ubifs_err("bad leaf length %d (LEB %d:%d)",
+               ubifs_err(c, "bad leaf length %d (LEB %d:%d)",
                          zbr->len, zbr->lnum, zbr->offs);
                return -EINVAL;
        }
 
        err = ubifs_tnc_read_node(c, zbr, node);
        if (err) {
-               ubifs_err("cannot read leaf node at LEB %d:%d, error %d",
+               ubifs_err(c, "cannot read leaf node at LEB %d:%d, error %d",
                          zbr->lnum, zbr->offs, err);
                goto out_free;
        }
                fscki = add_inode(c, priv, node);
                if (IS_ERR(fscki)) {
                        err = PTR_ERR(fscki);
-                       ubifs_err("error %d while adding inode node", err);
+                       ubifs_err(c, "error %d while adding inode node", err);
                        goto out_dump;
                }
                goto out;
 
        if (type != UBIFS_DENT_KEY && type != UBIFS_XENT_KEY &&
            type != UBIFS_DATA_KEY) {
-               ubifs_err("unexpected node type %d at LEB %d:%d",
+               ubifs_err(c, "unexpected node type %d at LEB %d:%d",
                          type, zbr->lnum, zbr->offs);
                err = -EINVAL;
                goto out_free;
 
        ch = node;
        if (le64_to_cpu(ch->sqnum) > c->max_sqnum) {
-               ubifs_err("too high sequence number, max. is %llu",
+               ubifs_err(c, "too high sequence number, max. is %llu",
                          c->max_sqnum);
                err = -EINVAL;
                goto out_dump;
                fscki = read_add_inode(c, priv, inum);
                if (IS_ERR(fscki)) {
                        err = PTR_ERR(fscki);
-                       ubifs_err("error %d while processing data node and trying to find inode node %lu",
+                       ubifs_err(c, "error %d while processing data node and trying to find inode node %lu",
                                  err, (unsigned long)inum);
                        goto out_dump;
                }
                blk_offs <<= UBIFS_BLOCK_SHIFT;
                blk_offs += le32_to_cpu(dn->size);
                if (blk_offs > fscki->size) {
-                       ubifs_err("data node at LEB %d:%d is not within inode size %lld",
+                       ubifs_err(c, "data node at LEB %d:%d is not within inode size %lld",
                                  zbr->lnum, zbr->offs, fscki->size);
                        err = -EINVAL;
                        goto out_dump;
                fscki = read_add_inode(c, priv, inum);
                if (IS_ERR(fscki)) {
                        err = PTR_ERR(fscki);
-                       ubifs_err("error %d while processing entry node and trying to find inode node %lu",
+                       ubifs_err(c, "error %d while processing entry node and trying to find inode node %lu",
                                  err, (unsigned long)inum);
                        goto out_dump;
                }
                fscki1 = read_add_inode(c, priv, inum);
                if (IS_ERR(fscki1)) {
                        err = PTR_ERR(fscki1);
-                       ubifs_err("error %d while processing entry node and trying to find parent inode node %lu",
+                       ubifs_err(c, "error %d while processing entry node and trying to find parent inode node %lu",
                                  err, (unsigned long)inum);
                        goto out_dump;
                }
        return 0;
 
 out_dump:
-       ubifs_msg("dump of node at LEB %d:%d", zbr->lnum, zbr->offs);
+       ubifs_msg(c, "dump of node at LEB %d:%d", zbr->lnum, zbr->offs);
        ubifs_dump_node(c, node);
 out_free:
        kfree(node);
                         */
                        if (fscki->inum != UBIFS_ROOT_INO &&
                            fscki->references != 1) {
-                               ubifs_err("directory inode %lu has %d direntries which refer it, but should be 1",
+                               ubifs_err(c, "directory inode %lu has %d direntries which refer it, but should be 1",
                                          (unsigned long)fscki->inum,
                                          fscki->references);
                                goto out_dump;
                        }
                        if (fscki->inum == UBIFS_ROOT_INO &&
                            fscki->references != 0) {
-                               ubifs_err("root inode %lu has non-zero (%d) direntries which refer it",
+                               ubifs_err(c, "root inode %lu has non-zero (%d) direntries which refer it",
                                          (unsigned long)fscki->inum,
                                          fscki->references);
                                goto out_dump;
                        }
                        if (fscki->calc_sz != fscki->size) {
-                               ubifs_err("directory inode %lu size is %lld, but calculated size is %lld",
+                               ubifs_err(c, "directory inode %lu size is %lld, but calculated size is %lld",
                                          (unsigned long)fscki->inum,
                                          fscki->size, fscki->calc_sz);
                                goto out_dump;
                        }
                        if (fscki->calc_cnt != fscki->nlink) {
-                               ubifs_err("directory inode %lu nlink is %d, but calculated nlink is %d",
+                               ubifs_err(c, "directory inode %lu nlink is %d, but calculated nlink is %d",
                                          (unsigned long)fscki->inum,
                                          fscki->nlink, fscki->calc_cnt);
                                goto out_dump;
                        }
                } else {
                        if (fscki->references != fscki->nlink) {
-                               ubifs_err("inode %lu nlink is %d, but calculated nlink is %d",
+                               ubifs_err(c, "inode %lu nlink is %d, but calculated nlink is %d",
                                          (unsigned long)fscki->inum,
                                          fscki->nlink, fscki->references);
                                goto out_dump;
                        }
                }
                if (fscki->xattr_sz != fscki->calc_xsz) {
-                       ubifs_err("inode %lu has xattr size %u, but calculated size is %lld",
+                       ubifs_err(c, "inode %lu has xattr size %u, but calculated size is %lld",
                                  (unsigned long)fscki->inum, fscki->xattr_sz,
                                  fscki->calc_xsz);
                        goto out_dump;
                }
                if (fscki->xattr_cnt != fscki->calc_xcnt) {
-                       ubifs_err("inode %lu has %u xattrs, but calculated count is %lld",
+                       ubifs_err(c, "inode %lu has %u xattrs, but calculated count is %lld",
                                  (unsigned long)fscki->inum,
                                  fscki->xattr_cnt, fscki->calc_xcnt);
                        goto out_dump;
                }
                if (fscki->xattr_nms != fscki->calc_xnms) {
-                       ubifs_err("inode %lu has xattr names' size %u, but calculated names' size is %lld",
+                       ubifs_err(c, "inode %lu has xattr names' size %u, but calculated names' size is %lld",
                                  (unsigned long)fscki->inum, fscki->xattr_nms,
                                  fscki->calc_xnms);
                        goto out_dump;
        ino_key_init(c, &key, fscki->inum);
        err = ubifs_lookup_level0(c, &key, &znode, &n);
        if (!err) {
-               ubifs_err("inode %lu not found in index",
+               ubifs_err(c, "inode %lu not found in index",
                          (unsigned long)fscki->inum);
                return -ENOENT;
        } else if (err < 0) {
-               ubifs_err("error %d while looking up inode %lu",
+               ubifs_err(c, "error %d while looking up inode %lu",
                          err, (unsigned long)fscki->inum);
                return err;
        }
 
        err = ubifs_tnc_read_node(c, zbr, ino);
        if (err) {
-               ubifs_err("cannot read inode node at LEB %d:%d, error %d",
+               ubifs_err(c, "cannot read inode node at LEB %d:%d, error %d",
                          zbr->lnum, zbr->offs, err);
                kfree(ino);
                return err;
        }
 
-       ubifs_msg("dump of the inode %lu sitting in LEB %d:%d",
+       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);
        kfree(ino);
        return 0;
 
 out_free:
-       ubifs_err("file-system check failed with error %d", err);
+       ubifs_err(c, "file-system check failed with error %d", err);
        dump_stack();
        free_inodes(&fsckd);
        return err;
                sb = container_of(cur->next, struct ubifs_scan_node, list);
 
                if (sa->type != UBIFS_DATA_NODE) {
-                       ubifs_err("bad node type %d", sa->type);
+                       ubifs_err(c, "bad node type %d", sa->type);
                        ubifs_dump_node(c, sa->node);
                        return -EINVAL;
                }
                if (sb->type != UBIFS_DATA_NODE) {
-                       ubifs_err("bad node type %d", sb->type);
+                       ubifs_err(c, "bad node type %d", sb->type);
                        ubifs_dump_node(c, sb->node);
                        return -EINVAL;
                }
                if (inuma < inumb)
                        continue;
                if (inuma > inumb) {
-                       ubifs_err("larger inum %lu goes before inum %lu",
+                       ubifs_err(c, "larger inum %lu goes before inum %lu",
                                  (unsigned long)inuma, (unsigned long)inumb);
                        goto error_dump;
                }
                blkb = key_block(c, &sb->key);
 
                if (blka > blkb) {
-                       ubifs_err("larger block %u goes before %u", blka, blkb);
+                       ubifs_err(c, "larger block %u goes before %u", blka, blkb);
                        goto error_dump;
                }
                if (blka == blkb) {
-                       ubifs_err("two data nodes for the same block");
+                       ubifs_err(c, "two data nodes for the same block");
                        goto error_dump;
                }
        }
 
                if (sa->type != UBIFS_INO_NODE && sa->type != UBIFS_DENT_NODE &&
                    sa->type != UBIFS_XENT_NODE) {
-                       ubifs_err("bad node type %d", sa->type);
+                       ubifs_err(c, "bad node type %d", sa->type);
                        ubifs_dump_node(c, sa->node);
                        return -EINVAL;
                }
                if (sa->type != UBIFS_INO_NODE && sa->type != UBIFS_DENT_NODE &&
                    sa->type != UBIFS_XENT_NODE) {
-                       ubifs_err("bad node type %d", sb->type);
+                       ubifs_err(c, "bad node type %d", sb->type);
                        ubifs_dump_node(c, sb->node);
                        return -EINVAL;
                }
 
                if (sa->type != UBIFS_INO_NODE && sb->type == UBIFS_INO_NODE) {
-                       ubifs_err("non-inode node goes before inode node");
+                       ubifs_err(c, "non-inode node goes before inode node");
                        goto error_dump;
                }
 
                if (sa->type == UBIFS_INO_NODE && sb->type == UBIFS_INO_NODE) {
                        /* Inode nodes are sorted in descending size order */
                        if (sa->len < sb->len) {
-                               ubifs_err("smaller inode node goes first");
+                               ubifs_err(c, "smaller inode node goes first");
                                goto error_dump;
                        }
                        continue;
                if (inuma < inumb)
                        continue;
                if (inuma > inumb) {
-                       ubifs_err("larger inum %lu goes before inum %lu",
+                       ubifs_err(c, "larger inum %lu goes before inum %lu",
                                  (unsigned long)inuma, (unsigned long)inumb);
                        goto error_dump;
                }
                hashb = key_block(c, &sb->key);
 
                if (hasha > hashb) {
-                       ubifs_err("larger hash %u goes before %u",
+                       ubifs_err(c, "larger hash %u goes before %u",
                                  hasha, hashb);
                        goto error_dump;
                }
        return 0;
 
 error_dump:
-       ubifs_msg("dumping first node");
+       ubifs_msg(c, "dumping first node");
        ubifs_dump_node(c, sa->node);
-       ubifs_msg("dumping second node");
+       ubifs_msg(c, "dumping second node");
        ubifs_dump_node(c, sb->node);
        return -EINVAL;
        return 0;
                                delay = prandom_u32() % 60000;
                                d->pc_timeout = jiffies;
                                d->pc_timeout += msecs_to_jiffies(delay);
-                               ubifs_warn("failing after %lums", delay);
+                               ubifs_warn(c, "failing after %lums", delay);
                        } else {
                                d->pc_delay = 2;
                                delay = prandom_u32() % 10000;
                                /* Fail within 10000 operations */
                                d->pc_cnt_max = delay;
-                               ubifs_warn("failing after %lu calls", delay);
+                               ubifs_warn(c, "failing after %lu calls", delay);
                        }
                }
 
                        return 0;
                if (chance(19, 20))
                        return 0;
-               ubifs_warn("failing in super block LEB %d", lnum);
+               ubifs_warn(c, "failing in super block LEB %d", lnum);
        } else if (lnum == UBIFS_MST_LNUM || lnum == UBIFS_MST_LNUM + 1) {
                if (chance(19, 20))
                        return 0;
-               ubifs_warn("failing in master LEB %d", lnum);
+               ubifs_warn(c, "failing in master LEB %d", lnum);
        } else if (lnum >= UBIFS_LOG_LNUM && lnum <= c->log_last) {
                if (write && chance(99, 100))
                        return 0;
                if (chance(399, 400))
                        return 0;
-               ubifs_warn("failing in log LEB %d", lnum);
+               ubifs_warn(c, "failing in log LEB %d", lnum);
        } else if (lnum >= c->lpt_first && lnum <= c->lpt_last) {
                if (write && chance(7, 8))
                        return 0;
                if (chance(19, 20))
                        return 0;
-               ubifs_warn("failing in LPT LEB %d", lnum);
+               ubifs_warn(c, "failing in LPT LEB %d", lnum);
        } else if (lnum >= c->orph_first && lnum <= c->orph_last) {
                if (write && chance(1, 2))
                        return 0;
                if (chance(9, 10))
                        return 0;
-               ubifs_warn("failing in orphan LEB %d", lnum);
+               ubifs_warn(c, "failing in orphan LEB %d", lnum);
        } else if (lnum == c->ihead_lnum) {
                if (chance(99, 100))
                        return 0;
-               ubifs_warn("failing in index head LEB %d", lnum);
+               ubifs_warn(c, "failing in index head LEB %d", lnum);
        } else if (c->jheads && lnum == c->jheads[GCHD].wbuf.lnum) {
                if (chance(9, 10))
                        return 0;
-               ubifs_warn("failing in GC head LEB %d", lnum);
+               ubifs_warn(c, "failing in GC head LEB %d", lnum);
        } else if (write && !RB_EMPTY_ROOT(&c->buds) &&
                   !ubifs_search_bud(c, lnum)) {
                if (chance(19, 20))
                        return 0;
-               ubifs_warn("failing in non-bud LEB %d", lnum);
+               ubifs_warn(c, "failing in non-bud LEB %d", lnum);
        } else if (c->cmt_state == COMMIT_RUNNING_BACKGROUND ||
                   c->cmt_state == COMMIT_RUNNING_REQUIRED) {
                if (chance(999, 1000))
                        return 0;
-               ubifs_warn("failing in bud LEB %d commit running", lnum);
+               ubifs_warn(c, "failing in bud LEB %d commit running", lnum);
        } else {
                if (chance(9999, 10000))
                        return 0;
-               ubifs_warn("failing in bud LEB %d commit not running", lnum);
+               ubifs_warn(c, "failing in bud LEB %d commit not running", lnum);
        }
 
        d->pc_happened = 1;
-       ubifs_warn("========== Power cut emulated ==========");
+       ubifs_warn(c, "========== Power cut emulated ==========");
        dump_stack();
        return 1;
 }
        /* Corruption span max to end of write unit */
        to = min(len, ALIGN(from + 1, c->max_write_size));
 
-       ubifs_warn("filled bytes %u-%u with %s", from, to - 1,
+       ubifs_warn(c, "filled bytes %u-%u with %s", from, to - 1,
                   ffs ? "0xFFs" : "random data");
 
        if (ffs)
        failing = power_cut_emulated(c, lnum, 1);
        if (failing) {
                len = corrupt_data(c, buf, len);
-               ubifs_warn("actually write %d bytes to LEB %d:%d (the buffer was corrupted)",
+               ubifs_warn(c, "actually write %d bytes to LEB %d:%d (the buffer was corrupted)",
                           len, lnum, offs);
        }
        err = ubi_leb_write(c->ubi, lnum, buf, offs, len);
        debugfs_remove_recursive(d->dfs_dir);
 out:
        err = dent ? PTR_ERR(dent) : -ENODEV;
-       ubifs_err("cannot create \"%s\" debugfs file or directory, error %d\n",
+       ubifs_err(c, "cannot create \"%s\" debugfs file or directory, error %d\n",
                  fname, err);
        return err;
 }
        debugfs_remove_recursive(dfs_rootdir);
 out:
        err = dent ? PTR_ERR(dent) : -ENODEV;
-       ubifs_err("cannot create \"%s\" debugfs file or directory, error %d\n",
-                 fname, err);
+       pr_err("UBIFS error (pid %d): cannot create \"%s\" debugfs file or directory, error %d\n",
+              current->pid, fname, err);
        return err;
 }
 
 
        if (c->highest_inum >= INUM_WARN_WATERMARK) {
                if (c->highest_inum >= INUM_WATERMARK) {
                        spin_unlock(&c->cnt_lock);
-                       ubifs_err("out of inode numbers");
+                       ubifs_err(c, "out of inode numbers");
                        make_bad_inode(inode);
                        iput(inode);
                        return ERR_PTR(-EINVAL);
                }
-               ubifs_warn("running out of inode numbers (current %lu, max %d)",
+               ubifs_warn(c, "running out of inode numbers (current %lu, max %d)",
                           (unsigned long)c->highest_inum, INUM_WATERMARK);
        }
 
                 * checking.
                 */
                err = PTR_ERR(inode);
-               ubifs_err("dead directory entry '%pd', error %d",
+               ubifs_err(c, "dead directory entry '%pd', error %d",
                          dentry, err);
                ubifs_ro_mode(c, err);
                goto out;
        iput(inode);
 out_budg:
        ubifs_release_budget(c, &req);
-       ubifs_err("cannot create regular file, error %d", err);
+       ubifs_err(c, "cannot create regular file, error %d", err);
        return err;
 }
 
 
 out:
        if (err != -ENOENT) {
-               ubifs_err("cannot find next direntry, error %d", err);
+               ubifs_err(c, "cannot find next direntry, error %d", err);
                return err;
        }
 
        dir->i_mtime = dir->i_ctime = inode->i_ctime;
        err = ubifs_jnl_update(c, dir, &dentry->d_name, inode, 0, 0);
        if (err) {
-               ubifs_err("cannot create directory, error %d", err);
+               ubifs_err(c, "cannot create directory, error %d", err);
                goto out_cancel;
        }
        mutex_unlock(&dir_ui->ui_mutex);
 
 
        dlen = le32_to_cpu(dn->ch.len) - UBIFS_DATA_NODE_SZ;
        out_len = UBIFS_BLOCK_SIZE;
-       err = ubifs_decompress(&dn->data, dlen, addr, &out_len,
+       err = ubifs_decompress(c, &dn->data, dlen, addr, &out_len,
                               le16_to_cpu(dn->compr_type));
        if (err || len != out_len)
                goto dump;
        return 0;
 
 dump:
-       ubifs_err("bad data node (block %u, inode %lu)",
+       ubifs_err(c, "bad data node (block %u, inode %lu)",
                  block, inode->i_ino);
        ubifs_dump_node(c, dn);
        return -EINVAL;
                addr += UBIFS_BLOCK_SIZE;
        }
        if (err) {
+               struct ubifs_info *c = inode->i_sb->s_fs_info;
                if (err == -ENOENT) {
                        /* Not found, so it must be a hole */
                        SetPageChecked(page);
                        dbg_gen("hole");
                        goto out_free;
                }
-               ubifs_err("cannot read page %lu of inode %lu, error %d",
+               ubifs_err(c, "cannot read page %lu of inode %lu, error %d",
                          page->index, inode->i_ino, err);
                goto error;
        }
 
                        dlen = le32_to_cpu(dn->ch.len) - UBIFS_DATA_NODE_SZ;
                        out_len = UBIFS_BLOCK_SIZE;
-                       err = ubifs_decompress(&dn->data, dlen, addr, &out_len,
+                       err = ubifs_decompress(c, &dn->data, dlen, addr, &out_len,
                                               le16_to_cpu(dn->compr_type));
                        if (err || len != out_len)
                                goto out_err;
        SetPageError(page);
        flush_dcache_page(page);
        kunmap(page);
-       ubifs_err("bad data node (block %u, inode %lu)",
+       ubifs_err(c, "bad data node (block %u, inode %lu)",
                  page_block, inode->i_ino);
        return -EINVAL;
 }
        return ret;
 
 out_warn:
-       ubifs_warn("ignoring error %d and skipping bulk-read", err);
+       ubifs_warn(c, "ignoring error %d and skipping bulk-read", err);
        goto out_free;
 
 out_bu_off:
        }
        if (err) {
                SetPageError(page);
-               ubifs_err("cannot write page %lu of inode %lu, error %d",
+               ubifs_err(c, "cannot write page %lu of inode %lu, error %d",
                          page->index, inode->i_ino, err);
                ubifs_ro_mode(c, err);
        }
        err = ubifs_budget_space(c, &req);
        if (unlikely(err)) {
                if (err == -ENOSPC)
-                       ubifs_warn("out of space for mmapped file (inode number %lu)",
+                       ubifs_warn(c, "out of space for mmapped file (inode number %lu)",
                                   inode->i_ino);
                return VM_FAULT_SIGBUS;
        }
 
                c->ro_error = 1;
                c->no_chk_data_crc = 0;
                c->vfs_sb->s_flags |= MS_RDONLY;
-               ubifs_warn("switched to read-only mode, error %d", err);
+               ubifs_warn(c, "switched to read-only mode, error %d", err);
                dump_stack();
        }
 }
         * @even_ebadmsg is true.
         */
        if (err && (err != -EBADMSG || even_ebadmsg)) {
-               ubifs_err("reading %d bytes from LEB %d:%d failed, error %d",
+               ubifs_err(c, "reading %d bytes from LEB %d:%d failed, error %d",
                          len, lnum, offs, err);
                dump_stack();
        }
        else
                err = dbg_leb_write(c, lnum, buf, offs, len);
        if (err) {
-               ubifs_err("writing %d bytes to LEB %d:%d failed, error %d",
+               ubifs_err(c, "writing %d bytes to LEB %d:%d failed, error %d",
                          len, lnum, offs, err);
                ubifs_ro_mode(c, err);
                dump_stack();
        else
                err = dbg_leb_change(c, lnum, buf, len);
        if (err) {
-               ubifs_err("changing %d bytes in LEB %d failed, error %d",
+               ubifs_err(c, "changing %d bytes in LEB %d failed, error %d",
                          len, lnum, err);
                ubifs_ro_mode(c, err);
                dump_stack();
        else
                err = dbg_leb_unmap(c, lnum);
        if (err) {
-               ubifs_err("unmap LEB %d failed, error %d", lnum, err);
+               ubifs_err(c, "unmap LEB %d failed, error %d", lnum, err);
                ubifs_ro_mode(c, err);
                dump_stack();
        }
        else
                err = dbg_leb_map(c, lnum);
        if (err) {
-               ubifs_err("mapping LEB %d failed, error %d", lnum, err);
+               ubifs_err(c, "mapping LEB %d failed, error %d", lnum, err);
                ubifs_ro_mode(c, err);
                dump_stack();
        }
 
        err = ubi_is_mapped(c->ubi, lnum);
        if (err < 0) {
-               ubifs_err("ubi_is_mapped failed for LEB %d, error %d",
+               ubifs_err(c, "ubi_is_mapped failed for LEB %d, error %d",
                          lnum, err);
                dump_stack();
        }
        magic = le32_to_cpu(ch->magic);
        if (magic != UBIFS_NODE_MAGIC) {
                if (!quiet)
-                       ubifs_err("bad magic %#08x, expected %#08x",
+                       ubifs_err(c, "bad magic %#08x, expected %#08x",
                                  magic, UBIFS_NODE_MAGIC);
                err = -EUCLEAN;
                goto out;
        type = ch->node_type;
        if (type < 0 || type >= UBIFS_NODE_TYPES_CNT) {
                if (!quiet)
-                       ubifs_err("bad node type %d", type);
+                       ubifs_err(c, "bad node type %d", type);
                goto out;
        }
 
        node_crc = le32_to_cpu(ch->crc);
        if (crc != node_crc) {
                if (!quiet)
-                       ubifs_err("bad CRC: calculated %#08x, read %#08x",
+                       ubifs_err(c, "bad CRC: calculated %#08x, read %#08x",
                                  crc, node_crc);
                err = -EUCLEAN;
                goto out;
 
 out_len:
        if (!quiet)
-               ubifs_err("bad node length %d", node_len);
+               ubifs_err(c, "bad node length %d", node_len);
 out:
        if (!quiet) {
-               ubifs_err("bad node at LEB %d:%d", lnum, offs);
+               ubifs_err(c, "bad node at LEB %d:%d", lnum, offs);
                ubifs_dump_node(c, buf);
                dump_stack();
        }
 
        if (unlikely(sqnum >= SQNUM_WARN_WATERMARK)) {
                if (sqnum >= SQNUM_WATERMARK) {
-                       ubifs_err("sequence number overflow %llu, end of life",
+                       ubifs_err(c, "sequence number overflow %llu, end of life",
                                  sqnum);
                        ubifs_ro_mode(c, -EINVAL);
                }
-               ubifs_warn("running out of sequence numbers, end of life soon");
+               ubifs_warn(c, "running out of sequence numbers, end of life soon");
        }
 
        return sqnum;
                err = ubifs_wbuf_sync_nolock(wbuf);
                mutex_unlock(&wbuf->io_mutex);
                if (err) {
-                       ubifs_err("cannot sync write-buffer, error %d", err);
+                       ubifs_err(c, "cannot sync write-buffer, error %d", err);
                        ubifs_ro_mode(c, err);
                        goto out_timers;
                }
        return 0;
 
 out:
-       ubifs_err("cannot write %d bytes to LEB %d:%d, error %d",
+       ubifs_err(c, "cannot write %d bytes to LEB %d:%d, error %d",
                  len, wbuf->lnum, wbuf->offs, err);
        ubifs_dump_node(c, buf);
        dump_stack();
        }
 
        if (type != ch->node_type) {
-               ubifs_err("bad node type (%d but expected %d)",
+               ubifs_err(c, "bad node type (%d but expected %d)",
                          ch->node_type, type);
                goto out;
        }
 
        err = ubifs_check_node(c, buf, lnum, offs, 0, 0);
        if (err) {
-               ubifs_err("expected node type %d", type);
+               ubifs_err(c, "expected node type %d", type);
                return err;
        }
 
        rlen = le32_to_cpu(ch->len);
        if (rlen != len) {
-               ubifs_err("bad node length %d, expected %d", rlen, len);
+               ubifs_err(c, "bad node length %d, expected %d", rlen, len);
                goto out;
        }
 
        return 0;
 
 out:
-       ubifs_err("bad node at LEB %d:%d", lnum, offs);
+       ubifs_err(c, "bad node at LEB %d:%d", lnum, offs);
        ubifs_dump_node(c, buf);
        dump_stack();
        return -EINVAL;
 
        return err;
 
 out_unlock:
-       ubifs_err("can't modify inode %lu attributes", inode->i_ino);
+       ubifs_err(c, "can't modify inode %lu attributes", inode->i_ino);
        mutex_unlock(&ui->ui_mutex);
        ubifs_release_budget(c, &req);
        return err;
 
                 * This should not happen unless the journal size limitations
                 * are too tough.
                 */
-               ubifs_err("stuck in space allocation");
+               ubifs_err(c, "stuck in space allocation");
                err = -ENOSPC;
                goto out;
        } else if (cmt_retries > 32)
-               ubifs_warn("too many space allocation re-tries (%d)",
+               ubifs_warn(c, "too many space allocation re-tries (%d)",
                           cmt_retries);
 
        dbg_jnl("-EAGAIN, commit and retry (retried %d times)",
        goto again;
 
 out:
-       ubifs_err("cannot reserve %d bytes in jhead %d, error %d",
+       ubifs_err(c, "cannot reserve %d bytes in jhead %d, error %d",
                  len, jhead, err);
        if (err == -ENOSPC) {
                /* This are some budgeting problems, print useful information */
                compr_type = ui->compr_type;
 
        out_len = dlen - UBIFS_DATA_NODE_SZ;
-       ubifs_compress(buf, len, &data->data, &out_len, &compr_type);
+       ubifs_compress(c, buf, len, &data->data, &out_len, &compr_type);
        ubifs_assert(out_len <= UBIFS_BLOCK_SIZE);
 
        dlen = UBIFS_DATA_NODE_SZ + out_len;
  * This function is used when an inode is truncated and the last data node of
  * the inode has to be re-compressed and re-written.
  */
-static int recomp_data_node(struct ubifs_data_node *dn, int *new_len)
+static int recomp_data_node(const struct ubifs_info *c,
+                           struct ubifs_data_node *dn, int *new_len)
 {
        void *buf;
        int err, len, compr_type, out_len;
 
        len = le32_to_cpu(dn->ch.len) - UBIFS_DATA_NODE_SZ;
        compr_type = le16_to_cpu(dn->compr_type);
-       err = ubifs_decompress(&dn->data, len, buf, &out_len, compr_type);
+       err = ubifs_decompress(c, &dn->data, len, buf, &out_len, compr_type);
        if (err)
                goto out;
 
-       ubifs_compress(buf, *new_len, &dn->data, &out_len, &compr_type);
+       ubifs_compress(c, buf, *new_len, &dn->data, &out_len, &compr_type);
        ubifs_assert(out_len <= UBIFS_BLOCK_SIZE);
        dn->compr_type = cpu_to_le16(compr_type);
        dn->size = cpu_to_le32(*new_len);
                                int compr_type = le16_to_cpu(dn->compr_type);
 
                                if (compr_type != UBIFS_COMPR_NONE) {
-                                       err = recomp_data_node(dn, &dlen);
+                                       err = recomp_data_node(c, dn, &dlen);
                                        if (err)
                                                goto out_free;
                                } else {
 
        destroy_done_tree(&done_tree);
        vfree(buf);
        if (write_lnum == c->lhead_lnum) {
-               ubifs_err("log is too full");
+               ubifs_err(c, "log is too full");
                return -EINVAL;
        }
        /* Unmap remaining LEBs */
                        bud_bytes += c->leb_size - bud->start;
 
        if (c->bud_bytes != bud_bytes) {
-               ubifs_err("bad bud_bytes %lld, calculated %lld",
+               ubifs_err(c, "bad bud_bytes %lld, calculated %lld",
                          c->bud_bytes, bud_bytes);
                err = -EINVAL;
        }
 
 out:
        ubifs_release_lprops(c);
        if (err)
-               ubifs_err("cannot change properties of LEB %d, error %d",
+               ubifs_err(c, "cannot change properties of LEB %d, error %d",
                          lnum, err);
        return err;
 }
 out:
        ubifs_release_lprops(c);
        if (err)
-               ubifs_err("cannot update properties of LEB %d, error %d",
+               ubifs_err(c, "cannot update properties of LEB %d, error %d",
                          lnum, err);
        return err;
 }
        lpp = ubifs_lpt_lookup(c, lnum);
        if (IS_ERR(lpp)) {
                err = PTR_ERR(lpp);
-               ubifs_err("cannot read properties of LEB %d, error %d",
+               ubifs_err(c, "cannot read properties of LEB %d, error %d",
                          lnum, err);
                goto out;
        }
 
        list_for_each_entry(lprops, &c->empty_list, list) {
                if (lprops->free != c->leb_size) {
-                       ubifs_err("non-empty LEB %d on empty list (free %d dirty %d flags %d)",
+                       ubifs_err(c, "non-empty LEB %d on empty list (free %d dirty %d flags %d)",
                                  lprops->lnum, lprops->free, lprops->dirty,
                                  lprops->flags);
                        return -EINVAL;
                }
                if (lprops->flags & LPROPS_TAKEN) {
-                       ubifs_err("taken LEB %d on empty list (free %d dirty %d flags %d)",
+                       ubifs_err(c, "taken LEB %d on empty list (free %d dirty %d flags %d)",
                                  lprops->lnum, lprops->free, lprops->dirty,
                                  lprops->flags);
                        return -EINVAL;
        i = 0;
        list_for_each_entry(lprops, &c->freeable_list, list) {
                if (lprops->free + lprops->dirty != c->leb_size) {
-                       ubifs_err("non-freeable LEB %d on freeable list (free %d dirty %d flags %d)",
+                       ubifs_err(c, "non-freeable LEB %d on freeable list (free %d dirty %d flags %d)",
                                  lprops->lnum, lprops->free, lprops->dirty,
                                  lprops->flags);
                        return -EINVAL;
                }
                if (lprops->flags & LPROPS_TAKEN) {
-                       ubifs_err("taken LEB %d on freeable list (free %d dirty %d flags %d)",
+                       ubifs_err(c, "taken LEB %d on freeable list (free %d dirty %d flags %d)",
                                  lprops->lnum, lprops->free, lprops->dirty,
                                  lprops->flags);
                        return -EINVAL;
                i += 1;
        }
        if (i != c->freeable_cnt) {
-               ubifs_err("freeable list count %d expected %d", i,
+               ubifs_err(c, "freeable list count %d expected %d", i,
                          c->freeable_cnt);
                return -EINVAL;
        }
        list_for_each(pos, &c->idx_gc)
                i += 1;
        if (i != c->idx_gc_cnt) {
-               ubifs_err("idx_gc list count %d expected %d", i,
+               ubifs_err(c, "idx_gc list count %d expected %d", i,
                          c->idx_gc_cnt);
                return -EINVAL;
        }
 
        list_for_each_entry(lprops, &c->frdi_idx_list, list) {
                if (lprops->free + lprops->dirty != c->leb_size) {
-                       ubifs_err("non-freeable LEB %d on frdi_idx list (free %d dirty %d flags %d)",
+                       ubifs_err(c, "non-freeable LEB %d on frdi_idx list (free %d dirty %d flags %d)",
                                  lprops->lnum, lprops->free, lprops->dirty,
                                  lprops->flags);
                        return -EINVAL;
                }
                if (lprops->flags & LPROPS_TAKEN) {
-                       ubifs_err("taken LEB %d on frdi_idx list (free %d dirty %d flags %d)",
+                       ubifs_err(c, "taken LEB %d on frdi_idx list (free %d dirty %d flags %d)",
                                  lprops->lnum, lprops->free, lprops->dirty,
                                  lprops->flags);
                        return -EINVAL;
                }
                if (!(lprops->flags & LPROPS_INDEX)) {
-                       ubifs_err("non-index LEB %d on frdi_idx list (free %d dirty %d flags %d)",
+                       ubifs_err(c, "non-index LEB %d on frdi_idx list (free %d dirty %d flags %d)",
                                  lprops->lnum, lprops->free, lprops->dirty,
                                  lprops->flags);
                        return -EINVAL;
                for (i = 0; i < heap->cnt; i++) {
                        lprops = heap->arr[i];
                        if (!lprops) {
-                               ubifs_err("null ptr in LPT heap cat %d", cat);
+                               ubifs_err(c, "null ptr in LPT heap cat %d", cat);
                                return -EINVAL;
                        }
                        if (lprops->hpos != i) {
-                               ubifs_err("bad ptr in LPT heap cat %d", cat);
+                               ubifs_err(c, "bad ptr in LPT heap cat %d", cat);
                                return -EINVAL;
                        }
                        if (lprops->flags & LPROPS_TAKEN) {
-                               ubifs_err("taken LEB in LPT heap cat %d", cat);
+                               ubifs_err(c, "taken LEB in LPT heap cat %d", cat);
                                return -EINVAL;
                        }
                }
                        goto out;
                }
                if (lprops != lp) {
-                       ubifs_err("lprops %zx lp %zx lprops->lnum %d lp->lnum %d",
+                       ubifs_err(c, "lprops %zx lp %zx lprops->lnum %d lp->lnum %d",
                                  (size_t)lprops, (size_t)lp, lprops->lnum,
                                  lp->lnum);
                        err = 4;
        }
 out:
        if (err) {
-               ubifs_err("failed cat %d hpos %d err %d", cat, i, err);
+               ubifs_err(c, "failed cat %d hpos %d err %d", cat, i, err);
                dump_stack();
                ubifs_dump_heap(c, heap, cat);
        }
        if (cat != LPROPS_UNCAT) {
                cat = ubifs_categorize_lprops(c, lp);
                if (cat != (lp->flags & LPROPS_CAT_MASK)) {
-                       ubifs_err("bad LEB category %d expected %d",
+                       ubifs_err(c, "bad LEB category %d expected %d",
                                  (lp->flags & LPROPS_CAT_MASK), cat);
                        return -EINVAL;
                }
                                }
                        }
                        if (!found) {
-                               ubifs_err("bad LPT list (category %d)", cat);
+                               ubifs_err(c, "bad LPT list (category %d)", cat);
                                return -EINVAL;
                        }
                }
 
                if ((lp->hpos != -1 && heap->arr[lp->hpos]->lnum != lnum) ||
                    lp != heap->arr[lp->hpos]) {
-                       ubifs_err("bad LPT heap (category %d)", cat);
+                       ubifs_err(c, "bad LPT heap (category %d)", cat);
                        return -EINVAL;
                }
        }
                        is_idx = (snod->type == UBIFS_IDX_NODE) ? 1 : 0;
 
                if (is_idx && snod->type != UBIFS_IDX_NODE) {
-                       ubifs_err("indexing node in data LEB %d:%d",
+                       ubifs_err(c, "indexing node in data LEB %d:%d",
                                  lnum, snod->offs);
                        goto out_destroy;
                }
 
        if (free > c->leb_size || free < 0 || dirty > c->leb_size ||
            dirty < 0) {
-               ubifs_err("bad calculated accounting for LEB %d: free %d, dirty %d",
+               ubifs_err(c, "bad calculated accounting for LEB %d: free %d, dirty %d",
                          lnum, free, dirty);
                goto out_destroy;
        }
                        /* Free but not unmapped LEB, it's fine */
                        is_idx = 0;
                else {
-                       ubifs_err("indexing node without indexing flag");
+                       ubifs_err(c, "indexing node without indexing flag");
                        goto out_print;
                }
        }
 
        if (!is_idx && (lp->flags & LPROPS_INDEX)) {
-               ubifs_err("data node with indexing flag");
+               ubifs_err(c, "data node with indexing flag");
                goto out_print;
        }
 
        return LPT_SCAN_CONTINUE;
 
 out_print:
-       ubifs_err("bad accounting of LEB %d: free %d, dirty %d flags %#x, should be free %d, dirty %d",
+       ubifs_err(c, "bad accounting of LEB %d: free %d, dirty %d flags %#x, should be free %d, dirty %d",
                  lnum, lp->free, lp->dirty, lp->flags, free, dirty);
        ubifs_dump_leb(c, lnum);
 out_destroy:
            lst.total_free != c->lst.total_free ||
            lst.total_dirty != c->lst.total_dirty ||
            lst.total_used != c->lst.total_used) {
-               ubifs_err("bad overall accounting");
-               ubifs_err("calculated: empty_lebs %d, idx_lebs %d, total_free %lld, total_dirty %lld, total_used %lld",
+               ubifs_err(c, "bad overall accounting");
+               ubifs_err(c, "calculated: empty_lebs %d, idx_lebs %d, total_free %lld, total_dirty %lld, total_used %lld",
                          lst.empty_lebs, lst.idx_lebs, lst.total_free,
                          lst.total_dirty, lst.total_used);
-               ubifs_err("read from lprops: empty_lebs %d, idx_lebs %d, total_free %lld, total_dirty %lld, total_used %lld",
+               ubifs_err(c, "read from lprops: empty_lebs %d, idx_lebs %d, total_free %lld, total_dirty %lld, total_used %lld",
                          c->lst.empty_lebs, c->lst.idx_lebs, c->lst.total_free,
                          c->lst.total_dirty, c->lst.total_used);
                err = -EINVAL;
 
        if (lst.total_dead != c->lst.total_dead ||
            lst.total_dark != c->lst.total_dark) {
-               ubifs_err("bad dead/dark space accounting");
-               ubifs_err("calculated: total_dead %lld, total_dark %lld",
+               ubifs_err(c, "bad dead/dark space accounting");
+               ubifs_err(c, "calculated: total_dead %lld, total_dark %lld",
                          lst.total_dead, lst.total_dark);
-               ubifs_err("read from lprops: total_dead %lld, total_dark %lld",
+               ubifs_err(c, "read from lprops: total_dead %lld, total_dark %lld",
                          c->lst.total_dead, c->lst.total_dark);
                err = -EINVAL;
                goto out;
 
        sz = c->lpt_sz * 2; /* Must have at least 2 times the size */
        lebs_needed = div_u64(sz + c->leb_size - 1, c->leb_size);
        if (lebs_needed > c->lpt_lebs) {
-               ubifs_err("too few LPT LEBs");
+               ubifs_err(c, "too few LPT LEBs");
                return -EINVAL;
        }
 
        /* Verify that ltab fits in a single LEB (since ltab is a single node */
        if (c->ltab_sz > c->leb_size) {
-               ubifs_err("LPT ltab too big");
+               ubifs_err(c, "LPT ltab too big");
                return -EINVAL;
        }
 
                        continue;
                }
                if (c->ltab_sz > c->leb_size) {
-                       ubifs_err("LPT ltab too big");
+                       ubifs_err(c, "LPT ltab too big");
                        return -EINVAL;
                }
                *main_lebs = c->main_lebs;
  *
  * This function returns %0 on success and a negative error code on failure.
  */
-static int check_lpt_crc(void *buf, int len)
+static int check_lpt_crc(const struct ubifs_info *c, void *buf, int len)
 {
        int pos = 0;
        uint8_t *addr = buf;
        calc_crc = crc16(-1, buf + UBIFS_LPT_CRC_BYTES,
                         len - UBIFS_LPT_CRC_BYTES);
        if (crc != calc_crc) {
-               ubifs_err("invalid crc in LPT node: crc %hx calc %hx", crc,
-                         calc_crc);
+               ubifs_err(c, "invalid crc in LPT node: crc %hx calc %hx",
+                         crc, calc_crc);
                dump_stack();
                return -EINVAL;
        }
  *
  * This function returns %0 on success and a negative error code on failure.
  */
-static int check_lpt_type(uint8_t **addr, int *pos, int type)
+static int check_lpt_type(const struct ubifs_info *c, uint8_t **addr,
+                         int *pos, int type)
 {
        int node_type;
 
        node_type = ubifs_unpack_bits(addr, pos, UBIFS_LPT_TYPE_BITS);
        if (node_type != type) {
-               ubifs_err("invalid type (%d) in LPT node type %d", node_type,
-                         type);
+               ubifs_err(c, "invalid type (%d) in LPT node type %d",
+                         node_type, type);
                dump_stack();
                return -EINVAL;
        }
        uint8_t *addr = buf + UBIFS_LPT_CRC_BYTES;
        int i, pos = 0, err;
 
-       err = check_lpt_type(&addr, &pos, UBIFS_LPT_PNODE);
+       err = check_lpt_type(c, &addr, &pos, UBIFS_LPT_PNODE);
        if (err)
                return err;
        if (c->big_lpt)
                        lprops->flags = 0;
                lprops->flags |= ubifs_categorize_lprops(c, lprops);
        }
-       err = check_lpt_crc(buf, c->pnode_sz);
+       err = check_lpt_crc(c, buf, c->pnode_sz);
        return err;
 }
 
        uint8_t *addr = buf + UBIFS_LPT_CRC_BYTES;
        int i, pos = 0, err;
 
-       err = check_lpt_type(&addr, &pos, UBIFS_LPT_NNODE);
+       err = check_lpt_type(c, &addr, &pos, UBIFS_LPT_NNODE);
        if (err)
                return err;
        if (c->big_lpt)
                nnode->nbranch[i].offs = ubifs_unpack_bits(&addr, &pos,
                                                     c->lpt_offs_bits);
        }
-       err = check_lpt_crc(buf, c->nnode_sz);
+       err = check_lpt_crc(c, buf, c->nnode_sz);
        return err;
 }
 
        uint8_t *addr = buf + UBIFS_LPT_CRC_BYTES;
        int i, pos = 0, err;
 
-       err = check_lpt_type(&addr, &pos, UBIFS_LPT_LTAB);
+       err = check_lpt_type(c, &addr, &pos, UBIFS_LPT_LTAB);
        if (err)
                return err;
        for (i = 0; i < c->lpt_lebs; i++) {
                c->ltab[i].tgc = 0;
                c->ltab[i].cmt = 0;
        }
-       err = check_lpt_crc(buf, c->ltab_sz);
+       err = check_lpt_crc(c, buf, c->ltab_sz);
        return err;
 }
 
        uint8_t *addr = buf + UBIFS_LPT_CRC_BYTES;
        int i, pos = 0, err;
 
-       err = check_lpt_type(&addr, &pos, UBIFS_LPT_LSAVE);
+       err = check_lpt_type(c, &addr, &pos, UBIFS_LPT_LSAVE);
        if (err)
                return err;
        for (i = 0; i < c->lsave_cnt; i++) {
                        return -EINVAL;
                c->lsave[i] = lnum;
        }
-       err = check_lpt_crc(buf, c->lsave_sz);
+       err = check_lpt_crc(c, buf, c->lsave_sz);
        return err;
 }
 
        return 0;
 
 out:
-       ubifs_err("error %d reading nnode at %d:%d", err, lnum, offs);
+       ubifs_err(c, "error %d reading nnode at %d:%d", err, lnum, offs);
        dump_stack();
        kfree(nnode);
        return err;
        return 0;
 
 out:
-       ubifs_err("error %d reading pnode at %d:%d", err, lnum, offs);
+       ubifs_err(c, "error %d reading pnode at %d:%d", err, lnum, offs);
        ubifs_dump_pnode(c, pnode, parent, iip);
        dump_stack();
-       ubifs_err("calc num: %d", calc_pnode_num_from_parent(c, parent, iip));
+       ubifs_err(c, "calc num: %d", calc_pnode_num_from_parent(c, parent, iip));
        kfree(pnode);
        return err;
 }
        int i;
 
        if (pnode->num != col) {
-               ubifs_err("pnode num %d expected %d parent num %d iip %d",
+               ubifs_err(c, "pnode num %d expected %d parent num %d iip %d",
                          pnode->num, col, pnode->parent->num, pnode->iip);
                return -EINVAL;
        }
                if (lnum >= c->leb_cnt)
                        continue;
                if (lprops->lnum != lnum) {
-                       ubifs_err("bad LEB number %d expected %d",
+                       ubifs_err(c, "bad LEB number %d expected %d",
                                  lprops->lnum, lnum);
                        return -EINVAL;
                }
                if (lprops->flags & LPROPS_TAKEN) {
                        if (cat != LPROPS_UNCAT) {
-                               ubifs_err("LEB %d taken but not uncat %d",
+                               ubifs_err(c, "LEB %d taken but not uncat %d",
                                          lprops->lnum, cat);
                                return -EINVAL;
                        }
                        case LPROPS_FRDI_IDX:
                                break;
                        default:
-                               ubifs_err("LEB %d index but cat %d",
+                               ubifs_err(c, "LEB %d index but cat %d",
                                          lprops->lnum, cat);
                                return -EINVAL;
                        }
                        case LPROPS_FREEABLE:
                                break;
                        default:
-                               ubifs_err("LEB %d not index but cat %d",
+                               ubifs_err(c, "LEB %d not index but cat %d",
                                          lprops->lnum, cat);
                                return -EINVAL;
                        }
                        break;
                }
                if (!found) {
-                       ubifs_err("LEB %d cat %d not found in cat heap/list",
+                       ubifs_err(c, "LEB %d cat %d not found in cat heap/list",
                                  lprops->lnum, cat);
                        return -EINVAL;
                }
                switch (cat) {
                case LPROPS_EMPTY:
                        if (lprops->free != c->leb_size) {
-                               ubifs_err("LEB %d cat %d free %d dirty %d",
+                               ubifs_err(c, "LEB %d cat %d free %d dirty %d",
                                          lprops->lnum, cat, lprops->free,
                                          lprops->dirty);
                                return -EINVAL;
                case LPROPS_FREEABLE:
                case LPROPS_FRDI_IDX:
                        if (lprops->free + lprops->dirty != c->leb_size) {
-                               ubifs_err("LEB %d cat %d free %d dirty %d",
+                               ubifs_err(c, "LEB %d cat %d free %d dirty %d",
                                          lprops->lnum, cat, lprops->free,
                                          lprops->dirty);
                                return -EINVAL;
                        /* cnode is a nnode */
                        num = calc_nnode_num(row, col);
                        if (cnode->num != num) {
-                               ubifs_err("nnode num %d expected %d parent num %d iip %d",
+                               ubifs_err(c, "nnode num %d expected %d parent num %d iip %d",
                                          cnode->num, num,
                                          (nnode ? nnode->num : 0), cnode->iip);
                                return -EINVAL;
 
        return 0;
 
 no_space:
-       ubifs_err("LPT out of space at LEB %d:%d needing %d, done_ltab %d, done_lsave %d",
+       ubifs_err(c, "LPT out of space at LEB %d:%d needing %d, done_ltab %d, done_lsave %d",
                  lnum, offs, len, done_ltab, done_lsave);
        ubifs_dump_lpt_info(c);
        ubifs_dump_lpt_lebs(c);
        return 0;
 
 no_space:
-       ubifs_err("LPT out of space mismatch at LEB %d:%d needing %d, done_ltab %d, done_lsave %d",
+       ubifs_err(c, "LPT out of space mismatch at LEB %d:%d needing %d, done_ltab %d, done_lsave %d",
                  lnum, offs, len, done_ltab, done_lsave);
        ubifs_dump_lpt_info(c);
        ubifs_dump_lpt_lebs(c);
 
        buf = p = __vmalloc(c->leb_size, GFP_NOFS, PAGE_KERNEL);
        if (!buf) {
-               ubifs_err("cannot allocate memory for ltab checking");
+               ubifs_err(c, "cannot allocate memory for ltab checking");
                return 0;
        }
 
                                continue;
                        }
                        if (!dbg_is_all_ff(p, len)) {
-                               ubifs_err("invalid empty space in LEB %d at %d",
+                               ubifs_err(c, "invalid empty space in LEB %d at %d",
                                          lnum, c->leb_size - len);
                                err = -EINVAL;
                        }
                        i = lnum - c->lpt_first;
                        if (len != c->ltab[i].free) {
-                               ubifs_err("invalid free space in LEB %d (free %d, expected %d)",
+                               ubifs_err(c, "invalid free space in LEB %d (free %d, expected %d)",
                                          lnum, len, c->ltab[i].free);
                                err = -EINVAL;
                        }
                        if (dirty != c->ltab[i].dirty) {
-                               ubifs_err("invalid dirty space in LEB %d (dirty %d, expected %d)",
+                               ubifs_err(c, "invalid dirty space in LEB %d (dirty %d, expected %d)",
                                          lnum, dirty, c->ltab[i].dirty);
                                err = -EINVAL;
                        }
        for (lnum = c->lpt_first; lnum <= c->lpt_last; lnum++) {
                err = dbg_check_ltab_lnum(c, lnum);
                if (err) {
-                       ubifs_err("failed at LEB %d", lnum);
+                       ubifs_err(c, "failed at LEB %d", lnum);
                        return err;
                }
        }
                        free += c->leb_size;
        }
        if (free < c->lpt_sz) {
-               ubifs_err("LPT space error: free %lld lpt_sz %lld",
+               ubifs_err(c, "LPT space error: free %lld lpt_sz %lld",
                          free, c->lpt_sz);
                ubifs_dump_lpt_info(c);
                ubifs_dump_lpt_lebs(c);
                d->chk_lpt_lebs = 0;
                d->chk_lpt_wastage = 0;
                if (c->dirty_pn_cnt > c->pnode_cnt) {
-                       ubifs_err("dirty pnodes %d exceed max %d",
+                       ubifs_err(c, "dirty pnodes %d exceed max %d",
                                  c->dirty_pn_cnt, c->pnode_cnt);
                        err = -EINVAL;
                }
                if (c->dirty_nn_cnt > c->nnode_cnt) {
-                       ubifs_err("dirty nnodes %d exceed max %d",
+                       ubifs_err(c, "dirty nnodes %d exceed max %d",
                                  c->dirty_nn_cnt, c->nnode_cnt);
                        err = -EINVAL;
                }
                chk_lpt_sz *= d->chk_lpt_lebs;
                chk_lpt_sz += len - c->nhead_offs;
                if (d->chk_lpt_sz != chk_lpt_sz) {
-                       ubifs_err("LPT wrote %lld but space used was %lld",
+                       ubifs_err(c, "LPT wrote %lld but space used was %lld",
                                  d->chk_lpt_sz, chk_lpt_sz);
                        err = -EINVAL;
                }
                if (d->chk_lpt_sz > c->lpt_sz) {
-                       ubifs_err("LPT wrote %lld but lpt_sz is %lld",
+                       ubifs_err(c, "LPT wrote %lld but lpt_sz is %lld",
                                  d->chk_lpt_sz, c->lpt_sz);
                        err = -EINVAL;
                }
                if (d->chk_lpt_sz2 && d->chk_lpt_sz != d->chk_lpt_sz2) {
-                       ubifs_err("LPT layout size %lld but wrote %lld",
+                       ubifs_err(c, "LPT layout size %lld but wrote %lld",
                                  d->chk_lpt_sz, d->chk_lpt_sz2);
                        err = -EINVAL;
                }
                if (d->chk_lpt_sz2 && d->new_nhead_offs != len) {
-                       ubifs_err("LPT new nhead offs: expected %d was %d",
+                       ubifs_err(c, "LPT new nhead offs: expected %d was %d",
                                  d->new_nhead_offs, len);
                        err = -EINVAL;
                }
                if (c->big_lpt)
                        lpt_sz += c->lsave_sz;
                if (d->chk_lpt_sz - d->chk_lpt_wastage > lpt_sz) {
-                       ubifs_err("LPT chk_lpt_sz %lld + waste %lld exceeds %lld",
+                       ubifs_err(c, "LPT chk_lpt_sz %lld + waste %lld exceeds %lld",
                                  d->chk_lpt_sz, d->chk_lpt_wastage, lpt_sz);
                        err = -EINVAL;
                }
        pr_err("(pid %d) start dumping LEB %d\n", current->pid, lnum);
        buf = p = __vmalloc(c->leb_size, GFP_NOFS, PAGE_KERNEL);
        if (!buf) {
-               ubifs_err("cannot allocate memory to dump LPT");
+               ubifs_err(c, "cannot allocate memory to dump LPT");
                return;
        }
 
                        pr_err("LEB %d:%d, lsave len\n", lnum, offs);
                        break;
                default:
-                       ubifs_err("LPT node type %d not recognized", node_type);
+                       ubifs_err(c, "LPT node type %d not recognized", node_type);
                        goto out;
                }
 
 
        return -EUCLEAN;
 
 out_dump:
-       ubifs_err("unexpected node type %d master LEB %d:%d",
+       ubifs_err(c, "unexpected node type %d master LEB %d:%d",
                  snod->type, lnum, snod->offs);
        ubifs_scan_destroy(sleb);
        return -EINVAL;
        return 0;
 
 out:
-       ubifs_err("bad master node at offset %d error %d", c->mst_offs, err);
+       ubifs_err(c, "bad master node at offset %d error %d", c->mst_offs, err);
        ubifs_dump_node(c, c->mst_node);
        return -EINVAL;
 }
 
                if (c->leb_cnt < old_leb_cnt ||
                    c->leb_cnt < UBIFS_MIN_LEB_CNT) {
-                       ubifs_err("bad leb_cnt on master node");
+                       ubifs_err(c, "bad leb_cnt on master node");
                        ubifs_dump_node(c, c->mst_node);
                        return -EINVAL;
                }
 
                else if (inum > o->inum)
                        p = &(*p)->rb_right;
                else {
-                       ubifs_err("orphaned twice");
+                       ubifs_err(c, "orphaned twice");
                        spin_unlock(&c->orphan_lock);
                        kfree(orphan);
                        return 0;
                }
        }
        spin_unlock(&c->orphan_lock);
-       ubifs_err("missing orphan ino %lu", (unsigned long)inum);
+       ubifs_err(c, "missing orphan ino %lu", (unsigned long)inum);
        dump_stack();
 }
 
                         * We limit the number of orphans so that this should
                         * never happen.
                         */
-                       ubifs_err("out of space in orphan area");
+                       ubifs_err(c, "out of space in orphan area");
                        return -EINVAL;
                }
        }
                 * We limit the number of orphans so that this should
                 * never happen.
                 */
-               ubifs_err("out of space in orphan area");
+               ubifs_err(c, "out of space in orphan area");
                err = -EINVAL;
        }
        spin_unlock(&c->orphan_lock);
 
        list_for_each_entry(snod, &sleb->nodes, list) {
                if (snod->type != UBIFS_ORPH_NODE) {
-                       ubifs_err("invalid node type %d in orphan area at %d:%d",
+                       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);
                        return -EINVAL;
                         * number. That makes this orphan node, out of date.
                         */
                        if (!first) {
-                               ubifs_err("out of order commit number %llu in orphan node at %d:%d",
+                               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);
                                return -EINVAL;
        if (inum != ci->last_ino) {
                /* Lowest node type is the inode node, so it comes first */
                if (key_type(c, &zbr->key) != UBIFS_INO_KEY)
-                       ubifs_err("found orphan node ino %lu, type %d",
+                       ubifs_err(c, "found orphan node ino %lu, type %d",
                                  (unsigned long)inum, key_type(c, &zbr->key));
                ci->last_ino = inum;
                ci->tot_inos += 1;
                err = ubifs_tnc_read_node(c, zbr, ci->node);
                if (err) {
-                       ubifs_err("node read failed, error %d", err);
+                       ubifs_err(c, "node read failed, error %d", err);
                        return err;
                }
                if (ci->node->nlink == 0)
                        /* Must be recorded as an orphan */
                        if (!dbg_find_check_orphan(&ci->root, inum) &&
                            !dbg_find_orphan(c, inum)) {
-                               ubifs_err("missing orphan, ino %lu",
+                               ubifs_err(c, "missing orphan, ino %lu",
                                          (unsigned long)inum);
                                ci->missing += 1;
                        }
 
        buf = __vmalloc(c->leb_size, GFP_NOFS, PAGE_KERNEL);
        if (!buf) {
-               ubifs_err("cannot allocate memory to check orphans");
+               ubifs_err(c, "cannot allocate memory to check orphans");
                return 0;
        }
 
        ci.root = RB_ROOT;
        ci.node = kmalloc(UBIFS_MAX_INO_NODE_SZ, GFP_NOFS);
        if (!ci.node) {
-               ubifs_err("out of memory");
+               ubifs_err(c, "out of memory");
                return -ENOMEM;
        }
 
 
        err = dbg_walk_index(c, &dbg_orphan_check, NULL, &ci);
        if (err) {
-               ubifs_err("cannot scan TNC, error %d", err);
+               ubifs_err(c, "cannot scan TNC, error %d", err);
                goto out;
        }
 
        if (ci.missing) {
-               ubifs_err("%lu missing orphan(s)", ci.missing);
+               ubifs_err(c, "%lu missing orphan(s)", ci.missing);
                err = -EINVAL;
                goto out;
        }
 
                mst = mst2;
        }
 
-       ubifs_msg("recovered master node from LEB %d",
+       ubifs_msg(c, "recovered master node from LEB %d",
                  (mst == mst1 ? UBIFS_MST_LNUM : UBIFS_MST_LNUM + 1));
 
        memcpy(c->mst_node, mst, UBIFS_MST_NODE_SZ);
 out_err:
        err = -EINVAL;
 out_free:
-       ubifs_err("failed to recover master node");
+       ubifs_err(c, "failed to recover master node");
        if (mst1) {
-               ubifs_err("dumping first master node");
+               ubifs_err(c, "dumping first master node");
                ubifs_dump_node(c, mst1);
        }
        if (mst2) {
-               ubifs_err("dumping second master node");
+               ubifs_err(c, "dumping second master node");
                ubifs_dump_node(c, mst2);
        }
        vfree(buf2);
                                  ret, lnum, offs);
                        break;
                } else {
-                       ubifs_err("unexpected return value %d", ret);
+                       ubifs_err(c, "unexpected return value %d", ret);
                        err = -EINVAL;
                        goto error;
                }
                         * See header comment for this file for more
                         * explanations about the reasons we have this check.
                         */
-                       ubifs_err("corrupt empty space LEB %d:%d, corruption starts at %d",
+                       ubifs_err(c, "corrupt empty space LEB %d:%d, corruption starts at %d",
                                  lnum, offs, corruption);
                        /* Make sure we dump interesting non-0xFF data */
                        offs += corruption;
 
 corrupted_rescan:
        /* Re-scan the corrupted data with verbose messages */
-       ubifs_err("corruption %d", ret);
+       ubifs_err(c, "corruption %d", ret);
        ubifs_scan_a_node(c, buf, len, lnum, offs, 1);
 corrupted:
        ubifs_scanned_corruption(c, lnum, offs, buf);
        err = -EUCLEAN;
 error:
-       ubifs_err("LEB %d scanning failed", lnum);
+       ubifs_err(c, "LEB %d scanning failed", lnum);
        ubifs_scan_destroy(sleb);
        return ERR_PTR(err);
 }
                goto out_free;
        ret = ubifs_scan_a_node(c, cs_node, UBIFS_CS_NODE_SZ, lnum, offs, 0);
        if (ret != SCANNED_A_NODE) {
-               ubifs_err("Not a valid node");
+               ubifs_err(c, "Not a valid node");
                goto out_err;
        }
        if (cs_node->ch.node_type != UBIFS_CS_NODE) {
-               ubifs_err("Node a CS node, type is %d", cs_node->ch.node_type);
+               ubifs_err(c, "Node a CS node, type is %d", cs_node->ch.node_type);
                goto out_err;
        }
        if (le64_to_cpu(cs_node->cmt_no) != c->cmt_no) {
-               ubifs_err("CS node cmt_no %llu != current cmt_no %llu",
+               ubifs_err(c, "CS node cmt_no %llu != current cmt_no %llu",
                          (unsigned long long)le64_to_cpu(cs_node->cmt_no),
                          c->cmt_no);
                goto out_err;
 out_err:
        err = -EINVAL;
 out_free:
-       ubifs_err("failed to get CS sqnum");
+       ubifs_err(c, "failed to get CS sqnum");
        kfree(cs_node);
        return err;
 }
                                }
                        }
                        if (snod->sqnum > cs_sqnum) {
-                               ubifs_err("unrecoverable log corruption in LEB %d",
+                               ubifs_err(c, "unrecoverable log corruption in LEB %d",
                                          lnum);
                                ubifs_scan_destroy(sleb);
                                return ERR_PTR(-EUCLEAN);
                }
 
                if (ret == SCANNED_EMPTY_SPACE) {
-                       ubifs_err("unexpected empty space at %d:%d",
+                       ubifs_err(c, "unexpected empty space at %d:%d",
                                  lnum, offs);
                        return -EUCLEAN;
                }
         */
        lnum = ubifs_find_free_leb_for_idx(c);
        if (lnum < 0) {
-               ubifs_err("could not find an empty LEB");
+               ubifs_err(c, "could not find an empty LEB");
                ubifs_dump_lprops(c);
                ubifs_dump_budg(c, &c->bi);
                return lnum;
        }
        mutex_unlock(&wbuf->io_mutex);
        if (err < 0) {
-               ubifs_err("GC failed, error %d", err);
+               ubifs_err(c, "GC failed, error %d", err);
                if (err == -EAGAIN)
                        err = -EINVAL;
                return err;
        return 0;
 
 out:
-       ubifs_warn("inode %lu failed to fix size %lld -> %lld error %d",
+       ubifs_warn(c, "inode %lu failed to fix size %lld -> %lld error %d",
                   (unsigned long)e->inum, e->i_size, e->d_size, err);
        return err;
 }
 
            nlen > UBIFS_MAX_NLEN || dent->name[nlen] != 0 ||
            strnlen(dent->name, nlen) != nlen ||
            le64_to_cpu(dent->inum) > MAX_INUM) {
-               ubifs_err("bad %s node", key_type == UBIFS_DENT_KEY ?
+               ubifs_err(c, "bad %s node", key_type == UBIFS_DENT_KEY ?
                          "directory entry" : "extended attribute entry");
                return -EINVAL;
        }
 
        if (key_type != UBIFS_DENT_KEY && key_type != UBIFS_XENT_KEY) {
-               ubifs_err("bad key type %d", key_type);
+               ubifs_err(c, "bad key type %d", key_type);
                return -EINVAL;
        }
 
                cond_resched();
 
                if (snod->sqnum >= SQNUM_WATERMARK) {
-                       ubifs_err("file system's life ended");
+                       ubifs_err(c, "file system's life ended");
                        goto out_dump;
                }
 
                        if (old_size < 0 || old_size > c->max_inode_sz ||
                            new_size < 0 || new_size > c->max_inode_sz ||
                            old_size <= new_size) {
-                               ubifs_err("bad truncation node");
+                               ubifs_err(c, "bad truncation node");
                                goto out_dump;
                        }
 
                        break;
                }
                default:
-                       ubifs_err("unexpected node type %d in bud LEB %d:%d",
+                       ubifs_err(c, "unexpected node type %d in bud LEB %d:%d",
                                  snod->type, lnum, snod->offs);
                        err = -EINVAL;
                        goto out_dump;
        return err;
 
 out_dump:
-       ubifs_err("bad node is at LEB %d:%d", lnum, snod->offs);
+       ubifs_err(c, "bad node is at LEB %d:%d", lnum, snod->offs);
        ubifs_dump_node(c, snod->node);
        ubifs_scan_destroy(sleb);
        return -EINVAL;
        if (bud) {
                if (bud->jhead == jhead && bud->start <= offs)
                        return 1;
-               ubifs_err("bud at LEB %d:%d was already referred", lnum, offs);
+               ubifs_err(c, "bud at LEB %d:%d was already referred", lnum, offs);
                return -EINVAL;
        }
 
                 * numbers.
                 */
                if (snod->type != UBIFS_CS_NODE) {
-                       ubifs_err("first log node at LEB %d:%d is not CS node",
+                       ubifs_err(c, "first log node at LEB %d:%d is not CS node",
                                  lnum, offs);
                        goto out_dump;
                }
                if (le64_to_cpu(node->cmt_no) != c->cmt_no) {
-                       ubifs_err("first CS node at LEB %d:%d has wrong commit number %llu expected %llu",
+                       ubifs_err(c, "first CS node at LEB %d:%d has wrong commit number %llu expected %llu",
                                  lnum, offs,
                                  (unsigned long long)le64_to_cpu(node->cmt_no),
                                  c->cmt_no);
 
        /* Make sure the first node sits at offset zero of the LEB */
        if (snod->offs != 0) {
-               ubifs_err("first node is not at zero offset");
+               ubifs_err(c, "first node is not at zero offset");
                goto out_dump;
        }
 
                cond_resched();
 
                if (snod->sqnum >= SQNUM_WATERMARK) {
-                       ubifs_err("file system's life ended");
+                       ubifs_err(c, "file system's life ended");
                        goto out_dump;
                }
 
                if (snod->sqnum < c->cs_sqnum) {
-                       ubifs_err("bad sqnum %llu, commit sqnum %llu",
+                       ubifs_err(c, "bad sqnum %llu, commit sqnum %llu",
                                  snod->sqnum, c->cs_sqnum);
                        goto out_dump;
                }
                case UBIFS_CS_NODE:
                        /* Make sure it sits at the beginning of LEB */
                        if (snod->offs != 0) {
-                               ubifs_err("unexpected node in log");
+                               ubifs_err(c, "unexpected node in log");
                                goto out_dump;
                        }
                        break;
                default:
-                       ubifs_err("unexpected node in log");
+                       ubifs_err(c, "unexpected node in log");
                        goto out_dump;
                }
        }
        return err;
 
 out_dump:
-       ubifs_err("log error detected while replaying the log at LEB %d:%d",
+       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_scan_destroy(sleb);
                return free; /* Error code */
 
        if (c->ihead_offs != c->leb_size - free) {
-               ubifs_err("bad index head LEB %d:%d", c->ihead_lnum,
+               ubifs_err(c, "bad index head LEB %d:%d", c->ihead_lnum,
                          c->ihead_offs);
                return -EINVAL;
        }
                         * someting went wrong and we cannot proceed mounting
                         * the file-system.
                         */
-                       ubifs_err("no UBIFS nodes found at the log head LEB %d:%d, possibly corrupted",
+                       ubifs_err(c, "no UBIFS nodes found at the log head LEB %d:%d, possibly corrupted",
                                  lnum, 0);
                        err = -EINVAL;
                }
 
        if (err)
                return err;
 
-       ubifs_msg("default file-system created");
+       ubifs_msg(c, "default file-system created");
        return 0;
 }
 
        }
 
        if (le32_to_cpu(sup->min_io_size) != c->min_io_size) {
-               ubifs_err("min. I/O unit mismatch: %d in superblock, %d real",
+               ubifs_err(c, "min. I/O unit mismatch: %d in superblock, %d real",
                          le32_to_cpu(sup->min_io_size), c->min_io_size);
                goto failed;
        }
 
        if (le32_to_cpu(sup->leb_size) != c->leb_size) {
-               ubifs_err("LEB size mismatch: %d in superblock, %d real",
+               ubifs_err(c, "LEB size mismatch: %d in superblock, %d real",
                          le32_to_cpu(sup->leb_size), c->leb_size);
                goto failed;
        }
        min_leb_cnt += c->lpt_lebs + c->orph_lebs + c->jhead_cnt + 6;
 
        if (c->leb_cnt < min_leb_cnt || c->leb_cnt > c->vi.size) {
-               ubifs_err("bad LEB count: %d in superblock, %d on UBI volume, %d minimum required",
+               ubifs_err(c, "bad LEB count: %d in superblock, %d on UBI volume, %d minimum required",
                          c->leb_cnt, c->vi.size, min_leb_cnt);
                goto failed;
        }
 
        if (c->max_leb_cnt < c->leb_cnt) {
-               ubifs_err("max. LEB count %d less than LEB count %d",
+               ubifs_err(c, "max. LEB count %d less than LEB count %d",
                          c->max_leb_cnt, c->leb_cnt);
                goto failed;
        }
 
        if (c->main_lebs < UBIFS_MIN_MAIN_LEBS) {
-               ubifs_err("too few main LEBs count %d, must be at least %d",
+               ubifs_err(c, "too few main LEBs count %d, must be at least %d",
                          c->main_lebs, UBIFS_MIN_MAIN_LEBS);
                goto failed;
        }
 
        max_bytes = (long long)c->leb_size * UBIFS_MIN_BUD_LEBS;
        if (c->max_bud_bytes < max_bytes) {
-               ubifs_err("too small journal (%lld bytes), must be at least %lld bytes",
+               ubifs_err(c, "too small journal (%lld bytes), must be at least %lld bytes",
                          c->max_bud_bytes, max_bytes);
                goto failed;
        }
 
        max_bytes = (long long)c->leb_size * c->main_lebs;
        if (c->max_bud_bytes > max_bytes) {
-               ubifs_err("too large journal size (%lld bytes), only %lld bytes available in the main area",
+               ubifs_err(c, "too large journal size (%lld bytes), only %lld bytes available in the main area",
                          c->max_bud_bytes, max_bytes);
                goto failed;
        }
        return 0;
 
 failed:
-       ubifs_err("bad superblock, error %d", err);
+       ubifs_err(c, "bad superblock, error %d", err);
        ubifs_dump_node(c, sup);
        return -EINVAL;
 }
                ubifs_assert(!c->ro_media || c->ro_mount);
                if (!c->ro_mount ||
                    c->ro_compat_version > UBIFS_RO_COMPAT_VERSION) {
-                       ubifs_err("on-flash format version is w%d/r%d, but software only supports up to version w%d/r%d",
+                       ubifs_err(c, "on-flash format version is w%d/r%d, but software only supports up to version w%d/r%d",
                                  c->fmt_version, c->ro_compat_version,
                                  UBIFS_FORMAT_VERSION,
                                  UBIFS_RO_COMPAT_VERSION);
                        if (c->ro_compat_version <= UBIFS_RO_COMPAT_VERSION) {
-                               ubifs_msg("only R/O mounting is possible");
+                               ubifs_msg(c, "only R/O mounting is possible");
                                err = -EROFS;
                        } else
                                err = -EINVAL;
        }
 
        if (c->fmt_version < 3) {
-               ubifs_err("on-flash format version %d is not supported",
+               ubifs_err(c, "on-flash format version %d is not supported",
                          c->fmt_version);
                err = -EINVAL;
                goto out;
                c->key_len = UBIFS_SK_LEN;
                break;
        default:
-               ubifs_err("unsupported key format");
+               ubifs_err(c, "unsupported key format");
                err = -EINVAL;
                goto out;
        }
        ubifs_assert(c->space_fixup);
        ubifs_assert(!c->ro_mount);
 
-       ubifs_msg("start fixing up free space");
+       ubifs_msg(c, "start fixing up free space");
 
        err = fixup_free_space(c);
        if (err)
        if (err)
                return err;
 
-       ubifs_msg("free space fixup complete");
+       ubifs_msg(c, "free space fixup complete");
        return err;
 }
 
                if (pad_len < 0 ||
                    offs + node_len + pad_len > c->leb_size) {
                        if (!quiet) {
-                               ubifs_err("bad pad node at LEB %d:%d",
+                               ubifs_err(c, "bad pad node at LEB %d:%d",
                                          lnum, offs);
                                ubifs_dump_node(c, pad);
                        }
                /* Make the node pads to 8-byte boundary */
                if ((node_len + pad_len) & 7) {
                        if (!quiet)
-                               ubifs_err("bad padding length %d - %d",
+                               ubifs_err(c, "bad padding length %d - %d",
                                          offs, offs + node_len + pad_len);
                        return SCANNED_A_BAD_PAD_NODE;
                }
 
        err = ubifs_leb_read(c, lnum, sbuf + offs, offs, c->leb_size - offs, 0);
        if (err && err != -EBADMSG) {
-               ubifs_err("cannot read %d bytes from LEB %d:%d, error %d",
+               ubifs_err(c, "cannot read %d bytes from LEB %d:%d, error %d",
                          c->leb_size - offs, lnum, offs, err);
                kfree(sleb);
                return ERR_PTR(err);
 {
        int len;
 
-       ubifs_err("corruption at LEB %d:%d", lnum, offs);
+       ubifs_err(c, "corruption at LEB %d:%d", lnum, offs);
        len = c->leb_size - offs;
        if (len > 8192)
                len = 8192;
-       ubifs_err("first %d bytes from LEB %d:%d", len, lnum, offs);
+       ubifs_err(c, "first %d bytes from LEB %d:%d", len, lnum, offs);
        print_hex_dump(KERN_DEBUG, "", DUMP_PREFIX_OFFSET, 32, 4, buf, len, 1);
 }
 
 
                switch (ret) {
                case SCANNED_GARBAGE:
-                       ubifs_err("garbage");
+                       ubifs_err(c, "garbage");
                        goto corrupted;
                case SCANNED_A_NODE:
                        break;
                case SCANNED_A_CORRUPT_NODE:
                case SCANNED_A_BAD_PAD_NODE:
-                       ubifs_err("bad node");
+                       ubifs_err(c, "bad node");
                        goto corrupted;
                default:
-                       ubifs_err("unknown");
+                       ubifs_err(c, "unknown");
                        err = -EINVAL;
                        goto error;
                }
 
        if (offs % c->min_io_size) {
                if (!quiet)
-                       ubifs_err("empty space starts at non-aligned offset %d",
+                       ubifs_err(c, "empty space starts at non-aligned offset %d",
                                  offs);
                goto corrupted;
        }
        for (; len; offs++, buf++, len--)
                if (*(uint8_t *)buf != 0xff) {
                        if (!quiet)
-                               ubifs_err("corrupt empty space at LEB %d:%d",
+                               ubifs_err(c, "corrupt empty space at LEB %d:%d",
                                          lnum, offs);
                        goto corrupted;
                }
 corrupted:
        if (!quiet) {
                ubifs_scanned_corruption(c, lnum, offs, buf);
-               ubifs_err("LEB %d scanning failed", lnum);
+               ubifs_err(c, "LEB %d scanning failed", lnum);
        }
        err = -EUCLEAN;
        ubifs_scan_destroy(sleb);
        return ERR_PTR(err);
 
 error:
-       ubifs_err("LEB %d scanning failed, error %d", lnum, err);
+       ubifs_err(c, "LEB %d scanning failed, error %d", lnum, err);
        ubifs_scan_destroy(sleb);
        return ERR_PTR(err);
 }
 
        const struct ubifs_inode *ui = ubifs_inode(inode);
 
        if (inode->i_size > c->max_inode_sz) {
-               ubifs_err("inode is too large (%lld)",
+               ubifs_err(c, "inode is too large (%lld)",
                          (long long)inode->i_size);
                return 1;
        }
 
        if (ui->compr_type >= UBIFS_COMPR_TYPES_CNT) {
-               ubifs_err("unknown compression type %d", ui->compr_type);
+               ubifs_err(c, "unknown compression type %d", ui->compr_type);
                return 2;
        }
 
                return 5;
 
        if (!ubifs_compr_present(ui->compr_type)) {
-               ubifs_warn("inode %lu uses '%s' compression, but it was not compiled in",
+               ubifs_warn(c, "inode %lu uses '%s' compression, but it was not compiled in",
                           inode->i_ino, ubifs_compr_name(ui->compr_type));
        }
 
        return inode;
 
 out_invalid:
-       ubifs_err("inode %lu validation failed, error %d", inode->i_ino, err);
+       ubifs_err(c, "inode %lu validation failed, error %d", inode->i_ino, err);
        ubifs_dump_node(c, ino);
        ubifs_dump_inode(c, inode);
        err = -EINVAL;
 out_ino:
        kfree(ino);
 out:
-       ubifs_err("failed to read inode %lu, error %d", inode->i_ino, err);
+       ubifs_err(c, "failed to read inode %lu, error %d", inode->i_ino, err);
        iget_failed(inode);
        return ERR_PTR(err);
 }
        if (inode->i_nlink) {
                err = ubifs_jnl_write_inode(c, inode);
                if (err)
-                       ubifs_err("can't write inode %lu, error %d",
+                       ubifs_err(c, "can't write inode %lu, error %d",
                                  inode->i_ino, err);
                else
                        err = dbg_check_inode_size(c, inode, ui->ui_size);
                 * Worst case we have a lost orphan inode wasting space, so a
                 * simple error message is OK here.
                 */
-               ubifs_err("can't delete inode %lu, error %d",
+               ubifs_err(c, "can't delete inode %lu, error %d",
                          inode->i_ino, err);
 
 out:
 static int init_constants_early(struct ubifs_info *c)
 {
        if (c->vi.corrupted) {
-               ubifs_warn("UBI volume is corrupted - read-only mode");
+               ubifs_warn(c, "UBI volume is corrupted - read-only mode");
                c->ro_media = 1;
        }
 
        if (c->di.ro_mode) {
-               ubifs_msg("read-only UBI device");
+               ubifs_msg(c, "read-only UBI device");
                c->ro_media = 1;
        }
 
        if (c->vi.vol_type == UBI_STATIC_VOLUME) {
-               ubifs_msg("static UBI volume - read-only mode");
+               ubifs_msg(c, "static UBI volume - read-only mode");
                c->ro_media = 1;
        }
 
        c->max_write_shift = fls(c->max_write_size) - 1;
 
        if (c->leb_size < UBIFS_MIN_LEB_SZ) {
-               ubifs_err("too small LEBs (%d bytes), min. is %d bytes",
+               ubifs_err(c, "too small LEBs (%d bytes), min. is %d bytes",
                          c->leb_size, UBIFS_MIN_LEB_SZ);
                return -EINVAL;
        }
 
        if (c->leb_cnt < UBIFS_MIN_LEB_CNT) {
-               ubifs_err("too few LEBs (%d), min. is %d",
+               ubifs_err(c, "too few LEBs (%d), min. is %d",
                          c->leb_cnt, UBIFS_MIN_LEB_CNT);
                return -EINVAL;
        }
 
        if (!is_power_of_2(c->min_io_size)) {
-               ubifs_err("bad min. I/O size %d", c->min_io_size);
+               ubifs_err(c, "bad min. I/O size %d", c->min_io_size);
                return -EINVAL;
        }
 
        if (c->max_write_size < c->min_io_size ||
            c->max_write_size % c->min_io_size ||
            !is_power_of_2(c->max_write_size)) {
-               ubifs_err("bad write buffer size %d for %d min. I/O unit",
+               ubifs_err(c, "bad write buffer size %d for %d min. I/O unit",
                          c->max_write_size, c->min_io_size);
                return -EINVAL;
        }
        tmp = UBIFS_CS_NODE_SZ + UBIFS_REF_NODE_SZ * c->jhead_cnt;
        tmp = ALIGN(tmp, c->min_io_size);
        if (tmp > c->leb_size) {
-               ubifs_err("too small LEB size %d, at least %d needed",
+               ubifs_err(c, "too small LEB size %d, at least %d needed",
                          c->leb_size, tmp);
                return -EINVAL;
        }
        tmp /= c->leb_size;
        tmp += 1;
        if (c->log_lebs < tmp) {
-               ubifs_err("too small log %d LEBs, required min. %d LEBs",
+               ubifs_err(c, "too small log %d LEBs, required min. %d LEBs",
                          c->log_lebs, tmp);
                return -EINVAL;
        }
        int err;
 
        if (c->gc_lnum == -1) {
-               ubifs_err("no LEB for GC");
+               ubifs_err(c, "no LEB for GC");
                return -EINVAL;
        }
 
                orph = list_entry(c->orph_list.next, struct ubifs_orphan, list);
                list_del(&orph->list);
                kfree(orph);
-               ubifs_err("orphan list not empty at unmount");
+               ubifs_err(c, "orphan list not empty at unmount");
        }
 
        vfree(c->orph_buf);
  */
 static int parse_standard_option(const char *option)
 {
-       ubifs_msg("parse %s", option);
+
+       pr_notice("UBIFS: parse %s\n", option);
        if (!strcmp(option, "sync"))
                return MS_SYNCHRONOUS;
        return 0;
                        else if (!strcmp(name, "zlib"))
                                c->mount_opts.compr_type = UBIFS_COMPR_ZLIB;
                        else {
-                               ubifs_err("unknown compressor \"%s\"", name);
+                               ubifs_err(c, "unknown compressor \"%s\"", name); //FIXME: is c ready?
                                kfree(name);
                                return -EINVAL;
                        }
 
                        flag = parse_standard_option(p);
                        if (!flag) {
-                               ubifs_err("unrecognized mount option \"%s\" or missing value",
+                               ubifs_err(c, "unrecognized mount option \"%s\" or missing value",
                                          p);
                                return -EINVAL;
                        }
                }
 
                /* Just disable bulk-read */
-               ubifs_warn("cannot allocate %d bytes of memory for bulk-read, disabling it",
+               ubifs_warn(c, "cannot allocate %d bytes of memory for bulk-read, disabling it",
                           c->max_bu_buf_len);
                c->mount_opts.bulk_read = 1;
                c->bulk_read = 0;
 {
        ubifs_assert(c->dark_wm > 0);
        if (c->lst.total_free + c->lst.total_dirty < c->dark_wm) {
-               ubifs_err("insufficient free space to mount in R/W mode");
+               ubifs_err(c, "insufficient free space to mount in R/W mode");
                ubifs_dump_budg(c, &c->bi);
                ubifs_dump_lprops(c);
                return -ENOSPC;
                 * This UBI volume is empty, and read-only, or the file system
                 * is mounted read-only - we cannot format it.
                 */
-               ubifs_err("can't format empty UBI volume: read-only %s",
+               ubifs_err(c, "can't format empty UBI volume: read-only %s",
                          c->ro_media ? "UBI volume" : "mount");
                err = -EROFS;
                goto out_free;
        }
 
        if (c->ro_media && !c->ro_mount) {
-               ubifs_err("cannot mount read-write - read-only media");
+               ubifs_err(c, "cannot mount read-write - read-only media");
                err = -EROFS;
                goto out_free;
        }
         * or overridden by mount options is actually compiled in.
         */
        if (!ubifs_compr_present(c->default_compr)) {
-               ubifs_err("'compressor \"%s\" is not compiled in",
+               ubifs_err(c, "'compressor \"%s\" is not compiled in",
                          ubifs_compr_name(c->default_compr));
                err = -ENOTSUPP;
                goto out_free;
                if (IS_ERR(c->bgt)) {
                        err = PTR_ERR(c->bgt);
                        c->bgt = NULL;
-                       ubifs_err("cannot spawn \"%s\", error %d",
+                       ubifs_err(c, "cannot spawn \"%s\", error %d",
                                  c->bgt_name, err);
                        goto out_wbufs;
                }
        init_constants_master(c);
 
        if ((c->mst_node->flags & cpu_to_le32(UBIFS_MST_DIRTY)) != 0) {
-               ubifs_msg("recovery needed");
+               ubifs_msg(c, "recovery needed");
                c->need_recovery = 1;
        }
 
 
        if (c->need_recovery) {
                if (c->ro_mount)
-                       ubifs_msg("recovery deferred");
+                       ubifs_msg(c, "recovery deferred");
                else {
                        c->need_recovery = 0;
-                       ubifs_msg("recovery completed");
+                       ubifs_msg(c, "recovery completed");
                        /*
                         * GC LEB has to be empty and taken at this point. But
                         * the journal head LEBs may also be accounted as
 
        c->mounting = 0;
 
-       ubifs_msg("mounted UBI device %d, volume %d, name \"%s\"%s",
+       ubifs_msg(c, "UBIFS: mounted UBI device %d, volume %d, name \"%s\"%s",
                  c->vi.ubi_num, c->vi.vol_id, c->vi.name,
                  c->ro_mount ? ", R/O mode" : "");
        x = (long long)c->main_lebs * c->leb_size;
        y = (long long)c->log_lebs * c->leb_size + c->max_bud_bytes;
-       ubifs_msg("LEB size: %d bytes (%d KiB), min./max. I/O unit sizes: %d bytes/%d bytes",
+       ubifs_msg(c, "LEB size: %d bytes (%d KiB), min./max. I/O unit sizes: %d bytes/%d bytes",
                  c->leb_size, c->leb_size >> 10, c->min_io_size,
                  c->max_write_size);
-       ubifs_msg("FS size: %lld bytes (%lld MiB, %d LEBs), journal size %lld bytes (%lld MiB, %d LEBs)",
+       ubifs_msg(c, "FS size: %lld bytes (%lld MiB, %d LEBs), journal size %lld bytes (%lld MiB, %d LEBs)",
                  x, x >> 20, c->main_lebs,
                  y, y >> 20, c->log_lebs + c->max_bud_cnt);
-       ubifs_msg("reserved for root: %llu bytes (%llu KiB)",
+       ubifs_msg(c, "reserved for root: %llu bytes (%llu KiB)",
                  c->report_rp_size, c->report_rp_size >> 10);
-       ubifs_msg("media format: w%d/r%d (latest is w%d/r%d), UUID %pUB%s",
+       ubifs_msg(c, "media format: w%d/r%d (latest is w%d/r%d), UUID %pUB%s",
                  c->fmt_version, c->ro_compat_version,
                  UBIFS_FORMAT_VERSION, UBIFS_RO_COMPAT_VERSION, c->uuid,
                  c->big_lpt ? ", big LPT model" : ", small LPT model");
        int err, lnum;
 
        if (c->rw_incompat) {
-               ubifs_err("the file-system is not R/W-compatible");
-               ubifs_msg("on-flash format version is w%d/r%d, but software only supports up to version w%d/r%d",
+               ubifs_err(c, "the file-system is not R/W-compatible");
+               ubifs_msg(c, "on-flash format version is w%d/r%d, but software only supports up to version w%d/r%d",
                          c->fmt_version, c->ro_compat_version,
                          UBIFS_FORMAT_VERSION, UBIFS_RO_COMPAT_VERSION);
                return -EROFS;
        }
 
        if (c->need_recovery) {
-               ubifs_msg("completing deferred recovery");
+               ubifs_msg(c, "completing deferred recovery");
                err = ubifs_write_rcvrd_mst_node(c);
                if (err)
                        goto out;
        if (IS_ERR(c->bgt)) {
                err = PTR_ERR(c->bgt);
                c->bgt = NULL;
-               ubifs_err("cannot spawn \"%s\", error %d",
+               ubifs_err(c, "cannot spawn \"%s\", error %d",
                          c->bgt_name, err);
                goto out;
        }
 
        if (c->need_recovery) {
                c->need_recovery = 0;
-               ubifs_msg("deferred recovery completed");
+               ubifs_msg(c, "deferred recovery completed");
        } else {
                /*
                 * Do not run the debugging space check if the were doing
        int i;
        struct ubifs_info *c = sb->s_fs_info;
 
-       ubifs_msg("un-mount UBI device %d, volume %d", c->vi.ubi_num,
-                 c->vi.vol_id);
+       ubifs_msg(c, "un-mount UBI device %d", c->vi.ubi_num);
 
        /*
         * The following asserts are only valid if there has not been a failure
                                 * next mount, so we just print a message and
                                 * continue to unmount normally.
                                 */
-                               ubifs_err("failed to write master node, error %d",
+                               ubifs_err(c, "failed to write master node, error %d",
                                          err);
                } else {
                        for (i = 0; i < c->jhead_cnt; i++)
 
        err = ubifs_parse_options(c, data, 1);
        if (err) {
-               ubifs_err("invalid or unknown remount parameter");
+               ubifs_err(c, "invalid or unknown remount parameter");
                return err;
        }
 
        if (c->ro_mount && !(*flags & MS_RDONLY)) {
                if (c->ro_error) {
-                       ubifs_msg("cannot re-mount R/W due to prior errors");
+                       ubifs_msg(c, "cannot re-mount R/W due to prior errors");
                        return -EROFS;
                }
                if (c->ro_media) {
-                       ubifs_msg("cannot re-mount R/W - UBI volume is R/O");
+                       ubifs_msg(c, "cannot re-mount R/W - UBI volume is R/O");
                        return -EROFS;
                }
                err = ubifs_remount_rw(c);
                        return err;
        } else if (!c->ro_mount && (*flags & MS_RDONLY)) {
                if (c->ro_error) {
-                       ubifs_msg("cannot re-mount R/O due to prior errors");
+                       ubifs_msg(c, "cannot re-mount R/O due to prior errors");
                        return -EROFS;
                }
                ubifs_remount_ro(c);
         */
        ubi = open_ubi(name, UBI_READONLY);
        if (IS_ERR(ubi)) {
-               ubifs_err("cannot open \"%s\", error %d",
-                         name, (int)PTR_ERR(ubi));
+               pr_err("UBIFS error (pid: %d): cannot open \"%s\", error %d",
+                      current->pid, name, (int)PTR_ERR(ubi));
                return ERR_CAST(ubi);
        }
 
         * UBIFS_BLOCK_SIZE. It is assumed that both are powers of 2.
         */
        if (PAGE_CACHE_SIZE < UBIFS_BLOCK_SIZE) {
-               ubifs_err("VFS page cache size is %u bytes, but UBIFS requires at least 4096 bytes",
-                         (unsigned int)PAGE_CACHE_SIZE);
+               pr_err("UBIFS error (pid %d): VFS page cache size is %u bytes, but UBIFS requires at least 4096 bytes",
+                      current->pid, (unsigned int)PAGE_CACHE_SIZE);
                return -EINVAL;
        }
 
 
        err = register_filesystem(&ubifs_fs_type);
        if (err) {
-               ubifs_err("cannot register file system, error %d", err);
+               pr_err("UBIFS error (pid %d): cannot register file system, error %d",
+                      current->pid, err);
                goto out_dbg;
        }
        return 0;
 
                else if (offs > o->offs)
                        p = &(*p)->rb_right;
                else {
-                       ubifs_err("old idx added twice!");
+                       ubifs_err(c, "old idx added twice!");
                        kfree(old_idx);
                        return 0;
                }
 
        err = ubifs_leb_read(c, lnum, buf, offs, len, 1);
        if (err) {
-               ubifs_err("cannot read node type %d from LEB %d:%d, error %d",
+               ubifs_err(c, "cannot read node type %d from LEB %d:%d, error %d",
                          type, lnum, offs, err);
                return err;
        }
        int err, len;
 
        if (ch->node_type != UBIFS_DATA_NODE) {
-               ubifs_err("bad node type (%d but expected %d)",
+               ubifs_err(c, "bad node type (%d but expected %d)",
                          ch->node_type, UBIFS_DATA_NODE);
                goto out_err;
        }
 
        err = ubifs_check_node(c, buf, zbr->lnum, zbr->offs, 0, 0);
        if (err) {
-               ubifs_err("expected node type %d", UBIFS_DATA_NODE);
+               ubifs_err(c, "expected node type %d", UBIFS_DATA_NODE);
                goto out;
        }
 
        len = le32_to_cpu(ch->len);
        if (len != zbr->len) {
-               ubifs_err("bad node length %d, expected %d", len, zbr->len);
+               ubifs_err(c, "bad node length %d, expected %d", len, zbr->len);
                goto out_err;
        }
 
        /* Make sure the key of the read node is correct */
        key_read(c, buf + UBIFS_KEY_OFFSET, &key1);
        if (!keys_eq(c, &zbr->key, &key1)) {
-               ubifs_err("bad key in node at LEB %d:%d",
+               ubifs_err(c, "bad key in node at LEB %d:%d",
                          zbr->lnum, zbr->offs);
                dbg_tnck(&zbr->key, "looked for key ");
                dbg_tnck(&key1, "found node's key ");
 out_err:
        err = -EINVAL;
 out:
-       ubifs_err("bad node at LEB %d:%d", zbr->lnum, zbr->offs);
+       ubifs_err(c, "bad node at LEB %d:%d", zbr->lnum, zbr->offs);
        ubifs_dump_node(c, buf);
        dump_stack();
        return err;
        len = bu->zbranch[bu->cnt - 1].offs;
        len += bu->zbranch[bu->cnt - 1].len - offs;
        if (len > bu->buf_len) {
-               ubifs_err("buffer too small %d vs %d", bu->buf_len, len);
+               ubifs_err(c, "buffer too small %d vs %d", bu->buf_len, len);
                return -EINVAL;
        }
 
                return -EAGAIN;
 
        if (err && err != -EBADMSG) {
-               ubifs_err("failed to read from LEB %d:%d, error %d",
+               ubifs_err(c, "failed to read from LEB %d:%d, error %d",
                          lnum, offs, err);
                dump_stack();
                dbg_tnck(&bu->key, "key ");
 
 out_dump:
        block = key_block(c, key);
-       ubifs_err("inode %lu has size %lld, but there are data at offset %lld",
+       ubifs_err(c, "inode %lu has size %lld, but there are data at offset %lld",
                  (unsigned long)inode->i_ino, size,
                  ((loff_t)block) << UBIFS_BLOCK_SHIFT);
        mutex_unlock(&c->tnc_mutex);
 
                br->offs = cpu_to_le32(zbr->offs);
                br->len = cpu_to_le32(zbr->len);
                if (!zbr->lnum || !zbr->len) {
-                       ubifs_err("bad ref in znode");
+                       ubifs_err(c, "bad ref in znode");
                        ubifs_dump_znode(c, znode);
                        if (zbr->znode)
                                ubifs_dump_znode(c, zbr->znode);
                                 * Do not print scary warnings if the debugging
                                 * option which forces in-the-gaps is enabled.
                                 */
-                               ubifs_warn("out of space");
+                               ubifs_warn(c, "out of space");
                                ubifs_dump_budg(c, &c->bi);
                                ubifs_dump_lprops(c);
                        }
                /* Determine the index node position */
                if (lnum == -1) {
                        if (c->ileb_nxt >= c->ileb_cnt) {
-                               ubifs_err("out of space");
+                               ubifs_err(c, "out of space");
                                return -ENOSPC;
                        }
                        lnum = c->ilebs[c->ileb_nxt++];
                        br->offs = cpu_to_le32(zbr->offs);
                        br->len = cpu_to_le32(zbr->len);
                        if (!zbr->lnum || !zbr->len) {
-                               ubifs_err("bad ref in znode");
+                               ubifs_err(c, "bad ref in znode");
                                ubifs_dump_znode(c, znode);
                                if (zbr->znode)
                                        ubifs_dump_znode(c, zbr->znode);
 
                if (lnum != znode->lnum || offs != znode->offs ||
                    len != znode->len) {
-                       ubifs_err("inconsistent znode posn");
+                       ubifs_err(c, "inconsistent znode posn");
                        return -EINVAL;
                }
 
 
        if (lnum != c->dbg->new_ihead_lnum ||
            buf_offs != c->dbg->new_ihead_offs) {
-               ubifs_err("inconsistent ihead");
+               ubifs_err(c, "inconsistent ihead");
                return -EINVAL;
        }
 
 
                lnum, offs, znode->level, znode->child_cnt);
 
        if (znode->child_cnt > c->fanout || znode->level > UBIFS_MAX_LEVELS) {
-               ubifs_err("current fanout %d, branch count %d",
+               ubifs_err(c, "current fanout %d, branch count %d",
                          c->fanout, znode->child_cnt);
-               ubifs_err("max levels %d, znode level %d",
+               ubifs_err(c, "max levels %d, znode level %d",
                          UBIFS_MAX_LEVELS, znode->level);
                err = 1;
                goto out_dump;
                if (zbr->lnum < c->main_first ||
                    zbr->lnum >= c->leb_cnt || zbr->offs < 0 ||
                    zbr->offs + zbr->len > c->leb_size || zbr->offs & 7) {
-                       ubifs_err("bad branch %d", i);
+                       ubifs_err(c, "bad branch %d", i);
                        err = 2;
                        goto out_dump;
                }
                case UBIFS_XENT_KEY:
                        break;
                default:
-                       ubifs_err("bad key type at slot %d: %d",
+                       ubifs_err(c, "bad key type at slot %d: %d",
                                  i, key_type(c, &zbr->key));
                        err = 3;
                        goto out_dump;
                type = key_type(c, &zbr->key);
                if (c->ranges[type].max_len == 0) {
                        if (zbr->len != c->ranges[type].len) {
-                               ubifs_err("bad target node (type %d) length (%d)",
+                               ubifs_err(c, "bad target node (type %d) length (%d)",
                                          type, zbr->len);
-                               ubifs_err("have to be %d", c->ranges[type].len);
+                               ubifs_err(c, "have to be %d", c->ranges[type].len);
                                err = 4;
                                goto out_dump;
                        }
                } else if (zbr->len < c->ranges[type].min_len ||
                           zbr->len > c->ranges[type].max_len) {
-                       ubifs_err("bad target node (type %d) length (%d)",
+                       ubifs_err(c, "bad target node (type %d) length (%d)",
                                  type, zbr->len);
-                       ubifs_err("have to be in range of %d-%d",
+                       ubifs_err(c, "have to be in range of %d-%d",
                                  c->ranges[type].min_len,
                                  c->ranges[type].max_len);
                        err = 5;
 
                cmp = keys_cmp(c, key1, key2);
                if (cmp > 0) {
-                       ubifs_err("bad key order (keys %d and %d)", i, i + 1);
+                       ubifs_err(c, "bad key order (keys %d and %d)", i, i + 1);
                        err = 6;
                        goto out_dump;
                } else if (cmp == 0 && !is_hash_key(c, key1)) {
                        /* These can only be keys with colliding hash */
-                       ubifs_err("keys %d and %d are not hashed but equivalent",
+                       ubifs_err(c, "keys %d and %d are not hashed but equivalent",
                                  i, i + 1);
                        err = 7;
                        goto out_dump;
        return 0;
 
 out_dump:
-       ubifs_err("bad indexing node at LEB %d:%d, error %d", lnum, offs, err);
+       ubifs_err(c, "bad indexing node at LEB %d:%d, error %d", lnum, offs, err);
        ubifs_dump_node(c, idx);
        kfree(idx);
        return -EINVAL;
        /* Make sure the key of the read node is correct */
        key_read(c, node + UBIFS_KEY_OFFSET, &key1);
        if (!keys_eq(c, key, &key1)) {
-               ubifs_err("bad key in node at LEB %d:%d",
+               ubifs_err(c, "bad key in node at LEB %d:%d",
                          zbr->lnum, zbr->offs);
                dbg_tnck(key, "looked for key ");
                dbg_tnck(&key1, "but found node's key ");
 
 #define UBIFS_VERSION 1
 
 /* Normal UBIFS messages */
-#define ubifs_msg(fmt, ...) pr_notice("UBIFS: " fmt "\n", ##__VA_ARGS__)
+#define ubifs_msg(c, fmt, ...)                                      \
+       pr_notice("UBIFS (ubi%d:%d): " fmt "\n",                    \
+                 (c)->vi.ubi_num, (c)->vi.vol_id, ##__VA_ARGS__)
 /* UBIFS error messages */
-#define ubifs_err(fmt, ...)                                         \
-       pr_err("UBIFS error (pid %d): %s: " fmt "\n", current->pid, \
+#define ubifs_err(c, fmt, ...)                                      \
+       pr_err("UBIFS error (ubi%d:%d pid %d): %s: " fmt "\n",      \
+              (c)->vi.ubi_num, (c)->vi.vol_id, current->pid,       \
               __func__, ##__VA_ARGS__)
 /* UBIFS warning messages */
-#define ubifs_warn(fmt, ...)                                        \
-       pr_warn("UBIFS warning (pid %d): %s: " fmt "\n",            \
-               current->pid, __func__, ##__VA_ARGS__)
+#define ubifs_warn(c, fmt, ...)                                     \
+       pr_warn("UBIFS warning (ubi%d:%d pid %d): %s: " fmt "\n",   \
+               (c)->vi.ubi_num, (c)->vi.vol_id, current->pid,      \
+               __func__, ##__VA_ARGS__)
 /*
  * A variant of 'ubifs_err()' which takes the UBIFS file-sytem description
  * object as an argument.
 #define ubifs_errc(c, fmt, ...)                                     \
        do {                                                        \
                if (!(c)->probing)                                  \
-                       ubifs_err(fmt, ##__VA_ARGS__);              \
+                       ubifs_err(c, fmt, ##__VA_ARGS__);           \
        } while (0)
 
 /* UBIFS file system VFS magic number */
 /* compressor.c */
 int __init ubifs_compressors_init(void);
 void ubifs_compressors_exit(void);
-void ubifs_compress(const void *in_buf, int in_len, void *out_buf, int *out_len,
-                   int *compr_type);
-int ubifs_decompress(const void *buf, int len, void *out, int *out_len,
-                    int compr_type);
+void ubifs_compress(const struct ubifs_info *c, const void *in_buf, int in_len,
+                   void *out_buf, int *out_len, int *compr_type);
+int ubifs_decompress(const struct ubifs_info *c, const void *buf, int len,
+                    void *out, int *out_len, int compr_type);
 
 #include "debug.h"
 #include "misc.h"
 
                                .dirtied_ino_d = ALIGN(host_ui->data_len, 8) };
 
        if (host_ui->xattr_cnt >= MAX_XATTRS_PER_INODE) {
-               ubifs_err("inode %lu already has too many xattrs (%d), cannot create more",
+               ubifs_err(c, "inode %lu already has too many xattrs (%d), cannot create more",
                          host->i_ino, host_ui->xattr_cnt);
                return -ENOSPC;
        }
         */
        names_len = host_ui->xattr_names + host_ui->xattr_cnt + nm->len + 1;
        if (names_len > XATTR_LIST_MAX) {
-               ubifs_err("cannot add one more xattr name to inode %lu, total names length would become %d, max. is %d",
+               ubifs_err(c, "cannot add one more xattr name to inode %lu, total names length would become %d, max. is %d",
                          host->i_ino, names_len, XATTR_LIST_MAX);
                return -ENOSPC;
        }
 
        inode = ubifs_iget(c->vfs_sb, inum);
        if (IS_ERR(inode)) {
-               ubifs_err("dead extended attribute entry, error %d",
+               ubifs_err(c, "dead extended attribute entry, error %d",
                          (int)PTR_ERR(inode));
                return inode;
        }
        if (ubifs_inode(inode)->xattr)
                return inode;
-       ubifs_err("corrupt extended attribute entry");
+       ubifs_err(c, "corrupt extended attribute entry");
        iput(inode);
        return ERR_PTR(-EINVAL);
 }
        if (buf) {
                /* If @buf is %NULL we are supposed to return the length */
                if (ui->data_len > size) {
-                       ubifs_err("buffer size %zd, xattr len %d",
+                       ubifs_err(c, "buffer size %zd, xattr len %d",
                                  size, ui->data_len);
                        err = -ERANGE;
                        goto out_iput;
 
        kfree(pxent);
        if (err != -ENOENT) {
-               ubifs_err("cannot find next direntry, error %d", err);
+               ubifs_err(c, "cannot find next direntry, error %d", err);
                return err;
        }
 
                                           &init_xattrs, 0);
        mutex_unlock(&inode->i_mutex);
 
-       if (err)
-               ubifs_err("cannot initialize security for inode %lu, error %d",
+       if (err) {
+               struct ubifs_info *c = dentry->i_sb->s_fs_info;
+               ubifs_err(c, "cannot initialize security for inode %lu, error %d",
                          inode->i_ino, err);
+       }
        return err;
 }