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?= <[email protected]>
+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 <[email protected]>
+---
+ 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

_______________________________________________
pld-cvs-commit mailing list
[email protected]
http://lists.pld-linux.org/mailman/listinfo/pld-cvs-commit

Reply via email to