diff options
Diffstat (limited to 'daemon')
-rw-r--r-- | daemon/daemon.h | 2 | ||||
-rw-r--r-- | daemon/guestfsd.c | 13 | ||||
-rw-r--r-- | daemon/lvm.c | 23 | ||||
-rw-r--r-- | daemon/sfdisk.c | 4 |
4 files changed, 42 insertions, 0 deletions
diff --git a/daemon/daemon.h b/daemon/daemon.h index 70f0beef..553973d9 100644 --- a/daemon/daemon.h +++ b/daemon/daemon.h @@ -51,6 +51,8 @@ extern int shell_quote (char *out, int len, const char *in); extern int device_name_translation (char *device, const char *func); +extern void udev_settle (void); + extern int verbose; /*-- in proto.c --*/ diff --git a/daemon/guestfsd.c b/daemon/guestfsd.c index 0a3e64f5..e5f2cf0b 100644 --- a/daemon/guestfsd.c +++ b/daemon/guestfsd.c @@ -741,3 +741,16 @@ device_name_translation (char *device, const char *func) device[5] = 's'; /* Restore original device name. */ goto error; } + +/* LVM and other commands aren't synchronous, especially when udev is + * involved. eg. You can create or remove some device, but the /dev + * device node won't appear until some time later. This means that + * you get an error if you run one command followed by another. + * Use 'udevadm settle' after certain commands, but don't be too + * fussed if it fails. + */ +void +udev_settle (void) +{ + command (NULL, NULL, "/sbin/udevadm", "settle", NULL); +} diff --git a/daemon/lvm.c b/daemon/lvm.c index 143c5a81..0fba4477 100644 --- a/daemon/lvm.c +++ b/daemon/lvm.c @@ -187,6 +187,9 @@ do_pvcreate (char *device) } free (err); + + udev_settle (); + return 0; } @@ -221,6 +224,9 @@ do_vgcreate (char *volgroup, char **physvols) } free (err); + + udev_settle (); + return 0; } @@ -243,6 +249,9 @@ do_lvcreate (char *logvol, char *volgroup, int mbytes) } free (err); + + udev_settle (); + return 0; } @@ -331,6 +340,8 @@ do_lvm_remove_all (void) } free_strings (xs); + udev_settle (); + /* There, that was easy, sorry about your data. */ return 0; } @@ -352,6 +363,9 @@ do_lvremove (char *device) } free (err); + + udev_settle (); + return 0; } @@ -370,6 +384,9 @@ do_vgremove (char *device) } free (err); + + udev_settle (); + return 0; } @@ -390,6 +407,9 @@ do_pvremove (char *device) } free (err); + + udev_settle (); + return 0; } @@ -442,6 +462,9 @@ do_vg_activate (int activate, char **volgroups) } free (err); + + udev_settle (); + return 0; } diff --git a/daemon/sfdisk.c b/daemon/sfdisk.c index 6ff2736f..5fb30c0e 100644 --- a/daemon/sfdisk.c +++ b/daemon/sfdisk.c @@ -73,6 +73,8 @@ sfdisk (char *device, int n, int cyls, int heads, int sectors, return -1; } + udev_settle (); + return 0; } @@ -110,6 +112,8 @@ sfdisk_flag (char *device, const char *flag) free (err); + udev_settle (); + return out; /* caller frees */ } |