diff options
author | Chengguang Xu <cgxu519@gmx.com> | 2018-07-28 11:15:37 -0400 |
---|---|---|
committer | Ilya Dryomov <idryomov@gmail.com> | 2018-08-13 11:55:44 -0400 |
commit | e5bc08d09f5fac5cd2901f34b510e67c524894ab (patch) | |
tree | c7fe2100c9064e0e3cef020b9cbe0bbd4d1d60ab /fs/ceph | |
parent | 7bf8f736c8e0f2e854d41838eed12e317fb29963 (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.c | 46 |
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 | |||
287 | out_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 | ||
317 | void ceph_unreserve_caps(struct ceph_mds_client *mdsc, | 297 | void ceph_unreserve_caps(struct ceph_mds_client *mdsc, |