| .. | .. | 
|---|
|  | 1 | +// SPDX-License-Identifier: GPL-2.0-or-later | 
|---|
| 1 | 2 | /* | 
|---|
| 2 | 3 | * Copyright (c) International Business Machines Corp., 2006 | 
|---|
| 3 |  | - * | 
|---|
| 4 |  | - * This program is free software; you can redistribute it and/or modify | 
|---|
| 5 |  | - * it under the terms of the GNU General Public License as published by | 
|---|
| 6 |  | - * the Free Software Foundation; either version 2 of the License, or | 
|---|
| 7 |  | - * (at your option) any later version. | 
|---|
| 8 |  | - * | 
|---|
| 9 |  | - * This program is distributed in the hope that it will be useful, | 
|---|
| 10 |  | - * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
|---|
| 11 |  | - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See | 
|---|
| 12 |  | - * the GNU General Public License for more details. | 
|---|
| 13 |  | - * | 
|---|
| 14 |  | - * You should have received a copy of the GNU General Public License | 
|---|
| 15 |  | - * along with this program; if not, write to the Free Software | 
|---|
| 16 |  | - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | 
|---|
| 17 | 4 | * | 
|---|
| 18 | 5 | * Author: Artem Bityutskiy (Битюцкий Артём) | 
|---|
| 19 | 6 | */ | 
|---|
| .. | .. | 
|---|
| 120 | 107 | pr_err("\tlast_eb_bytes   %d\n", vol->last_eb_bytes); | 
|---|
| 121 | 108 | pr_err("\tcorrupted       %d\n", vol->corrupted); | 
|---|
| 122 | 109 | pr_err("\tupd_marker      %d\n", vol->upd_marker); | 
|---|
|  | 110 | +	pr_err("\tskip_check      %d\n", vol->skip_check); | 
|---|
| 123 | 111 |  | 
|---|
| 124 | 112 | if (vol->name_len <= UBI_VOL_NAME_MAX && | 
|---|
| 125 | 113 | strnlen(vol->name, vol->name_len + 1) == vol->name_len) { | 
|---|
| .. | .. | 
|---|
| 514 | 502 | */ | 
|---|
| 515 | 503 | int ubi_debugfs_init_dev(struct ubi_device *ubi) | 
|---|
| 516 | 504 | { | 
|---|
| 517 |  | -	int err, n; | 
|---|
| 518 | 505 | unsigned long ubi_num = ubi->ubi_num; | 
|---|
| 519 |  | -	const char *fname; | 
|---|
| 520 |  | -	struct dentry *dent; | 
|---|
| 521 | 506 | struct ubi_debug_info *d = &ubi->dbg; | 
|---|
|  | 507 | +	int n; | 
|---|
| 522 | 508 |  | 
|---|
| 523 | 509 | if (!IS_ENABLED(CONFIG_DEBUG_FS)) | 
|---|
| 524 | 510 | return 0; | 
|---|
| .. | .. | 
|---|
| 527 | 513 | ubi->ubi_num); | 
|---|
| 528 | 514 | if (n == UBI_DFS_DIR_LEN) { | 
|---|
| 529 | 515 | /* The array size is too small */ | 
|---|
| 530 |  | -		fname = UBI_DFS_DIR_NAME; | 
|---|
| 531 |  | -		dent = ERR_PTR(-EINVAL); | 
|---|
| 532 |  | -		goto out; | 
|---|
|  | 516 | +		return -EINVAL; | 
|---|
| 533 | 517 | } | 
|---|
| 534 | 518 |  | 
|---|
| 535 |  | -	fname = d->dfs_dir_name; | 
|---|
| 536 |  | -	dent = debugfs_create_dir(fname, dfs_rootdir); | 
|---|
| 537 |  | -	if (IS_ERR_OR_NULL(dent)) | 
|---|
| 538 |  | -		goto out; | 
|---|
| 539 |  | -	d->dfs_dir = dent; | 
|---|
|  | 519 | +	d->dfs_dir = debugfs_create_dir(d->dfs_dir_name, dfs_rootdir); | 
|---|
| 540 | 520 |  | 
|---|
| 541 |  | -	fname = "chk_gen"; | 
|---|
| 542 |  | -	dent = debugfs_create_file(fname, S_IWUSR, d->dfs_dir, (void *)ubi_num, | 
|---|
| 543 |  | -				   &dfs_fops); | 
|---|
| 544 |  | -	if (IS_ERR_OR_NULL(dent)) | 
|---|
| 545 |  | -		goto out_remove; | 
|---|
| 546 |  | -	d->dfs_chk_gen = dent; | 
|---|
|  | 521 | +	d->dfs_chk_gen = debugfs_create_file("chk_gen", S_IWUSR, d->dfs_dir, | 
|---|
|  | 522 | +					     (void *)ubi_num, &dfs_fops); | 
|---|
| 547 | 523 |  | 
|---|
| 548 |  | -	fname = "chk_io"; | 
|---|
| 549 |  | -	dent = debugfs_create_file(fname, S_IWUSR, d->dfs_dir, (void *)ubi_num, | 
|---|
| 550 |  | -				   &dfs_fops); | 
|---|
| 551 |  | -	if (IS_ERR_OR_NULL(dent)) | 
|---|
| 552 |  | -		goto out_remove; | 
|---|
| 553 |  | -	d->dfs_chk_io = dent; | 
|---|
|  | 524 | +	d->dfs_chk_io = debugfs_create_file("chk_io", S_IWUSR, d->dfs_dir, | 
|---|
|  | 525 | +					    (void *)ubi_num, &dfs_fops); | 
|---|
| 554 | 526 |  | 
|---|
| 555 |  | -	fname = "chk_fastmap"; | 
|---|
| 556 |  | -	dent = debugfs_create_file(fname, S_IWUSR, d->dfs_dir, (void *)ubi_num, | 
|---|
| 557 |  | -				   &dfs_fops); | 
|---|
| 558 |  | -	if (IS_ERR_OR_NULL(dent)) | 
|---|
| 559 |  | -		goto out_remove; | 
|---|
| 560 |  | -	d->dfs_chk_fastmap = dent; | 
|---|
|  | 527 | +	d->dfs_chk_fastmap = debugfs_create_file("chk_fastmap", S_IWUSR, | 
|---|
|  | 528 | +						 d->dfs_dir, (void *)ubi_num, | 
|---|
|  | 529 | +						 &dfs_fops); | 
|---|
| 561 | 530 |  | 
|---|
| 562 |  | -	fname = "tst_disable_bgt"; | 
|---|
| 563 |  | -	dent = debugfs_create_file(fname, S_IWUSR, d->dfs_dir, (void *)ubi_num, | 
|---|
| 564 |  | -				   &dfs_fops); | 
|---|
| 565 |  | -	if (IS_ERR_OR_NULL(dent)) | 
|---|
| 566 |  | -		goto out_remove; | 
|---|
| 567 |  | -	d->dfs_disable_bgt = dent; | 
|---|
|  | 531 | +	d->dfs_disable_bgt = debugfs_create_file("tst_disable_bgt", S_IWUSR, | 
|---|
|  | 532 | +						 d->dfs_dir, (void *)ubi_num, | 
|---|
|  | 533 | +						 &dfs_fops); | 
|---|
| 568 | 534 |  | 
|---|
| 569 |  | -	fname = "tst_emulate_bitflips"; | 
|---|
| 570 |  | -	dent = debugfs_create_file(fname, S_IWUSR, d->dfs_dir, (void *)ubi_num, | 
|---|
| 571 |  | -				   &dfs_fops); | 
|---|
| 572 |  | -	if (IS_ERR_OR_NULL(dent)) | 
|---|
| 573 |  | -		goto out_remove; | 
|---|
| 574 |  | -	d->dfs_emulate_bitflips = dent; | 
|---|
|  | 535 | +	d->dfs_emulate_bitflips = debugfs_create_file("tst_emulate_bitflips", | 
|---|
|  | 536 | +						      S_IWUSR, d->dfs_dir, | 
|---|
|  | 537 | +						      (void *)ubi_num, | 
|---|
|  | 538 | +						      &dfs_fops); | 
|---|
| 575 | 539 |  | 
|---|
| 576 |  | -	fname = "tst_emulate_io_failures"; | 
|---|
| 577 |  | -	dent = debugfs_create_file(fname, S_IWUSR, d->dfs_dir, (void *)ubi_num, | 
|---|
| 578 |  | -				   &dfs_fops); | 
|---|
| 579 |  | -	if (IS_ERR_OR_NULL(dent)) | 
|---|
| 580 |  | -		goto out_remove; | 
|---|
| 581 |  | -	d->dfs_emulate_io_failures = dent; | 
|---|
|  | 540 | +	d->dfs_emulate_io_failures = debugfs_create_file("tst_emulate_io_failures", | 
|---|
|  | 541 | +							 S_IWUSR, d->dfs_dir, | 
|---|
|  | 542 | +							 (void *)ubi_num, | 
|---|
|  | 543 | +							 &dfs_fops); | 
|---|
| 582 | 544 |  | 
|---|
| 583 |  | -	fname = "tst_emulate_power_cut"; | 
|---|
| 584 |  | -	dent = debugfs_create_file(fname, S_IWUSR, d->dfs_dir, (void *)ubi_num, | 
|---|
| 585 |  | -				   &dfs_fops); | 
|---|
| 586 |  | -	if (IS_ERR_OR_NULL(dent)) | 
|---|
| 587 |  | -		goto out_remove; | 
|---|
| 588 |  | -	d->dfs_emulate_power_cut = dent; | 
|---|
|  | 545 | +	d->dfs_emulate_power_cut = debugfs_create_file("tst_emulate_power_cut", | 
|---|
|  | 546 | +						       S_IWUSR, d->dfs_dir, | 
|---|
|  | 547 | +						       (void *)ubi_num, | 
|---|
|  | 548 | +						       &dfs_fops); | 
|---|
| 589 | 549 |  | 
|---|
| 590 |  | -	fname = "tst_emulate_power_cut_min"; | 
|---|
| 591 |  | -	dent = debugfs_create_file(fname, S_IWUSR, d->dfs_dir, (void *)ubi_num, | 
|---|
| 592 |  | -				   &dfs_fops); | 
|---|
| 593 |  | -	if (IS_ERR_OR_NULL(dent)) | 
|---|
| 594 |  | -		goto out_remove; | 
|---|
| 595 |  | -	d->dfs_power_cut_min = dent; | 
|---|
|  | 550 | +	d->dfs_power_cut_min = debugfs_create_file("tst_emulate_power_cut_min", | 
|---|
|  | 551 | +						   S_IWUSR, d->dfs_dir, | 
|---|
|  | 552 | +						   (void *)ubi_num, &dfs_fops); | 
|---|
| 596 | 553 |  | 
|---|
| 597 |  | -	fname = "tst_emulate_power_cut_max"; | 
|---|
| 598 |  | -	dent = debugfs_create_file(fname, S_IWUSR, d->dfs_dir, (void *)ubi_num, | 
|---|
| 599 |  | -				   &dfs_fops); | 
|---|
| 600 |  | -	if (IS_ERR_OR_NULL(dent)) | 
|---|
| 601 |  | -		goto out_remove; | 
|---|
| 602 |  | -	d->dfs_power_cut_max = dent; | 
|---|
|  | 554 | +	d->dfs_power_cut_max = debugfs_create_file("tst_emulate_power_cut_max", | 
|---|
|  | 555 | +						   S_IWUSR, d->dfs_dir, | 
|---|
|  | 556 | +						   (void *)ubi_num, &dfs_fops); | 
|---|
| 603 | 557 |  | 
|---|
| 604 |  | -	fname = "detailed_erase_block_info"; | 
|---|
| 605 |  | -	dent = debugfs_create_file(fname, S_IRUSR, d->dfs_dir, (void *)ubi_num, | 
|---|
| 606 |  | -				   &eraseblk_count_fops); | 
|---|
| 607 |  | -	if (IS_ERR_OR_NULL(dent)) | 
|---|
| 608 |  | -		goto out_remove; | 
|---|
|  | 558 | +	debugfs_create_file("detailed_erase_block_info", S_IRUSR, d->dfs_dir, | 
|---|
|  | 559 | +			    (void *)ubi_num, &eraseblk_count_fops); | 
|---|
| 609 | 560 |  | 
|---|
| 610 | 561 | return 0; | 
|---|
| 611 |  | - | 
|---|
| 612 |  | -out_remove: | 
|---|
| 613 |  | -	debugfs_remove_recursive(d->dfs_dir); | 
|---|
| 614 |  | -out: | 
|---|
| 615 |  | -	err = dent ? PTR_ERR(dent) : -ENODEV; | 
|---|
| 616 |  | -	ubi_err(ubi, "cannot create \"%s\" debugfs file or directory, error %d\n", | 
|---|
| 617 |  | -		fname, err); | 
|---|
| 618 |  | -	return err; | 
|---|
| 619 | 562 | } | 
|---|
| 620 | 563 |  | 
|---|
| 621 | 564 | /** | 
|---|