Whamcloud - gitweb
LU-14125 osc: prevent overflow of o_dropped 15/40615/8
authorOlaf Faaland <faaland1@llnl.gov>
Wed, 11 Nov 2020 22:38:25 +0000 (14:38 -0800)
committerOleg Drokin <green@whamcloud.com>
Wed, 17 Mar 2021 23:21:19 +0000 (23:21 +0000)
In osc_announce_cached(), prevent o_dropped from overflowing.
Necessary because o_dropped AKA o_misc is 32 bits, but cl_lost_grant
is 64 bits.

Add a CDEBUG call so we can tell whether this happened.

Lustre-change: https://review.whamcloud.com/40659
Lustre-commit: 82e9a11056a55289c880786da71d8b1125f357b2

Signed-off-by: Olaf Faaland <faaland1@llnl.gov>
Change-Id: Ia459934c789ae9609f851ae0a2581de583c6fc1c
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
Reviewed-by: James Simmons <jsimmons@infradead.org>
Reviewed-on: https://review.whamcloud.com/40615
Tested-by: jenkins <devops@whamcloud.com>
Tested-by: Maloo <maloo@whamcloud.com>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
lustre/osc/osc_request.c

index 731ead8..80695d5 100644 (file)
@@ -695,11 +695,20 @@ static void osc_announce_cached(struct client_obd *cli, struct obdo *oa,
                                    ~(PTLRPC_MAX_BRW_SIZE * 4UL));
         }
        oa->o_grant = cli->cl_avail_grant + cli->cl_reserved_grant;
-        oa->o_dropped = cli->cl_lost_grant;
-        cli->cl_lost_grant = 0;
+       /* o_dropped AKA o_misc is 32 bits, but cl_lost_grant is 64 bits */
+       if (cli->cl_lost_grant > INT_MAX) {
+               CDEBUG(D_CACHE,
+                     "%s: avoided o_dropped overflow: cl_lost_grant %lu\n",
+                     cli_name(cli), cli->cl_lost_grant);
+               oa->o_dropped = INT_MAX;
+       } else {
+               oa->o_dropped = cli->cl_lost_grant;
+       }
+       cli->cl_lost_grant -= oa->o_dropped;
        spin_unlock(&cli->cl_loi_list_lock);
-       CDEBUG(D_CACHE, "dirty: %llu undirty: %u dropped %u grant: %llu\n",
-               oa->o_dirty, oa->o_undirty, oa->o_dropped, oa->o_grant);
+       CDEBUG(D_CACHE, "%s: dirty: %llu undirty: %u dropped %u grant: %llu"
+              " cl_lost_grant %lu\n", cli_name(cli), oa->o_dirty,
+              oa->o_undirty, oa->o_dropped, oa->o_grant, cli->cl_lost_grant);
 }
 
 void osc_update_next_shrink(struct client_obd *cli)