From: Timothy Shimmin <tes@sgi.com>
To: Christoph Hellwig <hch@lst.de>
Cc: xfs@oss.sgi.com
Subject: Re: [PATCH 2/3] simplify xfs_setattr
Date: Wed, 09 Jul 2008 18:58:21 +1000 [thread overview]
Message-ID: <48747DAD.7060501@sgi.com> (raw)
In-Reply-To: <20080705172021.GA7177@lst.de>
Looks reasonable to me :)
(odd notes below)
--Tim
Christoph Hellwig wrote:
> On Fri, Jun 27, 2008 at 05:45:57PM +0200, Christoph Hellwig wrote:
>> 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.
>
> As per discussion with Tim here's a version that doesn't require the
> generic ACL patch applied before:
>
>
o stop using bhv_vattr_t and move over to struct iattr.
where va_mask -> ia_valid
> Signed-off-by: Christoph Hellwig <hch@lst.de>
>
> Index: linux-2.6-xfs/fs/xfs/dmapi/xfs_dm.c
> ===================================================================
> --- linux-2.6-xfs.orig/fs/xfs/dmapi/xfs_dm.c 2008-07-04 14:59:13.000000000 +0200
> +++ linux-2.6-xfs/fs/xfs/dmapi/xfs_dm.c 2008-07-04 14:59:21.000000000 +0200
> @@ -2460,7 +2460,8 @@ xfs_dm_punch_hole(
> #endif
>
> error = xfs_change_file_space(ip, XFS_IOC_UNRESVSP, &bf,
> - (xfs_off_t)off, sys_cred, ATTR_DMI|ATTR_NOLOCK);
> + (xfs_off_t)off, sys_cred,
> + XFS_ATTR_DMI|XFS_ATTR_NOLOCK);
>
> /*
> * if punching to end of file, kill any blocks past EOF that
> @@ -2663,7 +2664,7 @@ xfs_dm_set_fileattr(
> dm_fileattr_t __user *statp)
> {
> dm_fileattr_t stat;
> - bhv_vattr_t vat;
> + struct iattr iattr;
> int error;
>
> /* Returns negative errors to DMAPI */
> @@ -2674,52 +2675,52 @@ xfs_dm_set_fileattr(
> if (copy_from_user( &stat, statp, sizeof(stat)))
> return(-EFAULT);
>
> - vat.va_mask = 0;
> + iattr.ia_valid = 0;
>
> if (mask & DM_AT_MODE) {
> - vat.va_mask |= XFS_AT_MODE;
> - vat.va_mode = stat.fa_mode;
> + iattr.ia_valid |= ATTR_MODE;
> + iattr.ia_mode = stat.fa_mode;
> }
> if (mask & DM_AT_UID) {
> - vat.va_mask |= XFS_AT_UID;
> - vat.va_uid = stat.fa_uid;
> + iattr.ia_valid |= ATTR_UID;
> + iattr.ia_uid = stat.fa_uid;
> }
> if (mask & DM_AT_GID) {
> - vat.va_mask |= XFS_AT_GID;
> - vat.va_gid = stat.fa_gid;
> + iattr.ia_valid |= ATTR_GID;
> + iattr.ia_gid = stat.fa_gid;
> }
> if (mask & DM_AT_ATIME) {
> - vat.va_mask |= XFS_AT_ATIME;
> - vat.va_atime.tv_sec = stat.fa_atime;
> - vat.va_atime.tv_nsec = 0;
> + iattr.ia_valid |= ATTR_ATIME;
> + iattr.ia_atime.tv_sec = stat.fa_atime;
> + iattr.ia_atime.tv_nsec = 0;
> inode->i_atime.tv_sec = stat.fa_atime;
> }
> if (mask & DM_AT_MTIME) {
> - vat.va_mask |= XFS_AT_MTIME;
> - vat.va_mtime.tv_sec = stat.fa_mtime;
> - vat.va_mtime.tv_nsec = 0;
> + iattr.ia_valid |= ATTR_MTIME;
> + iattr.ia_mtime.tv_sec = stat.fa_mtime;
> + iattr.ia_mtime.tv_nsec = 0;
> }
> if (mask & DM_AT_CTIME) {
> - vat.va_mask |= XFS_AT_CTIME;
> - vat.va_ctime.tv_sec = stat.fa_ctime;
> - vat.va_ctime.tv_nsec = 0;
> + iattr.ia_valid |= ATTR_CTIME;
> + iattr.ia_ctime.tv_sec = stat.fa_ctime;
> + iattr.ia_ctime.tv_nsec = 0;
> }
>
> - /* DM_AT_DTIME only takes effect if DM_AT_CTIME is not specified. We
> - overload ctime to also act as dtime, i.e. DM_CONFIG_DTIME_OVERLOAD.
> - */
> -
> + /*
> + * DM_AT_DTIME only takes effect if DM_AT_CTIME is not specified. We
> + * overload ctime to also act as dtime, i.e. DM_CONFIG_DTIME_OVERLOAD.
> + */
> if ((mask & DM_AT_DTIME) && !(mask & DM_AT_CTIME)) {
> - vat.va_mask |= XFS_AT_CTIME;
> - vat.va_ctime.tv_sec = stat.fa_dtime;
> - vat.va_ctime.tv_nsec = 0;
> + iattr.ia_valid |= ATTR_CTIME;
> + iattr.ia_ctime.tv_sec = stat.fa_dtime;
> + iattr.ia_ctime.tv_nsec = 0;
> }
> if (mask & DM_AT_SIZE) {
> - vat.va_mask |= XFS_AT_SIZE;
> - vat.va_size = stat.fa_size;
> + iattr.ia_valid |= ATTR_SIZE;
> + iattr.ia_size = stat.fa_size;
> }
>
> - error = xfs_setattr(XFS_I(inode), &vat, ATTR_DMI, NULL);
> + error = xfs_setattr(XFS_I(inode), &iattr, XFS_ATTR_DMI, NULL);
> if (!error)
> vn_revalidate(vn_from_inode(inode)); /* update Linux inode flags */
> return(-error); /* Return negative error to DMAPI */
Looks good.
> Index: linux-2.6-xfs/fs/xfs/linux-2.6/xfs_iops.c
> ===================================================================
> --- linux-2.6-xfs.orig/fs/xfs/linux-2.6/xfs_iops.c 2008-07-04 14:59:11.000000000 +0200
> +++ linux-2.6-xfs/fs/xfs/linux-2.6/xfs_iops.c 2008-07-04 15:03:53.000000000 +0200
> @@ -656,54 +656,20 @@ xfs_vn_getattr(
> STATIC int
> xfs_vn_setattr(
> struct dentry *dentry,
> - struct iattr *attr)
> + struct iattr *iattr)
> {
> struct inode *inode = dentry->d_inode;
> - unsigned int ia_valid = attr->ia_valid;
> - bhv_vattr_t vattr = { 0 };
> - int flags = 0;
> int error;
>
> - if (ia_valid & ATTR_UID) {
> - vattr.va_mask |= XFS_AT_UID;
> - vattr.va_uid = attr->ia_uid;
> - }
> - if (ia_valid & ATTR_GID) {
> - vattr.va_mask |= XFS_AT_GID;
> - vattr.va_gid = attr->ia_gid;
> - }
> - if (ia_valid & ATTR_SIZE) {
> - vattr.va_mask |= XFS_AT_SIZE;
> - vattr.va_size = attr->ia_size;
> - }
> - if (ia_valid & ATTR_ATIME) {
> - vattr.va_mask |= XFS_AT_ATIME;
> - vattr.va_atime = attr->ia_atime;
> - inode->i_atime = attr->ia_atime;
> - }
> - if (ia_valid & ATTR_MTIME) {
> - vattr.va_mask |= XFS_AT_MTIME;
> - vattr.va_mtime = attr->ia_mtime;
> - }
> - if (ia_valid & ATTR_CTIME) {
> - vattr.va_mask |= XFS_AT_CTIME;
> - vattr.va_ctime = attr->ia_ctime;
> - }
> - if (ia_valid & ATTR_MODE) {
> - vattr.va_mask |= XFS_AT_MODE;
> - vattr.va_mode = attr->ia_mode;
> + if (iattr->ia_valid & ATTR_ATIME)
> + inode->i_atime = iattr->ia_atime;
> +
> + if (iattr->ia_valid & ATTR_MODE) {
> if (!in_group_p(inode->i_gid) && !capable(CAP_FSETID))
> inode->i_mode &= ~S_ISGID;
> }
>
So just need to keep the changes to the inode, don't need to set vattr
as we are just passing thru iattr into xfs_setattr now.
Fine.
> - if (ia_valid & (ATTR_MTIME_SET | ATTR_ATIME_SET))
> - flags |= ATTR_UTIME;
> -#ifdef ATTR_NO_BLOCK
> - if ((ia_valid & ATTR_NO_BLOCK))
> - flags |= ATTR_NONBLOCK;
> -#endif
> -
So this code looks different.
We are now dropping the flags. Why is that?
Presumably because we were mapping ia_valid's:
ATTR_MTIME_SET or ATTR_ATIME_SET --> ATTR_UTIME
ATTR_NO_BLOCK -> ATTR_NONBLOCK
But now we pass ATTR_?TIME_SET and ATTR_NO_BLOCK straight thru.
So previously we didn't map them onto va_mask bits but as separate flags
instead.
> - error = xfs_setattr(XFS_I(inode), &vattr, flags, NULL);
> + error = xfs_setattr(XFS_I(inode), iattr, 0, NULL);
So no flags here now.
> if (likely(!error))
> vn_revalidate(vn_from_inode(inode));
> return -error;
> @@ -747,18 +713,18 @@ xfs_vn_fallocate(
>
> xfs_ilock(ip, XFS_IOLOCK_EXCL);
> error = xfs_change_file_space(ip, XFS_IOC_RESVSP, &bf,
> - 0, NULL, ATTR_NOLOCK);
> + 0, NULL, XFS_ATTR_NOLOCK);
> if (!error && !(mode & FALLOC_FL_KEEP_SIZE) &&
> offset + len > i_size_read(inode))
> new_size = offset + len;
>
> /* Change file size if needed */
> if (new_size) {
> - bhv_vattr_t va;
> + struct iattr iattr;
>
> - va.va_mask = XFS_AT_SIZE;
> - va.va_size = new_size;
> - error = xfs_setattr(ip, &va, ATTR_NOLOCK, NULL);
> + iattr.ia_valid = ATTR_SIZE;
> + iattr.ia_size = new_size;
> + error = xfs_setattr(ip, &iattr, XFS_ATTR_NOLOCK, NULL);
> }
>
Fine.
> xfs_iunlock(ip, XFS_IOLOCK_EXCL);
> Index: linux-2.6-xfs/fs/xfs/linux-2.6/xfs_vnode.h
> ===================================================================
> --- linux-2.6-xfs.orig/fs/xfs/linux-2.6/xfs_vnode.h 2008-07-04 14:59:14.000000000 +0200
> +++ linux-2.6-xfs/fs/xfs/linux-2.6/xfs_vnode.h 2008-07-04 14:59:21.000000000 +0200
> @@ -19,7 +19,6 @@
> #define __XFS_VNODE_H__
>
> struct file;
> -struct bhv_vattr;
> struct xfs_iomap;
> struct attrlist_cursor_kern;
>
> @@ -66,69 +65,6 @@ static inline struct inode *vn_to_inode(
> Prevent VM access to the pages until
> the operation completes. */
>
> -/*
> - * Vnode attributes. va_mask indicates those attributes the caller
> - * wants to set or extract.
> - */
> -typedef struct bhv_vattr {
> - int va_mask; /* bit-mask of attributes present */
> - mode_t va_mode; /* file access mode and type */
> - xfs_nlink_t va_nlink; /* number of references to file */
> - uid_t va_uid; /* owner user id */
> - gid_t va_gid; /* owner group id */
> - xfs_ino_t va_nodeid; /* file id */
> - xfs_off_t va_size; /* file size in bytes */
> - u_long va_blocksize; /* blocksize preferred for i/o */
> - struct timespec va_atime; /* time of last access */
> - struct timespec va_mtime; /* time of last modification */
> - struct timespec va_ctime; /* time file changed */
> - u_int va_gen; /* generation number of file */
> - xfs_dev_t va_rdev; /* device the special file represents */
> - __int64_t va_nblocks; /* number of blocks allocated */
> - u_long va_xflags; /* random extended file flags */
> - u_long va_extsize; /* file extent size */
> - u_long va_nextents; /* number of extents in file */
> - u_long va_anextents; /* number of attr extents in file */
> - prid_t va_projid; /* project id */
> -} bhv_vattr_t;
> -
> -/*
> - * setattr or getattr attributes
> - */
> -#define XFS_AT_TYPE 0x00000001
> -#define XFS_AT_MODE 0x00000002
> -#define XFS_AT_UID 0x00000004
> -#define XFS_AT_GID 0x00000008
> -#define XFS_AT_FSID 0x00000010
> -#define XFS_AT_NODEID 0x00000020
> -#define XFS_AT_NLINK 0x00000040
> -#define XFS_AT_SIZE 0x00000080
> -#define XFS_AT_ATIME 0x00000100
> -#define XFS_AT_MTIME 0x00000200
> -#define XFS_AT_CTIME 0x00000400
> -#define XFS_AT_RDEV 0x00000800
> -#define XFS_AT_BLKSIZE 0x00001000
> -#define XFS_AT_NBLOCKS 0x00002000
> -#define XFS_AT_VCODE 0x00004000
> -#define XFS_AT_MAC 0x00008000
> -#define XFS_AT_UPDATIME 0x00010000
> -#define XFS_AT_UPDMTIME 0x00020000
> -#define XFS_AT_UPDCTIME 0x00040000
> -#define XFS_AT_ACL 0x00080000
> -#define XFS_AT_CAP 0x00100000
> -#define XFS_AT_INF 0x00200000
> -#define XFS_AT_NEXTENTS 0x01000000
> -#define XFS_AT_ANEXTENTS 0x02000000
> -#define XFS_AT_SIZE_NOPERM 0x08000000
> -#define XFS_AT_GENCOUNT 0x10000000
> -
> -#define XFS_AT_TIMES (XFS_AT_ATIME|XFS_AT_MTIME|XFS_AT_CTIME)
> -
> -#define XFS_AT_UPDTIMES (XFS_AT_UPDATIME|XFS_AT_UPDMTIME|XFS_AT_UPDCTIME)
> -
> -#define XFS_AT_NOSET (XFS_AT_NLINK|XFS_AT_RDEV|XFS_AT_FSID|XFS_AT_NODEID|\
> - XFS_AT_TYPE|XFS_AT_BLKSIZE|XFS_AT_NBLOCKS|XFS_AT_VCODE|\
> - XFS_AT_NEXTENTS|XFS_AT_ANEXTENTS|XFS_AT_GENCOUNT)
>
Cool. Get rid of a whole bunch of stuff.
> extern void vn_init(void);
> extern int vn_revalidate(bhv_vnode_t *);
> @@ -204,15 +140,6 @@ static inline void vn_atime_to_time_t(bh
> #define VN_DIRTY(vp) mapping_tagged(vn_to_inode(vp)->i_mapping, \
> PAGECACHE_TAG_DIRTY)
>
> -/*
> - * Flags to vop_setattr/getattr.
> - */
> -#define ATTR_UTIME 0x01 /* non-default utime(2) request */
> -#define ATTR_DMI 0x08 /* invocation from a DMI function */
> -#define ATTR_LAZY 0x80 /* set/get attributes lazily */
> -#define ATTR_NONBLOCK 0x100 /* return EAGAIN if operation would block */
> -#define ATTR_NOLOCK 0x200 /* Don't grab any conflicting locks */
> -#define ATTR_NOSIZETOK 0x400 /* Don't get the SIZE token */
>
So where do these go now?
Looking ahead:
xfs_vnodeops.h: DMI,NONBLOCK,NOLOCK
And UTIME, LAZY and NOSIZETOK are gone.
LAZY doesn't seem to be used anywhere.
NOSIZETOK is presumably for cxfs.
UTIME is done by ATTR_MTIME_SET or ATTR_ATIME_SET now (passed straight thru).
> /*
> * Tracking vnode activity.
> Index: linux-2.6-xfs/fs/xfs/xfs_vnodeops.c
> ===================================================================
> --- linux-2.6-xfs.orig/fs/xfs/xfs_vnodeops.c 2008-07-04 14:59:14.000000000 +0200
> +++ linux-2.6-xfs/fs/xfs/xfs_vnodeops.c 2008-07-04 14:59:21.000000000 +0200
> @@ -75,19 +75,16 @@ xfs_open(
> return 0;
> }
>
> -/*
> - * xfs_setattr
> - */
> int
> xfs_setattr(
> - xfs_inode_t *ip,
> - bhv_vattr_t *vap,
> + struct xfs_inode *ip,
> + struct iattr *iattr,
> int flags,
> cred_t *credp)
> {
> xfs_mount_t *mp = ip->i_mount;
> + int mask = iattr->ia_valid;
> xfs_trans_t *tp;
> - int mask;
> int code;
> uint lock_flags;
> uint commit_flags=0;
> @@ -103,30 +100,9 @@ xfs_setattr(
> if (mp->m_flags & XFS_MOUNT_RDONLY)
> return XFS_ERROR(EROFS);
>
> - /*
> - * Cannot set certain attributes.
> - */
> - mask = vap->va_mask;
> - if (mask & XFS_AT_NOSET) {
> - return XFS_ERROR(EINVAL);
> - }
> -
So we get rid of the test for XFS_AT_NOSET.
where:
#define XFS_AT_NOSET (XFS_AT_NLINK|XFS_AT_RDEV|XFS_AT_FSID|XFS_AT_NODEID|\
XFS_AT_TYPE|XFS_AT_BLKSIZE|XFS_AT_NBLOCKS|XFS_AT_VCODE|\
XFS_AT_NEXTENTS|XFS_AT_ANEXTENTS|XFS_AT_GENCOUNT)
I can't see anywhere we set any of these.
Presumably out of the xattr calls.
Some left over from IRIX I guess.
> if (XFS_FORCED_SHUTDOWN(mp))
> return XFS_ERROR(EIO);
>
> - /*
> - * Timestamps do not need to be logged and hence do not
> - * need to be done within a transaction.
> - */
> - if (mask & XFS_AT_UPDTIMES) {
> - ASSERT((mask & ~XFS_AT_UPDTIMES) == 0);
> - timeflags = ((mask & XFS_AT_UPDATIME) ? XFS_ICHGTIME_ACC : 0) |
> - ((mask & XFS_AT_UPDCTIME) ? XFS_ICHGTIME_CHG : 0) |
> - ((mask & XFS_AT_UPDMTIME) ? XFS_ICHGTIME_MOD : 0);
> - xfs_ichgtime(ip, timeflags);
> - return 0;
> - }
> -
#define XFS_AT_UPDATIME 0x00010000
#define XFS_AT_UPDMTIME 0x00020000
#define XFS_AT_UPDCTIME 0x00040000
3 more not supported by vfs ATTR_* macros.
I can't see where we set any of these.
So no loss there I guess.
Presumably they were just for IRIX.
> olddquot1 = olddquot2 = NULL;
> udqp = gdqp = NULL;
>
> @@ -138,17 +114,17 @@ xfs_setattr(
> * If the IDs do change before we take the ilock, we're covered
> * because the i_*dquot fields will get updated anyway.
> */
> - if (XFS_IS_QUOTA_ON(mp) && (mask & (XFS_AT_UID|XFS_AT_GID))) {
> + if (XFS_IS_QUOTA_ON(mp) && (mask & (ATTR_UID|ATTR_GID))) {
> uint qflags = 0;
>
> - if ((mask & XFS_AT_UID) && XFS_IS_UQUOTA_ON(mp)) {
> - uid = vap->va_uid;
> + if ((mask & ATTR_UID) && XFS_IS_UQUOTA_ON(mp)) {
> + uid = iattr->ia_uid;
> qflags |= XFS_QMOPT_UQUOTA;
> } else {
> uid = ip->i_d.di_uid;
> }
> - if ((mask & XFS_AT_GID) && XFS_IS_GQUOTA_ON(mp)) {
> - gid = vap->va_gid;
> + if ((mask & ATTR_GID) && XFS_IS_GQUOTA_ON(mp)) {
> + gid = iattr->ia_gid;
> qflags |= XFS_QMOPT_GQUOTA;
> } else {
> gid = ip->i_d.di_gid;
> @@ -173,10 +149,10 @@ xfs_setattr(
> */
> tp = NULL;
> lock_flags = XFS_ILOCK_EXCL;
> - if (flags & ATTR_NOLOCK)
> + if (flags & XFS_ATTR_NOLOCK)
> need_iolock = 0;
> - if (!(mask & XFS_AT_SIZE)) {
> - if ((mask != (XFS_AT_CTIME|XFS_AT_ATIME|XFS_AT_MTIME)) ||
> + if (!(mask & ATTR_SIZE)) {
> + if ((mask != (ATTR_CTIME|ATTR_ATIME|ATTR_MTIME)) ||
> (mp->m_flags & XFS_MOUNT_WSYNC)) {
> tp = xfs_trans_alloc(mp, XFS_TRANS_SETATTR_NOT_SIZE);
> commit_flags = 0;
> @@ -189,10 +165,10 @@ xfs_setattr(
> }
> } else {
> if (DM_EVENT_ENABLED(ip, DM_EVENT_TRUNCATE) &&
> - !(flags & ATTR_DMI)) {
> + !(flags & XFS_ATTR_DMI)) {
> int dmflags = AT_DELAY_FLAG(flags) | DM_SEM_FLAG_WR;
> code = XFS_SEND_DATA(mp, DM_EVENT_TRUNCATE, ip,
> - vap->va_size, 0, dmflags, NULL);
> + iattr->ia_size, 0, dmflags, NULL);
> if (code) {
> lock_flags = 0;
> goto error_return;
> @@ -212,7 +188,7 @@ xfs_setattr(
> * Only the owner or users with CAP_FOWNER
> * capability may do these things.
> */
> - if (mask & (XFS_AT_MODE|XFS_AT_UID|XFS_AT_GID)) {
> + if (mask & (ATTR_MODE|ATTR_UID|ATTR_GID)) {
> /*
> * CAP_FOWNER overrides the following restrictions:
> *
> @@ -236,21 +212,21 @@ xfs_setattr(
> * IDs of the calling process shall match the group owner of
> * the file when setting the set-group-ID bit on that file
> */
> - if (mask & XFS_AT_MODE) {
> + if (mask & ATTR_MODE) {
> mode_t m = 0;
>
> - if ((vap->va_mode & S_ISUID) && !file_owner)
> + if ((iattr->ia_mode & S_ISUID) && !file_owner)
> m |= S_ISUID;
> - if ((vap->va_mode & S_ISGID) &&
> + if ((iattr->ia_mode & S_ISGID) &&
> !in_group_p((gid_t)ip->i_d.di_gid))
> m |= S_ISGID;
> #if 0
> /* Linux allows this, Irix doesn't. */
> - if ((vap->va_mode & S_ISVTX) && !S_ISDIR(ip->i_d.di_mode))
> + if ((iattr->ia_mode & S_ISVTX) && !S_ISDIR(ip->i_d.di_mode))
> m |= S_ISVTX;
> #endif
> if (m && !capable(CAP_FSETID))
> - vap->va_mode &= ~m;
> + iattr->ia_mode &= ~m;
> }
> }
>
> @@ -261,7 +237,7 @@ xfs_setattr(
> * and can change the group id only to a group of which he
> * or she is a member.
> */
> - if (mask & (XFS_AT_UID|XFS_AT_GID)) {
> + if (mask & (ATTR_UID|ATTR_GID)) {
> /*
> * These IDs could have changed since we last looked at them.
> * But, we're assured that if the ownership did change
> @@ -270,8 +246,8 @@ xfs_setattr(
> */
> iuid = ip->i_d.di_uid;
> igid = ip->i_d.di_gid;
> - gid = (mask & XFS_AT_GID) ? vap->va_gid : igid;
> - uid = (mask & XFS_AT_UID) ? vap->va_uid : iuid;
> + gid = (mask & ATTR_GID) ? iattr->ia_gid : igid;
> + uid = (mask & ATTR_UID) ? iattr->ia_uid : iuid;
>
> /*
> * CAP_CHOWN overrides the following restrictions:
> @@ -308,13 +284,13 @@ xfs_setattr(
> /*
> * Truncate file. Must have write permission and not be a directory.
> */
> - if (mask & XFS_AT_SIZE) {
> + if (mask & ATTR_SIZE) {
> /* Short circuit the truncate case for zero length files */
> - if ((vap->va_size == 0) &&
> - (ip->i_size == 0) && (ip->i_d.di_nextents == 0)) {
> + if (iattr->ia_size == 0 &&
> + ip->i_size == 0 && ip->i_d.di_nextents == 0) {
> xfs_iunlock(ip, XFS_ILOCK_EXCL);
> lock_flags &= ~XFS_ILOCK_EXCL;
> - if (mask & XFS_AT_CTIME)
> + if (mask & ATTR_CTIME)
> xfs_ichgtime(ip, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG);
> code = 0;
> goto error_return;
> @@ -337,9 +313,9 @@ xfs_setattr(
> /*
> * Change file access or modified times.
> */
> - if (mask & (XFS_AT_ATIME|XFS_AT_MTIME)) {
> + if (mask & (ATTR_ATIME|ATTR_MTIME)) {
> if (!file_owner) {
> - if ((flags & ATTR_UTIME) &&
> + if ((mask & (ATTR_MTIME_SET|ATTR_ATIME_SET)) &&
> !capable(CAP_FOWNER)) {
> code = XFS_ERROR(EPERM);
> goto error_return;
> @@ -349,23 +325,22 @@ xfs_setattr(
>
> /*
> * Now we can make the changes. Before we join the inode
> - * to the transaction, if XFS_AT_SIZE is set then take care of
> + * to the transaction, if ATTR_SIZE is set then take care of
> * the part of the truncation that must be done without the
> * inode lock. This needs to be done before joining the inode
> * to the transaction, because the inode cannot be unlocked
> * once it is a part of the transaction.
> */
> - if (mask & XFS_AT_SIZE) {
> + if (mask & ATTR_SIZE) {
> code = 0;
> - if ((vap->va_size > ip->i_size) &&
> - (flags & ATTR_NOSIZETOK) == 0) {
> + if (iattr->ia_size > ip->i_size) {
Yeah, so we no longer support ATTR_NOSIZETOK (presumably for cxfs).
> /*
> * Do the first part of growing a file: zero any data
> * in the last block that is beyond the old EOF. We
> * need to do this before the inode is joined to the
> * transaction to modify the i_size.
> */
> - code = xfs_zero_eof(ip, vap->va_size, ip->i_size);
> + code = xfs_zero_eof(ip, iattr->ia_size, ip->i_size);
> }
> xfs_iunlock(ip, XFS_ILOCK_EXCL);
>
> @@ -382,10 +357,10 @@ xfs_setattr(
> * not within the range we care about here.
> */
> if (!code &&
> - (ip->i_size != ip->i_d.di_size) &&
> - (vap->va_size > ip->i_d.di_size)) {
> + ip->i_size != ip->i_d.di_size &&
> + iattr->ia_size > ip->i_d.di_size) {
> code = xfs_flush_pages(ip,
> - ip->i_d.di_size, vap->va_size,
> + ip->i_d.di_size, iattr->ia_size,
> XFS_B_ASYNC, FI_NONE);
> }
>
> @@ -393,7 +368,7 @@ xfs_setattr(
> vn_iowait(ip);
>
> if (!code)
> - code = xfs_itruncate_data(ip, vap->va_size);
> + code = xfs_itruncate_data(ip, iattr->ia_size);
> if (code) {
> ASSERT(tp == NULL);
> lock_flags &= ~XFS_ILOCK_EXCL;
> @@ -422,31 +397,30 @@ xfs_setattr(
> /*
> * Truncate file. Must have write permission and not be a directory.
> */
> - if (mask & XFS_AT_SIZE) {
> + if (mask & ATTR_SIZE) {
> /*
> * Only change the c/mtime if we are changing the size
> * or we are explicitly asked to change it. This handles
> * the semantic difference between truncate() and ftruncate()
> * as implemented in the VFS.
> */
> - if (vap->va_size != ip->i_size || (mask & XFS_AT_CTIME))
> + if (iattr->ia_size != ip->i_size || (mask & ATTR_CTIME))
> timeflags |= XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG;
>
> - if (vap->va_size > ip->i_size) {
> - ip->i_d.di_size = vap->va_size;
> - ip->i_size = vap->va_size;
> - if (!(flags & ATTR_DMI))
> + if (iattr->ia_size > ip->i_size) {
> + ip->i_d.di_size = iattr->ia_size;
> + ip->i_size = iattr->ia_size;
> + if (!(flags & XFS_ATTR_DMI))
> xfs_ichgtime(ip, XFS_ICHGTIME_CHG);
> xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE);
> - } else if ((vap->va_size <= ip->i_size) ||
> - ((vap->va_size == 0) && ip->i_d.di_nextents)) {
> + } else if (iattr->ia_size <= ip->i_size ||
> + (iattr->ia_size == 0 && ip->i_d.di_nextents)) {
> /*
> * signal a sync transaction unless
> * we're truncating an already unlinked
> * file on a wsync filesystem
> */
> - code = xfs_itruncate_finish(&tp, ip,
> - (xfs_fsize_t)vap->va_size,
> + code = xfs_itruncate_finish(&tp, ip, iattr->ia_size,
> XFS_DATA_FORK,
> ((ip->i_d.di_nlink != 0 ||
> !(mp->m_flags & XFS_MOUNT_WSYNC))
> @@ -468,9 +442,9 @@ xfs_setattr(
> /*
> * Change file access modes.
> */
> - if (mask & XFS_AT_MODE) {
> + if (mask & ATTR_MODE) {
> ip->i_d.di_mode &= S_IFMT;
> - ip->i_d.di_mode |= vap->va_mode & ~S_IFMT;
> + ip->i_d.di_mode |= iattr->ia_mode & ~S_IFMT;
>
> xfs_trans_log_inode (tp, ip, XFS_ILOG_CORE);
> timeflags |= XFS_ICHGTIME_CHG;
> @@ -483,7 +457,7 @@ xfs_setattr(
> * and can change the group id only to a group of which he
> * or she is a member.
> */
> - if (mask & (XFS_AT_UID|XFS_AT_GID)) {
> + if (mask & (ATTR_UID|ATTR_GID)) {
> /*
> * CAP_FSETID overrides the following restrictions:
> *
> @@ -501,7 +475,7 @@ xfs_setattr(
> */
> if (iuid != uid) {
> if (XFS_IS_UQUOTA_ON(mp)) {
> - ASSERT(mask & XFS_AT_UID);
> + ASSERT(mask & ATTR_UID);
> ASSERT(udqp);
> olddquot1 = XFS_QM_DQVOPCHOWN(mp, tp, ip,
> &ip->i_udquot, udqp);
> @@ -511,7 +485,7 @@ xfs_setattr(
> if (igid != gid) {
> if (XFS_IS_GQUOTA_ON(mp)) {
> ASSERT(!XFS_IS_PQUOTA_ON(mp));
> - ASSERT(mask & XFS_AT_GID);
> + ASSERT(mask & ATTR_GID);
> ASSERT(gdqp);
> olddquot2 = XFS_QM_DQVOPCHOWN(mp, tp, ip,
> &ip->i_gdquot, gdqp);
> @@ -527,31 +501,31 @@ xfs_setattr(
> /*
> * Change file access or modified times.
> */
> - if (mask & (XFS_AT_ATIME|XFS_AT_MTIME)) {
> - if (mask & XFS_AT_ATIME) {
> - ip->i_d.di_atime.t_sec = vap->va_atime.tv_sec;
> - ip->i_d.di_atime.t_nsec = vap->va_atime.tv_nsec;
> + if (mask & (ATTR_ATIME|ATTR_MTIME)) {
> + if (mask & ATTR_ATIME) {
> + ip->i_d.di_atime.t_sec = iattr->ia_atime.tv_sec;
> + ip->i_d.di_atime.t_nsec = iattr->ia_atime.tv_nsec;
> ip->i_update_core = 1;
> timeflags &= ~XFS_ICHGTIME_ACC;
> }
> - if (mask & XFS_AT_MTIME) {
> - ip->i_d.di_mtime.t_sec = vap->va_mtime.tv_sec;
> - ip->i_d.di_mtime.t_nsec = vap->va_mtime.tv_nsec;
> + if (mask & ATTR_MTIME) {
> + ip->i_d.di_mtime.t_sec = iattr->ia_mtime.tv_sec;
> + ip->i_d.di_mtime.t_nsec = iattr->ia_mtime.tv_nsec;
> timeflags &= ~XFS_ICHGTIME_MOD;
> timeflags |= XFS_ICHGTIME_CHG;
> }
> - if (tp && (flags & ATTR_UTIME))
> + if (tp && (mask & (ATTR_MTIME_SET|ATTR_ATIME_SET)))
> xfs_trans_log_inode (tp, ip, XFS_ILOG_CORE);
> }
>
> /*
> - * Change file inode change time only if XFS_AT_CTIME set
> + * Change file inode change time only if ATTR_CTIME set
> * AND we have been called by a DMI function.
> */
>
> - if ( (flags & ATTR_DMI) && (mask & XFS_AT_CTIME) ) {
> - ip->i_d.di_ctime.t_sec = vap->va_ctime.tv_sec;
> - ip->i_d.di_ctime.t_nsec = vap->va_ctime.tv_nsec;
> + if ((flags & XFS_ATTR_DMI) && (mask & ATTR_CTIME)) {
> + ip->i_d.di_ctime.t_sec = iattr->ia_ctime.tv_sec;
> + ip->i_d.di_ctime.t_nsec = iattr->ia_ctime.tv_nsec;
> ip->i_update_core = 1;
> timeflags &= ~XFS_ICHGTIME_CHG;
> }
> @@ -560,7 +534,7 @@ xfs_setattr(
> * Send out timestamp changes that need to be set to the
> * current time. Not done when called by a DMI function.
> */
> - if (timeflags && !(flags & ATTR_DMI))
> + if (timeflags && !(flags & XFS_ATTR_DMI))
> xfs_ichgtime(ip, timeflags);
>
> XFS_STATS_INC(xs_ig_attrchg);
> @@ -598,7 +572,7 @@ xfs_setattr(
> }
>
> if (DM_EVENT_ENABLED(ip, DM_EVENT_ATTRIBUTE) &&
> - !(flags & ATTR_DMI)) {
> + !(flags & XFS_ATTR_DMI)) {
> (void) XFS_SEND_NAMESP(mp, DM_EVENT_ATTRIBUTE, ip, DM_RIGHT_NULL,
> NULL, DM_RIGHT_NULL, NULL, NULL,
> 0, 0, AT_DELAY_FLAG(flags));
> @@ -3033,7 +3007,7 @@ xfs_alloc_file_space(
>
> /* Generate a DMAPI event if needed. */
> if (alloc_type != 0 && offset < ip->i_size &&
> - (attr_flags&ATTR_DMI) == 0 &&
> + (attr_flags & XFS_ATTR_DMI) == 0 &&
> DM_EVENT_ENABLED(ip, DM_EVENT_WRITE)) {
> xfs_off_t end_dmi_offset;
>
> @@ -3147,7 +3121,7 @@ retry:
> allocatesize_fsb -= allocated_fsb;
> }
> dmapi_enospc_check:
> - if (error == ENOSPC && (attr_flags & ATTR_DMI) == 0 &&
> + if (error == ENOSPC && (attr_flags & XFS_ATTR_DMI) == 0 &&
> DM_EVENT_ENABLED(ip, DM_EVENT_NOSPACE)) {
> error = XFS_SEND_NAMESP(mp, DM_EVENT_NOSPACE,
> ip, DM_RIGHT_NULL,
> @@ -3294,7 +3268,7 @@ xfs_free_file_space(
> end_dmi_offset = offset + len;
> endoffset_fsb = XFS_B_TO_FSBT(mp, end_dmi_offset);
>
> - if (offset < ip->i_size && (attr_flags & ATTR_DMI) == 0 &&
> + if (offset < ip->i_size && (attr_flags & XFS_ATTR_DMI) == 0 &&
> DM_EVENT_ENABLED(ip, DM_EVENT_WRITE)) {
> if (end_dmi_offset > ip->i_size)
> end_dmi_offset = ip->i_size;
> @@ -3305,7 +3279,7 @@ xfs_free_file_space(
> return error;
> }
>
> - if (attr_flags & ATTR_NOLOCK)
> + if (attr_flags & XFS_ATTR_NOLOCK)
> need_iolock = 0;
> if (need_iolock) {
> xfs_ilock(ip, XFS_IOLOCK_EXCL);
> @@ -3482,7 +3456,7 @@ xfs_change_file_space(
> xfs_off_t startoffset;
> xfs_off_t llen;
> xfs_trans_t *tp;
> - bhv_vattr_t va;
> + struct iattr iattr;
>
> xfs_itrace_entry(ip);
>
> @@ -3556,10 +3530,10 @@ xfs_change_file_space(
> break;
> }
>
> - va.va_mask = XFS_AT_SIZE;
> - va.va_size = startoffset;
> + iattr.ia_valid = ATTR_SIZE;
> + iattr.ia_size = startoffset;
>
> - error = xfs_setattr(ip, &va, attr_flags, credp);
> + error = xfs_setattr(ip, &iattr, attr_flags, credp);
>
> if (error)
> return error;
> @@ -3589,7 +3563,7 @@ xfs_change_file_space(
> xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL);
> xfs_trans_ihold(tp, ip);
>
> - if ((attr_flags & ATTR_DMI) == 0) {
> + if ((attr_flags & XFS_ATTR_DMI) == 0) {
> ip->i_d.di_mode &= ~S_ISUID;
>
> /*
> Index: linux-2.6-xfs/fs/xfs/xfs_vnodeops.h
> ===================================================================
> --- linux-2.6-xfs.orig/fs/xfs/xfs_vnodeops.h 2008-07-04 14:58:36.000000000 +0200
> +++ linux-2.6-xfs/fs/xfs/xfs_vnodeops.h 2008-07-04 14:59:21.000000000 +0200
> @@ -2,9 +2,9 @@
> #define _XFS_VNODEOPS_H 1
>
> struct attrlist_cursor_kern;
> -struct bhv_vattr;
> struct cred;
> struct file;
> +struct iattr;
> struct inode;
> struct iovec;
> struct kiocb;
> @@ -15,8 +15,12 @@ struct xfs_iomap;
>
>
> int xfs_open(struct xfs_inode *ip);
> -int xfs_setattr(struct xfs_inode *ip, struct bhv_vattr *vap, int flags,
> +int xfs_setattr(struct xfs_inode *ip, struct iattr *vap, int flags,
> struct cred *credp);
> +#define XFS_ATTR_DMI 0x01 /* invocation from a DMI function */
> +#define XFS_ATTR_NONBLOCK 0x02 /* return EAGAIN if operation would block */
> +#define XFS_ATTR_NOLOCK 0x04 /* Don't grab any conflicting locks */
> +
So we don't bring thru: ATTR_UTIME, ATTR_LAZY, ATTR_NOSIZETOK
> int xfs_readlink(struct xfs_inode *ip, char *link);
> int xfs_fsync(struct xfs_inode *ip);
> int xfs_release(struct xfs_inode *ip);
> Index: linux-2.6-xfs/fs/xfs/linux-2.6/xfs_ioctl.c
> ===================================================================
> --- linux-2.6-xfs.orig/fs/xfs/linux-2.6/xfs_ioctl.c 2008-07-04 14:59:14.000000000 +0200
> +++ linux-2.6-xfs/fs/xfs/linux-2.6/xfs_ioctl.c 2008-07-04 14:59:21.000000000 +0200
> @@ -685,9 +685,9 @@ xfs_ioc_space(
> return -XFS_ERROR(EFAULT);
>
> if (filp->f_flags & (O_NDELAY|O_NONBLOCK))
> - attr_flags |= ATTR_NONBLOCK;
> + attr_flags |= XFS_ATTR_NONBLOCK;
> if (ioflags & IO_INVIS)
> - attr_flags |= ATTR_DMI;
> + attr_flags |= XFS_ATTR_DMI;
>
> error = xfs_change_file_space(ip, cmd, &bf, filp->f_pos,
> NULL, attr_flags);
> Index: linux-2.6-xfs/fs/xfs/xfs_dmapi.h
> ===================================================================
> --- linux-2.6-xfs.orig/fs/xfs/xfs_dmapi.h 2008-07-04 14:58:36.000000000 +0200
> +++ linux-2.6-xfs/fs/xfs/xfs_dmapi.h 2008-07-04 14:59:21.000000000 +0200
> @@ -166,6 +166,6 @@ typedef enum {
>
> #define FILP_DELAY_FLAG(filp) ((filp->f_flags&(O_NDELAY|O_NONBLOCK)) ? \
> DM_FLAGS_NDELAY : 0)
> -#define AT_DELAY_FLAG(f) ((f&ATTR_NONBLOCK) ? DM_FLAGS_NDELAY : 0)
> +#define AT_DELAY_FLAG(f) ((f & XFS_ATTR_NONBLOCK) ? DM_FLAGS_NDELAY : 0)
>
> #endif /* __XFS_DMAPI_H__ */
> Index: linux-2.6-xfs/fs/xfs/xfs_acl.c
> ===================================================================
> --- linux-2.6-xfs.orig/fs/xfs/xfs_acl.c 2008-07-04 15:01:44.000000000 +0200
> +++ linux-2.6-xfs/fs/xfs/xfs_acl.c 2008-07-04 15:02:47.000000000 +0200
> @@ -720,7 +720,7 @@ xfs_acl_setmode(
> xfs_acl_t *acl,
> int *basicperms)
> {
> - bhv_vattr_t va;
> + struct iattr iattr;
> xfs_acl_entry_t *ap;
> xfs_acl_entry_t *gap = NULL;
> int i, nomask = 1;
> @@ -734,25 +734,25 @@ xfs_acl_setmode(
> * Copy the u::, g::, o::, and m:: bits from the ACL into the
> * mode. The m:: bits take precedence over the g:: bits.
> */
> - va.va_mask = XFS_AT_MODE;
> - va.va_mode = xfs_vtoi(vp)->i_d.di_mode;
> - va.va_mode &= ~(S_IRWXU|S_IRWXG|S_IRWXO);
> + iattr.ia_mask = XFS_AT_MODE;
> + iattr.ia_mode = xfs_vtoi(vp)->i_d.di_mode;
> + iattr.ia_mode &= ~(S_IRWXU|S_IRWXG|S_IRWXO);
> ap = acl->acl_entry;
> for (i = 0; i < acl->acl_cnt; ++i) {
> switch (ap->ae_tag) {
> case ACL_USER_OBJ:
> - va.va_mode |= ap->ae_perm << 6;
> + iattr.ia_mode |= ap->ae_perm << 6;
> break;
> case ACL_GROUP_OBJ:
> gap = ap;
> break;
> case ACL_MASK: /* more than just standard modes */
> nomask = 0;
> - va.va_mode |= ap->ae_perm << 3;
> + iattr.ia_mode |= ap->ae_perm << 3;
> *basicperms = 0;
> break;
> case ACL_OTHER:
> - va.va_mode |= ap->ae_perm;
> + iattr.ia_mode |= ap->ae_perm;
> break;
> default: /* more than just standard modes */
> *basicperms = 0;
> @@ -763,9 +763,9 @@ xfs_acl_setmode(
>
> /* Set the group bits from ACL_GROUP_OBJ if there's no ACL_MASK */
> if (gap && nomask)
> - va.va_mode |= gap->ae_perm << 3;
> + iattr.ia_mode |= gap->ae_perm << 3;
>
> - return xfs_setattr(xfs_vtoi(vp), &va, 0, sys_cred);
> + return xfs_setattr(xfs_vtoi(vp), &iattr, 0, sys_cred);
> }
>
> /*
>
next prev parent reply other threads:[~2008-07-09 8:57 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-06-27 15:45 [PATCH 2/3] simplify xfs_setattr Christoph Hellwig
2008-07-05 17:20 ` Christoph Hellwig
2008-07-09 8:58 ` Timothy Shimmin [this message]
2008-07-09 16:29 ` Christoph Hellwig
2008-07-11 0:32 ` Timothy Shimmin
2008-07-11 1:07 ` Dave Chinner
2008-07-11 1:11 ` Christoph Hellwig
2008-07-11 1:10 ` Christoph Hellwig
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=48747DAD.7060501@sgi.com \
--to=tes@sgi.com \
--cc=hch@lst.de \
--cc=xfs@oss.sgi.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.