Module Name:    src
Committed By:   hannken
Date:           Mon Apr 15 13:01:08 UTC 2019

Modified Files:
        src/sys/kern: vfs_trans.c

Log Message:
Add reference counting to alias states to prevent them disappearing
while still in use.


To generate a diff of this commit:
cvs rdiff -u -r1.58 -r1.59 src/sys/kern/vfs_trans.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/kern/vfs_trans.c
diff -u src/sys/kern/vfs_trans.c:1.58 src/sys/kern/vfs_trans.c:1.59
--- src/sys/kern/vfs_trans.c:1.58	Thu Mar  7 11:09:10 2019
+++ src/sys/kern/vfs_trans.c	Mon Apr 15 13:01:08 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: vfs_trans.c,v 1.58 2019/03/07 11:09:10 hannken Exp $	*/
+/*	$NetBSD: vfs_trans.c,v 1.59 2019/04/15 13:01:08 hannken Exp $	*/
 
 /*-
  * Copyright (c) 2007 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: vfs_trans.c,v 1.58 2019/03/07 11:09:10 hannken Exp $");
+__KERNEL_RCSID(0, "$NetBSD: vfs_trans.c,v 1.59 2019/04/15 13:01:08 hannken Exp $");
 
 /*
  * File system transaction operations.
@@ -71,6 +71,7 @@ struct fstrans_lwp_info {
 	struct fstrans_lwp_info *fli_alias;
 	struct fstrans_mount_info *fli_mountinfo;
 	int fli_trans_cnt;
+	int fli_alias_cnt;
 	int fli_cow_cnt;
 	enum fstrans_lock_type fli_lock_type;
 	LIST_ENTRY(fstrans_lwp_info) fli_list;
@@ -203,6 +204,7 @@ fstrans_lwp_dtor(lwp_t *l)
 		if (fli->fli_mount != NULL)
 			fstrans_mount_dtor(fli->fli_mountinfo);
 		fli_next = fli->fli_succ;
+		fli->fli_alias_cnt = 0;
 		fli->fli_mount = NULL;
 		fli->fli_alias = NULL;
 		fli->fli_mountinfo = NULL;
@@ -300,14 +302,21 @@ fstrans_clear_lwp_info(void)
 		fli = *p;
 		if (fli->fli_mount != NULL &&
 		    fli->fli_mountinfo->fmi_gone &&
-		    fli->fli_trans_cnt == 0 && fli->fli_cow_cnt == 0) {
+		    fli->fli_trans_cnt == 0 &&
+		    fli->fli_cow_cnt == 0 &&
+		    fli->fli_alias_cnt == 0) {
 			*p = (*p)->fli_succ;
 			fstrans_mount_dtor(fli->fli_mountinfo);
+			if (fli->fli_alias) {
+				KASSERT(fli->fli_alias->fli_alias_cnt > 0);
+				fli->fli_alias->fli_alias_cnt--;
+			}
 			fli->fli_mount = NULL;
 			fli->fli_alias = NULL;
 			fli->fli_mountinfo = NULL;
 			membar_sync();
 			fli->fli_self = NULL;
+			p = &curlwp->l_fstrans;
 		} else {
 			p = &(*p)->fli_succ;
 		}
@@ -343,6 +352,7 @@ fstrans_alloc_lwp_info(struct mount *mp)
 			KASSERT(fli->fli_mount == NULL);
 			KASSERT(fli->fli_trans_cnt == 0);
 			KASSERT(fli->fli_cow_cnt == 0);
+			KASSERT(fli->fli_alias_cnt == 0);
 			fli->fli_self = curlwp;
 			fli->fli_succ = curlwp->l_fstrans;
 			curlwp->l_fstrans = fli;
@@ -378,6 +388,7 @@ fstrans_alloc_lwp_info(struct mount *mp)
 
 	if (mp) {
 		fli->fli_alias = fstrans_alloc_lwp_info(mp);
+		fli->fli_alias->fli_alias_cnt++;
 		fli = fli->fli_alias;
 	}
 
@@ -971,7 +982,8 @@ fstrans_print_lwp(struct proc *p, struct
 				break;
 			}
 		}
-		printf(" %d cow %d\n", fli->fli_trans_cnt, fli->fli_cow_cnt);
+		printf(" %d cow %d alias %d\n",
+		    fli->fli_trans_cnt, fli->fli_cow_cnt, fli->fli_alias_cnt);
 		prefix[0] = '\0';
 	}
 }

Reply via email to