mirror of
https://github.com/kdave/btrfs-progs
synced 2024-12-15 10:55:51 +00:00
7985fe64e0
Until now if one of device's first superblock is corrupt,btrfs will fail to mount. Luckily, btrfs have at least two superblocks for every disk. In theory, if silent corrupting happens when we are writting superblocks into disk, we must hold at least one good superblock. One side effect is that user must gurantee that the disk must be a btrfs disk. Otherwise, this tool may destroy other fs.(This is also reason why btrfs only use first superblock in every disk to mount) This little program will try to correct bad superblocks from good superblocks with max generation. There will be five kinds of return values: 0: all supers are valid, no need to recover 1: usage or syntax error 2: recover all bad superblocks successfully 3: fail to recover bad superblocks 4: abort to recover bad superblocks Signed-off-by: Wang Shilong <wangsl.fnst@cn.fujitsu.com> Signed-off-by: David Sterba <dsterba@suse.cz> Signed-off-by: Chris Mason <chris.mason@fusionio.com>
129 lines
4.5 KiB
C
129 lines
4.5 KiB
C
/*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public
|
|
* License v2 as published by the Free Software Foundation.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
* General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public
|
|
* License along with this program; if not, write to the
|
|
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
|
* Boston, MA 021110-1307, USA.
|
|
*/
|
|
|
|
#define ARGV0_BUF_SIZE 64
|
|
|
|
struct cmd_struct {
|
|
const char *token;
|
|
int (*fn)(int, char **);
|
|
|
|
/*
|
|
* Usage strings
|
|
*
|
|
* A NULL-terminated array of the following format:
|
|
*
|
|
* usagestr[0] - one-line synopsis (required)
|
|
* usagestr[1] - one-line short description (required)
|
|
* usagestr[2..m] - a long (possibly multi-line) description
|
|
* (optional)
|
|
* usagestr[m + 1] - an empty line separator (required if at least one
|
|
* option string is given, not needed otherwise)
|
|
* usagestr[m + 2..n] - option strings, one option per line
|
|
* (optional)
|
|
* usagestr[n + 1] - NULL terminator
|
|
*
|
|
* Options (if present) should always (even if there is no long
|
|
* description) be prepended with an empty line. Supplied strings are
|
|
* indented but otherwise printed as-is, no automatic wrapping is done.
|
|
*
|
|
* Grep for cmd_*_usage[] for examples.
|
|
*/
|
|
const char * const *usagestr;
|
|
|
|
/* should be NULL if token is not a subgroup */
|
|
const struct cmd_group *next;
|
|
|
|
/* if true don't list this token in help listings */
|
|
int hidden;
|
|
};
|
|
|
|
#define NULL_CMD_STRUCT {NULL, NULL, NULL, NULL, 0}
|
|
|
|
struct cmd_group {
|
|
const char * const *usagestr;
|
|
const char *infostr;
|
|
|
|
const struct cmd_struct commands[];
|
|
};
|
|
|
|
/* btrfs.c */
|
|
int prefixcmp(const char *str, const char *prefix);
|
|
|
|
int check_argc_exact(int nargs, int expected);
|
|
int check_argc_min(int nargs, int expected);
|
|
int check_argc_max(int nargs, int expected);
|
|
|
|
int handle_command_group(const struct cmd_group *grp, int argc,
|
|
char **argv);
|
|
|
|
/* help.c */
|
|
extern const char * const generic_cmd_help_usage[];
|
|
|
|
void usage(const char * const *usagestr) __attribute__((noreturn));
|
|
void usage_command(const struct cmd_struct *cmd, int full, int err);
|
|
void usage_command_group(const struct cmd_group *grp, int all, int err);
|
|
|
|
void help_unknown_token(const char *arg, const struct cmd_group *grp) __attribute__((noreturn));
|
|
void help_ambiguous_token(const char *arg, const struct cmd_group *grp) __attribute__((noreturn));
|
|
|
|
void help_command_group(const struct cmd_group *grp, int argc, char **argv);
|
|
|
|
extern const struct cmd_group subvolume_cmd_group;
|
|
extern const struct cmd_group filesystem_cmd_group;
|
|
extern const struct cmd_group balance_cmd_group;
|
|
extern const struct cmd_group device_cmd_group;
|
|
extern const struct cmd_group scrub_cmd_group;
|
|
extern const struct cmd_group inspect_cmd_group;
|
|
extern const struct cmd_group quota_cmd_group;
|
|
extern const struct cmd_group qgroup_cmd_group;
|
|
extern const struct cmd_group replace_cmd_group;
|
|
extern const struct cmd_group rescue_cmd_group;
|
|
|
|
extern const char * const cmd_send_usage[];
|
|
extern const char * const cmd_receive_usage[];
|
|
extern const char * const cmd_check_usage[];
|
|
extern const char * const cmd_chunk_recover_usage[];
|
|
extern const char * const cmd_super_recover_usage[];
|
|
extern const char * const cmd_restore_usage[];
|
|
extern const char * const cmd_rescue_usage[];
|
|
|
|
int cmd_subvolume(int argc, char **argv);
|
|
int cmd_filesystem(int argc, char **argv);
|
|
int cmd_balance(int argc, char **argv);
|
|
int cmd_device(int argc, char **argv);
|
|
int cmd_scrub(int argc, char **argv);
|
|
int cmd_check(int argc, char **argv);
|
|
int cmd_chunk_recover(int argc, char **argv);
|
|
int cmd_super_recover(int argc, char **argv);
|
|
int cmd_inspect(int argc, char **argv);
|
|
int cmd_send(int argc, char **argv);
|
|
int cmd_receive(int argc, char **argv);
|
|
int cmd_quota(int argc, char **argv);
|
|
int cmd_qgroup(int argc, char **argv);
|
|
int cmd_replace(int argc, char **argv);
|
|
int cmd_restore(int argc, char **argv);
|
|
int cmd_select_super(int argc, char **argv);
|
|
int cmd_dump_super(int argc, char **argv);
|
|
int cmd_debug_tree(int argc, char **argv);
|
|
int cmd_rescue(int argc, char **argv);
|
|
|
|
/* subvolume exported functions */
|
|
int test_issubvolume(char *path);
|
|
|
|
/* send.c */
|
|
int find_mount_root(const char *path, char **mount_root);
|
|
char *get_subvol_name(char *mnt, char *full_path);
|