Skip to content

Commit

Permalink
debugvmfs: Handle the lvm variable safely when fs->dev is not an lvm
Browse files Browse the repository at this point in the history
  • Loading branch information
glandium committed Sep 17, 2011
1 parent 15753d5 commit 337f6e8
Show file tree
Hide file tree
Showing 3 changed files with 21 additions and 0 deletions.
12 changes: 12 additions & 0 deletions debugvmfs/variables.c
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,8 @@ static void *get_dirent(void *value, const char *index);
#define free_dirent (void (*)(void *))vmfs_dir_close
static void *get_inode(void *value, const char *index);
#define free_inode (void (*)(void *))vmfs_inode_release
static void *get_lvm(void *value, const char *index);
#define free_lvm NULL

static char *get_value_none(char *buf, void *value, short len);
static char *get_value_uint(char *buf, void *value, short len);
Expand Down Expand Up @@ -198,6 +200,7 @@ static const struct var_member inode[] = {
};

static const struct var_member vmfs_fs[] = {
GET_SUBVAR(vmfs_fs_t, lvm, vmfs_lvm, lvm),
SUBVAR2(vmfs_fs_t, lvm, vmfs_lvm, dev, PTR),
SUBVAR(vmfs_fs_t, fbb, vmfs_bitmap, PTR),
SUBVAR(vmfs_fs_t, fdc, vmfs_bitmap, PTR),
Expand Down Expand Up @@ -727,6 +730,15 @@ static void *get_inode(void *value, const char *index)
return inode;
}

static void *get_lvm(void *value, const char *index)
{
vmfs_fs_t *fs = (vmfs_fs_t *) value;
if (vmfs_device_is_lvm(fs->dev))
return fs->dev;

return NULL;
}

int cmd_show(vmfs_dir_t *base_dir,int argc,char *argv[])
{
char buf[256];
Expand Down
6 changes: 6 additions & 0 deletions libvmfs/vmfs_lvm.c
Original file line number Diff line number Diff line change
Expand Up @@ -194,3 +194,9 @@ int vmfs_lvm_open(vmfs_lvm_t *lvm)
lvm->dev.uuid = &lvm->lvm_info.uuid;
return(0);
}

/* Returns whether a given device is a vmfs_lvm */
bool vmfs_device_is_lvm(vmfs_device_t *dev)
{
return (dev->read == vmfs_lvm_read);
}
3 changes: 3 additions & 0 deletions libvmfs/vmfs_lvm.h
Original file line number Diff line number Diff line change
Expand Up @@ -54,4 +54,7 @@ int vmfs_lvm_add_extent(vmfs_lvm_t *lvm, vmfs_volume_t *vol);
/* Open an LVM */
int vmfs_lvm_open(vmfs_lvm_t *lvm);

/* Returns whether a given device is a vmfs_lvm */
bool vmfs_device_is_lvm(vmfs_device_t *dev);

#endif

0 comments on commit 337f6e8

Please sign in to comment.