mirror of
https://github.com/kdave/btrfs-progs
synced 2024-12-26 08:02:21 +00:00
4fc17596aa
New option to subvolume list that acts as a global filter and applies the other filters to either live subvolumes or the uncleaned ones. The path to the deleted subvolumes is lost at the deletion time, sample output looks like: ID 259 gen 7 top level 0 path <FS_TREE>/DELETED Signed-off-by: David Sterba <dsterba@suse.cz> Signed-off-by: Chris Mason <chris.mason@fusionio.com>
166 lines
4.4 KiB
C
166 lines
4.4 KiB
C
/*
|
|
* Copyright (C) 2012 Fujitsu. All rights reserved.
|
|
*
|
|
* 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.
|
|
*/
|
|
|
|
#if BTRFS_FLAT_INCLUDES
|
|
#include "kerncompat.h"
|
|
#else
|
|
#include <btrfs/kerncompat.h>
|
|
#endif /* BTRFS_FLAT_INCLUDES */
|
|
|
|
#define BTRFS_LIST_LAYOUT_DEFAULT 0
|
|
#define BTRFS_LIST_LAYOUT_TABLE 1
|
|
#define BTRFS_LIST_LAYOUT_RAW 2
|
|
|
|
/*
|
|
* one of these for each root we find.
|
|
*/
|
|
struct root_info {
|
|
struct rb_node rb_node;
|
|
struct rb_node sort_node;
|
|
|
|
/* this root's id */
|
|
u64 root_id;
|
|
|
|
/* equal the offset of the root's key */
|
|
u64 root_offset;
|
|
|
|
/* flags of the root */
|
|
u64 flags;
|
|
|
|
/* the id of the root that references this one */
|
|
u64 ref_tree;
|
|
|
|
/* the dir id we're in from ref_tree */
|
|
u64 dir_id;
|
|
|
|
u64 top_id;
|
|
|
|
/* generation when the root is created or last updated */
|
|
u64 gen;
|
|
|
|
/* creation generation of this root in sec*/
|
|
u64 ogen;
|
|
|
|
/* creation time of this root in sec*/
|
|
time_t otime;
|
|
|
|
u8 uuid[BTRFS_UUID_SIZE];
|
|
u8 puuid[BTRFS_UUID_SIZE];
|
|
|
|
/* path from the subvol we live in to this root, including the
|
|
* root's name. This is null until we do the extra lookup ioctl.
|
|
*/
|
|
char *path;
|
|
|
|
/* the name of this root in the directory it lives in */
|
|
char *name;
|
|
|
|
char *full_path;
|
|
|
|
int deleted;
|
|
};
|
|
|
|
typedef int (*btrfs_list_filter_func)(struct root_info *, u64);
|
|
typedef int (*btrfs_list_comp_func)(struct root_info *, struct root_info *,
|
|
int);
|
|
|
|
struct btrfs_list_filter {
|
|
btrfs_list_filter_func filter_func;
|
|
u64 data;
|
|
};
|
|
|
|
struct btrfs_list_comparer {
|
|
btrfs_list_comp_func comp_func;
|
|
int is_descending;
|
|
};
|
|
|
|
struct btrfs_list_filter_set {
|
|
int total;
|
|
int nfilters;
|
|
int only_deleted;
|
|
struct btrfs_list_filter filters[0];
|
|
};
|
|
|
|
struct btrfs_list_comparer_set {
|
|
int total;
|
|
int ncomps;
|
|
struct btrfs_list_comparer comps[0];
|
|
};
|
|
|
|
enum btrfs_list_column_enum {
|
|
BTRFS_LIST_OBJECTID,
|
|
BTRFS_LIST_GENERATION,
|
|
BTRFS_LIST_OGENERATION,
|
|
BTRFS_LIST_PARENT,
|
|
BTRFS_LIST_TOP_LEVEL,
|
|
BTRFS_LIST_OTIME,
|
|
BTRFS_LIST_PUUID,
|
|
BTRFS_LIST_UUID,
|
|
BTRFS_LIST_PATH,
|
|
BTRFS_LIST_ALL,
|
|
};
|
|
|
|
enum btrfs_list_filter_enum {
|
|
BTRFS_LIST_FILTER_ROOTID,
|
|
BTRFS_LIST_FILTER_SNAPSHOT_ONLY,
|
|
BTRFS_LIST_FILTER_FLAGS,
|
|
BTRFS_LIST_FILTER_GEN,
|
|
BTRFS_LIST_FILTER_GEN_EQUAL = BTRFS_LIST_FILTER_GEN,
|
|
BTRFS_LIST_FILTER_GEN_LESS,
|
|
BTRFS_LIST_FILTER_GEN_MORE,
|
|
BTRFS_LIST_FILTER_CGEN,
|
|
BTRFS_LIST_FILTER_CGEN_EQUAL = BTRFS_LIST_FILTER_CGEN,
|
|
BTRFS_LIST_FILTER_CGEN_LESS,
|
|
BTRFS_LIST_FILTER_CGEN_MORE,
|
|
BTRFS_LIST_FILTER_TOPID_EQUAL,
|
|
BTRFS_LIST_FILTER_FULL_PATH,
|
|
BTRFS_LIST_FILTER_BY_PARENT,
|
|
BTRFS_LIST_FILTER_DELETED,
|
|
BTRFS_LIST_FILTER_MAX,
|
|
};
|
|
|
|
enum btrfs_list_comp_enum {
|
|
BTRFS_LIST_COMP_ROOTID,
|
|
BTRFS_LIST_COMP_OGEN,
|
|
BTRFS_LIST_COMP_GEN,
|
|
BTRFS_LIST_COMP_PATH,
|
|
BTRFS_LIST_COMP_MAX,
|
|
};
|
|
|
|
int btrfs_list_parse_sort_string(char *optarg,
|
|
struct btrfs_list_comparer_set **comps);
|
|
int btrfs_list_parse_filter_string(char *optarg,
|
|
struct btrfs_list_filter_set **filters,
|
|
enum btrfs_list_filter_enum type);
|
|
void btrfs_list_setup_print_column(enum btrfs_list_column_enum column);
|
|
struct btrfs_list_filter_set *btrfs_list_alloc_filter_set(void);
|
|
void btrfs_list_free_filter_set(struct btrfs_list_filter_set *filter_set);
|
|
int btrfs_list_setup_filter(struct btrfs_list_filter_set **filter_set,
|
|
enum btrfs_list_filter_enum filter, u64 data);
|
|
struct btrfs_list_comparer_set *btrfs_list_alloc_comparer_set(void);
|
|
void btrfs_list_free_comparer_set(struct btrfs_list_comparer_set *comp_set);
|
|
|
|
int btrfs_list_subvols_print(int fd, struct btrfs_list_filter_set *filter_set,
|
|
struct btrfs_list_comparer_set *comp_set,
|
|
int is_tab_result, int full_path, char *raw_prefix);
|
|
int btrfs_list_find_updated_files(int fd, u64 root_id, u64 oldest_gen);
|
|
int btrfs_list_get_default_subvolume(int fd, u64 *default_id);
|
|
char *btrfs_list_path_for_root(int fd, u64 root);
|
|
int btrfs_list_get_path_rootid(int fd, u64 *treeid);
|
|
int btrfs_get_subvol(int fd, struct root_info *the_ri);
|