zfs get: don't lookup mount options when using "-s local"

Looking up mount options can be very expensive on servers with many
mounted file systems.  When doing "zfs get" with any "-s" option that
does not include "temporary", the mount list will never be used.  This
commit optimizes for that case.

This is a breaking commit for libzfs!  Callers of zfs_get_prop are now
required to initialize src.  To preserve existing behavior, they should
initialize it to ZPROP_SRC_NONE.

Sponsored by: Axcient
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by: Alan Somers <asomers@gmail.com>
Closes #11955
This commit is contained in:
Alan Somers
2021-04-29 15:19:44 -06:00
committed by GitHub
parent bc9c7265ae
commit e4288a8397
5 changed files with 18 additions and 13 deletions
+12 -7
View File
@@ -2180,7 +2180,8 @@ get_numeric_property(zfs_handle_t *zhp, zfs_prop_t prop, zprop_source_t *src,
* its presence.
*/
if (!zhp->zfs_mntcheck &&
(mntopt_on != NULL || prop == ZFS_PROP_MOUNTED)) {
(mntopt_on != NULL || prop == ZFS_PROP_MOUNTED) &&
(src && (*src & ZPROP_SRC_TEMPORARY))) {
libzfs_handle_t *hdl = zhp->zfs_hdl;
struct mnttab entry;
@@ -2595,9 +2596,16 @@ zcp_check(zfs_handle_t *zhp, zfs_prop_t prop, uint64_t intval,
}
/*
* Retrieve a property from the given object. If 'literal' is specified, then
* numbers are left as exact values. Otherwise, numbers are converted to a
* human-readable form.
* Retrieve a property from the given object.
*
* Arguments:
* src : On call, this must contain the bitmap of ZPROP_SRC_* types to
* query. Properties whose values come from a different source
* may not be returned. NULL will be treated as ZPROP_SRC_ALL. On
* return, if not NULL, this variable will contain the source for
* the queried property.
* literal : If specified, then numbers are left as exact values. Otherwise,
* they are converted to a human-readable form.
*
* Returns 0 on success, or -1 on error.
*/
@@ -2620,9 +2628,6 @@ zfs_prop_get(zfs_handle_t *zhp, zfs_prop_t prop, char *propbuf, size_t proplen,
if (received && zfs_prop_readonly(prop))
return (-1);
if (src)
*src = ZPROP_SRC_NONE;
switch (prop) {
case ZFS_PROP_CREATION:
/*
+1 -1
View File
@@ -575,7 +575,7 @@ get_snapshot_names(differ_info_t *di, const char *fromsnap,
* tosnap is a clone of a fromsnap descendant.
*/
char origin[ZFS_MAX_DATASET_NAME_LEN];
zprop_source_t src;
zprop_source_t src = ZPROP_SRC_NONE;
zfs_handle_t *zhp;
di->ds = zfs_alloc(di->zhp->zfs_hdl, tdslen + 1);
+2 -2
View File
@@ -266,7 +266,7 @@ zfs_is_mountable(zfs_handle_t *zhp, char *buf, size_t buflen,
zprop_source_t *source, int flags)
{
char sourceloc[MAXNAMELEN];
zprop_source_t sourcetype;
zprop_source_t sourcetype = ZPROP_SRC_NONE;
if (!zfs_prop_valid_for_type(ZFS_PROP_MOUNTPOINT, zhp->zfs_type,
B_FALSE))
@@ -765,7 +765,7 @@ zfs_share_proto(zfs_handle_t *zhp, zfs_share_proto_t *proto)
char shareopts[ZFS_MAXPROPLEN];
char sourcestr[ZFS_MAXPROPLEN];
zfs_share_proto_t *curr_proto;
zprop_source_t sourcetype;
zprop_source_t sourcetype = ZPROP_SRC_NONE;
int err = 0;
if (!zfs_is_mountable(zhp, mountpoint, sizeof (mountpoint), NULL, 0))
+1 -1
View File
@@ -2662,7 +2662,7 @@ static zfs_handle_t *
recv_open_grand_origin(zfs_handle_t *zhp)
{
char origin[ZFS_MAX_DATASET_NAME_LEN];
zprop_source_t src;
zprop_source_t src = ZPROP_SRC_NONE;
zfs_handle_t *ozhp = zfs_handle_dup(zhp);
while (ozhp != NULL) {