summaryrefslogtreecommitdiffstats
path: root/fs/ceph
diff options
context:
space:
mode:
authorChengguang Xu <cgxu519@gmx.com>2018-07-28 11:15:37 -0400
committerIlya Dryomov <idryomov@gmail.com>2018-08-13 11:55:44 -0400
commite5bc08d09f5fac5cd2901f34b510e67c524894ab (patch)
treec7fe2100c9064e0e3cef020b9cbe0bbd4d1d60ab /fs/ceph
parent7bf8f736c8e0f2e854d41838eed12e317fb29963 (diff)
ceph: refactor error handling code in ceph_reserve_caps()
Call new helper __ceph_unreserve_caps() to reduce duplicated code. Signed-off-by: Chengguang Xu <cgxu519@gmx.com> Reviewed-by: "Yan, Zheng" <zyan@redhat.com> Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
Diffstat (limited to 'fs/ceph')
-rw-r--r--fs/ceph/caps.c46
1 files changed, 13 insertions, 33 deletions
diff --git a/fs/ceph/caps.c b/fs/ceph/caps.c
index fb4a19ee5b6d..dd7dfdd2ba13 100644
--- a/fs/ceph/caps.c
+++ b/fs/ceph/caps.c
@@ -198,6 +198,7 @@ int ceph_reserve_caps(struct ceph_mds_client *mdsc,
198 int have; 198 int have;
199 int alloc = 0; 199 int alloc = 0;
200 int max_caps; 200 int max_caps;
201 int err = 0;
201 bool trimmed = false; 202 bool trimmed = false;
202 struct ceph_mds_session *s; 203 struct ceph_mds_session *s;
203 LIST_HEAD(newcaps); 204 LIST_HEAD(newcaps);
@@ -264,9 +265,14 @@ int ceph_reserve_caps(struct ceph_mds_client *mdsc,
264 265
265 pr_warn("reserve caps ctx=%p ENOMEM need=%d got=%d\n", 266 pr_warn("reserve caps ctx=%p ENOMEM need=%d got=%d\n",
266 ctx, need, have + alloc); 267 ctx, need, have + alloc);
267 goto out_nomem; 268 err = -ENOMEM;
269 break;
270 }
271
272 if (!err) {
273 BUG_ON(have + alloc != need);
274 ctx->count = need;
268 } 275 }
269 BUG_ON(have + alloc != need);
270 276
271 spin_lock(&mdsc->caps_list_lock); 277 spin_lock(&mdsc->caps_list_lock);
272 mdsc->caps_total_count += alloc; 278 mdsc->caps_total_count += alloc;
@@ -276,42 +282,16 @@ int ceph_reserve_caps(struct ceph_mds_client *mdsc,
276 BUG_ON(mdsc->caps_total_count != mdsc->caps_use_count + 282 BUG_ON(mdsc->caps_total_count != mdsc->caps_use_count +
277 mdsc->caps_reserve_count + 283 mdsc->caps_reserve_count +
278 mdsc->caps_avail_count); 284 mdsc->caps_avail_count);
285
286 if (err)
287 __ceph_unreserve_caps(mdsc, have + alloc);
288
279 spin_unlock(&mdsc->caps_list_lock); 289 spin_unlock(&mdsc->caps_list_lock);
280 290
281 ctx->count = need;
282 dout("reserve caps ctx=%p %d = %d used + %d resv + %d avail\n", 291 dout("reserve caps ctx=%p %d = %d used + %d resv + %d avail\n",
283 ctx, mdsc->caps_total_count, mdsc->caps_use_count, 292 ctx, mdsc->caps_total_count, mdsc->caps_use_count,
284 mdsc->caps_reserve_count, mdsc->caps_avail_count); 293 mdsc->caps_reserve_count, mdsc->caps_avail_count);
285 return 0; 294 return err;
286
287out_nomem:
288
289 spin_lock(&mdsc->caps_list_lock);
290 mdsc->caps_avail_count += have;
291 mdsc->caps_reserve_count -= have;
292
293 while (!list_empty(&newcaps)) {
294 cap = list_first_entry(&newcaps,
295 struct ceph_cap, caps_item);
296 list_del(&cap->caps_item);
297
298 /* Keep some preallocated caps around (ceph_min_count), to
299 * avoid lots of free/alloc churn. */
300 if (mdsc->caps_avail_count >=
301 mdsc->caps_reserve_count + mdsc->caps_min_count) {
302 kmem_cache_free(ceph_cap_cachep, cap);
303 } else {
304 mdsc->caps_avail_count++;
305 mdsc->caps_total_count++;
306 list_add(&cap->caps_item, &mdsc->caps_list);
307 }
308 }
309
310 BUG_ON(mdsc->caps_total_count != mdsc->caps_use_count +
311 mdsc->caps_reserve_count +
312 mdsc->caps_avail_count);
313 spin_unlock(&mdsc->caps_list_lock);
314 return -ENOMEM;
315} 295}
316 296
317void ceph_unreserve_caps(struct ceph_mds_client *mdsc, 297void ceph_unreserve_caps(struct ceph_mds_client *mdsc,