diff options
Diffstat (limited to 'usr/src/uts/common/fs/tmpfs/tmp_vnops.c')
-rw-r--r-- | usr/src/uts/common/fs/tmpfs/tmp_vnops.c | 18 |
1 files changed, 16 insertions, 2 deletions
diff --git a/usr/src/uts/common/fs/tmpfs/tmp_vnops.c b/usr/src/uts/common/fs/tmpfs/tmp_vnops.c index 61d72a4015..e44bba1252 100644 --- a/usr/src/uts/common/fs/tmpfs/tmp_vnops.c +++ b/usr/src/uts/common/fs/tmpfs/tmp_vnops.c @@ -24,6 +24,10 @@ * Use is subject to license terms. */ +/* + * Copyright (c) 2012, Joyent, Inc. All rights reserved. + */ + #include <sys/types.h> #include <sys/param.h> #include <sys/t_lock.h> @@ -780,6 +784,10 @@ tmp_setattr( error = tmpnode_trunc(tm, tp, (ulong_t)vap->va_size); rw_exit(&tp->tn_contents); rw_exit(&tp->tn_rwlock); + + if (error == 0 && vap->va_size == 0) + vnevent_truncate(vp, ct); + goto out1; } out: @@ -978,6 +986,8 @@ again: } if (error == 0) { /* name found */ + boolean_t trunc = B_FALSE; + ASSERT(oldtp); rw_enter(&oldtp->tn_rwlock, RW_WRITER); @@ -1005,6 +1015,7 @@ again: rw_enter(&oldtp->tn_contents, RW_WRITER); (void) tmpnode_trunc(tm, oldtp, 0); rw_exit(&oldtp->tn_contents); + trunc = B_TRUE; } rw_exit(&oldtp->tn_rwlock); if (IS_DEVVP(*vpp)) { @@ -1019,9 +1030,9 @@ again: *vpp = newvp; } - if (error == 0) { + if (trunc) vnevent_create(*vpp, ct); - } + return (0); } @@ -2318,6 +2329,9 @@ tmp_space( if ((bfp->l_start > MAXOFF_T) || (bfp->l_len > MAXOFF_T)) return (EFBIG); error = tmp_freesp(vp, bfp, flag); + + if (error == 0 && bfp->l_start == 0) + vnevent_truncate(vp, ct); } return (error); } |