Index: subr_disk.c =================================================================== RCS file: /base/FreeBSD-tsc-4/sys/kern/subr_disk.c,v retrieving revision 1.1.1.7 retrieving revision 1.2 diff -u -r1.1.1.7 -r1.2 --- subr_disk.c 2000/03/10 19:35:47 1.1.1.7 +++ subr_disk.c 2000/06/28 20:58:48 1.2 @@ -28,6 +28,18 @@ static d_ioctl_t diskioctl; static d_psize_t diskpsize; +static void +inherit_raw(dev_t pdev, dev_t dev) +{ + dev->si_disk = pdev->si_disk; + dev->si_drv1 = pdev->si_drv1; + dev->si_drv2 = pdev->si_drv2; + dev->si_iosize_max = pdev->si_iosize_max; + dev->si_bsize_phys = pdev->si_bsize_phys; + dev->si_bsize_best = pdev->si_bsize_best; + return; +} + dev_t disk_create(int unit, struct disk *dp, int flags, struct cdevsw *cdevsw, struct cdevsw *proto) { @@ -133,12 +145,7 @@ } /* Inherit properties from the whole/raw dev_t */ - dev->si_disk = pdev->si_disk; - dev->si_drv1 = pdev->si_drv1; - dev->si_drv2 = pdev->si_drv2; - dev->si_iosize_max = pdev->si_iosize_max; - dev->si_bsize_phys = pdev->si_bsize_phys; - dev->si_bsize_best = pdev->si_bsize_best; + inherit_raw(pdev, dev); if (error) goto out; @@ -162,9 +169,11 @@ { struct disk *dp; int error; + dev_t pdev; error = 0; - dp = dev->si_disk; + pdev = dkmodpart(dkmodslice(dev, WHOLE_DISK_SLICE), RAW_PART); + dp = pdev->si_disk; dsclose(dev, devtype, dp->d_slice); if (!dsisopen(dp->d_slice)) { error = dp->d_devsw->d_close(dp->d_dev, fflag, devtype, p); @@ -178,16 +187,10 @@ dev_t pdev; struct disk *dp; - dp = bp->b_dev->si_disk; - if (!dp) { - pdev = dkmodpart(dkmodslice(bp->b_dev, WHOLE_DISK_SLICE), RAW_PART); - dp = bp->b_dev->si_disk = pdev->si_disk; - bp->b_dev->si_drv1 = pdev->si_drv1; - bp->b_dev->si_drv2 = pdev->si_drv2; - bp->b_dev->si_iosize_max = pdev->si_iosize_max; - bp->b_dev->si_bsize_phys = pdev->si_bsize_phys; - bp->b_dev->si_bsize_best = pdev->si_bsize_best; - } + pdev = dkmodpart(dkmodslice(bp->b_dev, WHOLE_DISK_SLICE), RAW_PART); + dp = pdev->si_disk; + if (dp != bp->b_dev->si_disk) + inherit_raw(pdev, bp->b_dev); if (!dp) { bp->b_error = ENXIO; @@ -211,8 +214,10 @@ { struct disk *dp; int error; + dev_t pdev; - dp = dev->si_disk; + pdev = dkmodpart(dkmodslice(dev, WHOLE_DISK_SLICE), RAW_PART); + dp = pdev->si_disk; error = dsioctl(dev, cmd, data, fflag, &dp->d_slice); if (error == ENOIOCTL) error = dp->d_devsw->d_ioctl(dev, cmd, data, fflag, p); @@ -225,12 +230,11 @@ struct disk *dp; dev_t pdev; - dp = dev->si_disk; - if (!dp) { - pdev = dkmodpart(dkmodslice(dev, WHOLE_DISK_SLICE), RAW_PART); - dp = pdev->si_disk; - if (!dp) - return (-1); + pdev = dkmodpart(dkmodslice(dev, WHOLE_DISK_SLICE), RAW_PART); + dp = pdev->si_disk; + if (!dp) + return (-1); + if (dp != dev->si_disk) { dev->si_drv1 = pdev->si_drv1; dev->si_drv2 = pdev->si_drv2; /* XXX: don't set bp->b_dev->si_disk (?) */