Blob Blame History Raw
From: "Yan, Zheng" <zyan@redhat.com>
Date: Fri, 12 Jan 2018 16:55:31 +0800
Subject: ceph: fix root quota realm check
Git-commit: 0eb6bbe4d9cf02f639d661edf7c02defc3453a69
Patch-mainline: v4.17-rc1
References: FATE#323422 bsc#1089115

Signed-off-by: "Yan, Zheng" <zyan@redhat.com>
Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
Acked-by: Luis Henriques <lhenriques@suse.com>
---
 fs/ceph/quota.c | 16 ++++++++--------
 1 file changed, 8 insertions(+), 8 deletions(-)

diff --git a/fs/ceph/quota.c b/fs/ceph/quota.c
index 529de67393a9..121819baeb58 100644
--- a/fs/ceph/quota.c
+++ b/fs/ceph/quota.c
@@ -85,6 +85,7 @@ static struct ceph_snap_realm *get_quota_realm(struct ceph_mds_client *mdsc,
 	struct ceph_snap_realm *realm, *next;
 	struct ceph_vino vino;
 	struct inode *in;
+	bool has_quota;
 
 	if (ceph_snap(inode) != CEPH_NOSNAP)
 		return NULL;
@@ -104,12 +105,13 @@ static struct ceph_snap_realm *get_quota_realm(struct ceph_mds_client *mdsc,
 			break;
 		}
 		ci = ceph_inode(in);
-		if (ceph_has_quota(ci) || (ci->i_vino.ino == CEPH_INO_ROOT)) {
-			iput(in);
-			return realm;
-		}
+		has_quota = ceph_has_quota(ci);
 		iput(in);
+
 		next = realm->parent;
+		if (has_quota || !next)
+		       return realm;
+
 		ceph_get_snap_realm(mdsc, next);
 		ceph_put_snap_realm(mdsc, realm);
 		realm = next;
@@ -162,7 +164,6 @@ static bool check_quota_exceeded(struct inode *inode, enum quota_check_op op,
 	struct ceph_vino vino;
 	struct inode *in;
 	u64 max, rvalue;
-	bool is_root;
 	bool exceeded = false;
 
 	if (ceph_snap(inode) != CEPH_NOSNAP)
@@ -192,7 +193,6 @@ static bool check_quota_exceeded(struct inode *inode, enum quota_check_op op,
 			max = ci->i_max_bytes;
 			rvalue = ci->i_rbytes;
 		}
-		is_root = (ci->i_vino.ino == CEPH_INO_ROOT);
 		spin_unlock(&ci->i_ceph_lock);
 		switch (op) {
 		case QUOTA_CHECK_MAX_FILES_OP:
@@ -222,9 +222,9 @@ static bool check_quota_exceeded(struct inode *inode, enum quota_check_op op,
 		}
 		iput(in);
 
-		if (is_root || exceeded)
-			break;
 		next = realm->parent;
+		if (exceeded || !next)
+			break;
 		ceph_get_snap_realm(mdsc, next);
 		ceph_put_snap_realm(mdsc, realm);
 		realm = next;