Statically allocate first node of zfsdev_state_list
This avoids a call to kmem_alloc() during module load. It also suppresses a defect report from Clang's static analyzer that claims that we will have a NULL pointer dereference in zfsdev_state_init() because it does not understand that this has already been allocated in zfs_kmod_init(). Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Reviewed-by: Brian Atkinson <batkinson@lanl.gov> Signed-off-by: Richard Yao <richard.yao@alumni.stonybrook.edu> Closes #14470
This commit is contained in:
parent
7fc48f8378
commit
9a14ce43c3
|
@ -222,7 +222,7 @@
|
||||||
#include <sys/zfs_ioctl_impl.h>
|
#include <sys/zfs_ioctl_impl.h>
|
||||||
|
|
||||||
kmutex_t zfsdev_state_lock;
|
kmutex_t zfsdev_state_lock;
|
||||||
static zfsdev_state_t *zfsdev_state_list;
|
static zfsdev_state_t zfsdev_state_listhead;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Limit maximum nvlist size. We don't want users passing in insane values
|
* Limit maximum nvlist size. We don't want users passing in insane values
|
||||||
|
@ -7469,7 +7469,7 @@ zfsdev_getminor(zfs_file_t *fp, minor_t *minorp)
|
||||||
|
|
||||||
mutex_enter(&zfsdev_state_lock);
|
mutex_enter(&zfsdev_state_lock);
|
||||||
|
|
||||||
for (zs = zfsdev_state_list; zs != NULL; zs = zs->zs_next) {
|
for (zs = &zfsdev_state_listhead; zs != NULL; zs = zs->zs_next) {
|
||||||
|
|
||||||
if (zs->zs_minor == -1)
|
if (zs->zs_minor == -1)
|
||||||
continue;
|
continue;
|
||||||
|
@ -7491,7 +7491,7 @@ zfsdev_get_state(minor_t minor, enum zfsdev_state_type which)
|
||||||
{
|
{
|
||||||
zfsdev_state_t *zs;
|
zfsdev_state_t *zs;
|
||||||
|
|
||||||
for (zs = zfsdev_state_list; zs != NULL; zs = zs->zs_next) {
|
for (zs = &zfsdev_state_listhead; zs != NULL; zs = zs->zs_next) {
|
||||||
if (zs->zs_minor == minor) {
|
if (zs->zs_minor == minor) {
|
||||||
membar_consumer();
|
membar_consumer();
|
||||||
switch (which) {
|
switch (which) {
|
||||||
|
@ -7545,7 +7545,7 @@ zfsdev_state_init(void *priv)
|
||||||
if (minor == 0)
|
if (minor == 0)
|
||||||
return (SET_ERROR(ENXIO));
|
return (SET_ERROR(ENXIO));
|
||||||
|
|
||||||
for (zs = zfsdev_state_list; zs != NULL; zs = zs->zs_next) {
|
for (zs = &zfsdev_state_listhead; zs != NULL; zs = zs->zs_next) {
|
||||||
if (zs->zs_minor == -1)
|
if (zs->zs_minor == -1)
|
||||||
break;
|
break;
|
||||||
zsprev = zs;
|
zsprev = zs;
|
||||||
|
@ -7829,8 +7829,7 @@ zfs_kmod_init(void)
|
||||||
zfs_ioctl_init();
|
zfs_ioctl_init();
|
||||||
|
|
||||||
mutex_init(&zfsdev_state_lock, NULL, MUTEX_DEFAULT, NULL);
|
mutex_init(&zfsdev_state_lock, NULL, MUTEX_DEFAULT, NULL);
|
||||||
zfsdev_state_list = kmem_zalloc(sizeof (zfsdev_state_t), KM_SLEEP);
|
zfsdev_state_listhead.zs_minor = -1;
|
||||||
zfsdev_state_list->zs_minor = -1;
|
|
||||||
|
|
||||||
if ((error = zfsdev_attach()) != 0)
|
if ((error = zfsdev_attach()) != 0)
|
||||||
goto out;
|
goto out;
|
||||||
|
@ -7857,7 +7856,7 @@ zfs_kmod_fini(void)
|
||||||
|
|
||||||
mutex_destroy(&zfsdev_state_lock);
|
mutex_destroy(&zfsdev_state_lock);
|
||||||
|
|
||||||
for (zs = zfsdev_state_list; zs != NULL; zs = zsnext) {
|
for (zs = &zfsdev_state_listhead; zs != NULL; zs = zsnext) {
|
||||||
zsnext = zs->zs_next;
|
zsnext = zs->zs_next;
|
||||||
if (zs->zs_onexit)
|
if (zs->zs_onexit)
|
||||||
zfs_onexit_destroy(zs->zs_onexit);
|
zfs_onexit_destroy(zs->zs_onexit);
|
||||||
|
|
Loading…
Reference in New Issue