Whamcloud - gitweb
LU-11398 ptlrpc: clean up rq_interpret_reply callbacks
[fs/lustre-release.git] / lustre / osc / osc_request.c
1 /*
2  * GPL HEADER START
3  *
4  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License version 2 only,
8  * as published by the Free Software Foundation.
9  *
10  * This program is distributed in the hope that it will be useful, but
11  * WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  * General Public License version 2 for more details (a copy is included
14  * in the LICENSE file that accompanied this code).
15  *
16  * You should have received a copy of the GNU General Public License
17  * version 2 along with this program; If not, see
18  * http://www.gnu.org/licenses/gpl-2.0.html
19  *
20  * GPL HEADER END
21  */
22 /*
23  * Copyright (c) 2002, 2010, Oracle and/or its affiliates. All rights reserved.
24  * Use is subject to license terms.
25  *
26  * Copyright (c) 2011, 2017, Intel Corporation.
27  */
28 /*
29  * This file is part of Lustre, http://www.lustre.org/
30  * Lustre is a trademark of Sun Microsystems, Inc.
31  */
32
33 #define DEBUG_SUBSYSTEM S_OSC
34
35 #include <linux/workqueue.h>
36 #include <lprocfs_status.h>
37 #include <lustre_debug.h>
38 #include <lustre_dlm.h>
39 #include <lustre_fid.h>
40 #include <lustre_ha.h>
41 #include <uapi/linux/lustre/lustre_ioctl.h>
42 #include <lustre_net.h>
43 #include <lustre_obdo.h>
44 #include <uapi/linux/lustre/lustre_param.h>
45 #include <obd.h>
46 #include <obd_cksum.h>
47 #include <obd_class.h>
48 #include <lustre_osc.h>
49
50 #include "osc_internal.h"
51
52 atomic_t osc_pool_req_count;
53 unsigned int osc_reqpool_maxreqcount;
54 struct ptlrpc_request_pool *osc_rq_pool;
55
56 /* max memory used for request pool, unit is MB */
57 static unsigned int osc_reqpool_mem_max = 5;
58 module_param(osc_reqpool_mem_max, uint, 0444);
59
60 static int osc_idle_timeout = 20;
61 module_param(osc_idle_timeout, uint, 0644);
62
63 #define osc_grant_args osc_brw_async_args
64
65 struct osc_setattr_args {
66         struct obdo             *sa_oa;
67         obd_enqueue_update_f     sa_upcall;
68         void                    *sa_cookie;
69 };
70
71 struct osc_fsync_args {
72         struct osc_object       *fa_obj;
73         struct obdo             *fa_oa;
74         obd_enqueue_update_f    fa_upcall;
75         void                    *fa_cookie;
76 };
77
78 struct osc_ladvise_args {
79         struct obdo             *la_oa;
80         obd_enqueue_update_f     la_upcall;
81         void                    *la_cookie;
82 };
83
84 static void osc_release_ppga(struct brw_page **ppga, size_t count);
85 static int brw_interpret(const struct lu_env *env, struct ptlrpc_request *req,
86                          void *data, int rc);
87
88 void osc_pack_req_body(struct ptlrpc_request *req, struct obdo *oa)
89 {
90         struct ost_body *body;
91
92         body = req_capsule_client_get(&req->rq_pill, &RMF_OST_BODY);
93         LASSERT(body);
94
95         lustre_set_wire_obdo(&req->rq_import->imp_connect_data, &body->oa, oa);
96 }
97
98 static int osc_getattr(const struct lu_env *env, struct obd_export *exp,
99                        struct obdo *oa)
100 {
101         struct ptlrpc_request   *req;
102         struct ost_body         *body;
103         int                      rc;
104
105         ENTRY;
106         req = ptlrpc_request_alloc(class_exp2cliimp(exp), &RQF_OST_GETATTR);
107         if (req == NULL)
108                 RETURN(-ENOMEM);
109
110         rc = ptlrpc_request_pack(req, LUSTRE_OST_VERSION, OST_GETATTR);
111         if (rc) {
112                 ptlrpc_request_free(req);
113                 RETURN(rc);
114         }
115
116         osc_pack_req_body(req, oa);
117
118         ptlrpc_request_set_replen(req);
119
120         rc = ptlrpc_queue_wait(req);
121         if (rc)
122                 GOTO(out, rc);
123
124         body = req_capsule_server_get(&req->rq_pill, &RMF_OST_BODY);
125         if (body == NULL)
126                 GOTO(out, rc = -EPROTO);
127
128         CDEBUG(D_INODE, "mode: %o\n", body->oa.o_mode);
129         lustre_get_wire_obdo(&req->rq_import->imp_connect_data, oa, &body->oa);
130
131         oa->o_blksize = cli_brw_size(exp->exp_obd);
132         oa->o_valid |= OBD_MD_FLBLKSZ;
133
134         EXIT;
135 out:
136         ptlrpc_req_finished(req);
137
138         return rc;
139 }
140
141 static int osc_setattr(const struct lu_env *env, struct obd_export *exp,
142                        struct obdo *oa)
143 {
144         struct ptlrpc_request   *req;
145         struct ost_body         *body;
146         int                      rc;
147
148         ENTRY;
149         LASSERT(oa->o_valid & OBD_MD_FLGROUP);
150
151         req = ptlrpc_request_alloc(class_exp2cliimp(exp), &RQF_OST_SETATTR);
152         if (req == NULL)
153                 RETURN(-ENOMEM);
154
155         rc = ptlrpc_request_pack(req, LUSTRE_OST_VERSION, OST_SETATTR);
156         if (rc) {
157                 ptlrpc_request_free(req);
158                 RETURN(rc);
159         }
160
161         osc_pack_req_body(req, oa);
162
163         ptlrpc_request_set_replen(req);
164
165         rc = ptlrpc_queue_wait(req);
166         if (rc)
167                 GOTO(out, rc);
168
169         body = req_capsule_server_get(&req->rq_pill, &RMF_OST_BODY);
170         if (body == NULL)
171                 GOTO(out, rc = -EPROTO);
172
173         lustre_get_wire_obdo(&req->rq_import->imp_connect_data, oa, &body->oa);
174
175         EXIT;
176 out:
177         ptlrpc_req_finished(req);
178
179         RETURN(rc);
180 }
181
182 static int osc_setattr_interpret(const struct lu_env *env,
183                                  struct ptlrpc_request *req, void *args, int rc)
184 {
185         struct osc_setattr_args *sa = args;
186         struct ost_body *body;
187
188         ENTRY;
189
190         if (rc != 0)
191                 GOTO(out, rc);
192
193         body = req_capsule_server_get(&req->rq_pill, &RMF_OST_BODY);
194         if (body == NULL)
195                 GOTO(out, rc = -EPROTO);
196
197         lustre_get_wire_obdo(&req->rq_import->imp_connect_data, sa->sa_oa,
198                              &body->oa);
199 out:
200         rc = sa->sa_upcall(sa->sa_cookie, rc);
201         RETURN(rc);
202 }
203
204 int osc_setattr_async(struct obd_export *exp, struct obdo *oa,
205                       obd_enqueue_update_f upcall, void *cookie,
206                       struct ptlrpc_request_set *rqset)
207 {
208         struct ptlrpc_request   *req;
209         struct osc_setattr_args *sa;
210         int                      rc;
211
212         ENTRY;
213
214         req = ptlrpc_request_alloc(class_exp2cliimp(exp), &RQF_OST_SETATTR);
215         if (req == NULL)
216                 RETURN(-ENOMEM);
217
218         rc = ptlrpc_request_pack(req, LUSTRE_OST_VERSION, OST_SETATTR);
219         if (rc) {
220                 ptlrpc_request_free(req);
221                 RETURN(rc);
222         }
223
224         osc_pack_req_body(req, oa);
225
226         ptlrpc_request_set_replen(req);
227
228         /* do mds to ost setattr asynchronously */
229         if (!rqset) {
230                 /* Do not wait for response. */
231                 ptlrpcd_add_req(req);
232         } else {
233                 req->rq_interpret_reply = osc_setattr_interpret;
234
235                 CLASSERT(sizeof(*sa) <= sizeof(req->rq_async_args));
236                 sa = ptlrpc_req_async_args(req);
237                 sa->sa_oa = oa;
238                 sa->sa_upcall = upcall;
239                 sa->sa_cookie = cookie;
240
241                 if (rqset == PTLRPCD_SET)
242                         ptlrpcd_add_req(req);
243                 else
244                         ptlrpc_set_add_req(rqset, req);
245         }
246
247         RETURN(0);
248 }
249
250 static int osc_ladvise_interpret(const struct lu_env *env,
251                                  struct ptlrpc_request *req,
252                                  void *arg, int rc)
253 {
254         struct osc_ladvise_args *la = arg;
255         struct ost_body *body;
256         ENTRY;
257
258         if (rc != 0)
259                 GOTO(out, rc);
260
261         body = req_capsule_server_get(&req->rq_pill, &RMF_OST_BODY);
262         if (body == NULL)
263                 GOTO(out, rc = -EPROTO);
264
265         *la->la_oa = body->oa;
266 out:
267         rc = la->la_upcall(la->la_cookie, rc);
268         RETURN(rc);
269 }
270
271 /**
272  * If rqset is NULL, do not wait for response. Upcall and cookie could also
273  * be NULL in this case
274  */
275 int osc_ladvise_base(struct obd_export *exp, struct obdo *oa,
276                      struct ladvise_hdr *ladvise_hdr,
277                      obd_enqueue_update_f upcall, void *cookie,
278                      struct ptlrpc_request_set *rqset)
279 {
280         struct ptlrpc_request   *req;
281         struct ost_body         *body;
282         struct osc_ladvise_args *la;
283         int                      rc;
284         struct lu_ladvise       *req_ladvise;
285         struct lu_ladvise       *ladvise = ladvise_hdr->lah_advise;
286         int                      num_advise = ladvise_hdr->lah_count;
287         struct ladvise_hdr      *req_ladvise_hdr;
288         ENTRY;
289
290         req = ptlrpc_request_alloc(class_exp2cliimp(exp), &RQF_OST_LADVISE);
291         if (req == NULL)
292                 RETURN(-ENOMEM);
293
294         req_capsule_set_size(&req->rq_pill, &RMF_OST_LADVISE, RCL_CLIENT,
295                              num_advise * sizeof(*ladvise));
296         rc = ptlrpc_request_pack(req, LUSTRE_OST_VERSION, OST_LADVISE);
297         if (rc != 0) {
298                 ptlrpc_request_free(req);
299                 RETURN(rc);
300         }
301         req->rq_request_portal = OST_IO_PORTAL;
302         ptlrpc_at_set_req_timeout(req);
303
304         body = req_capsule_client_get(&req->rq_pill, &RMF_OST_BODY);
305         LASSERT(body);
306         lustre_set_wire_obdo(&req->rq_import->imp_connect_data, &body->oa,
307                              oa);
308
309         req_ladvise_hdr = req_capsule_client_get(&req->rq_pill,
310                                                  &RMF_OST_LADVISE_HDR);
311         memcpy(req_ladvise_hdr, ladvise_hdr, sizeof(*ladvise_hdr));
312
313         req_ladvise = req_capsule_client_get(&req->rq_pill, &RMF_OST_LADVISE);
314         memcpy(req_ladvise, ladvise, sizeof(*ladvise) * num_advise);
315         ptlrpc_request_set_replen(req);
316
317         if (rqset == NULL) {
318                 /* Do not wait for response. */
319                 ptlrpcd_add_req(req);
320                 RETURN(0);
321         }
322
323         req->rq_interpret_reply = osc_ladvise_interpret;
324         CLASSERT(sizeof(*la) <= sizeof(req->rq_async_args));
325         la = ptlrpc_req_async_args(req);
326         la->la_oa = oa;
327         la->la_upcall = upcall;
328         la->la_cookie = cookie;
329
330         if (rqset == PTLRPCD_SET)
331                 ptlrpcd_add_req(req);
332         else
333                 ptlrpc_set_add_req(rqset, req);
334
335         RETURN(0);
336 }
337
338 static int osc_create(const struct lu_env *env, struct obd_export *exp,
339                       struct obdo *oa)
340 {
341         struct ptlrpc_request *req;
342         struct ost_body       *body;
343         int                    rc;
344         ENTRY;
345
346         LASSERT(oa != NULL);
347         LASSERT(oa->o_valid & OBD_MD_FLGROUP);
348         LASSERT(fid_seq_is_echo(ostid_seq(&oa->o_oi)));
349
350         req = ptlrpc_request_alloc(class_exp2cliimp(exp), &RQF_OST_CREATE);
351         if (req == NULL)
352                 GOTO(out, rc = -ENOMEM);
353
354         rc = ptlrpc_request_pack(req, LUSTRE_OST_VERSION, OST_CREATE);
355         if (rc) {
356                 ptlrpc_request_free(req);
357                 GOTO(out, rc);
358         }
359
360         body = req_capsule_client_get(&req->rq_pill, &RMF_OST_BODY);
361         LASSERT(body);
362
363         lustre_set_wire_obdo(&req->rq_import->imp_connect_data, &body->oa, oa);
364
365         ptlrpc_request_set_replen(req);
366
367         rc = ptlrpc_queue_wait(req);
368         if (rc)
369                 GOTO(out_req, rc);
370
371         body = req_capsule_server_get(&req->rq_pill, &RMF_OST_BODY);
372         if (body == NULL)
373                 GOTO(out_req, rc = -EPROTO);
374
375         CDEBUG(D_INFO, "oa flags %x\n", oa->o_flags);
376         lustre_get_wire_obdo(&req->rq_import->imp_connect_data, oa, &body->oa);
377
378         oa->o_blksize = cli_brw_size(exp->exp_obd);
379         oa->o_valid |= OBD_MD_FLBLKSZ;
380
381         CDEBUG(D_HA, "transno: %lld\n",
382                lustre_msg_get_transno(req->rq_repmsg));
383 out_req:
384         ptlrpc_req_finished(req);
385 out:
386         RETURN(rc);
387 }
388
389 int osc_punch_send(struct obd_export *exp, struct obdo *oa,
390                    obd_enqueue_update_f upcall, void *cookie)
391 {
392         struct ptlrpc_request *req;
393         struct osc_setattr_args *sa;
394         struct obd_import *imp = class_exp2cliimp(exp);
395         struct ost_body *body;
396         int rc;
397
398         ENTRY;
399
400         req = ptlrpc_request_alloc(imp, &RQF_OST_PUNCH);
401         if (req == NULL)
402                 RETURN(-ENOMEM);
403
404         rc = ptlrpc_request_pack(req, LUSTRE_OST_VERSION, OST_PUNCH);
405         if (rc < 0) {
406                 ptlrpc_request_free(req);
407                 RETURN(rc);
408         }
409
410         osc_set_io_portal(req);
411
412         ptlrpc_at_set_req_timeout(req);
413
414         body = req_capsule_client_get(&req->rq_pill, &RMF_OST_BODY);
415
416         lustre_set_wire_obdo(&imp->imp_connect_data, &body->oa, oa);
417
418         ptlrpc_request_set_replen(req);
419
420         req->rq_interpret_reply = osc_setattr_interpret;
421         CLASSERT(sizeof(*sa) <= sizeof(req->rq_async_args));
422         sa = ptlrpc_req_async_args(req);
423         sa->sa_oa = oa;
424         sa->sa_upcall = upcall;
425         sa->sa_cookie = cookie;
426
427         ptlrpcd_add_req(req);
428
429         RETURN(0);
430 }
431 EXPORT_SYMBOL(osc_punch_send);
432
433 static int osc_sync_interpret(const struct lu_env *env,
434                               struct ptlrpc_request *req, void *args, int rc)
435 {
436         struct osc_fsync_args *fa = args;
437         struct ost_body *body;
438         struct cl_attr *attr = &osc_env_info(env)->oti_attr;
439         unsigned long valid = 0;
440         struct cl_object *obj;
441         ENTRY;
442
443         if (rc != 0)
444                 GOTO(out, rc);
445
446         body = req_capsule_server_get(&req->rq_pill, &RMF_OST_BODY);
447         if (body == NULL) {
448                 CERROR("can't unpack ost_body\n");
449                 GOTO(out, rc = -EPROTO);
450         }
451
452         *fa->fa_oa = body->oa;
453         obj = osc2cl(fa->fa_obj);
454
455         /* Update osc object's blocks attribute */
456         cl_object_attr_lock(obj);
457         if (body->oa.o_valid & OBD_MD_FLBLOCKS) {
458                 attr->cat_blocks = body->oa.o_blocks;
459                 valid |= CAT_BLOCKS;
460         }
461
462         if (valid != 0)
463                 cl_object_attr_update(env, obj, attr, valid);
464         cl_object_attr_unlock(obj);
465
466 out:
467         rc = fa->fa_upcall(fa->fa_cookie, rc);
468         RETURN(rc);
469 }
470
471 int osc_sync_base(struct osc_object *obj, struct obdo *oa,
472                   obd_enqueue_update_f upcall, void *cookie,
473                   struct ptlrpc_request_set *rqset)
474 {
475         struct obd_export     *exp = osc_export(obj);
476         struct ptlrpc_request *req;
477         struct ost_body       *body;
478         struct osc_fsync_args *fa;
479         int                    rc;
480         ENTRY;
481
482         req = ptlrpc_request_alloc(class_exp2cliimp(exp), &RQF_OST_SYNC);
483         if (req == NULL)
484                 RETURN(-ENOMEM);
485
486         rc = ptlrpc_request_pack(req, LUSTRE_OST_VERSION, OST_SYNC);
487         if (rc) {
488                 ptlrpc_request_free(req);
489                 RETURN(rc);
490         }
491
492         /* overload the size and blocks fields in the oa with start/end */
493         body = req_capsule_client_get(&req->rq_pill, &RMF_OST_BODY);
494         LASSERT(body);
495         lustre_set_wire_obdo(&req->rq_import->imp_connect_data, &body->oa, oa);
496
497         ptlrpc_request_set_replen(req);
498         req->rq_interpret_reply = osc_sync_interpret;
499
500         CLASSERT(sizeof(*fa) <= sizeof(req->rq_async_args));
501         fa = ptlrpc_req_async_args(req);
502         fa->fa_obj = obj;
503         fa->fa_oa = oa;
504         fa->fa_upcall = upcall;
505         fa->fa_cookie = cookie;
506
507         if (rqset == PTLRPCD_SET)
508                 ptlrpcd_add_req(req);
509         else
510                 ptlrpc_set_add_req(rqset, req);
511
512         RETURN (0);
513 }
514
515 /* Find and cancel locally locks matched by @mode in the resource found by
516  * @objid. Found locks are added into @cancel list. Returns the amount of
517  * locks added to @cancels list. */
518 static int osc_resource_get_unused(struct obd_export *exp, struct obdo *oa,
519                                    struct list_head *cancels,
520                                    enum ldlm_mode mode, __u64 lock_flags)
521 {
522         struct ldlm_namespace *ns = exp->exp_obd->obd_namespace;
523         struct ldlm_res_id res_id;
524         struct ldlm_resource *res;
525         int count;
526         ENTRY;
527
528         /* Return, i.e. cancel nothing, only if ELC is supported (flag in
529          * export) but disabled through procfs (flag in NS).
530          *
531          * This distinguishes from a case when ELC is not supported originally,
532          * when we still want to cancel locks in advance and just cancel them
533          * locally, without sending any RPC. */
534         if (exp_connect_cancelset(exp) && !ns_connect_cancelset(ns))
535                 RETURN(0);
536
537         ostid_build_res_name(&oa->o_oi, &res_id);
538         res = ldlm_resource_get(ns, NULL, &res_id, 0, 0);
539         if (IS_ERR(res))
540                 RETURN(0);
541
542         LDLM_RESOURCE_ADDREF(res);
543         count = ldlm_cancel_resource_local(res, cancels, NULL, mode,
544                                            lock_flags, 0, NULL);
545         LDLM_RESOURCE_DELREF(res);
546         ldlm_resource_putref(res);
547         RETURN(count);
548 }
549
550 static int osc_destroy_interpret(const struct lu_env *env,
551                                  struct ptlrpc_request *req, void *args, int rc)
552 {
553         struct client_obd *cli = &req->rq_import->imp_obd->u.cli;
554
555         atomic_dec(&cli->cl_destroy_in_flight);
556         wake_up(&cli->cl_destroy_waitq);
557
558         return 0;
559 }
560
561 static int osc_can_send_destroy(struct client_obd *cli)
562 {
563         if (atomic_inc_return(&cli->cl_destroy_in_flight) <=
564             cli->cl_max_rpcs_in_flight) {
565                 /* The destroy request can be sent */
566                 return 1;
567         }
568         if (atomic_dec_return(&cli->cl_destroy_in_flight) <
569             cli->cl_max_rpcs_in_flight) {
570                 /*
571                  * The counter has been modified between the two atomic
572                  * operations.
573                  */
574                 wake_up(&cli->cl_destroy_waitq);
575         }
576         return 0;
577 }
578
579 static int osc_destroy(const struct lu_env *env, struct obd_export *exp,
580                        struct obdo *oa)
581 {
582         struct client_obd     *cli = &exp->exp_obd->u.cli;
583         struct ptlrpc_request *req;
584         struct ost_body       *body;
585         struct list_head       cancels = LIST_HEAD_INIT(cancels);
586         int rc, count;
587         ENTRY;
588
589         if (!oa) {
590                 CDEBUG(D_INFO, "oa NULL\n");
591                 RETURN(-EINVAL);
592         }
593
594         count = osc_resource_get_unused(exp, oa, &cancels, LCK_PW,
595                                         LDLM_FL_DISCARD_DATA);
596
597         req = ptlrpc_request_alloc(class_exp2cliimp(exp), &RQF_OST_DESTROY);
598         if (req == NULL) {
599                 ldlm_lock_list_put(&cancels, l_bl_ast, count);
600                 RETURN(-ENOMEM);
601         }
602
603         rc = ldlm_prep_elc_req(exp, req, LUSTRE_OST_VERSION, OST_DESTROY,
604                                0, &cancels, count);
605         if (rc) {
606                 ptlrpc_request_free(req);
607                 RETURN(rc);
608         }
609
610         req->rq_request_portal = OST_IO_PORTAL; /* bug 7198 */
611         ptlrpc_at_set_req_timeout(req);
612
613         body = req_capsule_client_get(&req->rq_pill, &RMF_OST_BODY);
614         LASSERT(body);
615         lustre_set_wire_obdo(&req->rq_import->imp_connect_data, &body->oa, oa);
616
617         ptlrpc_request_set_replen(req);
618
619         req->rq_interpret_reply = osc_destroy_interpret;
620         if (!osc_can_send_destroy(cli)) {
621                 struct l_wait_info lwi = LWI_INTR(LWI_ON_SIGNAL_NOOP, NULL);
622
623                 /*
624                  * Wait until the number of on-going destroy RPCs drops
625                  * under max_rpc_in_flight
626                  */
627                 rc = l_wait_event_exclusive(cli->cl_destroy_waitq,
628                                             osc_can_send_destroy(cli), &lwi);
629                 if (rc) {
630                         ptlrpc_req_finished(req);
631                         RETURN(rc);
632                 }
633         }
634
635         /* Do not wait for response */
636         ptlrpcd_add_req(req);
637         RETURN(0);
638 }
639
640 static void osc_announce_cached(struct client_obd *cli, struct obdo *oa,
641                                 long writing_bytes)
642 {
643         u64 bits = OBD_MD_FLBLOCKS | OBD_MD_FLGRANT;
644
645         LASSERT(!(oa->o_valid & bits));
646
647         oa->o_valid |= bits;
648         spin_lock(&cli->cl_loi_list_lock);
649         if (OCD_HAS_FLAG(&cli->cl_import->imp_connect_data, GRANT_PARAM))
650                 oa->o_dirty = cli->cl_dirty_grant;
651         else
652                 oa->o_dirty = cli->cl_dirty_pages << PAGE_SHIFT;
653         if (unlikely(cli->cl_dirty_pages - cli->cl_dirty_transit >
654                      cli->cl_dirty_max_pages)) {
655                 CERROR("dirty %lu - %lu > dirty_max %lu\n",
656                        cli->cl_dirty_pages, cli->cl_dirty_transit,
657                        cli->cl_dirty_max_pages);
658                 oa->o_undirty = 0;
659         } else if (unlikely(atomic_long_read(&obd_dirty_pages) -
660                             atomic_long_read(&obd_dirty_transit_pages) >
661                             (long)(obd_max_dirty_pages + 1))) {
662                 /* The atomic_read() allowing the atomic_inc() are
663                  * not covered by a lock thus they may safely race and trip
664                  * this CERROR() unless we add in a small fudge factor (+1). */
665                 CERROR("%s: dirty %ld - %ld > system dirty_max %ld\n",
666                        cli_name(cli), atomic_long_read(&obd_dirty_pages),
667                        atomic_long_read(&obd_dirty_transit_pages),
668                        obd_max_dirty_pages);
669                 oa->o_undirty = 0;
670         } else if (unlikely(cli->cl_dirty_max_pages - cli->cl_dirty_pages >
671                             0x7fffffff)) {
672                 CERROR("dirty %lu - dirty_max %lu too big???\n",
673                        cli->cl_dirty_pages, cli->cl_dirty_max_pages);
674                 oa->o_undirty = 0;
675         } else {
676                 unsigned long nrpages;
677                 unsigned long undirty;
678
679                 nrpages = cli->cl_max_pages_per_rpc;
680                 nrpages *= cli->cl_max_rpcs_in_flight + 1;
681                 nrpages = max(nrpages, cli->cl_dirty_max_pages);
682                 undirty = nrpages << PAGE_SHIFT;
683                 if (OCD_HAS_FLAG(&cli->cl_import->imp_connect_data,
684                                  GRANT_PARAM)) {
685                         int nrextents;
686
687                         /* take extent tax into account when asking for more
688                          * grant space */
689                         nrextents = (nrpages + cli->cl_max_extent_pages - 1)  /
690                                      cli->cl_max_extent_pages;
691                         undirty += nrextents * cli->cl_grant_extent_tax;
692                 }
693                 /* Do not ask for more than OBD_MAX_GRANT - a margin for server
694                  * to add extent tax, etc.
695                  */
696                 oa->o_undirty = min(undirty, OBD_MAX_GRANT -
697                                     (PTLRPC_MAX_BRW_PAGES << PAGE_SHIFT)*4UL);
698         }
699         oa->o_grant = cli->cl_avail_grant + cli->cl_reserved_grant;
700         oa->o_dropped = cli->cl_lost_grant;
701         cli->cl_lost_grant = 0;
702         spin_unlock(&cli->cl_loi_list_lock);
703         CDEBUG(D_CACHE, "dirty: %llu undirty: %u dropped %u grant: %llu\n",
704                oa->o_dirty, oa->o_undirty, oa->o_dropped, oa->o_grant);
705 }
706
707 void osc_update_next_shrink(struct client_obd *cli)
708 {
709         cli->cl_next_shrink_grant = ktime_get_seconds() +
710                                     cli->cl_grant_shrink_interval;
711
712         CDEBUG(D_CACHE, "next time %lld to shrink grant\n",
713                cli->cl_next_shrink_grant);
714 }
715
716 static void __osc_update_grant(struct client_obd *cli, u64 grant)
717 {
718         spin_lock(&cli->cl_loi_list_lock);
719         cli->cl_avail_grant += grant;
720         spin_unlock(&cli->cl_loi_list_lock);
721 }
722
723 static void osc_update_grant(struct client_obd *cli, struct ost_body *body)
724 {
725         if (body->oa.o_valid & OBD_MD_FLGRANT) {
726                 CDEBUG(D_CACHE, "got %llu extra grant\n", body->oa.o_grant);
727                 __osc_update_grant(cli, body->oa.o_grant);
728         }
729 }
730
731 /**
732  * grant thread data for shrinking space.
733  */
734 struct grant_thread_data {
735         struct list_head        gtd_clients;
736         struct mutex            gtd_mutex;
737         unsigned long           gtd_stopped:1;
738 };
739 static struct grant_thread_data client_gtd;
740
741 static int osc_shrink_grant_interpret(const struct lu_env *env,
742                                       struct ptlrpc_request *req,
743                                       void *args, int rc)
744 {
745         struct osc_grant_args *aa = args;
746         struct client_obd *cli = &req->rq_import->imp_obd->u.cli;
747         struct ost_body *body;
748
749         if (rc != 0) {
750                 __osc_update_grant(cli, aa->aa_oa->o_grant);
751                 GOTO(out, rc);
752         }
753
754         body = req_capsule_server_get(&req->rq_pill, &RMF_OST_BODY);
755         LASSERT(body);
756         osc_update_grant(cli, body);
757 out:
758         OBD_SLAB_FREE_PTR(aa->aa_oa, osc_obdo_kmem);
759
760         return rc;
761 }
762
763 static void osc_shrink_grant_local(struct client_obd *cli, struct obdo *oa)
764 {
765         spin_lock(&cli->cl_loi_list_lock);
766         oa->o_grant = cli->cl_avail_grant / 4;
767         cli->cl_avail_grant -= oa->o_grant;
768         spin_unlock(&cli->cl_loi_list_lock);
769         if (!(oa->o_valid & OBD_MD_FLFLAGS)) {
770                 oa->o_valid |= OBD_MD_FLFLAGS;
771                 oa->o_flags = 0;
772         }
773         oa->o_flags |= OBD_FL_SHRINK_GRANT;
774         osc_update_next_shrink(cli);
775 }
776
777 /* Shrink the current grant, either from some large amount to enough for a
778  * full set of in-flight RPCs, or if we have already shrunk to that limit
779  * then to enough for a single RPC.  This avoids keeping more grant than
780  * needed, and avoids shrinking the grant piecemeal. */
781 static int osc_shrink_grant(struct client_obd *cli)
782 {
783         __u64 target_bytes = (cli->cl_max_rpcs_in_flight + 1) *
784                              (cli->cl_max_pages_per_rpc << PAGE_SHIFT);
785
786         spin_lock(&cli->cl_loi_list_lock);
787         if (cli->cl_avail_grant <= target_bytes)
788                 target_bytes = cli->cl_max_pages_per_rpc << PAGE_SHIFT;
789         spin_unlock(&cli->cl_loi_list_lock);
790
791         return osc_shrink_grant_to_target(cli, target_bytes);
792 }
793
794 int osc_shrink_grant_to_target(struct client_obd *cli, __u64 target_bytes)
795 {
796         int                     rc = 0;
797         struct ost_body        *body;
798         ENTRY;
799
800         spin_lock(&cli->cl_loi_list_lock);
801         /* Don't shrink if we are already above or below the desired limit
802          * We don't want to shrink below a single RPC, as that will negatively
803          * impact block allocation and long-term performance. */
804         if (target_bytes < cli->cl_max_pages_per_rpc << PAGE_SHIFT)
805                 target_bytes = cli->cl_max_pages_per_rpc << PAGE_SHIFT;
806
807         if (target_bytes >= cli->cl_avail_grant) {
808                 spin_unlock(&cli->cl_loi_list_lock);
809                 RETURN(0);
810         }
811         spin_unlock(&cli->cl_loi_list_lock);
812
813         OBD_ALLOC_PTR(body);
814         if (!body)
815                 RETURN(-ENOMEM);
816
817         osc_announce_cached(cli, &body->oa, 0);
818
819         spin_lock(&cli->cl_loi_list_lock);
820         if (target_bytes >= cli->cl_avail_grant) {
821                 /* available grant has changed since target calculation */
822                 spin_unlock(&cli->cl_loi_list_lock);
823                 GOTO(out_free, rc = 0);
824         }
825         body->oa.o_grant = cli->cl_avail_grant - target_bytes;
826         cli->cl_avail_grant = target_bytes;
827         spin_unlock(&cli->cl_loi_list_lock);
828         if (!(body->oa.o_valid & OBD_MD_FLFLAGS)) {
829                 body->oa.o_valid |= OBD_MD_FLFLAGS;
830                 body->oa.o_flags = 0;
831         }
832         body->oa.o_flags |= OBD_FL_SHRINK_GRANT;
833         osc_update_next_shrink(cli);
834
835         rc = osc_set_info_async(NULL, cli->cl_import->imp_obd->obd_self_export,
836                                 sizeof(KEY_GRANT_SHRINK), KEY_GRANT_SHRINK,
837                                 sizeof(*body), body, NULL);
838         if (rc != 0)
839                 __osc_update_grant(cli, body->oa.o_grant);
840 out_free:
841         OBD_FREE_PTR(body);
842         RETURN(rc);
843 }
844
845 static int osc_should_shrink_grant(struct client_obd *client)
846 {
847         time64_t next_shrink = client->cl_next_shrink_grant;
848
849         if (client->cl_import == NULL)
850                 return 0;
851
852         if ((client->cl_import->imp_connect_data.ocd_connect_flags &
853              OBD_CONNECT_GRANT_SHRINK) == 0)
854                 return 0;
855
856         if (ktime_get_seconds() >= next_shrink - 5) {
857                 /* Get the current RPC size directly, instead of going via:
858                  * cli_brw_size(obd->u.cli.cl_import->imp_obd->obd_self_export)
859                  * Keep comment here so that it can be found by searching. */
860                 int brw_size = client->cl_max_pages_per_rpc << PAGE_SHIFT;
861
862                 if (client->cl_import->imp_state == LUSTRE_IMP_FULL &&
863                     client->cl_avail_grant > brw_size)
864                         return 1;
865                 else
866                         osc_update_next_shrink(client);
867         }
868         return 0;
869 }
870
871 #define GRANT_SHRINK_RPC_BATCH  100
872
873 static struct delayed_work work;
874
875 static void osc_grant_work_handler(struct work_struct *data)
876 {
877         struct client_obd *cli;
878         int rpc_sent;
879         bool init_next_shrink = true;
880         time64_t next_shrink = ktime_get_seconds() + GRANT_SHRINK_INTERVAL;
881
882         rpc_sent = 0;
883         mutex_lock(&client_gtd.gtd_mutex);
884         list_for_each_entry(cli, &client_gtd.gtd_clients,
885                             cl_grant_chain) {
886                 if (++rpc_sent < GRANT_SHRINK_RPC_BATCH &&
887                     osc_should_shrink_grant(cli))
888                         osc_shrink_grant(cli);
889
890                 if (!init_next_shrink) {
891                         if (cli->cl_next_shrink_grant < next_shrink &&
892                             cli->cl_next_shrink_grant > ktime_get_seconds())
893                                 next_shrink = cli->cl_next_shrink_grant;
894                 } else {
895                         init_next_shrink = false;
896                         next_shrink = cli->cl_next_shrink_grant;
897                 }
898         }
899         mutex_unlock(&client_gtd.gtd_mutex);
900
901         if (client_gtd.gtd_stopped == 1)
902                 return;
903
904         if (next_shrink > ktime_get_seconds())
905                 schedule_delayed_work(&work, msecs_to_jiffies(
906                                         (next_shrink - ktime_get_seconds()) *
907                                         MSEC_PER_SEC));
908         else
909                 schedule_work(&work.work);
910 }
911
912 /**
913  * Start grant thread for returing grant to server for idle clients.
914  */
915 static int osc_start_grant_work(void)
916 {
917         client_gtd.gtd_stopped = 0;
918         mutex_init(&client_gtd.gtd_mutex);
919         INIT_LIST_HEAD(&client_gtd.gtd_clients);
920
921         INIT_DELAYED_WORK(&work, osc_grant_work_handler);
922         schedule_work(&work.work);
923
924         return 0;
925 }
926
927 static void osc_stop_grant_work(void)
928 {
929         client_gtd.gtd_stopped = 1;
930         cancel_delayed_work_sync(&work);
931 }
932
933 static void osc_add_grant_list(struct client_obd *client)
934 {
935         mutex_lock(&client_gtd.gtd_mutex);
936         list_add(&client->cl_grant_chain, &client_gtd.gtd_clients);
937         mutex_unlock(&client_gtd.gtd_mutex);
938 }
939
940 static void osc_del_grant_list(struct client_obd *client)
941 {
942         if (list_empty(&client->cl_grant_chain))
943                 return;
944
945         mutex_lock(&client_gtd.gtd_mutex);
946         list_del_init(&client->cl_grant_chain);
947         mutex_unlock(&client_gtd.gtd_mutex);
948 }
949
950 void osc_init_grant(struct client_obd *cli, struct obd_connect_data *ocd)
951 {
952         /*
953          * ocd_grant is the total grant amount we're expect to hold: if we've
954          * been evicted, it's the new avail_grant amount, cl_dirty_pages will
955          * drop to 0 as inflight RPCs fail out; otherwise, it's avail_grant +
956          * dirty.
957          *
958          * race is tolerable here: if we're evicted, but imp_state already
959          * left EVICTED state, then cl_dirty_pages must be 0 already.
960          */
961         spin_lock(&cli->cl_loi_list_lock);
962         cli->cl_avail_grant = ocd->ocd_grant;
963         if (cli->cl_import->imp_state != LUSTRE_IMP_EVICTED) {
964                 cli->cl_avail_grant -= cli->cl_reserved_grant;
965                 if (OCD_HAS_FLAG(ocd, GRANT_PARAM))
966                         cli->cl_avail_grant -= cli->cl_dirty_grant;
967                 else
968                         cli->cl_avail_grant -=
969                                         cli->cl_dirty_pages << PAGE_SHIFT;
970         }
971
972         if (OCD_HAS_FLAG(ocd, GRANT_PARAM)) {
973                 u64 size;
974                 int chunk_mask;
975
976                 /* overhead for each extent insertion */
977                 cli->cl_grant_extent_tax = ocd->ocd_grant_tax_kb << 10;
978                 /* determine the appropriate chunk size used by osc_extent. */
979                 cli->cl_chunkbits = max_t(int, PAGE_SHIFT,
980                                           ocd->ocd_grant_blkbits);
981                 /* max_pages_per_rpc must be chunk aligned */
982                 chunk_mask = ~((1 << (cli->cl_chunkbits - PAGE_SHIFT)) - 1);
983                 cli->cl_max_pages_per_rpc = (cli->cl_max_pages_per_rpc +
984                                              ~chunk_mask) & chunk_mask;
985                 /* determine maximum extent size, in #pages */
986                 size = (u64)ocd->ocd_grant_max_blks << ocd->ocd_grant_blkbits;
987                 cli->cl_max_extent_pages = size >> PAGE_SHIFT;
988                 if (cli->cl_max_extent_pages == 0)
989                         cli->cl_max_extent_pages = 1;
990         } else {
991                 cli->cl_grant_extent_tax = 0;
992                 cli->cl_chunkbits = PAGE_SHIFT;
993                 cli->cl_max_extent_pages = DT_MAX_BRW_PAGES;
994         }
995         spin_unlock(&cli->cl_loi_list_lock);
996
997         CDEBUG(D_CACHE, "%s, setting cl_avail_grant: %ld cl_lost_grant: %ld."
998                 "chunk bits: %d cl_max_extent_pages: %d\n",
999                 cli_name(cli),
1000                 cli->cl_avail_grant, cli->cl_lost_grant, cli->cl_chunkbits,
1001                 cli->cl_max_extent_pages);
1002
1003         if (OCD_HAS_FLAG(ocd, GRANT_SHRINK) && list_empty(&cli->cl_grant_chain))
1004                 osc_add_grant_list(cli);
1005 }
1006 EXPORT_SYMBOL(osc_init_grant);
1007
1008 /* We assume that the reason this OSC got a short read is because it read
1009  * beyond the end of a stripe file; i.e. lustre is reading a sparse file
1010  * via the LOV, and it _knows_ it's reading inside the file, it's just that
1011  * this stripe never got written at or beyond this stripe offset yet. */
1012 static void handle_short_read(int nob_read, size_t page_count,
1013                               struct brw_page **pga)
1014 {
1015         char *ptr;
1016         int i = 0;
1017
1018         /* skip bytes read OK */
1019         while (nob_read > 0) {
1020                 LASSERT (page_count > 0);
1021
1022                 if (pga[i]->count > nob_read) {
1023                         /* EOF inside this page */
1024                         ptr = kmap(pga[i]->pg) +
1025                                 (pga[i]->off & ~PAGE_MASK);
1026                         memset(ptr + nob_read, 0, pga[i]->count - nob_read);
1027                         kunmap(pga[i]->pg);
1028                         page_count--;
1029                         i++;
1030                         break;
1031                 }
1032
1033                 nob_read -= pga[i]->count;
1034                 page_count--;
1035                 i++;
1036         }
1037
1038         /* zero remaining pages */
1039         while (page_count-- > 0) {
1040                 ptr = kmap(pga[i]->pg) + (pga[i]->off & ~PAGE_MASK);
1041                 memset(ptr, 0, pga[i]->count);
1042                 kunmap(pga[i]->pg);
1043                 i++;
1044         }
1045 }
1046
1047 static int check_write_rcs(struct ptlrpc_request *req,
1048                            int requested_nob, int niocount,
1049                            size_t page_count, struct brw_page **pga)
1050 {
1051         int     i;
1052         __u32   *remote_rcs;
1053
1054         remote_rcs = req_capsule_server_sized_get(&req->rq_pill, &RMF_RCS,
1055                                                   sizeof(*remote_rcs) *
1056                                                   niocount);
1057         if (remote_rcs == NULL) {
1058                 CDEBUG(D_INFO, "Missing/short RC vector on BRW_WRITE reply\n");
1059                 return(-EPROTO);
1060         }
1061
1062         /* return error if any niobuf was in error */
1063         for (i = 0; i < niocount; i++) {
1064                 if ((int)remote_rcs[i] < 0)
1065                         return(remote_rcs[i]);
1066
1067                 if (remote_rcs[i] != 0) {
1068                         CDEBUG(D_INFO, "rc[%d] invalid (%d) req %p\n",
1069                                 i, remote_rcs[i], req);
1070                         return(-EPROTO);
1071                 }
1072         }
1073         if (req->rq_bulk != NULL &&
1074             req->rq_bulk->bd_nob_transferred != requested_nob) {
1075                 CERROR("Unexpected # bytes transferred: %d (requested %d)\n",
1076                        req->rq_bulk->bd_nob_transferred, requested_nob);
1077                 return(-EPROTO);
1078         }
1079
1080         return (0);
1081 }
1082
1083 static inline int can_merge_pages(struct brw_page *p1, struct brw_page *p2)
1084 {
1085         if (p1->flag != p2->flag) {
1086                 unsigned mask = ~(OBD_BRW_FROM_GRANT | OBD_BRW_NOCACHE |
1087                                   OBD_BRW_SYNC       | OBD_BRW_ASYNC   |
1088                                   OBD_BRW_NOQUOTA    | OBD_BRW_SOFT_SYNC);
1089
1090                 /* warn if we try to combine flags that we don't know to be
1091                  * safe to combine */
1092                 if (unlikely((p1->flag & mask) != (p2->flag & mask))) {
1093                         CWARN("Saw flags 0x%x and 0x%x in the same brw, please "
1094                               "report this at https://jira.whamcloud.com/\n",
1095                               p1->flag, p2->flag);
1096                 }
1097                 return 0;
1098         }
1099
1100         return (p1->off + p1->count == p2->off);
1101 }
1102
1103 static int osc_checksum_bulk_t10pi(const char *obd_name, int nob,
1104                                    size_t pg_count, struct brw_page **pga,
1105                                    int opc, obd_dif_csum_fn *fn,
1106                                    int sector_size,
1107                                    u32 *check_sum)
1108 {
1109         struct ahash_request *req;
1110         /* Used Adler as the default checksum type on top of DIF tags */
1111         unsigned char cfs_alg = cksum_obd2cfs(OBD_CKSUM_T10_TOP);
1112         struct page *__page;
1113         unsigned char *buffer;
1114         __u16 *guard_start;
1115         unsigned int bufsize;
1116         int guard_number;
1117         int used_number = 0;
1118         int used;
1119         u32 cksum;
1120         int rc = 0;
1121         int i = 0;
1122
1123         LASSERT(pg_count > 0);
1124
1125         __page = alloc_page(GFP_KERNEL);
1126         if (__page == NULL)
1127                 return -ENOMEM;
1128
1129         req = cfs_crypto_hash_init(cfs_alg, NULL, 0);
1130         if (IS_ERR(req)) {
1131                 rc = PTR_ERR(req);
1132                 CERROR("%s: unable to initialize checksum hash %s: rc = %d\n",
1133                        obd_name, cfs_crypto_hash_name(cfs_alg), rc);
1134                 GOTO(out, rc);
1135         }
1136
1137         buffer = kmap(__page);
1138         guard_start = (__u16 *)buffer;
1139         guard_number = PAGE_SIZE / sizeof(*guard_start);
1140         while (nob > 0 && pg_count > 0) {
1141                 unsigned int count = pga[i]->count > nob ? nob : pga[i]->count;
1142
1143                 /* corrupt the data before we compute the checksum, to
1144                  * simulate an OST->client data error */
1145                 if (unlikely(i == 0 && opc == OST_READ &&
1146                              OBD_FAIL_CHECK(OBD_FAIL_OSC_CHECKSUM_RECEIVE))) {
1147                         unsigned char *ptr = kmap(pga[i]->pg);
1148                         int off = pga[i]->off & ~PAGE_MASK;
1149
1150                         memcpy(ptr + off, "bad1", min_t(typeof(nob), 4, nob));
1151                         kunmap(pga[i]->pg);
1152                 }
1153
1154                 /*
1155                  * The left guard number should be able to hold checksums of a
1156                  * whole page
1157                  */
1158                 rc = obd_page_dif_generate_buffer(obd_name, pga[i]->pg,
1159                                                   pga[i]->off & ~PAGE_MASK,
1160                                                   count,
1161                                                   guard_start + used_number,
1162                                                   guard_number - used_number,
1163                                                   &used, sector_size,
1164                                                   fn);
1165                 if (rc)
1166                         break;
1167
1168                 used_number += used;
1169                 if (used_number == guard_number) {
1170                         cfs_crypto_hash_update_page(req, __page, 0,
1171                                 used_number * sizeof(*guard_start));
1172                         used_number = 0;
1173                 }
1174
1175                 nob -= pga[i]->count;
1176                 pg_count--;
1177                 i++;
1178         }
1179         kunmap(__page);
1180         if (rc)
1181                 GOTO(out, rc);
1182
1183         if (used_number != 0)
1184                 cfs_crypto_hash_update_page(req, __page, 0,
1185                         used_number * sizeof(*guard_start));
1186
1187         bufsize = sizeof(cksum);
1188         cfs_crypto_hash_final(req, (unsigned char *)&cksum, &bufsize);
1189
1190         /* For sending we only compute the wrong checksum instead
1191          * of corrupting the data so it is still correct on a redo */
1192         if (opc == OST_WRITE && OBD_FAIL_CHECK(OBD_FAIL_OSC_CHECKSUM_SEND))
1193                 cksum++;
1194
1195         *check_sum = cksum;
1196 out:
1197         __free_page(__page);
1198         return rc;
1199 }
1200
1201 static int osc_checksum_bulk(int nob, size_t pg_count,
1202                              struct brw_page **pga, int opc,
1203                              enum cksum_types cksum_type,
1204                              u32 *cksum)
1205 {
1206         int                             i = 0;
1207         struct ahash_request           *req;
1208         unsigned int                    bufsize;
1209         unsigned char                   cfs_alg = cksum_obd2cfs(cksum_type);
1210
1211         LASSERT(pg_count > 0);
1212
1213         req = cfs_crypto_hash_init(cfs_alg, NULL, 0);
1214         if (IS_ERR(req)) {
1215                 CERROR("Unable to initialize checksum hash %s\n",
1216                        cfs_crypto_hash_name(cfs_alg));
1217                 return PTR_ERR(req);
1218         }
1219
1220         while (nob > 0 && pg_count > 0) {
1221                 unsigned int count = pga[i]->count > nob ? nob : pga[i]->count;
1222
1223                 /* corrupt the data before we compute the checksum, to
1224                  * simulate an OST->client data error */
1225                 if (i == 0 && opc == OST_READ &&
1226                     OBD_FAIL_CHECK(OBD_FAIL_OSC_CHECKSUM_RECEIVE)) {
1227                         unsigned char *ptr = kmap(pga[i]->pg);
1228                         int off = pga[i]->off & ~PAGE_MASK;
1229
1230                         memcpy(ptr + off, "bad1", min_t(typeof(nob), 4, nob));
1231                         kunmap(pga[i]->pg);
1232                 }
1233                 cfs_crypto_hash_update_page(req, pga[i]->pg,
1234                                             pga[i]->off & ~PAGE_MASK,
1235                                             count);
1236                 LL_CDEBUG_PAGE(D_PAGE, pga[i]->pg, "off %d\n",
1237                                (int)(pga[i]->off & ~PAGE_MASK));
1238
1239                 nob -= pga[i]->count;
1240                 pg_count--;
1241                 i++;
1242         }
1243
1244         bufsize = sizeof(*cksum);
1245         cfs_crypto_hash_final(req, (unsigned char *)cksum, &bufsize);
1246
1247         /* For sending we only compute the wrong checksum instead
1248          * of corrupting the data so it is still correct on a redo */
1249         if (opc == OST_WRITE && OBD_FAIL_CHECK(OBD_FAIL_OSC_CHECKSUM_SEND))
1250                 (*cksum)++;
1251
1252         return 0;
1253 }
1254
1255 static int osc_checksum_bulk_rw(const char *obd_name,
1256                                 enum cksum_types cksum_type,
1257                                 int nob, size_t pg_count,
1258                                 struct brw_page **pga, int opc,
1259                                 u32 *check_sum)
1260 {
1261         obd_dif_csum_fn *fn = NULL;
1262         int sector_size = 0;
1263         int rc;
1264
1265         ENTRY;
1266         obd_t10_cksum2dif(cksum_type, &fn, &sector_size);
1267
1268         if (fn)
1269                 rc = osc_checksum_bulk_t10pi(obd_name, nob, pg_count, pga,
1270                                              opc, fn, sector_size, check_sum);
1271         else
1272                 rc = osc_checksum_bulk(nob, pg_count, pga, opc, cksum_type,
1273                                        check_sum);
1274
1275         RETURN(rc);
1276 }
1277
1278 static int
1279 osc_brw_prep_request(int cmd, struct client_obd *cli, struct obdo *oa,
1280                      u32 page_count, struct brw_page **pga,
1281                      struct ptlrpc_request **reqp, int resend)
1282 {
1283         struct ptlrpc_request   *req;
1284         struct ptlrpc_bulk_desc *desc;
1285         struct ost_body         *body;
1286         struct obd_ioobj        *ioobj;
1287         struct niobuf_remote    *niobuf;
1288         int niocount, i, requested_nob, opc, rc, short_io_size = 0;
1289         struct osc_brw_async_args *aa;
1290         struct req_capsule      *pill;
1291         struct brw_page *pg_prev;
1292         void *short_io_buf;
1293         const char *obd_name = cli->cl_import->imp_obd->obd_name;
1294
1295         ENTRY;
1296         if (OBD_FAIL_CHECK(OBD_FAIL_OSC_BRW_PREP_REQ))
1297                 RETURN(-ENOMEM); /* Recoverable */
1298         if (OBD_FAIL_CHECK(OBD_FAIL_OSC_BRW_PREP_REQ2))
1299                 RETURN(-EINVAL); /* Fatal */
1300
1301         if ((cmd & OBD_BRW_WRITE) != 0) {
1302                 opc = OST_WRITE;
1303                 req = ptlrpc_request_alloc_pool(cli->cl_import,
1304                                                 osc_rq_pool,
1305                                                 &RQF_OST_BRW_WRITE);
1306         } else {
1307                 opc = OST_READ;
1308                 req = ptlrpc_request_alloc(cli->cl_import, &RQF_OST_BRW_READ);
1309         }
1310         if (req == NULL)
1311                 RETURN(-ENOMEM);
1312
1313         for (niocount = i = 1; i < page_count; i++) {
1314                 if (!can_merge_pages(pga[i - 1], pga[i]))
1315                         niocount++;
1316         }
1317
1318         pill = &req->rq_pill;
1319         req_capsule_set_size(pill, &RMF_OBD_IOOBJ, RCL_CLIENT,
1320                              sizeof(*ioobj));
1321         req_capsule_set_size(pill, &RMF_NIOBUF_REMOTE, RCL_CLIENT,
1322                              niocount * sizeof(*niobuf));
1323
1324         for (i = 0; i < page_count; i++)
1325                 short_io_size += pga[i]->count;
1326
1327         /* Check if read/write is small enough to be a short io. */
1328         if (short_io_size > cli->cl_max_short_io_bytes || niocount > 1 ||
1329             !imp_connect_shortio(cli->cl_import))
1330                 short_io_size = 0;
1331
1332         req_capsule_set_size(pill, &RMF_SHORT_IO, RCL_CLIENT,
1333                              opc == OST_READ ? 0 : short_io_size);
1334         if (opc == OST_READ)
1335                 req_capsule_set_size(pill, &RMF_SHORT_IO, RCL_SERVER,
1336                                      short_io_size);
1337
1338         rc = ptlrpc_request_pack(req, LUSTRE_OST_VERSION, opc);
1339         if (rc) {
1340                 ptlrpc_request_free(req);
1341                 RETURN(rc);
1342         }
1343         osc_set_io_portal(req);
1344
1345         ptlrpc_at_set_req_timeout(req);
1346         /* ask ptlrpc not to resend on EINPROGRESS since BRWs have their own
1347          * retry logic */
1348         req->rq_no_retry_einprogress = 1;
1349
1350         if (short_io_size != 0) {
1351                 desc = NULL;
1352                 short_io_buf = NULL;
1353                 goto no_bulk;
1354         }
1355
1356         desc = ptlrpc_prep_bulk_imp(req, page_count,
1357                 cli->cl_import->imp_connect_data.ocd_brw_size >> LNET_MTU_BITS,
1358                 (opc == OST_WRITE ? PTLRPC_BULK_GET_SOURCE :
1359                         PTLRPC_BULK_PUT_SINK) |
1360                         PTLRPC_BULK_BUF_KIOV,
1361                 OST_BULK_PORTAL,
1362                 &ptlrpc_bulk_kiov_pin_ops);
1363
1364         if (desc == NULL)
1365                 GOTO(out, rc = -ENOMEM);
1366         /* NB request now owns desc and will free it when it gets freed */
1367 no_bulk:
1368         body = req_capsule_client_get(pill, &RMF_OST_BODY);
1369         ioobj = req_capsule_client_get(pill, &RMF_OBD_IOOBJ);
1370         niobuf = req_capsule_client_get(pill, &RMF_NIOBUF_REMOTE);
1371         LASSERT(body != NULL && ioobj != NULL && niobuf != NULL);
1372
1373         lustre_set_wire_obdo(&req->rq_import->imp_connect_data, &body->oa, oa);
1374
1375         /* For READ and WRITE, we can't fill o_uid and o_gid using from_kuid()
1376          * and from_kgid(), because they are asynchronous. Fortunately, variable
1377          * oa contains valid o_uid and o_gid in these two operations.
1378          * Besides, filling o_uid and o_gid is enough for nrs-tbf, see LU-9658.
1379          * OBD_MD_FLUID and OBD_MD_FLUID is not set in order to avoid breaking
1380          * other process logic */
1381         body->oa.o_uid = oa->o_uid;
1382         body->oa.o_gid = oa->o_gid;
1383
1384         obdo_to_ioobj(oa, ioobj);
1385         ioobj->ioo_bufcnt = niocount;
1386         /* The high bits of ioo_max_brw tells server _maximum_ number of bulks
1387          * that might be send for this request.  The actual number is decided
1388          * when the RPC is finally sent in ptlrpc_register_bulk(). It sends
1389          * "max - 1" for old client compatibility sending "0", and also so the
1390          * the actual maximum is a power-of-two number, not one less. LU-1431 */
1391         if (desc != NULL)
1392                 ioobj_max_brw_set(ioobj, desc->bd_md_max_brw);
1393         else /* short io */
1394                 ioobj_max_brw_set(ioobj, 0);
1395
1396         if (short_io_size != 0) {
1397                 if ((body->oa.o_valid & OBD_MD_FLFLAGS) == 0) {
1398                         body->oa.o_valid |= OBD_MD_FLFLAGS;
1399                         body->oa.o_flags = 0;
1400                 }
1401                 body->oa.o_flags |= OBD_FL_SHORT_IO;
1402                 CDEBUG(D_CACHE, "Using short io for data transfer, size = %d\n",
1403                        short_io_size);
1404                 if (opc == OST_WRITE) {
1405                         short_io_buf = req_capsule_client_get(pill,
1406                                                               &RMF_SHORT_IO);
1407                         LASSERT(short_io_buf != NULL);
1408                 }
1409         }
1410
1411         LASSERT(page_count > 0);
1412         pg_prev = pga[0];
1413         for (requested_nob = i = 0; i < page_count; i++, niobuf++) {
1414                 struct brw_page *pg = pga[i];
1415                 int poff = pg->off & ~PAGE_MASK;
1416
1417                 LASSERT(pg->count > 0);
1418                 /* make sure there is no gap in the middle of page array */
1419                 LASSERTF(page_count == 1 ||
1420                          (ergo(i == 0, poff + pg->count == PAGE_SIZE) &&
1421                           ergo(i > 0 && i < page_count - 1,
1422                                poff == 0 && pg->count == PAGE_SIZE)   &&
1423                           ergo(i == page_count - 1, poff == 0)),
1424                          "i: %d/%d pg: %p off: %llu, count: %u\n",
1425                          i, page_count, pg, pg->off, pg->count);
1426                 LASSERTF(i == 0 || pg->off > pg_prev->off,
1427                          "i %d p_c %u pg %p [pri %lu ind %lu] off %llu"
1428                          " prev_pg %p [pri %lu ind %lu] off %llu\n",
1429                          i, page_count,
1430                          pg->pg, page_private(pg->pg), pg->pg->index, pg->off,
1431                          pg_prev->pg, page_private(pg_prev->pg),
1432                          pg_prev->pg->index, pg_prev->off);
1433                 LASSERT((pga[0]->flag & OBD_BRW_SRVLOCK) ==
1434                         (pg->flag & OBD_BRW_SRVLOCK));
1435                 if (short_io_size != 0 && opc == OST_WRITE) {
1436                         unsigned char *ptr = ll_kmap_atomic(pg->pg, KM_USER0);
1437
1438                         LASSERT(short_io_size >= requested_nob + pg->count);
1439                         memcpy(short_io_buf + requested_nob,
1440                                ptr + poff,
1441                                pg->count);
1442                         ll_kunmap_atomic(ptr, KM_USER0);
1443                 } else if (short_io_size == 0) {
1444                         desc->bd_frag_ops->add_kiov_frag(desc, pg->pg, poff,
1445                                                          pg->count);
1446                 }
1447                 requested_nob += pg->count;
1448
1449                 if (i > 0 && can_merge_pages(pg_prev, pg)) {
1450                         niobuf--;
1451                         niobuf->rnb_len += pg->count;
1452                 } else {
1453                         niobuf->rnb_offset = pg->off;
1454                         niobuf->rnb_len    = pg->count;
1455                         niobuf->rnb_flags  = pg->flag;
1456                 }
1457                 pg_prev = pg;
1458         }
1459
1460         LASSERTF((void *)(niobuf - niocount) ==
1461                 req_capsule_client_get(&req->rq_pill, &RMF_NIOBUF_REMOTE),
1462                 "want %p - real %p\n", req_capsule_client_get(&req->rq_pill,
1463                 &RMF_NIOBUF_REMOTE), (void *)(niobuf - niocount));
1464
1465         osc_announce_cached(cli, &body->oa, opc == OST_WRITE ? requested_nob:0);
1466         if (resend) {
1467                 if ((body->oa.o_valid & OBD_MD_FLFLAGS) == 0) {
1468                         body->oa.o_valid |= OBD_MD_FLFLAGS;
1469                         body->oa.o_flags = 0;
1470                 }
1471                 body->oa.o_flags |= OBD_FL_RECOV_RESEND;
1472         }
1473
1474         if (osc_should_shrink_grant(cli))
1475                 osc_shrink_grant_local(cli, &body->oa);
1476
1477         /* size[REQ_REC_OFF] still sizeof (*body) */
1478         if (opc == OST_WRITE) {
1479                 if (cli->cl_checksum &&
1480                     !sptlrpc_flavor_has_bulk(&req->rq_flvr)) {
1481                         /* store cl_cksum_type in a local variable since
1482                          * it can be changed via lprocfs */
1483                         enum cksum_types cksum_type = cli->cl_cksum_type;
1484
1485                         if ((body->oa.o_valid & OBD_MD_FLFLAGS) == 0)
1486                                 body->oa.o_flags = 0;
1487
1488                         body->oa.o_flags |= obd_cksum_type_pack(obd_name,
1489                                                                 cksum_type);
1490                         body->oa.o_valid |= OBD_MD_FLCKSUM | OBD_MD_FLFLAGS;
1491
1492                         rc = osc_checksum_bulk_rw(obd_name, cksum_type,
1493                                                   requested_nob, page_count,
1494                                                   pga, OST_WRITE,
1495                                                   &body->oa.o_cksum);
1496                         if (rc < 0) {
1497                                 CDEBUG(D_PAGE, "failed to checksum, rc = %d\n",
1498                                        rc);
1499                                 GOTO(out, rc);
1500                         }
1501                         CDEBUG(D_PAGE, "checksum at write origin: %x\n",
1502                                body->oa.o_cksum);
1503
1504                         /* save this in 'oa', too, for later checking */
1505                         oa->o_valid |= OBD_MD_FLCKSUM | OBD_MD_FLFLAGS;
1506                         oa->o_flags |= obd_cksum_type_pack(obd_name,
1507                                                            cksum_type);
1508                 } else {
1509                         /* clear out the checksum flag, in case this is a
1510                          * resend but cl_checksum is no longer set. b=11238 */
1511                         oa->o_valid &= ~OBD_MD_FLCKSUM;
1512                 }
1513                 oa->o_cksum = body->oa.o_cksum;
1514                 /* 1 RC per niobuf */
1515                 req_capsule_set_size(pill, &RMF_RCS, RCL_SERVER,
1516                                      sizeof(__u32) * niocount);
1517         } else {
1518                 if (cli->cl_checksum &&
1519                     !sptlrpc_flavor_has_bulk(&req->rq_flvr)) {
1520                         if ((body->oa.o_valid & OBD_MD_FLFLAGS) == 0)
1521                                 body->oa.o_flags = 0;
1522                         body->oa.o_flags |= obd_cksum_type_pack(obd_name,
1523                                 cli->cl_cksum_type);
1524                         body->oa.o_valid |= OBD_MD_FLCKSUM | OBD_MD_FLFLAGS;
1525                 }
1526
1527                 /* Client cksum has been already copied to wire obdo in previous
1528                  * lustre_set_wire_obdo(), and in the case a bulk-read is being
1529                  * resent due to cksum error, this will allow Server to
1530                  * check+dump pages on its side */
1531         }
1532         ptlrpc_request_set_replen(req);
1533
1534         CLASSERT(sizeof(*aa) <= sizeof(req->rq_async_args));
1535         aa = ptlrpc_req_async_args(req);
1536         aa->aa_oa = oa;
1537         aa->aa_requested_nob = requested_nob;
1538         aa->aa_nio_count = niocount;
1539         aa->aa_page_count = page_count;
1540         aa->aa_resends = 0;
1541         aa->aa_ppga = pga;
1542         aa->aa_cli = cli;
1543         INIT_LIST_HEAD(&aa->aa_oaps);
1544
1545         *reqp = req;
1546         niobuf = req_capsule_client_get(pill, &RMF_NIOBUF_REMOTE);
1547         CDEBUG(D_RPCTRACE, "brw rpc %p - object "DOSTID" offset %lld<>%lld\n",
1548                 req, POSTID(&oa->o_oi), niobuf[0].rnb_offset,
1549                 niobuf[niocount - 1].rnb_offset + niobuf[niocount - 1].rnb_len);
1550         RETURN(0);
1551
1552  out:
1553         ptlrpc_req_finished(req);
1554         RETURN(rc);
1555 }
1556
1557 char dbgcksum_file_name[PATH_MAX];
1558
1559 static void dump_all_bulk_pages(struct obdo *oa, __u32 page_count,
1560                                 struct brw_page **pga, __u32 server_cksum,
1561                                 __u32 client_cksum)
1562 {
1563         struct file *filp;
1564         int rc, i;
1565         unsigned int len;
1566         char *buf;
1567
1568         /* will only keep dump of pages on first error for the same range in
1569          * file/fid, not during the resends/retries. */
1570         snprintf(dbgcksum_file_name, sizeof(dbgcksum_file_name),
1571                  "%s-checksum_dump-osc-"DFID":[%llu-%llu]-%x-%x",
1572                  (strncmp(libcfs_debug_file_path_arr, "NONE", 4) != 0 ?
1573                   libcfs_debug_file_path_arr :
1574                   LIBCFS_DEBUG_FILE_PATH_DEFAULT),
1575                  oa->o_valid & OBD_MD_FLFID ? oa->o_parent_seq : 0ULL,
1576                  oa->o_valid & OBD_MD_FLFID ? oa->o_parent_oid : 0,
1577                  oa->o_valid & OBD_MD_FLFID ? oa->o_parent_ver : 0,
1578                  pga[0]->off,
1579                  pga[page_count-1]->off + pga[page_count-1]->count - 1,
1580                  client_cksum, server_cksum);
1581         filp = filp_open(dbgcksum_file_name,
1582                          O_CREAT | O_EXCL | O_WRONLY | O_LARGEFILE, 0600);
1583         if (IS_ERR(filp)) {
1584                 rc = PTR_ERR(filp);
1585                 if (rc == -EEXIST)
1586                         CDEBUG(D_INFO, "%s: can't open to dump pages with "
1587                                "checksum error: rc = %d\n", dbgcksum_file_name,
1588                                rc);
1589                 else
1590                         CERROR("%s: can't open to dump pages with checksum "
1591                                "error: rc = %d\n", dbgcksum_file_name, rc);
1592                 return;
1593         }
1594
1595         for (i = 0; i < page_count; i++) {
1596                 len = pga[i]->count;
1597                 buf = kmap(pga[i]->pg);
1598                 while (len != 0) {
1599                         rc = cfs_kernel_write(filp, buf, len, &filp->f_pos);
1600                         if (rc < 0) {
1601                                 CERROR("%s: wanted to write %u but got %d "
1602                                        "error\n", dbgcksum_file_name, len, rc);
1603                                 break;
1604                         }
1605                         len -= rc;
1606                         buf += rc;
1607                         CDEBUG(D_INFO, "%s: wrote %d bytes\n",
1608                                dbgcksum_file_name, rc);
1609                 }
1610                 kunmap(pga[i]->pg);
1611         }
1612
1613         rc = ll_vfs_fsync_range(filp, 0, LLONG_MAX, 1);
1614         if (rc)
1615                 CERROR("%s: sync returns %d\n", dbgcksum_file_name, rc);
1616         filp_close(filp, NULL);
1617         return;
1618 }
1619
1620 static int
1621 check_write_checksum(struct obdo *oa, const struct lnet_process_id *peer,
1622                      __u32 client_cksum, __u32 server_cksum,
1623                      struct osc_brw_async_args *aa)
1624 {
1625         const char *obd_name = aa->aa_cli->cl_import->imp_obd->obd_name;
1626         enum cksum_types cksum_type;
1627         obd_dif_csum_fn *fn = NULL;
1628         int sector_size = 0;
1629         bool t10pi = false;
1630         __u32 new_cksum;
1631         char *msg;
1632         int rc;
1633
1634         if (server_cksum == client_cksum) {
1635                 CDEBUG(D_PAGE, "checksum %x confirmed\n", client_cksum);
1636                 return 0;
1637         }
1638
1639         if (aa->aa_cli->cl_checksum_dump)
1640                 dump_all_bulk_pages(oa, aa->aa_page_count, aa->aa_ppga,
1641                                     server_cksum, client_cksum);
1642
1643         cksum_type = obd_cksum_type_unpack(oa->o_valid & OBD_MD_FLFLAGS ?
1644                                            oa->o_flags : 0);
1645
1646         switch (cksum_type) {
1647         case OBD_CKSUM_T10IP512:
1648                 t10pi = true;
1649                 fn = obd_dif_ip_fn;
1650                 sector_size = 512;
1651                 break;
1652         case OBD_CKSUM_T10IP4K:
1653                 t10pi = true;
1654                 fn = obd_dif_ip_fn;
1655                 sector_size = 4096;
1656                 break;
1657         case OBD_CKSUM_T10CRC512:
1658                 t10pi = true;
1659                 fn = obd_dif_crc_fn;
1660                 sector_size = 512;
1661                 break;
1662         case OBD_CKSUM_T10CRC4K:
1663                 t10pi = true;
1664                 fn = obd_dif_crc_fn;
1665                 sector_size = 4096;
1666                 break;
1667         default:
1668                 break;
1669         }
1670
1671         if (t10pi)
1672                 rc = osc_checksum_bulk_t10pi(obd_name, aa->aa_requested_nob,
1673                                              aa->aa_page_count,
1674                                              aa->aa_ppga,
1675                                              OST_WRITE,
1676                                              fn,
1677                                              sector_size,
1678                                              &new_cksum);
1679         else
1680                 rc = osc_checksum_bulk(aa->aa_requested_nob, aa->aa_page_count,
1681                                        aa->aa_ppga, OST_WRITE, cksum_type,
1682                                        &new_cksum);
1683
1684         if (rc < 0)
1685                 msg = "failed to calculate the client write checksum";
1686         else if (cksum_type != obd_cksum_type_unpack(aa->aa_oa->o_flags))
1687                 msg = "the server did not use the checksum type specified in "
1688                       "the original request - likely a protocol problem";
1689         else if (new_cksum == server_cksum)
1690                 msg = "changed on the client after we checksummed it - "
1691                       "likely false positive due to mmap IO (bug 11742)";
1692         else if (new_cksum == client_cksum)
1693                 msg = "changed in transit before arrival at OST";
1694         else
1695                 msg = "changed in transit AND doesn't match the original - "
1696                       "likely false positive due to mmap IO (bug 11742)";
1697
1698         LCONSOLE_ERROR_MSG(0x132, "%s: BAD WRITE CHECKSUM: %s: from %s inode "
1699                            DFID " object "DOSTID" extent [%llu-%llu], original "
1700                            "client csum %x (type %x), server csum %x (type %x),"
1701                            " client csum now %x\n",
1702                            obd_name, msg, libcfs_nid2str(peer->nid),
1703                            oa->o_valid & OBD_MD_FLFID ? oa->o_parent_seq : (__u64)0,
1704                            oa->o_valid & OBD_MD_FLFID ? oa->o_parent_oid : 0,
1705                            oa->o_valid & OBD_MD_FLFID ? oa->o_parent_ver : 0,
1706                            POSTID(&oa->o_oi), aa->aa_ppga[0]->off,
1707                            aa->aa_ppga[aa->aa_page_count - 1]->off +
1708                                 aa->aa_ppga[aa->aa_page_count-1]->count - 1,
1709                            client_cksum,
1710                            obd_cksum_type_unpack(aa->aa_oa->o_flags),
1711                            server_cksum, cksum_type, new_cksum);
1712         return 1;
1713 }
1714
1715 /* Note rc enters this function as number of bytes transferred */
1716 static int osc_brw_fini_request(struct ptlrpc_request *req, int rc)
1717 {
1718         struct osc_brw_async_args *aa = (void *)&req->rq_async_args;
1719         struct client_obd *cli = aa->aa_cli;
1720         const char *obd_name = cli->cl_import->imp_obd->obd_name;
1721         const struct lnet_process_id *peer =
1722                 &req->rq_import->imp_connection->c_peer;
1723         struct ost_body *body;
1724         u32 client_cksum = 0;
1725         ENTRY;
1726
1727         if (rc < 0 && rc != -EDQUOT) {
1728                 DEBUG_REQ(D_INFO, req, "Failed request with rc = %d\n", rc);
1729                 RETURN(rc);
1730         }
1731
1732         LASSERTF(req->rq_repmsg != NULL, "rc = %d\n", rc);
1733         body = req_capsule_server_get(&req->rq_pill, &RMF_OST_BODY);
1734         if (body == NULL) {
1735                 DEBUG_REQ(D_INFO, req, "Can't unpack body\n");
1736                 RETURN(-EPROTO);
1737         }
1738
1739         /* set/clear over quota flag for a uid/gid/projid */
1740         if (lustre_msg_get_opc(req->rq_reqmsg) == OST_WRITE &&
1741             body->oa.o_valid & (OBD_MD_FLALLQUOTA)) {
1742                 unsigned qid[LL_MAXQUOTAS] = {
1743                                          body->oa.o_uid, body->oa.o_gid,
1744                                          body->oa.o_projid };
1745                 CDEBUG(D_QUOTA, "setdq for [%u %u %u] with valid %#llx, flags %x\n",
1746                        body->oa.o_uid, body->oa.o_gid, body->oa.o_projid,
1747                        body->oa.o_valid, body->oa.o_flags);
1748                        osc_quota_setdq(cli, qid, body->oa.o_valid,
1749                                        body->oa.o_flags);
1750         }
1751
1752         osc_update_grant(cli, body);
1753
1754         if (rc < 0)
1755                 RETURN(rc);
1756
1757         if (aa->aa_oa->o_valid & OBD_MD_FLCKSUM)
1758                 client_cksum = aa->aa_oa->o_cksum; /* save for later */
1759
1760         if (lustre_msg_get_opc(req->rq_reqmsg) == OST_WRITE) {
1761                 if (rc > 0) {
1762                         CERROR("Unexpected +ve rc %d\n", rc);
1763                         RETURN(-EPROTO);
1764                 }
1765
1766                 if (req->rq_bulk != NULL &&
1767                     sptlrpc_cli_unwrap_bulk_write(req, req->rq_bulk))
1768                         RETURN(-EAGAIN);
1769
1770                 if ((aa->aa_oa->o_valid & OBD_MD_FLCKSUM) && client_cksum &&
1771                     check_write_checksum(&body->oa, peer, client_cksum,
1772                                          body->oa.o_cksum, aa))
1773                         RETURN(-EAGAIN);
1774
1775                 rc = check_write_rcs(req, aa->aa_requested_nob,aa->aa_nio_count,
1776                                      aa->aa_page_count, aa->aa_ppga);
1777                 GOTO(out, rc);
1778         }
1779
1780         /* The rest of this function executes only for OST_READs */
1781
1782         if (req->rq_bulk == NULL) {
1783                 rc = req_capsule_get_size(&req->rq_pill, &RMF_SHORT_IO,
1784                                           RCL_SERVER);
1785                 LASSERT(rc == req->rq_status);
1786         } else {
1787                 /* if unwrap_bulk failed, return -EAGAIN to retry */
1788                 rc = sptlrpc_cli_unwrap_bulk_read(req, req->rq_bulk, rc);
1789         }
1790         if (rc < 0)
1791                 GOTO(out, rc = -EAGAIN);
1792
1793         if (rc > aa->aa_requested_nob) {
1794                 CERROR("Unexpected rc %d (%d requested)\n", rc,
1795                        aa->aa_requested_nob);
1796                 RETURN(-EPROTO);
1797         }
1798
1799         if (req->rq_bulk != NULL && rc != req->rq_bulk->bd_nob_transferred) {
1800                 CERROR ("Unexpected rc %d (%d transferred)\n",
1801                         rc, req->rq_bulk->bd_nob_transferred);
1802                 return (-EPROTO);
1803         }
1804
1805         if (req->rq_bulk == NULL) {
1806                 /* short io */
1807                 int nob, pg_count, i = 0;
1808                 unsigned char *buf;
1809
1810                 CDEBUG(D_CACHE, "Using short io read, size %d\n", rc);
1811                 pg_count = aa->aa_page_count;
1812                 buf = req_capsule_server_sized_get(&req->rq_pill, &RMF_SHORT_IO,
1813                                                    rc);
1814                 nob = rc;
1815                 while (nob > 0 && pg_count > 0) {
1816                         unsigned char *ptr;
1817                         int count = aa->aa_ppga[i]->count > nob ?
1818                                     nob : aa->aa_ppga[i]->count;
1819
1820                         CDEBUG(D_CACHE, "page %p count %d\n",
1821                                aa->aa_ppga[i]->pg, count);
1822                         ptr = ll_kmap_atomic(aa->aa_ppga[i]->pg, KM_USER0);
1823                         memcpy(ptr + (aa->aa_ppga[i]->off & ~PAGE_MASK), buf,
1824                                count);
1825                         ll_kunmap_atomic((void *) ptr, KM_USER0);
1826
1827                         buf += count;
1828                         nob -= count;
1829                         i++;
1830                         pg_count--;
1831                 }
1832         }
1833
1834         if (rc < aa->aa_requested_nob)
1835                 handle_short_read(rc, aa->aa_page_count, aa->aa_ppga);
1836
1837         if (body->oa.o_valid & OBD_MD_FLCKSUM) {
1838                 static int cksum_counter;
1839                 u32        server_cksum = body->oa.o_cksum;
1840                 char      *via = "";
1841                 char      *router = "";
1842                 enum cksum_types cksum_type;
1843                 u32 o_flags = body->oa.o_valid & OBD_MD_FLFLAGS ?
1844                         body->oa.o_flags : 0;
1845
1846                 cksum_type = obd_cksum_type_unpack(o_flags);
1847                 rc = osc_checksum_bulk_rw(obd_name, cksum_type, rc,
1848                                           aa->aa_page_count, aa->aa_ppga,
1849                                           OST_READ, &client_cksum);
1850                 if (rc < 0)
1851                         GOTO(out, rc);
1852
1853                 if (req->rq_bulk != NULL &&
1854                     peer->nid != req->rq_bulk->bd_sender) {
1855                         via = " via ";
1856                         router = libcfs_nid2str(req->rq_bulk->bd_sender);
1857                 }
1858
1859                 if (server_cksum != client_cksum) {
1860                         struct ost_body *clbody;
1861                         u32 page_count = aa->aa_page_count;
1862
1863                         clbody = req_capsule_client_get(&req->rq_pill,
1864                                                         &RMF_OST_BODY);
1865                         if (cli->cl_checksum_dump)
1866                                 dump_all_bulk_pages(&clbody->oa, page_count,
1867                                                     aa->aa_ppga, server_cksum,
1868                                                     client_cksum);
1869
1870                         LCONSOLE_ERROR_MSG(0x133, "%s: BAD READ CHECKSUM: from "
1871                                            "%s%s%s inode "DFID" object "DOSTID
1872                                            " extent [%llu-%llu], client %x, "
1873                                            "server %x, cksum_type %x\n",
1874                                            obd_name,
1875                                            libcfs_nid2str(peer->nid),
1876                                            via, router,
1877                                            clbody->oa.o_valid & OBD_MD_FLFID ?
1878                                                 clbody->oa.o_parent_seq : 0ULL,
1879                                            clbody->oa.o_valid & OBD_MD_FLFID ?
1880                                                 clbody->oa.o_parent_oid : 0,
1881                                            clbody->oa.o_valid & OBD_MD_FLFID ?
1882                                                 clbody->oa.o_parent_ver : 0,
1883                                            POSTID(&body->oa.o_oi),
1884                                            aa->aa_ppga[0]->off,
1885                                            aa->aa_ppga[page_count-1]->off +
1886                                            aa->aa_ppga[page_count-1]->count - 1,
1887                                            client_cksum, server_cksum,
1888                                            cksum_type);
1889                         cksum_counter = 0;
1890                         aa->aa_oa->o_cksum = client_cksum;
1891                         rc = -EAGAIN;
1892                 } else {
1893                         cksum_counter++;
1894                         CDEBUG(D_PAGE, "checksum %x confirmed\n", client_cksum);
1895                         rc = 0;
1896                 }
1897         } else if (unlikely(client_cksum)) {
1898                 static int cksum_missed;
1899
1900                 cksum_missed++;
1901                 if ((cksum_missed & (-cksum_missed)) == cksum_missed)
1902                         CERROR("Checksum %u requested from %s but not sent\n",
1903                                cksum_missed, libcfs_nid2str(peer->nid));
1904         } else {
1905                 rc = 0;
1906         }
1907 out:
1908         if (rc >= 0)
1909                 lustre_get_wire_obdo(&req->rq_import->imp_connect_data,
1910                                      aa->aa_oa, &body->oa);
1911
1912         RETURN(rc);
1913 }
1914
1915 static int osc_brw_redo_request(struct ptlrpc_request *request,
1916                                 struct osc_brw_async_args *aa, int rc)
1917 {
1918         struct ptlrpc_request *new_req;
1919         struct osc_brw_async_args *new_aa;
1920         struct osc_async_page *oap;
1921         ENTRY;
1922
1923         DEBUG_REQ(rc == -EINPROGRESS ? D_RPCTRACE : D_ERROR, request,
1924                   "redo for recoverable error %d", rc);
1925
1926         rc = osc_brw_prep_request(lustre_msg_get_opc(request->rq_reqmsg) ==
1927                                 OST_WRITE ? OBD_BRW_WRITE : OBD_BRW_READ,
1928                                   aa->aa_cli, aa->aa_oa, aa->aa_page_count,
1929                                   aa->aa_ppga, &new_req, 1);
1930         if (rc)
1931                 RETURN(rc);
1932
1933         list_for_each_entry(oap, &aa->aa_oaps, oap_rpc_item) {
1934                 if (oap->oap_request != NULL) {
1935                         LASSERTF(request == oap->oap_request,
1936                                  "request %p != oap_request %p\n",
1937                                  request, oap->oap_request);
1938                         if (oap->oap_interrupted) {
1939                                 ptlrpc_req_finished(new_req);
1940                                 RETURN(-EINTR);
1941                         }
1942                 }
1943         }
1944         /*
1945          * New request takes over pga and oaps from old request.
1946          * Note that copying a list_head doesn't work, need to move it...
1947          */
1948         aa->aa_resends++;
1949         new_req->rq_interpret_reply = request->rq_interpret_reply;
1950         new_req->rq_async_args = request->rq_async_args;
1951         new_req->rq_commit_cb = request->rq_commit_cb;
1952         /* cap resend delay to the current request timeout, this is similar to
1953          * what ptlrpc does (see after_reply()) */
1954         if (aa->aa_resends > new_req->rq_timeout)
1955                 new_req->rq_sent = ktime_get_real_seconds() + new_req->rq_timeout;
1956         else
1957                 new_req->rq_sent = ktime_get_real_seconds() + aa->aa_resends;
1958         new_req->rq_generation_set = 1;
1959         new_req->rq_import_generation = request->rq_import_generation;
1960
1961         new_aa = ptlrpc_req_async_args(new_req);
1962
1963         INIT_LIST_HEAD(&new_aa->aa_oaps);
1964         list_splice_init(&aa->aa_oaps, &new_aa->aa_oaps);
1965         INIT_LIST_HEAD(&new_aa->aa_exts);
1966         list_splice_init(&aa->aa_exts, &new_aa->aa_exts);
1967         new_aa->aa_resends = aa->aa_resends;
1968
1969         list_for_each_entry(oap, &new_aa->aa_oaps, oap_rpc_item) {
1970                 if (oap->oap_request) {
1971                         ptlrpc_req_finished(oap->oap_request);
1972                         oap->oap_request = ptlrpc_request_addref(new_req);
1973                 }
1974         }
1975
1976         /* XXX: This code will run into problem if we're going to support
1977          * to add a series of BRW RPCs into a self-defined ptlrpc_request_set
1978          * and wait for all of them to be finished. We should inherit request
1979          * set from old request. */
1980         ptlrpcd_add_req(new_req);
1981
1982         DEBUG_REQ(D_INFO, new_req, "new request");
1983         RETURN(0);
1984 }
1985
1986 /*
1987  * ugh, we want disk allocation on the target to happen in offset order.  we'll
1988  * follow sedgewicks advice and stick to the dead simple shellsort -- it'll do
1989  * fine for our small page arrays and doesn't require allocation.  its an
1990  * insertion sort that swaps elements that are strides apart, shrinking the
1991  * stride down until its '1' and the array is sorted.
1992  */
1993 static void sort_brw_pages(struct brw_page **array, int num)
1994 {
1995         int stride, i, j;
1996         struct brw_page *tmp;
1997
1998         if (num == 1)
1999                 return;
2000         for (stride = 1; stride < num ; stride = (stride * 3) + 1)
2001                 ;
2002
2003         do {
2004                 stride /= 3;
2005                 for (i = stride ; i < num ; i++) {
2006                         tmp = array[i];
2007                         j = i;
2008                         while (j >= stride && array[j - stride]->off > tmp->off) {
2009                                 array[j] = array[j - stride];
2010                                 j -= stride;
2011                         }
2012                         array[j] = tmp;
2013                 }
2014         } while (stride > 1);
2015 }
2016
2017 static void osc_release_ppga(struct brw_page **ppga, size_t count)
2018 {
2019         LASSERT(ppga != NULL);
2020         OBD_FREE(ppga, sizeof(*ppga) * count);
2021 }
2022
2023 static int brw_interpret(const struct lu_env *env,
2024                          struct ptlrpc_request *req, void *args, int rc)
2025 {
2026         struct osc_brw_async_args *aa = args;
2027         struct osc_extent *ext;
2028         struct osc_extent *tmp;
2029         struct client_obd *cli = aa->aa_cli;
2030         unsigned long transferred = 0;
2031
2032         ENTRY;
2033
2034         rc = osc_brw_fini_request(req, rc);
2035         CDEBUG(D_INODE, "request %p aa %p rc %d\n", req, aa, rc);
2036         /*
2037          * When server returns -EINPROGRESS, client should always retry
2038          * regardless of the number of times the bulk was resent already.
2039          */
2040         if (osc_recoverable_error(rc) && !req->rq_no_delay) {
2041                 if (req->rq_import_generation !=
2042                     req->rq_import->imp_generation) {
2043                         CDEBUG(D_HA, "%s: resend cross eviction for object: "
2044                                ""DOSTID", rc = %d.\n",
2045                                req->rq_import->imp_obd->obd_name,
2046                                POSTID(&aa->aa_oa->o_oi), rc);
2047                 } else if (rc == -EINPROGRESS ||
2048                     client_should_resend(aa->aa_resends, aa->aa_cli)) {
2049                         rc = osc_brw_redo_request(req, aa, rc);
2050                 } else {
2051                         CERROR("%s: too many resent retries for object: "
2052                                "%llu:%llu, rc = %d.\n",
2053                                req->rq_import->imp_obd->obd_name,
2054                                POSTID(&aa->aa_oa->o_oi), rc);
2055                 }
2056
2057                 if (rc == 0)
2058                         RETURN(0);
2059                 else if (rc == -EAGAIN || rc == -EINPROGRESS)
2060                         rc = -EIO;
2061         }
2062
2063         if (rc == 0) {
2064                 struct obdo *oa = aa->aa_oa;
2065                 struct cl_attr *attr = &osc_env_info(env)->oti_attr;
2066                 unsigned long valid = 0;
2067                 struct cl_object *obj;
2068                 struct osc_async_page *last;
2069
2070                 last = brw_page2oap(aa->aa_ppga[aa->aa_page_count - 1]);
2071                 obj = osc2cl(last->oap_obj);
2072
2073                 cl_object_attr_lock(obj);
2074                 if (oa->o_valid & OBD_MD_FLBLOCKS) {
2075                         attr->cat_blocks = oa->o_blocks;
2076                         valid |= CAT_BLOCKS;
2077                 }
2078                 if (oa->o_valid & OBD_MD_FLMTIME) {
2079                         attr->cat_mtime = oa->o_mtime;
2080                         valid |= CAT_MTIME;
2081                 }
2082                 if (oa->o_valid & OBD_MD_FLATIME) {
2083                         attr->cat_atime = oa->o_atime;
2084                         valid |= CAT_ATIME;
2085                 }
2086                 if (oa->o_valid & OBD_MD_FLCTIME) {
2087                         attr->cat_ctime = oa->o_ctime;
2088                         valid |= CAT_CTIME;
2089                 }
2090
2091                 if (lustre_msg_get_opc(req->rq_reqmsg) == OST_WRITE) {
2092                         struct lov_oinfo *loi = cl2osc(obj)->oo_oinfo;
2093                         loff_t last_off = last->oap_count + last->oap_obj_off +
2094                                 last->oap_page_off;
2095
2096                         /* Change file size if this is an out of quota or
2097                          * direct IO write and it extends the file size */
2098                         if (loi->loi_lvb.lvb_size < last_off) {
2099                                 attr->cat_size = last_off;
2100                                 valid |= CAT_SIZE;
2101                         }
2102                         /* Extend KMS if it's not a lockless write */
2103                         if (loi->loi_kms < last_off &&
2104                             oap2osc_page(last)->ops_srvlock == 0) {
2105                                 attr->cat_kms = last_off;
2106                                 valid |= CAT_KMS;
2107                         }
2108                 }
2109
2110                 if (valid != 0)
2111                         cl_object_attr_update(env, obj, attr, valid);
2112                 cl_object_attr_unlock(obj);
2113         }
2114         OBD_SLAB_FREE_PTR(aa->aa_oa, osc_obdo_kmem);
2115
2116         if (lustre_msg_get_opc(req->rq_reqmsg) == OST_WRITE && rc == 0)
2117                 osc_inc_unstable_pages(req);
2118
2119         list_for_each_entry_safe(ext, tmp, &aa->aa_exts, oe_link) {
2120                 list_del_init(&ext->oe_link);
2121                 osc_extent_finish(env, ext, 1,
2122                                   rc && req->rq_no_delay ? -EWOULDBLOCK : rc);
2123         }
2124         LASSERT(list_empty(&aa->aa_exts));
2125         LASSERT(list_empty(&aa->aa_oaps));
2126
2127         transferred = (req->rq_bulk == NULL ? /* short io */
2128                        aa->aa_requested_nob :
2129                        req->rq_bulk->bd_nob_transferred);
2130
2131         osc_release_ppga(aa->aa_ppga, aa->aa_page_count);
2132         ptlrpc_lprocfs_brw(req, transferred);
2133
2134         spin_lock(&cli->cl_loi_list_lock);
2135         /* We need to decrement before osc_ap_completion->osc_wake_cache_waiters
2136          * is called so we know whether to go to sync BRWs or wait for more
2137          * RPCs to complete */
2138         if (lustre_msg_get_opc(req->rq_reqmsg) == OST_WRITE)
2139                 cli->cl_w_in_flight--;
2140         else
2141                 cli->cl_r_in_flight--;
2142         osc_wake_cache_waiters(cli);
2143         spin_unlock(&cli->cl_loi_list_lock);
2144
2145         osc_io_unplug(env, cli, NULL);
2146         RETURN(rc);
2147 }
2148
2149 static void brw_commit(struct ptlrpc_request *req)
2150 {
2151         /* If osc_inc_unstable_pages (via osc_extent_finish) races with
2152          * this called via the rq_commit_cb, I need to ensure
2153          * osc_dec_unstable_pages is still called. Otherwise unstable
2154          * pages may be leaked. */
2155         spin_lock(&req->rq_lock);
2156         if (likely(req->rq_unstable)) {
2157                 req->rq_unstable = 0;
2158                 spin_unlock(&req->rq_lock);
2159
2160                 osc_dec_unstable_pages(req);
2161         } else {
2162                 req->rq_committed = 1;
2163                 spin_unlock(&req->rq_lock);
2164         }
2165 }
2166
2167 /**
2168  * Build an RPC by the list of extent @ext_list. The caller must ensure
2169  * that the total pages in this list are NOT over max pages per RPC.
2170  * Extents in the list must be in OES_RPC state.
2171  */
2172 int osc_build_rpc(const struct lu_env *env, struct client_obd *cli,
2173                   struct list_head *ext_list, int cmd)
2174 {
2175         struct ptlrpc_request           *req = NULL;
2176         struct osc_extent               *ext;
2177         struct brw_page                 **pga = NULL;
2178         struct osc_brw_async_args       *aa = NULL;
2179         struct obdo                     *oa = NULL;
2180         struct osc_async_page           *oap;
2181         struct osc_object               *obj = NULL;
2182         struct cl_req_attr              *crattr = NULL;
2183         loff_t                          starting_offset = OBD_OBJECT_EOF;
2184         loff_t                          ending_offset = 0;
2185         int                             mpflag = 0;
2186         int                             mem_tight = 0;
2187         int                             page_count = 0;
2188         bool                            soft_sync = false;
2189         bool                            interrupted = false;
2190         bool                            ndelay = false;
2191         int                             i;
2192         int                             grant = 0;
2193         int                             rc;
2194         __u32                           layout_version = 0;
2195         struct list_head                rpc_list = LIST_HEAD_INIT(rpc_list);
2196         struct ost_body                 *body;
2197         ENTRY;
2198         LASSERT(!list_empty(ext_list));
2199
2200         /* add pages into rpc_list to build BRW rpc */
2201         list_for_each_entry(ext, ext_list, oe_link) {
2202                 LASSERT(ext->oe_state == OES_RPC);
2203                 mem_tight |= ext->oe_memalloc;
2204                 grant += ext->oe_grants;
2205                 page_count += ext->oe_nr_pages;
2206                 layout_version = MAX(layout_version, ext->oe_layout_version);
2207                 if (obj == NULL)
2208                         obj = ext->oe_obj;
2209         }
2210
2211         soft_sync = osc_over_unstable_soft_limit(cli);
2212         if (mem_tight)
2213                 mpflag = cfs_memory_pressure_get_and_set();
2214
2215         OBD_ALLOC(pga, sizeof(*pga) * page_count);
2216         if (pga == NULL)
2217                 GOTO(out, rc = -ENOMEM);
2218
2219         OBD_SLAB_ALLOC_PTR_GFP(oa, osc_obdo_kmem, GFP_NOFS);
2220         if (oa == NULL)
2221                 GOTO(out, rc = -ENOMEM);
2222
2223         i = 0;
2224         list_for_each_entry(ext, ext_list, oe_link) {
2225                 list_for_each_entry(oap, &ext->oe_pages, oap_pending_item) {
2226                         if (mem_tight)
2227                                 oap->oap_brw_flags |= OBD_BRW_MEMALLOC;
2228                         if (soft_sync)
2229                                 oap->oap_brw_flags |= OBD_BRW_SOFT_SYNC;
2230                         pga[i] = &oap->oap_brw_page;
2231                         pga[i]->off = oap->oap_obj_off + oap->oap_page_off;
2232                         i++;
2233
2234                         list_add_tail(&oap->oap_rpc_item, &rpc_list);
2235                         if (starting_offset == OBD_OBJECT_EOF ||
2236                             starting_offset > oap->oap_obj_off)
2237                                 starting_offset = oap->oap_obj_off;
2238                         else
2239                                 LASSERT(oap->oap_page_off == 0);
2240                         if (ending_offset < oap->oap_obj_off + oap->oap_count)
2241                                 ending_offset = oap->oap_obj_off +
2242                                                 oap->oap_count;
2243                         else
2244                                 LASSERT(oap->oap_page_off + oap->oap_count ==
2245                                         PAGE_SIZE);
2246                         if (oap->oap_interrupted)
2247                                 interrupted = true;
2248                 }
2249                 if (ext->oe_ndelay)
2250                         ndelay = true;
2251         }
2252
2253         /* first page in the list */
2254         oap = list_entry(rpc_list.next, typeof(*oap), oap_rpc_item);
2255
2256         crattr = &osc_env_info(env)->oti_req_attr;
2257         memset(crattr, 0, sizeof(*crattr));
2258         crattr->cra_type = (cmd & OBD_BRW_WRITE) ? CRT_WRITE : CRT_READ;
2259         crattr->cra_flags = ~0ULL;
2260         crattr->cra_page = oap2cl_page(oap);
2261         crattr->cra_oa = oa;
2262         cl_req_attr_set(env, osc2cl(obj), crattr);
2263
2264         if (cmd == OBD_BRW_WRITE) {
2265                 oa->o_grant_used = grant;
2266                 if (layout_version > 0) {
2267                         CDEBUG(D_LAYOUT, DFID": write with layout version %u\n",
2268                                PFID(&oa->o_oi.oi_fid), layout_version);
2269
2270                         oa->o_layout_version = layout_version;
2271                         oa->o_valid |= OBD_MD_LAYOUT_VERSION;
2272                 }
2273         }
2274
2275         sort_brw_pages(pga, page_count);
2276         rc = osc_brw_prep_request(cmd, cli, oa, page_count, pga, &req, 0);
2277         if (rc != 0) {
2278                 CERROR("prep_req failed: %d\n", rc);
2279                 GOTO(out, rc);
2280         }
2281
2282         req->rq_commit_cb = brw_commit;
2283         req->rq_interpret_reply = brw_interpret;
2284         req->rq_memalloc = mem_tight != 0;
2285         oap->oap_request = ptlrpc_request_addref(req);
2286         if (interrupted && !req->rq_intr)
2287                 ptlrpc_mark_interrupted(req);
2288         if (ndelay) {
2289                 req->rq_no_resend = req->rq_no_delay = 1;
2290                 /* probably set a shorter timeout value.
2291                  * to handle ETIMEDOUT in brw_interpret() correctly. */
2292                 /* lustre_msg_set_timeout(req, req->rq_timeout / 2); */
2293         }
2294
2295         /* Need to update the timestamps after the request is built in case
2296          * we race with setattr (locally or in queue at OST).  If OST gets
2297          * later setattr before earlier BRW (as determined by the request xid),
2298          * the OST will not use BRW timestamps.  Sadly, there is no obvious
2299          * way to do this in a single call.  bug 10150 */
2300         body = req_capsule_client_get(&req->rq_pill, &RMF_OST_BODY);
2301         crattr->cra_oa = &body->oa;
2302         crattr->cra_flags = OBD_MD_FLMTIME | OBD_MD_FLCTIME | OBD_MD_FLATIME;
2303         cl_req_attr_set(env, osc2cl(obj), crattr);
2304         lustre_msg_set_jobid(req->rq_reqmsg, crattr->cra_jobid);
2305
2306         CLASSERT(sizeof(*aa) <= sizeof(req->rq_async_args));
2307         aa = ptlrpc_req_async_args(req);
2308         INIT_LIST_HEAD(&aa->aa_oaps);
2309         list_splice_init(&rpc_list, &aa->aa_oaps);
2310         INIT_LIST_HEAD(&aa->aa_exts);
2311         list_splice_init(ext_list, &aa->aa_exts);
2312
2313         spin_lock(&cli->cl_loi_list_lock);
2314         starting_offset >>= PAGE_SHIFT;
2315         if (cmd == OBD_BRW_READ) {
2316                 cli->cl_r_in_flight++;
2317                 lprocfs_oh_tally_log2(&cli->cl_read_page_hist, page_count);
2318                 lprocfs_oh_tally(&cli->cl_read_rpc_hist, cli->cl_r_in_flight);
2319                 lprocfs_oh_tally_log2(&cli->cl_read_offset_hist,
2320                                       starting_offset + 1);
2321         } else {
2322                 cli->cl_w_in_flight++;
2323                 lprocfs_oh_tally_log2(&cli->cl_write_page_hist, page_count);
2324                 lprocfs_oh_tally(&cli->cl_write_rpc_hist, cli->cl_w_in_flight);
2325                 lprocfs_oh_tally_log2(&cli->cl_write_offset_hist,
2326                                       starting_offset + 1);
2327         }
2328         spin_unlock(&cli->cl_loi_list_lock);
2329
2330         DEBUG_REQ(D_INODE, req, "%d pages, aa %p. now %ur/%uw in flight",
2331                   page_count, aa, cli->cl_r_in_flight,
2332                   cli->cl_w_in_flight);
2333         OBD_FAIL_TIMEOUT(OBD_FAIL_OSC_DELAY_IO, cfs_fail_val);
2334
2335         ptlrpcd_add_req(req);
2336         rc = 0;
2337         EXIT;
2338
2339 out:
2340         if (mem_tight != 0)
2341                 cfs_memory_pressure_restore(mpflag);
2342
2343         if (rc != 0) {
2344                 LASSERT(req == NULL);
2345
2346                 if (oa)
2347                         OBD_SLAB_FREE_PTR(oa, osc_obdo_kmem);
2348                 if (pga)
2349                         OBD_FREE(pga, sizeof(*pga) * page_count);
2350                 /* this should happen rarely and is pretty bad, it makes the
2351                  * pending list not follow the dirty order */
2352                 while (!list_empty(ext_list)) {
2353                         ext = list_entry(ext_list->next, struct osc_extent,
2354                                          oe_link);
2355                         list_del_init(&ext->oe_link);
2356                         osc_extent_finish(env, ext, 0, rc);
2357                 }
2358         }
2359         RETURN(rc);
2360 }
2361
2362 static int osc_set_lock_data(struct ldlm_lock *lock, void *data)
2363 {
2364         int set = 0;
2365
2366         LASSERT(lock != NULL);
2367
2368         lock_res_and_lock(lock);
2369
2370         if (lock->l_ast_data == NULL)
2371                 lock->l_ast_data = data;
2372         if (lock->l_ast_data == data)
2373                 set = 1;
2374
2375         unlock_res_and_lock(lock);
2376
2377         return set;
2378 }
2379
2380 int osc_enqueue_fini(struct ptlrpc_request *req, osc_enqueue_upcall_f upcall,
2381                      void *cookie, struct lustre_handle *lockh,
2382                      enum ldlm_mode mode, __u64 *flags, bool speculative,
2383                      int errcode)
2384 {
2385         bool intent = *flags & LDLM_FL_HAS_INTENT;
2386         int rc;
2387         ENTRY;
2388
2389         /* The request was created before ldlm_cli_enqueue call. */
2390         if (intent && errcode == ELDLM_LOCK_ABORTED) {
2391                 struct ldlm_reply *rep;
2392
2393                 rep = req_capsule_server_get(&req->rq_pill, &RMF_DLM_REP);
2394                 LASSERT(rep != NULL);
2395
2396                 rep->lock_policy_res1 =
2397                         ptlrpc_status_ntoh(rep->lock_policy_res1);
2398                 if (rep->lock_policy_res1)
2399                         errcode = rep->lock_policy_res1;
2400                 if (!speculative)
2401                         *flags |= LDLM_FL_LVB_READY;
2402         } else if (errcode == ELDLM_OK) {
2403                 *flags |= LDLM_FL_LVB_READY;
2404         }
2405
2406         /* Call the update callback. */
2407         rc = (*upcall)(cookie, lockh, errcode);
2408
2409         /* release the reference taken in ldlm_cli_enqueue() */
2410         if (errcode == ELDLM_LOCK_MATCHED)
2411                 errcode = ELDLM_OK;
2412         if (errcode == ELDLM_OK && lustre_handle_is_used(lockh))
2413                 ldlm_lock_decref(lockh, mode);
2414
2415         RETURN(rc);
2416 }
2417
2418 int osc_enqueue_interpret(const struct lu_env *env, struct ptlrpc_request *req,
2419                           void *args, int rc)
2420 {
2421         struct osc_enqueue_args *aa = args;
2422         struct ldlm_lock *lock;
2423         struct lustre_handle *lockh = &aa->oa_lockh;
2424         enum ldlm_mode mode = aa->oa_mode;
2425         struct ost_lvb *lvb = aa->oa_lvb;
2426         __u32 lvb_len = sizeof(*lvb);
2427         __u64 flags = 0;
2428
2429         ENTRY;
2430
2431         /* ldlm_cli_enqueue is holding a reference on the lock, so it must
2432          * be valid. */
2433         lock = ldlm_handle2lock(lockh);
2434         LASSERTF(lock != NULL,
2435                  "lockh %#llx, req %p, aa %p - client evicted?\n",
2436                  lockh->cookie, req, aa);
2437
2438         /* Take an additional reference so that a blocking AST that
2439          * ldlm_cli_enqueue_fini() might post for a failed lock, is guaranteed
2440          * to arrive after an upcall has been executed by
2441          * osc_enqueue_fini(). */
2442         ldlm_lock_addref(lockh, mode);
2443
2444         /* Let cl_lock_state_wait fail with -ERESTARTSYS to unuse sublocks. */
2445         OBD_FAIL_TIMEOUT(OBD_FAIL_LDLM_ENQUEUE_HANG, 2);
2446
2447         /* Let CP AST to grant the lock first. */
2448         OBD_FAIL_TIMEOUT(OBD_FAIL_OSC_CP_ENQ_RACE, 1);
2449
2450         if (aa->oa_speculative) {
2451                 LASSERT(aa->oa_lvb == NULL);
2452                 LASSERT(aa->oa_flags == NULL);
2453                 aa->oa_flags = &flags;
2454         }
2455
2456         /* Complete obtaining the lock procedure. */
2457         rc = ldlm_cli_enqueue_fini(aa->oa_exp, req, aa->oa_type, 1,
2458                                    aa->oa_mode, aa->oa_flags, lvb, lvb_len,
2459                                    lockh, rc);
2460         /* Complete osc stuff. */
2461         rc = osc_enqueue_fini(req, aa->oa_upcall, aa->oa_cookie, lockh, mode,
2462                               aa->oa_flags, aa->oa_speculative, rc);
2463
2464         OBD_FAIL_TIMEOUT(OBD_FAIL_OSC_CP_CANCEL_RACE, 10);
2465
2466         ldlm_lock_decref(lockh, mode);
2467         LDLM_LOCK_PUT(lock);
2468         RETURN(rc);
2469 }
2470
2471 struct ptlrpc_request_set *PTLRPCD_SET = (void *)1;
2472
2473 /* When enqueuing asynchronously, locks are not ordered, we can obtain a lock
2474  * from the 2nd OSC before a lock from the 1st one. This does not deadlock with
2475  * other synchronous requests, however keeping some locks and trying to obtain
2476  * others may take a considerable amount of time in a case of ost failure; and
2477  * when other sync requests do not get released lock from a client, the client
2478  * is evicted from the cluster -- such scenarious make the life difficult, so
2479  * release locks just after they are obtained. */
2480 int osc_enqueue_base(struct obd_export *exp, struct ldlm_res_id *res_id,
2481                      __u64 *flags, union ldlm_policy_data *policy,
2482                      struct ost_lvb *lvb, int kms_valid,
2483                      osc_enqueue_upcall_f upcall, void *cookie,
2484                      struct ldlm_enqueue_info *einfo,
2485                      struct ptlrpc_request_set *rqset, int async,
2486                      bool speculative)
2487 {
2488         struct obd_device *obd = exp->exp_obd;
2489         struct lustre_handle lockh = { 0 };
2490         struct ptlrpc_request *req = NULL;
2491         int intent = *flags & LDLM_FL_HAS_INTENT;
2492         __u64 match_flags = *flags;
2493         enum ldlm_mode mode;
2494         int rc;
2495         ENTRY;
2496
2497         /* Filesystem lock extents are extended to page boundaries so that
2498          * dealing with the page cache is a little smoother.  */
2499         policy->l_extent.start -= policy->l_extent.start & ~PAGE_MASK;
2500         policy->l_extent.end |= ~PAGE_MASK;
2501
2502         /*
2503          * kms is not valid when either object is completely fresh (so that no
2504          * locks are cached), or object was evicted. In the latter case cached
2505          * lock cannot be used, because it would prime inode state with
2506          * potentially stale LVB.
2507          */
2508         if (!kms_valid)
2509                 goto no_match;
2510
2511         /* Next, search for already existing extent locks that will cover us */
2512         /* If we're trying to read, we also search for an existing PW lock.  The
2513          * VFS and page cache already protect us locally, so lots of readers/
2514          * writers can share a single PW lock.
2515          *
2516          * There are problems with conversion deadlocks, so instead of
2517          * converting a read lock to a write lock, we'll just enqueue a new
2518          * one.
2519          *
2520          * At some point we should cancel the read lock instead of making them
2521          * send us a blocking callback, but there are problems with canceling
2522          * locks out from other users right now, too. */
2523         mode = einfo->ei_mode;
2524         if (einfo->ei_mode == LCK_PR)
2525                 mode |= LCK_PW;
2526         /* Normal lock requests must wait for the LVB to be ready before
2527          * matching a lock; speculative lock requests do not need to,
2528          * because they will not actually use the lock. */
2529         if (!speculative)
2530                 match_flags |= LDLM_FL_LVB_READY;
2531         if (intent != 0)
2532                 match_flags |= LDLM_FL_BLOCK_GRANTED;
2533         mode = ldlm_lock_match(obd->obd_namespace, match_flags, res_id,
2534                                einfo->ei_type, policy, mode, &lockh, 0);
2535         if (mode) {
2536                 struct ldlm_lock *matched;
2537
2538                 if (*flags & LDLM_FL_TEST_LOCK)
2539                         RETURN(ELDLM_OK);
2540
2541                 matched = ldlm_handle2lock(&lockh);
2542                 if (speculative) {
2543                         /* This DLM lock request is speculative, and does not
2544                          * have an associated IO request. Therefore if there
2545                          * is already a DLM lock, it wll just inform the
2546                          * caller to cancel the request for this stripe.*/
2547                         lock_res_and_lock(matched);
2548                         if (ldlm_extent_equal(&policy->l_extent,
2549                             &matched->l_policy_data.l_extent))
2550                                 rc = -EEXIST;
2551                         else
2552                                 rc = -ECANCELED;
2553                         unlock_res_and_lock(matched);
2554
2555                         ldlm_lock_decref(&lockh, mode);
2556                         LDLM_LOCK_PUT(matched);
2557                         RETURN(rc);
2558                 } else if (osc_set_lock_data(matched, einfo->ei_cbdata)) {
2559                         *flags |= LDLM_FL_LVB_READY;
2560
2561                         /* We already have a lock, and it's referenced. */
2562                         (*upcall)(cookie, &lockh, ELDLM_LOCK_MATCHED);
2563
2564                         ldlm_lock_decref(&lockh, mode);
2565                         LDLM_LOCK_PUT(matched);
2566                         RETURN(ELDLM_OK);
2567                 } else {
2568                         ldlm_lock_decref(&lockh, mode);
2569                         LDLM_LOCK_PUT(matched);
2570                 }
2571         }
2572
2573 no_match:
2574         if (*flags & (LDLM_FL_TEST_LOCK | LDLM_FL_MATCH_LOCK))
2575                 RETURN(-ENOLCK);
2576
2577         if (intent) {
2578                 req = ptlrpc_request_alloc(class_exp2cliimp(exp),
2579                                            &RQF_LDLM_ENQUEUE_LVB);
2580                 if (req == NULL)
2581                         RETURN(-ENOMEM);
2582
2583                 rc = ldlm_prep_enqueue_req(exp, req, NULL, 0);
2584                 if (rc) {
2585                         ptlrpc_request_free(req);
2586                         RETURN(rc);
2587                 }
2588
2589                 req_capsule_set_size(&req->rq_pill, &RMF_DLM_LVB, RCL_SERVER,
2590                                      sizeof *lvb);
2591                 ptlrpc_request_set_replen(req);
2592         }
2593
2594         /* users of osc_enqueue() can pass this flag for ldlm_lock_match() */
2595         *flags &= ~LDLM_FL_BLOCK_GRANTED;
2596
2597         rc = ldlm_cli_enqueue(exp, &req, einfo, res_id, policy, flags, lvb,
2598                               sizeof(*lvb), LVB_T_OST, &lockh, async);
2599         if (async) {
2600                 if (!rc) {
2601                         struct osc_enqueue_args *aa;
2602                         CLASSERT(sizeof(*aa) <= sizeof(req->rq_async_args));
2603                         aa = ptlrpc_req_async_args(req);
2604                         aa->oa_exp         = exp;
2605                         aa->oa_mode        = einfo->ei_mode;
2606                         aa->oa_type        = einfo->ei_type;
2607                         lustre_handle_copy(&aa->oa_lockh, &lockh);
2608                         aa->oa_upcall      = upcall;
2609                         aa->oa_cookie      = cookie;
2610                         aa->oa_speculative = speculative;
2611                         if (!speculative) {
2612                                 aa->oa_flags  = flags;
2613                                 aa->oa_lvb    = lvb;
2614                         } else {
2615                                 /* speculative locks are essentially to enqueue
2616                                  * a DLM lock  in advance, so we don't care
2617                                  * about the result of the enqueue. */
2618                                 aa->oa_lvb    = NULL;
2619                                 aa->oa_flags  = NULL;
2620                         }
2621
2622                         req->rq_interpret_reply = osc_enqueue_interpret;
2623                         if (rqset == PTLRPCD_SET)
2624                                 ptlrpcd_add_req(req);
2625                         else
2626                                 ptlrpc_set_add_req(rqset, req);
2627                 } else if (intent) {
2628                         ptlrpc_req_finished(req);
2629                 }
2630                 RETURN(rc);
2631         }
2632
2633         rc = osc_enqueue_fini(req, upcall, cookie, &lockh, einfo->ei_mode,
2634                               flags, speculative, rc);
2635         if (intent)
2636                 ptlrpc_req_finished(req);
2637
2638         RETURN(rc);
2639 }
2640
2641 int osc_match_base(struct obd_export *exp, struct ldlm_res_id *res_id,
2642                    enum ldlm_type type, union ldlm_policy_data *policy,
2643                    enum ldlm_mode mode, __u64 *flags, void *data,
2644                    struct lustre_handle *lockh, int unref)
2645 {
2646         struct obd_device *obd = exp->exp_obd;
2647         __u64 lflags = *flags;
2648         enum ldlm_mode rc;
2649         ENTRY;
2650
2651         if (OBD_FAIL_CHECK(OBD_FAIL_OSC_MATCH))
2652                 RETURN(-EIO);
2653
2654         /* Filesystem lock extents are extended to page boundaries so that
2655          * dealing with the page cache is a little smoother */
2656         policy->l_extent.start -= policy->l_extent.start & ~PAGE_MASK;
2657         policy->l_extent.end |= ~PAGE_MASK;
2658
2659         /* Next, search for already existing extent locks that will cover us */
2660         /* If we're trying to read, we also search for an existing PW lock.  The
2661          * VFS and page cache already protect us locally, so lots of readers/
2662          * writers can share a single PW lock. */
2663         rc = mode;
2664         if (mode == LCK_PR)
2665                 rc |= LCK_PW;
2666         rc = ldlm_lock_match(obd->obd_namespace, lflags,
2667                              res_id, type, policy, rc, lockh, unref);
2668         if (rc == 0 || lflags & LDLM_FL_TEST_LOCK)
2669                 RETURN(rc);
2670
2671         if (data != NULL) {
2672                 struct ldlm_lock *lock = ldlm_handle2lock(lockh);
2673
2674                 LASSERT(lock != NULL);
2675                 if (!osc_set_lock_data(lock, data)) {
2676                         ldlm_lock_decref(lockh, rc);
2677                         rc = 0;
2678                 }
2679                 LDLM_LOCK_PUT(lock);
2680         }
2681         RETURN(rc);
2682 }
2683
2684 static int osc_statfs_interpret(const struct lu_env *env,
2685                                 struct ptlrpc_request *req, void *args, int rc)
2686 {
2687         struct osc_async_args *aa = args;
2688         struct obd_statfs *msfs;
2689
2690         ENTRY;
2691         if (rc == -EBADR)
2692                 /*
2693                  * The request has in fact never been sent due to issues at
2694                  * a higher level (LOV).  Exit immediately since the caller
2695                  * is aware of the problem and takes care of the clean up.
2696                  */
2697                 RETURN(rc);
2698
2699         if ((rc == -ENOTCONN || rc == -EAGAIN) &&
2700             (aa->aa_oi->oi_flags & OBD_STATFS_NODELAY))
2701                 GOTO(out, rc = 0);
2702
2703         if (rc != 0)
2704                 GOTO(out, rc);
2705
2706         msfs = req_capsule_server_get(&req->rq_pill, &RMF_OBD_STATFS);
2707         if (msfs == NULL)
2708                 GOTO(out, rc = -EPROTO);
2709
2710         *aa->aa_oi->oi_osfs = *msfs;
2711 out:
2712         rc = aa->aa_oi->oi_cb_up(aa->aa_oi, rc);
2713
2714         RETURN(rc);
2715 }
2716
2717 static int osc_statfs_async(struct obd_export *exp,
2718                             struct obd_info *oinfo, time64_t max_age,
2719                             struct ptlrpc_request_set *rqset)
2720 {
2721         struct obd_device     *obd = class_exp2obd(exp);
2722         struct ptlrpc_request *req;
2723         struct osc_async_args *aa;
2724         int rc;
2725         ENTRY;
2726
2727         /* We could possibly pass max_age in the request (as an absolute
2728          * timestamp or a "seconds.usec ago") so the target can avoid doing
2729          * extra calls into the filesystem if that isn't necessary (e.g.
2730          * during mount that would help a bit).  Having relative timestamps
2731          * is not so great if request processing is slow, while absolute
2732          * timestamps are not ideal because they need time synchronization. */
2733         req = ptlrpc_request_alloc(obd->u.cli.cl_import, &RQF_OST_STATFS);
2734         if (req == NULL)
2735                 RETURN(-ENOMEM);
2736
2737         rc = ptlrpc_request_pack(req, LUSTRE_OST_VERSION, OST_STATFS);
2738         if (rc) {
2739                 ptlrpc_request_free(req);
2740                 RETURN(rc);
2741         }
2742         ptlrpc_request_set_replen(req);
2743         req->rq_request_portal = OST_CREATE_PORTAL;
2744         ptlrpc_at_set_req_timeout(req);
2745
2746         if (oinfo->oi_flags & OBD_STATFS_NODELAY) {
2747                 /* procfs requests not want stat in wait for avoid deadlock */
2748                 req->rq_no_resend = 1;
2749                 req->rq_no_delay = 1;
2750         }
2751
2752         req->rq_interpret_reply = osc_statfs_interpret;
2753         CLASSERT(sizeof(*aa) <= sizeof(req->rq_async_args));
2754         aa = ptlrpc_req_async_args(req);
2755         aa->aa_oi = oinfo;
2756
2757         ptlrpc_set_add_req(rqset, req);
2758         RETURN(0);
2759 }
2760
2761 static int osc_statfs(const struct lu_env *env, struct obd_export *exp,
2762                       struct obd_statfs *osfs, time64_t max_age, __u32 flags)
2763 {
2764         struct obd_device     *obd = class_exp2obd(exp);
2765         struct obd_statfs     *msfs;
2766         struct ptlrpc_request *req;
2767         struct obd_import     *imp = NULL;
2768         int rc;
2769         ENTRY;
2770
2771
2772         /*Since the request might also come from lprocfs, so we need
2773          *sync this with client_disconnect_export Bug15684*/
2774         down_read(&obd->u.cli.cl_sem);
2775         if (obd->u.cli.cl_import)
2776                 imp = class_import_get(obd->u.cli.cl_import);
2777         up_read(&obd->u.cli.cl_sem);
2778         if (!imp)
2779                 RETURN(-ENODEV);
2780
2781         /* We could possibly pass max_age in the request (as an absolute
2782          * timestamp or a "seconds.usec ago") so the target can avoid doing
2783          * extra calls into the filesystem if that isn't necessary (e.g.
2784          * during mount that would help a bit).  Having relative timestamps
2785          * is not so great if request processing is slow, while absolute
2786          * timestamps are not ideal because they need time synchronization. */
2787         req = ptlrpc_request_alloc(imp, &RQF_OST_STATFS);
2788
2789         class_import_put(imp);
2790
2791         if (req == NULL)
2792                 RETURN(-ENOMEM);
2793
2794         rc = ptlrpc_request_pack(req, LUSTRE_OST_VERSION, OST_STATFS);
2795         if (rc) {
2796                 ptlrpc_request_free(req);
2797                 RETURN(rc);
2798         }
2799         ptlrpc_request_set_replen(req);
2800         req->rq_request_portal = OST_CREATE_PORTAL;
2801         ptlrpc_at_set_req_timeout(req);
2802
2803         if (flags & OBD_STATFS_NODELAY) {
2804                 /* procfs requests not want stat in wait for avoid deadlock */
2805                 req->rq_no_resend = 1;
2806                 req->rq_no_delay = 1;
2807         }
2808
2809         rc = ptlrpc_queue_wait(req);
2810         if (rc)
2811                 GOTO(out, rc);
2812
2813         msfs = req_capsule_server_get(&req->rq_pill, &RMF_OBD_STATFS);
2814         if (msfs == NULL)
2815                 GOTO(out, rc = -EPROTO);
2816
2817         *osfs = *msfs;
2818
2819         EXIT;
2820 out:
2821         ptlrpc_req_finished(req);
2822         return rc;
2823 }
2824
2825 static int osc_iocontrol(unsigned int cmd, struct obd_export *exp, int len,
2826                          void *karg, void __user *uarg)
2827 {
2828         struct obd_device *obd = exp->exp_obd;
2829         struct obd_ioctl_data *data = karg;
2830         int err = 0;
2831         ENTRY;
2832
2833         if (!try_module_get(THIS_MODULE)) {
2834                 CERROR("%s: cannot get module '%s'\n", obd->obd_name,
2835                        module_name(THIS_MODULE));
2836                 return -EINVAL;
2837         }
2838         switch (cmd) {
2839         case OBD_IOC_CLIENT_RECOVER:
2840                 err = ptlrpc_recover_import(obd->u.cli.cl_import,
2841                                             data->ioc_inlbuf1, 0);
2842                 if (err > 0)
2843                         err = 0;
2844                 GOTO(out, err);
2845         case IOC_OSC_SET_ACTIVE:
2846                 err = ptlrpc_set_import_active(obd->u.cli.cl_import,
2847                                                data->ioc_offset);
2848                 GOTO(out, err);
2849         case OBD_IOC_PING_TARGET:
2850                 err = ptlrpc_obd_ping(obd);
2851                 GOTO(out, err);
2852         default:
2853                 CDEBUG(D_INODE, "unrecognised ioctl %#x by %s\n",
2854                        cmd, current_comm());
2855                 GOTO(out, err = -ENOTTY);
2856         }
2857 out:
2858         module_put(THIS_MODULE);
2859         return err;
2860 }
2861
2862 int osc_set_info_async(const struct lu_env *env, struct obd_export *exp,
2863                        u32 keylen, void *key, u32 vallen, void *val,
2864                        struct ptlrpc_request_set *set)
2865 {
2866         struct ptlrpc_request *req;
2867         struct obd_device     *obd = exp->exp_obd;
2868         struct obd_import     *imp = class_exp2cliimp(exp);
2869         char                  *tmp;
2870         int                    rc;
2871         ENTRY;
2872
2873         OBD_FAIL_TIMEOUT(OBD_FAIL_OSC_SHUTDOWN, 10);
2874
2875         if (KEY_IS(KEY_CHECKSUM)) {
2876                 if (vallen != sizeof(int))
2877                         RETURN(-EINVAL);
2878                 exp->exp_obd->u.cli.cl_checksum = (*(int *)val) ? 1 : 0;
2879                 RETURN(0);
2880         }
2881
2882         if (KEY_IS(KEY_SPTLRPC_CONF)) {
2883                 sptlrpc_conf_client_adapt(obd);
2884                 RETURN(0);
2885         }
2886
2887         if (KEY_IS(KEY_FLUSH_CTX)) {
2888                 sptlrpc_import_flush_my_ctx(imp);
2889                 RETURN(0);
2890         }
2891
2892         if (KEY_IS(KEY_CACHE_SET)) {
2893                 struct client_obd *cli = &obd->u.cli;
2894
2895                 LASSERT(cli->cl_cache == NULL); /* only once */
2896                 cli->cl_cache = (struct cl_client_cache *)val;
2897                 cl_cache_incref(cli->cl_cache);
2898                 cli->cl_lru_left = &cli->cl_cache->ccc_lru_left;
2899
2900                 /* add this osc into entity list */
2901                 LASSERT(list_empty(&cli->cl_lru_osc));
2902                 spin_lock(&cli->cl_cache->ccc_lru_lock);
2903                 list_add(&cli->cl_lru_osc, &cli->cl_cache->ccc_lru);
2904                 spin_unlock(&cli->cl_cache->ccc_lru_lock);
2905
2906                 RETURN(0);
2907         }
2908
2909         if (KEY_IS(KEY_CACHE_LRU_SHRINK)) {
2910                 struct client_obd *cli = &obd->u.cli;
2911                 long nr = atomic_long_read(&cli->cl_lru_in_list) >> 1;
2912                 long target = *(long *)val;
2913
2914                 nr = osc_lru_shrink(env, cli, min(nr, target), true);
2915                 *(long *)val -= nr;
2916                 RETURN(0);
2917         }
2918
2919         if (!set && !KEY_IS(KEY_GRANT_SHRINK))
2920                 RETURN(-EINVAL);
2921
2922         /* We pass all other commands directly to OST. Since nobody calls osc
2923            methods directly and everybody is supposed to go through LOV, we
2924            assume lov checked invalid values for us.
2925            The only recognised values so far are evict_by_nid and mds_conn.
2926            Even if something bad goes through, we'd get a -EINVAL from OST
2927            anyway. */
2928
2929         req = ptlrpc_request_alloc(imp, KEY_IS(KEY_GRANT_SHRINK) ?
2930                                                 &RQF_OST_SET_GRANT_INFO :
2931                                                 &RQF_OBD_SET_INFO);
2932         if (req == NULL)
2933                 RETURN(-ENOMEM);
2934
2935         req_capsule_set_size(&req->rq_pill, &RMF_SETINFO_KEY,
2936                              RCL_CLIENT, keylen);
2937         if (!KEY_IS(KEY_GRANT_SHRINK))
2938                 req_capsule_set_size(&req->rq_pill, &RMF_SETINFO_VAL,
2939                                      RCL_CLIENT, vallen);
2940         rc = ptlrpc_request_pack(req, LUSTRE_OST_VERSION, OST_SET_INFO);
2941         if (rc) {
2942                 ptlrpc_request_free(req);
2943                 RETURN(rc);
2944         }
2945
2946         tmp = req_capsule_client_get(&req->rq_pill, &RMF_SETINFO_KEY);
2947         memcpy(tmp, key, keylen);
2948         tmp = req_capsule_client_get(&req->rq_pill, KEY_IS(KEY_GRANT_SHRINK) ?
2949                                                         &RMF_OST_BODY :
2950                                                         &RMF_SETINFO_VAL);
2951         memcpy(tmp, val, vallen);
2952
2953         if (KEY_IS(KEY_GRANT_SHRINK)) {
2954                 struct osc_grant_args *aa;
2955                 struct obdo *oa;
2956
2957                 CLASSERT(sizeof(*aa) <= sizeof(req->rq_async_args));
2958                 aa = ptlrpc_req_async_args(req);
2959                 OBD_SLAB_ALLOC_PTR_GFP(oa, osc_obdo_kmem, GFP_NOFS);
2960                 if (!oa) {
2961                         ptlrpc_req_finished(req);
2962                         RETURN(-ENOMEM);
2963                 }
2964                 *oa = ((struct ost_body *)val)->oa;
2965                 aa->aa_oa = oa;
2966                 req->rq_interpret_reply = osc_shrink_grant_interpret;
2967         }
2968
2969         ptlrpc_request_set_replen(req);
2970         if (!KEY_IS(KEY_GRANT_SHRINK)) {
2971                 LASSERT(set != NULL);
2972                 ptlrpc_set_add_req(set, req);
2973                 ptlrpc_check_set(NULL, set);
2974         } else {
2975                 ptlrpcd_add_req(req);
2976         }
2977
2978         RETURN(0);
2979 }
2980 EXPORT_SYMBOL(osc_set_info_async);
2981
2982 int osc_reconnect(const struct lu_env *env, struct obd_export *exp,
2983                   struct obd_device *obd, struct obd_uuid *cluuid,
2984                   struct obd_connect_data *data, void *localdata)
2985 {
2986         struct client_obd *cli = &obd->u.cli;
2987
2988         if (data != NULL && (data->ocd_connect_flags & OBD_CONNECT_GRANT)) {
2989                 long lost_grant;
2990                 long grant;
2991
2992                 spin_lock(&cli->cl_loi_list_lock);
2993                 grant = cli->cl_avail_grant + cli->cl_reserved_grant;
2994                 if (data->ocd_connect_flags & OBD_CONNECT_GRANT_PARAM)
2995                         grant += cli->cl_dirty_grant;
2996                 else
2997                         grant += cli->cl_dirty_pages << PAGE_SHIFT;
2998                 data->ocd_grant = grant ? : 2 * cli_brw_size(obd);
2999                 lost_grant = cli->cl_lost_grant;
3000                 cli->cl_lost_grant = 0;
3001                 spin_unlock(&cli->cl_loi_list_lock);
3002
3003                 CDEBUG(D_RPCTRACE, "ocd_connect_flags: %#llx ocd_version: %d"
3004                        " ocd_grant: %d, lost: %ld.\n", data->ocd_connect_flags,
3005                        data->ocd_version, data->ocd_grant, lost_grant);
3006         }
3007
3008         RETURN(0);
3009 }
3010 EXPORT_SYMBOL(osc_reconnect);
3011
3012 int osc_disconnect(struct obd_export *exp)
3013 {
3014         struct obd_device *obd = class_exp2obd(exp);
3015         int rc;
3016
3017         rc = client_disconnect_export(exp);
3018         /**
3019          * Initially we put del_shrink_grant before disconnect_export, but it
3020          * causes the following problem if setup (connect) and cleanup
3021          * (disconnect) are tangled together.
3022          *      connect p1                     disconnect p2
3023          *   ptlrpc_connect_import
3024          *     ...............               class_manual_cleanup
3025          *                                     osc_disconnect
3026          *                                     del_shrink_grant
3027          *   ptlrpc_connect_interrupt
3028          *     osc_init_grant
3029          *   add this client to shrink list
3030          *                                      cleanup_osc
3031          * Bang! grant shrink thread trigger the shrink. BUG18662
3032          */
3033         osc_del_grant_list(&obd->u.cli);
3034         return rc;
3035 }
3036 EXPORT_SYMBOL(osc_disconnect);
3037
3038 int osc_ldlm_resource_invalidate(struct cfs_hash *hs, struct cfs_hash_bd *bd,
3039                                  struct hlist_node *hnode, void *arg)
3040 {
3041         struct lu_env *env = arg;
3042         struct ldlm_resource *res = cfs_hash_object(hs, hnode);
3043         struct ldlm_lock *lock;
3044         struct osc_object *osc = NULL;
3045         ENTRY;
3046
3047         lock_res(res);
3048         list_for_each_entry(lock, &res->lr_granted, l_res_link) {
3049                 if (lock->l_ast_data != NULL && osc == NULL) {
3050                         osc = lock->l_ast_data;
3051                         cl_object_get(osc2cl(osc));
3052                 }
3053
3054                 /* clear LDLM_FL_CLEANED flag to make sure it will be canceled
3055                  * by the 2nd round of ldlm_namespace_clean() call in
3056                  * osc_import_event(). */
3057                 ldlm_clear_cleaned(lock);
3058         }
3059         unlock_res(res);
3060
3061         if (osc != NULL) {
3062                 osc_object_invalidate(env, osc);
3063                 cl_object_put(env, osc2cl(osc));
3064         }
3065
3066         RETURN(0);
3067 }
3068 EXPORT_SYMBOL(osc_ldlm_resource_invalidate);
3069
3070 static int osc_import_event(struct obd_device *obd,
3071                             struct obd_import *imp,
3072                             enum obd_import_event event)
3073 {
3074         struct client_obd *cli;
3075         int rc = 0;
3076
3077         ENTRY;
3078         LASSERT(imp->imp_obd == obd);
3079
3080         switch (event) {
3081         case IMP_EVENT_DISCON: {
3082                 cli = &obd->u.cli;
3083                 spin_lock(&cli->cl_loi_list_lock);
3084                 cli->cl_avail_grant = 0;
3085                 cli->cl_lost_grant = 0;
3086                 spin_unlock(&cli->cl_loi_list_lock);
3087                 break;
3088         }
3089         case IMP_EVENT_INACTIVE: {
3090                 rc = obd_notify_observer(obd, obd, OBD_NOTIFY_INACTIVE);
3091                 break;
3092         }
3093         case IMP_EVENT_INVALIDATE: {
3094                 struct ldlm_namespace *ns = obd->obd_namespace;
3095                 struct lu_env         *env;
3096                 __u16                  refcheck;
3097
3098                 ldlm_namespace_cleanup(ns, LDLM_FL_LOCAL_ONLY);
3099
3100                 env = cl_env_get(&refcheck);
3101                 if (!IS_ERR(env)) {
3102                         osc_io_unplug(env, &obd->u.cli, NULL);
3103
3104                         cfs_hash_for_each_nolock(ns->ns_rs_hash,
3105                                                  osc_ldlm_resource_invalidate,
3106                                                  env, 0);
3107                         cl_env_put(env, &refcheck);
3108
3109                         ldlm_namespace_cleanup(ns, LDLM_FL_LOCAL_ONLY);
3110                 } else
3111                         rc = PTR_ERR(env);
3112                 break;
3113         }
3114         case IMP_EVENT_ACTIVE: {
3115                 rc = obd_notify_observer(obd, obd, OBD_NOTIFY_ACTIVE);
3116                 break;
3117         }
3118         case IMP_EVENT_OCD: {
3119                 struct obd_connect_data *ocd = &imp->imp_connect_data;
3120
3121                 if (ocd->ocd_connect_flags & OBD_CONNECT_GRANT)
3122                         osc_init_grant(&obd->u.cli, ocd);
3123
3124                 /* See bug 7198 */
3125                 if (ocd->ocd_connect_flags & OBD_CONNECT_REQPORTAL)
3126                         imp->imp_client->cli_request_portal =OST_REQUEST_PORTAL;
3127
3128                 rc = obd_notify_observer(obd, obd, OBD_NOTIFY_OCD);
3129                 break;
3130         }
3131         case IMP_EVENT_DEACTIVATE: {
3132                 rc = obd_notify_observer(obd, obd, OBD_NOTIFY_DEACTIVATE);
3133                 break;
3134         }
3135         case IMP_EVENT_ACTIVATE: {
3136                 rc = obd_notify_observer(obd, obd, OBD_NOTIFY_ACTIVATE);
3137                 break;
3138         }
3139         default:
3140                 CERROR("Unknown import event %d\n", event);
3141                 LBUG();
3142         }
3143         RETURN(rc);
3144 }
3145
3146 /**
3147  * Determine whether the lock can be canceled before replaying the lock
3148  * during recovery, see bug16774 for detailed information.
3149  *
3150  * \retval zero the lock can't be canceled
3151  * \retval other ok to cancel
3152  */
3153 static int osc_cancel_weight(struct ldlm_lock *lock)
3