usr/src/uts/common/fs/nfs/nfs_vnops.c
changeset 4863 7b14ad153d91
parent 4813 8eaf4b355227
child 5331 3047ad28a67b
--- a/usr/src/uts/common/fs/nfs/nfs_vnops.c	Tue Aug 14 15:05:52 2007 -0700
+++ b/usr/src/uts/common/fs/nfs/nfs_vnops.c	Tue Aug 14 17:10:25 2007 -0700
@@ -218,6 +218,7 @@
 	VOPNAME_SETSECATTR,	{ .vop_setsecattr = nfs_setsecattr },
 	VOPNAME_GETSECATTR,	{ .vop_getsecattr = nfs_getsecattr },
 	VOPNAME_SHRLOCK,	{ .vop_shrlock = nfs_shrlock },
+	VOPNAME_VNEVENT, 	{ .vop_vnevent = fs_vnevent_support },
 	NULL,			NULL
 };
 
@@ -1964,8 +1965,13 @@
 		nfs_rw_exit(&drp->r_rwlock);
 		if (error) {
 			VN_RELE(vp);
-		} else
+		} else {
+			/*
+			 * existing file got truncated, notify.
+			 */
+			vnevent_create(vp);
 			*vpp = vp;
+		}
 		return (error);
 	}
 
@@ -2246,6 +2252,9 @@
 		}
 	}
 
+	if (error == 0) {
+		vnevent_remove(vp, dvp, nm);
+	}
 	VN_RELE(vp);
 
 	nfs_rw_exit(&drp->r_rwlock);
@@ -2297,6 +2306,12 @@
 
 	nfs_rw_exit(&tdrp->r_rwlock);
 
+	if (!error) {
+		/*
+		 * Notify the source file of this link operation.
+		 */
+		vnevent_link(svp);
+	}
 	return (error);
 }
 
@@ -2323,7 +2338,7 @@
 	enum nfsstat status;
 	struct nfsrnmargs args;
 	int douprintf;
-	vnode_t *nvp;
+	vnode_t *nvp = NULL;
 	vnode_t *ovp = NULL;
 	char *tmpname;
 	rnode_t *rp;
@@ -2479,8 +2494,6 @@
 			}
 			mutex_exit(&rp->r_statelock);
 		}
-
-		VN_RELE(nvp);
 	}
 
 	if (ovp == NULL) {
@@ -2504,6 +2517,9 @@
 		if (error) {
 			nfs_rw_exit(&odrp->r_rwlock);
 			nfs_rw_exit(&ndrp->r_rwlock);
+			if (nvp) {
+				VN_RELE(nvp);
+			}
 			return (error);
 		}
 		ASSERT(ovp != NULL);
@@ -2577,6 +2593,20 @@
 		}
 	}
 
+	if (error == 0) {
+		if (nvp)
+			vnevent_rename_dest(nvp, ndvp, nnm);
+
+		if (odvp != ndvp)
+			vnevent_rename_dest_dir(ndvp);
+
+		ASSERT(ovp != NULL);
+		vnevent_rename_src(ovp, odvp, onm);
+	}
+
+	if (nvp) {
+		VN_RELE(nvp);
+	}
 	VN_RELE(ovp);
 
 	nfs_rw_exit(&odrp->r_rwlock);
@@ -2758,6 +2788,9 @@
 			error = EEXIST;
 	}
 
+	if (error == 0) {
+		vnevent_rmdir(vp, dvp, nm);
+	}
 	VN_RELE(vp);
 
 	nfs_rw_exit(&drp->r_rwlock);