summaryrefslogtreecommitdiffstats
path: root/sys/boot/common
diff options
context:
space:
mode:
authorae <ae@FreeBSD.org>2012-10-21 12:14:58 +0000
committerae <ae@FreeBSD.org>2012-10-21 12:14:58 +0000
commit2ad040bf3f552fc8b740e79fe6db1bf91414d583 (patch)
treec4b4748bda44bb15b7dab09365fdddecdb576519 /sys/boot/common
parent0435f4a49c48e7ffd3690c28630f09490ec3c2dc (diff)
downloadFreeBSD-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.c27
-rw-r--r--sys/boot/common/disk.h3
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);
OpenPOWER on IntegriCloud