diff options
author | ae <ae@FreeBSD.org> | 2012-10-21 12:14:58 +0000 |
---|---|---|
committer | ae <ae@FreeBSD.org> | 2012-10-21 12:14:58 +0000 |
commit | 2ad040bf3f552fc8b740e79fe6db1bf91414d583 (patch) | |
tree | c4b4748bda44bb15b7dab09365fdddecdb576519 /sys/boot/common | |
parent | 0435f4a49c48e7ffd3690c28630f09490ec3c2dc (diff) | |
download | FreeBSD-src-2ad040bf3f552fc8b740e79fe6db1bf91414d583.zip FreeBSD-src-2ad040bf3f552fc8b740e79fe6db1bf91414d583.tar.gz |
Add the flags parameter to the disk_open() function and DISK_F_NOCACHE
flag, that disables the caching of partition tables metadata.
Use this flag for floppies in the libi386/biosdisk driver.
Diffstat (limited to 'sys/boot/common')
-rw-r--r-- | sys/boot/common/disk.c | 27 | ||||
-rw-r--r-- | sys/boot/common/disk.h | 3 |
2 files changed, 20 insertions, 10 deletions
diff --git a/sys/boot/common/disk.c b/sys/boot/common/disk.c index 73d58ea..81d1332 100644 --- a/sys/boot/common/disk.c +++ b/sys/boot/common/disk.c @@ -47,6 +47,7 @@ struct open_disk { struct ptable *table; off_t mediasize; u_int sectorsize; + u_int flags; int rcnt; }; @@ -232,16 +233,20 @@ disk_print(struct disk_devdesc *dev, char *prefix, int verbose) } int -disk_open(struct disk_devdesc *dev, off_t mediasize, u_int sectorsize) +disk_open(struct disk_devdesc *dev, off_t mediasize, u_int sectorsize, + u_int flags) { struct open_disk *od; struct ptable *table; struct ptable_entry part; int rc, slice, partition; - rc = disk_lookup(dev); - if (rc == 0) - return (0); + rc = 0; + if ((flags & DISK_F_NOCACHE) == 0) { + rc = disk_lookup(dev); + if (rc == 0) + return (0); + } /* * While we are reading disk metadata, make sure we do it relative * to the start of the disk @@ -267,11 +272,12 @@ disk_open(struct disk_devdesc *dev, off_t mediasize, u_int sectorsize) DEBUG("no memory"); return (ENOMEM); } + dev->d_opendata = od; + od->rcnt = 0; } - dev->d_opendata = od; od->mediasize = mediasize; od->sectorsize = sectorsize; - od->rcnt = 0; + od->flags = flags; DEBUG("%s unit %d, slice %d, partition %d => %p", disk_fmtdev(dev), dev->d_unit, dev->d_slice, dev->d_partition, od); @@ -348,7 +354,8 @@ out: } DEBUG("%s could not open", disk_fmtdev(dev)); } else { - disk_insert(dev); + if ((flags & DISK_F_NOCACHE) == 0) + disk_insert(dev); /* Save the slice and partition number to the dev */ dev->d_slice = slice; dev->d_partition = partition; @@ -361,12 +368,14 @@ out: int disk_close(struct disk_devdesc *dev) { -#if DISK_DEBUG struct open_disk *od; od = (struct open_disk *)dev->d_opendata; DEBUG("%s closed => %p [%d]", disk_fmtdev(dev), od, od->rcnt); -#endif + if (od->flags & DISK_F_NOCACHE) { + ptable_close(od->table); + free(od); + } return (0); } diff --git a/sys/boot/common/disk.h b/sys/boot/common/disk.h index 3e8b250..1aaa031 100644 --- a/sys/boot/common/disk.h +++ b/sys/boot/common/disk.h @@ -93,7 +93,8 @@ struct disk_devdesc * Parse disk metadata and initialise dev->d_offset. */ extern int disk_open(struct disk_devdesc *dev, off_t mediasize, - u_int sectorsize); + u_int sectorsize, u_int flags); +#define DISK_F_NOCACHE 0x0001 /* Do not use metadata caching */ extern int disk_close(struct disk_devdesc *dev); extern void disk_cleanup(const struct devsw *d_dev); |