diff options
| author | Christoph Hellwig <hch@infradead.org> | 2008-07-18 03:13:28 -0400 |
|---|---|---|
| committer | Niv Sardi <xaiki@debian.org> | 2008-07-28 02:59:37 -0400 |
| commit | 0f285c8a1c4cacfd9f2aec077b06e2b537ee57ab (patch) | |
| tree | 5b10300cfe765f13e1437d0ffa4a66a6d31d1187 | |
| parent | 25fe55e814a2964c7e16d16a5d08cae6e9313a3a (diff) | |
[XFS] Now that xfs_setattr is only used for attributes set from ->setattr
it can be switched to take struct iattr directly and thus simplify the
implementation greatly. Also rename the ATTR_ flags to XFS_ATTR_ to not
conflict with the ATTR_ flags used by the VFS.
SGI-PV: 984565
SGI-Modid: xfs-linux-melb:xfs-kern:31678a
Signed-off-by: Christoph Hellwig <hch@infradead.org>
Signed-off-by: Tim Shimmin <tes@sgi.com>
Signed-off-by: Lachlan McIlroy <lachlan@sgi.com>
| -rw-r--r-- | fs/xfs/linux-2.6/xfs_ioctl.c | 4 | ||||
| -rw-r--r-- | fs/xfs/linux-2.6/xfs_iops.c | 56 | ||||
| -rw-r--r-- | fs/xfs/linux-2.6/xfs_vnode.h | 73 | ||||
| -rw-r--r-- | fs/xfs/xfs_acl.c | 18 | ||||
| -rw-r--r-- | fs/xfs/xfs_dmapi.h | 2 | ||||
| -rw-r--r-- | fs/xfs/xfs_vnodeops.c | 172 | ||||
| -rw-r--r-- | fs/xfs/xfs_vnodeops.h | 8 |
7 files changed, 102 insertions, 231 deletions
diff --git a/fs/xfs/linux-2.6/xfs_ioctl.c b/fs/xfs/linux-2.6/xfs_ioctl.c index d2bbb0532ef6..d1b0da6bcdca 100644 --- a/fs/xfs/linux-2.6/xfs_ioctl.c +++ b/fs/xfs/linux-2.6/xfs_ioctl.c | |||
| @@ -688,9 +688,9 @@ xfs_ioc_space( | |||
| 688 | return -XFS_ERROR(EFAULT); | 688 | return -XFS_ERROR(EFAULT); |
| 689 | 689 | ||
| 690 | if (filp->f_flags & (O_NDELAY|O_NONBLOCK)) | 690 | if (filp->f_flags & (O_NDELAY|O_NONBLOCK)) |
| 691 | attr_flags |= ATTR_NONBLOCK; | 691 | attr_flags |= XFS_ATTR_NONBLOCK; |
| 692 | if (ioflags & IO_INVIS) | 692 | if (ioflags & IO_INVIS) |
| 693 | attr_flags |= ATTR_DMI; | 693 | attr_flags |= XFS_ATTR_DMI; |
| 694 | 694 | ||
| 695 | error = xfs_change_file_space(ip, cmd, &bf, filp->f_pos, | 695 | error = xfs_change_file_space(ip, cmd, &bf, filp->f_pos, |
| 696 | NULL, attr_flags); | 696 | NULL, attr_flags); |
diff --git a/fs/xfs/linux-2.6/xfs_iops.c b/fs/xfs/linux-2.6/xfs_iops.c index 7b42569968fe..669bbdc20857 100644 --- a/fs/xfs/linux-2.6/xfs_iops.c +++ b/fs/xfs/linux-2.6/xfs_iops.c | |||
| @@ -648,54 +648,20 @@ xfs_vn_getattr( | |||
| 648 | STATIC int | 648 | STATIC int |
| 649 | xfs_vn_setattr( | 649 | xfs_vn_setattr( |
| 650 | struct dentry *dentry, | 650 | struct dentry *dentry, |
| 651 | struct iattr *attr) | 651 | struct iattr *iattr) |
| 652 | { | 652 | { |
| 653 | struct inode *inode = dentry->d_inode; | 653 | struct inode *inode = dentry->d_inode; |
| 654 | unsigned int ia_valid = attr->ia_valid; | ||
| 655 | bhv_vattr_t vattr = { 0 }; | ||
| 656 | int flags = 0; | ||
| 657 | int error; | 654 | int error; |
| 658 | 655 | ||
| 659 | if (ia_valid & ATTR_UID) { | 656 | if (iattr->ia_valid & ATTR_ATIME) |
| 660 | vattr.va_mask |= XFS_AT_UID; | 657 | inode->i_atime = iattr->ia_atime; |
| 661 | vattr.va_uid = attr->ia_uid; | 658 | |
| 662 | } | 659 | if (iattr->ia_valid & ATTR_MODE) { |
| 663 | if (ia_valid & ATTR_GID) { | ||
| 664 | vattr.va_mask |= XFS_AT_GID; | ||
| 665 | vattr.va_gid = attr->ia_gid; | ||
| 666 | } | ||
| 667 | if (ia_valid & ATTR_SIZE) { | ||
| 668 | vattr.va_mask |= XFS_AT_SIZE; | ||
| 669 | vattr.va_size = attr->ia_size; | ||
| 670 | } | ||
| 671 | if (ia_valid & ATTR_ATIME) { | ||
| 672 | vattr.va_mask |= XFS_AT_ATIME; | ||
| 673 | vattr.va_atime = attr->ia_atime; | ||
| 674 | inode->i_atime = attr->ia_atime; | ||
| 675 | } | ||
| 676 | if (ia_valid & ATTR_MTIME) { | ||
| 677 | vattr.va_mask |= XFS_AT_MTIME; | ||
| 678 | vattr.va_mtime = attr->ia_mtime; | ||
| 679 | } | ||
| 680 | if (ia_valid & ATTR_CTIME) { | ||
| 681 | vattr.va_mask |= XFS_AT_CTIME; | ||
| 682 | vattr.va_ctime = attr->ia_ctime; | ||
| 683 | } | ||
| 684 | if (ia_valid & ATTR_MODE) { | ||
| 685 | vattr.va_mask |= XFS_AT_MODE; | ||
| 686 | vattr.va_mode = attr->ia_mode; | ||
| 687 | if (!in_group_p(inode->i_gid) && !capable(CAP_FSETID)) | 660 | if (!in_group_p(inode->i_gid) && !capable(CAP_FSETID)) |
| 688 | inode->i_mode &= ~S_ISGID; | 661 | inode->i_mode &= ~S_ISGID; |
| 689 | } | 662 | } |
| 690 | 663 | ||
| 691 | if (ia_valid & (ATTR_MTIME_SET | ATTR_ATIME_SET)) | 664 | error = xfs_setattr(XFS_I(inode), iattr, 0, NULL); |
| 692 | flags |= ATTR_UTIME; | ||
| 693 | #ifdef ATTR_NO_BLOCK | ||
| 694 | if ((ia_valid & ATTR_NO_BLOCK)) | ||
| 695 | flags |= ATTR_NONBLOCK; | ||
| 696 | #endif | ||
| 697 | |||
| 698 | error = xfs_setattr(XFS_I(inode), &vattr, flags, NULL); | ||
| 699 | if (likely(!error)) | 665 | if (likely(!error)) |
| 700 | vn_revalidate(vn_from_inode(inode)); | 666 | vn_revalidate(vn_from_inode(inode)); |
| 701 | return -error; | 667 | return -error; |
| @@ -739,18 +705,18 @@ xfs_vn_fallocate( | |||
| 739 | 705 | ||
| 740 | xfs_ilock(ip, XFS_IOLOCK_EXCL); | 706 | xfs_ilock(ip, XFS_IOLOCK_EXCL); |
| 741 | error = xfs_change_file_space(ip, XFS_IOC_RESVSP, &bf, | 707 | error = xfs_change_file_space(ip, XFS_IOC_RESVSP, &bf, |
| 742 | 0, NULL, ATTR_NOLOCK); | 708 | 0, NULL, XFS_ATTR_NOLOCK); |
| 743 | if (!error && !(mode & FALLOC_FL_KEEP_SIZE) && | 709 | if (!error && !(mode & FALLOC_FL_KEEP_SIZE) && |
| 744 | offset + len > i_size_read(inode)) | 710 | offset + len > i_size_read(inode)) |
| 745 | new_size = offset + len; | 711 | new_size = offset + len; |
| 746 | 712 | ||
| 747 | /* Change file size if needed */ | 713 | /* Change file size if needed */ |
| 748 | if (new_size) { | 714 | if (new_size) { |
| 749 | bhv_vattr_t va; | 715 | struct iattr iattr; |
| 750 | 716 | ||
| 751 | va.va_mask = XFS_AT_SIZE; | 717 | iattr.ia_valid = ATTR_SIZE; |
| 752 | va.va_size = new_size; | 718 | iattr.ia_size = new_size; |
| 753 | error = xfs_setattr(ip, &va, ATTR_NOLOCK, NULL); | 719 | error = xfs_setattr(ip, &iattr, XFS_ATTR_NOLOCK, NULL); |
| 754 | } | 720 | } |
| 755 | 721 | ||
| 756 | xfs_iunlock(ip, XFS_IOLOCK_EXCL); | 722 | xfs_iunlock(ip, XFS_IOLOCK_EXCL); |
diff --git a/fs/xfs/linux-2.6/xfs_vnode.h b/fs/xfs/linux-2.6/xfs_vnode.h index 7797c9cdb591..96e4a7b5391c 100644 --- a/fs/xfs/linux-2.6/xfs_vnode.h +++ b/fs/xfs/linux-2.6/xfs_vnode.h | |||
| @@ -19,7 +19,6 @@ | |||
| 19 | #define __XFS_VNODE_H__ | 19 | #define __XFS_VNODE_H__ |
| 20 | 20 | ||
| 21 | struct file; | 21 | struct file; |
| 22 | struct bhv_vattr; | ||
| 23 | struct xfs_iomap; | 22 | struct xfs_iomap; |
| 24 | struct attrlist_cursor_kern; | 23 | struct attrlist_cursor_kern; |
| 25 | 24 | ||
| @@ -66,69 +65,6 @@ static inline struct inode *vn_to_inode(bhv_vnode_t *vnode) | |||
| 66 | Prevent VM access to the pages until | 65 | Prevent VM access to the pages until |
| 67 | the operation completes. */ | 66 | the operation completes. */ |
| 68 | 67 | ||
| 69 | /* | ||
| 70 | * Vnode attributes. va_mask indicates those attributes the caller | ||
| 71 | * wants to set or extract. | ||
| 72 | */ | ||
| 73 | typedef struct bhv_vattr { | ||
| 74 | int va_mask; /* bit-mask of attributes present */ | ||
| 75 | mode_t va_mode; /* file access mode and type */ | ||
| 76 | xfs_nlink_t va_nlink; /* number of references to file */ | ||
| 77 | uid_t va_uid; /* owner user id */ | ||
| 78 | gid_t va_gid; /* owner group id */ | ||
| 79 | xfs_ino_t va_nodeid; /* file id */ | ||
| 80 | xfs_off_t va_size; /* file size in bytes */ | ||
| 81 | u_long va_blocksize; /* blocksize preferred for i/o */ | ||
| 82 | struct timespec va_atime; /* time of last access */ | ||
| 83 | struct timespec va_mtime; /* time of last modification */ | ||
| 84 | struct timespec va_ctime; /* time file changed */ | ||
| 85 | u_int va_gen; /* generation number of file */ | ||
| 86 | xfs_dev_t va_rdev; /* device the special file represents */ | ||
| 87 | __int64_t va_nblocks; /* number of blocks allocated */ | ||
| 88 | u_long va_xflags; /* random extended file flags */ | ||
| 89 | u_long va_extsize; /* file extent size */ | ||
| 90 | u_long va_nextents; /* number of extents in file */ | ||
| 91 | u_long va_anextents; /* number of attr extents in file */ | ||
| 92 | prid_t va_projid; /* project id */ | ||
| 93 | } bhv_vattr_t; | ||
| 94 | |||
| 95 | /* | ||
| 96 | * setattr or getattr attributes | ||
| 97 | */ | ||
| 98 | #define XFS_AT_TYPE 0x00000001 | ||
| 99 | #define XFS_AT_MODE 0x00000002 | ||
| 100 | #define XFS_AT_UID 0x00000004 | ||
| 101 | #define XFS_AT_GID 0x00000008 | ||
| 102 | #define XFS_AT_FSID 0x00000010 | ||
| 103 | #define XFS_AT_NODEID 0x00000020 | ||
| 104 | #define XFS_AT_NLINK 0x00000040 | ||
| 105 | #define XFS_AT_SIZE 0x00000080 | ||
| 106 | #define XFS_AT_ATIME 0x00000100 | ||
| 107 | #define XFS_AT_MTIME 0x00000200 | ||
| 108 | #define XFS_AT_CTIME 0x00000400 | ||
| 109 | #define XFS_AT_RDEV 0x00000800 | ||
| 110 | #define XFS_AT_BLKSIZE 0x00001000 | ||
| 111 | #define XFS_AT_NBLOCKS 0x00002000 | ||
| 112 | #define XFS_AT_VCODE 0x00004000 | ||
| 113 | #define XFS_AT_MAC 0x00008000 | ||
| 114 | #define XFS_AT_UPDATIME 0x00010000 | ||
| 115 | #define XFS_AT_UPDMTIME 0x00020000 | ||
| 116 | #define XFS_AT_UPDCTIME 0x00040000 | ||
| 117 | #define XFS_AT_ACL 0x00080000 | ||
| 118 | #define XFS_AT_CAP 0x00100000 | ||
| 119 | #define XFS_AT_INF 0x00200000 | ||
| 120 | #define XFS_AT_NEXTENTS 0x01000000 | ||
| 121 | #define XFS_AT_ANEXTENTS 0x02000000 | ||
| 122 | #define XFS_AT_SIZE_NOPERM 0x08000000 | ||
| 123 | #define XFS_AT_GENCOUNT 0x10000000 | ||
| 124 | |||
| 125 | #define XFS_AT_TIMES (XFS_AT_ATIME|XFS_AT_MTIME|XFS_AT_CTIME) | ||
| 126 | |||
| 127 | #define XFS_AT_UPDTIMES (XFS_AT_UPDATIME|XFS_AT_UPDMTIME|XFS_AT_UPDCTIME) | ||
| 128 | |||
| 129 | #define XFS_AT_NOSET (XFS_AT_NLINK|XFS_AT_RDEV|XFS_AT_FSID|XFS_AT_NODEID|\ | ||
| 130 | XFS_AT_TYPE|XFS_AT_BLKSIZE|XFS_AT_NBLOCKS|XFS_AT_VCODE|\ | ||
| 131 | XFS_AT_NEXTENTS|XFS_AT_ANEXTENTS|XFS_AT_GENCOUNT) | ||
| 132 | 68 | ||
| 133 | extern void vn_init(void); | 69 | extern void vn_init(void); |
| 134 | extern int vn_revalidate(bhv_vnode_t *); | 70 | extern int vn_revalidate(bhv_vnode_t *); |
| @@ -204,15 +140,6 @@ static inline void vn_atime_to_time_t(bhv_vnode_t *vp, time_t *tt) | |||
| 204 | #define VN_DIRTY(vp) mapping_tagged(vn_to_inode(vp)->i_mapping, \ | 140 | #define VN_DIRTY(vp) mapping_tagged(vn_to_inode(vp)->i_mapping, \ |
| 205 | PAGECACHE_TAG_DIRTY) | 141 | PAGECACHE_TAG_DIRTY) |
| 206 | 142 | ||
| 207 | /* | ||
| 208 | * Flags to vop_setattr/getattr. | ||
| 209 | */ | ||
| 210 | #define ATTR_UTIME 0x01 /* non-default utime(2) request */ | ||
| 211 | #define ATTR_DMI 0x08 /* invocation from a DMI function */ | ||
| 212 | #define ATTR_LAZY 0x80 /* set/get attributes lazily */ | ||
| 213 | #define ATTR_NONBLOCK 0x100 /* return EAGAIN if operation would block */ | ||
| 214 | #define ATTR_NOLOCK 0x200 /* Don't grab any conflicting locks */ | ||
| 215 | #define ATTR_NOSIZETOK 0x400 /* Don't get the SIZE token */ | ||
| 216 | 143 | ||
| 217 | /* | 144 | /* |
| 218 | * Tracking vnode activity. | 145 | * Tracking vnode activity. |
diff --git a/fs/xfs/xfs_acl.c b/fs/xfs/xfs_acl.c index 93057af2fe3d..3e4648ad9cfc 100644 --- a/fs/xfs/xfs_acl.c +++ b/fs/xfs/xfs_acl.c | |||
| @@ -719,7 +719,7 @@ xfs_acl_setmode( | |||
| 719 | xfs_acl_t *acl, | 719 | xfs_acl_t *acl, |
| 720 | int *basicperms) | 720 | int *basicperms) |
| 721 | { | 721 | { |
| 722 | bhv_vattr_t va; | 722 | struct iattr iattr; |
| 723 | xfs_acl_entry_t *ap; | 723 | xfs_acl_entry_t *ap; |
| 724 | xfs_acl_entry_t *gap = NULL; | 724 | xfs_acl_entry_t *gap = NULL; |
| 725 | int i, nomask = 1; | 725 | int i, nomask = 1; |
| @@ -733,25 +733,25 @@ xfs_acl_setmode( | |||
| 733 | * Copy the u::, g::, o::, and m:: bits from the ACL into the | 733 | * Copy the u::, g::, o::, and m:: bits from the ACL into the |
| 734 | * mode. The m:: bits take precedence over the g:: bits. | 734 | * mode. The m:: bits take precedence over the g:: bits. |
| 735 | */ | 735 | */ |
| 736 | va.va_mask = XFS_AT_MODE; | 736 | iattr.ia_valid = ATTR_MODE; |
| 737 | va.va_mode = xfs_vtoi(vp)->i_d.di_mode; | 737 | iattr.ia_mode = xfs_vtoi(vp)->i_d.di_mode; |
| 738 | va.va_mode &= ~(S_IRWXU|S_IRWXG|S_IRWXO); | 738 | iattr.ia_mode &= ~(S_IRWXU|S_IRWXG|S_IRWXO); |
| 739 | ap = acl->acl_entry; | 739 | ap = acl->acl_entry; |
| 740 | for (i = 0; i < acl->acl_cnt; ++i) { | 740 | for (i = 0; i < acl->acl_cnt; ++i) { |
| 741 | switch (ap->ae_tag) { | 741 | switch (ap->ae_tag) { |
| 742 | case ACL_USER_OBJ: | 742 | case ACL_USER_OBJ: |
| 743 | va.va_mode |= ap->ae_perm << 6; | 743 | iattr.ia_mode |= ap->ae_perm << 6; |
| 744 | break; | 744 | break; |
| 745 | case ACL_GROUP_OBJ: | 745 | case ACL_GROUP_OBJ: |
| 746 | gap = ap; | 746 | gap = ap; |
| 747 | break; | 747 | break; |
| 748 | case ACL_MASK: /* more than just standard modes */ | 748 | case ACL_MASK: /* more than just standard modes */ |
| 749 | nomask = 0; | 749 | nomask = 0; |
| 750 | va.va_mode |= ap->ae_perm << 3; | 750 | iattr.ia_mode |= ap->ae_perm << 3; |
| 751 | *basicperms = 0; | 751 | *basicperms = 0; |
| 752 | break; | 752 | break; |
| 753 | case ACL_OTHER: | 753 | case ACL_OTHER: |
| 754 | va.va_mode |= ap->ae_perm; | 754 | iattr.ia_mode |= ap->ae_perm; |
| 755 | break; | 755 | break; |
| 756 | default: /* more than just standard modes */ | 756 | default: /* more than just standard modes */ |
| 757 | *basicperms = 0; | 757 | *basicperms = 0; |
| @@ -762,9 +762,9 @@ xfs_acl_setmode( | |||
| 762 | 762 | ||
| 763 | /* Set the group bits from ACL_GROUP_OBJ if there's no ACL_MASK */ | 763 | /* Set the group bits from ACL_GROUP_OBJ if there's no ACL_MASK */ |
| 764 | if (gap && nomask) | 764 | if (gap && nomask) |
| 765 | va.va_mode |= gap->ae_perm << 3; | 765 | iattr.ia_mode |= gap->ae_perm << 3; |
| 766 | 766 | ||
| 767 | return xfs_setattr(xfs_vtoi(vp), &va, 0, sys_cred); | 767 | return xfs_setattr(xfs_vtoi(vp), &iattr, 0, sys_cred); |
| 768 | } | 768 | } |
| 769 | 769 | ||
| 770 | /* | 770 | /* |
diff --git a/fs/xfs/xfs_dmapi.h b/fs/xfs/xfs_dmapi.h index f71784ab6a60..cdc2d3464a1a 100644 --- a/fs/xfs/xfs_dmapi.h +++ b/fs/xfs/xfs_dmapi.h | |||
| @@ -166,6 +166,6 @@ typedef enum { | |||
| 166 | 166 | ||
| 167 | #define FILP_DELAY_FLAG(filp) ((filp->f_flags&(O_NDELAY|O_NONBLOCK)) ? \ | 167 | #define FILP_DELAY_FLAG(filp) ((filp->f_flags&(O_NDELAY|O_NONBLOCK)) ? \ |
| 168 | DM_FLAGS_NDELAY : 0) | 168 | DM_FLAGS_NDELAY : 0) |
| 169 | #define AT_DELAY_FLAG(f) ((f&ATTR_NONBLOCK) ? DM_FLAGS_NDELAY : 0) | 169 | #define AT_DELAY_FLAG(f) ((f & XFS_ATTR_NONBLOCK) ? DM_FLAGS_NDELAY : 0) |
| 170 | 170 | ||
| 171 | #endif /* __XFS_DMAPI_H__ */ | 171 | #endif /* __XFS_DMAPI_H__ */ |
diff --git a/fs/xfs/xfs_vnodeops.c b/fs/xfs/xfs_vnodeops.c index ed399523b782..b792a121b1a7 100644 --- a/fs/xfs/xfs_vnodeops.c +++ b/fs/xfs/xfs_vnodeops.c | |||
| @@ -75,19 +75,16 @@ xfs_open( | |||
| 75 | return 0; | 75 | return 0; |
| 76 | } | 76 | } |
| 77 | 77 | ||
| 78 | /* | ||
| 79 | * xfs_setattr | ||
| 80 | */ | ||
| 81 | int | 78 | int |
| 82 | xfs_setattr( | 79 | xfs_setattr( |
| 83 | xfs_inode_t *ip, | 80 | struct xfs_inode *ip, |
| 84 | bhv_vattr_t *vap, | 81 | struct iattr *iattr, |
| 85 | int flags, | 82 | int flags, |
| 86 | cred_t *credp) | 83 | cred_t *credp) |
| 87 | { | 84 | { |
| 88 | xfs_mount_t *mp = ip->i_mount; | 85 | xfs_mount_t *mp = ip->i_mount; |
| 86 | int mask = iattr->ia_valid; | ||
| 89 | xfs_trans_t *tp; | 87 | xfs_trans_t *tp; |
| 90 | int mask; | ||
| 91 | int code; | 88 | int code; |
| 92 | uint lock_flags; | 89 | uint lock_flags; |
| 93 | uint commit_flags=0; | 90 | uint commit_flags=0; |
| @@ -103,30 +100,9 @@ xfs_setattr( | |||
| 103 | if (mp->m_flags & XFS_MOUNT_RDONLY) | 100 | if (mp->m_flags & XFS_MOUNT_RDONLY) |
| 104 | return XFS_ERROR(EROFS); | 101 | return XFS_ERROR(EROFS); |
| 105 | 102 | ||
| 106 | /* | ||
| 107 | * Cannot set certain attributes. | ||
| 108 | */ | ||
| 109 | mask = vap->va_mask; | ||
| 110 | if (mask & XFS_AT_NOSET) { | ||
| 111 | return XFS_ERROR(EINVAL); | ||
| 112 | } | ||
| 113 | |||
| 114 | if (XFS_FORCED_SHUTDOWN(mp)) | 103 | if (XFS_FORCED_SHUTDOWN(mp)) |
| 115 | return XFS_ERROR(EIO); | 104 | return XFS_ERROR(EIO); |
| 116 | 105 | ||
| 117 | /* | ||
| 118 | * Timestamps do not need to be logged and hence do not | ||
| 119 | * need to be done within a transaction. | ||
| 120 | */ | ||
| 121 | if (mask & XFS_AT_UPDTIMES) { | ||
| 122 | ASSERT((mask & ~XFS_AT_UPDTIMES) == 0); | ||
| 123 | timeflags = ((mask & XFS_AT_UPDATIME) ? XFS_ICHGTIME_ACC : 0) | | ||
| 124 | ((mask & XFS_AT_UPDCTIME) ? XFS_ICHGTIME_CHG : 0) | | ||
| 125 | ((mask & XFS_AT_UPDMTIME) ? XFS_ICHGTIME_MOD : 0); | ||
| 126 | xfs_ichgtime(ip, timeflags); | ||
| 127 | return 0; | ||
| 128 | } | ||
| 129 | |||
| 130 | olddquot1 = olddquot2 = NULL; | 106 | olddquot1 = olddquot2 = NULL; |
| 131 | udqp = gdqp = NULL; | 107 | udqp = gdqp = NULL; |
| 132 | 108 | ||
| @@ -138,17 +114,17 @@ xfs_setattr( | |||
| 138 | * If the IDs do change before we take the ilock, we're covered | 114 | * If the IDs do change before we take the ilock, we're covered |
| 139 | * because the i_*dquot fields will get updated anyway. | 115 | * because the i_*dquot fields will get updated anyway. |
| 140 | */ | 116 | */ |
| 141 | if (XFS_IS_QUOTA_ON(mp) && (mask & (XFS_AT_UID|XFS_AT_GID))) { | 117 | if (XFS_IS_QUOTA_ON(mp) && (mask & (ATTR_UID|ATTR_GID))) { |
| 142 | uint qflags = 0; | 118 | uint qflags = 0; |
| 143 | 119 | ||
| 144 | if ((mask & XFS_AT_UID) && XFS_IS_UQUOTA_ON(mp)) { | 120 | if ((mask & ATTR_UID) && XFS_IS_UQUOTA_ON(mp)) { |
| 145 | uid = vap->va_uid; | 121 | uid = iattr->ia_uid; |
| 146 | qflags |= XFS_QMOPT_UQUOTA; | 122 | qflags |= XFS_QMOPT_UQUOTA; |
| 147 | } else { | 123 | } else { |
| 148 | uid = ip->i_d.di_uid; | 124 | uid = ip->i_d.di_uid; |
| 149 | } | 125 | } |
| 150 | if ((mask & XFS_AT_GID) && XFS_IS_GQUOTA_ON(mp)) { | 126 | if ((mask & ATTR_GID) && XFS_IS_GQUOTA_ON(mp)) { |
| 151 | gid = vap->va_gid; | 127 | gid = iattr->ia_gid; |
| 152 | qflags |= XFS_QMOPT_GQUOTA; | 128 | qflags |= XFS_QMOPT_GQUOTA; |
| 153 | } else { | 129 | } else { |
| 154 | gid = ip->i_d.di_gid; | 130 | gid = ip->i_d.di_gid; |
| @@ -173,10 +149,10 @@ xfs_setattr( | |||
| 173 | */ | 149 | */ |
| 174 | tp = NULL; | 150 | tp = NULL; |
| 175 | lock_flags = XFS_ILOCK_EXCL; | 151 | lock_flags = XFS_ILOCK_EXCL; |
| 176 | if (flags & ATTR_NOLOCK) | 152 | if (flags & XFS_ATTR_NOLOCK) |
| 177 | need_iolock = 0; | 153 | need_iolock = 0; |
| 178 | if (!(mask & XFS_AT_SIZE)) { | 154 | if (!(mask & ATTR_SIZE)) { |
| 179 | if ((mask != (XFS_AT_CTIME|XFS_AT_ATIME|XFS_AT_MTIME)) || | 155 | if ((mask != (ATTR_CTIME|ATTR_ATIME|ATTR_MTIME)) || |
| 180 | (mp->m_flags & XFS_MOUNT_WSYNC)) { | 156 | (mp->m_flags & XFS_MOUNT_WSYNC)) { |
| 181 | tp = xfs_trans_alloc(mp, XFS_TRANS_SETATTR_NOT_SIZE); | 157 | tp = xfs_trans_alloc(mp, XFS_TRANS_SETATTR_NOT_SIZE); |
| 182 | commit_flags = 0; | 158 | commit_flags = 0; |
| @@ -189,10 +165,10 @@ xfs_setattr( | |||
| 189 | } | 165 | } |
| 190 | } else { | 166 | } else { |
| 191 | if (DM_EVENT_ENABLED(ip, DM_EVENT_TRUNCATE) && | 167 | if (DM_EVENT_ENABLED(ip, DM_EVENT_TRUNCATE) && |
| 192 | !(flags & ATTR_DMI)) { | 168 | !(flags & XFS_ATTR_DMI)) { |
| 193 | int dmflags = AT_DELAY_FLAG(flags) | DM_SEM_FLAG_WR; | 169 | int dmflags = AT_DELAY_FLAG(flags) | DM_SEM_FLAG_WR; |
| 194 | code = XFS_SEND_DATA(mp, DM_EVENT_TRUNCATE, ip, | 170 | code = XFS_SEND_DATA(mp, DM_EVENT_TRUNCATE, ip, |
| 195 | vap->va_size, 0, dmflags, NULL); | 171 | iattr->ia_size, 0, dmflags, NULL); |
| 196 | if (code) { | 172 | if (code) { |
| 197 | lock_flags = 0; | 173 | lock_flags = 0; |
| 198 | goto error_return; | 174 | goto error_return; |
| @@ -212,7 +188,7 @@ xfs_setattr( | |||
| 212 | * Only the owner or users with CAP_FOWNER | 188 | * Only the owner or users with CAP_FOWNER |
| 213 | * capability may do these things. | 189 | * capability may do these things. |
| 214 | */ | 190 | */ |
| 215 | if (mask & (XFS_AT_MODE|XFS_AT_UID|XFS_AT_GID)) { | 191 | if (mask & (ATTR_MODE|ATTR_UID|ATTR_GID)) { |
| 216 | /* | 192 | /* |
| 217 | * CAP_FOWNER overrides the following restrictions: | 193 | * CAP_FOWNER overrides the following restrictions: |
| 218 | * | 194 | * |
| @@ -236,21 +212,21 @@ xfs_setattr( | |||
| 236 | * IDs of the calling process shall match the group owner of | 212 | * IDs of the calling process shall match the group owner of |
| 237 | * the file when setting the set-group-ID bit on that file | 213 | * the file when setting the set-group-ID bit on that file |
| 238 | */ | 214 | */ |
| 239 | if (mask & XFS_AT_MODE) { | 215 | if (mask & ATTR_MODE) { |
| 240 | mode_t m = 0; | 216 | mode_t m = 0; |
| 241 | 217 | ||
| 242 | if ((vap->va_mode & S_ISUID) && !file_owner) | 218 | if ((iattr->ia_mode & S_ISUID) && !file_owner) |
| 243 | m |= S_ISUID; | 219 | m |= S_ISUID; |
| 244 | if ((vap->va_mode & S_ISGID) && | 220 | if ((iattr->ia_mode & S_ISGID) && |
| 245 | !in_group_p((gid_t)ip->i_d.di_gid)) | 221 | !in_group_p((gid_t)ip->i_d.di_gid)) |
| 246 | m |= S_ISGID; | 222 | m |= S_ISGID; |
| 247 | #if 0 | 223 | #if 0 |
| 248 | /* Linux allows this, Irix doesn't. */ | 224 | /* Linux allows this, Irix doesn't. */ |
| 249 | if ((vap->va_mode & S_ISVTX) && !S_ISDIR(ip->i_d.di_mode)) | 225 | if ((iattr->ia_mode & S_ISVTX) && !S_ISDIR(ip->i_d.di_mode)) |
| 250 | m |= S_ISVTX; | 226 | m |= S_ISVTX; |
| 251 | #endif | 227 | #endif |
| 252 | if (m && !capable(CAP_FSETID)) | 228 | if (m && !capable(CAP_FSETID)) |
| 253 | vap->va_mode &= ~m; | 229 | iattr->ia_mode &= ~m; |
| 254 | } | 230 | } |
| 255 | } | 231 | } |
| 256 | 232 | ||
| @@ -261,7 +237,7 @@ xfs_setattr( | |||
| 261 | * and can change the group id only to a group of which he | 237 | * and can change the group id only to a group of which he |
| 262 | * or she is a member. | 238 | * or she is a member. |
| 263 | */ | 239 | */ |
| 264 | if (mask & (XFS_AT_UID|XFS_AT_GID)) { | 240 | if (mask & (ATTR_UID|ATTR_GID)) { |
| 265 | /* | 241 | /* |
| 266 | * These IDs could have changed since we last looked at them. | 242 | * These IDs could have changed since we last looked at them. |
| 267 | * But, we're assured that if the ownership did change | 243 | * But, we're assured that if the ownership did change |
| @@ -270,8 +246,8 @@ xfs_setattr( | |||
| 270 | */ | 246 | */ |
| 271 | iuid = ip->i_d.di_uid; | 247 | iuid = ip->i_d.di_uid; |
| 272 | igid = ip->i_d.di_gid; | 248 | igid = ip->i_d.di_gid; |
| 273 | gid = (mask & XFS_AT_GID) ? vap->va_gid : igid; | 249 | gid = (mask & ATTR_GID) ? iattr->ia_gid : igid; |
| 274 | uid = (mask & XFS_AT_UID) ? vap->va_uid : iuid; | 250 | uid = (mask & ATTR_UID) ? iattr->ia_uid : iuid; |
| 275 | 251 | ||
| 276 | /* | 252 | /* |
| 277 | * CAP_CHOWN overrides the following restrictions: | 253 | * CAP_CHOWN overrides the following restrictions: |
| @@ -308,13 +284,13 @@ xfs_setattr( | |||
| 308 | /* | 284 | /* |
| 309 | * Truncate file. Must have write permission and not be a directory. | 285 | * Truncate file. Must have write permission and not be a directory. |
| 310 | */ | 286 | */ |
| 311 | if (mask & XFS_AT_SIZE) { | 287 | if (mask & ATTR_SIZE) { |
| 312 | /* Short circuit the truncate case for zero length files */ | 288 | /* Short circuit the truncate case for zero length files */ |
| 313 | if ((vap->va_size == 0) && | 289 | if (iattr->ia_size == 0 && |
| 314 | (ip->i_size == 0) && (ip->i_d.di_nextents == 0)) { | 290 | ip->i_size == 0 && ip->i_d.di_nextents == 0) { |
| 315 | xfs_iunlock(ip, XFS_ILOCK_EXCL); | 291 | xfs_iunlock(ip, XFS_ILOCK_EXCL); |
| 316 | lock_flags &= ~XFS_ILOCK_EXCL; | 292 | lock_flags &= ~XFS_ILOCK_EXCL; |
| 317 | if (mask & XFS_AT_CTIME) | 293 | if (mask & ATTR_CTIME) |
| 318 | xfs_ichgtime(ip, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG); | 294 | xfs_ichgtime(ip, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG); |
| 319 | code = 0; | 295 | code = 0; |
| 320 | goto error_return; | 296 | goto error_return; |
| @@ -337,9 +313,9 @@ xfs_setattr( | |||
| 337 | /* | 313 | /* |
| 338 | * Change file access or modified times. | 314 | * Change file access or modified times. |
| 339 | */ | 315 | */ |
| 340 | if (mask & (XFS_AT_ATIME|XFS_AT_MTIME)) { | 316 | if (mask & (ATTR_ATIME|ATTR_MTIME)) { |
| 341 | if (!file_owner) { | 317 | if (!file_owner) { |
| 342 | if ((flags & ATTR_UTIME) && | 318 | if ((mask & (ATTR_MTIME_SET|ATTR_ATIME_SET)) && |
| 343 | !capable(CAP_FOWNER)) { | 319 | !capable(CAP_FOWNER)) { |
| 344 | code = XFS_ERROR(EPERM); | 320 | code = XFS_ERROR(EPERM); |
| 345 | goto error_return; | 321 | goto error_return; |
| @@ -349,23 +325,22 @@ xfs_setattr( | |||
| 349 | 325 | ||
| 350 | /* | 326 | /* |
| 351 | * Now we can make the changes. Before we join the inode | 327 | * Now we can make the changes. Before we join the inode |
| 352 | * to the transaction, if XFS_AT_SIZE is set then take care of | 328 | * to the transaction, if ATTR_SIZE is set then take care of |
| 353 | * the part of the truncation that must be done without the | 329 | * the part of the truncation that must be done without the |
| 354 | * inode lock. This needs to be done before joining the inode | 330 | * inode lock. This needs to be done before joining the inode |
| 355 | * to the transaction, because the inode cannot be unlocked | 331 | * to the transaction, because the inode cannot be unlocked |
| 356 | * once it is a part of the transaction. | 332 | * once it is a part of the transaction. |
| 357 | */ | 333 | */ |
| 358 | if (mask & XFS_AT_SIZE) { | 334 | if (mask & ATTR_SIZE) { |
| 359 | code = 0; | 335 | code = 0; |
| 360 | if ((vap->va_size > ip->i_size) && | 336 | if (iattr->ia_size > ip->i_size) { |
| 361 | (flags & ATTR_NOSIZETOK) == 0) { | ||
| 362 | /* | 337 | /* |
| 363 | * Do the first part of growing a file: zero any data | 338 | * Do the first part of growing a file: zero any data |
| 364 | * in the last block that is beyond the old EOF. We | 339 | * in the last block that is beyond the old EOF. We |
| 365 | * need to do this before the inode is joined to the | 340 | * need to do this before the inode is joined to the |
| 366 | * transaction to modify the i_size. | 341 | * transaction to modify the i_size. |
| 367 | */ | 342 | */ |
| 368 | code = xfs_zero_eof(ip, vap->va_size, ip->i_size); | 343 | code = xfs_zero_eof(ip, iattr->ia_size, ip->i_size); |
| 369 | } | 344 | } |
| 370 | xfs_iunlock(ip, XFS_ILOCK_EXCL); | 345 | xfs_iunlock(ip, XFS_ILOCK_EXCL); |
| 371 | 346 | ||
| @@ -382,10 +357,10 @@ xfs_setattr( | |||
| 382 | * not within the range we care about here. | 357 | * not within the range we care about here. |
| 383 | */ | 358 | */ |
| 384 | if (!code && | 359 | if (!code && |
| 385 | (ip->i_size != ip->i_d.di_size) && | 360 | ip->i_size != ip->i_d.di_size && |
| 386 | (vap->va_size > ip->i_d.di_size)) { | 361 | iattr->ia_size > ip->i_d.di_size) { |
| 387 | code = xfs_flush_pages(ip, | 362 | code = xfs_flush_pages(ip, |
| 388 | ip->i_d.di_size, vap->va_size, | 363 | ip->i_d.di_size, iattr->ia_size, |
| 389 | XFS_B_ASYNC, FI_NONE); | 364 | XFS_B_ASYNC, FI_NONE); |
| 390 | } | 365 | } |
| 391 | 366 | ||
| @@ -393,7 +368,7 @@ xfs_setattr( | |||
| 393 | vn_iowait(ip); | 368 | vn_iowait(ip); |
| 394 | 369 | ||
| 395 | if (!code) | 370 | if (!code) |
| 396 | code = xfs_itruncate_data(ip, vap->va_size); | 371 | code = xfs_itruncate_data(ip, iattr->ia_size); |
| 397 | if (code) { | 372 | if (code) { |
| 398 | ASSERT(tp == NULL); | 373 | ASSERT(tp == NULL); |
| 399 | lock_flags &= ~XFS_ILOCK_EXCL; | 374 | lock_flags &= ~XFS_ILOCK_EXCL; |
| @@ -422,31 +397,30 @@ xfs_setattr( | |||
| 422 | /* | 397 | /* |
| 423 | * Truncate file. Must have write permission and not be a directory. | 398 | * Truncate file. Must have write permission and not be a directory. |
| 424 | */ | 399 | */ |
| 425 | if (mask & XFS_AT_SIZE) { | 400 | if (mask & ATTR_SIZE) { |
| 426 | /* | 401 | /* |
| 427 | * Only change the c/mtime if we are changing the size | 402 | * Only change the c/mtime if we are changing the size |
| 428 | * or we are explicitly asked to change it. This handles | 403 | * or we are explicitly asked to change it. This handles |
| 429 | * the semantic difference between truncate() and ftruncate() | 404 | * the semantic difference between truncate() and ftruncate() |
| 430 | * as implemented in the VFS. | 405 | * as implemented in the VFS. |
| 431 | */ | 406 | */ |
| 432 | if (vap->va_size != ip->i_size || (mask & XFS_AT_CTIME)) | 407 | if (iattr->ia_size != ip->i_size || (mask & ATTR_CTIME)) |
| 433 | timeflags |= XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG; | 408 | timeflags |= XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG; |
| 434 | 409 | ||
| 435 | if (vap->va_size > ip->i_size) { | 410 | if (iattr->ia_size > ip->i_size) { |
| 436 | ip->i_d.di_size = vap->va_size; | 411 | ip->i_d.di_size = iattr->ia_size; |
| 437 | ip->i_size = vap->va_size; | 412 | ip->i_size = iattr->ia_size; |
| 438 | if (!(flags & ATTR_DMI)) | 413 | if (!(flags & XFS_ATTR_DMI)) |
| 439 | xfs_ichgtime(ip, XFS_ICHGTIME_CHG); | 414 | xfs_ichgtime(ip, XFS_ICHGTIME_CHG); |
| 440 | xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); | 415 | xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); |
| 441 | } else if ((vap->va_size <= ip->i_size) || | 416 | } else if (iattr->ia_size <= ip->i_size || |
| 442 | ((vap->va_size == 0) && ip->i_d.di_nextents)) { | 417 | (iattr->ia_size == 0 && ip->i_d.di_nextents)) { |
| 443 | /* | 418 | /* |
| 444 | * signal a sync transaction unless | 419 | * signal a sync transaction unless |
| 445 | * we're truncating an already unlinked | 420 | * we're truncating an already unlinked |
| 446 | * file on a wsync filesystem | 421 | * file on a wsync filesystem |
| 447 | */ | 422 | */ |
| 448 | code = xfs_itruncate_finish(&tp, ip, | 423 | code = xfs_itruncate_finish(&tp, ip, iattr->ia_size, |
| 449 | (xfs_fsize_t)vap->va_size, | ||
| 450 | XFS_DATA_FORK, | 424 | XFS_DATA_FORK, |
| 451 | ((ip->i_d.di_nlink != 0 || | 425 | ((ip->i_d.di_nlink != 0 || |
| 452 | !(mp->m_flags & XFS_MOUNT_WSYNC)) | 426 | !(mp->m_flags & XFS_MOUNT_WSYNC)) |
| @@ -468,9 +442,9 @@ xfs_setattr( | |||
| 468 | /* | 442 | /* |
| 469 | * Change file access modes. | 443 | * Change file access modes. |
| 470 | */ | 444 | */ |
| 471 | if (mask & XFS_AT_MODE) { | 445 | if (mask & ATTR_MODE) { |
| 472 | ip->i_d.di_mode &= S_IFMT; | 446 | ip->i_d.di_mode &= S_IFMT; |
| 473 | ip->i_d.di_mode |= vap->va_mode & ~S_IFMT; | 447 | ip->i_d.di_mode |= iattr->ia_mode & ~S_IFMT; |
| 474 | 448 | ||
| 475 | xfs_trans_log_inode (tp, ip, XFS_ILOG_CORE); | 449 | xfs_trans_log_inode (tp, ip, XFS_ILOG_CORE); |
| 476 | timeflags |= XFS_ICHGTIME_CHG; | 450 | timeflags |= XFS_ICHGTIME_CHG; |
| @@ -483,7 +457,7 @@ xfs_setattr( | |||
| 483 | * and can change the group id only to a group of which he | 457 | * and can change the group id only to a group of which he |
| 484 | * or she is a member. | 458 | * or she is a member. |
| 485 | */ | 459 | */ |
| 486 | if (mask & (XFS_AT_UID|XFS_AT_GID)) { | 460 | if (mask & (ATTR_UID|ATTR_GID)) { |
| 487 | /* | 461 | /* |
| 488 | * CAP_FSETID overrides the following restrictions: | 462 | * CAP_FSETID overrides the following restrictions: |
| 489 | * | 463 | * |
| @@ -501,7 +475,7 @@ xfs_setattr( | |||
| 501 | */ | 475 | */ |
| 502 | if (iuid != uid) { | 476 | if (iuid != uid) { |
| 503 | if (XFS_IS_UQUOTA_ON(mp)) { | 477 | if (XFS_IS_UQUOTA_ON(mp)) { |
| 504 | ASSERT(mask & XFS_AT_UID); | 478 | ASSERT(mask & ATTR_UID); |
| 505 | ASSERT(udqp); | 479 | ASSERT(udqp); |
| 506 | olddquot1 = XFS_QM_DQVOPCHOWN(mp, tp, ip, | 480 | olddquot1 = XFS_QM_DQVOPCHOWN(mp, tp, ip, |
| 507 | &ip->i_udquot, udqp); | 481 | &ip->i_udquot, udqp); |
| @@ -511,7 +485,7 @@ xfs_setattr( | |||
| 511 | if (igid != gid) { | 485 | if (igid != gid) { |
| 512 | if (XFS_IS_GQUOTA_ON(mp)) { | 486 | if (XFS_IS_GQUOTA_ON(mp)) { |
| 513 | ASSERT(!XFS_IS_PQUOTA_ON(mp)); | 487 | ASSERT(!XFS_IS_PQUOTA_ON(mp)); |
| 514 | ASSERT(mask & XFS_AT_GID); | 488 | ASSERT(mask & ATTR_GID); |
| 515 | ASSERT(gdqp); | 489 | ASSERT(gdqp); |
| 516 | olddquot2 = XFS_QM_DQVOPCHOWN(mp, tp, ip, | 490 | olddquot2 = XFS_QM_DQVOPCHOWN(mp, tp, ip, |
| 517 | &ip->i_gdquot, gdqp); | 491 | &ip->i_gdquot, gdqp); |
| @@ -527,31 +501,31 @@ xfs_setattr( | |||
| 527 | /* | 501 | /* |
| 528 | * Change file access or modified times. | 502 | * Change file access or modified times. |
| 529 | */ | 503 | */ |
| 530 | if (mask & (XFS_AT_ATIME|XFS_AT_MTIME)) { | 504 | if (mask & (ATTR_ATIME|ATTR_MTIME)) { |
| 531 | if (mask & XFS_AT_ATIME) { | 505 | if (mask & ATTR_ATIME) { |
| 532 | ip->i_d.di_atime.t_sec = vap->va_atime.tv_sec; | 506 | ip->i_d.di_atime.t_sec = iattr->ia_atime.tv_sec; |
| 533 | ip->i_d.di_atime.t_nsec = vap->va_atime.tv_nsec; | 507 | ip->i_d.di_atime.t_nsec = iattr->ia_atime.tv_nsec; |
| 534 | ip->i_update_core = 1; | 508 | ip->i_update_core = 1; |
| 535 | timeflags &= ~XFS_ICHGTIME_ACC; | 509 | timeflags &= ~XFS_ICHGTIME_ACC; |
| 536 | } | 510 | } |
| 537 | if (mask & XFS_AT_MTIME) { | 511 | if (mask & ATTR_MTIME) { |
| 538 | ip->i_d.di_mtime.t_sec = vap->va_mtime.tv_sec; | 512 | ip->i_d.di_mtime.t_sec = iattr->ia_mtime.tv_sec; |
| 539 | ip->i_d.di_mtime.t_nsec = vap->va_mtime.tv_nsec; | 513 | ip->i_d.di_mtime.t_nsec = iattr->ia_mtime.tv_nsec; |
| 540 | timeflags &= ~XFS_ICHGTIME_MOD; | 514 | timeflags &= ~XFS_ICHGTIME_MOD; |
| 541 | timeflags |= XFS_ICHGTIME_CHG; | 515 | timeflags |= XFS_ICHGTIME_CHG; |
| 542 | } | 516 | } |
| 543 | if (tp && (flags & ATTR_UTIME)) | 517 | if (tp && (mask & (ATTR_MTIME_SET|ATTR_ATIME_SET))) |
| 544 | xfs_trans_log_inode (tp, ip, XFS_ILOG_CORE); | 518 | xfs_trans_log_inode (tp, ip, XFS_ILOG_CORE); |
| 545 | } | 519 | } |
| 546 | 520 | ||
| 547 | /* | 521 | /* |
| 548 | * Change file inode change time only if XFS_AT_CTIME set | 522 | * Change file inode change time only if ATTR_CTIME set |
| 549 | * AND we have been called by a DMI function. | 523 | * AND we have been called by a DMI function. |
| 550 | */ | 524 | */ |
| 551 | 525 | ||
| 552 | if ( (flags & ATTR_DMI) && (mask & XFS_AT_CTIME) ) { | 526 | if ((flags & XFS_ATTR_DMI) && (mask & ATTR_CTIME)) { |
| 553 | ip->i_d.di_ctime.t_sec = vap->va_ctime.tv_sec; | 527 | ip->i_d.di_ctime.t_sec = iattr->ia_ctime.tv_sec; |
| 554 | ip->i_d.di_ctime.t_nsec = vap->va_ctime.tv_nsec; | 528 | ip->i_d.di_ctime.t_nsec = iattr->ia_ctime.tv_nsec; |
| 555 | ip->i_update_core = 1; | 529 | ip->i_update_core = 1; |
| 556 | timeflags &= ~XFS_ICHGTIME_CHG; | 530 | timeflags &= ~XFS_ICHGTIME_CHG; |
| 557 | } | 531 | } |
| @@ -560,7 +534,7 @@ xfs_setattr( | |||
| 560 | * Send out timestamp changes that need to be set to the | 534 | * Send out timestamp changes that need to be set to the |
| 561 | * current time. Not done when called by a DMI function. | 535 | * current time. Not done when called by a DMI function. |
| 562 | */ | 536 | */ |
| 563 | if (timeflags && !(flags & ATTR_DMI)) | 537 | if (timeflags && !(flags & XFS_ATTR_DMI)) |
| 564 | xfs_ichgtime(ip, timeflags); | 538 | xfs_ichgtime(ip, timeflags); |
| 565 | 539 | ||
| 566 | XFS_STATS_INC(xs_ig_attrchg); | 540 | XFS_STATS_INC(xs_ig_attrchg); |
| @@ -598,7 +572,7 @@ xfs_setattr( | |||
| 598 | } | 572 | } |
| 599 | 573 | ||
| 600 | if (DM_EVENT_ENABLED(ip, DM_EVENT_ATTRIBUTE) && | 574 | if (DM_EVENT_ENABLED(ip, DM_EVENT_ATTRIBUTE) && |
| 601 | !(flags & ATTR_DMI)) { | 575 | !(flags & XFS_ATTR_DMI)) { |
| 602 | (void) XFS_SEND_NAMESP(mp, DM_EVENT_ATTRIBUTE, ip, DM_RIGHT_NULL, | 576 | (void) XFS_SEND_NAMESP(mp, DM_EVENT_ATTRIBUTE, ip, DM_RIGHT_NULL, |
| 603 | NULL, DM_RIGHT_NULL, NULL, NULL, | 577 | NULL, DM_RIGHT_NULL, NULL, NULL, |
| 604 | 0, 0, AT_DELAY_FLAG(flags)); | 578 | 0, 0, AT_DELAY_FLAG(flags)); |
| @@ -3113,7 +3087,7 @@ xfs_alloc_file_space( | |||
| 3113 | 3087 | ||
| 3114 | /* Generate a DMAPI event if needed. */ | 3088 | /* Generate a DMAPI event if needed. */ |
| 3115 | if (alloc_type != 0 && offset < ip->i_size && | 3089 | if (alloc_type != 0 && offset < ip->i_size && |
| 3116 | (attr_flags&ATTR_DMI) == 0 && | 3090 | (attr_flags & XFS_ATTR_DMI) == 0 && |
| 3117 | DM_EVENT_ENABLED(ip, DM_EVENT_WRITE)) { | 3091 | DM_EVENT_ENABLED(ip, DM_EVENT_WRITE)) { |
| 3118 | xfs_off_t end_dmi_offset; | 3092 | xfs_off_t end_dmi_offset; |
| 3119 | 3093 | ||
| @@ -3227,7 +3201,7 @@ retry: | |||
| 3227 | allocatesize_fsb -= allocated_fsb; | 3201 | allocatesize_fsb -= allocated_fsb; |
| 3228 | } | 3202 | } |
| 3229 | dmapi_enospc_check: | 3203 | dmapi_enospc_check: |
| 3230 | if (error == ENOSPC && (attr_flags & ATTR_DMI) == 0 && | 3204 | if (error == ENOSPC && (attr_flags & XFS_ATTR_DMI) == 0 && |
| 3231 | DM_EVENT_ENABLED(ip, DM_EVENT_NOSPACE)) { | 3205 | DM_EVENT_ENABLED(ip, DM_EVENT_NOSPACE)) { |
| 3232 | error = XFS_SEND_NAMESP(mp, DM_EVENT_NOSPACE, | 3206 | error = XFS_SEND_NAMESP(mp, DM_EVENT_NOSPACE, |
| 3233 | ip, DM_RIGHT_NULL, | 3207 | ip, DM_RIGHT_NULL, |
| @@ -3374,7 +3348,7 @@ xfs_free_file_space( | |||
| 3374 | end_dmi_offset = offset + len; | 3348 | end_dmi_offset = offset + len; |
| 3375 | endoffset_fsb = XFS_B_TO_FSBT(mp, end_dmi_offset); | 3349 | endoffset_fsb = XFS_B_TO_FSBT(mp, end_dmi_offset); |
| 3376 | 3350 | ||
| 3377 | if (offset < ip->i_size && (attr_flags & ATTR_DMI) == 0 && | 3351 | if (offset < ip->i_size && (attr_flags & XFS_ATTR_DMI) == 0 && |
| 3378 | DM_EVENT_ENABLED(ip, DM_EVENT_WRITE)) { | 3352 | DM_EVENT_ENABLED(ip, DM_EVENT_WRITE)) { |
| 3379 | if (end_dmi_offset > ip->i_size) | 3353 | if (end_dmi_offset > ip->i_size) |
| 3380 | end_dmi_offset = ip->i_size; | 3354 | end_dmi_offset = ip->i_size; |
| @@ -3385,7 +3359,7 @@ xfs_free_file_space( | |||
| 3385 | return error; | 3359 | return error; |
| 3386 | } | 3360 | } |
| 3387 | 3361 | ||
| 3388 | if (attr_flags & ATTR_NOLOCK) | 3362 | if (attr_flags & XFS_ATTR_NOLOCK) |
| 3389 | need_iolock = 0; | 3363 | need_iolock = 0; |
| 3390 | if (need_iolock) { | 3364 | if (need_iolock) { |
| 3391 | xfs_ilock(ip, XFS_IOLOCK_EXCL); | 3365 | xfs_ilock(ip, XFS_IOLOCK_EXCL); |
| @@ -3562,7 +3536,7 @@ xfs_change_file_space( | |||
| 3562 | xfs_off_t startoffset; | 3536 | xfs_off_t startoffset; |
| 3563 | xfs_off_t llen; | 3537 | xfs_off_t llen; |
| 3564 | xfs_trans_t *tp; | 3538 | xfs_trans_t *tp; |
| 3565 | bhv_vattr_t va; | 3539 | struct iattr iattr; |
| 3566 | 3540 | ||
| 3567 | xfs_itrace_entry(ip); | 3541 | xfs_itrace_entry(ip); |
| 3568 | 3542 | ||
| @@ -3636,10 +3610,10 @@ xfs_change_file_space( | |||
| 3636 | break; | 3610 | break; |
| 3637 | } | 3611 | } |
| 3638 | 3612 | ||
| 3639 | va.va_mask = XFS_AT_SIZE; | 3613 | iattr.ia_valid = ATTR_SIZE; |
| 3640 | va.va_size = startoffset; | 3614 | iattr.ia_size = startoffset; |
| 3641 | 3615 | ||
| 3642 | error = xfs_setattr(ip, &va, attr_flags, credp); | 3616 | error = xfs_setattr(ip, &iattr, attr_flags, credp); |
| 3643 | 3617 | ||
| 3644 | if (error) | 3618 | if (error) |
| 3645 | return error; | 3619 | return error; |
| @@ -3669,7 +3643,7 @@ xfs_change_file_space( | |||
| 3669 | xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL); | 3643 | xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL); |
| 3670 | xfs_trans_ihold(tp, ip); | 3644 | xfs_trans_ihold(tp, ip); |
| 3671 | 3645 | ||
| 3672 | if ((attr_flags & ATTR_DMI) == 0) { | 3646 | if ((attr_flags & XFS_ATTR_DMI) == 0) { |
| 3673 | ip->i_d.di_mode &= ~S_ISUID; | 3647 | ip->i_d.di_mode &= ~S_ISUID; |
| 3674 | 3648 | ||
| 3675 | /* | 3649 | /* |
diff --git a/fs/xfs/xfs_vnodeops.h b/fs/xfs/xfs_vnodeops.h index 454fa9a3e526..e932a96bec54 100644 --- a/fs/xfs/xfs_vnodeops.h +++ b/fs/xfs/xfs_vnodeops.h | |||
| @@ -2,9 +2,9 @@ | |||
| 2 | #define _XFS_VNODEOPS_H 1 | 2 | #define _XFS_VNODEOPS_H 1 |
| 3 | 3 | ||
| 4 | struct attrlist_cursor_kern; | 4 | struct attrlist_cursor_kern; |
| 5 | struct bhv_vattr; | ||
| 6 | struct cred; | 5 | struct cred; |
| 7 | struct file; | 6 | struct file; |
| 7 | struct iattr; | ||
| 8 | struct inode; | 8 | struct inode; |
| 9 | struct iovec; | 9 | struct iovec; |
| 10 | struct kiocb; | 10 | struct kiocb; |
| @@ -15,8 +15,12 @@ struct xfs_iomap; | |||
| 15 | 15 | ||
| 16 | 16 | ||
| 17 | int xfs_open(struct xfs_inode *ip); | 17 | int xfs_open(struct xfs_inode *ip); |
| 18 | int xfs_setattr(struct xfs_inode *ip, struct bhv_vattr *vap, int flags, | 18 | int xfs_setattr(struct xfs_inode *ip, struct iattr *vap, int flags, |
| 19 | struct cred *credp); | 19 | struct cred *credp); |
| 20 | #define XFS_ATTR_DMI 0x01 /* invocation from a DMI function */ | ||
| 21 | #define XFS_ATTR_NONBLOCK 0x02 /* return EAGAIN if operation would block */ | ||
| 22 | #define XFS_ATTR_NOLOCK 0x04 /* Don't grab any conflicting locks */ | ||
| 23 | |||
| 20 | int xfs_readlink(struct xfs_inode *ip, char *link); | 24 | int xfs_readlink(struct xfs_inode *ip, char *link); |
| 21 | int xfs_fsync(struct xfs_inode *ip); | 25 | int xfs_fsync(struct xfs_inode *ip); |
| 22 | int xfs_release(struct xfs_inode *ip); | 26 | int xfs_release(struct xfs_inode *ip); |
