diff --git a/daemon/devsparts.ml b/daemon/devsparts.ml index c082c32fb..59e66e82e 100644 --- a/daemon/devsparts.ml +++ b/daemon/devsparts.ml @@ -111,14 +111,3 @@ let is_whole_device device = try ignore (stat devpath); true with Unix_error ((ENOENT|ENOTDIR), _, _) -> false - -let device_index device = - (* This is the algorithm which was used by the C version. Why - * can't we use drive_index from C_utils? XXX - *) - let rec loop i = function - | [] -> failwithf "%s: device not found" device - | dev :: devices when dev = device -> i - | _ :: devices -> loop (i+1) devices - in - loop 0 (list_devices ()) diff --git a/daemon/inspect_utils.ml b/daemon/inspect_utils.ml index ea444afe6..e9aa8221f 100644 --- a/daemon/inspect_utils.ml +++ b/daemon/inspect_utils.ml @@ -148,11 +148,7 @@ and is_dir_nocase path = * the old C inspection code. XXX fix function and callers *) let is_partition partition = - try - let device = Devsparts.part_to_dev partition in - ignore (Devsparts.device_index device); - true - with _ -> false + try Devsparts.part_to_dev partition <> partition with _ -> false let re_major_minor = PCRE.compile "(\\d+)\\.(\\d+)" let re_major_no_minor = PCRE.compile "(\\d+)" diff --git a/generator/actions_core.ml b/generator/actions_core.ml index 692015e27..eca52d347 100644 --- a/generator/actions_core.ml +++ b/generator/actions_core.ml @@ -739,6 +739,23 @@ Converted to F form using C. Other strings are returned unmodified." }; + { defaults with + name = "device_index"; added = (1, 19, 7); + style = RInt "index", [String (Device, "device")], []; + tests = [ + InitEmpty, Always, TestResult ( + [["device_index"; "/dev/sda"]], "ret == 0"), [] + ]; + shortdesc = "convert device to index"; + longdesc = "\ +This function takes a device name (eg. \"/dev/sdb\") and +returns the index of the device in the list of devices. + +Index numbers start from 0. The named device must exist, +for example as a string returned from C. + +See also C, C." }; + { defaults with name = "shutdown"; added = (1, 19, 16); style = RErr, [], []; @@ -7423,24 +7440,6 @@ different operation that turns free space in the filesystem into zeroes. It is valid to call C either instead of, or after calling C." }; - { defaults with - name = "device_index"; added = (1, 19, 7); - style = RInt "index", [String (Device, "device")], []; - impl = OCaml "Devsparts.device_index"; - tests = [ - InitEmpty, Always, TestResult ( - [["device_index"; "/dev/sda"]], "ret == 0"), [] - ]; - shortdesc = "convert device to index"; - longdesc = "\ -This function takes a device name (eg. \"/dev/sdb\") and -returns the index of the device in the list of devices. - -Index numbers start from 0. The named device must exist, -for example as a string returned from C. - -See also C, C." }; - { defaults with name = "nr_devices"; added = (1, 19, 15); impl = OCaml "Devsparts.nr_devices"; diff --git a/generator/proc_nr.ml b/generator/proc_nr.ml index 11a557076..5604662f4 100644 --- a/generator/proc_nr.ml +++ b/generator/proc_nr.ml @@ -345,7 +345,6 @@ let proc_nr = [ 332, "btrfs_fsck"; 333, "filesystem_available"; 334, "fstrim"; -335, "device_index"; 336, "nr_devices"; 337, "xfs_info"; 338, "pvchange_uuid"; diff --git a/lib/drives.c b/lib/drives.c index bba6ff74e..46af66db4 100644 --- a/lib/drives.c +++ b/lib/drives.c @@ -1148,3 +1148,21 @@ free_drive_source (struct drive_source *src) free_drive_servers (src->servers, src->nr_servers); } } + +int +guestfs_impl_device_index (guestfs_h *g, const char *device) +{ + size_t len; + ssize_t r = -1; + + /* /dev/hd etc. */ + if (STRPREFIX (device, "/dev/") && + strchr (device+5, '/') == NULL && /* not an LV name */ + device[5] != 'm' && /* not /dev/md - RHBZ#1414682 */ + ((len = strcspn (device+5, "d")) > 0 && len <= 2)) + r = guestfs_int_drive_index (device+5+len+1); + + if (r == -1) + error (g, _("%s: device not found"), device); + return r; +}