|
|
| version 1.692, 2007/03/10 02:56:10 | version 1.693, 2007/03/30 04:04:14 |
|---|---|
| Line 133 xfs_getattr( | Line 133 xfs_getattr( |
| if (!(flags & ATTR_LAZY)) | if (!(flags & ATTR_LAZY)) |
| xfs_ilock(ip, XFS_ILOCK_SHARED); | xfs_ilock(ip, XFS_ILOCK_SHARED); |
| vap->va_size = ip->i_d.di_size; | vap->va_size = XFS_ISIZE(ip); |
| if (vap->va_mask == XFS_AT_SIZE) | if (vap->va_mask == XFS_AT_SIZE) |
| goto all_done; | goto all_done; |
| Line 496 xfs_setattr( | Line 496 xfs_setattr( |
| if (mask & XFS_AT_SIZE) { | if (mask & XFS_AT_SIZE) { |
| /* Short circuit the truncate case for zero length files */ | /* Short circuit the truncate case for zero length files */ |
| if ((vap->va_size == 0) && | if ((vap->va_size == 0) && |
| (ip->i_d.di_size == 0) && (ip->i_d.di_nextents == 0)) { | (ip->i_size == 0) && (ip->i_d.di_nextents == 0)) { |
| xfs_iunlock(ip, XFS_ILOCK_EXCL); | xfs_iunlock(ip, XFS_ILOCK_EXCL); |
| lock_flags &= ~XFS_ILOCK_EXCL; | lock_flags &= ~XFS_ILOCK_EXCL; |
| if (mask & XFS_AT_CTIME) | if (mask & XFS_AT_CTIME) |
| Line 614 xfs_setattr( | Line 614 xfs_setattr( |
| */ | */ |
| if (mask & XFS_AT_SIZE) { | if (mask & XFS_AT_SIZE) { |
| code = 0; | code = 0; |
| if ((vap->va_size > ip->i_d.di_size) && | if ((vap->va_size > ip->i_size) && |
| (flags & ATTR_NOSIZETOK) == 0) { | (flags & ATTR_NOSIZETOK) == 0) { |
| code = xfs_igrow_start(ip, vap->va_size, credp); | code = xfs_igrow_start(ip, vap->va_size, credp); |
| } | } |
| Line 654 xfs_setattr( | Line 654 xfs_setattr( |
| * Truncate file. Must have write permission and not be a directory. | * Truncate file. Must have write permission and not be a directory. |
| */ | */ |
| if (mask & XFS_AT_SIZE) { | if (mask & XFS_AT_SIZE) { |
| if (vap->va_size > ip->i_d.di_size) { | if (vap->va_size > ip->i_size) { |
| xfs_igrow_finish(tp, ip, vap->va_size, | xfs_igrow_finish(tp, ip, vap->va_size, |
| !(flags & ATTR_DMI)); | !(flags & ATTR_DMI)); |
| } else if ((vap->va_size <= ip->i_d.di_size) || | } else if ((vap->va_size <= ip->i_size) || |
| ((vap->va_size == 0) && ip->i_d.di_nextents)) { | ((vap->va_size == 0) && ip->i_d.di_nextents)) { |
| /* | /* |
| * signal a sync transaction unless | * signal a sync transaction unless |
| Line 1221 xfs_inactive_free_eofblocks( | Line 1221 xfs_inactive_free_eofblocks( |
| * Figure out if there are any blocks beyond the end | * Figure out if there are any blocks beyond the end |
| * of the file. If not, then there is nothing to do. | * of the file. If not, then there is nothing to do. |
| */ | */ |
| end_fsb = XFS_B_TO_FSB(mp, ((xfs_ufsize_t)ip->i_d.di_size)); | end_fsb = XFS_B_TO_FSB(mp, ((xfs_ufsize_t)ip->i_size)); |
| last_fsb = XFS_B_TO_FSB(mp, (xfs_ufsize_t)XFS_MAXIOFFSET(mp)); | last_fsb = XFS_B_TO_FSB(mp, (xfs_ufsize_t)XFS_MAXIOFFSET(mp)); |
| map_len = last_fsb - end_fsb; | map_len = last_fsb - end_fsb; |
| if (map_len <= 0) | if (map_len <= 0) |
| Line 1258 xfs_inactive_free_eofblocks( | Line 1258 xfs_inactive_free_eofblocks( |
| */ | */ |
| xfs_ilock(ip, XFS_IOLOCK_EXCL); | xfs_ilock(ip, XFS_IOLOCK_EXCL); |
| error = xfs_itruncate_start(ip, XFS_ITRUNC_DEFINITE, | error = xfs_itruncate_start(ip, XFS_ITRUNC_DEFINITE, |
| ip->i_d.di_size); | ip->i_size); |
| if (error) { | if (error) { |
| xfs_iunlock(ip, XFS_IOLOCK_EXCL); | xfs_iunlock(ip, XFS_IOLOCK_EXCL); |
| return error; | return error; |
| Line 1282 xfs_inactive_free_eofblocks( | Line 1282 xfs_inactive_free_eofblocks( |
| xfs_trans_ihold(tp, ip); | xfs_trans_ihold(tp, ip); |
| error = xfs_itruncate_finish(&tp, ip, | error = xfs_itruncate_finish(&tp, ip, |
| ip->i_d.di_size, | ip->i_size, |
| XFS_DATA_FORK, | XFS_DATA_FORK, |
| 0); | 0); |
| /* | /* |
| Line 1568 xfs_release( | Line 1568 xfs_release( |
| if (ip->i_d.di_nlink != 0) { | if (ip->i_d.di_nlink != 0) { |
| if ((((ip->i_d.di_mode & S_IFMT) == S_IFREG) && | if ((((ip->i_d.di_mode & S_IFMT) == S_IFREG) && |
| ((ip->i_d.di_size > 0) || (VN_CACHED(vp) > 0 || | ((ip->i_size > 0) || (VN_CACHED(vp) > 0 || |
| ip->i_delayed_blks > 0)) && | ip->i_delayed_blks > 0)) && |
| (ip->i_df.if_flags & XFS_IFEXTENTS)) && | (ip->i_df.if_flags & XFS_IFEXTENTS)) && |
| (!(ip->i_d.di_flags & | (!(ip->i_d.di_flags & |
| Line 1629 xfs_inactive( | Line 1629 xfs_inactive( |
| * only one with a reference to the inode. | * only one with a reference to the inode. |
| */ | */ |
| truncate = ((ip->i_d.di_nlink == 0) && | truncate = ((ip->i_d.di_nlink == 0) && |
| ((ip->i_d.di_size != 0) || (ip->i_d.di_nextents > 0) || | ((ip->i_d.di_size != 0) || (ip->i_size != 0) || |
| (ip->i_delayed_blks > 0)) && | (ip->i_d.di_nextents > 0) || (ip->i_delayed_blks > 0)) && |
| ((ip->i_d.di_mode & S_IFMT) == S_IFREG)); | ((ip->i_d.di_mode & S_IFMT) == S_IFREG)); |
| mp = ip->i_mount; | mp = ip->i_mount; |
| Line 1648 xfs_inactive( | Line 1648 xfs_inactive( |
| if (ip->i_d.di_nlink != 0) { | if (ip->i_d.di_nlink != 0) { |
| if ((((ip->i_d.di_mode & S_IFMT) == S_IFREG) && | if ((((ip->i_d.di_mode & S_IFMT) == S_IFREG) && |
| ((ip->i_d.di_size > 0) || (VN_CACHED(vp) > 0 || | ((ip->i_size > 0) || (VN_CACHED(vp) > 0 || |
| ip->i_delayed_blks > 0)) && | ip->i_delayed_blks > 0)) && |
| (ip->i_df.if_flags & XFS_IFEXTENTS) && | (ip->i_df.if_flags & XFS_IFEXTENTS) && |
| (!(ip->i_d.di_flags & | (!(ip->i_d.di_flags & |
| Line 4055 xfs_alloc_file_space( | Line 4055 xfs_alloc_file_space( |
| allocatesize_fsb = XFS_B_TO_FSB(mp, count); | allocatesize_fsb = XFS_B_TO_FSB(mp, count); |
| /* Generate a DMAPI event if needed. */ | /* Generate a DMAPI event if needed. */ |
| if (alloc_type != 0 && offset < ip->i_d.di_size && | if (alloc_type != 0 && offset < ip->i_size && |
| (attr_flags&ATTR_DMI) == 0 && | (attr_flags&ATTR_DMI) == 0 && |
| DM_EVENT_ENABLED(XFS_MTOVFS(mp), ip, DM_EVENT_WRITE)) { | DM_EVENT_ENABLED(XFS_MTOVFS(mp), ip, DM_EVENT_WRITE)) { |
| xfs_off_t end_dmi_offset; | xfs_off_t end_dmi_offset; |
| end_dmi_offset = offset+len; | end_dmi_offset = offset+len; |
| if (end_dmi_offset > ip->i_d.di_size) | if (end_dmi_offset > ip->i_size) |
| end_dmi_offset = ip->i_d.di_size; | end_dmi_offset = ip->i_size; |
| error = XFS_SEND_DATA(mp, DM_EVENT_WRITE, XFS_ITOV(ip), | error = XFS_SEND_DATA(mp, DM_EVENT_WRITE, XFS_ITOV(ip), |
| offset, end_dmi_offset - offset, | offset, end_dmi_offset - offset, |
| 0, NULL); | 0, NULL); |
| Line 4318 xfs_free_file_space( | Line 4318 xfs_free_file_space( |
| end_dmi_offset = offset + len; | end_dmi_offset = offset + len; |
| endoffset_fsb = XFS_B_TO_FSBT(mp, end_dmi_offset); | endoffset_fsb = XFS_B_TO_FSBT(mp, end_dmi_offset); |
| if (offset < ip->i_d.di_size && | if (offset < ip->i_size && |
| (attr_flags & ATTR_DMI) == 0 && | (attr_flags & ATTR_DMI) == 0 && |
| DM_EVENT_ENABLED(XFS_MTOVFS(mp), ip, DM_EVENT_WRITE)) { | DM_EVENT_ENABLED(XFS_MTOVFS(mp), ip, DM_EVENT_WRITE)) { |
| if (end_dmi_offset > ip->i_d.di_size) | if (end_dmi_offset > ip->i_size) |
| end_dmi_offset = ip->i_d.di_size; | end_dmi_offset = ip->i_size; |
| error = XFS_SEND_DATA(mp, DM_EVENT_WRITE, vp, | error = XFS_SEND_DATA(mp, DM_EVENT_WRITE, vp, |
| offset, end_dmi_offset - offset, | offset, end_dmi_offset - offset, |
| AT_DELAY_FLAG(attr_flags), NULL); | AT_DELAY_FLAG(attr_flags), NULL); |
| Line 4541 xfs_change_file_space( | Line 4541 xfs_change_file_space( |
| bf->l_start += offset; | bf->l_start += offset; |
| break; | break; |
| case 2: /*SEEK_END*/ | case 2: /*SEEK_END*/ |
| bf->l_start += ip->i_d.di_size; | bf->l_start += ip->i_size; |
| break; | break; |
| default: | default: |
| return XFS_ERROR(EINVAL); | return XFS_ERROR(EINVAL); |
| Line 4558 xfs_change_file_space( | Line 4558 xfs_change_file_space( |
| bf->l_whence = 0; | bf->l_whence = 0; |
| startoffset = bf->l_start; | startoffset = bf->l_start; |
| fsize = ip->i_d.di_size; | fsize = ip->i_size; |
| /* | /* |
| * XFS_IOC_RESVSP and XFS_IOC_UNRESVSP will reserve or unreserve | * XFS_IOC_RESVSP and XFS_IOC_UNRESVSP will reserve or unreserve |