Пример #1
0
/*
 * zfs_init_libshare(zhandle, service)
 *
 * Initialize the libshare API if it hasn't already been initialized.
 * In all cases it returns 0 if it succeeded and an error if not. The
 * service value is which part(s) of the API to initialize and is a
 * direct map to the libshare sa_init(service) interface.
 */
int
zfs_init_libshare(libzfs_handle_t *zhandle, int service)
{
    int ret = SA_OK;

    if (_sa_init == NULL)
        ret = SA_CONFIG_ERR;

    if (ret == SA_OK && zhandle->libzfs_shareflags & ZFSSHARE_MISS) {
        /*
         * We had a cache miss. Most likely it is a new ZFS
         * dataset that was just created. We want to make sure
         * so check timestamps to see if a different process
         * has updated any of the configuration. If there was
         * some non-ZFS change, we need to re-initialize the
         * internal cache.
         */
        zhandle->libzfs_shareflags &= ~ZFSSHARE_MISS;
        if (_sa_needs_refresh != NULL &&
                _sa_needs_refresh(zhandle->libzfs_sharehdl)) {
            zfs_uninit_libshare(zhandle);
            zhandle->libzfs_sharehdl = _sa_init(service);
        }
    }

    if (ret == SA_OK && zhandle && zhandle->libzfs_sharehdl == NULL)
        zhandle->libzfs_sharehdl = _sa_init(service);

    if (ret == SA_OK && zhandle->libzfs_sharehdl == NULL)
        ret = SA_NO_MEMORY;

    return (ret);
}
Пример #2
0
/*
 * zfs_init_libshare(zhandle, service)
 *
 * Initialize the libshare API if it hasn't already been initialized.
 * In all cases it returns 0 if it succeeded and an error if not. The
 * service value is which part(s) of the API to initialize and is a
 * direct map to the libshare sa_init(service) interface.
 */
int
zfs_init_libshare(libzfs_handle_t *zhandle, int service)
{
	if (_sa_init == NULL)
		return (SA_CONFIG_ERR);

	/*
	 * Attempt to refresh libshare. This is necessary if there was a cache
	 * miss for a new ZFS dataset that was just created, or if state of the
	 * sharetab file has changed since libshare was last initialized. We
	 * want to make sure so check timestamps to see if a different process
	 * has updated any of the configuration. If there was some non-ZFS
	 * change, we need to re-initialize the internal cache.
	 */
	if (_sa_needs_refresh != NULL &&
	    _sa_needs_refresh(zhandle->libzfs_sharehdl)) {
		zfs_uninit_libshare(zhandle);
		zhandle->libzfs_sharehdl = _sa_init(service);
	}

	if (zhandle && zhandle->libzfs_sharehdl == NULL)
		zhandle->libzfs_sharehdl = _sa_init(service);

	if (zhandle->libzfs_sharehdl == NULL)
		return (SA_NO_MEMORY);

	return (SA_OK);
}