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