Author: mckusick
Date: Tue Jul 17 04:43:58 2018
New Revision: 336361
URL: https://svnweb.freebsd.org/changeset/base/336361

Log:
  Add needed locking for um_flags added in -r335808.
  
  While here document required locking details in ufsmount structure.
  
  Reported by: kib
  Reviewed by: kib

Modified:
  head/sys/ufs/ffs/ffs_suspend.c
  head/sys/ufs/ufs/ufsmount.h

Modified: head/sys/ufs/ffs/ffs_suspend.c
==============================================================================
--- head/sys/ufs/ffs/ffs_suspend.c      Tue Jul 17 02:20:51 2018        
(r336360)
+++ head/sys/ufs/ffs/ffs_suspend.c      Tue Jul 17 04:43:58 2018        
(r336361)
@@ -210,7 +210,9 @@ ffs_susp_suspend(struct mount *mp)
        if ((error = vfs_write_suspend(mp, VS_SKIP_UNMOUNT)) != 0)
                return (error);
 
+       UFS_LOCK(ump);
        ump->um_flags |= UM_WRITESUSPENDED;
+       UFS_UNLOCK(ump);
 
        return (0);
 }
@@ -255,7 +257,9 @@ ffs_susp_dtor(void *data)
 
        vfs_write_resume(mp, 0);
        vfs_unbusy(mp);
+       UFS_LOCK(ump);
        ump->um_flags &= ~UM_WRITESUSPENDED;
+       UFS_UNLOCK(ump);
 
        sx_xunlock(&ffs_susp_lock);
 }

Modified: head/sys/ufs/ufs/ufsmount.h
==============================================================================
--- head/sys/ufs/ufs/ufsmount.h Tue Jul 17 02:20:51 2018        (r336360)
+++ head/sys/ufs/ufs/ufsmount.h Tue Jul 17 04:43:58 2018        (r336361)
@@ -64,31 +64,44 @@ struct inodedep;
 TAILQ_HEAD(inodedeplst, inodedep);
 LIST_HEAD(bmsafemaphd, bmsafemap);
 
-/* This structure describes the UFS specific mount structure data. */
+/*
+ * This structure describes the UFS specific mount structure data.
+ * The function operators are used to support different versions of
+ * UFS (UFS1, UFS2, etc).
+ *
+ * Lock reference:
+ *     a - atomic operations
+ *     c - set at allocation then constant until freed
+ *     i - ufsmount interlock (UFS_LOCK / UFS_UNLOCK)
+ *     q - associated quota file is locked
+ *     r - ref to parent mount structure is held (vfs_busy / vfs_unbusy)
+ *     u - managed by user process fsck_ufs
+ */
 struct ufsmount {
-       struct  mount *um_mountp;               /* filesystem vfs structure */
-       struct  cdev *um_dev;                   /* device mounted */
-       struct  g_consumer *um_cp;
-       struct  bufobj *um_bo;                  /* Buffer cache object */
-       struct  vnode *um_devvp;                /* block device mounted vnode */
-       u_long  um_fstype;                      /* type of filesystem */
-       struct  fs *um_fs;                      /* pointer to superblock */
-       struct  ufs_extattr_per_mount um_extattr;       /* extended attrs */
-       u_long  um_nindir;                      /* indirect ptrs per block */
-       u_long  um_bptrtodb;                    /* indir ptr to disk block */
-       u_long  um_seqinc;                      /* inc between seq blocks */
-       struct  mtx um_lock;                    /* Protects ufsmount & fs */
-       pid_t   um_fsckpid;                     /* PID permitted fsck sysctls */
-       struct  mount_softdeps *um_softdep;     /* softdep mgmt structure */
-       struct  vnode *um_quotas[MAXQUOTAS];    /* pointer to quota files */
-       struct  ucred *um_cred[MAXQUOTAS];      /* quota file access cred */
-       time_t  um_btime[MAXQUOTAS];            /* block quota time limit */
-       time_t  um_itime[MAXQUOTAS];            /* inode quota time limit */
-       char    um_qflags[MAXQUOTAS];           /* quota specific flags */
-       int64_t um_savedmaxfilesize;            /* XXX - limit maxfilesize */
-       u_int   um_flags;                       /* filesystem flags */
-       u_int   um_trim_inflight;               /* outstanding trim count */
-       struct  taskqueue *um_trim_tq;          /* trim request queue */
+       struct  mount *um_mountp;               /* (r) filesystem vfs struct */
+       struct  cdev *um_dev;                   /* (r) device mounted */
+       struct  g_consumer *um_cp;              /* (r) GEOM access point */
+       struct  bufobj *um_bo;                  /* (r) Buffer cache object */
+       struct  vnode *um_devvp;                /* (r) blk dev mounted vnode */
+       u_long  um_fstype;                      /* (c) type of filesystem */
+       struct  fs *um_fs;                      /* (r) pointer to superblock */
+       struct  ufs_extattr_per_mount um_extattr; /* (c) extended attrs */
+       u_long  um_nindir;                      /* (c) indirect ptrs per blk */
+       u_long  um_bptrtodb;                    /* (c) indir disk block ptr */
+       u_long  um_seqinc;                      /* (c) inc between seq blocks */
+       struct  mtx um_lock;                    /* (c) Protects ufsmount & fs */
+       pid_t   um_fsckpid;                     /* (u) PID can do fsck sysctl */
+       struct  mount_softdeps *um_softdep;     /* (c) softdep mgmt structure */
+       struct  vnode *um_quotas[MAXQUOTAS];    /* (q) pointer to quota files */
+       struct  ucred *um_cred[MAXQUOTAS];      /* (q) quota file access cred */
+       time_t  um_btime[MAXQUOTAS];            /* (q) block quota time limit */
+       time_t  um_itime[MAXQUOTAS];            /* (q) inode quota time limit */
+       char    um_qflags[MAXQUOTAS];           /* (i) quota specific flags */
+       int64_t um_savedmaxfilesize;            /* (c) track maxfilesize */
+       u_int   um_flags;                       /* (i) filesystem flags */
+       u_int   um_trim_inflight;               /* (a) outstanding trim count */
+       struct  taskqueue *um_trim_tq;          /* (c) trim request queue */
+                                               /* (c) - below function ptrs */
        int     (*um_balloc)(struct vnode *, off_t, int, struct ucred *,
                    int, struct buf **);
        int     (*um_blkatoff)(struct vnode *, off_t, char **, struct buf **);
_______________________________________________
[email protected] mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "[email protected]"

Reply via email to