dm ioctl: report event number in DM_LIST_DEVICES
authorMikulas Patocka <mpatocka@redhat.com>
Mon, 16 Jan 2017 21:07:01 +0000 (16:07 -0500)
committerMike Snitzer <snitzer@redhat.com>
Mon, 19 Jun 2017 15:03:50 +0000 (11:03 -0400)
Report the event numbers for all the devices, so that the user doesn't
have to ask them one by one.  The event number is reported after the
name field in the dm_name_list structure.

The location of the next record is specified in the dm_name_list->next
field, that means that we can put the new data after the end of name and
it is backward compatible with the old code.  The old code just skips
the event number without interpreting it.

Signed-off-by: Mikulas Patocka <mpatocka@redhat.com>
Signed-off-by: Andy Grover <agrover@redhat.com>
Signed-off-by: Mike Snitzer <snitzer@redhat.com>
drivers/md/dm-ioctl.c

index a69658b18dc9f59117604fab07aaa398ba7980f8..e06f0ef7d2ecf2b12beb1d13b6ae2f35580be885 100644 (file)
@@ -506,6 +506,7 @@ static int list_devices(struct file *filp, struct dm_ioctl *param, size_t param_
        size_t len, needed = 0;
        struct gendisk *disk;
        struct dm_name_list *nl, *old_nl = NULL;
+       uint32_t *event_nr;
 
        down_write(&_hash_lock);
 
@@ -518,6 +519,7 @@ static int list_devices(struct file *filp, struct dm_ioctl *param, size_t param_
                        needed += sizeof(struct dm_name_list);
                        needed += strlen(hc->name) + 1;
                        needed += ALIGN_MASK;
+                       needed += (sizeof(uint32_t) + ALIGN_MASK) & ~ALIGN_MASK;
                }
        }
 
@@ -547,7 +549,9 @@ static int list_devices(struct file *filp, struct dm_ioctl *param, size_t param_
                        strcpy(nl->name, hc->name);
 
                        old_nl = nl;
-                       nl = align_ptr(((void *) ++nl) + strlen(hc->name) + 1);
+                       event_nr = align_ptr(((void *) (nl + 1)) + strlen(hc->name) + 1);
+                       *event_nr = dm_get_event_nr(hc->md);
+                       nl = align_ptr(event_nr + 1);
                }
        }