public inbox for linux-xfs@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH VER 5] Extend project quotas to support 32bit project identifiers.
@ 2010-09-24 12:51 Arkadiusz Miśkiewicz
  2010-09-24 12:52 ` [PATCH VER 5] xfsprogs: projid32bit handling Arkadiusz Miśkiewicz
  2010-09-26  0:05 ` [PATCH VER 5] Extend project quotas to support 32bit project identifiers Christoph Hellwig
  0 siblings, 2 replies; 7+ messages in thread
From: Arkadiusz Miśkiewicz @ 2010-09-24 12:51 UTC (permalink / raw)
  To: xfs

This patch adds support for 32bit project quota identifiers.

On disk format is backward compatible with 16bit projid numbers. projid
on disk is now keept in two 16bit values - di_projid_lo (which holds the
same position as old 16bit projid value) and new di_projid_hi (takes
existing padding) and convertes from/to 32bit value on the fly.

mkfs.xfs (for new fs) needs to be used to enable PROJID32BIT support.

Signed-off-by: Arkadiusz Miśkiewicz <arekm@maven.pl>
---

News?
- no automatic projid32bit setting (enabling feature needs user action)
- bs_projid_lo back as bs_projid to be compile time compatible with
  (some) existing software
- unneded parentheses dropped
- dfltprid renamed to XFS_PROJID_DEFAULT to reflect it meaning
- project quota helpers use 'struct foo' instead of 'foo_t' type
- better comment for project quota helpers

Note that there is no explict projid_hi zeroing when projid32bit feature
is disabled as according to code and xfs@ comments that place (used by
padding before) was properly zeroed and that zero was properly maintained,
so there should be no cases when padding contains non zero stuff (that
now would be used as projid_hi).

 fs/xfs/linux-2.6/xfs_ioctl.c   |   14 +++++++-------
 fs/xfs/linux-2.6/xfs_ioctl32.c |    2 ++
 fs/xfs/linux-2.6/xfs_ioctl32.h |    5 +++--
 fs/xfs/linux-2.6/xfs_linux.h   |    2 +-
 fs/xfs/quota/xfs_qm.c          |   12 ++++++------
 fs/xfs/quota/xfs_qm_bhv.c      |    2 +-
 fs/xfs/quota/xfs_qm_syscalls.c |    2 +-
 fs/xfs/xfs_dinode.h            |    5 +++--
 fs/xfs/xfs_fs.h                |    5 +++--
 fs/xfs/xfs_inode.c             |   14 ++++++++------
 fs/xfs/xfs_inode.h             |   26 +++++++++++++++++++++++---
 fs/xfs/xfs_itable.c            |    3 ++-
 fs/xfs/xfs_rename.c            |    2 +-
 fs/xfs/xfs_sb.h                |   10 +++++++++-
 fs/xfs/xfs_types.h             |    2 --
 fs/xfs/xfs_vnodeops.c          |   16 ++++++++--------
 16 files changed, 78 insertions(+), 44 deletions(-)

diff --git a/fs/xfs/linux-2.6/xfs_ioctl.c b/fs/xfs/linux-2.6/xfs_ioctl.c
index 4fec427..e66f6fc 100644
--- a/fs/xfs/linux-2.6/xfs_ioctl.c
+++ b/fs/xfs/linux-2.6/xfs_ioctl.c
@@ -788,7 +788,7 @@ xfs_ioc_fsgetxattr(
 	xfs_ilock(ip, XFS_ILOCK_SHARED);
 	fa.fsx_xflags = xfs_ip2xflags(ip);
 	fa.fsx_extsize = ip->i_d.di_extsize << ip->i_mount->m_sb.sb_blocklog;
-	fa.fsx_projid = ip->i_d.di_projid;
+	fa.fsx_projid = xfs_get_projid(ip);
 
 	if (attr) {
 		if (ip->i_afp) {
@@ -907,10 +907,10 @@ xfs_ioctl_setattr(
 		return XFS_ERROR(EIO);
 
 	/*
-	 * Disallow 32bit project ids because on-disk structure
-	 * is 16bit only.
+	 * Disallow 32bit project ids when projid32bit feature is not enabled.
 	 */
-	if ((mask & FSX_PROJID) && (fa->fsx_projid > (__uint16_t)-1))
+	if ((mask & FSX_PROJID) && (fa->fsx_projid > (__uint16_t)-1)
+			&& !xfs_sb_version_hasprojid32bit(&ip->i_mount->m_sb))
 		return XFS_ERROR(EINVAL);
 
 	/*
@@ -959,7 +959,7 @@ xfs_ioctl_setattr(
 	if (mask & FSX_PROJID) {
 		if (XFS_IS_QUOTA_RUNNING(mp) &&
 		    XFS_IS_PQUOTA_ON(mp) &&
-		    ip->i_d.di_projid != fa->fsx_projid) {
+		    xfs_get_projid(ip) != fa->fsx_projid) {
 			ASSERT(tp);
 			code = xfs_qm_vop_chown_reserve(tp, ip, udqp, gdqp,
 						capable(CAP_FOWNER) ?
@@ -1061,12 +1061,12 @@ xfs_ioctl_setattr(
 		 * Change the ownerships and register quota modifications
 		 * in the transaction.
 		 */
-		if (ip->i_d.di_projid != fa->fsx_projid) {
+		if (xfs_get_projid(ip) != fa->fsx_projid) {
 			if (XFS_IS_QUOTA_RUNNING(mp) && XFS_IS_PQUOTA_ON(mp)) {
 				olddquot = xfs_qm_vop_chown(tp, ip,
 							&ip->i_gdquot, gdqp);
 			}
-			ip->i_d.di_projid = fa->fsx_projid;
+			xfs_set_projid(ip, fa->fsx_projid);
 
 			/*
 			 * We may have to rev the inode as well as
diff --git a/fs/xfs/linux-2.6/xfs_ioctl32.c b/fs/xfs/linux-2.6/xfs_ioctl32.c
index 6c83f7f..1124157 100644
--- a/fs/xfs/linux-2.6/xfs_ioctl32.c
+++ b/fs/xfs/linux-2.6/xfs_ioctl32.c
@@ -165,6 +165,7 @@ xfs_ioctl32_bstat_copyin(
 	    get_user(bstat->bs_extents,	&bstat32->bs_extents)	||
 	    get_user(bstat->bs_gen,	&bstat32->bs_gen)	||
 	    get_user(bstat->bs_projid,	&bstat32->bs_projid)	||
+	    get_user(bstat->bs_projid_hi,	&bstat32->bs_projid_hi)	||
 	    get_user(bstat->bs_dmevmask, &bstat32->bs_dmevmask)	||
 	    get_user(bstat->bs_dmstate,	&bstat32->bs_dmstate)	||
 	    get_user(bstat->bs_aextents, &bstat32->bs_aextents))
@@ -218,6 +219,7 @@ xfs_bulkstat_one_fmt_compat(
 	    put_user(buffer->bs_extents,  &p32->bs_extents)	||
 	    put_user(buffer->bs_gen,	  &p32->bs_gen)		||
 	    put_user(buffer->bs_projid,	  &p32->bs_projid)	||
+	    put_user(buffer->bs_projid_hi,	&p32->bs_projid_hi)	||
 	    put_user(buffer->bs_dmevmask, &p32->bs_dmevmask)	||
 	    put_user(buffer->bs_dmstate,  &p32->bs_dmstate)	||
 	    put_user(buffer->bs_aextents, &p32->bs_aextents))
diff --git a/fs/xfs/linux-2.6/xfs_ioctl32.h b/fs/xfs/linux-2.6/xfs_ioctl32.h
index 1024c4f..f92d662 100644
--- a/fs/xfs/linux-2.6/xfs_ioctl32.h
+++ b/fs/xfs/linux-2.6/xfs_ioctl32.h
@@ -65,8 +65,9 @@ typedef struct compat_xfs_bstat {
 	__s32		bs_extsize;	/* extent size			*/
 	__s32		bs_extents;	/* number of extents		*/
 	__u32		bs_gen;		/* generation count		*/
-	__u16		bs_projid;	/* project id			*/
-	unsigned char	bs_pad[14];	/* pad space, unused		*/
+	__u16		bs_projid;	/* lower part of project id	*/
+	__u16		bs_projid_hi;	/* high part of project id	*/
+	unsigned char	bs_pad[12];	/* pad space, unused		*/
 	__u32		bs_dmevmask;	/* DMIG event mask		*/
 	__u16		bs_dmstate;	/* DMIG state info		*/
 	__u16		bs_aextents;	/* attribute number of extents	*/
diff --git a/fs/xfs/linux-2.6/xfs_linux.h b/fs/xfs/linux-2.6/xfs_linux.h
index 2fa0bd9..844b9a9 100644
--- a/fs/xfs/linux-2.6/xfs_linux.h
+++ b/fs/xfs/linux-2.6/xfs_linux.h
@@ -144,7 +144,7 @@
 #define SYNCHRONIZE()	barrier()
 #define __return_address __builtin_return_address(0)
 
-#define dfltprid	0
+#define XFS_PROJID_DEFAULT	0
 #define MAXPATHLEN	1024
 
 #define MIN(a,b)	(min(a,b))
diff --git a/fs/xfs/quota/xfs_qm.c b/fs/xfs/quota/xfs_qm.c
index 9a92407..9a8885e 100644
--- a/fs/xfs/quota/xfs_qm.c
+++ b/fs/xfs/quota/xfs_qm.c
@@ -837,7 +837,7 @@ xfs_qm_dqattach_locked(
 			xfs_qm_dqattach_one(ip, ip->i_d.di_gid, XFS_DQ_GROUP,
 						flags & XFS_QMOPT_DQALLOC,
 						ip->i_udquot, &ip->i_gdquot) :
-			xfs_qm_dqattach_one(ip, ip->i_d.di_projid, XFS_DQ_PROJ,
+			xfs_qm_dqattach_one(ip, xfs_get_projid(ip), XFS_DQ_PROJ,
 						flags & XFS_QMOPT_DQALLOC,
 						ip->i_udquot, &ip->i_gdquot);
 		/*
@@ -1248,7 +1248,7 @@ xfs_qm_dqget_noattach(
 					     XFS_QMOPT_DQALLOC|XFS_QMOPT_DOWARN,
 					     &gdqp) :
 				xfs_qm_dqget(mp, ip,
-					     ip->i_d.di_projid, XFS_DQ_PROJ,
+					     xfs_get_projid(ip), XFS_DQ_PROJ,
 					     XFS_QMOPT_DQALLOC|XFS_QMOPT_DOWARN,
 					     &gdqp);
 		if (error) {
@@ -2332,9 +2332,9 @@ xfs_qm_vop_dqalloc(
 			xfs_dqunlock(gq);
 		}
 	} else if ((flags & XFS_QMOPT_PQUOTA) && XFS_IS_PQUOTA_ON(mp)) {
-		if (ip->i_d.di_projid != prid) {
+		if (xfs_get_projid(ip) != prid) {
 			xfs_iunlock(ip, lockflags);
-			if ((error = xfs_qm_dqget(mp, NULL, (xfs_dqid_t)prid,
+			if ((error = xfs_qm_dqget(mp, NULL, prid,
 						 XFS_DQ_PROJ,
 						 XFS_QMOPT_DQALLOC |
 						 XFS_QMOPT_DOWARN,
@@ -2454,7 +2454,7 @@ xfs_qm_vop_chown_reserve(
 	}
 	if (XFS_IS_OQUOTA_ON(ip->i_mount) && gdqp) {
 		if (XFS_IS_PQUOTA_ON(ip->i_mount) &&
-		     ip->i_d.di_projid != be32_to_cpu(gdqp->q_core.d_id))
+		     xfs_get_projid(ip) != be32_to_cpu(gdqp->q_core.d_id))
 			prjflags = XFS_QMOPT_ENOSPC;
 
 		if (prjflags ||
@@ -2558,7 +2558,7 @@ xfs_qm_vop_create_dqattach(
 		ip->i_gdquot = gdqp;
 		ASSERT(XFS_IS_OQUOTA_ON(mp));
 		ASSERT((XFS_IS_GQUOTA_ON(mp) ?
-			ip->i_d.di_gid : ip->i_d.di_projid) ==
+			ip->i_d.di_gid : xfs_get_projid(ip)) ==
 				be32_to_cpu(gdqp->q_core.d_id));
 		xfs_trans_mod_dquot(tp, gdqp, XFS_TRANS_DQ_ICOUNT, 1);
 	}
diff --git a/fs/xfs/quota/xfs_qm_bhv.c b/fs/xfs/quota/xfs_qm_bhv.c
index bea02d7..45b5cb1 100644
--- a/fs/xfs/quota/xfs_qm_bhv.c
+++ b/fs/xfs/quota/xfs_qm_bhv.c
@@ -81,7 +81,7 @@ xfs_qm_statvfs(
 	xfs_mount_t		*mp = ip->i_mount;
 	xfs_dquot_t		*dqp;
 
-	if (!xfs_qm_dqget(mp, NULL, ip->i_d.di_projid, XFS_DQ_PROJ, 0, &dqp)) {
+	if (!xfs_qm_dqget(mp, NULL, xfs_get_projid(ip), XFS_DQ_PROJ, 0, &dqp)) {
 		xfs_fill_statvfs_from_dquot(statp, &dqp->q_core);
 		xfs_qm_dqput(dqp);
 	}
diff --git a/fs/xfs/quota/xfs_qm_syscalls.c b/fs/xfs/quota/xfs_qm_syscalls.c
index 45e5849..a89065b 100644
--- a/fs/xfs/quota/xfs_qm_syscalls.c
+++ b/fs/xfs/quota/xfs_qm_syscalls.c
@@ -1175,7 +1175,7 @@ xfs_qm_internalqcheck_adjust(
 	}
 	xfs_qm_internalqcheck_get_dquots(mp,
 					(xfs_dqid_t) ip->i_d.di_uid,
-					(xfs_dqid_t) ip->i_d.di_projid,
+					(xfs_dqid_t) xfs_get_projid(ip),
 					(xfs_dqid_t) ip->i_d.di_gid,
 					&ud, &gd);
 	if (XFS_IS_UQUOTA_ON(mp)) {
diff --git a/fs/xfs/xfs_dinode.h b/fs/xfs/xfs_dinode.h
index e5b153b..dffba9b 100644
--- a/fs/xfs/xfs_dinode.h
+++ b/fs/xfs/xfs_dinode.h
@@ -49,8 +49,9 @@ typedef struct xfs_dinode {
 	__be32		di_uid;		/* owner's user id */
 	__be32		di_gid;		/* owner's group id */
 	__be32		di_nlink;	/* number of links to file */
-	__be16		di_projid;	/* owner's project id */
-	__u8		di_pad[8];	/* unused, zeroed space */
+	__be16		di_projid_lo;	/* lower part of owner's project id */
+	__be16		di_projid_hi;	/* higher part owner's project id */
+	__u8		di_pad[6];	/* unused, zeroed space */
 	__be16		di_flushiter;	/* incremented on flush */
 	xfs_timestamp_t	di_atime;	/* time last accessed */
 	xfs_timestamp_t	di_mtime;	/* time last modified */
diff --git a/fs/xfs/xfs_fs.h b/fs/xfs/xfs_fs.h
index 87c2e9d..ae1c500 100644
--- a/fs/xfs/xfs_fs.h
+++ b/fs/xfs/xfs_fs.h
@@ -293,9 +293,10 @@ typedef struct xfs_bstat {
 	__s32		bs_extsize;	/* extent size			*/
 	__s32		bs_extents;	/* number of extents		*/
 	__u32		bs_gen;		/* generation count		*/
-	__u16		bs_projid;	/* project id			*/
+	__u16		bs_projid;	/* lower part of project id	*/
 	__u16		bs_forkoff;	/* inode fork offset in bytes	*/
-	unsigned char	bs_pad[12];	/* pad space, unused		*/
+	__u16		bs_projid_hi;	/* higher part of project id	*/
+	unsigned char	bs_pad[10];	/* pad space, unused		*/
 	__u32		bs_dmevmask;	/* DMIG event mask		*/
 	__u16		bs_dmstate;	/* DMIG state info		*/
 	__u16		bs_aextents;	/* attribute number of extents	*/
diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c
index 34798f3..2ab5959 100644
--- a/fs/xfs/xfs_inode.c
+++ b/fs/xfs/xfs_inode.c
@@ -660,7 +660,8 @@ xfs_dinode_from_disk(
 	to->di_uid = be32_to_cpu(from->di_uid);
 	to->di_gid = be32_to_cpu(from->di_gid);
 	to->di_nlink = be32_to_cpu(from->di_nlink);
-	to->di_projid = be16_to_cpu(from->di_projid);
+	to->di_projid_lo = be16_to_cpu(from->di_projid_lo);
+	to->di_projid_hi = be16_to_cpu(from->di_projid_hi);
 	memcpy(to->di_pad, from->di_pad, sizeof(to->di_pad));
 	to->di_flushiter = be16_to_cpu(from->di_flushiter);
 	to->di_atime.t_sec = be32_to_cpu(from->di_atime.t_sec);
@@ -695,7 +696,8 @@ xfs_dinode_to_disk(
 	to->di_uid = cpu_to_be32(from->di_uid);
 	to->di_gid = cpu_to_be32(from->di_gid);
 	to->di_nlink = cpu_to_be32(from->di_nlink);
-	to->di_projid = cpu_to_be16(from->di_projid);
+	to->di_projid_lo = cpu_to_be16(from->di_projid_lo);
+	to->di_projid_hi = cpu_to_be16(from->di_projid_hi);
 	memcpy(to->di_pad, from->di_pad, sizeof(to->di_pad));
 	to->di_flushiter = cpu_to_be16(from->di_flushiter);
 	to->di_atime.t_sec = cpu_to_be32(from->di_atime.t_sec);
@@ -874,7 +876,7 @@ xfs_iread(
 	if (ip->i_d.di_version == 1) {
 		ip->i_d.di_nlink = ip->i_d.di_onlink;
 		ip->i_d.di_onlink = 0;
-		ip->i_d.di_projid = 0;
+		xfs_set_projid(ip, 0);
 	}
 
 	ip->i_delayed_blks = 0;
@@ -983,7 +985,7 @@ xfs_ialloc(
 	xfs_nlink_t	nlink,
 	xfs_dev_t	rdev,
 	cred_t		*cr,
-	xfs_prid_t	prid,
+	prid_t		prid,
 	int		okalloc,
 	xfs_buf_t	**ialloc_context,
 	boolean_t	*call_again,
@@ -1027,7 +1029,7 @@ xfs_ialloc(
 	ASSERT(ip->i_d.di_nlink == nlink);
 	ip->i_d.di_uid = current_fsuid();
 	ip->i_d.di_gid = current_fsgid();
-	ip->i_d.di_projid = prid;
+	xfs_set_projid(ip, prid);
 	memset(&(ip->i_d.di_pad[0]), 0, sizeof(ip->i_d.di_pad));
 
 	/*
@@ -3008,7 +3010,7 @@ xfs_iflush_int(
 			memset(&(ip->i_d.di_pad[0]), 0, sizeof(ip->i_d.di_pad));
 			memset(&(dip->di_pad[0]), 0,
 			      sizeof(dip->di_pad));
-			ASSERT(ip->i_d.di_projid == 0);
+			ASSERT(xfs_get_projid(ip) == 0);
 		}
 	}
 
diff --git a/fs/xfs/xfs_inode.h b/fs/xfs/xfs_inode.h
index 0898c54..2a7343a 100644
--- a/fs/xfs/xfs_inode.h
+++ b/fs/xfs/xfs_inode.h
@@ -134,8 +134,9 @@ typedef struct xfs_icdinode {
 	__uint32_t	di_uid;		/* owner's user id */
 	__uint32_t	di_gid;		/* owner's group id */
 	__uint32_t	di_nlink;	/* number of links to file */
-	__uint16_t	di_projid;	/* owner's project id */
-	__uint8_t	di_pad[8];	/* unused, zeroed space */
+	__uint16_t	di_projid_lo;	/* lower part of owner's project id */
+	__uint16_t	di_projid_hi;	/* higher part of owner's project id */
+	__uint8_t	di_pad[6];	/* unused, zeroed space */
 	__uint16_t	di_flushiter;	/* incremented on flush */
 	xfs_ictimestamp_t di_atime;	/* time last accessed */
 	xfs_ictimestamp_t di_mtime;	/* time last modified */
@@ -335,6 +336,25 @@ xfs_iflags_test_and_clear(xfs_inode_t *ip, unsigned short flags)
 }
 
 /*
+ * Project quota id helpers (previously projid was 16bit only
+ * and using two 16bit values to hold new 32bit projid was choosen
+ * to retain compatibility with "old" filesystems).
+ */
+static inline prid_t
+xfs_get_projid(struct xfs_inode *ip)
+{
+	return (prid_t)ip->i_d.di_projid_hi << 16 | ip->i_d.di_projid_lo;
+}
+
+static inline void
+xfs_set_projid(struct xfs_inode *ip,
+		prid_t projid)
+{
+	ip->i_d.di_projid_hi = (__uint16_t) (projid >> 16);
+	ip->i_d.di_projid_lo = (__uint16_t) (projid & 0xffff);
+}
+
+/*
  * Manage the i_flush queue embedded in the inode.  This completion
  * queue synchronizes processes attempting to flush the in-core
  * inode back to disk.
@@ -456,7 +476,7 @@ void		xfs_inode_free(struct xfs_inode *ip);
  * xfs_inode.c prototypes.
  */
 int		xfs_ialloc(struct xfs_trans *, xfs_inode_t *, mode_t,
-			   xfs_nlink_t, xfs_dev_t, cred_t *, xfs_prid_t,
+			   xfs_nlink_t, xfs_dev_t, cred_t *, prid_t,
 			   int, struct xfs_buf **, boolean_t *, xfs_inode_t **);
 
 uint		xfs_ip2xflags(struct xfs_inode *);
diff --git a/fs/xfs/xfs_itable.c b/fs/xfs/xfs_itable.c
index 7e3626e..178b54b 100644
--- a/fs/xfs/xfs_itable.c
+++ b/fs/xfs/xfs_itable.c
@@ -92,7 +92,8 @@ xfs_bulkstat_one_int(
 	 * further change.
 	 */
 	buf->bs_nlink = dic->di_nlink;
-	buf->bs_projid = dic->di_projid;
+	buf->bs_projid = dic->di_projid_lo;
+	buf->bs_projid_hi = dic->di_projid_hi;
 	buf->bs_ino = ino;
 	buf->bs_mode = dic->di_mode;
 	buf->bs_uid = dic->di_uid;
diff --git a/fs/xfs/xfs_rename.c b/fs/xfs/xfs_rename.c
index 8fca957..494b5cd 100644
--- a/fs/xfs/xfs_rename.c
+++ b/fs/xfs/xfs_rename.c
@@ -183,7 +183,7 @@ xfs_rename(
 	 * tree quota mechanism would be circumvented.
 	 */
 	if (unlikely((target_dp->i_d.di_flags & XFS_DIFLAG_PROJINHERIT) &&
-		     (target_dp->i_d.di_projid != src_ip->i_d.di_projid))) {
+		     (xfs_get_projid(target_dp) != xfs_get_projid(src_ip)))) {
 		error = XFS_ERROR(EXDEV);
 		goto error_return;
 	}
diff --git a/fs/xfs/xfs_sb.h b/fs/xfs/xfs_sb.h
index 1b017c6..2c17a91 100644
--- a/fs/xfs/xfs_sb.h
+++ b/fs/xfs/xfs_sb.h
@@ -80,10 +80,12 @@ struct xfs_mount;
 #define XFS_SB_VERSION2_RESERVED4BIT	0x00000004
 #define XFS_SB_VERSION2_ATTR2BIT	0x00000008	/* Inline attr rework */
 #define XFS_SB_VERSION2_PARENTBIT	0x00000010	/* parent pointers */
+#define XFS_SB_VERSION2_PROJID32BIT	0x00000020	/* 32 bit project id */
 
 #define	XFS_SB_VERSION2_OKREALFBITS	\
 	(XFS_SB_VERSION2_LAZYSBCOUNTBIT	| \
-	 XFS_SB_VERSION2_ATTR2BIT)
+	 XFS_SB_VERSION2_ATTR2BIT	| \
+	 XFS_SB_VERSION2_PROJID32BIT)
 #define	XFS_SB_VERSION2_OKSASHFBITS	\
 	(0)
 #define XFS_SB_VERSION2_OKREALBITS	\
@@ -495,6 +497,12 @@ static inline void xfs_sb_version_removeattr2(xfs_sb_t *sbp)
 		sbp->sb_versionnum &= ~XFS_SB_VERSION_MOREBITSBIT;
 }
 
+static inline int xfs_sb_version_hasprojid32bit(xfs_sb_t *sbp)
+{
+	return xfs_sb_version_hasmorebits(sbp) &&
+		(sbp->sb_features2 & XFS_SB_VERSION2_PROJID32BIT);
+}
+
 /*
  * end of superblock version macros
  */
diff --git a/fs/xfs/xfs_types.h b/fs/xfs/xfs_types.h
index 3207752..26d1867 100644
--- a/fs/xfs/xfs_types.h
+++ b/fs/xfs/xfs_types.h
@@ -73,8 +73,6 @@ typedef	__int32_t	xfs_tid_t;	/* transaction identifier */
 typedef	__uint32_t	xfs_dablk_t;	/* dir/attr block number (in file) */
 typedef	__uint32_t	xfs_dahash_t;	/* dir/attr hash value */
 
-typedef __uint16_t	xfs_prid_t;	/* prid_t truncated to 16bits in XFS */
-
 typedef __uint32_t	xlog_tid_t;	/* transaction ID type */
 
 /*
diff --git a/fs/xfs/xfs_vnodeops.c b/fs/xfs/xfs_vnodeops.c
index 4c7c7bf..e4166ec 100644
--- a/fs/xfs/xfs_vnodeops.c
+++ b/fs/xfs/xfs_vnodeops.c
@@ -114,7 +114,7 @@ xfs_setattr(
 		 */
 		ASSERT(udqp == NULL);
 		ASSERT(gdqp == NULL);
-		code = xfs_qm_vop_dqalloc(ip, uid, gid, ip->i_d.di_projid,
+		code = xfs_qm_vop_dqalloc(ip, uid, gid, xfs_get_projid(ip),
 					 qflags, &udqp, &gdqp);
 		if (code)
 			return code;
@@ -1266,7 +1266,7 @@ xfs_create(
 	boolean_t		unlock_dp_on_error = B_FALSE;
 	uint			cancel_flags;
 	int			committed;
-	xfs_prid_t		prid;
+	prid_t			prid;
 	struct xfs_dquot	*udqp = NULL;
 	struct xfs_dquot	*gdqp = NULL;
 	uint			resblks;
@@ -1279,9 +1279,9 @@ xfs_create(
 		return XFS_ERROR(EIO);
 
 	if (dp->i_d.di_flags & XFS_DIFLAG_PROJINHERIT)
-		prid = dp->i_d.di_projid;
+		prid = xfs_get_projid(dp);
 	else
-		prid = dfltprid;
+		prid = XFS_PROJID_DEFAULT;
 
 	/*
 	 * Make sure that we have allocated dquot(s) on disk.
@@ -1880,7 +1880,7 @@ xfs_link(
 	 * the tree quota mechanism could be circumvented.
 	 */
 	if (unlikely((tdp->i_d.di_flags & XFS_DIFLAG_PROJINHERIT) &&
-		     (tdp->i_d.di_projid != sip->i_d.di_projid))) {
+		     (xfs_get_projid(tdp) != xfs_get_projid(sip)))) {
 		error = XFS_ERROR(EXDEV);
 		goto error_return;
 	}
@@ -1955,7 +1955,7 @@ xfs_symlink(
 	int			byte_cnt;
 	int			n;
 	xfs_buf_t		*bp;
-	xfs_prid_t		prid;
+	prid_t			prid;
 	struct xfs_dquot	*udqp, *gdqp;
 	uint			resblks;
 
@@ -1978,9 +1978,9 @@ xfs_symlink(
 
 	udqp = gdqp = NULL;
 	if (dp->i_d.di_flags & XFS_DIFLAG_PROJINHERIT)
-		prid = dp->i_d.di_projid;
+		prid = xfs_get_projid(dp);
 	else
-		prid = (xfs_prid_t)dfltprid;
+		prid = XFS_PROJID_DEFAULT;
 
 	/*
 	 * Make sure that we have allocated dquot(s) on disk.
-- 
1.7.3

_______________________________________________
xfs mailing list
xfs@oss.sgi.com
http://oss.sgi.com/mailman/listinfo/xfs

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH VER 5] xfsprogs: projid32bit handling
  2010-09-24 12:51 [PATCH VER 5] Extend project quotas to support 32bit project identifiers Arkadiusz Miśkiewicz
@ 2010-09-24 12:52 ` Arkadiusz Miśkiewicz
  2010-09-24 12:52   ` [PATCH VER 5] xfstests: Quota project id setting overflow Arkadiusz Miśkiewicz
                     ` (2 more replies)
  2010-09-26  0:05 ` [PATCH VER 5] Extend project quotas to support 32bit project identifiers Christoph Hellwig
  1 sibling, 3 replies; 7+ messages in thread
From: Arkadiusz Miśkiewicz @ 2010-09-24 12:52 UTC (permalink / raw)
  To: xfs

Add projid32bit handling to userspace. mkfs.xfs is able to enable this
feature for new filesystems. xfs_db knows what projid_lo/hi are.

Signed-off-by: Arkadiusz Miśkiewicz <arekm@maven.pl>
---

News?
- bs_projid_lo back as bs_projid to be compile time compatible with
  (some) existing software
- unneded parentheses dropped
- project quota helpers use 'struct foo' instead of 'foo_t' type
- better comment for project quota helpers
- added projid32bit content to mkfs.xfs
- non-words replaced with existing words

Note - there is no xfs_admin support for setting projid32bit.
It would be a mess when doing that in shell code, similar to this one:
http://pastebin.com/WWy8m1x7.

hch comments on this:
12:34 < hch> arekm: doesn't look too pretty indeed
12:34 < hch> arekm: let me think about hacking up some simple C code
             for toggling feature bits
12:35 < hch> alternatively we could just do it in kernelspace
12:35 < hch> which seems more useful anyway as we could do online upgrades
12:53 < hch> I think adding an ioctl for enabling features is the better way
12:53 < hch> alternatively we could overload remount, but that weels
             a bit clumsy

Not sure if hch is going to implement that or only suggesting that solution.
Anyway now projid32bit can be enabled at mkfs.xfs time (for new filesystems)
or if you are smart enough via xfs_db (for existing filesystems).

So if there are no new comments I'm asking for a merge for all 3 patches.
Thanks!

 db/check.c               |    2 +-
 db/inode.c               |    6 ++++--
 db/sb.c                  |    6 ++++++
 include/xfs_dinode.h     |    5 +++--
 include/xfs_fs.h         |   16 ++++++++++++++--
 include/xfs_inode.h      |   25 ++++++++++++++++++++++---
 include/xfs_sb.h         |   17 ++++++++++++++++-
 include/xfs_types.h      |    2 --
 libxfs/util.c            |   13 ++++++++-----
 libxfs/xfs_ialloc.c      |    3 ++-
 libxfs/xfs_inode.c       |    6 ++++--
 logprint/log_print_all.c |    6 ++++--
 man/man3/xfsctl.3        |    4 +++-
 man/man8/mkfs.xfs.8      |    7 +++++++
 man/man8/xfs_db.8        |    6 ++++--
 mkfs/xfs_mkfs.c          |   21 +++++++++++++++++----
 mkfs/xfs_mkfs.h          |    3 ++-
 quota/quot.c             |    2 +-
 repair/README            |    2 +-
 19 files changed, 119 insertions(+), 33 deletions(-)

diff --git a/db/check.c b/db/check.c
index 4f8a62a..a8939a4 100644
--- a/db/check.c
+++ b/db/check.c
@@ -2840,7 +2840,7 @@ process_inode(
 			break;
 		}
 		if (ic) {
-			dqprid = idic.di_projid;	/* dquot ID is u32 */
+			dqprid = xfs_get_projid(idic);	/* dquot ID is u32 */
 			quota_add(&dqprid, &idic.di_gid, &idic.di_uid,
 				  0, bc, ic, rc);
 		}
diff --git a/db/inode.c b/db/inode.c
index 4aa4e1a..6f8592a 100644
--- a/db/inode.c
+++ b/db/inode.c
@@ -81,8 +81,10 @@ const field_t	inode_core_flds[] = {
 	  FLD_COUNT, TYP_NONE },
 	{ "onlink", FLDT_UINT16D, OI(COFF(onlink)), inode_core_onlink_count,
 	  FLD_COUNT, TYP_NONE },
-	{ "projid", FLDT_UINT16D, OI(COFF(projid)), inode_core_projid_count,
-	  FLD_COUNT, TYP_NONE },
+	{ "projid_lo", FLDT_UINT16D, OI(COFF(projid_lo)),
+	  inode_core_projid_count, FLD_COUNT, TYP_NONE },
+	{ "projid_hi", FLDT_UINT16D, OI(COFF(projid_hi)),
+	  inode_core_projid_count, FLD_COUNT, TYP_NONE },
 	{ "uid", FLDT_UINT32D, OI(COFF(uid)), C1, 0, TYP_NONE },
 	{ "gid", FLDT_UINT32D, OI(COFF(gid)), C1, 0, TYP_NONE },
 	{ "flushiter", FLDT_UINT16D, OI(COFF(flushiter)), C1, 0, TYP_NONE },
diff --git a/db/sb.c b/db/sb.c
index 961a939..21f38c5 100644
--- a/db/sb.c
+++ b/db/sb.c
@@ -620,6 +620,8 @@ version_string(
 		strcat(s, ",ATTR2");
 	if (xfs_sb_version_haslazysbcount(sbp))
 		strcat(s, ",LAZYSBCOUNT");
+	if (xfs_sb_version_hasprojid32bit(sbp))
+		strcat(s, ",PROJID32BIT");
 	return s;
 }
 
@@ -696,6 +698,10 @@ version_f(
 			xfs_sb_version_addattr2(&mp->m_sb);
 			version = mp->m_sb.sb_versionnum;
 			features = mp->m_sb.sb_features2;
+		} else if (!strcasecmp(argv[1], "projid32bit")) {
+			xfs_sb_version_addprojid32bit(&mp->m_sb);
+			version = mp->m_sb.sb_versionnum;
+			features = mp->m_sb.sb_features2;
 		} else {
 			dbprintf(_("%s: invalid version change command \"%s\"\n"),
 				progname, argv[1]);
diff --git a/include/xfs_dinode.h b/include/xfs_dinode.h
index d7cf392..f28c088 100644
--- a/include/xfs_dinode.h
+++ b/include/xfs_dinode.h
@@ -52,8 +52,9 @@ typedef struct xfs_dinode_core {
 	__be32		di_uid;		/* owner's user id */
 	__be32		di_gid;		/* owner's group id */
 	__be32		di_nlink;	/* number of links to file */
-	__be16		di_projid;	/* owner's project id */
-	__u8		di_pad[8];	/* unused, zeroed space */
+	__be16		di_projid_lo;	/* lower part of owner's project id */
+	__be16		di_projid_hi;	/* higher part owner's project id */
+	__u8		di_pad[6];	/* unused, zeroed space */
 	__be16		di_flushiter;	/* incremented on flush */
 	xfs_timestamp_t	di_atime;	/* time last accessed */
 	xfs_timestamp_t	di_mtime;	/* time last modified */
diff --git a/include/xfs_fs.h b/include/xfs_fs.h
index 74e7274..9a51c64 100644
--- a/include/xfs_fs.h
+++ b/include/xfs_fs.h
@@ -299,9 +299,10 @@ typedef struct xfs_bstat {
 	__s32		bs_extsize;	/* extent size			*/
 	__s32		bs_extents;	/* number of extents		*/
 	__u32		bs_gen;		/* generation count		*/
-	__u16		bs_projid;	/* project id			*/
+	__u16		bs_projid;	/* lower part of project id	*/
 	__u16		bs_forkoff;	/* inode fork offset in bytes	*/
-	unsigned char	bs_pad[12];	/* pad space, unused		*/
+	__u16		bs_projid_hi;	/* higher part of project id	*/
+	unsigned char	bs_pad[10];	/* pad space, unused		*/
 	__u32		bs_dmevmask;	/* DMIG event mask		*/
 	__u16		bs_dmstate;	/* DMIG state info		*/
 	__u16		bs_aextents;	/* attribute number of extents	*/
@@ -506,4 +507,15 @@ typedef struct xfs_handle {
 #define BBTOB(bbs)	((bbs) << BBSHIFT)
 #endif
 
+/*
+ * Project quota id helpers (previously projid was 16bit only
+ * and using two 16bit values to hold new 32bit projid was choosen
+ * to retain compatibility with "old" filesystems).
+ */
+static inline __uint32_t
+bstat_get_projid(struct xfs_bstat *bs)
+{
+	return (__uint32_t)bs->bs_projid_hi << 16 | bs->bs_projid;
+}
+
 #endif	/* __XFS_FS_H__ */
diff --git a/include/xfs_inode.h b/include/xfs_inode.h
index b19b467..7e6fc91 100644
--- a/include/xfs_inode.h
+++ b/include/xfs_inode.h
@@ -124,8 +124,9 @@ typedef struct xfs_icdinode {
 	__uint32_t	di_uid;		/* owner's user id */
 	__uint32_t	di_gid;		/* owner's group id */
 	__uint32_t	di_nlink;	/* number of links to file */
-	__uint16_t	di_projid;	/* owner's project id */
-	__uint8_t	di_pad[8];	/* unused, zeroed space */
+	__uint16_t	di_projid_lo;	/* lower part of owner's project id */
+	__uint16_t	di_projid_hi;	/* higher part of owner's project id */
+	__uint8_t	di_pad[6];	/* unused, zeroed space */
 	__uint16_t	di_flushiter;	/* incremented on flush */
 	xfs_ictimestamp_t di_atime;	/* time last accessed */
 	xfs_ictimestamp_t di_mtime;	/* time last modified */
@@ -204,6 +205,24 @@ typedef struct xfs_icdinode {
 		((ip)->i_d.di_anextents = (n)))
 
 
+/*
+ * Project quota id helpers (previously projid was 16bit only
+ * and using two 16bit values to hold new 32bit projid was choosen
+ * to retain compatibility with "old" filesystems).
+ */
+static inline __uint32_t
+xfs_get_projid(struct xfs_icdinode i_d)
+{
+	return (__uint32_t)i_d.di_projid_hi << 16 | i_d.di_projid_lo;
+}
+
+static inline void
+xfs_set_projid(struct xfs_icdinode *i_d,
+		__uint32_t projid)
+{
+	i_d->di_projid_hi = (__uint16_t) (projid >> 16);
+	i_d->di_projid_lo = (__uint16_t) (projid & 0xffff);
+}
 
 #ifdef __KERNEL__
 
@@ -510,7 +529,7 @@ int		xfs_finish_reclaim_all(struct xfs_mount *, int);
 int		xfs_iread(struct xfs_mount *, struct xfs_trans *, xfs_ino_t,
 			  xfs_inode_t **, xfs_daddr_t, uint);
 int		xfs_ialloc(struct xfs_trans *, xfs_inode_t *, mode_t,
-			   xfs_nlink_t, xfs_dev_t, struct cred *, xfs_prid_t,
+			   xfs_nlink_t, xfs_dev_t, struct cred *, prid_t,
 			   int, struct xfs_buf **, boolean_t *, xfs_inode_t **);
 
 uint		xfs_ip2xflags(struct xfs_inode *);
diff --git a/include/xfs_sb.h b/include/xfs_sb.h
index 1e86489..0a14773 100644
--- a/include/xfs_sb.h
+++ b/include/xfs_sb.h
@@ -80,10 +80,12 @@ struct xfs_mount;
 #define XFS_SB_VERSION2_RESERVED4BIT	0x00000004
 #define XFS_SB_VERSION2_ATTR2BIT	0x00000008	/* Inline attr rework */
 #define XFS_SB_VERSION2_PARENTBIT	0x00000010	/* parent pointers */
+#define XFS_SB_VERSION2_PROJID32BIT	0x00000020	/* 32 bit project id */
 
 #define	XFS_SB_VERSION2_OKREALFBITS	\
 	(XFS_SB_VERSION2_LAZYSBCOUNTBIT	| \
-	 XFS_SB_VERSION2_ATTR2BIT)
+	 XFS_SB_VERSION2_ATTR2BIT	| \
+	 XFS_SB_VERSION2_PROJID32BIT)
 #define	XFS_SB_VERSION2_OKSASHFBITS	\
 	(0)
 #define XFS_SB_VERSION2_OKREALBITS	\
@@ -489,6 +491,19 @@ static inline void xfs_sb_version_removeattr2(xfs_sb_t *sbp)
 		sbp->sb_versionnum &= ~XFS_SB_VERSION_MOREBITSBIT;
 }
 
+static inline int xfs_sb_version_hasprojid32bit(xfs_sb_t *sbp)
+{
+	return xfs_sb_version_hasmorebits(sbp) &&
+		(sbp->sb_features2 & XFS_SB_VERSION2_PROJID32BIT);
+}
+
+static inline void xfs_sb_version_addprojid32bit(xfs_sb_t *sbp)
+{
+	sbp->sb_versionnum |= XFS_SB_VERSION_MOREBITSBIT;
+	sbp->sb_features2 |= XFS_SB_VERSION2_PROJID32BIT;
+	sbp->sb_bad_features2 |= XFS_SB_VERSION2_PROJID32BIT;
+}
+
 /*
  * end of superblock version macros
  */
diff --git a/include/xfs_types.h b/include/xfs_types.h
index 0f51916..228b948 100644
--- a/include/xfs_types.h
+++ b/include/xfs_types.h
@@ -81,8 +81,6 @@ typedef	__int32_t	xfs_tid_t;	/* transaction identifier */
 typedef	__uint32_t	xfs_dablk_t;	/* dir/attr block number (in file) */
 typedef	__uint32_t	xfs_dahash_t;	/* dir/attr hash value */
 
-typedef __uint16_t	xfs_prid_t;	/* prid_t truncated to 16bits in XFS */
-
 /*
  * These types are 64 bits on disk but are either 32 or 64 bits in memory.
  * Disk based types:
diff --git a/libxfs/util.c b/libxfs/util.c
index 409fb92..077d2a2 100644
--- a/libxfs/util.c
+++ b/libxfs/util.c
@@ -134,7 +134,7 @@ libxfs_iread(
 	 * made it 32 bits long.  If this is an old format inode,
 	 * convert it in memory to look like a new one.  If it gets
 	 * flushed to disk we will convert back before flushing or
-	 * logging it.  We zero out the new projid field and the old link
+	 * logging it.  We zero out the new projid_lo/hi field and the old link
 	 * count field.  We'll handle clearing the pad field (the remains
 	 * of the old uuid field) when we actually convert the inode to
 	 * the new format. We don't change the version number so that we
@@ -143,7 +143,7 @@ libxfs_iread(
 	if (ip->i_d.di_version == XFS_DINODE_VERSION_1) {
 		ip->i_d.di_nlink = ip->i_d.di_onlink;
 		ip->i_d.di_onlink = 0;
-		ip->i_d.di_projid = 0;
+		xfs_set_projid(&ip->i_d, 0);
 	}
 
 	ip->i_delayed_blks = 0;
@@ -219,7 +219,7 @@ libxfs_ialloc(
 	ASSERT(ip->i_d.di_nlink == nlink);
 	ip->i_d.di_uid = cr->cr_uid;
 	ip->i_d.di_gid = cr->cr_gid;
-	ip->i_d.di_projid = pip ? 0 : fsx->fsx_projid;
+	xfs_set_projid(&ip->i_d, pip ? 0 : fsx->fsx_projid);
 	memset(&(ip->i_d.di_pad[0]), 0, sizeof(ip->i_d.di_pad));
 
 	/*
@@ -231,7 +231,10 @@ libxfs_ialloc(
 	if (xfs_sb_version_hasnlink(&tp->t_mountp->m_sb) &&
 	    ip->i_d.di_version == XFS_DINODE_VERSION_1) {
 		ip->i_d.di_version = XFS_DINODE_VERSION_2;
-		/* old link count, projid field, pad field already zeroed */
+		/*
+		 * old link count, projid_lo/hi field, pad field
+		 * already zeroed
+		 */
 	}
 
 	if (pip && (pip->i_d.di_mode & S_ISGID)) {
@@ -446,7 +449,7 @@ libxfs_iflush_int(xfs_inode_t *ip, xfs_buf_t *bp)
 			memset(&(ip->i_d.di_pad[0]), 0, sizeof(ip->i_d.di_pad));
 			memset(&(dip->di_core.di_pad[0]), 0,
 			      sizeof(dip->di_core.di_pad));
-			ASSERT(ip->i_d.di_projid == 0);
+			ASSERT(xfs_get_projid(ip->i_d) == 0);
 		}
 	}
 
diff --git a/libxfs/xfs_ialloc.c b/libxfs/xfs_ialloc.c
index 39fdf96..32ae4b0 100644
--- a/libxfs/xfs_ialloc.c
+++ b/libxfs/xfs_ialloc.c
@@ -46,7 +46,8 @@ xfs_ialloc_log_di(
 		offsetof(xfs_dinode_core_t, di_uid),
 		offsetof(xfs_dinode_core_t, di_gid),
 		offsetof(xfs_dinode_core_t, di_nlink),
-		offsetof(xfs_dinode_core_t, di_projid),
+		offsetof(xfs_dinode_core_t, di_projid_lo),
+		offsetof(xfs_dinode_core_t, di_projid_hi),
 		offsetof(xfs_dinode_core_t, di_pad),
 		offsetof(xfs_dinode_core_t, di_atime),
 		offsetof(xfs_dinode_core_t, di_mtime),
diff --git a/libxfs/xfs_inode.c b/libxfs/xfs_inode.c
index b0adabc..1c9ea3b 100644
--- a/libxfs/xfs_inode.c
+++ b/libxfs/xfs_inode.c
@@ -589,7 +589,8 @@ xfs_dinode_from_disk(
 	to->di_uid = be32_to_cpu(from->di_uid);
 	to->di_gid = be32_to_cpu(from->di_gid);
 	to->di_nlink = be32_to_cpu(from->di_nlink);
-	to->di_projid = be16_to_cpu(from->di_projid);
+	to->di_projid_lo = be16_to_cpu(from->di_projid_lo);
+	to->di_projid_hi = be16_to_cpu(from->di_projid_hi);
 	memcpy(to->di_pad, from->di_pad, sizeof(to->di_pad));
 	to->di_flushiter = be16_to_cpu(from->di_flushiter);
 	to->di_atime.t_sec = be32_to_cpu(from->di_atime.t_sec);
@@ -624,7 +625,8 @@ xfs_dinode_to_disk(
 	to->di_uid = cpu_to_be32(from->di_uid);
 	to->di_gid = cpu_to_be32(from->di_gid);
 	to->di_nlink = cpu_to_be32(from->di_nlink);
-	to->di_projid = cpu_to_be16(from->di_projid);
+	to->di_projid_lo = cpu_to_be16(from->di_projid_lo);
+	to->di_projid_hi = cpu_to_be16(from->di_projid_hi);
 	memcpy(to->di_pad, from->di_pad, sizeof(to->di_pad));
 	to->di_flushiter = cpu_to_be16(from->di_flushiter);
 	to->di_atime.t_sec = cpu_to_be32(from->di_atime.t_sec);
diff --git a/logprint/log_print_all.c b/logprint/log_print_all.c
index c21e05c..572dac8 100644
--- a/logprint/log_print_all.c
+++ b/logprint/log_print_all.c
@@ -238,8 +238,10 @@ xlog_recover_print_inode_core(
 	     "onlink:%d\n"),
 	       (di->di_magic>>8) & 0xff, di->di_magic & 0xff,
 	       di->di_mode, di->di_version, di->di_format, di->di_onlink);
-	printf(_("		uid:%d  gid:%d  nlink:%d projid:%d\n"),
-	       di->di_uid, di->di_gid, di->di_nlink, (uint)di->di_projid);
+	printf(_("		uid:%d  gid:%d  nlink:%d\n"),
+	       di->di_uid, di->di_gid, di->di_nlink);
+	printf(_("		projid_lo:%d projid_hi:%d\n"),
+	       (uint)di->di_projid_lo, (uint)di->di_projid_hi);
 	printf(_("		atime:%d  mtime:%d  ctime:%d\n"),
 	       di->di_atime.t_sec, di->di_mtime.t_sec, di->di_ctime.t_sec);
 	printf(_("		flushiter:%d\n"), di->di_flushiter);
diff --git a/man/man3/xfsctl.3 b/man/man3/xfsctl.3
index 784b3e0..4239a62 100644
--- a/man/man3/xfsctl.3
+++ b/man/man3/xfsctl.3
@@ -565,7 +565,9 @@ The structure has the following elements:
 .B bs_gen
 (generation count),
 .B bs_projid
-(project id),
+(project id - low word),
+.B bs_projid_hi
+(project id - high word, used when projid32bit feature is enabled),
 .B bs_dmevmask
 (DMIG event mask),
 .B bs_dmstate
diff --git a/man/man8/mkfs.xfs.8 b/man/man8/mkfs.xfs.8
index fdd38d4..a59bc89 100644
--- a/man/man8/mkfs.xfs.8
+++ b/man/man8/mkfs.xfs.8
@@ -350,6 +350,13 @@ between attribute and extent data.
 The previous version 1, which has fixed regions for attribute and
 extent data, is kept for backwards compatibility with kernels older
 than version 2.6.16.
+.TP
+.BI projid32bit[= value]
+This is used to enable 32bit quota project identifiers. The
+.I value
+is either 0 or 1, with 1 signifying that 32bit projid are to be enabled.
+If the
+is omitted, 0 is assumed.
 .RE
 .TP
 .BI \-l " log_section_options"
diff --git a/man/man8/xfs_db.8 b/man/man8/xfs_db.8
index 629ae58..17ac601 100644
--- a/man/man8/xfs_db.8
+++ b/man/man8/xfs_db.8
@@ -1474,8 +1474,10 @@ number of links to the file in a version 1 inode.
 .B nlinkv2
 number of links to the file in a version 2 inode.
 .TP
-.B projid
-owner's project id (version 2 inode only).
+.B projid_lo
+owner's project id (low word; version 2 inode only).
+.B projid_hi
+owner's project id (high word; version 2 inode only).
 .TP
 .B uid
 owner's user id.
diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c
index 2d09e36..155a0b5 100644
--- a/mkfs/xfs_mkfs.c
+++ b/mkfs/xfs_mkfs.c
@@ -106,6 +106,8 @@ char	*iopts[] = {
 	"size",
 #define	I_ATTR		5
 	"attr",
+#define	I_PROJID32BIT	6
+	"projid32bit",
 	NULL
 };
 
@@ -829,6 +831,7 @@ main(
 	__uint64_t		agsize;
 	xfs_alloc_rec_t		*arec;
 	int			attrversion;
+	int			projid32bit;
 	struct xfs_btree_block	*block;
 	int			blflag;
 	int			blocklog;
@@ -923,6 +926,7 @@ main(
 	textdomain(PACKAGE);
 
 	attrversion = 2;
+	projid32bit = 0;
 	blflag = bsflag = slflag = ssflag = lslflag = lssflag = 0;
 	blocklog = blocksize = 0;
 	sectorlog = lsectorlog = XFS_MIN_SECTORSIZE_LOG;
@@ -1259,6 +1263,14 @@ main(
 						illegal(value, "i attr");
 					attrversion = c;
 					break;
+				case I_PROJID32BIT:
+					if (!value)
+						value = "0";
+					c = atoi(value);
+					if (c < 0 || c > 1)
+						illegal(value, "i projid32bit");
+					projid32bit = c;
+					break;
 				default:
 					unknown('i', value);
 				}
@@ -2261,7 +2273,7 @@ an AG size that is one stripe unit smaller, for example %llu.\n"),
 	if (!qflag || Nflag) {
 		printf(_(
 		   "meta-data=%-22s isize=%-6d agcount=%lld, agsize=%lld blks\n"
-		   "         =%-22s sectsz=%-5u attr=%u\n"
+		   "         =%-22s sectsz=%-5u attr=%u projid32bit=%u\n"
 		   "data     =%-22s bsize=%-6u blocks=%llu, imaxpct=%u\n"
 		   "         =%-22s sunit=%-6u swidth=%u blks\n"
 		   "naming   =version %-14u bsize=%-6u ascii-ci=%d\n"
@@ -2269,7 +2281,7 @@ an AG size that is one stripe unit smaller, for example %llu.\n"),
 		   "         =%-22s sectsz=%-5u sunit=%d blks, lazy-count=%d\n"
 		   "realtime =%-22s extsz=%-6d blocks=%lld, rtextents=%lld\n"),
 			dfile, isize, (long long)agcount, (long long)agsize,
-			"", sectorsize, attrversion,
+			"", sectorsize, attrversion, projid32bit,
 			"", blocksize, (long long)dblocks, imaxpct,
 			"", dsunit, dswidth,
 			dirversion, dirblocksize, nci,
@@ -2336,7 +2348,7 @@ an AG size that is one stripe unit smaller, for example %llu.\n"),
 		sbp->sb_logsectsize = 0;
 	}
 	sbp->sb_features2 = XFS_SB_VERSION2_MKFS(lazy_sb_counters,
-					attrversion == 2, 0);
+					attrversion == 2, projid32bit == 1, 0);
 	sbp->sb_versionnum = XFS_SB_VERSION_MKFS(iaflag, dsunit != 0,
 					logversion == 2, attrversion == 1,
 					(sectorsize != BBSIZE ||
@@ -2804,7 +2816,8 @@ usage( void )
 /* data subvol */	[-d agcount=n,agsize=n,file,name=xxx,size=num,\n\
 			    (sunit=value,swidth=value|su=num,sw=num),\n\
 			    sectlog=n|sectsize=num\n\
-/* inode size */	[-i log=n|perblock=n|size=num,maxpct=n,attr=0|1|2]\n\
+/* inode size */	[-i log=n|perblock=n|size=num,maxpct=n,attr=0|1|2,\n\
+			    projid32bit=0|1]\n\
 /* log subvol */	[-l agnum=n,internal,size=num,logdev=xxx,version=n\n\
 			    sunit=value|su=num,sectlog=n|sectsize=num,\n\
 			    lazy-count=0|1]\n\
diff --git a/mkfs/xfs_mkfs.h b/mkfs/xfs_mkfs.h
index 49401d6..f25a7f3 100644
--- a/mkfs/xfs_mkfs.h
+++ b/mkfs/xfs_mkfs.h
@@ -36,9 +36,10 @@
 	        XFS_DFL_SB_VERSION_BITS |                               \
 	0 ) : XFS_SB_VERSION_1 )
 
-#define XFS_SB_VERSION2_MKFS(lazycount, attr2, parent) (\
+#define XFS_SB_VERSION2_MKFS(lazycount, attr2, projid32bit, parent) (\
 	((lazycount) ? XFS_SB_VERSION2_LAZYSBCOUNTBIT : 0) |		\
 	((attr2) ? XFS_SB_VERSION2_ATTR2BIT : 0) |			\
+	((projid32bit) ? XFS_SB_VERSION2_PROJID32BIT : 0) |		\
 	((parent) ? XFS_SB_VERSION2_PARENTBIT : 0) |			\
 	0 )
 
diff --git a/quota/quot.c b/quota/quot.c
index 09d349f..54387ea 100644
--- a/quota/quot.c
+++ b/quota/quot.c
@@ -102,7 +102,7 @@ quot_bulkstat_add(
 	}
 	for (i = 0; i < 3; i++) {
 		id = (i == 0) ? p->bs_uid : ((i == 1) ?
-				p->bs_gid : p->bs_projid);
+			p->bs_gid : bstat_get_projid(p));
 		hp = &duhash[i][id % DUHASH];
 		for (dp = *hp; dp; dp = dp->next)
 			if (dp->id == id)
diff --git a/repair/README b/repair/README
index 69cb0c5..7f168e6 100644
--- a/repair/README
+++ b/repair/README
@@ -130,7 +130,7 @@ D - 0)	rewrite directory leaf block holemap comparison code.
 	it does describe doesn't conflict with reality.
 
 D - 0)	rewrite setting nlinks handling -- for version 1
-	inodes, set both nlinks and onlinks (zero projid
+	inodes, set both nlinks and onlinks (zero projid_lo/hi
 	and pad) if we have to change anything.  For
 	version 2, I think we're ok.
 
-- 
1.7.3

_______________________________________________
xfs mailing list
xfs@oss.sgi.com
http://oss.sgi.com/mailman/listinfo/xfs

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH VER 5] xfstests: Quota project id setting overflow
  2010-09-24 12:52 ` [PATCH VER 5] xfsprogs: projid32bit handling Arkadiusz Miśkiewicz
@ 2010-09-24 12:52   ` Arkadiusz Miśkiewicz
  2010-09-26  0:10     ` Christoph Hellwig
  2010-09-24 20:17   ` [PATCH VER 5] xfsprogs: projid32bit handling (xfs_admin patch) Arkadiusz Miskiewicz
  2010-09-26  0:06   ` [PATCH VER 5] xfsprogs: projid32bit handling Christoph Hellwig
  2 siblings, 1 reply; 7+ messages in thread
From: Arkadiusz Miśkiewicz @ 2010-09-24 12:52 UTC (permalink / raw)
  To: xfs

From: Arkadiusz Miskiewicz <arekm@maven.pl>

Test 3 quota project setting id conditions:
- set 16bit project quota id -> should succeed
- set 32bit project quota id -> should succeed (with projid32bit
  patch applied; fail otherwise)
- over 32bit project quota id -> should always fail

Signed-off-by: Arkadiusz Miśkiewicz <arekm@maven.pl>
---
News?
- partial rewrite since projid32bit feature2 bit flag is no longer
  set automaticly
- we create projid32bit=0 and projid32bit=1 filesystems from scratch now
- use _require_prjquota for scratch device

 244     |  125 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 244.out |    2 +
 group   |    1 +
 3 files changed, 128 insertions(+), 0 deletions(-)
 create mode 100644 244
 create mode 100644 244.out

diff --git a/244 b/244
new file mode 100644
index 0000000..8a89f97
--- /dev/null
+++ b/244
@@ -0,0 +1,125 @@
+#! /bin/bash
+# FS QA Test No. 244
+#
+# test to verify that proper project quota id is correctly set
+#
+#-----------------------------------------------------------------------
+# Copyright (c) 2010 Arkadiusz Miśkiewicz.  All Rights Reserved.
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License as
+# published by the Free Software Foundation.
+#
+# This program is distributed in the hope that it would be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write the Free Software Foundation,
+# Inc.,  51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+#
+#-----------------------------------------------------------------------
+#
+# creator
+owner=arekm@maven.pl
+
+seq=`basename $0`
+echo "QA output created by $seq"
+
+here=`pwd`
+tmp=/tmp/$$
+status=1	# failure is the default!
+trap "_cleanup; exit \$status" 0 1 2 3 15
+
+# get standard environment, filters and checks
+. ./common.rc
+. ./common.filter
+. ./common.quota
+
+_cleanup()
+{
+	cd /
+	umount $SCRATCH_MNT 2>/dev/null
+	rm -f $tmp.*
+}
+
+# real QA test starts here
+_supported_fs xfs
+_require_xfs_quota
+_require_scratch
+
+export MOUNT_OPTIONS="-opquota"
+
+# make fs with no projid32bit
+_scratch_mkfs_xfs -i projid32bit=0 >> $seq.full || _fail "mkfs failed"
+_qmount
+# make sure project quota is supported
+_require_prjquota ${SCRATCH_DEV}
+
+dir=$SCRATCH_MNT/project
+
+status=0
+
+echo "Silence is golden"
+
+# Do testing on projid32bit disabled filesystem
+mkdir $dir
+
+touch $dir/below16bit
+# below 16bit value
+$XFS_QUOTA_PROG -x -c "project -s -p $dir/below16bit 3422" $SCRATCH_DEV >> $seq.full
+projid=$($XFS_IO_PROG -r -c "lsproj" $dir/below16bit)
+if [ "projid = 3422" != "$projid" ]; then
+	echo "FAIL: projid32bit disabled: returned projid value ($projid) doesn't match set one (projid = 3422)"
+	status=1
+fi
+
+# 32bit value, should fail
+touch $dir/over16bit
+if $XFS_QUOTA_PROG -x -c "project -s -p $dir/over16bit 108545" $SCRATCH_DEV >> $seq.full 2>&1; then
+	echo "FAIL: projid32bit disabled: setting 32bit projid succeeded while it should fail"
+	status=1
+fi
+
+# over 32bit value, should fail
+touch $dir/over32bit
+if $XFS_QUOTA_PROG -x -c "project -s -p $dir/over32bit 5344967296" $SCRATCH_DEV >> $seq.full 2>&1; then
+	echo "FAIL: projid32bit disabled: setting over 32bit projid succeeded while it should fail"
+	status=1
+fi
+
+#  Do testing on projid32bit enabled filesystem
+umount $SCRATCH_DEV 2>/dev/null
+_scratch_mkfs_xfs -i projid32bit=1 >> $seq.full || _fail "mkfs failed"
+_qmount
+mkdir $dir
+
+touch $dir/below16bit
+# below 16bit value
+$XFS_QUOTA_PROG -x -c "project -s -p $dir/below16bit 3422" $SCRATCH_DEV >> $seq.full
+projid=$($XFS_IO_PROG -r -c "lsproj" $dir/below16bit)
+if [ "projid = 3422" != "$projid" ]; then
+	echo "FAIL: projid32bit enabled: returned projid value ($projid) doesn't match set one (projid = 3422)"
+	status=1
+fi
+
+# 32bit value, should succeed
+touch $dir/over16bit
+if $XFS_QUOTA_PROG -x -c "project -s -p $dir/over16bit 108545" $SCRATCH_DEV >> $seq.full 2>&1; then
+	projid=$($XFS_IO_PROG -r -c "lsproj" $dir/over16bit)
+	if [ "projid = 108545" != "$projid" ]; then
+		echo "FAIL: projid32bit enabled: returned projid value ($projid) doesn't match set one (projid = 108545)"
+		status=1
+	fi
+else
+	echo "FAIL: projid32bit enabled: setting 32bit projid failed while it should succeed"
+	status=1
+fi
+
+# over 32bit value, should fail
+touch $dir/over32bit
+if $XFS_QUOTA_PROG -x -c "project -s -p $dir/over32bit 5344967296" $SCRATCH_DEV >> $seq.full 2>&1; then
+	echo "FAIL: projid32bit disabled: setting over 32bit projid succeeded while it should fail"
+	status=1
+fi
diff --git a/244.out b/244.out
new file mode 100644
index 0000000..440da1f
--- /dev/null
+++ b/244.out
@@ -0,0 +1,2 @@
+QA output created by 244
+Silence is golden
diff --git a/group b/group
index e6dab13..0cd158b 100644
--- a/group
+++ b/group
@@ -357,3 +357,4 @@ deprecated
 241 auto
 242 auto quick prealloc
 243 auto quick prealloc
+244 auto quota quick
-- 
1.7.3

_______________________________________________
xfs mailing list
xfs@oss.sgi.com
http://oss.sgi.com/mailman/listinfo/xfs

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* Re: [PATCH VER 5] xfsprogs: projid32bit handling (xfs_admin patch)
  2010-09-24 12:52 ` [PATCH VER 5] xfsprogs: projid32bit handling Arkadiusz Miśkiewicz
  2010-09-24 12:52   ` [PATCH VER 5] xfstests: Quota project id setting overflow Arkadiusz Miśkiewicz
@ 2010-09-24 20:17   ` Arkadiusz Miskiewicz
  2010-09-26  0:06   ` [PATCH VER 5] xfsprogs: projid32bit handling Christoph Hellwig
  2 siblings, 0 replies; 7+ messages in thread
From: Arkadiusz Miskiewicz @ 2010-09-24 20:17 UTC (permalink / raw)
  To: xfs

On Friday 24 of September 2010, Arkadiusz Miśkiewicz wrote:

> Note - there is no xfs_admin support for setting projid32bit.
> It would be a mess when doing that in shell code, similar to this one:
> http://pastebin.com/WWy8m1x7.
> 
> hch comments on this:
> 12:34 < hch> arekm: doesn't look too pretty indeed
> 12:34 < hch> arekm: let me think about hacking up some simple C code
>              for toggling feature bits
> 12:35 < hch> alternatively we could just do it in kernelspace
> 12:35 < hch> which seems more useful anyway as we could do online upgrades
> 12:53 < hch> I think adding an ioctl for enabling features is the better
> way 12:53 < hch> alternatively we could overload remount, but that weels a
> bit clumsy
> 
> Not sure if hch is going to implement that or only suggesting that
> solution. Anyway now projid32bit can be enabled at mkfs.xfs time (for new
> filesystems) or if you are smart enough via xfs_db (for existing
> filesystems).

But if someone really wants xfs_admin support in shell then here it is:

diff --git a/db/xfs_admin.sh b/db/xfs_admin.sh
index a7a3fdb..ec8424d 100755
--- a/db/xfs_admin.sh
+++ b/db/xfs_admin.sh
@@ -6,9 +6,43 @@
 status=0
 DB_OPTS=""
 REPAIR_OPTS=""
-USAGE="Usage: xfs_admin [-efjluV] [-c 0|1] [-L label] [-U uuid] device"
+USAGE="Usage: xfs_admin [-efjlpuV] [-c 0|1] [-L label] [-U uuid] device"
 
-while getopts "efjluc:L:U:V" c
+set_features2_bit() {
+	device="$1"
+	bit="$2"
+
+	if [ -z "$device" ]; then
+		echo "$0: device name is missing" >&2
+		return 1
+	fi
+
+	if [ -z "$bit" ]; then
+		echo "$0: bits to set are missing" >&2
+		return 1
+	fi
+
+	# read current bits
+	features2=$(xfs_db -p xfs_admin -x -r -c 'sb' -c 'print features2' "$device" | awk ' { print $3 } ')
+	if [ -z "$features2" ]; then
+		echo "$0: can't read features2 from superblock!" >&2
+		return 1
+	fi
+	bad_features2=$(xfs_db -p xfs_admin -x -r -c 'sb' -c 'print bad_features2' "$device" | awk ' { print $3 } ')
+	if [ -z "$bad_features2" ]; then
+		echo "$0: can't read bad_features2 from superblock!" >&2
+		return 1
+	fi
+
+	# set new bits
+	features2=$((features2 | bit))
+	bad_features2=$((bad_features2 | bit))
+	xfs_db -p xfs_admin -x -c 'sb' -c "write features2 $features2" "$device" && \
+		xfs_db -p xfs_admin -x -c 'sb' -c "write bad_features2 $bad_features2" "$device"
+	return $?
+}
+
+while getopts "efjlu3c:L:U:V" c
 do
 	case $c in
 	c)	REPAIR_OPTS=$REPAIR_OPTS" -c lazycount="$OPTARG;;
@@ -17,6 +51,7 @@ do
 	j)	DB_OPTS=$DB_OPTS" -c 'version log2'";;
 	l)	DB_OPTS=$DB_OPTS" -r -c label";;
 	L)	DB_OPTS=$DB_OPTS" -c 'label "$OPTARG"'";;
+	3)	FEATURES_BIT="0x20";;
 	u)	DB_OPTS=$DB_OPTS" -r -c uuid";;
 	U)	DB_OPTS=$DB_OPTS" -c 'uuid "$OPTARG"'";;
 	V)	xfs_db -p xfs_admin -V
@@ -31,7 +66,12 @@ done
 set -- extra $@
 shift $OPTIND
 case $# in
-	1)	if [ -n "$DB_OPTS" ]
+	1)	if [ -n "$FEATURES_BIT" ]
+		then
+			set_features2_bit "$1" "$FEATURES_BIT"
+			status=$?
+		fi
+		if [ -n "$DB_OPTS" ]
 		then
 			eval xfs_db -x -p xfs_admin $DB_OPTS $1
 			status=$?
diff --git a/man/man8/xfs_admin.8 b/man/man8/xfs_admin.8
index 8e3155b..6b727f3 100644
--- a/man/man8/xfs_admin.8
+++ b/man/man8/xfs_admin.8
@@ -4,7 +4,7 @@ xfs_admin \- change parameters of an XFS filesystem
 .SH SYNOPSIS
 .B xfs_admin
 [
-.B \-eflu
+.B \-eflu3
 ] [
 .BR "\-c 0" | 1
 ] [
@@ -55,6 +55,9 @@ Print the current filesystem label.
 .B \-u
 Print the current filesystem UUID (Universally Unique IDentifier).
 .TP
+.B \-3
+Enable 32bit project identifier support (PROJID32BIT feature).
+.TP
 .BR "\-c 0" | 1
 Enable (1) or disable (0) lazy-counters in the filesystem.
 This operation may take quite a bit of time on large filesystems as the

> 
> So if there are no new comments I'm asking for a merge for all 3 patches.
> Thanks!

-- 
Arkadiusz Miśkiewicz        PLD/Linux Team
arekm / maven.pl            http://ftp.pld-linux.org/

_______________________________________________
xfs mailing list
xfs@oss.sgi.com
http://oss.sgi.com/mailman/listinfo/xfs

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* Re: [PATCH VER 5] Extend project quotas to support 32bit project identifiers.
  2010-09-24 12:51 [PATCH VER 5] Extend project quotas to support 32bit project identifiers Arkadiusz Miśkiewicz
  2010-09-24 12:52 ` [PATCH VER 5] xfsprogs: projid32bit handling Arkadiusz Miśkiewicz
@ 2010-09-26  0:05 ` Christoph Hellwig
  1 sibling, 0 replies; 7+ messages in thread
From: Christoph Hellwig @ 2010-09-26  0:05 UTC (permalink / raw)
  To: Arkadiusz Mi??kiewicz; +Cc: xfs

> -	if ((mask & FSX_PROJID) && (fa->fsx_projid > (__uint16_t)-1))
> +	if ((mask & FSX_PROJID) && (fa->fsx_projid > (__uint16_t)-1)
> +			&& !xfs_sb_version_hasprojid32bit(&ip->i_mount->m_sb))

I hate to nipick now that this is basically ready, but the normal kernel
and XFS style is to keep the operators at the end of the previous line,
e.g.

	if ((mask & FSX_PROJID) && (fa->fsx_projid > (__uint16_t)-1) &&
	    !xfs_sb_version_hasprojid32bit(&ip->i_mount->m_sb))

> --- a/fs/xfs/xfs_sb.h
> +++ b/fs/xfs/xfs_sb.h
> @@ -80,10 +80,12 @@ struct xfs_mount;
>  #define XFS_SB_VERSION2_RESERVED4BIT	0x00000004
>  #define XFS_SB_VERSION2_ATTR2BIT	0x00000008	/* Inline attr rework */
>  #define XFS_SB_VERSION2_PARENTBIT	0x00000010	/* parent pointers */
> +#define XFS_SB_VERSION2_PROJID32BIT	0x00000020	/* 32 bit project id */

0x00000020 is already used by patches to make use inocode for the CI
dir hash, and 0x00000040 is used by the NFSv4 ACL patches.  Can you take
0x00000080 instead?

I'll submit a patch to get the other two into the header so that they
won't conflict.

Except for these minor bits this looks good,


Reviewed-by: Christoph Hellwig <hch@lst.de>

_______________________________________________
xfs mailing list
xfs@oss.sgi.com
http://oss.sgi.com/mailman/listinfo/xfs

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH VER 5] xfsprogs: projid32bit handling
  2010-09-24 12:52 ` [PATCH VER 5] xfsprogs: projid32bit handling Arkadiusz Miśkiewicz
  2010-09-24 12:52   ` [PATCH VER 5] xfstests: Quota project id setting overflow Arkadiusz Miśkiewicz
  2010-09-24 20:17   ` [PATCH VER 5] xfsprogs: projid32bit handling (xfs_admin patch) Arkadiusz Miskiewicz
@ 2010-09-26  0:06   ` Christoph Hellwig
  2 siblings, 0 replies; 7+ messages in thread
From: Christoph Hellwig @ 2010-09-26  0:06 UTC (permalink / raw)
  To: Arkadiusz Mi??kiewicz; +Cc: xfs

On Fri, Sep 24, 2010 at 02:52:28PM +0200, Arkadiusz Mi??kiewicz wrote:
> Add projid32bit handling to userspace. mkfs.xfs is able to enable this
> feature for new filesystems. xfs_db knows what projid_lo/hi are.
> 
> Signed-off-by: Arkadiusz Mi??kiewicz <arekm@maven.pl>

Looks good,


Reviewed-by: Christoph Hellwig <hch@lst.de>

_______________________________________________
xfs mailing list
xfs@oss.sgi.com
http://oss.sgi.com/mailman/listinfo/xfs

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH VER 5] xfstests: Quota project id setting overflow
  2010-09-24 12:52   ` [PATCH VER 5] xfstests: Quota project id setting overflow Arkadiusz Miśkiewicz
@ 2010-09-26  0:10     ` Christoph Hellwig
  0 siblings, 0 replies; 7+ messages in thread
From: Christoph Hellwig @ 2010-09-26  0:10 UTC (permalink / raw)
  To: Arkadiusz Mi??kiewicz; +Cc: xfs

On Fri, Sep 24, 2010 at 02:52:49PM +0200, Arkadiusz Mi??kiewicz wrote:
> From: Arkadiusz Miskiewicz <arekm@maven.pl>
> 
> Test 3 quota project setting id conditions:
> - set 16bit project quota id -> should succeed
> - set 32bit project quota id -> should succeed (with projid32bit
>   patch applied; fail otherwise)
> - over 32bit project quota id -> should always fail
> 
> Signed-off-by: Arkadiusz Mi??kiewicz <arekm@maven.pl>

Looks good,


Reviewed-by: Christoph Hellwig <hch@lst.de>

_______________________________________________
xfs mailing list
xfs@oss.sgi.com
http://oss.sgi.com/mailman/listinfo/xfs

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2010-09-26  0:09 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-09-24 12:51 [PATCH VER 5] Extend project quotas to support 32bit project identifiers Arkadiusz Miśkiewicz
2010-09-24 12:52 ` [PATCH VER 5] xfsprogs: projid32bit handling Arkadiusz Miśkiewicz
2010-09-24 12:52   ` [PATCH VER 5] xfstests: Quota project id setting overflow Arkadiusz Miśkiewicz
2010-09-26  0:10     ` Christoph Hellwig
2010-09-24 20:17   ` [PATCH VER 5] xfsprogs: projid32bit handling (xfs_admin patch) Arkadiusz Miskiewicz
2010-09-26  0:06   ` [PATCH VER 5] xfsprogs: projid32bit handling Christoph Hellwig
2010-09-26  0:05 ` [PATCH VER 5] Extend project quotas to support 32bit project identifiers Christoph Hellwig

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox