packages (LINUX_2_6_34): kernel/kernel-vserver-2.3.patch, kernel/kernel.spe...
arekm
arekm at pld-linux.org
Fri Aug 27 10:07:50 CEST 2010
Author: arekm Date: Fri Aug 27 08:07:50 2010 GMT
Module: packages Tag: LINUX_2_6_34
---- Log message:
- add xfs 32bit projectid support (breaks existing filesystems with vserver tagging; new filesystems will work fine).
---- Files affected:
packages/kernel:
kernel-vserver-2.3.patch (1.40.2.1 -> 1.40.2.2) , kernel.spec (1.798.2.8 -> 1.798.2.9) , kernel-xfs-32bit-projid.patch (NONE -> 1.1.2.1) (NEW)
---- Diffs:
================================================================
Index: packages/kernel/kernel-vserver-2.3.patch
diff -u packages/kernel/kernel-vserver-2.3.patch:1.40.2.1 packages/kernel/kernel-vserver-2.3.patch:1.40.2.2
--- packages/kernel/kernel-vserver-2.3.patch:1.40.2.1 Tue Aug 3 19:48:53 2010
+++ packages/kernel/kernel-vserver-2.3.patch Fri Aug 27 10:07:43 2010
@@ -9537,13 +9537,13 @@
--- linux-2.6.34.1/fs/xfs/xfs_dinode.h 2009-06-11 17:13:09.000000000 +0200
+++ linux-2.6.34.1-vs2.3.0.36.30.4.pre8/fs/xfs/xfs_dinode.h 2010-05-18 18:11:22.000000000 +0200
@@ -50,7 +50,9 @@ typedef struct xfs_dinode {
- __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_tag; /* context tagging */
+ __be16 di_vflags; /* vserver specific flags */
-+ __u8 di_pad[4]; /* unused, zeroed space */
++ __u8 di_pad[2]; /* 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 */
@@ -9590,12 +9590,12 @@
/*
@@ -293,7 +296,8 @@ typedef struct xfs_bstat {
- __u32 bs_gen; /* generation count */
- __u16 bs_projid; /* project id */
+ __u16 bs_projid_lo; /* 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 */
+ __u16 bs_tag; /* context tagging */
-+ unsigned char bs_pad[10]; /* pad space, unused */
++ unsigned char bs_pad[8]; /* pad space, unused */
__u32 bs_dmevmask; /* DMIG event mask */
__u16 bs_dmstate; /* DMIG state info */
__u16 bs_aextents; /* attribute number of extents */
@@ -9758,7 +9758,7 @@
ip->i_d.di_uid = current_fsuid();
ip->i_d.di_gid = current_fsgid();
+ ip->i_d.di_tag = current_fstag(cr, &ip->i_vnode);
- 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));
@@ -1096,6 +1122,7 @@ xfs_ialloc(
@@ -9793,11 +9793,12 @@
@@ -135,7 +135,9 @@ typedef struct xfs_icdinode {
__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_tag; /* context tagging */
+ __uint16_t di_vflags; /* vserver specific flags */
-+ __uint8_t di_pad[4]; /* unused, zeroed space */
++ __uint8_t di_pad[2]; /* 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 */
================================================================
Index: packages/kernel/kernel.spec
diff -u packages/kernel/kernel.spec:1.798.2.8 packages/kernel/kernel.spec:1.798.2.9
--- packages/kernel/kernel.spec:1.798.2.8 Fri Aug 27 09:32:43 2010
+++ packages/kernel/kernel.spec Fri Aug 27 10:07:43 2010
@@ -194,6 +194,8 @@
Source58: kernel-inittmpfs.config
Source59: kernel-bzip2-lzma.config
+Patch1: kernel-xfs-32bit-projid.patch
+
# tahoe9xx http://www.tahoe.pl/drivers/tahoe9xx-2.6.24.patch
Patch2: kernel-tahoe9xx.patch
@@ -705,6 +707,9 @@
%patch70 -p1
%endif
+# xfs support for 32bit projid
+%patch1 -p1
+
# tahoe9xx: 2.6.29 - need update
#%patch2 -p1
@@ -1601,6 +1606,9 @@
All persons listed below can be reached at <cvs_login>@pld-linux.org
$Log$
+Revision 1.798.2.9 2010/08/27 08:07:43 arekm
+- add xfs 32bit projectid support (breaks existing filesystems with vserver tagging; new filesystems will work fine).
+
Revision 1.798.2.8 2010/08/27 07:32:43 arekm
- up to 2.6.34.6
================================================================
Index: packages/kernel/kernel-xfs-32bit-projid.patch
diff -u /dev/null packages/kernel/kernel-xfs-32bit-projid.patch:1.1.2.1
--- /dev/null Fri Aug 27 10:07:50 2010
+++ packages/kernel/kernel-xfs-32bit-projid.patch Fri Aug 27 10:07:43 2010
@@ -0,0 +1,501 @@
+From 52db84bb8cdd639b3cf794db5eaad3af37933244 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Arkadiusz=20Mi=C5=9Bkiewicz?= <arekm at maven.pl>
+Date: Wed, 25 Aug 2010 22:47:39 +0200
+Subject: [PATCH] Extend project quotas to support 32bit project identificators.
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+This patch adds support for 32bit project quota identificators.
+
+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.
+
+PROJID32BIT feature2 flag is set automaticly when trying to use 32bit
+quota project identificator.
+
+Signed-off-by: Arkadiusz Miśkiewicz <arekm at maven.pl>
+---
+ fs/xfs/linux-2.6/xfs_ioctl.c | 31 ++++++++++++++++++++++++-------
+ fs/xfs/linux-2.6/xfs_ioctl32.c | 6 ++++--
+ fs/xfs/linux-2.6/xfs_ioctl32.h | 5 +++--
+ 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 | 24 +++++++++++++++++++++---
+ fs/xfs/xfs_itable.c | 3 ++-
+ fs/xfs/xfs_rename.c | 2 +-
+ fs/xfs/xfs_sb.h | 16 +++++++++++++++-
+ fs/xfs/xfs_types.h | 2 --
+ fs/xfs/xfs_vnodeops.c | 14 +++++++-------
+ 15 files changed, 99 insertions(+), 44 deletions(-)
+
+diff --git a/fs/xfs/linux-2.6/xfs_ioctl.c b/fs/xfs/linux-2.6/xfs_ioctl.c
+index 237f5ff..75e014c 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) {
+@@ -946,13 +946,30 @@ xfs_ioctl_setattr(
+ goto error_return;
+ }
+
+- /*
+- * Do a quota reservation only if projid is actually going to change.
+- */
+ if (mask & FSX_PROJID) {
++ /*
++ * Switch on the PROJID32BIT superblock bit when needed
++ * (implies also FEATURES2)
++ */
++ if (!xfs_sb_version_hasprojid32bit(&ip->i_mount->m_sb) &&
++ fa->fsx_projid > (__uint16_t)-1) {
++ spin_lock(&ip->i_mount->m_sb_lock);
++ if (!xfs_sb_version_hasprojid32bit(&ip->i_mount->m_sb)) {
++ xfs_sb_version_addprojid32bit(&ip->i_mount->m_sb);
++ spin_unlock(&ip->i_mount->m_sb_lock);
++ xfs_mod_sb(tp,
++ XFS_SB_VERSIONNUM | XFS_SB_FEATURES2);
++ } else
++ spin_unlock(&ip->i_mount->m_sb_lock);
++ }
++
++ /*
++ * Do a quota reservation only if projid is actually
++ * going to change.
++ */
+ 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) ?
+@@ -1054,12 +1071,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..2146196 100644
+--- a/fs/xfs/linux-2.6/xfs_ioctl32.c
++++ b/fs/xfs/linux-2.6/xfs_ioctl32.c
+@@ -164,7 +164,8 @@ xfs_ioctl32_bstat_copyin(
+ get_user(bstat->bs_extsize, &bstat32->bs_extsize) ||
+ 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_lo, &bstat32->bs_projid_lo) ||
++ 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))
+@@ -217,7 +218,8 @@ xfs_bulkstat_one_fmt_compat(
+ put_user(buffer->bs_extsize, &p32->bs_extsize) ||
+ 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_lo, &p32->bs_projid_lo) ||
++ 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..7a22385 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_lo; /* 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/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 7cf7220..6b7debc 100644
+--- a/fs/xfs/xfs_fs.h
++++ b/fs/xfs/xfs_fs.h
+@@ -291,9 +291,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_lo; /* 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 68415cb..2ff0d49 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));
+
+ /*
+@@ -3005,7 +3007,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..5bbb100 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,23 @@ xfs_iflags_test_and_clear(xfs_inode_t *ip, unsigned short flags)
+ }
+
+ /*
++ * Project quota id helpers
++ */
++static inline prid_t
++xfs_get_projid(xfs_inode_t *ip)
++{
++ return (prid_t)(ip->i_d.di_projid_hi) << 16 | ip->i_d.di_projid_lo;
++}
++
++static inline void
++xfs_set_projid(xfs_inode_t *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 +474,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..dc1882a 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_lo = 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..5066711 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,18 @@ 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;
++}
++
+ /*
+ * 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 */
+-
+ /*
+ * These types are 64 bits on disk but are either 32 or 64 bits in memory.
+ * Disk based types:
+diff --git a/fs/xfs/xfs_vnodeops.c b/fs/xfs/xfs_vnodeops.c
+index 66d585c..53de9fc 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,7 +1279,7 @@ 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;
+
+@@ -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);
<<Diff was trimmed, longer than 597 lines>>
---- CVS-web:
http://cvs.pld-linux.org/cgi-bin/cvsweb.cgi/packages/kernel/kernel-vserver-2.3.patch?r1=1.40.2.1&r2=1.40.2.2&f=u
http://cvs.pld-linux.org/cgi-bin/cvsweb.cgi/packages/kernel/kernel.spec?r1=1.798.2.8&r2=1.798.2.9&f=u
More information about the pld-cvs-commit
mailing list