From: Matthew Dillon Date: Wed, 6 Apr 2011 04:09:09 +0000 (-0700) Subject: HAMMER VFS - Fix two minor bugs. X-Git-Tag: v2.11.0~85 X-Git-Url: https://gitweb.dragonflybsd.org/dragonfly.git/commitdiff_plain/dfec479fbd286f4df35365df97174521a832ddc1 HAMMER VFS - Fix two minor bugs. * When downgrading a volume to read-only due to a critical HAMMER error also properly downgrade the VOP_OPEN/VOP_CLOSE state so the opencount and writecount match up. This should fix issues disconnecting the related disk device after umounting a HAMMER partition which has had a critical error. * When adding or removing a volume to an existing HAMMER mount flush disk buffers before calling VOP_CLOSE() instead of after. --- diff --git a/sys/vfs/hammer/hammer_vfsops.c b/sys/vfs/hammer/hammer_vfsops.c index d83d900c1f..05dc0ff447 100644 --- a/sys/vfs/hammer/hammer_vfsops.c +++ b/sys/vfs/hammer/hammer_vfsops.c @@ -953,6 +953,8 @@ hammer_critical_error(hammer_mount_t hmp, hammer_inode_t ip, if (hmp->ronly == 0) { hmp->ronly = 2; /* special errored read-only mode */ hmp->mp->mnt_flag |= MNT_RDONLY; + RB_SCAN(hammer_vol_rb_tree, &hmp->rb_vols_root, NULL, + hammer_adjust_volume_mode, NULL); kprintf("HAMMER(%s): Forcing read-only mode\n", hmp->mp->mnt_stat.f_mntfromname); } diff --git a/sys/vfs/hammer/hammer_volume.c b/sys/vfs/hammer/hammer_volume.c index 323c31ad87..97d32d15c8 100644 --- a/sys/vfs/hammer/hammer_volume.c +++ b/sys/vfs/hammer/hammer_volume.c @@ -775,9 +775,9 @@ hammer_setup_device(struct vnode **devvpp, const char *dev_path, int ronly) static void hammer_close_device(struct vnode **devvpp, int ronly) { - VOP_CLOSE(*devvpp, (ronly ? FREAD : FREAD|FWRITE)); if (*devvpp) { vinvalbuf(*devvpp, ronly ? 0 : V_SAVE, 0, 0); + VOP_CLOSE(*devvpp, (ronly ? FREAD : FREAD|FWRITE)); vrele(*devvpp); *devvpp = NULL; }