disk subsystem - Fixup dev->si_* fields for XXXs0, e.g. da0s0
authorMatthew Dillon <dillon@apollo.backplane.com>
Wed, 17 Jun 2009 21:01:47 +0000 (14:01 -0700)
committerMatthew Dillon <dillon@apollo.backplane.com>
Wed, 17 Jun 2009 21:01:47 +0000 (14:01 -0700)
The si_* fields for rawdev are not set until after the disk_create()
call, so someone using the cooked version of the raw device (i.e. da0s0)
will not get the right si_iosize_max unless we fix it up here.

sys/kern/subr_disk.c

index ca8629a..d893b28 100644 (file)
@@ -190,6 +190,19 @@ disk_setdiskinfo(struct disk *disk, struct disk_info *info)
                info->d_media_blocks = info->d_media_size / 
                                       info->d_media_blksize;
        }
+
+       /*
+        * The si_* fields for rawdev are not set until after the
+        * disk_create() call, so someone using the cooked version
+        * of the raw device (i.e. da0s0) will not get the right
+        * si_iosize_max unless we fix it up here.
+        */
+       if (disk->d_cdev && disk->d_rawdev &&
+           disk->d_cdev->si_iosize_max == 0) {
+               disk->d_cdev->si_iosize_max = disk->d_rawdev->si_iosize_max;
+               disk->d_cdev->si_bsize_phys = disk->d_rawdev->si_bsize_phys;
+               disk->d_cdev->si_bsize_best = disk->d_rawdev->si_bsize_best;
+       }
 }
 
 /*