Add a new disk flag - DISKFLAG_CANFLUSHCACHE, which indicates that the disk

can handle BIO_FLUSH requests.

Sponsored by:	home.pl
This commit is contained in:
Pawel Jakub Dawidek 2006-10-31 21:12:43 +00:00
parent c3618c657a
commit 1d2aee20b8
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=163833
3 changed files with 25 additions and 2 deletions

View File

@ -94,8 +94,10 @@ Currently supported flags are
(maintained by device driver),
.Dv DISKFLAG_OPEN
(maintained by storage framework),
and
.Dv DISKFLAG_CANDELETE
(maintained by device driver),
and
.Dv DISKFLAG_CANFLUSHCACHE
(maintained by device driver).
.It Vt "const char *" Va d_name
Holds the name of the storage device class, e.g.,

View File

@ -202,8 +202,10 @@ g_disk_done(struct bio *bp)
if (bp2->bio_error == 0)
bp2->bio_error = bp->bio_error;
bp2->bio_completed += bp->bio_completed;
if ((dp = bp2->bio_to->geom->softc))
if ((bp->bio_cmd & (BIO_READ|BIO_WRITE|BIO_DELETE)) &&
(dp = bp2->bio_to->geom->softc)) {
devstat_end_transaction_bio(dp->d_devstat, bp);
}
g_destroy_bio(bp);
bp2->bio_inbed++;
if (bp2->bio_children == bp2->bio_inbed) {
@ -304,6 +306,24 @@ g_disk_start(struct bio *bp)
else
error = ENOIOCTL;
break;
case BIO_FLUSH:
g_trace(G_T_TOPOLOGY, "g_disk_flushcache(%s)",
bp->bio_to->name);
if (!(dp->d_flags & DISKFLAG_CANFLUSHCACHE)) {
g_io_deliver(bp, ENODEV);
return;
}
bp2 = g_clone_bio(bp);
if (bp2 == NULL) {
g_io_deliver(bp, ENOMEM);
return;
}
bp2->bio_done = g_disk_done;
bp2->bio_disk = dp;
g_disk_lock_giant(dp);
dp->d_strategy(bp2);
g_disk_unlock_giant(dp);
break;
default:
error = EOPNOTSUPP;
break;

View File

@ -91,6 +91,7 @@ struct disk {
#define DISKFLAG_NEEDSGIANT 0x1
#define DISKFLAG_OPEN 0x2
#define DISKFLAG_CANDELETE 0x4
#define DISKFLAG_CANFLUSHCACHE 0x8
struct disk *disk_alloc(void);
void disk_create(struct disk *disk, int version);