.. | .. |
---|
| 1 | +// SPDX-License-Identifier: GPL-2.0-only |
---|
1 | 2 | /* |
---|
2 | 3 | * This file is part of UBIFS. |
---|
3 | 4 | * |
---|
4 | 5 | * Copyright (C) 2006-2008 Nokia Corporation |
---|
5 | | - * |
---|
6 | | - * This program is free software; you can redistribute it and/or modify it |
---|
7 | | - * under the terms of the GNU General Public License version 2 as published by |
---|
8 | | - * the Free Software Foundation. |
---|
9 | | - * |
---|
10 | | - * This program is distributed in the hope that it will be useful, but WITHOUT |
---|
11 | | - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
---|
12 | | - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for |
---|
13 | | - * more details. |
---|
14 | | - * |
---|
15 | | - * You should have received a copy of the GNU General Public License along with |
---|
16 | | - * this program; if not, write to the Free Software Foundation, Inc., 51 |
---|
17 | | - * Franklin St, Fifth Floor, Boston, MA 02110-1301 USA |
---|
18 | 6 | * |
---|
19 | 7 | * Authors: Artem Bityutskiy (Битюцкий Артём) |
---|
20 | 8 | * Adrian Hunter |
---|
.. | .. |
---|
165 | 153 | return "commit start node"; |
---|
166 | 154 | case UBIFS_ORPH_NODE: |
---|
167 | 155 | return "orphan node"; |
---|
| 156 | + case UBIFS_AUTH_NODE: |
---|
| 157 | + return "auth node"; |
---|
168 | 158 | default: |
---|
169 | 159 | return "unknown node"; |
---|
170 | 160 | } |
---|
.. | .. |
---|
542 | 532 | (unsigned long long)le64_to_cpu(orph->inos[i])); |
---|
543 | 533 | break; |
---|
544 | 534 | } |
---|
| 535 | + case UBIFS_AUTH_NODE: |
---|
| 536 | + { |
---|
| 537 | + break; |
---|
| 538 | + } |
---|
545 | 539 | default: |
---|
546 | 540 | pr_err("node type %d was not recognized\n", |
---|
547 | 541 | (int)ch->node_type); |
---|
.. | .. |
---|
821 | 815 | |
---|
822 | 816 | pr_err("(pid %d) start dumping LEB %d\n", current->pid, lnum); |
---|
823 | 817 | |
---|
824 | | - buf = __vmalloc(c->leb_size, GFP_NOFS, PAGE_KERNEL); |
---|
| 818 | + buf = __vmalloc(c->leb_size, GFP_NOFS); |
---|
825 | 819 | if (!buf) { |
---|
826 | 820 | ubifs_err(c, "cannot allocate memory for dumping LEB %d", lnum); |
---|
827 | 821 | return; |
---|
.. | .. |
---|
1598 | 1592 | err = PTR_ERR(child); |
---|
1599 | 1593 | goto out_unlock; |
---|
1600 | 1594 | } |
---|
1601 | | - zbr->znode = child; |
---|
1602 | 1595 | } |
---|
1603 | 1596 | |
---|
1604 | 1597 | znode = child; |
---|
.. | .. |
---|
2745 | 2738 | struct dentry *dent = file->f_path.dentry; |
---|
2746 | 2739 | int val; |
---|
2747 | 2740 | |
---|
2748 | | - /* |
---|
2749 | | - * TODO: this is racy - the file-system might have already been |
---|
2750 | | - * unmounted and we'd oops in this case. The plan is to fix it with |
---|
2751 | | - * help of 'iterate_supers_type()' which we should have in v3.0: when |
---|
2752 | | - * a debugfs opened, we rember FS's UUID in file->private_data. Then |
---|
2753 | | - * whenever we access the FS via a debugfs file, we iterate all UBIFS |
---|
2754 | | - * superblocks and fine the one with the same UUID, and take the |
---|
2755 | | - * locking right. |
---|
2756 | | - * |
---|
2757 | | - * The other way to go suggested by Al Viro is to create a separate |
---|
2758 | | - * 'ubifs-debug' file-system instead. |
---|
2759 | | - */ |
---|
2760 | 2741 | if (file->f_path.dentry == d->dfs_dump_lprops) { |
---|
2761 | 2742 | ubifs_dump_lprops(c); |
---|
2762 | 2743 | return count; |
---|
.. | .. |
---|
2808 | 2789 | * dbg_debugfs_init_fs - initialize debugfs for UBIFS instance. |
---|
2809 | 2790 | * @c: UBIFS file-system description object |
---|
2810 | 2791 | * |
---|
2811 | | - * This function creates all debugfs files for this instance of UBIFS. Returns |
---|
2812 | | - * zero in case of success and a negative error code in case of failure. |
---|
| 2792 | + * This function creates all debugfs files for this instance of UBIFS. |
---|
2813 | 2793 | * |
---|
2814 | 2794 | * Note, the only reason we have not merged this function with the |
---|
2815 | 2795 | * 'ubifs_debugging_init()' function is because it is better to initialize |
---|
2816 | 2796 | * debugfs interfaces at the very end of the mount process, and remove them at |
---|
2817 | 2797 | * the very beginning of the mount process. |
---|
2818 | 2798 | */ |
---|
2819 | | -int dbg_debugfs_init_fs(struct ubifs_info *c) |
---|
| 2799 | +void dbg_debugfs_init_fs(struct ubifs_info *c) |
---|
2820 | 2800 | { |
---|
2821 | | - int err, n; |
---|
| 2801 | + int n; |
---|
2822 | 2802 | const char *fname; |
---|
2823 | | - struct dentry *dent; |
---|
2824 | 2803 | struct ubifs_debug_info *d = c->dbg; |
---|
2825 | | - |
---|
2826 | | - if (!IS_ENABLED(CONFIG_DEBUG_FS)) |
---|
2827 | | - return 0; |
---|
2828 | 2804 | |
---|
2829 | 2805 | n = snprintf(d->dfs_dir_name, UBIFS_DFS_DIR_LEN + 1, UBIFS_DFS_DIR_NAME, |
---|
2830 | 2806 | c->vi.ubi_num, c->vi.vol_id); |
---|
2831 | 2807 | if (n == UBIFS_DFS_DIR_LEN) { |
---|
2832 | 2808 | /* The array size is too small */ |
---|
2833 | | - fname = UBIFS_DFS_DIR_NAME; |
---|
2834 | | - dent = ERR_PTR(-EINVAL); |
---|
2835 | | - goto out; |
---|
| 2809 | + return; |
---|
2836 | 2810 | } |
---|
2837 | 2811 | |
---|
2838 | 2812 | fname = d->dfs_dir_name; |
---|
2839 | | - dent = debugfs_create_dir(fname, dfs_rootdir); |
---|
2840 | | - if (IS_ERR_OR_NULL(dent)) |
---|
2841 | | - goto out; |
---|
2842 | | - d->dfs_dir = dent; |
---|
| 2813 | + d->dfs_dir = debugfs_create_dir(fname, dfs_rootdir); |
---|
2843 | 2814 | |
---|
2844 | 2815 | fname = "dump_lprops"; |
---|
2845 | | - dent = debugfs_create_file(fname, S_IWUSR, d->dfs_dir, c, &dfs_fops); |
---|
2846 | | - if (IS_ERR_OR_NULL(dent)) |
---|
2847 | | - goto out_remove; |
---|
2848 | | - d->dfs_dump_lprops = dent; |
---|
| 2816 | + d->dfs_dump_lprops = debugfs_create_file(fname, S_IWUSR, d->dfs_dir, c, |
---|
| 2817 | + &dfs_fops); |
---|
2849 | 2818 | |
---|
2850 | 2819 | fname = "dump_budg"; |
---|
2851 | | - dent = debugfs_create_file(fname, S_IWUSR, d->dfs_dir, c, &dfs_fops); |
---|
2852 | | - if (IS_ERR_OR_NULL(dent)) |
---|
2853 | | - goto out_remove; |
---|
2854 | | - d->dfs_dump_budg = dent; |
---|
| 2820 | + d->dfs_dump_budg = debugfs_create_file(fname, S_IWUSR, d->dfs_dir, c, |
---|
| 2821 | + &dfs_fops); |
---|
2855 | 2822 | |
---|
2856 | 2823 | fname = "dump_tnc"; |
---|
2857 | | - dent = debugfs_create_file(fname, S_IWUSR, d->dfs_dir, c, &dfs_fops); |
---|
2858 | | - if (IS_ERR_OR_NULL(dent)) |
---|
2859 | | - goto out_remove; |
---|
2860 | | - d->dfs_dump_tnc = dent; |
---|
| 2824 | + d->dfs_dump_tnc = debugfs_create_file(fname, S_IWUSR, d->dfs_dir, c, |
---|
| 2825 | + &dfs_fops); |
---|
2861 | 2826 | |
---|
2862 | 2827 | fname = "chk_general"; |
---|
2863 | | - dent = debugfs_create_file(fname, S_IRUSR | S_IWUSR, d->dfs_dir, c, |
---|
2864 | | - &dfs_fops); |
---|
2865 | | - if (IS_ERR_OR_NULL(dent)) |
---|
2866 | | - goto out_remove; |
---|
2867 | | - d->dfs_chk_gen = dent; |
---|
| 2828 | + d->dfs_chk_gen = debugfs_create_file(fname, S_IRUSR | S_IWUSR, |
---|
| 2829 | + d->dfs_dir, c, &dfs_fops); |
---|
2868 | 2830 | |
---|
2869 | 2831 | fname = "chk_index"; |
---|
2870 | | - dent = debugfs_create_file(fname, S_IRUSR | S_IWUSR, d->dfs_dir, c, |
---|
2871 | | - &dfs_fops); |
---|
2872 | | - if (IS_ERR_OR_NULL(dent)) |
---|
2873 | | - goto out_remove; |
---|
2874 | | - d->dfs_chk_index = dent; |
---|
| 2832 | + d->dfs_chk_index = debugfs_create_file(fname, S_IRUSR | S_IWUSR, |
---|
| 2833 | + d->dfs_dir, c, &dfs_fops); |
---|
2875 | 2834 | |
---|
2876 | 2835 | fname = "chk_orphans"; |
---|
2877 | | - dent = debugfs_create_file(fname, S_IRUSR | S_IWUSR, d->dfs_dir, c, |
---|
2878 | | - &dfs_fops); |
---|
2879 | | - if (IS_ERR_OR_NULL(dent)) |
---|
2880 | | - goto out_remove; |
---|
2881 | | - d->dfs_chk_orph = dent; |
---|
| 2836 | + d->dfs_chk_orph = debugfs_create_file(fname, S_IRUSR | S_IWUSR, |
---|
| 2837 | + d->dfs_dir, c, &dfs_fops); |
---|
2882 | 2838 | |
---|
2883 | 2839 | fname = "chk_lprops"; |
---|
2884 | | - dent = debugfs_create_file(fname, S_IRUSR | S_IWUSR, d->dfs_dir, c, |
---|
2885 | | - &dfs_fops); |
---|
2886 | | - if (IS_ERR_OR_NULL(dent)) |
---|
2887 | | - goto out_remove; |
---|
2888 | | - d->dfs_chk_lprops = dent; |
---|
| 2840 | + d->dfs_chk_lprops = debugfs_create_file(fname, S_IRUSR | S_IWUSR, |
---|
| 2841 | + d->dfs_dir, c, &dfs_fops); |
---|
2889 | 2842 | |
---|
2890 | 2843 | fname = "chk_fs"; |
---|
2891 | | - dent = debugfs_create_file(fname, S_IRUSR | S_IWUSR, d->dfs_dir, c, |
---|
2892 | | - &dfs_fops); |
---|
2893 | | - if (IS_ERR_OR_NULL(dent)) |
---|
2894 | | - goto out_remove; |
---|
2895 | | - d->dfs_chk_fs = dent; |
---|
| 2844 | + d->dfs_chk_fs = debugfs_create_file(fname, S_IRUSR | S_IWUSR, |
---|
| 2845 | + d->dfs_dir, c, &dfs_fops); |
---|
2896 | 2846 | |
---|
2897 | 2847 | fname = "tst_recovery"; |
---|
2898 | | - dent = debugfs_create_file(fname, S_IRUSR | S_IWUSR, d->dfs_dir, c, |
---|
2899 | | - &dfs_fops); |
---|
2900 | | - if (IS_ERR_OR_NULL(dent)) |
---|
2901 | | - goto out_remove; |
---|
2902 | | - d->dfs_tst_rcvry = dent; |
---|
| 2848 | + d->dfs_tst_rcvry = debugfs_create_file(fname, S_IRUSR | S_IWUSR, |
---|
| 2849 | + d->dfs_dir, c, &dfs_fops); |
---|
2903 | 2850 | |
---|
2904 | 2851 | fname = "ro_error"; |
---|
2905 | | - dent = debugfs_create_file(fname, S_IRUSR | S_IWUSR, d->dfs_dir, c, |
---|
2906 | | - &dfs_fops); |
---|
2907 | | - if (IS_ERR_OR_NULL(dent)) |
---|
2908 | | - goto out_remove; |
---|
2909 | | - d->dfs_ro_error = dent; |
---|
2910 | | - |
---|
2911 | | - return 0; |
---|
2912 | | - |
---|
2913 | | -out_remove: |
---|
2914 | | - debugfs_remove_recursive(d->dfs_dir); |
---|
2915 | | -out: |
---|
2916 | | - err = dent ? PTR_ERR(dent) : -ENODEV; |
---|
2917 | | - ubifs_err(c, "cannot create \"%s\" debugfs file or directory, error %d\n", |
---|
2918 | | - fname, err); |
---|
2919 | | - return err; |
---|
| 2852 | + d->dfs_ro_error = debugfs_create_file(fname, S_IRUSR | S_IWUSR, |
---|
| 2853 | + d->dfs_dir, c, &dfs_fops); |
---|
2920 | 2854 | } |
---|
2921 | 2855 | |
---|
2922 | 2856 | /** |
---|
.. | .. |
---|
2925 | 2859 | */ |
---|
2926 | 2860 | void dbg_debugfs_exit_fs(struct ubifs_info *c) |
---|
2927 | 2861 | { |
---|
2928 | | - if (IS_ENABLED(CONFIG_DEBUG_FS)) |
---|
2929 | | - debugfs_remove_recursive(c->dbg->dfs_dir); |
---|
| 2862 | + debugfs_remove_recursive(c->dbg->dfs_dir); |
---|
2930 | 2863 | } |
---|
2931 | 2864 | |
---|
2932 | 2865 | struct ubifs_global_debug_info ubifs_dbg; |
---|
.. | .. |
---|
3002 | 2935 | * |
---|
3003 | 2936 | * UBIFS uses debugfs file-system to expose various debugging knobs to |
---|
3004 | 2937 | * user-space. This function creates "ubifs" directory in the debugfs |
---|
3005 | | - * file-system. Returns zero in case of success and a negative error code in |
---|
3006 | | - * case of failure. |
---|
| 2938 | + * file-system. |
---|
3007 | 2939 | */ |
---|
3008 | | -int dbg_debugfs_init(void) |
---|
| 2940 | +void dbg_debugfs_init(void) |
---|
3009 | 2941 | { |
---|
3010 | | - int err; |
---|
3011 | 2942 | const char *fname; |
---|
3012 | | - struct dentry *dent; |
---|
3013 | | - |
---|
3014 | | - if (!IS_ENABLED(CONFIG_DEBUG_FS)) |
---|
3015 | | - return 0; |
---|
3016 | 2943 | |
---|
3017 | 2944 | fname = "ubifs"; |
---|
3018 | | - dent = debugfs_create_dir(fname, NULL); |
---|
3019 | | - if (IS_ERR_OR_NULL(dent)) |
---|
3020 | | - goto out; |
---|
3021 | | - dfs_rootdir = dent; |
---|
| 2945 | + dfs_rootdir = debugfs_create_dir(fname, NULL); |
---|
3022 | 2946 | |
---|
3023 | 2947 | fname = "chk_general"; |
---|
3024 | | - dent = debugfs_create_file(fname, S_IRUSR | S_IWUSR, dfs_rootdir, NULL, |
---|
3025 | | - &dfs_global_fops); |
---|
3026 | | - if (IS_ERR_OR_NULL(dent)) |
---|
3027 | | - goto out_remove; |
---|
3028 | | - dfs_chk_gen = dent; |
---|
| 2948 | + dfs_chk_gen = debugfs_create_file(fname, S_IRUSR | S_IWUSR, dfs_rootdir, |
---|
| 2949 | + NULL, &dfs_global_fops); |
---|
3029 | 2950 | |
---|
3030 | 2951 | fname = "chk_index"; |
---|
3031 | | - dent = debugfs_create_file(fname, S_IRUSR | S_IWUSR, dfs_rootdir, NULL, |
---|
3032 | | - &dfs_global_fops); |
---|
3033 | | - if (IS_ERR_OR_NULL(dent)) |
---|
3034 | | - goto out_remove; |
---|
3035 | | - dfs_chk_index = dent; |
---|
| 2952 | + dfs_chk_index = debugfs_create_file(fname, S_IRUSR | S_IWUSR, |
---|
| 2953 | + dfs_rootdir, NULL, &dfs_global_fops); |
---|
3036 | 2954 | |
---|
3037 | 2955 | fname = "chk_orphans"; |
---|
3038 | | - dent = debugfs_create_file(fname, S_IRUSR | S_IWUSR, dfs_rootdir, NULL, |
---|
3039 | | - &dfs_global_fops); |
---|
3040 | | - if (IS_ERR_OR_NULL(dent)) |
---|
3041 | | - goto out_remove; |
---|
3042 | | - dfs_chk_orph = dent; |
---|
| 2956 | + dfs_chk_orph = debugfs_create_file(fname, S_IRUSR | S_IWUSR, |
---|
| 2957 | + dfs_rootdir, NULL, &dfs_global_fops); |
---|
3043 | 2958 | |
---|
3044 | 2959 | fname = "chk_lprops"; |
---|
3045 | | - dent = debugfs_create_file(fname, S_IRUSR | S_IWUSR, dfs_rootdir, NULL, |
---|
3046 | | - &dfs_global_fops); |
---|
3047 | | - if (IS_ERR_OR_NULL(dent)) |
---|
3048 | | - goto out_remove; |
---|
3049 | | - dfs_chk_lprops = dent; |
---|
| 2960 | + dfs_chk_lprops = debugfs_create_file(fname, S_IRUSR | S_IWUSR, |
---|
| 2961 | + dfs_rootdir, NULL, &dfs_global_fops); |
---|
3050 | 2962 | |
---|
3051 | 2963 | fname = "chk_fs"; |
---|
3052 | | - dent = debugfs_create_file(fname, S_IRUSR | S_IWUSR, dfs_rootdir, NULL, |
---|
3053 | | - &dfs_global_fops); |
---|
3054 | | - if (IS_ERR_OR_NULL(dent)) |
---|
3055 | | - goto out_remove; |
---|
3056 | | - dfs_chk_fs = dent; |
---|
| 2964 | + dfs_chk_fs = debugfs_create_file(fname, S_IRUSR | S_IWUSR, dfs_rootdir, |
---|
| 2965 | + NULL, &dfs_global_fops); |
---|
3057 | 2966 | |
---|
3058 | 2967 | fname = "tst_recovery"; |
---|
3059 | | - dent = debugfs_create_file(fname, S_IRUSR | S_IWUSR, dfs_rootdir, NULL, |
---|
3060 | | - &dfs_global_fops); |
---|
3061 | | - if (IS_ERR_OR_NULL(dent)) |
---|
3062 | | - goto out_remove; |
---|
3063 | | - dfs_tst_rcvry = dent; |
---|
3064 | | - |
---|
3065 | | - return 0; |
---|
3066 | | - |
---|
3067 | | -out_remove: |
---|
3068 | | - debugfs_remove_recursive(dfs_rootdir); |
---|
3069 | | -out: |
---|
3070 | | - err = dent ? PTR_ERR(dent) : -ENODEV; |
---|
3071 | | - pr_err("UBIFS error (pid %d): cannot create \"%s\" debugfs file or directory, error %d\n", |
---|
3072 | | - current->pid, fname, err); |
---|
3073 | | - return err; |
---|
| 2968 | + dfs_tst_rcvry = debugfs_create_file(fname, S_IRUSR | S_IWUSR, |
---|
| 2969 | + dfs_rootdir, NULL, &dfs_global_fops); |
---|
3074 | 2970 | } |
---|
3075 | 2971 | |
---|
3076 | 2972 | /** |
---|
.. | .. |
---|
3078 | 2974 | */ |
---|
3079 | 2975 | void dbg_debugfs_exit(void) |
---|
3080 | 2976 | { |
---|
3081 | | - if (IS_ENABLED(CONFIG_DEBUG_FS)) |
---|
3082 | | - debugfs_remove_recursive(dfs_rootdir); |
---|
| 2977 | + debugfs_remove_recursive(dfs_rootdir); |
---|
3083 | 2978 | } |
---|
3084 | 2979 | |
---|
3085 | 2980 | void ubifs_assert_failed(struct ubifs_info *c, const char *expr, |
---|