All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jan Kara <jack@suse.cz>
To: linux-fsdevel@vger.kernel.org
Cc: xfs@oss.sgi.com, cluster-devel@redhat.com,
	ocfs2-devel@oss.oracle.com, Jan Kara <jack@suse.cz>
Subject: [PATCH 11/17] quota: Wire up Q_GETXSTATE and Q_GETXSTATV calls to work with ->get_state
Date: Fri, 16 Jan 2015 13:47:45 +0100	[thread overview]
Message-ID: <1421412471-4747-12-git-send-email-jack@suse.cz> (raw)
In-Reply-To: <1421412471-4747-1-git-send-email-jack@suse.cz>

Add appropriate conversion functions so that filesystems supporting
->get_state() method can be queried using Q_GETXSTATE and Q_GETXSTATV
calls.

Signed-off-by: Jan Kara <jack@suse.cz>
---
 fs/quota/quota.c | 138 +++++++++++++++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 134 insertions(+), 4 deletions(-)

diff --git a/fs/quota/quota.c b/fs/quota/quota.c
index f4ec476cc4c4..7d04b95dfbbf 100644
--- a/fs/quota/quota.c
+++ b/fs/quota/quota.c
@@ -269,25 +269,152 @@ static int quota_disable(struct super_block *sb, void __user *addr)
 	return sb->s_qcop->quota_disable(sb, flags);
 }
 
+static int quota_state_to_flags(struct qc_state *state)
+{
+	int flags = 0;
+
+	if (state->s_state[USRQUOTA].flags & QCI_ACCT_ENABLED)
+		flags |= FS_QUOTA_UDQ_ACCT;
+	if (state->s_state[USRQUOTA].flags & QCI_LIMITS_ENFORCED)
+		flags |= FS_QUOTA_UDQ_ENFD;
+	if (state->s_state[GRPQUOTA].flags & QCI_ACCT_ENABLED)
+		flags |= FS_QUOTA_GDQ_ACCT;
+	if (state->s_state[GRPQUOTA].flags & QCI_LIMITS_ENFORCED)
+		flags |= FS_QUOTA_GDQ_ENFD;
+	if (state->s_state[PRJQUOTA].flags & QCI_ACCT_ENABLED)
+		flags |= FS_QUOTA_PDQ_ACCT;
+	if (state->s_state[PRJQUOTA].flags & QCI_LIMITS_ENFORCED)
+		flags |= FS_QUOTA_PDQ_ENFD;
+	return flags;
+}
+
+static int quota_getstate(struct super_block *sb, struct fs_quota_stat *fqs)
+{
+	int type;
+	struct qc_state state;
+	int ret;
+
+	ret = sb->s_qcop->get_state(sb, &state);
+	if (ret < 0)
+		return ret;
+
+	memset(fqs, 0, sizeof(*fqs));
+	fqs->qs_version = FS_QSTAT_VERSION;
+	fqs->qs_flags = quota_state_to_flags(&state);
+	/* No quota enabled? */
+	if (!fqs->qs_flags)
+		return -ENOSYS;
+	fqs->qs_incoredqs = state.s_incoredqs;
+	/*
+	 * GETXSTATE quotactl has space for just one set of time limits so
+	 * report them for the first enabled quota type
+	 */
+	for (type = 0; type < XQM_MAXQUOTAS; type++)
+		if (state.s_state[type].flags & QCI_ACCT_ENABLED)
+			break;
+	BUG_ON(type == XQM_MAXQUOTAS);
+	fqs->qs_btimelimit = state.s_state[type].spc_timelimit;
+	fqs->qs_itimelimit = state.s_state[type].ino_timelimit;
+	fqs->qs_rtbtimelimit = state.s_state[type].rt_spc_timelimit;
+	fqs->qs_bwarnlimit = state.s_state[type].spc_warnlimit;
+	fqs->qs_iwarnlimit = state.s_state[type].ino_warnlimit;
+	if (state.s_state[USRQUOTA].flags & QCI_ACCT_ENABLED) {
+		fqs->qs_uquota.qfs_ino = state.s_state[USRQUOTA].ino;
+		fqs->qs_uquota.qfs_nblks = state.s_state[USRQUOTA].blocks;
+		fqs->qs_uquota.qfs_nextents = state.s_state[USRQUOTA].nextents;
+	}
+	if (state.s_state[GRPQUOTA].flags & QCI_ACCT_ENABLED) {
+		fqs->qs_gquota.qfs_ino = state.s_state[GRPQUOTA].ino;
+		fqs->qs_gquota.qfs_nblks = state.s_state[GRPQUOTA].blocks;
+		fqs->qs_gquota.qfs_nextents = state.s_state[GRPQUOTA].nextents;
+	}
+	if (state.s_state[PRJQUOTA].flags & QCI_ACCT_ENABLED) {
+		/*
+		 * Q_XGETQSTAT doesn't have room for both group and project
+		 * quotas.  So, allow the project quota values to be copied out
+		 * only if there is no group quota information available.
+		 */
+		if (!(state.s_state[GRPQUOTA].flags & QCI_ACCT_ENABLED)) {
+			fqs->qs_gquota.qfs_ino = state.s_state[PRJQUOTA].ino;
+			fqs->qs_gquota.qfs_nblks =
+					state.s_state[PRJQUOTA].blocks;
+			fqs->qs_gquota.qfs_nextents =
+					state.s_state[PRJQUOTA].nextents;
+		}
+	}
+	return 0;
+}
+
 static int quota_getxstate(struct super_block *sb, void __user *addr)
 {
 	struct fs_quota_stat fqs;
 	int ret;
 
-	if (!sb->s_qcop->get_xstate)
+	if (!sb->s_qcop->get_xstate && !sb->s_qcop->get_state)
 		return -ENOSYS;
-	ret = sb->s_qcop->get_xstate(sb, &fqs);
+	if (sb->s_qcop->get_state)
+		ret = quota_getstate(sb, &fqs);
+	else
+		ret = sb->s_qcop->get_xstate(sb, &fqs);
 	if (!ret && copy_to_user(addr, &fqs, sizeof(fqs)))
 		return -EFAULT;
 	return ret;
 }
 
+static int quota_getstatev(struct super_block *sb, struct fs_quota_statv *fqs)
+{
+	int type;
+	struct qc_state state;
+	int ret;
+
+	ret = sb->s_qcop->get_state(sb, &state);
+	if (ret < 0)
+		return ret;
+
+	memset(fqs, 0, sizeof(*fqs));
+	fqs->qs_version = FS_QSTAT_VERSION;
+	fqs->qs_flags = quota_state_to_flags(&state);
+	/* No quota enabled? */
+	if (!fqs->qs_flags)
+		return -ENOSYS;
+	fqs->qs_incoredqs = state.s_incoredqs;
+	/*
+	 * GETXSTATV quotactl has space for just one set of time limits so
+	 * report them for the first enabled quota type
+	 */
+	for (type = 0; type < XQM_MAXQUOTAS; type++)
+		if (state.s_state[type].flags & QCI_ACCT_ENABLED)
+			break;
+	BUG_ON(type == XQM_MAXQUOTAS);
+	fqs->qs_btimelimit = state.s_state[type].spc_timelimit;
+	fqs->qs_itimelimit = state.s_state[type].ino_timelimit;
+	fqs->qs_rtbtimelimit = state.s_state[type].rt_spc_timelimit;
+	fqs->qs_bwarnlimit = state.s_state[type].spc_warnlimit;
+	fqs->qs_iwarnlimit = state.s_state[type].ino_warnlimit;
+	if (state.s_state[USRQUOTA].flags & QCI_ACCT_ENABLED) {
+		fqs->qs_uquota.qfs_ino = state.s_state[USRQUOTA].ino;
+		fqs->qs_uquota.qfs_nblks = state.s_state[USRQUOTA].blocks;
+		fqs->qs_uquota.qfs_nextents = state.s_state[USRQUOTA].nextents;
+	}
+	if (state.s_state[GRPQUOTA].flags & QCI_ACCT_ENABLED) {
+		fqs->qs_gquota.qfs_ino = state.s_state[GRPQUOTA].ino;
+		fqs->qs_gquota.qfs_nblks = state.s_state[GRPQUOTA].blocks;
+		fqs->qs_gquota.qfs_nextents = state.s_state[GRPQUOTA].nextents;
+	}
+	if (state.s_state[PRJQUOTA].flags & QCI_ACCT_ENABLED) {
+		fqs->qs_pquota.qfs_ino = state.s_state[PRJQUOTA].ino;
+		fqs->qs_pquota.qfs_nblks = state.s_state[PRJQUOTA].blocks;
+		fqs->qs_pquota.qfs_nextents = state.s_state[PRJQUOTA].nextents;
+	}
+	return 0;
+}
+
 static int quota_getxstatev(struct super_block *sb, void __user *addr)
 {
 	struct fs_quota_statv fqs;
 	int ret;
 
-	if (!sb->s_qcop->get_xstatev)
+	if (!sb->s_qcop->get_xstatev && !sb->s_qcop->get_state)
 		return -ENOSYS;
 
 	memset(&fqs, 0, sizeof(fqs));
@@ -301,7 +428,10 @@ static int quota_getxstatev(struct super_block *sb, void __user *addr)
 	default:
 		return -EINVAL;
 	}
-	ret = sb->s_qcop->get_xstatev(sb, &fqs);
+	if (sb->s_qcop->get_state)
+		ret = quota_getstatev(sb, &fqs);
+	else
+		ret = sb->s_qcop->get_xstatev(sb, &fqs);
 	if (!ret && copy_to_user(addr, &fqs, sizeof(fqs)))
 		return -EFAULT;
 	return ret;
-- 
2.1.2


WARNING: multiple messages have this Message-ID (diff)
From: Jan Kara <jack@suse.cz>
To: linux-fsdevel@vger.kernel.org
Cc: cluster-devel@redhat.com, Jan Kara <jack@suse.cz>,
	ocfs2-devel@oss.oracle.com, xfs@oss.sgi.com
Subject: [PATCH 11/17] quota: Wire up Q_GETXSTATE and Q_GETXSTATV calls to work with ->get_state
Date: Fri, 16 Jan 2015 13:47:45 +0100	[thread overview]
Message-ID: <1421412471-4747-12-git-send-email-jack@suse.cz> (raw)
In-Reply-To: <1421412471-4747-1-git-send-email-jack@suse.cz>

Add appropriate conversion functions so that filesystems supporting
->get_state() method can be queried using Q_GETXSTATE and Q_GETXSTATV
calls.

Signed-off-by: Jan Kara <jack@suse.cz>
---
 fs/quota/quota.c | 138 +++++++++++++++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 134 insertions(+), 4 deletions(-)

diff --git a/fs/quota/quota.c b/fs/quota/quota.c
index f4ec476cc4c4..7d04b95dfbbf 100644
--- a/fs/quota/quota.c
+++ b/fs/quota/quota.c
@@ -269,25 +269,152 @@ static int quota_disable(struct super_block *sb, void __user *addr)
 	return sb->s_qcop->quota_disable(sb, flags);
 }
 
+static int quota_state_to_flags(struct qc_state *state)
+{
+	int flags = 0;
+
+	if (state->s_state[USRQUOTA].flags & QCI_ACCT_ENABLED)
+		flags |= FS_QUOTA_UDQ_ACCT;
+	if (state->s_state[USRQUOTA].flags & QCI_LIMITS_ENFORCED)
+		flags |= FS_QUOTA_UDQ_ENFD;
+	if (state->s_state[GRPQUOTA].flags & QCI_ACCT_ENABLED)
+		flags |= FS_QUOTA_GDQ_ACCT;
+	if (state->s_state[GRPQUOTA].flags & QCI_LIMITS_ENFORCED)
+		flags |= FS_QUOTA_GDQ_ENFD;
+	if (state->s_state[PRJQUOTA].flags & QCI_ACCT_ENABLED)
+		flags |= FS_QUOTA_PDQ_ACCT;
+	if (state->s_state[PRJQUOTA].flags & QCI_LIMITS_ENFORCED)
+		flags |= FS_QUOTA_PDQ_ENFD;
+	return flags;
+}
+
+static int quota_getstate(struct super_block *sb, struct fs_quota_stat *fqs)
+{
+	int type;
+	struct qc_state state;
+	int ret;
+
+	ret = sb->s_qcop->get_state(sb, &state);
+	if (ret < 0)
+		return ret;
+
+	memset(fqs, 0, sizeof(*fqs));
+	fqs->qs_version = FS_QSTAT_VERSION;
+	fqs->qs_flags = quota_state_to_flags(&state);
+	/* No quota enabled? */
+	if (!fqs->qs_flags)
+		return -ENOSYS;
+	fqs->qs_incoredqs = state.s_incoredqs;
+	/*
+	 * GETXSTATE quotactl has space for just one set of time limits so
+	 * report them for the first enabled quota type
+	 */
+	for (type = 0; type < XQM_MAXQUOTAS; type++)
+		if (state.s_state[type].flags & QCI_ACCT_ENABLED)
+			break;
+	BUG_ON(type == XQM_MAXQUOTAS);
+	fqs->qs_btimelimit = state.s_state[type].spc_timelimit;
+	fqs->qs_itimelimit = state.s_state[type].ino_timelimit;
+	fqs->qs_rtbtimelimit = state.s_state[type].rt_spc_timelimit;
+	fqs->qs_bwarnlimit = state.s_state[type].spc_warnlimit;
+	fqs->qs_iwarnlimit = state.s_state[type].ino_warnlimit;
+	if (state.s_state[USRQUOTA].flags & QCI_ACCT_ENABLED) {
+		fqs->qs_uquota.qfs_ino = state.s_state[USRQUOTA].ino;
+		fqs->qs_uquota.qfs_nblks = state.s_state[USRQUOTA].blocks;
+		fqs->qs_uquota.qfs_nextents = state.s_state[USRQUOTA].nextents;
+	}
+	if (state.s_state[GRPQUOTA].flags & QCI_ACCT_ENABLED) {
+		fqs->qs_gquota.qfs_ino = state.s_state[GRPQUOTA].ino;
+		fqs->qs_gquota.qfs_nblks = state.s_state[GRPQUOTA].blocks;
+		fqs->qs_gquota.qfs_nextents = state.s_state[GRPQUOTA].nextents;
+	}
+	if (state.s_state[PRJQUOTA].flags & QCI_ACCT_ENABLED) {
+		/*
+		 * Q_XGETQSTAT doesn't have room for both group and project
+		 * quotas.  So, allow the project quota values to be copied out
+		 * only if there is no group quota information available.
+		 */
+		if (!(state.s_state[GRPQUOTA].flags & QCI_ACCT_ENABLED)) {
+			fqs->qs_gquota.qfs_ino = state.s_state[PRJQUOTA].ino;
+			fqs->qs_gquota.qfs_nblks =
+					state.s_state[PRJQUOTA].blocks;
+			fqs->qs_gquota.qfs_nextents =
+					state.s_state[PRJQUOTA].nextents;
+		}
+	}
+	return 0;
+}
+
 static int quota_getxstate(struct super_block *sb, void __user *addr)
 {
 	struct fs_quota_stat fqs;
 	int ret;
 
-	if (!sb->s_qcop->get_xstate)
+	if (!sb->s_qcop->get_xstate && !sb->s_qcop->get_state)
 		return -ENOSYS;
-	ret = sb->s_qcop->get_xstate(sb, &fqs);
+	if (sb->s_qcop->get_state)
+		ret = quota_getstate(sb, &fqs);
+	else
+		ret = sb->s_qcop->get_xstate(sb, &fqs);
 	if (!ret && copy_to_user(addr, &fqs, sizeof(fqs)))
 		return -EFAULT;
 	return ret;
 }
 
+static int quota_getstatev(struct super_block *sb, struct fs_quota_statv *fqs)
+{
+	int type;
+	struct qc_state state;
+	int ret;
+
+	ret = sb->s_qcop->get_state(sb, &state);
+	if (ret < 0)
+		return ret;
+
+	memset(fqs, 0, sizeof(*fqs));
+	fqs->qs_version = FS_QSTAT_VERSION;
+	fqs->qs_flags = quota_state_to_flags(&state);
+	/* No quota enabled? */
+	if (!fqs->qs_flags)
+		return -ENOSYS;
+	fqs->qs_incoredqs = state.s_incoredqs;
+	/*
+	 * GETXSTATV quotactl has space for just one set of time limits so
+	 * report them for the first enabled quota type
+	 */
+	for (type = 0; type < XQM_MAXQUOTAS; type++)
+		if (state.s_state[type].flags & QCI_ACCT_ENABLED)
+			break;
+	BUG_ON(type == XQM_MAXQUOTAS);
+	fqs->qs_btimelimit = state.s_state[type].spc_timelimit;
+	fqs->qs_itimelimit = state.s_state[type].ino_timelimit;
+	fqs->qs_rtbtimelimit = state.s_state[type].rt_spc_timelimit;
+	fqs->qs_bwarnlimit = state.s_state[type].spc_warnlimit;
+	fqs->qs_iwarnlimit = state.s_state[type].ino_warnlimit;
+	if (state.s_state[USRQUOTA].flags & QCI_ACCT_ENABLED) {
+		fqs->qs_uquota.qfs_ino = state.s_state[USRQUOTA].ino;
+		fqs->qs_uquota.qfs_nblks = state.s_state[USRQUOTA].blocks;
+		fqs->qs_uquota.qfs_nextents = state.s_state[USRQUOTA].nextents;
+	}
+	if (state.s_state[GRPQUOTA].flags & QCI_ACCT_ENABLED) {
+		fqs->qs_gquota.qfs_ino = state.s_state[GRPQUOTA].ino;
+		fqs->qs_gquota.qfs_nblks = state.s_state[GRPQUOTA].blocks;
+		fqs->qs_gquota.qfs_nextents = state.s_state[GRPQUOTA].nextents;
+	}
+	if (state.s_state[PRJQUOTA].flags & QCI_ACCT_ENABLED) {
+		fqs->qs_pquota.qfs_ino = state.s_state[PRJQUOTA].ino;
+		fqs->qs_pquota.qfs_nblks = state.s_state[PRJQUOTA].blocks;
+		fqs->qs_pquota.qfs_nextents = state.s_state[PRJQUOTA].nextents;
+	}
+	return 0;
+}
+
 static int quota_getxstatev(struct super_block *sb, void __user *addr)
 {
 	struct fs_quota_statv fqs;
 	int ret;
 
-	if (!sb->s_qcop->get_xstatev)
+	if (!sb->s_qcop->get_xstatev && !sb->s_qcop->get_state)
 		return -ENOSYS;
 
 	memset(&fqs, 0, sizeof(fqs));
@@ -301,7 +428,10 @@ static int quota_getxstatev(struct super_block *sb, void __user *addr)
 	default:
 		return -EINVAL;
 	}
-	ret = sb->s_qcop->get_xstatev(sb, &fqs);
+	if (sb->s_qcop->get_state)
+		ret = quota_getstatev(sb, &fqs);
+	else
+		ret = sb->s_qcop->get_xstatev(sb, &fqs);
 	if (!ret && copy_to_user(addr, &fqs, sizeof(fqs)))
 		return -EFAULT;
 	return ret;
-- 
2.1.2

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

WARNING: multiple messages have this Message-ID (diff)
From: Jan Kara <jack@suse.cz>
To: linux-fsdevel@vger.kernel.org
Cc: xfs@oss.sgi.com, cluster-devel@redhat.com,
	ocfs2-devel@oss.oracle.com, Jan Kara <jack@suse.cz>
Subject: [Ocfs2-devel] [PATCH 11/17] quota: Wire up Q_GETXSTATE and Q_GETXSTATV calls to work with ->get_state
Date: Fri, 16 Jan 2015 13:47:45 +0100	[thread overview]
Message-ID: <1421412471-4747-12-git-send-email-jack@suse.cz> (raw)
In-Reply-To: <1421412471-4747-1-git-send-email-jack@suse.cz>

Add appropriate conversion functions so that filesystems supporting
->get_state() method can be queried using Q_GETXSTATE and Q_GETXSTATV
calls.

Signed-off-by: Jan Kara <jack@suse.cz>
---
 fs/quota/quota.c | 138 +++++++++++++++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 134 insertions(+), 4 deletions(-)

diff --git a/fs/quota/quota.c b/fs/quota/quota.c
index f4ec476cc4c4..7d04b95dfbbf 100644
--- a/fs/quota/quota.c
+++ b/fs/quota/quota.c
@@ -269,25 +269,152 @@ static int quota_disable(struct super_block *sb, void __user *addr)
 	return sb->s_qcop->quota_disable(sb, flags);
 }
 
+static int quota_state_to_flags(struct qc_state *state)
+{
+	int flags = 0;
+
+	if (state->s_state[USRQUOTA].flags & QCI_ACCT_ENABLED)
+		flags |= FS_QUOTA_UDQ_ACCT;
+	if (state->s_state[USRQUOTA].flags & QCI_LIMITS_ENFORCED)
+		flags |= FS_QUOTA_UDQ_ENFD;
+	if (state->s_state[GRPQUOTA].flags & QCI_ACCT_ENABLED)
+		flags |= FS_QUOTA_GDQ_ACCT;
+	if (state->s_state[GRPQUOTA].flags & QCI_LIMITS_ENFORCED)
+		flags |= FS_QUOTA_GDQ_ENFD;
+	if (state->s_state[PRJQUOTA].flags & QCI_ACCT_ENABLED)
+		flags |= FS_QUOTA_PDQ_ACCT;
+	if (state->s_state[PRJQUOTA].flags & QCI_LIMITS_ENFORCED)
+		flags |= FS_QUOTA_PDQ_ENFD;
+	return flags;
+}
+
+static int quota_getstate(struct super_block *sb, struct fs_quota_stat *fqs)
+{
+	int type;
+	struct qc_state state;
+	int ret;
+
+	ret = sb->s_qcop->get_state(sb, &state);
+	if (ret < 0)
+		return ret;
+
+	memset(fqs, 0, sizeof(*fqs));
+	fqs->qs_version = FS_QSTAT_VERSION;
+	fqs->qs_flags = quota_state_to_flags(&state);
+	/* No quota enabled? */
+	if (!fqs->qs_flags)
+		return -ENOSYS;
+	fqs->qs_incoredqs = state.s_incoredqs;
+	/*
+	 * GETXSTATE quotactl has space for just one set of time limits so
+	 * report them for the first enabled quota type
+	 */
+	for (type = 0; type < XQM_MAXQUOTAS; type++)
+		if (state.s_state[type].flags & QCI_ACCT_ENABLED)
+			break;
+	BUG_ON(type == XQM_MAXQUOTAS);
+	fqs->qs_btimelimit = state.s_state[type].spc_timelimit;
+	fqs->qs_itimelimit = state.s_state[type].ino_timelimit;
+	fqs->qs_rtbtimelimit = state.s_state[type].rt_spc_timelimit;
+	fqs->qs_bwarnlimit = state.s_state[type].spc_warnlimit;
+	fqs->qs_iwarnlimit = state.s_state[type].ino_warnlimit;
+	if (state.s_state[USRQUOTA].flags & QCI_ACCT_ENABLED) {
+		fqs->qs_uquota.qfs_ino = state.s_state[USRQUOTA].ino;
+		fqs->qs_uquota.qfs_nblks = state.s_state[USRQUOTA].blocks;
+		fqs->qs_uquota.qfs_nextents = state.s_state[USRQUOTA].nextents;
+	}
+	if (state.s_state[GRPQUOTA].flags & QCI_ACCT_ENABLED) {
+		fqs->qs_gquota.qfs_ino = state.s_state[GRPQUOTA].ino;
+		fqs->qs_gquota.qfs_nblks = state.s_state[GRPQUOTA].blocks;
+		fqs->qs_gquota.qfs_nextents = state.s_state[GRPQUOTA].nextents;
+	}
+	if (state.s_state[PRJQUOTA].flags & QCI_ACCT_ENABLED) {
+		/*
+		 * Q_XGETQSTAT doesn't have room for both group and project
+		 * quotas.  So, allow the project quota values to be copied out
+		 * only if there is no group quota information available.
+		 */
+		if (!(state.s_state[GRPQUOTA].flags & QCI_ACCT_ENABLED)) {
+			fqs->qs_gquota.qfs_ino = state.s_state[PRJQUOTA].ino;
+			fqs->qs_gquota.qfs_nblks =
+					state.s_state[PRJQUOTA].blocks;
+			fqs->qs_gquota.qfs_nextents =
+					state.s_state[PRJQUOTA].nextents;
+		}
+	}
+	return 0;
+}
+
 static int quota_getxstate(struct super_block *sb, void __user *addr)
 {
 	struct fs_quota_stat fqs;
 	int ret;
 
-	if (!sb->s_qcop->get_xstate)
+	if (!sb->s_qcop->get_xstate && !sb->s_qcop->get_state)
 		return -ENOSYS;
-	ret = sb->s_qcop->get_xstate(sb, &fqs);
+	if (sb->s_qcop->get_state)
+		ret = quota_getstate(sb, &fqs);
+	else
+		ret = sb->s_qcop->get_xstate(sb, &fqs);
 	if (!ret && copy_to_user(addr, &fqs, sizeof(fqs)))
 		return -EFAULT;
 	return ret;
 }
 
+static int quota_getstatev(struct super_block *sb, struct fs_quota_statv *fqs)
+{
+	int type;
+	struct qc_state state;
+	int ret;
+
+	ret = sb->s_qcop->get_state(sb, &state);
+	if (ret < 0)
+		return ret;
+
+	memset(fqs, 0, sizeof(*fqs));
+	fqs->qs_version = FS_QSTAT_VERSION;
+	fqs->qs_flags = quota_state_to_flags(&state);
+	/* No quota enabled? */
+	if (!fqs->qs_flags)
+		return -ENOSYS;
+	fqs->qs_incoredqs = state.s_incoredqs;
+	/*
+	 * GETXSTATV quotactl has space for just one set of time limits so
+	 * report them for the first enabled quota type
+	 */
+	for (type = 0; type < XQM_MAXQUOTAS; type++)
+		if (state.s_state[type].flags & QCI_ACCT_ENABLED)
+			break;
+	BUG_ON(type == XQM_MAXQUOTAS);
+	fqs->qs_btimelimit = state.s_state[type].spc_timelimit;
+	fqs->qs_itimelimit = state.s_state[type].ino_timelimit;
+	fqs->qs_rtbtimelimit = state.s_state[type].rt_spc_timelimit;
+	fqs->qs_bwarnlimit = state.s_state[type].spc_warnlimit;
+	fqs->qs_iwarnlimit = state.s_state[type].ino_warnlimit;
+	if (state.s_state[USRQUOTA].flags & QCI_ACCT_ENABLED) {
+		fqs->qs_uquota.qfs_ino = state.s_state[USRQUOTA].ino;
+		fqs->qs_uquota.qfs_nblks = state.s_state[USRQUOTA].blocks;
+		fqs->qs_uquota.qfs_nextents = state.s_state[USRQUOTA].nextents;
+	}
+	if (state.s_state[GRPQUOTA].flags & QCI_ACCT_ENABLED) {
+		fqs->qs_gquota.qfs_ino = state.s_state[GRPQUOTA].ino;
+		fqs->qs_gquota.qfs_nblks = state.s_state[GRPQUOTA].blocks;
+		fqs->qs_gquota.qfs_nextents = state.s_state[GRPQUOTA].nextents;
+	}
+	if (state.s_state[PRJQUOTA].flags & QCI_ACCT_ENABLED) {
+		fqs->qs_pquota.qfs_ino = state.s_state[PRJQUOTA].ino;
+		fqs->qs_pquota.qfs_nblks = state.s_state[PRJQUOTA].blocks;
+		fqs->qs_pquota.qfs_nextents = state.s_state[PRJQUOTA].nextents;
+	}
+	return 0;
+}
+
 static int quota_getxstatev(struct super_block *sb, void __user *addr)
 {
 	struct fs_quota_statv fqs;
 	int ret;
 
-	if (!sb->s_qcop->get_xstatev)
+	if (!sb->s_qcop->get_xstatev && !sb->s_qcop->get_state)
 		return -ENOSYS;
 
 	memset(&fqs, 0, sizeof(fqs));
@@ -301,7 +428,10 @@ static int quota_getxstatev(struct super_block *sb, void __user *addr)
 	default:
 		return -EINVAL;
 	}
-	ret = sb->s_qcop->get_xstatev(sb, &fqs);
+	if (sb->s_qcop->get_state)
+		ret = quota_getstatev(sb, &fqs);
+	else
+		ret = sb->s_qcop->get_xstatev(sb, &fqs);
 	if (!ret && copy_to_user(addr, &fqs, sizeof(fqs)))
 		return -EFAULT;
 	return ret;
-- 
2.1.2

WARNING: multiple messages have this Message-ID (diff)
From: Jan Kara <jack@suse.cz>
To: cluster-devel.redhat.com
Subject: [Cluster-devel] [PATCH 11/17] quota: Wire up Q_GETXSTATE and Q_GETXSTATV calls to work with ->get_state
Date: Fri, 16 Jan 2015 13:47:45 +0100	[thread overview]
Message-ID: <1421412471-4747-12-git-send-email-jack@suse.cz> (raw)
In-Reply-To: <1421412471-4747-1-git-send-email-jack@suse.cz>

Add appropriate conversion functions so that filesystems supporting
->get_state() method can be queried using Q_GETXSTATE and Q_GETXSTATV
calls.

Signed-off-by: Jan Kara <jack@suse.cz>
---
 fs/quota/quota.c | 138 +++++++++++++++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 134 insertions(+), 4 deletions(-)

diff --git a/fs/quota/quota.c b/fs/quota/quota.c
index f4ec476cc4c4..7d04b95dfbbf 100644
--- a/fs/quota/quota.c
+++ b/fs/quota/quota.c
@@ -269,25 +269,152 @@ static int quota_disable(struct super_block *sb, void __user *addr)
 	return sb->s_qcop->quota_disable(sb, flags);
 }
 
+static int quota_state_to_flags(struct qc_state *state)
+{
+	int flags = 0;
+
+	if (state->s_state[USRQUOTA].flags & QCI_ACCT_ENABLED)
+		flags |= FS_QUOTA_UDQ_ACCT;
+	if (state->s_state[USRQUOTA].flags & QCI_LIMITS_ENFORCED)
+		flags |= FS_QUOTA_UDQ_ENFD;
+	if (state->s_state[GRPQUOTA].flags & QCI_ACCT_ENABLED)
+		flags |= FS_QUOTA_GDQ_ACCT;
+	if (state->s_state[GRPQUOTA].flags & QCI_LIMITS_ENFORCED)
+		flags |= FS_QUOTA_GDQ_ENFD;
+	if (state->s_state[PRJQUOTA].flags & QCI_ACCT_ENABLED)
+		flags |= FS_QUOTA_PDQ_ACCT;
+	if (state->s_state[PRJQUOTA].flags & QCI_LIMITS_ENFORCED)
+		flags |= FS_QUOTA_PDQ_ENFD;
+	return flags;
+}
+
+static int quota_getstate(struct super_block *sb, struct fs_quota_stat *fqs)
+{
+	int type;
+	struct qc_state state;
+	int ret;
+
+	ret = sb->s_qcop->get_state(sb, &state);
+	if (ret < 0)
+		return ret;
+
+	memset(fqs, 0, sizeof(*fqs));
+	fqs->qs_version = FS_QSTAT_VERSION;
+	fqs->qs_flags = quota_state_to_flags(&state);
+	/* No quota enabled? */
+	if (!fqs->qs_flags)
+		return -ENOSYS;
+	fqs->qs_incoredqs = state.s_incoredqs;
+	/*
+	 * GETXSTATE quotactl has space for just one set of time limits so
+	 * report them for the first enabled quota type
+	 */
+	for (type = 0; type < XQM_MAXQUOTAS; type++)
+		if (state.s_state[type].flags & QCI_ACCT_ENABLED)
+			break;
+	BUG_ON(type == XQM_MAXQUOTAS);
+	fqs->qs_btimelimit = state.s_state[type].spc_timelimit;
+	fqs->qs_itimelimit = state.s_state[type].ino_timelimit;
+	fqs->qs_rtbtimelimit = state.s_state[type].rt_spc_timelimit;
+	fqs->qs_bwarnlimit = state.s_state[type].spc_warnlimit;
+	fqs->qs_iwarnlimit = state.s_state[type].ino_warnlimit;
+	if (state.s_state[USRQUOTA].flags & QCI_ACCT_ENABLED) {
+		fqs->qs_uquota.qfs_ino = state.s_state[USRQUOTA].ino;
+		fqs->qs_uquota.qfs_nblks = state.s_state[USRQUOTA].blocks;
+		fqs->qs_uquota.qfs_nextents = state.s_state[USRQUOTA].nextents;
+	}
+	if (state.s_state[GRPQUOTA].flags & QCI_ACCT_ENABLED) {
+		fqs->qs_gquota.qfs_ino = state.s_state[GRPQUOTA].ino;
+		fqs->qs_gquota.qfs_nblks = state.s_state[GRPQUOTA].blocks;
+		fqs->qs_gquota.qfs_nextents = state.s_state[GRPQUOTA].nextents;
+	}
+	if (state.s_state[PRJQUOTA].flags & QCI_ACCT_ENABLED) {
+		/*
+		 * Q_XGETQSTAT doesn't have room for both group and project
+		 * quotas.  So, allow the project quota values to be copied out
+		 * only if there is no group quota information available.
+		 */
+		if (!(state.s_state[GRPQUOTA].flags & QCI_ACCT_ENABLED)) {
+			fqs->qs_gquota.qfs_ino = state.s_state[PRJQUOTA].ino;
+			fqs->qs_gquota.qfs_nblks =
+					state.s_state[PRJQUOTA].blocks;
+			fqs->qs_gquota.qfs_nextents =
+					state.s_state[PRJQUOTA].nextents;
+		}
+	}
+	return 0;
+}
+
 static int quota_getxstate(struct super_block *sb, void __user *addr)
 {
 	struct fs_quota_stat fqs;
 	int ret;
 
-	if (!sb->s_qcop->get_xstate)
+	if (!sb->s_qcop->get_xstate && !sb->s_qcop->get_state)
 		return -ENOSYS;
-	ret = sb->s_qcop->get_xstate(sb, &fqs);
+	if (sb->s_qcop->get_state)
+		ret = quota_getstate(sb, &fqs);
+	else
+		ret = sb->s_qcop->get_xstate(sb, &fqs);
 	if (!ret && copy_to_user(addr, &fqs, sizeof(fqs)))
 		return -EFAULT;
 	return ret;
 }
 
+static int quota_getstatev(struct super_block *sb, struct fs_quota_statv *fqs)
+{
+	int type;
+	struct qc_state state;
+	int ret;
+
+	ret = sb->s_qcop->get_state(sb, &state);
+	if (ret < 0)
+		return ret;
+
+	memset(fqs, 0, sizeof(*fqs));
+	fqs->qs_version = FS_QSTAT_VERSION;
+	fqs->qs_flags = quota_state_to_flags(&state);
+	/* No quota enabled? */
+	if (!fqs->qs_flags)
+		return -ENOSYS;
+	fqs->qs_incoredqs = state.s_incoredqs;
+	/*
+	 * GETXSTATV quotactl has space for just one set of time limits so
+	 * report them for the first enabled quota type
+	 */
+	for (type = 0; type < XQM_MAXQUOTAS; type++)
+		if (state.s_state[type].flags & QCI_ACCT_ENABLED)
+			break;
+	BUG_ON(type == XQM_MAXQUOTAS);
+	fqs->qs_btimelimit = state.s_state[type].spc_timelimit;
+	fqs->qs_itimelimit = state.s_state[type].ino_timelimit;
+	fqs->qs_rtbtimelimit = state.s_state[type].rt_spc_timelimit;
+	fqs->qs_bwarnlimit = state.s_state[type].spc_warnlimit;
+	fqs->qs_iwarnlimit = state.s_state[type].ino_warnlimit;
+	if (state.s_state[USRQUOTA].flags & QCI_ACCT_ENABLED) {
+		fqs->qs_uquota.qfs_ino = state.s_state[USRQUOTA].ino;
+		fqs->qs_uquota.qfs_nblks = state.s_state[USRQUOTA].blocks;
+		fqs->qs_uquota.qfs_nextents = state.s_state[USRQUOTA].nextents;
+	}
+	if (state.s_state[GRPQUOTA].flags & QCI_ACCT_ENABLED) {
+		fqs->qs_gquota.qfs_ino = state.s_state[GRPQUOTA].ino;
+		fqs->qs_gquota.qfs_nblks = state.s_state[GRPQUOTA].blocks;
+		fqs->qs_gquota.qfs_nextents = state.s_state[GRPQUOTA].nextents;
+	}
+	if (state.s_state[PRJQUOTA].flags & QCI_ACCT_ENABLED) {
+		fqs->qs_pquota.qfs_ino = state.s_state[PRJQUOTA].ino;
+		fqs->qs_pquota.qfs_nblks = state.s_state[PRJQUOTA].blocks;
+		fqs->qs_pquota.qfs_nextents = state.s_state[PRJQUOTA].nextents;
+	}
+	return 0;
+}
+
 static int quota_getxstatev(struct super_block *sb, void __user *addr)
 {
 	struct fs_quota_statv fqs;
 	int ret;
 
-	if (!sb->s_qcop->get_xstatev)
+	if (!sb->s_qcop->get_xstatev && !sb->s_qcop->get_state)
 		return -ENOSYS;
 
 	memset(&fqs, 0, sizeof(fqs));
@@ -301,7 +428,10 @@ static int quota_getxstatev(struct super_block *sb, void __user *addr)
 	default:
 		return -EINVAL;
 	}
-	ret = sb->s_qcop->get_xstatev(sb, &fqs);
+	if (sb->s_qcop->get_state)
+		ret = quota_getstatev(sb, &fqs);
+	else
+		ret = sb->s_qcop->get_xstatev(sb, &fqs);
 	if (!ret && copy_to_user(addr, &fqs, sizeof(fqs)))
 		return -EFAULT;
 	return ret;
-- 
2.1.2



  parent reply	other threads:[~2015-01-16 12:48 UTC|newest]

Thread overview: 150+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-01-16 12:47 [PATCH 0/17 v3] quota: Unify VFS and XFS quota interfaces Jan Kara
2015-01-16 12:47 ` [Cluster-devel] " Jan Kara
2015-01-16 12:47 ` [Ocfs2-devel] " Jan Kara
2015-01-16 12:47 ` Jan Kara
2015-01-16 12:47 ` [PATCH 01/17] quota: Split ->set_xstate callback into two Jan Kara
2015-01-16 12:47   ` [Cluster-devel] " Jan Kara
2015-01-16 12:47   ` [Ocfs2-devel] " Jan Kara
2015-01-16 12:47   ` Jan Kara
2015-01-19  9:00   ` Christoph Hellwig
2015-01-19  9:00     ` [Cluster-devel] " Christoph Hellwig
2015-01-19  9:00     ` [Ocfs2-devel] " Christoph Hellwig
2015-01-19  9:00     ` Christoph Hellwig
2015-01-16 12:47 ` [PATCH 02/17] quota: Wire up ->quota_{enable,disable} callbacks into Q_QUOTA{ON,OFF} Jan Kara
2015-01-16 12:47   ` [Cluster-devel] [PATCH 02/17] quota: Wire up ->quota_{enable, disable} callbacks into Q_QUOTA{ON, OFF} Jan Kara
2015-01-16 12:47   ` [Ocfs2-devel] " Jan Kara
2015-01-16 12:47   ` Jan Kara
2015-01-19  9:01   ` [PATCH 02/17] quota: Wire up ->quota_{enable,disable} callbacks into Q_QUOTA{ON,OFF} Christoph Hellwig
2015-01-19  9:01     ` [Cluster-devel] [PATCH 02/17] quota: Wire up ->quota_{enable, disable} callbacks into Q_QUOTA{ON, OFF} Christoph Hellwig
2015-01-19  9:01     ` [Ocfs2-devel] " Christoph Hellwig
2015-01-19  9:01     ` [PATCH 02/17] quota: Wire up ->quota_{enable,disable} callbacks into Q_QUOTA{ON,OFF} Christoph Hellwig
2015-01-20 17:01     ` Jan Kara
2015-01-20 17:01       ` [Cluster-devel] [PATCH 02/17] quota: Wire up ->quota_{enable, disable} callbacks into Q_QUOTA{ON, OFF} Jan Kara
2015-01-20 17:01       ` [Ocfs2-devel] " Jan Kara
2015-01-16 12:47 ` [PATCH 03/17] quota: Add ->quota_{enable, disable} callbacks for VFS quotas Jan Kara
2015-01-16 12:47   ` [Cluster-devel] " Jan Kara
2015-01-16 12:47   ` [Ocfs2-devel] " Jan Kara
2015-01-19  9:02   ` [PATCH 03/17] quota: Add ->quota_{enable,disable} " Christoph Hellwig
2015-01-19  9:02     ` [Cluster-devel] [PATCH 03/17] quota: Add ->quota_{enable, disable} " Christoph Hellwig
2015-01-19  9:02     ` [Ocfs2-devel] " Christoph Hellwig
2015-01-19  9:02     ` [PATCH 03/17] quota: Add ->quota_{enable,disable} " Christoph Hellwig
2015-01-20 17:08     ` Jan Kara
2015-01-20 17:08       ` [Cluster-devel] [PATCH 03/17] quota: Add ->quota_{enable, disable} " Jan Kara
2015-01-20 17:08       ` [Ocfs2-devel] " Jan Kara
2015-01-20 17:08       ` [PATCH 03/17] quota: Add ->quota_{enable,disable} " Jan Kara
2015-01-16 12:47 ` [PATCH 04/17] ext4: Use generic helpers for quotaon and quotaoff Jan Kara
2015-01-16 12:47   ` [Cluster-devel] " Jan Kara
2015-01-16 12:47   ` [Ocfs2-devel] " Jan Kara
2015-01-19  9:03   ` Christoph Hellwig
2015-01-19  9:03     ` [Cluster-devel] " Christoph Hellwig
2015-01-19  9:03     ` [Ocfs2-devel] " Christoph Hellwig
2015-01-16 12:47 ` [PATCH 05/17] ocfs2: " Jan Kara
2015-01-16 12:47   ` [Cluster-devel] " Jan Kara
2015-01-16 12:47   ` [Ocfs2-devel] " Jan Kara
2015-01-16 12:47   ` Jan Kara
2015-01-19  9:03   ` Christoph Hellwig
2015-01-19  9:03     ` [Cluster-devel] " Christoph Hellwig
2015-01-19  9:03     ` [Ocfs2-devel] " Christoph Hellwig
2015-01-19  9:03     ` Christoph Hellwig
2015-01-20 17:13     ` Jan Kara
2015-01-20 17:13       ` [Cluster-devel] " Jan Kara
2015-01-20 17:13       ` [Ocfs2-devel] " Jan Kara
2015-01-16 12:47 ` [PATCH 06/17] quota: Remove quota_on_meta callback Jan Kara
2015-01-16 12:47   ` [Cluster-devel] " Jan Kara
2015-01-16 12:47   ` [Ocfs2-devel] " Jan Kara
2015-01-16 12:47   ` Jan Kara
2015-01-19  9:04   ` Christoph Hellwig
2015-01-19  9:04     ` [Cluster-devel] " Christoph Hellwig
2015-01-19  9:04     ` [Ocfs2-devel] " Christoph Hellwig
2015-01-16 12:47 ` [PATCH 07/17] quota: Switch ->get_dqblk() and ->set_dqblk() to use bytes as space units Jan Kara
2015-01-16 12:47   ` [Cluster-devel] " Jan Kara
2015-01-16 12:47   ` [Ocfs2-devel] " Jan Kara
2015-01-16 12:47   ` Jan Kara
2015-01-19  9:07   ` Christoph Hellwig
2015-01-19  9:07     ` [Cluster-devel] " Christoph Hellwig
2015-01-19  9:07     ` [Ocfs2-devel] " Christoph Hellwig
2015-01-19  9:07     ` Christoph Hellwig
2015-01-20 16:53     ` Jan Kara
2015-01-20 16:53       ` [Cluster-devel] " Jan Kara
2015-01-20 16:53       ` [Ocfs2-devel] " Jan Kara
2015-01-20 16:53       ` Jan Kara
2015-01-16 12:47 ` [PATCH 08/17] quota: Store maximum space limit in bytes Jan Kara
2015-01-16 12:47   ` [Cluster-devel] " Jan Kara
2015-01-16 12:47   ` [Ocfs2-devel] " Jan Kara
2015-01-16 12:47   ` Jan Kara
2015-01-19  9:07   ` Christoph Hellwig
2015-01-19  9:07     ` [Cluster-devel] " Christoph Hellwig
2015-01-19  9:07     ` [Ocfs2-devel] " Christoph Hellwig
2015-01-19  9:07     ` Christoph Hellwig
2015-01-16 12:47 ` [PATCH 09/17] quota: Make Q_XQUOTASYNC support VFS quota syncing Jan Kara
2015-01-16 12:47   ` [Cluster-devel] " Jan Kara
2015-01-16 12:47   ` [Ocfs2-devel] " Jan Kara
2015-01-16 12:47   ` Jan Kara
2015-01-19  9:09   ` Christoph Hellwig
2015-01-19  9:09     ` [Cluster-devel] " Christoph Hellwig
2015-01-19  9:09     ` [Ocfs2-devel] " Christoph Hellwig
2015-01-19  9:09     ` Christoph Hellwig
2015-01-20 17:16     ` Jan Kara
2015-01-20 17:16       ` [Cluster-devel] " Jan Kara
2015-01-20 17:16       ` [Ocfs2-devel] " Jan Kara
2015-01-20 17:16       ` Jan Kara
2015-01-16 12:47 ` [PATCH 10/17] quota: Make VFS quotas use new interface for getting quota info Jan Kara
2015-01-16 12:47   ` [Cluster-devel] " Jan Kara
2015-01-16 12:47   ` [Ocfs2-devel] " Jan Kara
2015-01-16 12:47   ` Jan Kara
2015-01-19  9:10   ` Christoph Hellwig
2015-01-19  9:10     ` [Cluster-devel] " Christoph Hellwig
2015-01-19  9:10     ` [Ocfs2-devel] " Christoph Hellwig
2015-01-16 12:47 ` Jan Kara [this message]
2015-01-16 12:47   ` [Cluster-devel] [PATCH 11/17] quota: Wire up Q_GETXSTATE and Q_GETXSTATV calls to work with ->get_state Jan Kara
2015-01-16 12:47   ` [Ocfs2-devel] " Jan Kara
2015-01-16 12:47   ` Jan Kara
2015-01-19  9:11   ` Christoph Hellwig
2015-01-19  9:11     ` [Cluster-devel] " Christoph Hellwig
2015-01-19  9:11     ` [Ocfs2-devel] " Christoph Hellwig
2015-01-16 12:47 ` [PATCH 12/17] xfs: Convert to using ->get_state callback Jan Kara
2015-01-16 12:47   ` [Cluster-devel] " Jan Kara
2015-01-16 12:47   ` [Ocfs2-devel] " Jan Kara
2015-01-16 12:47   ` Jan Kara
2015-01-19  9:38   ` Christoph Hellwig
2015-01-19  9:38     ` [Cluster-devel] " Christoph Hellwig
2015-01-19  9:38     ` [Ocfs2-devel] " Christoph Hellwig
2015-01-20 17:33     ` Jan Kara
2015-01-20 17:33       ` [Cluster-devel] " Jan Kara
2015-01-20 17:33       ` [Ocfs2-devel] " Jan Kara
2015-01-20 17:33       ` Jan Kara
2015-01-16 12:47 ` [PATCH 13/17] gfs2: " Jan Kara
2015-01-16 12:47   ` [Cluster-devel] " Jan Kara
2015-01-16 12:47   ` [Ocfs2-devel] " Jan Kara
2015-01-16 12:47   ` Jan Kara
2015-01-16 12:47 ` [PATCH 14/17] quota: Remove ->get_xstate and ->get_xstatev callbacks Jan Kara
2015-01-16 12:47   ` [Cluster-devel] " Jan Kara
2015-01-16 12:47   ` [Ocfs2-devel] " Jan Kara
2015-01-16 12:47   ` Jan Kara
2015-01-19  9:38   ` Christoph Hellwig
2015-01-19  9:38     ` [Cluster-devel] " Christoph Hellwig
2015-01-19  9:38     ` [Ocfs2-devel] " Christoph Hellwig
2015-01-19  9:38     ` Christoph Hellwig
2015-01-16 12:47 ` [PATCH 15/17] quota: Make ->set_info use structure with neccesary info to VFS and XFS Jan Kara
2015-01-16 12:47   ` [Cluster-devel] " Jan Kara
2015-01-16 12:47   ` [Ocfs2-devel] " Jan Kara
2015-01-16 12:47   ` Jan Kara
2015-01-16 12:47 ` [PATCH 16/17] xfs: Add support for Q_SETINFO Jan Kara
2015-01-16 12:47   ` [Cluster-devel] " Jan Kara
2015-01-16 12:47   ` [Ocfs2-devel] " Jan Kara
2015-01-16 12:47   ` Jan Kara
2015-01-16 12:47 ` [PATCH 17/17] quota: Hook up Q_XSETQLIM for id 0 to ->set_info Jan Kara
2015-01-16 12:47   ` [Cluster-devel] " Jan Kara
2015-01-16 12:47   ` [Ocfs2-devel] " Jan Kara
2015-01-16 12:47   ` Jan Kara
2015-01-21 21:38 ` [PATCH 0/17 v3] quota: Unify VFS and XFS quota interfaces Dave Chinner
2015-01-21 21:38   ` [Cluster-devel] " Dave Chinner
2015-01-21 21:38   ` [Ocfs2-devel] " Dave Chinner
2015-01-21 21:38   ` Dave Chinner
2015-01-21 22:23   ` Jan Kara
2015-01-21 22:23     ` [Cluster-devel] " Jan Kara
2015-01-21 22:23     ` [Ocfs2-devel] " Jan Kara
2015-01-21 22:23     ` Jan Kara
2015-01-21 23:10     ` Dave Chinner
2015-01-21 23:10       ` [Cluster-devel] " Dave Chinner
2015-01-21 23:10       ` [Ocfs2-devel] " Dave Chinner

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1421412471-4747-12-git-send-email-jack@suse.cz \
    --to=jack@suse.cz \
    --cc=cluster-devel@redhat.com \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=ocfs2-devel@oss.oracle.com \
    --cc=xfs@oss.sgi.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.