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.
This commit is contained in:
Andrey V. Elsukov 2012-10-21 12:14:58 +00:00
parent 3bbc4438c9
commit 9add094157
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=241809
5 changed files with 30 additions and 16 deletions

View File

@ -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 @@ disk_open(struct disk_devdesc *dev, off_t mediasize, u_int sectorsize)
}
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 @@ disk_open(struct disk_devdesc *dev, off_t mediasize, u_int sectorsize)
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);
}

View File

@ -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);

View File

@ -276,7 +276,9 @@ bd_print(int verbose)
dev.d_partition = -1;
if (disk_open(&dev,
bdinfo[i].bd_sectorsize * bdinfo[i].bd_sectors,
bdinfo[i].bd_sectorsize) == 0) {
bdinfo[i].bd_sectorsize,
(bdinfo[i].bd_flags & BD_FLOPPY) ?
DISK_F_NOCACHE: 0) == 0) {
sprintf(line, " disk%d", i);
disk_print(&dev, line, verbose);
disk_close(&dev);
@ -308,7 +310,8 @@ bd_open(struct open_file *f, ...)
return (EIO);
return (disk_open(dev, BD(dev).bd_sectors * BD(dev).bd_sectorsize,
BD(dev).bd_sectorsize));
BD(dev).bd_sectorsize, (BD(dev).bd_flags & BD_FLOPPY) ?
DISK_F_NOCACHE: 0));
}
static int
@ -645,7 +648,8 @@ bd_getdev(struct i386_devdesc *d)
if (biosdev == -1) /* not a BIOS device */
return(-1);
if (disk_open(dev, BD(dev).bd_sectors * BD(dev).bd_sectorsize,
BD(dev).bd_sectorsize) != 0) /* oops, not a viable device */
BD(dev).bd_sectorsize,(BD(dev).bd_flags & BD_FLOPPY) ?
DISK_F_NOCACHE: 0) != 0) /* oops, not a viable device */
return (-1);
else
disk_close(dev);

View File

@ -205,7 +205,7 @@ stor_opendev(struct disk_devdesc *dev)
SI(dev).opened++;
}
return (disk_open(dev, SI(dev).blocks * SI(dev).bsize,
SI(dev).bsize));
SI(dev).bsize, 0));
}
static int

View File

@ -125,7 +125,7 @@ userdisk_print(int verbose)
dev.d_slice = -1;
dev.d_partition = -1;
if (disk_open(&dev, ud_info[i].mediasize,
ud_info[i].sectorsize) == 0) {
ud_info[i].sectorsize, 0) == 0) {
sprintf(line, " disk%d", i);
disk_print(&dev, line, verbose);
disk_close(&dev);
@ -150,7 +150,7 @@ userdisk_open(struct open_file *f, ...)
return (EIO);
return (disk_open(dev, ud_info[dev->d_unit].mediasize,
ud_info[dev->d_unit].sectorsize));
ud_info[dev->d_unit].sectorsize, 0));
}
static int