aboutsummaryrefslogtreecommitdiffstats
path: root/net
diff options
context:
space:
mode:
authorIlya Dryomov <idryomov@gmail.com>2018-05-30 10:29:14 -0400
committerIlya Dryomov <idryomov@gmail.com>2018-06-04 14:46:00 -0400
commitc843d13caefad9f2f182f38d6bfe492c9f00e086 (patch)
tree7e8c0e4e299aab12bc529379f0db84ef09d4cee7 /net
parent690f951d7eb8c0529f8a367a3db9cfbfde624db4 (diff)
libceph: make abort_on_full a per-osdc setting
The intent behind making it a per-request setting was that it would be set for writes, but not for reads. As it is, the flag is set for all fs/ceph requests except for pool perm check stat request (technically a read). ceph_osdc_abort_on_full() skips reads since the previous commit and I don't see a use case for marking individual requests. Signed-off-by: Ilya Dryomov <idryomov@gmail.com> Acked-by: Jeff Layton <jlayton@redhat.com> Reviewed-by: "Yan, Zheng" <zyan@redhat.com>
Diffstat (limited to 'net')
-rw-r--r--net/ceph/osd_client.c9
1 files changed, 4 insertions, 5 deletions
diff --git a/net/ceph/osd_client.c b/net/ceph/osd_client.c
index 3d055529189c..05c4d27d25fe 100644
--- a/net/ceph/osd_client.c
+++ b/net/ceph/osd_client.c
@@ -1030,7 +1030,6 @@ struct ceph_osd_request *ceph_osdc_new_request(struct ceph_osd_client *osdc,
1030 truncate_size, truncate_seq); 1030 truncate_size, truncate_seq);
1031 } 1031 }
1032 1032
1033 req->r_abort_on_full = true;
1034 req->r_flags = flags; 1033 req->r_flags = flags;
1035 req->r_base_oloc.pool = layout->pool_id; 1034 req->r_base_oloc.pool = layout->pool_id;
1036 req->r_base_oloc.pool_ns = ceph_try_get_string(layout->pool_ns); 1035 req->r_base_oloc.pool_ns = ceph_try_get_string(layout->pool_ns);
@@ -2239,7 +2238,7 @@ again:
2239 (ceph_osdmap_flag(osdc, CEPH_OSDMAP_FULL) || 2238 (ceph_osdmap_flag(osdc, CEPH_OSDMAP_FULL) ||
2240 pool_full(osdc, req->r_t.base_oloc.pool))) { 2239 pool_full(osdc, req->r_t.base_oloc.pool))) {
2241 dout("req %p full/pool_full\n", req); 2240 dout("req %p full/pool_full\n", req);
2242 if (req->r_abort_on_full) { 2241 if (osdc->abort_on_full) {
2243 err = -ENOSPC; 2242 err = -ENOSPC;
2244 } else { 2243 } else {
2245 pr_warn_ratelimited("FULL or reached pool quota\n"); 2244 pr_warn_ratelimited("FULL or reached pool quota\n");
@@ -2446,8 +2445,7 @@ static int abort_on_full_fn(struct ceph_osd_request *req, void *arg)
2446 struct ceph_osd_client *osdc = req->r_osdc; 2445 struct ceph_osd_client *osdc = req->r_osdc;
2447 bool *victims = arg; 2446 bool *victims = arg;
2448 2447
2449 if (req->r_abort_on_full && 2448 if ((req->r_flags & CEPH_OSD_FLAG_WRITE) &&
2450 (req->r_flags & CEPH_OSD_FLAG_WRITE) &&
2451 (ceph_osdmap_flag(osdc, CEPH_OSDMAP_FULL) || 2449 (ceph_osdmap_flag(osdc, CEPH_OSDMAP_FULL) ||
2452 pool_full(osdc, req->r_t.base_oloc.pool))) { 2450 pool_full(osdc, req->r_t.base_oloc.pool))) {
2453 if (!*victims) { 2451 if (!*victims) {
@@ -2470,7 +2468,8 @@ static void ceph_osdc_abort_on_full(struct ceph_osd_client *osdc)
2470{ 2468{
2471 bool victims = false; 2469 bool victims = false;
2472 2470
2473 if (ceph_osdmap_flag(osdc, CEPH_OSDMAP_FULL) || have_pool_full(osdc)) 2471 if (osdc->abort_on_full &&
2472 (ceph_osdmap_flag(osdc, CEPH_OSDMAP_FULL) || have_pool_full(osdc)))
2474 for_each_request(osdc, abort_on_full_fn, &victims); 2473 for_each_request(osdc, abort_on_full_fn, &victims);
2475} 2474}
2476 2475