svn commit: r336361 - in head/sys/ufs: ffs ufs

Kirk McKusick mckusick at FreeBSD.org
Tue Jul 17 04:43:59 UTC 2018


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 **);


More information about the svn-src-all mailing list