30 #include <linux/module.h>
34 #include <linux/random.h>
39 static const char *get_key_fmt(
int fmt)
45 return "unknown/invalid format";
49 static const char *get_key_hash(
int hash)
57 return "unknown/invalid name hash";
61 static const char *get_key_type(
int type)
75 return "unknown/invalid key";
79 static const char *get_dent_type(
int type)
97 return "unknown/invalid type";
105 int type = key_type(c, key);
110 len -=
snprintf(p, len,
"(%lu, %s)",
111 (
unsigned long)key_inum(c, key),
116 len -=
snprintf(p, len,
"(%lu, %s, %#08x)",
117 (
unsigned long)key_inum(c, key),
118 get_key_type(type), key_hash(c, key));
121 len -=
snprintf(p, len,
"(%lu, %s, %u)",
122 (
unsigned long)key_inum(c, key),
123 get_key_type(type), key_block(c, key));
126 len -=
snprintf(p, len,
"(%lu, %s)",
127 (
unsigned long)key_inum(c, key),
131 len -=
snprintf(p, len,
"(bad key type: %#08x, %#08x)",
132 key->
u32[0], key->
u32[1]);
144 return "padding node";
146 return "superblock node";
148 return "master node";
150 return "reference node";
154 return "direntry node";
156 return "xentry node";
160 return "truncate node";
162 return "indexing node";
164 return "commit start node";
166 return "orphan node";
168 return "unknown node";
172 static const char *dbg_gtype(
int type)
176 return "no node group";
178 return "in node group";
180 return "last of node group";
190 return "commit resting";
192 return "background commit requested";
194 return "commit required";
196 return "BACKGROUND commit running";
198 return "commit running and required";
200 return "broken commit";
202 return "unknown commit state";
216 return "unknown journal head";
220 static void dump_ch(
const struct ubifs_ch *ch)
241 pr_err(
"Dump in-memory inode:");
244 (
unsigned long long)i_size_read(inode));
246 pr_err(
"\tuid %u\n", (
unsigned int)i_uid_read(inode));
247 pr_err(
"\tgid %u\n", (
unsigned int)i_gid_read(inode));
249 (
unsigned int)inode->
i_atime.tv_sec,
250 (
unsigned int)inode->
i_atime.tv_nsec);
252 (
unsigned int)inode->
i_mtime.tv_sec,
253 (
unsigned int)inode->
i_mtime.tv_nsec);
255 (
unsigned int)inode->
i_ctime.tv_sec,
256 (
unsigned int)inode->
i_ctime.tv_nsec);
264 pr_err(
"\tsynced_i_size %llu\n",
266 pr_err(
"\tui_size %llu\n",
267 (
unsigned long long)ui->
ui_size);
277 pr_err(
"List of directory entries:\n");
280 lowest_dent_key(c, &key, inode->
i_ino);
284 if (PTR_ERR(dent) != -
ENOENT)
285 pr_err(
"error %ld\n", PTR_ERR(dent));
290 count++, dent->
name, get_dent_type(dent->
type));
296 key_read(c, &dent->
key, &key);
316 spin_lock(&dbg_lock);
332 pr_err(
"\tkey_hash %d (%s)\n",
334 pr_err(
"\tkey_fmt %d (%s)\n",
336 pr_err(
"\tflags %#x\n", sup_flags);
339 pr_err(
"\t space_fixup %u\n",
345 pr_err(
"\tmax_bud_bytes %llu\n",
353 pr_err(
"\tdefault_compr %u\n",
355 pr_err(
"\trp_size %llu\n",
368 pr_err(
"\thighest_inum %llu\n",
370 pr_err(
"\tcommit number %llu\n",
380 pr_err(
"\tindex_size %llu\n",
394 pr_err(
"\ttotal_free %llu\n",
396 pr_err(
"\ttotal_dirty %llu\n",
398 pr_err(
"\ttotal_used %llu\n",
400 pr_err(
"\ttotal_dead %llu\n",
402 pr_err(
"\ttotal_dark %llu\n",
419 key_read(c, &ino->
key, &key);
422 pr_err(
"\tcreat_sqnum %llu\n",
427 pr_err(
"\tatime %lld.%u\n",
430 pr_err(
"\tmtime %lld.%u\n",
433 pr_err(
"\tctime %lld.%u\n",
443 pr_err(
"\tcompr_type %#x\n",
454 key_read(c, &dent->
key, &key);
460 pr_err(
"\tnlen %d\n", nlen);
464 pr_err(
"(bad name length, not printing, bad or corrupted node)");
466 for (i = 0; i < nlen && dent->
name[
i]; i++)
478 key_read(c, &dn->
key, &key);
482 pr_err(
"\tcompr_typ %d\n",
484 pr_err(
"\tdata size %d\n", dlen);
487 (
void *)&dn->
data, dlen, 0);
495 pr_err(
"\told_size %llu\n",
497 pr_err(
"\tnew_size %llu\n",
506 pr_err(
"\tchild_cnt %d\n", n);
510 for (i = 0; i < n && i < c->
fanout - 1; i++) {
513 br = ubifs_idx_branch(c, idx, i);
514 key_read(c, &br->
key, &key);
515 pr_err(
"\t%d: LEB %d:%d len %d key %s\n",
529 pr_err(
"\tcommit number %llu\n",
532 pr_err(
"\tlast node flag %llu\n",
535 pr_err(
"\t%d orphan inode numbers:\n", n);
536 for (i = 0; i <
n; i++)
542 pr_err(
"node type %d was not recognized\n",
545 spin_unlock(&dbg_lock);
550 spin_lock(&dbg_lock);
551 pr_err(
"Budgeting request: new_ino %d, dirtied_ino %d\n",
553 pr_err(
"\tnew_ino_d %d, dirtied_ino_d %d\n",
555 pr_err(
"\tnew_page %d, dirtied_page %d\n",
557 pr_err(
"\tnew_dent %d, mod_dent %d\n",
560 pr_err(
"\tdata_growth %d dd_growth %d\n",
562 spin_unlock(&dbg_lock);
567 spin_lock(&dbg_lock);
568 pr_err(
"(pid %d) Lprops statistics: empty_lebs %d, idx_lebs %d\n",
570 pr_err(
"\ttaken_empty_lebs %d, total_free %lld, total_dirty %lld\n",
572 pr_err(
"\ttotal_used %lld, total_dark %lld, total_dead %lld\n",
574 spin_unlock(&dbg_lock);
586 spin_lock(&dbg_lock);
587 pr_err(
"(pid %d) Budgeting info: data budget sum %lld, total budget sum %lld\n",
590 pr_err(
"\tbudg_data_growth %lld, budg_dd_growth %lld, budg_idx_growth %lld\n",
592 pr_err(
"\tmin_idx_lebs %d, old_idx_sz %llu, uncommitted_idx %lld\n",
594 pr_err(
"\tpage_budget %d, inode_budget %d, dent_budget %d\n",
597 pr_err(
"\tdark_wm %d, dead_wm %d, max_idx_node_sz %d\n",
608 pr_err(
"\tfreeable_cnt %d, calc_idx_sz %lld, idx_gc_cnt %d\n",
610 pr_err(
"\tdirty_pg_cnt %ld, dirty_zn_cnt %ld, clean_zn_cnt %ld\n",
619 pr_err(
"\tjhead %s\t LEB %d\n",
629 pr_err(
"\tGC'ed idx LEB %d unmap %d\n",
635 outstanding = c->
bi.data_growth + c->
bi.dd_growth;
637 pr_err(
"Budgeting predictions:\n");
638 pr_err(
"\tavailable: %lld, outstanding %lld, free %lld\n",
639 available, outstanding, free);
641 spin_unlock(&dbg_lock);
652 if (spc < c->dead_wm)
658 pr_err(
"LEB %-7d free %-8d dirty %-8d used %-8d free + dirty %-8d flags %#x (",
662 pr_err(
"LEB %-7d free %-8d dirty %-8d used %-8d free + dirty %-8d dark %-4d dead %-4d nodes fit %-3d flags %#-4x (",
680 s =
"freeable index";
688 s =
"not categorized";
742 pr_err(
"(pid %d) start dumping LEB properties\n",
current->pid);
746 for (lnum = c->
main_first; lnum < c->leb_cnt; lnum++) {
749 ubifs_err(
"cannot read lprops for LEB %d", lnum);
753 pr_err(
"(pid %d) finish dumping LEB properties\n",
current->pid);
760 spin_lock(&dbg_lock);
781 pr_err(
"\tLPT head is at %d:%d\n",
785 pr_err(
"\tLPT lsave is at %d:%d\n",
788 pr_err(
"\tLPT LEB %d free %d dirty %d tgc %d cmt %d\n",
791 spin_unlock(&dbg_lock);
799 pr_err(
"(pid %d) start dumping scanned data from LEB %d:%d\n",
804 pr_err(
"Dumping node at LEB %d:%d len %d\n",
816 pr_err(
"(pid %d) start dumping LEB %d\n",
current->pid, lnum);
820 ubifs_err(
"cannot allocate memory for dumping LEB %d", lnum);
826 ubifs_err(
"scan error %d", (
int)PTR_ERR(sleb));
830 pr_err(
"LEB %d has %d nodes ending at %d\n", lnum,
835 pr_err(
"Dumping node at LEB %d:%d len %d\n", lnum,
840 pr_err(
"(pid %d) finish dumping LEB %d\n",
current->pid, lnum);
855 spin_lock(&dbg_lock);
857 zbr = &znode->
parent->zbranch[znode->
iip];
861 pr_err(
"znode %p, LEB %d:%d len %d parent %p iip %d level %d child_cnt %d flags %lx\n",
866 spin_unlock(&dbg_lock);
873 if (znode->
level > 0)
874 pr_err(
"\t%d: znode %p LEB %d:%d len %d key %s\n",
879 pr_err(
"\t%d: LNC %p LEB %d:%d len %d key %s\n",
884 spin_unlock(&dbg_lock);
891 pr_err(
"(pid %d) start dumping heap cat %d (%d elements)\n",
893 for (i = 0; i < heap->
cnt; i++) {
896 pr_err(
"\t%d. LEB %d hpos %d free %d dirty %d flags %d\n",
909 pr_err(
"\taddress %zx parent %zx cnext %zx\n",
910 (
size_t)pnode, (
size_t)parent, (
size_t)pnode->
cnext);
911 pr_err(
"\tflags %lu iip %d level %d num %d\n",
912 pnode->flags, iip, pnode->level, pnode->num);
916 pr_err(
"\t%d: free %d dirty %d flags %d lnum %d\n",
929 level = znode->
level;
930 pr_err(
"== Level %d ==\n", level);
932 if (level != znode->
level) {
933 level = znode->
level;
934 pr_err(
"== Level %d ==\n", level);
1033 ubifs_err(
"free space changed from %lld to %lld",
1041 ubifs_msg(
"saved lprops statistics dump");
1046 ubifs_msg(
"current lprops statistics dump");
1049 ubifs_msg(
"current budgeting info dump");
1070 if (!dbg_is_chk_gen(c))
1078 ubifs_err(
"ui_size is %lld, synced_i_size is %lld, but inode is clean",
1081 inode->
i_mode, i_size_read(inode));
1105 unsigned int nlink = 2;
1111 if (!dbg_is_chk_gen(c))
1117 lowest_dent_key(c, &key, dir->
i_ino);
1123 err = PTR_ERR(dent);
1136 key_read(c, &dent->
key, &key);
1140 if (i_size_read(dir) != size) {
1141 ubifs_err(
"directory inode %lu has size %llu, but calculated size is %llu",
1142 dir->
i_ino, (
unsigned long long)i_size_read(dir),
1143 (
unsigned long long)size);
1149 ubifs_err(
"directory inode %lu has nlink %u, but calculated nlink is %u",
1175 int err, nlen1, nlen2, cmp;
1206 key_read(c, &dent1->
key, &
key);
1207 if (keys_cmp(c, &zbr1->
key, &
key)) {
1211 ubifs_err(
"but it should have key %s according to tnc",
1218 key_read(c, &dent2->
key, &
key);
1219 if (keys_cmp(c, &zbr2->
key, &
key)) {
1223 ubifs_err(
"but it should have key %s according to tnc",
1234 if (cmp < 0 || (cmp == 0 && nlen1 < nlen2)) {
1238 if (cmp == 0 && nlen1 == nlen2)
1239 ubifs_err(
"2 xent/dent nodes with the same name");
1241 ubifs_err(
"bad order of colliding key %s",
1273 if (znode->
level < 0) {
1284 if (!ubifs_zn_dirty(znode)) {
1289 if (ubifs_zn_dirty(znode)) {
1296 if (zp && !ubifs_zn_dirty(zp)) {
1304 if (ubifs_zn_dirty(znode)) {
1332 if (znode->
iip != n) {
1334 if (keys_cmp(c, &zp->
zbranch[n].key,
1347 cmp = keys_cmp(c, min, &znode->
zbranch[0].key);
1354 max = &zp->
zbranch[n + 1].key;
1361 cmp = keys_cmp(c, max,
1370 if (zbr != &c->
zroot) {
1380 for (n = 1; n < znode->
child_cnt; n++) {
1381 cmp = keys_cmp(c, &znode->
zbranch[n - 1].key,
1389 if (!is_hash_key(c, &znode->
zbranch[n].key)) {
1401 err = dbg_check_key_order(c, &znode->
zbranch[n - 1],
1412 for (n = 0; n < znode->
child_cnt; n++) {
1413 if (!znode->
zbranch[n].znode &&
1414 (znode->
zbranch[n].lnum == 0 ||
1415 znode->
zbranch[n].len == 0)) {
1420 if (znode->
zbranch[n].lnum != 0 &&
1426 if (znode->
zbranch[n].lnum == 0 &&
1432 if (znode->
zbranch[n].lnum == 0 &&
1433 znode->
zbranch[n].offs != 0) {
1439 if (znode->
zbranch[n].znode->parent != znode) {
1470 long clean_cnt = 0, dirty_cnt = 0;
1473 if (!dbg_is_chk_index(c))
1477 if (!c->
zroot.znode)
1488 zbr = &znode->
parent->zbranch[znode->
iip];
1490 err = dbg_check_znode(c, zbr);
1495 if (ubifs_zn_dirty(znode))
1512 !keys_cmp(c, &prev->
zbranch[last].key,
1514 err = dbg_check_key_order(c, &prev->
zbranch[last],
1530 ubifs_err(
"incorrect clean_zn_cnt %ld, calculated %ld",
1536 ubifs_err(
"incorrect dirty_zn_cnt %ld, calculated %ld",
1570 if (!c->
zroot.znode) {
1572 if (IS_ERR(c->
zroot.znode)) {
1573 err = PTR_ERR(c->
zroot.znode);
1584 znode = c->
zroot.znode;
1585 while (znode->
level > 0) {
1590 if (IS_ERR(child)) {
1591 err = PTR_ERR(child);
1607 err = znode_cb(c, znode, priv);
1609 ubifs_err(
"znode checking function returned error %d",
1615 if (leaf_cb && znode->
level == 0) {
1616 for (idx = 0; idx < znode->
child_cnt; idx++) {
1618 err = leaf_cb(c, zbr, priv);
1620 ubifs_err(
"leaf checking function returned error %d, for leaf at LEB %d:%d",
1630 idx = znode->
iip + 1;
1638 if (IS_ERR(child)) {
1639 err = PTR_ERR(child);
1653 while (znode->
level > 0) {
1658 if (IS_ERR(child)) {
1659 err = PTR_ERR(child);
1673 zbr = &znode->
parent->zbranch[znode->
iip];
1695 long long *idx_size =
priv;
1698 add = ubifs_idx_node_sz(c, znode->
child_cnt);
1699 add =
ALIGN(add, 8);
1718 if (!dbg_is_chk_index(c))
1723 ubifs_err(
"error %d while walking the index", err);
1727 if (calc != idx_size) {
1728 ubifs_err(
"index size check failed: calculated size is %lld, should be %lld",
1802 p = &fsckd->
inodes.rb_node;
1806 if (inum < fscki->inum)
1808 else if (inum > fscki->
inum)
1815 ubifs_err(
"too high inode number, max. is %lu",
1861 rb_link_node(&fscki->
rb, parent, p);
1881 p = fsckd->
inodes.rb_node;
1884 if (inum < fscki->inum)
1886 else if (inum > fscki->
inum)
1915 fscki = search_inode(fsckd, inum);
1919 ino_key_init(c, &
key, inum);
1922 ubifs_err(
"inode %lu not found in index", (
unsigned long)inum);
1924 }
else if (err < 0) {
1925 ubifs_err(
"error %d while looking up inode %lu",
1926 err, (
unsigned long)inum);
1927 return ERR_PTR(err);
1932 ubifs_err(
"bad node %lu node length %d",
1933 (
unsigned long)inum, zbr->
len);
1943 ubifs_err(
"cannot read inode node at LEB %d:%d, error %d",
1946 return ERR_PTR(err);
1949 fscki = add_inode(c, fsckd, ino);
1951 if (IS_ERR(fscki)) {
1952 ubifs_err(
"error %ld while adding inode %lu node",
1953 PTR_ERR(fscki), (
unsigned long)inum);
1982 int err, type = key_type(c, &zbr->
key);
1986 ubifs_err(
"bad leaf length %d (LEB %d:%d)",
1997 ubifs_err(
"cannot read leaf node at LEB %d:%d, error %d",
2004 fscki = add_inode(c, priv, node);
2005 if (IS_ERR(fscki)) {
2006 err = PTR_ERR(fscki);
2007 ubifs_err(
"error %d while adding inode node", err);
2015 ubifs_err(
"unexpected node type %d at LEB %d:%d",
2023 ubifs_err(
"too high sequence number, max. is %llu",
2037 inum = key_inum_flash(c, &dn->
key);
2038 fscki = read_add_inode(c, priv, inum);
2039 if (IS_ERR(fscki)) {
2040 err = PTR_ERR(fscki);
2041 ubifs_err(
"error %d while processing data node and trying to find inode node %lu",
2042 err, (
unsigned long)inum);
2047 blk_offs = key_block_flash(c, &dn->
key);
2050 if (blk_offs > fscki->
size) {
2051 ubifs_err(
"data node at LEB %d:%d is not within inode size %lld",
2070 fscki = read_add_inode(c, priv, inum);
2071 if (IS_ERR(fscki)) {
2072 err = PTR_ERR(fscki);
2073 ubifs_err(
"error %d while processing entry node and trying to find inode node %lu",
2074 err, (
unsigned long)inum);
2081 inum = key_inum_flash(c, &dent->
key);
2082 fscki1 = read_add_inode(c, priv, inum);
2083 if (IS_ERR(fscki1)) {
2084 err = PTR_ERR(fscki1);
2085 ubifs_err(
"error %d while processing entry node and trying to find parent inode node %lu",
2086 err, (
unsigned long)inum);
2119 static void free_inodes(
struct fsck_data *fsckd)
2175 ubifs_err(
"directory inode %lu has %d direntries which refer it, but should be 1",
2176 (
unsigned long)fscki->
inum,
2182 ubifs_err(
"root inode %lu has non-zero (%d) direntries which refer it",
2183 (
unsigned long)fscki->
inum,
2188 ubifs_err(
"directory inode %lu size is %lld, but calculated size is %lld",
2189 (
unsigned long)fscki->
inum,
2194 ubifs_err(
"directory inode %lu nlink is %d, but calculated nlink is %d",
2195 (
unsigned long)fscki->
inum,
2201 ubifs_err(
"inode %lu nlink is %d, but calculated nlink is %d",
2202 (
unsigned long)fscki->
inum,
2208 ubifs_err(
"inode %lu has xattr size %u, but calculated size is %lld",
2214 ubifs_err(
"inode %lu has %u xattrs, but calculated count is %lld",
2215 (
unsigned long)fscki->
inum,
2220 ubifs_err(
"inode %lu has xattr names' size %u, but calculated names' size is %lld",
2231 ino_key_init(c, &
key, fscki->
inum);
2234 ubifs_err(
"inode %lu not found in index",
2235 (
unsigned long)fscki->
inum);
2237 }
else if (err < 0) {
2238 ubifs_err(
"error %d while looking up inode %lu",
2239 err, (
unsigned long)fscki->
inum);
2250 ubifs_err(
"cannot read inode node at LEB %d:%d, error %d",
2256 ubifs_msg(
"dump of the inode %lu sitting in LEB %d:%d",
2281 if (!dbg_is_chk_fs(c))
2289 err = check_inodes(c, &fsckd);
2293 free_inodes(&fsckd);
2297 ubifs_err(
"file-system check failed with error %d", err);
2299 free_inodes(&fsckd);
2316 if (!dbg_is_chk_gen(c))
2319 for (cur = head->
next; cur->
next != head; cur = cur->
next) {
2338 inuma = key_inum(c, &sa->
key);
2339 inumb = key_inum(c, &sb->
key);
2343 if (inuma > inumb) {
2344 ubifs_err(
"larger inum %lu goes before inum %lu",
2345 (
unsigned long)inuma, (
unsigned long)inumb);
2349 blka = key_block(c, &sa->
key);
2350 blkb = key_block(c, &sb->
key);
2353 ubifs_err(
"larger block %u goes before %u", blka, blkb);
2357 ubifs_err(
"two data nodes for the same block");
2383 if (!dbg_is_chk_gen(c))
2386 for (cur = head->
next; cur->
next != head; cur = cur->
next) {
2408 ubifs_err(
"non-inode node goes before inode node");
2418 ubifs_err(
"smaller inode node goes first");
2428 inuma = key_inum(c, &sa->
key);
2429 inumb = key_inum(c, &sb->
key);
2433 if (inuma > inumb) {
2434 ubifs_err(
"larger inum %lu goes before inum %lu",
2435 (
unsigned long)inuma, (
unsigned long)inumb);
2439 hasha = key_block(c, &sa->
key);
2440 hashb = key_block(c, &sb->
key);
2442 if (hasha > hashb) {
2443 ubifs_err(
"larger hash %u goes before %u",
2460 static inline int chance(
unsigned int n,
unsigned int out_of)
2462 return !!((
random32() % out_of) + 1 <= n);
2466 static int power_cut_emulated(
struct ubifs_info *c,
int lnum,
int write)
2475 unsigned long delay;
2489 ubifs_warn(
"failing after %lu calls", delay);
2503 if (write && chance(1, 2))
2507 ubifs_warn(
"failing in super block LEB %d", lnum);
2511 ubifs_warn(
"failing in master LEB %d", lnum);
2513 if (write && chance(99, 100))
2515 if (chance(399, 400))
2518 }
else if (lnum >= c->
lpt_first && lnum <= c->lpt_last) {
2519 if (write && chance(7, 8))
2524 }
else if (lnum >= c->
orph_first && lnum <= c->orph_last) {
2525 if (write && chance(1, 2))
2529 ubifs_warn(
"failing in orphan LEB %d", lnum);
2531 if (chance(99, 100))
2533 ubifs_warn(
"failing in index head LEB %d", lnum);
2537 ubifs_warn(
"failing in GC head LEB %d", lnum);
2542 ubifs_warn(
"failing in non-bud LEB %d", lnum);
2545 if (chance(999, 1000))
2547 ubifs_warn(
"failing in bud LEB %d commit running", lnum);
2549 if (chance(9999, 10000))
2551 ubifs_warn(
"failing in bud LEB %d commit not running", lnum);
2555 ubifs_warn(
"========== Power cut emulated ==========");
2560 static int corrupt_data(
const struct ubifs_info *c,
const void *
buf,
2563 unsigned int from, to,
i,
ffs = chance(1, 2);
2564 unsigned char *p = (
void *)buf;
2570 ubifs_warn(
"filled bytes %u-%u with %s", from, to - 1,
2571 ffs ?
"0xFFs" :
"random data");
2574 for (i = from; i < to; i++)
2577 for (i = from; i < to; i++)
2588 if (c->
dbg->pc_happened)
2591 failing = power_cut_emulated(c, lnum, 1);
2593 len = corrupt_data(c, buf, len);
2594 ubifs_warn(
"actually write %d bytes to LEB %d:%d (the buffer was corrupted)",
2609 if (c->
dbg->pc_happened)
2611 if (power_cut_emulated(c, lnum, 1))
2616 if (power_cut_emulated(c, lnum, 1))
2625 if (c->
dbg->pc_happened)
2627 if (power_cut_emulated(c, lnum, 0))
2632 if (power_cut_emulated(c, lnum, 0))
2641 if (c->
dbg->pc_happened)
2643 if (power_cut_emulated(c, lnum, 0))
2648 if (power_cut_emulated(c, lnum, 0))
2657 static struct dentry *dfs_rootdir;
2659 static int dfs_file_open(
struct inode *inode,
struct file *
file)
2677 static int provide_user_output(
int val,
char __user *
u,
size_t count,
2692 static ssize_t dfs_file_read(
struct file *
file,
char __user *u,
size_t count,
2717 return provide_user_output(val, u, count, ppos);
2729 static int interpret_user_input(
const char __user *u,
size_t count)
2734 buf_size =
min_t(
size_t, count, (
sizeof(buf) - 1));
2740 else if (buf[0] ==
'0')
2746 static ssize_t dfs_file_write(
struct file *file,
const char __user *u,
2747 size_t count, loff_t *ppos)
2781 val = interpret_user_input(u, count);
2806 .open = dfs_file_open,
2807 .read = dfs_file_read,
2808 .write = dfs_file_write,
2836 c->
vi.ubi_num, c->
vi.vol_id);
2846 if (IS_ERR_OR_NULL(dent))
2850 fname =
"dump_lprops";
2852 if (IS_ERR_OR_NULL(dent))
2856 fname =
"dump_budg";
2858 if (IS_ERR_OR_NULL(dent))
2864 if (IS_ERR_OR_NULL(dent))
2868 fname =
"chk_general";
2871 if (IS_ERR_OR_NULL(dent))
2875 fname =
"chk_index";
2878 if (IS_ERR_OR_NULL(dent))
2882 fname =
"chk_orphans";
2885 if (IS_ERR_OR_NULL(dent))
2889 fname =
"chk_lprops";
2892 if (IS_ERR_OR_NULL(dent))
2899 if (IS_ERR_OR_NULL(dent))
2903 fname =
"tst_recovery";
2906 if (IS_ERR_OR_NULL(dent))
2913 if (IS_ERR_OR_NULL(dent))
2922 err = dent ? PTR_ERR(dent) : -
ENODEV;
2923 ubifs_err(
"cannot create \"%s\" debugfs file or directory, error %d\n",
2940 static struct dentry *dfs_chk_gen;
2941 static struct dentry *dfs_chk_index;
2942 static struct dentry *dfs_chk_orph;
2943 static struct dentry *dfs_chk_lprops;
2944 static struct dentry *dfs_chk_fs;
2945 static struct dentry *dfs_tst_rcvry;
2947 static ssize_t dfs_global_file_read(
struct file *file,
char __user *u,
2948 size_t count, loff_t *ppos)
2953 if (dent == dfs_chk_gen)
2955 else if (dent == dfs_chk_index)
2957 else if (dent == dfs_chk_orph)
2959 else if (dent == dfs_chk_lprops)
2961 else if (dent == dfs_chk_fs)
2963 else if (dent == dfs_tst_rcvry)
2968 return provide_user_output(val, u, count, ppos);
2971 static ssize_t dfs_global_file_write(
struct file *file,
const char __user *u,
2972 size_t count, loff_t *ppos)
2977 val = interpret_user_input(u, count);
2981 if (dent == dfs_chk_gen)
2983 else if (dent == dfs_chk_index)
2985 else if (dent == dfs_chk_orph)
2987 else if (dent == dfs_chk_lprops)
2989 else if (dent == dfs_chk_fs)
2991 else if (dent == dfs_tst_rcvry)
3000 .read = dfs_global_file_read,
3001 .write = dfs_global_file_write,
3025 if (IS_ERR_OR_NULL(dent))
3029 fname =
"chk_general";
3032 if (IS_ERR_OR_NULL(dent))
3036 fname =
"chk_index";
3039 if (IS_ERR_OR_NULL(dent))
3041 dfs_chk_index = dent;
3043 fname =
"chk_orphans";
3046 if (IS_ERR_OR_NULL(dent))
3048 dfs_chk_orph = dent;
3050 fname =
"chk_lprops";
3053 if (IS_ERR_OR_NULL(dent))
3055 dfs_chk_lprops = dent;
3060 if (IS_ERR_OR_NULL(dent))
3064 fname =
"tst_recovery";
3067 if (IS_ERR_OR_NULL(dent))
3069 dfs_tst_rcvry = dent;
3076 err = dent ? PTR_ERR(dent) : -
ENODEV;
3077 ubifs_err(
"cannot create \"%s\" debugfs file or directory, error %d\n",