Author: dumbbell
Date: Tue Mar 27 20:36:03 2012
New Revision: 233575
URL: http://svn.freebsd.org/changeset/base/233575

Log:
  Make ReiserFS MPSAFE
  
  Most functions seemed to be already fine w.r.t. what's done in msdosfs.
  
  MFC after:    1 month

Modified:
  head/sys/gnu/fs/reiserfs/reiserfs_vfsops.c

Modified: head/sys/gnu/fs/reiserfs/reiserfs_vfsops.c
==============================================================================
--- head/sys/gnu/fs/reiserfs/reiserfs_vfsops.c  Tue Mar 27 20:10:13 2012        
(r233574)
+++ head/sys/gnu/fs/reiserfs/reiserfs_vfsops.c  Tue Mar 27 20:36:03 2012        
(r233575)
@@ -231,6 +231,7 @@ reiserfs_unmount(struct mount *mp, int m
        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, st
        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, st
        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);
 }
 
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "[email protected]"

Reply via email to