Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 847aac64 authored by Li Xi's avatar Li Xi Committed by Jan Kara
Browse files

vfs: Add general support to enforce project quota limits



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: default avatarLi Xi <lixi@ddn.com>
Signed-off-by: default avatarDmitry Monakhov <dmonakhov@openvz.org>
Reviewed-by: default avatarJan Kara <jack@suse.cz>
Signed-off-by: default avatarJan Kara <jack@suse.cz>
parent 5ce1aca8
Loading
Loading
Loading
Loading
+17 −3
Original line number Diff line number Diff line
@@ -1163,8 +1163,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;
}
@@ -1405,6 +1405,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;
@@ -1415,6 +1418,10 @@ static void __dquot_initialize(struct inode *inode, int type)
		 */
		if (dquots[cnt])
			continue;

		if (!sb_has_quota_active(sb, cnt))
			continue;

		init_needed = 1;

		switch (cnt) {
@@ -1424,6 +1431,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);
	}
@@ -2176,7 +2189,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;
	}
+4 −2
Original line number Diff line number Diff line
@@ -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 */
+2 −0
Original line number Diff line number Diff line
@@ -50,6 +50,7 @@

#undef USRQUOTA
#undef GRPQUOTA
#undef PRJQUOTA
enum quota_type {
	USRQUOTA = 0,		/* element used for user quotas */
	GRPQUOTA = 1,		/* element used for group quotas */
@@ -319,6 +320,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;
+4 −2
Original line number Diff line number Diff line
@@ -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", \
};