From owner-svn-src-all@freebsd.org Sun Dec 11 19:50:41 2016 Return-Path: Delivered-To: svn-src-all@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 1FD10C727FC; Sun, 11 Dec 2016 19:50:41 +0000 (UTC) (envelope-from mav@FreeBSD.org) Received: from repo.freebsd.org (repo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id EE9E41E98; Sun, 11 Dec 2016 19:50:40 +0000 (UTC) (envelope-from mav@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id uBBJoeg6007805; Sun, 11 Dec 2016 19:50:40 GMT (envelope-from mav@FreeBSD.org) Received: (from mav@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id uBBJoeSo007804; Sun, 11 Dec 2016 19:50:40 GMT (envelope-from mav@FreeBSD.org) Message-Id: <201612111950.uBBJoeSo007804@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: mav set sender to mav@FreeBSD.org using -f From: Alexander Motin Date: Sun, 11 Dec 2016 19:50:40 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r309856 - head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 11 Dec 2016 19:50:41 -0000 Author: mav Date: Sun Dec 11 19:50:39 2016 New Revision: 309856 URL: https://svnweb.freebsd.org/changeset/base/309856 Log: Postpone ZVOL media/block size caching till first open. At least on FreeBSD there are no legal way to access media or get its size without opening device/provider first. Postponing this caching allows to skip several disk seeks per ZVOL/snapshot during import. For HDD pool with 1 ZVOL in dev mode with 1000 snapshots this reduces pool import time from 40 to 10 seconds. MFC after: 2 weeks Sponsored by: iXsystems, Inc. Modified: head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zvol.c Modified: head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zvol.c ============================================================================== --- head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zvol.c Sun Dec 11 19:24:41 2016 (r309855) +++ head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zvol.c Sun Dec 11 19:50:39 2016 (r309856) @@ -585,14 +585,14 @@ zvol_create_minor(const char *name) zfs_soft_state_t *zs; zvol_state_t *zv; objset_t *os; - dmu_object_info_t doi; #ifdef illumos + dmu_object_info_t doi; minor_t minor = 0; char chrbuf[30], blkbuf[30]; #else struct g_provider *pp; struct g_geom *gp; - uint64_t volsize, mode; + uint64_t mode; #endif int error; @@ -658,20 +658,12 @@ zvol_create_minor(const char *name) zv = kmem_zalloc(sizeof(*zv), KM_SLEEP); zv->zv_state = 0; - error = zap_lookup(os, ZVOL_ZAP_OBJ, "size", 8, 1, &volsize); - if (error) { - kmem_free(zv, sizeof(*zv)); - dmu_objset_disown(os, zvol_tag); - mutex_exit(&zfsdev_state_lock); - return (error); - } error = dsl_prop_get_integer(name, zfs_prop_to_name(ZFS_PROP_VOLMODE), &mode, NULL); if (error != 0 || mode == ZFS_VOLMODE_DEFAULT) mode = volmode; DROP_GIANT(); - zv->zv_volsize = volsize; zv->zv_volmode = mode; if (zv->zv_volmode == ZFS_VOLMODE_GEOM) { g_topology_lock(); @@ -681,7 +673,7 @@ zvol_create_minor(const char *name) pp = g_new_providerf(gp, "%s/%s", ZVOL_DRIVER, name); pp->flags |= G_PF_DIRECT_RECEIVE | G_PF_DIRECT_SEND; pp->sectorsize = DEV_BSIZE; - pp->mediasize = zv->zv_volsize; + pp->mediasize = 0; pp->private = zv; zv->zv_provider = pp; @@ -724,10 +716,12 @@ zvol_create_minor(const char *name) sizeof (rl_t), offsetof(rl_t, r_node)); list_create(&zv->zv_extents, sizeof (zvol_extent_t), offsetof(zvol_extent_t, ze_node)); +#ifdef illumos /* get and cache the blocksize */ error = dmu_object_info(os, ZVOL_OBJ, &doi); ASSERT(error == 0); zv->zv_volblocksize = doi.doi_data_block_size; +#endif if (spa_writeable(dmu_objset_spa(os))) { if (zil_replay_disable) @@ -819,6 +813,7 @@ zvol_remove_minor(const char *name) int zvol_first_open(zvol_state_t *zv) { + dmu_object_info_t doi; objset_t *os; uint64_t volsize; int error; @@ -838,6 +833,15 @@ zvol_first_open(zvol_state_t *zv) return (error); } + /* get and cache the blocksize */ + error = dmu_object_info(os, ZVOL_OBJ, &doi); + if (error) { + ASSERT(error == 0); + dmu_objset_disown(os, zvol_tag); + return (error); + } + zv->zv_volblocksize = doi.doi_data_block_size; + error = dmu_bonus_hold(os, ZVOL_OBJ, zvol_tag, &zv->zv_dbuf); if (error) { dmu_objset_disown(os, zvol_tag);