Projects
Mega:24.03:SP1:Everything
lvm2
_service:tar_scm:0004-bugfix-add-timeout-when-f...
Sign Up
Log In
Username
Password
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File _service:tar_scm:0004-bugfix-add-timeout-when-fail-to-wait-udev.patch of Package lvm2
diff --git a/libdm/dm-tools/dmsetup.c b/libdm/dm-tools/dmsetup.c index d01b8f2..a5cb551 100644 --- a/libdm/dm-tools/dmsetup.c +++ b/libdm/dm-tools/dmsetup.c @@ -1130,6 +1130,7 @@ out: static int _create_one_device(const char *name, const char *file) { int r = 0; + int udev_wait_r = 1; struct dm_task *dmt; uint32_t cookie = 0; uint16_t udev_flags = 0; @@ -1202,13 +1203,15 @@ static int _create_one_device(const char *name, const char *file) out: if (!_udev_cookie) - (void) dm_udev_wait(cookie); + udev_wait_r = dm_udev_wait(cookie); if (r && _switches[VERBOSE_ARG]) r = _display_info(dmt); dm_task_destroy(dmt); + if (!udev_wait_r) + return 0; return r; } @@ -1431,6 +1434,7 @@ static int _create(CMD_ARGS) static int _do_rename(const char *name, const char *new_name, const char *new_uuid) { int r = 0; + int udev_wait_r = 1; struct dm_task *dmt; uint32_t cookie = 0; uint16_t udev_flags = 0; @@ -1475,10 +1479,13 @@ static int _do_rename(const char *name, const char *new_name, const char *new_uu out: if (!_udev_cookie) - (void) dm_udev_wait(cookie); + udev_wait_r = dm_udev_wait(cookie); dm_task_destroy(dmt); + if (!udev_wait_r) + return 0; + return r; } @@ -1999,6 +2006,7 @@ static int _simple(int task, const char *name, uint32_t event_nr, int display) int udev_wait_flag = task == DM_DEVICE_RESUME || task == DM_DEVICE_REMOVE; int r = 0; + int udev_wait_r = 1; struct dm_task *dmt; @@ -2058,13 +2066,16 @@ static int _simple(int task, const char *name, uint32_t event_nr, int display) out: if (!_udev_cookie && udev_wait_flag) - (void) dm_udev_wait(cookie); + udev_wait_r = dm_udev_wait(cookie); if (r && display && _switches[VERBOSE_ARG]) r = _display_info(dmt); dm_task_destroy(dmt); + if (!udev_wait_r) + return 0; + return r; } diff --git a/libdm/libdm-common.c b/libdm/libdm-common.c index d75c704..e7c00f0 100644 --- a/libdm/libdm-common.c +++ b/libdm/libdm-common.c @@ -59,6 +59,7 @@ union semun #endif #endif +#define UDEV_SEM_TIMEOUT 300 static char _dm_dir[PATH_MAX] = DEV_DIR DM_DIR; static char _sysfs_dir[PATH_MAX] = "/sys/"; static char _path0[PATH_MAX]; /* path buffer, safe 4kB on stack */ @@ -2730,6 +2731,9 @@ static int _udev_wait(uint32_t cookie, int *nowait) int semid; struct sembuf sb = {0, 0, 0}; int val; + struct timespec timeout; + timeout.tv_sec = UDEV_SEM_TIMEOUT; + timeout.tv_nsec = 0; if (!cookie || !dm_udev_get_sync_support()) return 1; @@ -2765,7 +2769,7 @@ static int _udev_wait(uint32_t cookie, int *nowait) cookie, semid); repeat_wait: - if (semop(semid, &sb, 1) < 0) { + if (semtimedop(semid, &sb, 1,&timeout) < 0) { if (errno == EINTR) goto repeat_wait; else if (errno == EIDRM)
Locations
Projects
Search
Status Monitor
Help
Open Build Service
OBS Manuals
API Documentation
OBS Portal
Reporting a Bug
Contact
Mailing List
Forums
Chat (IRC)
Twitter
Open Build Service (OBS)
is an
openSUSE project
.
浙ICP备2022010568号-2