diff options
-rw-r--r-- | bootstrap.conf | 1 | ||||
-rw-r--r-- | libparted/arch/linux.c | 28 |
2 files changed, 24 insertions, 5 deletions
diff --git a/bootstrap.conf b/bootstrap.conf index 6c9287d..4ca51a7 100644 --- a/bootstrap.conf +++ b/bootstrap.conf @@ -58,6 +58,7 @@ gnulib_modules=" unlink update-copyright useless-if-before-free + usleep vc-list-files version-etc-fsf warnings diff --git a/libparted/arch/linux.c b/libparted/arch/linux.c index 8116c76..73a8e6f 100644 --- a/libparted/arch/linux.c +++ b/libparted/arch/linux.c @@ -2452,17 +2452,35 @@ _disk_sync_part_table (PedDisk* disk) if (lpn < 0) return 0; int ret = 0; - int *ok = ped_malloc(sizeof(int) * lpn); + int *ok = calloc (lpn, sizeof *ok); if (!ok) return 0; int *errnums = ped_malloc(sizeof(int) * lpn); if (!errnums) goto cleanup; - int i; - for (i = 1; i <= lpn; i++) { - ok[i - 1] = _blkpg_remove_partition (disk, i); - errnums[i - 1] = errno; + /* Attempt to remove each and every partition, retrying for + up to max_sleep_seconds upon any failure due to EBUSY. */ + unsigned int sleep_microseconds = 10000; + unsigned int max_sleep_seconds = 1; + unsigned int n_sleep = (max_sleep_seconds + * 1000000 / sleep_microseconds); + int i; + for (i = 0; i < n_sleep; i++) { + if (i) + usleep (sleep_microseconds); + bool busy = false; + int j; + for (j = 0; j < lpn; j++) { + if (!ok[j]) { + ok[j] = _blkpg_remove_partition (disk, j + 1); + errnums[j] = errno; + if (!ok[j] && errnums[j] == EBUSY) + busy = true; + } + } + if (!busy) + break; } for (i = 1; i <= lpn; i++) { |