]> sourceware.org Git - lvm2.git/commitdiff
Log cookie values when incrementing/decrementing to give clues about races.
authorAlasdair Kergon <agk@redhat.com>
Fri, 8 Jul 2011 15:34:47 +0000 (15:34 +0000)
committerAlasdair Kergon <agk@redhat.com>
Fri, 8 Jul 2011 15:34:47 +0000 (15:34 +0000)
libdm/libdm-common.c

index 6ea18440942572047adecec9e1b83ed1f7b60ecb..0aacd1f5e2f556e7b808dda8af822cf26f42ee48 100644 (file)
@@ -1240,6 +1240,7 @@ static int _get_cookie_sem(uint32_t cookie, int *semid)
 static int _udev_notify_sem_inc(uint32_t cookie, int semid)
 {
        struct sembuf sb = {0, 1, 0};
+       int val;
 
        if (semop(semid, &sb, 1) < 0) {
                log_error("semid %d: semop failed for cookie 0x%" PRIx32 ": %s",
@@ -1247,8 +1248,15 @@ static int _udev_notify_sem_inc(uint32_t cookie, int semid)
                return 0;
        }
 
-       log_debug("Udev cookie 0x%" PRIx32 " (semid %d) incremented",
-                 cookie, semid);
+       if ((val = semctl(semid, 0, GETVAL)) < 0) {
+               log_error("semid %d: sem_ctl GETVAL failed for "
+                         "cookie 0x%" PRIx32 ": %s",
+                         semid, cookie, strerror(errno));
+               return 0;               
+       }
+
+       log_debug("Udev cookie 0x%" PRIx32 " (semid %d) incremented to %d",
+                 cookie, semid, val);
 
        return 1;
 }
@@ -1256,6 +1264,14 @@ static int _udev_notify_sem_inc(uint32_t cookie, int semid)
 static int _udev_notify_sem_dec(uint32_t cookie, int semid)
 {
        struct sembuf sb = {0, -1, IPC_NOWAIT};
+       int val;
+
+       if ((val = semctl(semid, 0, GETVAL)) < 0) {
+               log_error("semid %d: sem_ctl GETVAL failed for "
+                         "cookie 0x%" PRIx32 ": %s",
+                         semid, cookie, strerror(errno));
+               return 0;
+       }
 
        if (semop(semid, &sb, 1) < 0) {
                switch (errno) {
@@ -1274,8 +1290,8 @@ static int _udev_notify_sem_dec(uint32_t cookie, int semid)
                return 0;
        }
 
-       log_debug("Udev cookie 0x%" PRIx32 " (semid %d) decremented",
-                 cookie, semid);
+       log_debug("Udev cookie 0x%" PRIx32 " (semid %d) decremented to %d",
+                 cookie, semid, val - 1);
 
        return 1;
 }
@@ -1299,6 +1315,7 @@ static int _udev_notify_sem_create(uint32_t *cookie, int *semid)
 {
        int fd;
        int gen_semid;
+       int val;
        uint16_t base_cookie;
        uint32_t gen_cookie;
        union semun sem_arg;
@@ -1359,8 +1376,15 @@ static int _udev_notify_sem_create(uint32_t *cookie, int *semid)
                goto bad;
        }
 
-       log_debug("Udev cookie 0x%" PRIx32 " (semid %d) incremented",
-                 gen_cookie, gen_semid);
+       if ((val = semctl(gen_semid, 0, GETVAL)) < 0) {
+               log_error("semid %d: sem_ctl GETVAL failed for "
+                         "cookie 0x%" PRIx32 ": %s",
+                         gen_semid, gen_cookie, strerror(errno));
+               return 0;               
+       }
+
+       log_debug("Udev cookie 0x%" PRIx32 " (semid %d) incremented to %d",
+                 gen_cookie, gen_semid, val);
 
        if (close(fd))
                stack;
This page took 0.041578 seconds and 5 git commands to generate.