- memset(&arg, 0, sizeof(arg));
- strncpy_null(arg.name, argv[i]);
- res = ioctl(fdmnt, BTRFS_IOC_RM_DEV, &arg);
- e = errno;
+
+ /*
+ * Positive values are from BTRFS_ERROR_DEV_*,
+ * otherwise it's a generic error, one of errnos
+ */
+ res = ioctl(fdmnt, BTRFS_IOC_RM_DEV_V2, &argv2);
+
+ /*
+ * If BTRFS_IOC_RM_DEV_V2 is not supported we get ENOTTY and if
+ * argv2.flags includes a flag which kernel doesn't understand then
+ * we shall get EOPNOTSUPP
+ */
+ if (res < 0 && (errno == ENOTTY || errno == EOPNOTSUPP)) {
+ if (is_devid) {
+ error("device delete by id failed: %s",
+ strerror(errno));
+ ret++;
+ continue;
+ }
+ memset(&arg, 0, sizeof(arg));
+ strncpy_null(arg.name, argv[i]);
+ res = ioctl(fdmnt, BTRFS_IOC_RM_DEV, &arg);
+ }
+