Module Name: src Committed By: mlelstv Date: Sat Feb 29 17:15:43 UTC 2020
Modified Files: src/external/cddl/osnet/dist/uts/common/fs/zfs: vdev_disk.c Log Message: Use utility functions to handle disk geometry. To generate a diff of this commit: cvs rdiff -u -r1.13 -r1.14 \ src/external/cddl/osnet/dist/uts/common/fs/zfs/vdev_disk.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/external/cddl/osnet/dist/uts/common/fs/zfs/vdev_disk.c diff -u src/external/cddl/osnet/dist/uts/common/fs/zfs/vdev_disk.c:1.13 src/external/cddl/osnet/dist/uts/common/fs/zfs/vdev_disk.c:1.14 --- src/external/cddl/osnet/dist/uts/common/fs/zfs/vdev_disk.c:1.13 Sun Dec 1 20:25:31 2019 +++ src/external/cddl/osnet/dist/uts/common/fs/zfs/vdev_disk.c Sat Feb 29 17:15:43 2020 @@ -35,7 +35,6 @@ #include <sys/sunldi.h> #include <sys/fm/fs/zfs.h> #include <sys/disk.h> -#include <sys/disklabel.h> #include <sys/dkio.h> #include <sys/workqueue.h> @@ -147,10 +146,11 @@ vdev_disk_open(vdev_t *vd, uint64_t *psi spa_t *spa = vd->vdev_spa; vdev_disk_t *dvd; vnode_t *vp; - struct dkwedge_info dkw; - struct disk *pdk; int error, cmd; - struct partinfo pinfo; + uint64_t numsecs; + unsigned secsize; + struct disk *pdk; + struct dkwedge_info dkw; /* * We must have a pathname, and it must be absolute. @@ -219,33 +219,15 @@ vdev_disk_open(vdev_t *vd, uint64_t *psi return (SET_ERROR(EINVAL)); } + pdk = NULL; + if (getdiskinfo(vp, &dkw) == 0) + pdk = disk_find(dkw.dkw_parent); + /* XXXNETBSD Once tls-maxphys gets merged this block becomes: - if (VOP_IOCTL(vp, DIOCGWEDGEINFO, &dkw, FREAD, NOCRED) == 0) - pdk = disk_find(dkw.dkw_parent); - else - pdk = disk_find_blk(vp->v_rdev); dvd->vd_maxphys = (pdk ? disk_maxphys(pdk) : MACHINE_MAXPHYS); */ { struct buf buf = { .b_bcount = MAXPHYS }; - - if (VOP_IOCTL(vp, DIOCGWEDGEINFO, &dkw, FREAD, NOCRED) == 0) { - pdk = disk_find(dkw.dkw_parent); - } else { - const char *dev_name; - - dev_name = devsw_blk2name(major(vp->v_rdev)); - if (dev_name) { - char disk_name[16]; - - snprintf(disk_name, sizeof(disk_name), "%s%d", - dev_name, DISKUNIT(vp->v_rdev)); - pdk = disk_find(disk_name); - } else { - pdk = NULL; - } - buf.b_dev = vp->v_rdev; - } if (pdk && pdk->dk_driver && pdk->dk_driver->d_minphys) (*pdk->dk_driver->d_minphys)(&buf); dvd->vd_maxphys = buf.b_bcount; @@ -268,32 +250,22 @@ vdev_disk_open(vdev_t *vd, uint64_t *psi dvd->vd_vp = vp; skip_open: - /* - * Determine the actual size of the device. - * Try wedge info first as it supports larger disks. - */ - error = VOP_IOCTL(vp, DIOCGWEDGEINFO, &dkw, FREAD, NOCRED); - if (error == 0) { - pdk = disk_find(dkw.dkw_parent); - if (pdk) { - pinfo.pi_secsize = (1 << pdk->dk_byteshift); - pinfo.pi_size = dkw.dkw_size; - pinfo.pi_offset = dkw.dkw_offset; - } else - error = ENODEV; - } - if (error) - error = VOP_IOCTL(vp, DIOCGPARTINFO, &pinfo, FREAD, kcred); + error = getdisksize(vp, &numsecs, &secsize); if (error != 0) { vd->vdev_stat.vs_aux = VDEV_AUX_OPEN_FAILED; return (SET_ERROR(error)); } - *psize = pinfo.pi_size * pinfo.pi_secsize; + + *psize = numsecs * secsize; *max_psize = *psize; - *ashift = highbit(MAX(pinfo.pi_secsize, SPA_MINBLOCKSIZE)) - 1; + *ashift = highbit(MAX(secsize, SPA_MINBLOCKSIZE)) - 1; *pashift = *ashift; - vd->vdev_wholedisk = (pinfo.pi_offset == 0); /* XXXNETBSD */ + + vd->vdev_wholedisk = 0; + if (getdiskinfo(vp, &dkw) != 0 && + dkw.dkw_offset == 0 && dkw.dkw_size == numsecs) + vd->vdev_wholedisk = 1, /* * Clear the nowritecache bit, so that on a vdev_reopen() we will