aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sys/gnu/fs/reiserfs/reiserfs_vfsops.c14
1 files changed, 11 insertions, 3 deletions
diff --git a/sys/gnu/fs/reiserfs/reiserfs_vfsops.c b/sys/gnu/fs/reiserfs/reiserfs_vfsops.c
index ecec3ada2da3..e98ed4816160 100644
--- a/sys/gnu/fs/reiserfs/reiserfs_vfsops.c
+++ b/sys/gnu/fs/reiserfs/reiserfs_vfsops.c
@@ -231,6 +231,7 @@ reiserfs_unmount(struct mount *mp, int mntflags)
g_topology_unlock();
PICKUP_GIANT();
vrele(rmp->rm_devvp);
+ dev_rel(rmp->rm_dev);
if (sbi) {
reiserfs_log(LOG_DEBUG, "free sbi\n");
@@ -430,21 +431,25 @@ reiserfs_mountfs(struct vnode *devvp, struct mount *mp, struct thread *td)
struct reiserfs_mount *rmp;
struct reiserfs_sb_info *sbi;
struct reiserfs_super_block *rs;
- struct cdev *dev = devvp->v_rdev;
+ struct cdev *dev;
struct g_consumer *cp;
struct bufobj *bo;
//ronly = (mp->mnt_flag & MNT_RDONLY) != 0;
+ dev = devvp->v_rdev;
+ dev_ref(dev);
DROP_GIANT();
g_topology_lock();
error = g_vfs_open(devvp, &cp, "reiserfs", /* read-only */ 0);
g_topology_unlock();
PICKUP_GIANT();
VOP_UNLOCK(devvp, 0);
- if (error)
+ if (error) {
+ dev_rel(dev);
return (error);
+ }
bo = &devvp->v_bufobj;
bo->bo_private = cp;
@@ -575,6 +580,7 @@ reiserfs_mountfs(struct vnode *devvp, struct mount *mp, struct thread *td)
mp->mnt_stat.f_fsid.val[1] = mp->mnt_vfc->vfc_typenum;
MNT_ILOCK(mp);
mp->mnt_flag |= MNT_LOCAL;
+ mp->mnt_kern_flag |= MNTK_MPSAFE;
MNT_IUNLOCK(mp);
#if defined(si_mountpoint)
devvp->v_rdev->si_mountpoint = mp;
@@ -590,7 +596,8 @@ out:
for (i = 0; i < SB_BMAP_NR(sbi); i++) {
if (!SB_AP_BITMAP(sbi)[i].bp_data)
break;
- free(SB_AP_BITMAP(sbi)[i].bp_data, M_REISERFSMNT);
+ free(SB_AP_BITMAP(sbi)[i].bp_data,
+ M_REISERFSMNT);
}
free(SB_AP_BITMAP(sbi), M_REISERFSMNT);
}
@@ -613,6 +620,7 @@ out:
free(sbi, M_REISERFSMNT);
if (rmp)
free(rmp, M_REISERFSMNT);
+ dev_rel(dev);
return (error);
}