* [PATCH 2/3] simplify xfs_setattr
@ 2008-06-27 15:45 Christoph Hellwig
2008-07-05 17:20 ` Christoph Hellwig
0 siblings, 1 reply; 8+ messages in thread
From: Christoph Hellwig @ 2008-06-27 15:45 UTC (permalink / raw)
To: 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.
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-06-15 18:10:31.000000000 +0200
+++ linux-2.6-xfs/fs/xfs/dmapi/xfs_dm.c 2008-06-15 18:25:24.000000000 +0200
@@ -2458,7 +2458,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
@@ -2661,7 +2662,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 */
@@ -2672,52 +2673,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 */
Index: linux-2.6-xfs/fs/xfs/linux-2.6/xfs_acl.c
===================================================================
--- linux-2.6-xfs.orig/fs/xfs/linux-2.6/xfs_acl.c 2008-06-15 18:08:27.000000000 +0200
+++ linux-2.6-xfs/fs/xfs/linux-2.6/xfs_acl.c 2008-06-15 18:20:16.000000000 +0200
@@ -272,12 +272,12 @@ xfs_set_mode(struct inode *inode, mode_t
int error = 0;
if (mode != inode->i_mode) {
- struct bhv_vattr va;
+ struct iattr iattr;
- va.va_mask = XFS_AT_MODE;
- va.va_mode = mode;
+ iattr.ia_valid = ATTR_MODE;
+ iattr.ia_mode = mode;
- error = -xfs_setattr(XFS_I(inode), &va, 0, sys_cred);
+ error = -xfs_setattr(XFS_I(inode), &iattr, 0, sys_cred);
inode->i_mode = mode;
}
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-06-15 17:50:24.000000000 +0200
+++ linux-2.6-xfs/fs/xfs/linux-2.6/xfs_iops.c 2008-06-15 18:25:50.000000000 +0200
@@ -607,58 +607,24 @@ 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;
}
- 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
-
- error = xfs_setattr(XFS_I(inode), &vattr, flags, NULL);
+ error = xfs_setattr(XFS_I(inode), iattr, 0, NULL);
if (likely(!error))
vn_revalidate(vn_from_inode(inode));
- if (!error && (attr->ia_valid & ATTR_MODE))
+ if (!error && (iattr->ia_valid & ATTR_MODE))
error = -xfs_acl_chmod(inode);
return -error;
}
@@ -701,18 +667,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);
}
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-06-15 18:01:17.000000000 +0200
+++ linux-2.6-xfs/fs/xfs/linux-2.6/xfs_vnode.h 2008-06-15 18:24:04.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)
extern void vn_init(void);
extern int vn_revalidate(bhv_vnode_t *);
@@ -199,15 +135,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 */
/*
* Tracking vnode activity.
Index: linux-2.6-xfs/fs/xfs/xfs_vnodeops.c
===================================================================
--- linux-2.6-xfs.orig/fs/xfs/xfs_vnodeops.c 2008-06-15 17:50:24.000000000 +0200
+++ linux-2.6-xfs/fs/xfs/xfs_vnodeops.c 2008-06-15 18:27:04.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);
- }
-
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;
- }
-
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) {
/*
* 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));
@@ -3050,7 +3024,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;
@@ -3164,7 +3138,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,
@@ -3311,7 +3285,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;
@@ -3322,7 +3296,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);
@@ -3499,7 +3473,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);
@@ -3573,10 +3547,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;
@@ -3606,7 +3580,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-06-15 18:17:54.000000000 +0200
+++ linux-2.6-xfs/fs/xfs/xfs_vnodeops.h 2008-06-15 18:24:55.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 */
+
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-06-15 18:27:12.000000000 +0200
+++ linux-2.6-xfs/fs/xfs/linux-2.6/xfs_ioctl.c 2008-06-15 18:27:53.000000000 +0200
@@ -684,9 +684,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-06-15 18:27:36.000000000 +0200
+++ linux-2.6-xfs/fs/xfs/xfs_dmapi.h 2008-06-15 18:27:42.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__ */
^ permalink raw reply [flat|nested] 8+ messages in thread* Re: [PATCH 2/3] simplify xfs_setattr 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 0 siblings, 1 reply; 8+ messages in thread From: Christoph Hellwig @ 2008-07-05 17:20 UTC (permalink / raw) To: xfs 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: 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 */ 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; } - 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 - - error = xfs_setattr(XFS_I(inode), &vattr, flags, NULL); + error = xfs_setattr(XFS_I(inode), iattr, 0, NULL); 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); } 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) 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 */ /* * 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); - } - 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; - } - 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) { /* * 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 */ + 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); } /* ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH 2/3] simplify xfs_setattr 2008-07-05 17:20 ` Christoph Hellwig @ 2008-07-09 8:58 ` Timothy Shimmin 2008-07-09 16:29 ` Christoph Hellwig 0 siblings, 1 reply; 8+ messages in thread From: Timothy Shimmin @ 2008-07-09 8:58 UTC (permalink / raw) To: Christoph Hellwig; +Cc: xfs 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); > } > > /* > ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH 2/3] simplify xfs_setattr 2008-07-09 8:58 ` Timothy Shimmin @ 2008-07-09 16:29 ` Christoph Hellwig 2008-07-11 0:32 ` Timothy Shimmin 0 siblings, 1 reply; 8+ messages in thread From: Christoph Hellwig @ 2008-07-09 16:29 UTC (permalink / raw) To: Timothy Shimmin; +Cc: xfs On Wed, Jul 09, 2008 at 06:58:21PM +1000, Timothy Shimmin wrote: > > - 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. Yeah, not that ATTR_NO_BLOCK doesn't actually exist in any tree I have access to, and thus it's not actually handled in the new xfs_setattr. > 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. Probably. Note that linux uses the ATTR_ flags only for ->setattr so there are per defintion none that can't be set. > #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. It's an IRIX leftover. I will submit a patch to introduce something similar to Linux for 2.6.27, that's why I'd like these patches in for 2.6.26 so that I have a clean base to start from. ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH 2/3] simplify xfs_setattr 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:10 ` Christoph Hellwig 0 siblings, 2 replies; 8+ messages in thread From: Timothy Shimmin @ 2008-07-11 0:32 UTC (permalink / raw) To: Christoph Hellwig; +Cc: xfs Christoph Hellwig wrote: > On Wed, Jul 09, 2008 at 06:58:21PM +1000, Timothy Shimmin wrote: >>> - 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. > > Yeah, not that ATTR_NO_BLOCK doesn't actually exist in any tree I have > access to, and thus it's not actually handled in the new xfs_setattr. > Hmm...confusing re NO_BLOCK. 1 linux-2.6/xfs_vnode.h <global> 228 #define ATTR_NONBLOCK 0x100 2 linux-2.6/xfs_ioctl.c xfs_ioc_space 686 attr_flags |= ATTR_NONBLOCK; 3 linux-2.6/xfs_ioctl.c xfs_ioc_fssetxattr 899 attr_flags |= ATTR_NONBLOCK; 4 linux-2.6/xfs_ioctl.c xfs_ioc_setxflags 951 attr_flags |= ATTR_NONBLOCK; 5 linux-2.6/xfs_iops.c xfs_vn_setattr 703 flags |= ATTR_NONBLOCK; 1 xfs/xfs_dmapi.h <global> 169 #define AT_DELAY_FLAG(f) ((f&ATTR_NONBLOCK) ? DM_FLAGS_NDELAY : 0) 2 xfs/xfs_vnodeops.c xfs_setattr 200 int dmflags = AT_DELAY_FLAG(flags) | DM_SEM_FLAG_WR; 3 xfs/xfs_vnodeops.c xfs_setattr 757 0, 0, AT_DELAY_FLAG(flags)); 4 xfs/xfs_vnodeops.c xfs_free_file_space 3536 AT_DELAY_FLAG(attr_flags), NULL); So it's just used for dmapi stuff as it only looks like it is tested by AT_DELAY_FLAG(). So for xfs_setattr it will be expecting it coming in as flags param and then testing it via AT_DELAY_FLAG. Hmmm...doesn't seem so good. So looks like it was handled by xfs_setattr and still is. So are we going to be doing the right thing now? If it could just never be set then what is the point of using AT_DELAY_FLAG() in xfs_setattr? >> 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. > > Probably. Note that linux uses the ATTR_ flags only for ->setattr so > there are per defintion none that can't be set. > Which is nice. >> #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. > > It's an IRIX leftover. I will submit a patch to introduce something > similar to Linux for 2.6.27, that's why I'd like these patches in for > 2.6.26 so that I have a clean base to start from. Ok. --Tim ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH 2/3] simplify xfs_setattr 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 1 sibling, 1 reply; 8+ messages in thread From: Dave Chinner @ 2008-07-11 1:07 UTC (permalink / raw) To: Timothy Shimmin; +Cc: Christoph Hellwig, xfs On Fri, Jul 11, 2008 at 10:32:57AM +1000, Timothy Shimmin wrote: > Christoph Hellwig wrote: > > On Wed, Jul 09, 2008 at 06:58:21PM +1000, Timothy Shimmin wrote: > >>> - 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. > > > > Yeah, not that ATTR_NO_BLOCK doesn't actually exist in any tree I have > > access to, and thus it's not actually handled in the new xfs_setattr. Look in SLES9 and SLES10. It's used to enable the NFS server to return EAGAIN for truncates that might block for a long time. This can occur if a file migration to/from HSM is in progress. This will return EJUKEBOX to NFS clients to prevent them from unnecessarily resending the truncate over the wire due to timeouts and blocking multiple (potentially all) nfsds trying to service the truncate.... It's just that someone here NACKed the mainline patches to the NFS server to set this flag.... ;) Cheers, Dave. -- Dave Chinner david@fromorbit.com ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH 2/3] simplify xfs_setattr 2008-07-11 1:07 ` Dave Chinner @ 2008-07-11 1:11 ` Christoph Hellwig 0 siblings, 0 replies; 8+ messages in thread From: Christoph Hellwig @ 2008-07-11 1:11 UTC (permalink / raw) To: Timothy Shimmin, Christoph Hellwig, xfs On Fri, Jul 11, 2008 at 11:07:59AM +1000, Dave Chinner wrote: > It's just that someone here NACKed the mainline patches to the > NFS server to set this flag.... ;) Get proper hsm support in mainline and we can talk about enhancing subsystems to deal with it. ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH 2/3] simplify xfs_setattr 2008-07-11 0:32 ` Timothy Shimmin 2008-07-11 1:07 ` Dave Chinner @ 2008-07-11 1:10 ` Christoph Hellwig 1 sibling, 0 replies; 8+ messages in thread From: Christoph Hellwig @ 2008-07-11 1:10 UTC (permalink / raw) To: Timothy Shimmin; +Cc: Christoph Hellwig, xfs On Fri, Jul 11, 2008 at 10:32:57AM +1000, Timothy Shimmin wrote: > Hmm...confusing re NO_BLOCK. > > 1 linux-2.6/xfs_vnode.h <global> 228 #define ATTR_NONBLOCK 0x100 > 2 linux-2.6/xfs_ioctl.c xfs_ioc_space 686 attr_flags |= ATTR_NONBLOCK; > 3 linux-2.6/xfs_ioctl.c xfs_ioc_fssetxattr 899 attr_flags |= ATTR_NONBLOCK; > 4 linux-2.6/xfs_ioctl.c xfs_ioc_setxflags 951 attr_flags |= ATTR_NONBLOCK; > 5 linux-2.6/xfs_iops.c xfs_vn_setattr 703 flags |= ATTR_NONBLOCK; > > 1 xfs/xfs_dmapi.h <global> 169 #define AT_DELAY_FLAG(f) ((f&ATTR_NONBLOCK) ? DM_FLAGS_NDELAY : 0) > 2 xfs/xfs_vnodeops.c xfs_setattr 200 int dmflags = AT_DELAY_FLAG(flags) | DM_SEM_FLAG_WR; > 3 xfs/xfs_vnodeops.c xfs_setattr 757 0, 0, AT_DELAY_FLAG(flags)); > 4 xfs/xfs_vnodeops.c xfs_free_file_space 3536 AT_DELAY_FLAG(attr_flags), NULL); > > So it's just used for dmapi stuff as it only looks like it is tested by > AT_DELAY_FLAG(). > So for xfs_setattr it will be expecting it coming in as flags param > and then testing it via AT_DELAY_FLAG. > Hmmm...doesn't seem so good. So looks like it was handled by > xfs_setattr and still is. > So are we going to be doing the right thing now? > If it could just never be set then what is the point of using > AT_DELAY_FLAG() in xfs_setattr? We scan till set XFS_ATTR_NONBLOCK, just not coming from xfs_vn_setattr. Currently that's only done in xfs_ioc_space. > > > >> 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. > > > > Probably. Note that linux uses the ATTR_ flags only for ->setattr so > > there are per defintion none that can't be set. > > > Which is nice. > > >> #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. > > > > It's an IRIX leftover. I will submit a patch to introduce something > > similar to Linux for 2.6.27, that's why I'd like these patches in for > > 2.6.26 so that I have a clean base to start from. > Ok. > > --Tim ---end quoted text--- ^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2008-07-11 1:10 UTC | newest] Thread overview: 8+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 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 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
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox