Re: RFC: backporting GEOM to the 4.x branch

看板DFBSD_kernel作者時間21年前 (2005/02/05 03:32), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串15/39 (看更多)
:I know you have other more important priorities, I did not expect you to port :it instead of me. :-) Is someone already working on such a utility? : :> The current BUF/BIO model is very close to FreeBSD-4. We haven't done any :> of the truely major bits of work on it yet (like changing the block :> numbers to 64 bit byte offsets and things of that ilk). : :What other major changes that would affect what I would like to implement are :planned? Anything else I should anticipate? : :> The only big difference relative to FreeBSD-4 is that the actual I/O :> sequencing has changed slightly, and the device representing a labeled :> disk is no longer overloaded onto the device reprsenting a 'raw' disk. : :That would indeed make it easier to implement dGDE, I'll take a closer look :and study the code. : :ALeine We've made a lot of little mods here and there, I don't remember them all, but the only one that really counts is the new layering, and that is mostly hidden by disk_create(). Check out any of the disk drivers. so e.g. look at ata-disk.c in /usr/src/sys/dev/disk/ata/. It does this (where 'adp' is basically just the softinfo for the driver): dev = disk_create(adp->lun, &adp->disk, 0, &ad_cdevsw); dev->si_drv1 = adp; dev->si_iosize_max = 256 * DEV_BSIZE; adp->dev = dev; /* construct the disklabel */ bzero(&adp->disk.d_label, sizeof(struct disklabel)); adp->disk.d_label.d_secsize = DEV_BSIZE; adp->disk.d_label.d_nsectors = adp->sectors; adp->disk.d_label.d_ntracks = adp->heads; adp->disk.d_label.d_ncylinders = adp->total_secs/(adp->heads*adp->sectors); adp->disk.d_label.d_secpercyl = adp->sectors * adp->heads; adp->disk.d_label.d_secperunit = adp->total_secs; There are a couple of differences between the FreeBSD-5 way and our way. * We embed the disk structure in the softstruct rather then call disk_alloc(). * Second, the disk device is not embedded in the disk structure but instead returned by disk_create(), and the cdevsw template ias passed to disk_create(). * We still have major/minor numbers, and will continue to have them for some time to come. Look in ata-disk.c for typical setup of the cdevsw structure. The cdevsw is a major number template. The first argument to disk_create() is the unit number. After that its almost the same. The returned 'dev' is purely for the use of the block device. disk_create() will create a *DIFFERENT* dev *internally* that is attached to the userland-accessible major,minor number. The block device never touches the internal dev. So the driver just uses the returned dev as the block device, and userland will wind up using a different dev created by disk_create() which will do the appropriate translation and label management. -Matt Matthew Dillon <dillon@backplane.com>
文章代碼(AID): #120ysu00 (DFBSD_kernel)
討論串 (同標題文章)
文章代碼(AID): #120ysu00 (DFBSD_kernel)