From: Li Xi <pkuelel...@gmail.com>

This patch adds support for a new quota type PRJQUOTA for project quota
enforcement. Also a new method get_projid() is added into dquot_operations
structure.

Signed-off-by: Li Xi <l...@ddn.com>
Signed-off-by: Dmitry Monakhov <dmonak...@openvz.org>
Reviewed-by: Jan Kara <j...@suse.cz>
Signed-off-by: Jan Kara <j...@suse.cz>
Signed-off-by: Stanislav Kinsburskiy <skinsbur...@virtuozzo.com>
---
 fs/quota/dquot.c           |   20 +++++++++++++++++---
 fs/quota/quotaio_v2.h      |    6 ++++--
 include/linux/quota.h      |    2 ++
 include/uapi/linux/quota.h |    6 ++++--
 4 files changed, 27 insertions(+), 7 deletions(-)

diff --git a/fs/quota/dquot.c b/fs/quota/dquot.c
index 0928842..65fc3c6 100644
--- a/fs/quota/dquot.c
+++ b/fs/quota/dquot.c
@@ -1145,8 +1145,8 @@ static int need_print_warning(struct dquot_warn *warn)
                        return uid_eq(current_fsuid(), warn->w_dq_id.uid);
                case GRPQUOTA:
                        return in_group_p(warn->w_dq_id.gid);
-               case PRJQUOTA:  /* Never taken... Just make gcc happy */
-                       return 0;
+               case PRJQUOTA:
+                       return 1;
        }
        return 0;
 }
@@ -1385,6 +1385,9 @@ static void __dquot_initialize(struct inode *inode, int 
type)
        /* First get references to structures we might need. */
        for (cnt = 0; cnt < MAXQUOTAS; cnt++) {
                struct kqid qid;
+               kprojid_t projid;
+               int rc;
+
                got[cnt] = NULL;
                if (type != -1 && cnt != type)
                        continue;
@@ -1395,6 +1398,10 @@ static void __dquot_initialize(struct inode *inode, int 
type)
                 */
                if (inode->i_dquot[cnt])
                        continue;
+
+               if (!sb_has_quota_active(sb, cnt))
+                       continue;
+
                init_needed = 1;
 
                switch (cnt) {
@@ -1404,6 +1411,12 @@ static void __dquot_initialize(struct inode *inode, int 
type)
                case GRPQUOTA:
                        qid = make_kqid_gid(inode->i_gid);
                        break;
+               case PRJQUOTA:
+                       rc = inode->i_sb->dq_op->get_projid(inode, &projid);
+                       if (rc)
+                               continue;
+                       qid = make_kqid_projid(projid);
+                       break;
                }
                got[cnt] = dqget(sb, qid);
        }
@@ -2151,7 +2164,8 @@ static int vfs_load_quota_inode(struct inode *inode, int 
type, int format_id,
                error = -EROFS;
                goto out_fmt;
        }
-       if (!sb->s_op->quota_write || !sb->s_op->quota_read) {
+       if (!sb->s_op->quota_write || !sb->s_op->quota_read ||
+           (type == PRJQUOTA && sb->dq_op->get_projid == NULL)) {
                error = -EINVAL;
                goto out_fmt;
        }
diff --git a/fs/quota/quotaio_v2.h b/fs/quota/quotaio_v2.h
index f1966b4..4e95430 100644
--- a/fs/quota/quotaio_v2.h
+++ b/fs/quota/quotaio_v2.h
@@ -13,12 +13,14 @@
  */
 #define V2_INITQMAGICS {\
        0xd9c01f11,     /* USRQUOTA */\
-       0xd9c01927      /* GRPQUOTA */\
+       0xd9c01927,     /* GRPQUOTA */\
+       0xd9c03f14,     /* PRJQUOTA */\
 }
 
 #define V2_INITQVERSIONS {\
        1,              /* USRQUOTA */\
-       1               /* GRPQUOTA */\
+       1,              /* GRPQUOTA */\
+       1,              /* PRJQUOTA */\
 }
 
 /* First generic header */
diff --git a/include/linux/quota.h b/include/linux/quota.h
index 99932a5..0d20c39 100644
--- a/include/linux/quota.h
+++ b/include/linux/quota.h
@@ -52,6 +52,7 @@
 
 #undef USRQUOTA
 #undef GRPQUOTA
+#undef PRJQUOTA
 enum quota_type {
        USRQUOTA = 0,           /* element used for user quotas */
        GRPQUOTA = 1,           /* element used for group quotas */
@@ -314,6 +315,7 @@ struct dquot_operations {
        /* get reserved quota for delayed alloc, value returned is managed by
         * quota code only */
        qsize_t *(*get_reserved_space) (struct inode *);
+       int (*get_projid) (struct inode *, kprojid_t *);/* Get project ID */
 };
 
 struct path;
diff --git a/include/uapi/linux/quota.h b/include/uapi/linux/quota.h
index 3b6cfbe..b2d9486 100644
--- a/include/uapi/linux/quota.h
+++ b/include/uapi/linux/quota.h
@@ -36,11 +36,12 @@
 #include <linux/errno.h>
 #include <linux/types.h>
 
-#define __DQUOT_VERSION__      "dquot_6.5.2"
+#define __DQUOT_VERSION__      "dquot_6.6.0"
 
-#define MAXQUOTAS 2
+#define MAXQUOTAS 3
 #define USRQUOTA  0            /* element used for user quotas */
 #define GRPQUOTA  1            /* element used for group quotas */
+#define PRJQUOTA  2            /* element used for project quotas */
 
 /*
  * Definitions for the default names of the quotas files.
@@ -48,6 +49,7 @@
 #define INITQFNAMES { \
        "user",    /* USRQUOTA */ \
        "group",   /* GRPQUOTA */ \
+       "project", /* PRJQUOTA */ \
        "undefined", \
 };
 

_______________________________________________
Devel mailing list
Devel@openvz.org
https://lists.openvz.org/mailman/listinfo/devel

Reply via email to