diff options
-rw-r--r-- | fs/ceph/dir.c | 3 | ||||
-rw-r--r-- | fs/ceph/quota.c | 18 |
2 files changed, 18 insertions, 3 deletions
diff --git a/fs/ceph/dir.c b/fs/ceph/dir.c index 1f60498c4631..6cd92a0e2af9 100644 --- a/fs/ceph/dir.c +++ b/fs/ceph/dir.c | |||
@@ -936,7 +936,8 @@ static int ceph_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode) | |||
936 | goto out; | 936 | goto out; |
937 | } | 937 | } |
938 | 938 | ||
939 | if (ceph_quota_is_max_files_exceeded(dir)) { | 939 | if (op == CEPH_MDS_OP_MKDIR && |
940 | ceph_quota_is_max_files_exceeded(dir)) { | ||
940 | err = -EDQUOT; | 941 | err = -EDQUOT; |
941 | goto out; | 942 | goto out; |
942 | } | 943 | } |
diff --git a/fs/ceph/quota.c b/fs/ceph/quota.c index 7d1e18e2249f..529de67393a9 100644 --- a/fs/ceph/quota.c +++ b/fs/ceph/quota.c | |||
@@ -86,8 +86,15 @@ static struct ceph_snap_realm *get_quota_realm(struct ceph_mds_client *mdsc, | |||
86 | struct ceph_vino vino; | 86 | struct ceph_vino vino; |
87 | struct inode *in; | 87 | struct inode *in; |
88 | 88 | ||
89 | if (ceph_snap(inode) != CEPH_NOSNAP) | ||
90 | return NULL; | ||
91 | |||
89 | realm = ceph_inode(inode)->i_snap_realm; | 92 | realm = ceph_inode(inode)->i_snap_realm; |
90 | ceph_get_snap_realm(mdsc, realm); | 93 | if (realm) |
94 | ceph_get_snap_realm(mdsc, realm); | ||
95 | else | ||
96 | pr_err_ratelimited("get_quota_realm: ino (%llx.%llx) " | ||
97 | "null i_snap_realm\n", ceph_vinop(inode)); | ||
91 | while (realm) { | 98 | while (realm) { |
92 | vino.ino = realm->ino; | 99 | vino.ino = realm->ino; |
93 | vino.snap = CEPH_NOSNAP; | 100 | vino.snap = CEPH_NOSNAP; |
@@ -158,9 +165,16 @@ static bool check_quota_exceeded(struct inode *inode, enum quota_check_op op, | |||
158 | bool is_root; | 165 | bool is_root; |
159 | bool exceeded = false; | 166 | bool exceeded = false; |
160 | 167 | ||
168 | if (ceph_snap(inode) != CEPH_NOSNAP) | ||
169 | return false; | ||
170 | |||
161 | down_read(&mdsc->snap_rwsem); | 171 | down_read(&mdsc->snap_rwsem); |
162 | realm = ceph_inode(inode)->i_snap_realm; | 172 | realm = ceph_inode(inode)->i_snap_realm; |
163 | ceph_get_snap_realm(mdsc, realm); | 173 | if (realm) |
174 | ceph_get_snap_realm(mdsc, realm); | ||
175 | else | ||
176 | pr_err_ratelimited("check_quota_exceeded: ino (%llx.%llx) " | ||
177 | "null i_snap_realm\n", ceph_vinop(inode)); | ||
164 | while (realm) { | 178 | while (realm) { |
165 | vino.ino = realm->ino; | 179 | vino.ino = realm->ino; |
166 | vino.snap = CEPH_NOSNAP; | 180 | vino.snap = CEPH_NOSNAP; |