Print this page
OS-5148 ftruncate at offset should emit proper events
Reviewed by: Bryan Cantrill <bryan@joyent.com>
Reviewed by: Jerry Jelinek <jerry.jelinek@joyent.com>


 764                         pcp->pc_entry.pcd_attr &= ~PCA_RDONLY;
 765                 pcp->pc_flags |= PC_CHG;
 766         }
 767         /*
 768          * Truncate file. Must have write permission.
 769          */
 770         if ((mask & AT_SIZE) && (vap->va_size != (u_offset_t)-1)) {
 771                 if (pcp->pc_entry.pcd_attr & PCA_RDONLY) {
 772                         error = EACCES;
 773                         goto out;
 774                 }
 775                 if (vap->va_size > UINT32_MAX) {
 776                         error = EFBIG;
 777                         goto out;
 778                 }
 779                 error = pc_truncate(pcp, (uint_t)vap->va_size);
 780 
 781                 if (error)
 782                         goto out;
 783 
 784                 if (vap->va_size == 0)
 785                         vnevent_truncate(vp, ct);


 786         }

 787         /*
 788          * Change file modified times.
 789          */
 790         if (mask & (AT_MTIME | AT_CTIME)) {
 791                 /*
 792                  * If SysV-compatible option to set access and
 793                  * modified times if privileged, owner, or write access,
 794                  * use current time rather than va_mtime.
 795                  *
 796                  * XXX - va_mtime.tv_sec == -1 flags this.
 797                  */
 798                 timep = &vap->va_mtime;
 799                 if (vap->va_mtime.tv_sec == -1) {
 800                         gethrestime(&now);
 801                         timep = &now;
 802                 }
 803                 if ((fsp->pcfs_flags & PCFS_NOCLAMPTIME) == 0 &&
 804                     timep->tv_sec > INT32_MAX) {
 805                         error = EOVERFLOW;
 806                         goto out;




 764                         pcp->pc_entry.pcd_attr &= ~PCA_RDONLY;
 765                 pcp->pc_flags |= PC_CHG;
 766         }
 767         /*
 768          * Truncate file. Must have write permission.
 769          */
 770         if ((mask & AT_SIZE) && (vap->va_size != (u_offset_t)-1)) {
 771                 if (pcp->pc_entry.pcd_attr & PCA_RDONLY) {
 772                         error = EACCES;
 773                         goto out;
 774                 }
 775                 if (vap->va_size > UINT32_MAX) {
 776                         error = EFBIG;
 777                         goto out;
 778                 }
 779                 error = pc_truncate(pcp, (uint_t)vap->va_size);
 780 
 781                 if (error)
 782                         goto out;
 783 
 784                 if (vap->va_size == 0) {
 785                         vnevent_truncate(vp, ct);
 786                 } else {
 787                         vnevent_resize(vp, ct);
 788                 }
 789         }
 790         /*
 791          * Change file modified times.
 792          */
 793         if (mask & (AT_MTIME | AT_CTIME)) {
 794                 /*
 795                  * If SysV-compatible option to set access and
 796                  * modified times if privileged, owner, or write access,
 797                  * use current time rather than va_mtime.
 798                  *
 799                  * XXX - va_mtime.tv_sec == -1 flags this.
 800                  */
 801                 timep = &vap->va_mtime;
 802                 if (vap->va_mtime.tv_sec == -1) {
 803                         gethrestime(&now);
 804                         timep = &now;
 805                 }
 806                 if ((fsp->pcfs_flags & PCFS_NOCLAMPTIME) == 0 &&
 807                     timep->tv_sec > INT32_MAX) {
 808                         error = EOVERFLOW;
 809                         goto out;