rmustacc commented on this pull request.
> @@ -416,6 +416,7 @@ enum { #define VSW_XID 0x40 /* file system supports extended ids */ #define VSW_CANLOFI 0x80 /* file system supports lofi mounts */ #define VSW_ZMOUNT 0x100 /* file system always allowed in a zone */ +#define VSW_MOUNTDEV 0x200 /* file system is mounted via device path */ I thought we had said this was being pulled out into a separate change? > - if (verbose) - report_mount_progress(i, count); - - if (share_mount_one(dslist[i], op, flags, protocol, - B_FALSE, options) != 0) - ret = 1; - zfs_close(dslist[i]); - } + share_mount_state_t share_mount_state = { 0 }; + share_mount_state.sm_op = op; + share_mount_state.sm_verbose = verbose; + share_mount_state.sm_flags = flags; + share_mount_state.sm_options = options; + share_mount_state.sm_proto = protocol; + share_mount_state.sm_total = cb.cb_used; + (void) mutex_init(&share_mount_state.sm_lock, USYNC_THREAD, Missing LOCK_ERRORCHECK > @@ -785,6 +786,7 @@ libzfs_mnttab_cache_compare(const void *arg1, const void > *arg2) void libzfs_mnttab_init(libzfs_handle_t *hdl) { + (void) mutex_init(&hdl->libzfs_mnttab_cache_lock, USYNC_THREAD, NULL); Missing LOCK_ERRORCHECK > @@ -854,16 +858,18 @@ libzfs_mnttab_find(libzfs_handle_t *hdl, const char > *fsname, return (ENOENT); } + (void) mutex_lock(&hdl->libzfs_mnttab_cache_lock); Use mutex_enter(), the version in user land. It will do all the error checking and abort appropriately. Otherwise, you need to check the return value and blow up if it's non-zero so we abort on deadlock. > } - return (ENOENT); + (void) mutex_unlock(&hdl->libzfs_mnttab_cache_lock); Use mutex_exit(), the version in user land. It will do all the error checking and abort appropriately. Otherwise, you need to check the return value and blow up if it's non-zero so we abort on deadlock or unlocking a lock that we didn't own. > @@ -872,14 +878,16 @@ libzfs_mnttab_add(libzfs_handle_t *hdl, const char > *special, { mnttab_node_t *mtn; - if (avl_numnodes(&hdl->libzfs_mnttab_cache) == 0) - return; - mtn = zfs_alloc(hdl, sizeof (mnttab_node_t)); - mtn->mtn_mt.mnt_special = zfs_strdup(hdl, special); - mtn->mtn_mt.mnt_mountp = zfs_strdup(hdl, mountp); - mtn->mtn_mt.mnt_fstype = zfs_strdup(hdl, MNTTYPE_ZFS); - mtn->mtn_mt.mnt_mntopts = zfs_strdup(hdl, mntopts); - avl_add(&hdl->libzfs_mnttab_cache, mtn); + (void) mutex_lock(&hdl->libzfs_mnttab_cache_lock); Use mutex_enter(), the version in user land. It will do all the error checking and abort appropriately. Otherwise, you need to check the return value and blow up if it's non-zero so we abort on deadlock. > - mtn = zfs_alloc(hdl, sizeof (mnttab_node_t)); - mtn->mtn_mt.mnt_special = zfs_strdup(hdl, special); - mtn->mtn_mt.mnt_mountp = zfs_strdup(hdl, mountp); - mtn->mtn_mt.mnt_fstype = zfs_strdup(hdl, MNTTYPE_ZFS); - mtn->mtn_mt.mnt_mntopts = zfs_strdup(hdl, mntopts); - avl_add(&hdl->libzfs_mnttab_cache, mtn); + (void) mutex_lock(&hdl->libzfs_mnttab_cache_lock); + if (avl_numnodes(&hdl->libzfs_mnttab_cache) != 0) { + mtn = zfs_alloc(hdl, sizeof (mnttab_node_t)); + mtn->mtn_mt.mnt_special = zfs_strdup(hdl, special); + mtn->mtn_mt.mnt_mountp = zfs_strdup(hdl, mountp); + mtn->mtn_mt.mnt_fstype = zfs_strdup(hdl, MNTTYPE_ZFS); + mtn->mtn_mt.mnt_mntopts = zfs_strdup(hdl, mntopts); + avl_add(&hdl->libzfs_mnttab_cache, mtn); + } + (void) mutex_unlock(&hdl->libzfs_mnttab_cache_lock); Use mutex_exit(), the version in user land. It will do all the error checking and abort appropriately. Otherwise, you need to check the return value and blow up if it's non-zero so we abort on deadlock or unlocking a lock that we didn't own. > @@ -888,6 +896,7 @@ libzfs_mnttab_remove(libzfs_handle_t *hdl, const char > *fsname) mnttab_node_t find; mnttab_node_t *ret; + (void) mutex_lock(&hdl->libzfs_mnttab_cache_lock); Same mutex comments. > @@ -898,6 +907,7 @@ libzfs_mnttab_remove(libzfs_handle_t *hdl, const char > *fsname) free(ret->mtn_mt.mnt_mntopts); free(ret); } + (void) mutex_unlock(&hdl->libzfs_mnttab_cache_lock); Same mutex comments. > @@ -88,6 +89,9 @@ #include <sys/systeminfo.h> #define MAXISALEN 257 /* based on sysinfo(2) man page */ +static int mount_tq_nthr = 512; /* taskq threads for multi-threaded mounting */ How did we determine this number? How does this change if you're not in the global zone trying to mount a lot of things and you have CPU caps that limit the amount of parallelism? > + */ +static void +zfs_dispatch_mount(libzfs_handle_t *hdl, zfs_handle_t **handles, + size_t num_handles, int idx, zfs_iter_f func, void *data, taskq_t *tq) +{ + mnt_param_t *mnt_param = zfs_alloc(hdl, sizeof (mnt_param_t)); + + mnt_param->mnt_hdl = hdl; + mnt_param->mnt_tq = tq; + mnt_param->mnt_zhps = handles; + mnt_param->mnt_num_handles = num_handles; + mnt_param->mnt_idx = idx; + mnt_param->mnt_func = func; + mnt_param->mnt_data = data; + + (void) taskq_dispatch(tq, zfs_mount_task, (void*)mnt_param, TQ_SLEEP); In this case if we run low on memory this means we'll abort, right? Is that what we want? > @@ -150,7 +151,7 @@ static vfsdef_t vfw = { "hsfs", hsfsinit, /* We don't suppport remounting */ - VSW_HASPROTO|VSW_STATS|VSW_CANLOFI, + VSW_HASPROTO|VSW_STATS|VSW_CANLOFI|VSW_MOUNTDEV, Here and all the others, aren't these supposed to be pulled out? -- You are receiving this because you are subscribed to this thread. Reply to this email directly or view it on GitHub: https://github.com/openzfs/openzfs/pull/536#pullrequestreview-95628091 ------------------------------------------ openzfs-developer Archives: https://openzfs.topicbox.com/groups/developer/discussions/T22334a01fda83bfd-M8e229549658a3dee38c18959 Powered by Topicbox: https://topicbox.com