@@ -775,6 +775,10 @@ const struct filter_class_desc filter_class[] = {
"\t\tmeta, sys, data, raid0, raid1, raid10, dup\n"
"\tPrefix a <flagname> with ~ to negate the match.\n",
BTRFS_BALANCE_FILTER_CHUNK_TYPE },
+ { "devid",
+ "devid=<n>\n"
+ "\tBalance only chunks which have a stripe on device <n>.\n",
+ BTRFS_BALANCE_FILTER_DEVID },
{ NULL, NULL, 0 }
};
@@ -870,6 +874,15 @@ int parse_filter(struct btrfs_ioctl_balance_start *args, char *filters_string)
part = strtok_r(NULL, "=,", &subsave);
}
break;
+
+ case BTRFS_BALANCE_FILTER_DEVID:
+ errno = 0;
+ args->devid = strtoull(part, NULL, 10);
+ if (errno != 0) {
+ fprintf(stderr, "ERROR: '%s' is not a valid device ID\n", part);
+ return 15;
+ }
+ break;
}
this_filter_string = strtok_r(NULL, ":", &saveptr);
@@ -141,7 +141,8 @@ struct btrfs_ioctl_balance_progress {
#define BTRFS_BALANCE_FILTER_COUNT_ONLY 0x1
#define BTRFS_BALANCE_FILTER_CHUNK_TYPE 0x2
-#define BTRFS_BALANCE_FILTER_MASK 0x3
+#define BTRFS_BALANCE_FILTER_DEVID 0x4
+#define BTRFS_BALANCE_FILTER_MASK 0x7
/* All the possible options for a filter */
struct btrfs_ioctl_balance_start {
@@ -155,7 +156,10 @@ struct btrfs_ioctl_balance_start {
__u64 chunk_type; /* Flag bits required */
__u64 chunk_type_mask; /* Mask of bits to examine */
- __u64 spare[507]; /* Make up the size of the structure to 4088
+ /* For FILTER_DEVID */
+ __u64 devid;
+
+ __u64 spare[506]; /* Make up the size of the structure to 4088
* bytes for future expansion */
};
@@ -203,6 +203,13 @@ chunk types.
\fBraid0\fR, \fBraid1\fR, \fBraid10\fR, \fBdup\fR for chunks of the
given replication levels.
+.TP
+\fBdevid\fR=\fI<n>\fR
+
+Select chunks which have data on device ID \fI<n>\fR. This can be
+used, for example, to reduplicate data in a mirrored configuration
+where one drive has been lost due to hardware failure.
+
.SH EXIT STATUS
\fBbtrfs\fR returns a zero exist status if it succeeds. Non zero is returned in
case of failure.
Add the userspace implementation for filtering balances by device ID. Signed-off-by: Hugo Mills <hugo@carfax.org.uk> --- btrfs_cmds.c | 13 +++++++++++++ ioctl.h | 8 ++++++-- man/btrfs.8.in | 7 +++++++ 3 files changed, 26 insertions(+), 2 deletions(-)