Motr  M0
io_req.c
Go to the documentation of this file.
1 /* -*- C -*- */
2 /*
3  * Copyright (c) 2020 Seagate Technology LLC and/or its Affiliates
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  * http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  *
17  * For any questions about this software or licensing,
18  * please email opensource@seagate.com or cortx-questions@seagate.com.
19  *
20  */
21 
22 
23 #include "layout/layout.h"
24 
25 #define M0_TRACE_SUBSYSTEM M0_TRACE_SUBSYS_CLIENT
26 #include "lib/trace.h" /* M0_LOG */
27 #include "lib/uuid.h" /* m0_uuid_generate */
28 #include "lib/finject.h" /* Failure Injection */
29 #include "ioservice/fid_convert.h"
30 
31 #include "ut/ut.h" /* M0_UT_ASSERT */
32 #include "motr/ut/client.h"
33 
34 #ifndef __KERNEL__
35 #include <openssl/md5.h>
36 #endif /* __KERNEL__ */
37 
38 
39 /*
40  * Including the c files so we can replace the M0_PRE asserts
41  * in order to test them.
42  */
43 #if defined(round_down)
44 #undef round_down
45 #endif
46 #if defined(round_up)
47 #undef round_up
48 #endif
49 #include "motr/io_req.c"
50 
51 #include "layout/layout_internal.h" /* REMOVE ME */
52 
54 static struct m0_client *dummy_instance;
55 
59 static void ut_test_ioreq_sm_state(void)
60 {
61  struct m0_op_io ioo;
62  uint32_t state;
63 
64  /* Base case. */
65  ioo.ioo_sm.sm_state = 777;
66  state = ioreq_sm_state(&ioo);
67  M0_UT_ASSERT(state == 777);
68 }
69 
74 {
75  struct m0_op_io *ioo;
76  struct m0_client *instance = NULL;
77 
78  /* Init. */
80  ioo = ut_dummy_ioo_create(instance, 1);
81 
82  /* Base case. */
83  m0_sm_group_lock(&instance->m0c_sm_group);
84 
86 
88  /* Extra transitions so we can fini. */
90  m0_sm_group_unlock(&instance->m0c_sm_group);
91 
93 }
94 
99 {
100  struct m0_op_io *ioo;
101  struct m0_client *instance = NULL;
102 
103  /* Init. */
105  ioo = ut_dummy_ioo_create(instance, 1);
106 
107  /* Base case. */
108  m0_sm_group_lock(&instance->m0c_sm_group);
109  ioreq_sm_failed_locked(ioo, -777);
111  M0_UT_ASSERT(ioo->ioo_sm.sm_rc == -777);
112  m0_sm_group_unlock(&instance->m0c_sm_group);
114 
115 }
116 
117 static int
119 {
120  if(M0_FI_ENABLED("ut_mock_launch_dispatch_fails"))
121  return -EINVAL;
122  return 0;
123 }
124 
125 static int
127  enum copy_direction dir,
128  enum page_attr filter)
129 {
130  if (M0_FI_ENABLED("ut_mock_handle_executed_adc_fails")) {
131  ioo->ioo_rc = -EINVAL;
132  return -EINVAL;
133  }
134  return 0;
135 }
136 
137 static int
139 {
140  if (M0_FI_ENABLED("ut_mock_ioreq_parity_recalc_fails"))
141  return -EINVAL;
142  return 0;
143 }
144 
146  bool rmw)
147 {
148  /* Empty */
149 }
150 
151 static void
153  struct m0_sm_ast *ast)
154 {
155  /* Empty */
156 }
161 {
162  struct m0_op_io *ioo;
163  struct m0_sm_group grp;
164  struct m0_sm_group *op_grp;
165  struct m0_sm_group *en_grp;
166  struct m0_client *instance = NULL;
167  struct nw_xfer_ops *nxr_ops;
168  struct m0_realm realm;
169  struct m0_entity entity;
170  struct m0_op_io_ops *ioo_ops;
171  struct nw_xfer_request *xfer_req;
172 
173  /* Init. */
176 
177  /* Base case. */
179 
180  ioo = ut_dummy_ioo_create(instance, 1);
181  op_grp = &ioo->ioo_oo.oo_oc.oc_op.op_sm_group;
182  en_grp = &entity.en_sm_group;
183  m0_sm_group_init(op_grp);
184  m0_sm_group_init(en_grp);
186  M0_OS_INITIALISED, op_grp);
187  M0_UT_ASSERT(ioo->ioo_iomap_nr == 1);
188  /* ioo->ioo_iomap_nr == 1 so idx must be 1 */
189  ioo->ioo_oo.oo_oc.oc_op.op_entity = &entity;
190  ioo->ioo_map_idx = 1;
195  ioo->ioo_nwxfer.nxr_ops = nxr_ops;
196 
197  /* Change the ioo to not use the instance's group. */
198  m0_sm_group_lock(&instance->m0c_sm_group);
199  m0_sm_fini(&ioo->ioo_sm);
200  m0_sm_group_unlock(&instance->m0c_sm_group);
201 
204 
205  /* nxo_dispatch fails */
206  m0_fi_enable_once("ut_mock_handle_launch_dispatch",
207  "ut_mock_launch_dispatch_fails");
208  m0_fi_enable_once("m0_op_failed", "skip_ongoing_io_ref");
212  M0_OS_FAILED);
213 
214  m0_sm_group_lock(op_grp);
216  m0_sm_group_unlock(op_grp);
217 
218  m0_sm_fini(&ioo->ioo_sm);
220 
221  /* Set ioo for Reading */
224  M0_OS_INITIALISED, op_grp);
225 
231  M0_OS_LAUNCHED );
232 
235 
236  m0_sm_group_lock(op_grp);
239  m0_sm_group_unlock(op_grp);
241 
242  /* Set ioo for writing */
245  M0_OS_INITIALISED, op_grp);
246 
247  /* Set some mock callbacks */
253  ioo->ioo_ops = ioo_ops;
254 
258 
261  M0_OS_LAUNCHED );
262 
265 
266  m0_sm_group_lock(op_grp);
269  m0_sm_group_unlock(op_grp);
270 
271  m0_sm_fini(&ioo->ioo_sm);
273 
274  /* ioo for Writing bu iro_application_data_copy fails */
277  M0_OS_INITIALISED, op_grp);
280 
281  m0_fi_enable_once("ut_mock_handle_executed_adc",
282  "ut_mock_handle_executed_adc_fails");
283  m0_fi_enable_once("m0_op_failed", "skip_ongoing_io_ref");
285 
288  M0_OS_FAILED );
289 
290  m0_sm_group_lock(op_grp);
292  m0_sm_fini(&ioo->ioo_sm);
293  m0_sm_group_unlock(op_grp);
295 
296  /* ioo for writing but iro_parity_recalc fails */
299  M0_OS_INITIALISED, op_grp);
302 
303 
304  m0_fi_enable_once("ut_mock_ioreq_parity_recalc",
305  "ut_mock_ioreq_parity_recalc_fails");
306  m0_fi_enable_once("m0_op_failed", "skip_ongoing_io_ref");
308 
311  M0_OS_FAILED );
312 
313  m0_sm_group_lock(op_grp);
315  m0_sm_fini(&ioo->ioo_sm);
316  m0_sm_group_unlock(op_grp);
318 
319  /* ioo->ioo_iomap_nr != 1 ioo->ioo_map_idx */
320  ioo->ioo_map_idx = 0;
322  xfer_req = ut_dummy_xfer_req_create();
323  ioo->ioo_nwxfer = *xfer_req;
324  tioreqht_htable_init(&ioo->ioo_nwxfer.nxr_tioreqs_hash, 1);
326  M0_OS_INITIALISED, op_grp);
329 
330  /* Set some callbacks */
332  ioo->ioo_ops = ioo_ops;
337 
338  tioreqht_htable_fini(&ioo->ioo_nwxfer.nxr_tioreqs_hash);
339  ut_dummy_xfer_req_delete(xfer_req);
343  m0_sm_group_lock(op_grp);
346  m0_sm_group_unlock(op_grp);
348  m0_sm_fini(&ioo->ioo_sm);
350 
351  m0_free(nxr_ops);
352  m0_free(ioo_ops);
353 
354  /* dummy_ioo_delete() won't crash when fining ioo_sm */
356  M0_OS_INITIALISED, op_grp);
358  &instance->m0c_sm_group);
359 
360  /* Finalise op_sm. */
361  m0_sm_group_lock(op_grp);
364  m0_sm_group_unlock(op_grp);
365 
368 
369  /* Fini. */
370  m0_entity_fini(&entity);
371 }
372 
373 static int ut_mock_ioreq_dgmode_read(struct m0_op_io *ioo,
374  bool rmw)
375 {
376  if (M0_FI_ENABLED("ut_mock_dgmode_read_fails")) {
377  ioo->ioo_rc = -EAGAIN;
378  return -EAGAIN;
379  }
380  return 0;
381 }
382 
383 static int ut_mock_ioreq_dgmode_write(struct m0_op_io *ioo,
384  bool rmw)
385 {
386  if (M0_FI_ENABLED("ut_mock_dgmode_write_fails")) {
387  ioo->ioo_rc = -EAGAIN;
388  return -EAGAIN;
389  }
390  return 0;
391 }
392 
393 static int ut_mock_ioreq_dgmode_recover(struct m0_op_io *ioo)
394 {
395  return 0;
396 }
397 
398 static int ut_mock_ioreq_parity_verify(struct m0_op_io *ioo)
399 {
400  if (M0_FI_ENABLED("ut_mock_parity_verify_fail")) {
401  ioo->ioo_rc = -EINVAL;
402  return -EINVAL;
403  }
404 
405  return 0;
406 }
407 
408 
409 
414 {
415  struct m0_sm_group grp;
416  struct m0_sm_group *op_grp;
417  struct m0_client *instance;
418  struct m0_op_io *ioo;
419  struct m0_realm realm;
420  struct m0_entity entity;
421  struct m0_op_io_ops *ioo_ops;
422  struct nw_xfer_ops *nxr_ops;
423 
424  /* Initialise. */
428 
429  /* Base case. */
430  ioo = ut_dummy_ioo_create(instance, 1);
431  ioo->ioo_oo.oo_oc.oc_op.op_entity = &entity;
432  op_grp = &ioo->ioo_oo.oo_oc.oc_op.op_sm_group;
433  m0_sm_group_init(op_grp);
435  M0_OS_INITIALISED, op_grp);
436 
437  M0_UT_ASSERT(ioo->ioo_iomap_nr == 1);
438  ioo->ioo_map_idx = 1;
440  ioo->ioo_rc = 0;
441 
442  /* Set some mock callbacks */
450  ioo->ioo_ops = ioo_ops;
451  M0_ALLOC_PTR(nxr_ops);
453  ioo->ioo_nwxfer.nxr_ops = nxr_ops;
454 
455  m0_sm_group_lock(op_grp);
457  m0_sm_group_unlock(op_grp);
458 
459  /* Set the right state for ioo_sm. */
460  m0_sm_group_lock(&instance->m0c_sm_group);
463  m0_sm_group_unlock(&instance->m0c_sm_group);
464 
468 
470  M0_OS_STABLE);
472 
473  /* ioo->ioo_rc != 0 */
474  /* Change the ioo to not use the instance's group. */
475  m0_sm_group_lock(&instance->m0c_sm_group);
477  m0_sm_fini(&ioo->ioo_sm);
478  m0_sm_group_unlock(&instance->m0c_sm_group);
479 
481 
483 
484  m0_sm_group_lock(&instance->m0c_sm_group);
487  m0_sm_group_unlock(&instance->m0c_sm_group);
488 
489  m0_sm_group_lock(op_grp);
492  M0_OS_INITIALISED, op_grp);
494  m0_sm_group_unlock(op_grp);
495 
496  ioo->ioo_rc = -1;
499 
500  M0_UT_ASSERT(ioo->ioo_oo.oo_oc.oc_op.op_rc == -1);
502  M0_OS_STABLE);
504 
505  ioo->ioo_rc = 0;
506 
507  /* dgmode read fails */
509 
511  m0_sm_group_lock(&instance->m0c_sm_group);
514  m0_sm_group_unlock(&instance->m0c_sm_group);
515 
516 
517  m0_sm_group_lock(op_grp);
519  M0_OS_INITIALISED, op_grp);
521  m0_sm_group_unlock(op_grp);
522 
523  /* Enable FI */
524  m0_fi_enable_once("ut_mock_ioreq_dgmode_read", "ut_mock_dgmode_read_fails");
527  M0_UT_ASSERT(ioo->ioo_oo.oo_oc.oc_op.op_rc == -EAGAIN);
529  M0_OS_STABLE);
531 
532  /* Parity Verification failed */
533  ioo->ioo_rc = 0;
536  m0_sm_group_lock(&instance->m0c_sm_group);
539  m0_sm_group_unlock(&instance->m0c_sm_group);
540 
541  m0_sm_group_lock(op_grp);
543  M0_OS_INITIALISED, op_grp);
545  m0_sm_group_unlock(op_grp);
546 
547  /* Enable FI */
548  m0_fi_enable_once("ut_mock_ioreq_parity_verify", "ut_mock_parity_verify_fail");
551  M0_UT_ASSERT(ioo->ioo_rc == -EINVAL);
553  M0_OS_STABLE);
555 
556  /* Application Data copy fails */
557  ioo->ioo_rc = 0;
560  m0_sm_group_lock(&instance->m0c_sm_group);
563  m0_sm_group_unlock(&instance->m0c_sm_group);
564 
565 
566  m0_sm_group_lock(op_grp);
568  M0_OS_INITIALISED, op_grp);
570  m0_sm_group_unlock(op_grp);
571 
572  /* Enable FI */
573  m0_fi_enable_once("ut_mock_handle_executed_adc",
574  "ut_mock_handle_executed_adc_fails");
577  M0_UT_ASSERT(ioo->ioo_rc == -EINVAL);
579  M0_OS_STABLE);
581 
582  /* Set ioo for writing */
584  ioo->ioo_rc = 0;
585 
588  m0_sm_group_lock(&instance->m0c_sm_group);
591  m0_sm_group_unlock(&instance->m0c_sm_group);
592 
593 
594  m0_sm_group_lock(op_grp);
596  M0_OS_INITIALISED, op_grp);
598  m0_sm_group_unlock(op_grp);
599 
602 
604  M0_OS_STABLE);
606 
607  /* dgmodewrite fails */
608  ioo->ioo_rc = 0;
610 
612  m0_sm_group_lock(&instance->m0c_sm_group);
615  m0_sm_group_unlock(&instance->m0c_sm_group);
616 
617  m0_sm_group_lock(op_grp);
619  M0_OS_INITIALISED, op_grp);
621  m0_sm_group_unlock(op_grp);
622 
623  /*Enable FI*/
624  m0_fi_enable_once("ut_mock_ioreq_dgmode_write",
625  "ut_mock_dgmode_write_fails");
628  M0_UT_ASSERT(ioo->ioo_rc == -EAGAIN);
630  M0_OS_STABLE);
632 
633  m0_free(nxr_ops);
634  m0_free(ioo_ops);
635 
641 
642  /* Finalise client. */
644 }
645 
650 {
651  struct m0_client *instance;
652  struct m0_op_io *ioo;
653  struct m0_realm realm;
654 
655  /* initialise client */
657 
658  /* Base case. */
659  ioo = ut_dummy_ioo_create(instance, 1);
661  instance);
662 
664 
665  M0_UT_ASSERT(ioo->ioo_iomaps == NULL);
666  M0_UT_ASSERT(ioo->ioo_iomap_nr == 0);
668 }
669 
671 {
672 }
673 
677 static void ut_test_data_buf_copy(void)
678 {
679  int i;
680  uint64_t rc;
681  struct m0_bufvec app_data;
682  struct m0_bufvec_cursor app_datacur;
683  struct data_buf data;
684 
685  /* With some fake buffers to read/write into */
686  rc = m0_bufvec_alloc(&app_data, 1, UT_DEFAULT_BLOCK_SIZE);
687  M0_UT_ASSERT(rc == 0);
688 
689  /* and its cursor... */
690  m0_bufvec_cursor_init(&app_datacur, &app_data);
691 
692  /* Build a fake data buf */
694 
695  /* base case */
696  rc = data_buf_copy(&data, &app_datacur, CD_COPY_FROM_APP);
698 
699  /* Reset the cursor */
700  m0_bufvec_cursor_init(&app_datacur, &app_data);
701 
702  /* Check data is copied */
703  memset(app_data.ov_buf[0], 0, app_data.ov_vec.v_count[0]);
704  memset(data.db_buf.b_addr, '!',
705  data.db_buf.b_nob);
706  rc = data_buf_copy(&data, &app_datacur, CD_COPY_TO_APP);
708  M0_UT_ASSERT(memcmp(app_data.ov_buf[0],
709  data.db_buf.b_addr,
710  app_data.ov_vec.v_count[0]) == 0);
711 
712  /* Reset the cursor */
713  m0_bufvec_cursor_init(&app_datacur, &app_data);
714 
715  /* and the other way... */
716  memset(data.db_buf.b_addr, 0, data.db_buf.b_nob);
717  rc = data_buf_copy(&data, &app_datacur, CD_COPY_FROM_APP);
719  M0_UT_ASSERT(memcmp(app_data.ov_buf[0],
720  data.db_buf.b_addr,
721  app_data.ov_vec.v_count[0]) == 0);
722 
723  m0_bufvec_free(&app_data);
724 
725  /* Use a fragmented application buffer */
726  rc = m0_bufvec_alloc(&app_data, 8, UT_DEFAULT_BLOCK_SIZE/8);
727  M0_UT_ASSERT(rc == 0);
728 
729  /* initialise the cursor... */
730  m0_bufvec_cursor_init(&app_datacur, &app_data);
731 
732  memset(data.db_buf.b_addr, '?', data.db_buf.b_nob);
733  rc = data_buf_copy(&data, &app_datacur,
736  for (i = 0; i < app_data.ov_vec.v_nr; i++)
737  M0_UT_ASSERT(memcmp(app_data.ov_buf[i],
738  data.db_buf.b_addr,
739  app_data.ov_vec.v_count[i]) == 0);
740 
741  /* Reset the cursor */
742  m0_bufvec_cursor_init(&app_datacur, &app_data);
743 
744  /* base case */
745  rc = data_buf_copy(&data, &app_datacur, CD_COPY_FROM_APP);
747 
748  m0_bufvec_free(&app_data);
750 }
751 
756 {
757  int rc;
758  struct m0_obj *obj;
759  struct pargrp_iomap *map;
760  struct m0_client *instance;
761  struct m0_bufvec data;
762  struct m0_bufvec_cursor datacur;
763 
764  /* With some fake buffers to read/write into */
766  M0_UT_ASSERT(rc == 0);
767 
768  /* and its cursor... */
769  m0_bufvec_cursor_init(&datacur, &data);
770 
771  /* init client */
773 
774  /* Generate a fake map/ioo etc */
776  map->pi_ioo = ut_dummy_ioo_create(instance, 1);
777  /* Allocate and initialise our fake object */
778  obj = map->pi_ioo->ioo_obj;
779  obj->ob_attr.oa_bshift = M0_DEFAULT_BUF_SHIFT;
780 
781  /* Initialise an index vector for the map */
782  map->pi_ivec.iv_vec.v_count[0] = UT_DEFAULT_BLOCK_SIZE;
783  map->pi_ivec.iv_index[0] = 0;
784 
785  /* base case */
787  UT_DEFAULT_BLOCK_SIZE, &datacur,
789 
790  /* Re-initialise veccursor */
791  m0_bufvec_cursor_init(&datacur, &data);
792 
793  /* base case */
795  UT_DEFAULT_BLOCK_SIZE, &datacur,
797  /* Reset veccursor */
798  m0_bufvec_cursor_init(&datacur, &data);
799 
800  /* XXX IN(filter, (...))? */
801  /* XXX filter isn't used in the READ path, wait until WRITE is
802  * implemented */
803 
804  /* Check data is copied */
805  memset(data.ov_buf[0], 0, data.ov_vec.v_count[0]);
806  memset(map->pi_databufs[0][0]->db_buf.b_addr, '!',
807  map->pi_databufs[0][0]->db_buf.b_nob);
808 
810  UT_DEFAULT_BLOCK_SIZE, &datacur,
812 
813  M0_UT_ASSERT(memcmp(data.ov_buf[0],
814  map->pi_databufs[0][0]->db_buf.b_addr,
815  data.ov_vec.v_count[0]) == 0);
816 
818 
819  /* Check no assert-failures for zero-copy */
822  data.ov_buf[0] = map->pi_databufs[0][0]->db_buf.b_addr;
823  data.ov_vec.v_nr = 1;
826  data.ov_vec.v_count[0] = map->pi_databufs[0][0]->db_buf.b_nob;
827 
828  /* Re-initialise veccursor */
829  m0_bufvec_cursor_init(&datacur, &data);
830 
832  UT_DEFAULT_BLOCK_SIZE, &datacur,
834 
835  /* 'free' our fake buf-vec */
836  data.ov_vec.v_nr = 0;
838  data.ov_vec.v_count = 0;
840  data.ov_buf = NULL;
841 
842  /* allocate a real one */
844  M0_UT_ASSERT(rc == 0);
845 
846  /* Re-initialise veccursor */
847  m0_bufvec_cursor_init(&datacur, &data);
848 
849  /* base case */
851  UT_DEFAULT_BLOCK_SIZE, &datacur,
853 
854  /* Re-initialise veccursor */
855  m0_bufvec_cursor_init(&datacur, &data);
856 
857  /* base case */
859  UT_DEFAULT_BLOCK_SIZE, &datacur,
861 
863  ut_dummy_ioo_delete(map->pi_ioo, instance);
865 }
866 
868 {
869  int rc;
870  struct pargrp_iomap *map;
871  struct m0_op_io *ioo;
872  struct m0_client *instance;
873  struct m0_realm realm;
874 
875  /* Create a dummy ioo */
877  ioo = ut_dummy_ioo_create(instance, 1);
878  ioo->ioo_obj->ob_entity.en_realm = &realm;
880 
881  /* Set the dummy map. */
882  map = ioo->ioo_iomaps[0];
883  M0_UT_ASSERT(map != NULL);
884  map->pi_ioo = ioo;
885  map->pi_ops = &mock_iomap_ops;
886  map->pi_grpid = 0;
887 
889 
891 
892  /*
893  * Test 1. map->pi_rtype == PIR_NONE (normal case)
894  */
895  map->pi_ioo->ioo_oo.oo_oc.oc_op.op_code = M0_OC_WRITE;
896  map->pi_rtype = PIR_READREST;
897  rc = ioreq_parity_recalc(ioo);
898  M0_UT_ASSERT(rc == 0);
899 
900  /* Test 2. Read rest method */
901  map->pi_rtype = PIR_READREST;
902  rc = ioreq_parity_recalc(ioo);
903  M0_UT_ASSERT(rc == 0);
904 
905  /* Test 3. Read old method */
906  map->pi_rtype = PIR_READOLD;
907  rc = ioreq_parity_recalc(ioo);
908  M0_UT_ASSERT(rc == 0);
909 
910  /* free parity bufs*/
912 
913  /* Clean up */
915 }
916 
918 {
919  int i;
920  int j;
921  int k;
922  int rc;
923  struct m0_op_io *ioo;
924  struct m0_obj *obj;
925  struct m0_client *instance;
926  struct m0_bufvec stashed;
927  struct m0_bufvec stashed1;
928  struct m0_bufvec user_data = {};
929  struct m0_md5_inc_context_pi pi;
930  int unit_idx = 0;
931  struct m0_pi_seed seed;
932  unsigned char *curr_context;
933  int buf_idx = 0;
935  struct m0_ivec_cursor extcur;
936  //int l;
937 
938  /* init client */
940 
941  /* Generate a fake map/ioo etc */
943  for (i = 0; i < ioo->ioo_iomap_nr; i++) {
944  ioo->ioo_iomaps[i]->pi_ivec.iv_index[0] =
946  }
947 
948  /* Initialise our fake object */
949  obj = ioo->ioo_obj;
950  obj->ob_attr.oa_bshift = M0_DEFAULT_BUF_SHIFT;
951 
952  /* With some fake buffers to read/write into */
953  stashed = ioo->ioo_data;
955  M0_UT_ASSERT(rc == 0);
956 
957  stashed1 = ioo->ioo_attr;
958  rc = m0_bufvec_alloc(&ioo->ioo_attr, 6, sizeof(struct m0_md5_inc_context_pi));
959  M0_UT_ASSERT(rc == 0);
960 
962  M0_UT_ASSERT(rc == 0);
963 
964  /* extents and buffers must be the same size */
965  ioo->ioo_ext.iv_index[0] = 0;
967 
968  /* base case */
971  PA_NONE);
972  M0_UT_ASSERT(rc == 0);
973 
974  ioo->ioo_iomaps[0]->pi_ioo = ioo;
975 
976  /* Check multiple blocks of data are copied */
977  for (i = 0; i < ioo->ioo_data.ov_vec.v_nr; i++)
978  memset(ioo->ioo_data.ov_buf[i], 0,
979  ioo->ioo_data.ov_vec.v_count[i]);
980 
981  for (i = 0; i < ioo->ioo_attr.ov_vec.v_nr; i++)
982  memset(ioo->ioo_attr.ov_buf[i], 0,
983  ioo->ioo_attr.ov_vec.v_count[i]);
984 
985  for (k = 0; k < ioo->ioo_iomap_nr; k++) {
986  struct pargrp_iomap *map = ioo->ioo_iomaps[k];
987 
988  for (i = 0; i < map->pi_max_row; i++) {
989  for (j = 0; j < map->pi_max_col; j++) {
990  memset(map->pi_databufs[i][j]->db_buf.b_addr,
991  'A'+ 2*k + j,
992  map->pi_databufs[i][j]->db_buf.b_nob);
993  }
994  }
995  }
996 
997  /* allocate an empty buf vec */
999  M0_UT_ASSERT(rc == 0);
1000 
1001  seed.pis_obj_id.f_container = ioo->ioo_obj->ob_entity.en_id.u_hi;
1002  seed.pis_obj_id.f_key = ioo->ioo_obj->ob_entity.en_id.u_lo;
1003 
1004  curr_context = m0_alloc(sizeof(MD5_CTX));
1005  m0_ivec_cursor_init(&extcur, &ioo->ioo_ext);
1006  memset(&pi, 0, sizeof(struct m0_md5_inc_context_pi));
1007 
1008  for (k = 0; k < ioo->ioo_iomap_nr; k++) {
1009 
1010  struct pargrp_iomap *map = ioo->ioo_iomaps[k];
1011 
1012  for (j = 0; j < map->pi_max_col; j++) {
1013 
1014  if (unit_idx != 0) {
1015  flag = M0_PI_NO_FLAG;
1016  memcpy(pi.pimd5c_prev_context, curr_context, sizeof(MD5_CTX));
1017  }
1018 
1019  for (i = 0; i < map->pi_max_row; i++) {
1020  user_data.ov_vec.v_count[0] = map->pi_databufs[i][j]->db_buf.b_nob;
1021  user_data.ov_buf[0] = map->pi_databufs[i][j]->db_buf.b_addr;
1022 
1023  pi.pimd5c_hdr.pih_type = M0_PI_TYPE_MD5_INC_CONTEXT;
1024  seed.pis_data_unit_offset = m0_ivec_cursor_index(&extcur);
1025 
1027  &seed, &user_data, flag,
1028  curr_context, NULL);
1029  M0_UT_ASSERT(rc == 0);
1030  }
1031 
1032  memcpy(ioo->ioo_attr.ov_buf[unit_idx], &pi, sizeof(struct m0_md5_inc_context_pi));
1033  unit_idx++;
1035  }
1036  }
1037 
1040  PA_NONE);
1041  M0_UT_ASSERT(rc == 0);
1042 
1043  for (k = 0; k < ioo->ioo_iomap_nr; k++) {
1044  struct pargrp_iomap *map = ioo->ioo_iomaps[k];
1045 
1046  for (i = 0; i < map->pi_max_row; i++) {
1047  for (j = 0; j < map->pi_max_col; j++) {
1048 
1049  int count = 0;
1050  while (count < map->pi_databufs[i][j]->db_buf.b_nob)
1051  {
1052  M0_UT_ASSERT(memcmp(ioo->ioo_data.ov_buf[buf_idx],
1053  map->pi_databufs[i][j]->db_buf.b_addr+count,
1054  ioo->ioo_data.ov_vec.v_count[buf_idx]) == 0);
1055  count += ioo->ioo_data.ov_vec.v_count[buf_idx];
1056  buf_idx++;
1057  }
1058  }
1059  }
1060  }
1061 
1062 
1063  /* base case */
1066  PA_NONE);
1067  M0_UT_ASSERT(rc == 0);
1068 
1069  m0_bufvec_free(&ioo->ioo_data);
1070  m0_bufvec_free(&ioo->ioo_attr);
1073  ioo->ioo_attr = stashed1;
1074  ioo->ioo_data = stashed;
1076 }
1077 
1078 static void ut_test_device_check(void)
1079 {
1080  int rc;
1081  struct m0_op_io *ioo;
1082  struct m0_client *instance;
1083  struct m0_realm realm;
1084  struct nw_xfer_request *xfer;
1085  struct target_ioreq *ti;
1086  struct m0_fid fid;
1087 
1088  /* init */
1090  ioo = ut_dummy_ioo_create(instance, 1);
1092  instance);
1093  ut_dummy_poolmach_create(instance->m0c_pools_common.pc_cur_pver);
1095 
1096  /* Base cases. */
1097  xfer = &ioo->ioo_nwxfer;
1098  tioreqht_htable_init(&xfer->nxr_tioreqs_hash, 1);
1100  m0_fid_gob_make(&fid, 0, 1);
1101  m0_fid_convert_gob2cob(&fid, &ti->ti_fid, 0);
1102  tioreqht_htable_add(&xfer->nxr_tioreqs_hash, ti);
1103 
1105  &instance->m0c_pools_common.pc_cur_pver->pv_mach,
1106  0, M0_PNDS_OFFLINE);
1107 
1109  &instance->m0c_pools_common.pc_cur_pver->pv_mach,
1110  0, M0_PNDS_FAILED);
1111 
1112  rc = device_check(ioo);
1113  M0_UT_ASSERT(rc == 1);
1114 
1115  tioreqht_htable_del(&xfer->nxr_tioreqs_hash, ti);
1117  tioreqht_htable_fini(&xfer->nxr_tioreqs_hash);
1118 
1119  /* fini */
1121  ut_dummy_poolmach_delete(instance->m0c_pools_common.pc_cur_pver);
1122 }
1123 
1127 static int
1129 {
1130  return 0;
1131 }
1132 
1133 static void ut_test_ioreq_dgmode_read(void)
1134 {
1135  int rc;
1136  struct m0_op_io *ioo;
1137  struct m0_client *instance;
1138  struct nw_xfer_ops *nxr_ops;
1139  struct m0_realm realm;
1140  struct nw_xfer_request *xfer;
1141  struct target_ioreq *ti;
1142  struct m0_fid fid;
1143 
1144  /* Init. */
1146 
1147  ioo = ut_dummy_ioo_create(instance, 1);
1148  ioo->ioo_map_idx = 1;
1152  ut_dummy_poolmach_create(instance->m0c_pools_common.pc_cur_pver);
1153 
1154  xfer = &ioo->ioo_nwxfer;
1155  tioreqht_htable_init(&xfer->nxr_tioreqs_hash, 1);
1157  iofops_tlist_init(&ti->ti_iofops);
1158  m0_fid_gob_make(&fid, 0, 1);
1159  m0_fid_convert_gob2cob(&fid, &ti->ti_fid, 0);
1160  tioreqht_htable_add(&xfer->nxr_tioreqs_hash, ti);
1161 
1162  M0_ALLOC_PTR(nxr_ops);
1166  xfer->nxr_ops = nxr_ops;
1167 
1169  &instance->m0c_pools_common.pc_cur_pver->pv_mach,
1170  0, M0_PNDS_FAILED);
1171 
1172  rc = ioreq_dgmode_read(ioo, 0);
1173  M0_UT_ASSERT(rc == 0);
1174 
1175  tioreqht_htable_del(&xfer->nxr_tioreqs_hash, ti);
1177  tioreqht_htable_fini(&xfer->nxr_tioreqs_hash);
1178 
1179  m0_free(nxr_ops);
1180 
1181  /* Fini. */
1183  ut_dummy_poolmach_delete(instance->m0c_pools_common.pc_cur_pver);
1184 }
1185 
1187 {
1188  int rc;
1189  struct m0_op_io *ioo;
1190  struct m0_client *instance;
1191  struct nw_xfer_ops *nxr_ops;
1192  struct m0_realm realm;
1193  struct nw_xfer_request *xfer;
1194  struct target_ioreq *ti;
1195  struct m0_fid fid;
1196 
1197  /* Init. */
1199 
1200  ioo = ut_dummy_ioo_create(instance, 1);
1201  ioo->ioo_map_idx = 1;
1206  instance->m0c_pools_common.pc_cur_pver);
1207 
1208  xfer = &ioo->ioo_nwxfer;
1209  tioreqht_htable_init(&xfer->nxr_tioreqs_hash, 1);
1211  iofops_tlist_init(&ti->ti_iofops);
1212  m0_fid_gob_make(&fid, 0, 1);
1213  m0_fid_convert_gob2cob(&fid, &ti->ti_fid, 0);
1214  tioreqht_htable_add(&xfer->nxr_tioreqs_hash, ti);
1215 
1216  M0_ALLOC_PTR(nxr_ops);
1220  xfer->nxr_ops = nxr_ops;
1221 
1223  &instance->m0c_pools_common.pc_cur_pver->pv_mach,
1224  0, M0_PNDS_FAILED);
1225 
1226  rc = ioreq_dgmode_write(ioo, 0);
1227  M0_UT_ASSERT(rc == 0);
1228 
1229  tioreqht_htable_del(&xfer->nxr_tioreqs_hash, ti);
1231  tioreqht_htable_fini(&xfer->nxr_tioreqs_hash);
1232 
1233  m0_free(nxr_ops);
1234 
1235  /* Fini. */
1237  ut_dummy_poolmach_delete(instance->m0c_pools_common.pc_cur_pver);
1238 }
1239 
1241 {
1242  int i;
1243  int rc;
1244  struct m0_op_io *ioo;
1245  struct m0_client *instance;
1246  struct m0_realm realm;
1247 
1248  /* Init. */
1250 
1251  ioo = ut_dummy_ioo_create(instance, 1);
1252  ioo->ioo_map_idx = 1;
1257  instance->m0c_pools_common.pc_cur_pver);
1258 
1259  /* base case */
1261  for (i = 0; i < ioo->ioo_iomap_nr; i++)
1262  ioo->ioo_iomaps[i]->pi_ops = &mock_iomap_ops;
1263 
1264  rc = ioreq_dgmode_recover(ioo);
1265  M0_UT_ASSERT(rc == 0);
1266 
1267  /* Fini. */
1269  ut_dummy_poolmach_delete(instance->m0c_pools_common.pc_cur_pver);
1270 }
1271 
1272 M0_INTERNAL int ut_io_req_init(void)
1273 {
1274  int rc;
1276 
1277 #ifndef __KERNEL__
1279 #endif
1280 
1281  m0_fi_enable("m0_op_stable", "skip_ongoing_io_ref");
1282 
1284 
1286  M0_UT_ASSERT(rc == 0);
1287 
1292 
1293  return 0;
1294 }
1295 
1296 M0_INTERNAL int ut_io_req_fini(void)
1297 {
1298  //ut_dummy_pdclust_layout_delete(dummy_pdclust_layout,
1299  // dummy_instance);
1302 
1303  m0_fi_disable("m0_op_stable", "skip_ongoing_io_ref");
1304 
1305  return 0;
1306 }
1307 
1308 struct m0_ut_suite ut_suite_io_req = {
1309  .ts_name = "io-req-ut",
1310  .ts_init = ut_io_req_init,
1311  .ts_fini = ut_io_req_fini,
1312  .ts_tests = {
1313  { "data_buf_copy",
1315  { "ioreq_sm_state",
1317  { "ioreq_sm_state_set_locked",
1319  { "ioreq_sm_failed_locked",
1321  { "ioreq_iosm_handle_launch",
1323  { "ioreq_iosm_handle_executed",
1325  { "ioreq_iomaps_destroy",
1327  { "ioreq_iomaps_prepare",
1329  { "application_data_copy",
1331  { "ioreq_application_data_copy",
1333  { "ioreq_parity_recalc",
1335  { "device_check",
1337  { "ioreq_dgmode_recover",
1339  { "ioreq_dgmode_read",
1341  { "ioreq_dgmode_write",
1343  { NULL, NULL },
1344  }
1345 };
1346 #undef M0_TRACE_SUBSYSTEM
1347 
1348 /*
1349  * Local variables:
1350  * c-indentation-style: "K&R"
1351  * c-basic-offset: 8
1352  * tab-width: 8
1353  * fill-column: 80
1354  * scroll-step: 1
1355  * End:
1356  */
int(* iro_dgmode_read)(struct m0_op_io *ioo, bool rmw)
Definition: pg.h:634
M0_INTERNAL void ut_dummy_paritybufs_create(struct pargrp_iomap *map, bool do_alloc)
Definition: io_dummy.c:251
M0_INTERNAL void m0_ivec_cursor_init(struct m0_ivec_cursor *cur, const struct m0_indexvec *ivec)
Definition: vec.c:707
void ut_layout_domain_empty(struct m0_client *cinst)
Definition: obj.c:218
#define M0_ALLOC_ARR(arr, nr)
Definition: memory.h:84
void m0_entity_fini(struct m0_entity *entity)
Definition: client.c:438
M0_INTERNAL void m0_fid_gob_make(struct m0_fid *gob_fid, uint32_t container, uint64_t key)
Definition: fid_convert.c:46
int(* iro_parity_recalc)(struct m0_op_io *ioo)
Definition: pg.h:595
Definition: client.h:788
M0_INTERNAL void ut_set_device_state(struct m0_poolmach *pm, int dev, enum m0_pool_nd_state state)
Definition: io_pargrp.c:1006
#define NULL
Definition: misc.h:38
map
Definition: processor.c:112
unsigned char * curr_context[DATA_UNIT_COUNT]
static uint64_t data_buf_copy(struct data_buf *data, struct m0_bufvec_cursor *app_datacur, enum copy_direction dir)
Definition: io_req.c:955
static void ioreq_iosm_handle_executed(struct m0_sm_group *grp, struct m0_sm_ast *ast)
Definition: io_req.c:451
int(* iro_parity_verify)(struct m0_op_io *ioo)
Definition: pg.h:605
static struct m0_sm_group * grp
Definition: bytecount.c:38
M0_INTERNAL int ut_io_req_fini(void)
Definition: io_req.c:1296
struct m0_bufvec * user_data
const struct m0_op_io_ops * ioo_ops
struct m0_sm_group * oo_sm_grp
#define UT_DEFAULT_BLOCK_SIZE
Definition: client.h:67
static void ut_test_device_check(void)
Definition: io_req.c:1078
int m0_client_calculate_pi(struct m0_generic_pi *pi, struct m0_pi_seed *seed, struct m0_bufvec *bvec, enum m0_pi_calc_flag flag, unsigned char *curr_context, unsigned char *pi_value_without_seed)
Definition: cksum.c:168
int(* iro_dgmode_write)(struct m0_op_io *ioo, bool rmw)
Definition: pg.h:655
struct m0_vec ov_vec
Definition: vec.h:147
M0_INTERNAL void ut_dummy_pargrp_iomap_delete(struct pargrp_iomap *map, struct m0_client *instance)
Definition: io_dummy.c:340
void(* nxo_complete)(struct nw_xfer_request *xfer, bool rmw)
struct m0_bufvec data
Definition: di.c:40
static void ut_test_ioreq_dgmode_read(void)
Definition: io_req.c:1133
M0_INTERNAL void ut_dummy_target_ioreq_delete(struct target_ioreq *ti)
Definition: io_dummy.c:552
struct m0_sm_conf io_sm_conf
Definition: io_req.c:141
struct m0_op oc_op
static void ut_test_ioreq_iomaps_destroy(void)
Definition: io_req.c:649
static void ut_test_ioreq_sm_state(void)
Definition: io_req.c:59
M0_INTERNAL void ut_dummy_data_buf_fini(struct data_buf *db)
Definition: io_dummy.c:232
Definition: sm.h:504
static void ut_test_ioreq_iomaps_prepare(void)
Definition: io_req.c:670
static void ut_test_data_buf_copy(void)
Definition: io_req.c:677
void ut_layout_domain_fill(struct m0_client *cinst)
Definition: obj.c:208
struct m0_ut_suite ut_suite_io_req
Definition: io_req.c:53
Definition: ut.h:77
M0_INTERNAL int ut_m0_client_init(struct m0_client **instance)
Definition: client.c:265
void ** ov_buf
Definition: vec.h:149
M0_INTERNAL void m0_sm_group_fini(struct m0_sm_group *grp)
Definition: sm.c:65
static struct foo * obj
Definition: tlist.c:302
static struct m0_pdclust_layout * dummy_pdclust_layout
Definition: io.c:50
struct m0_indexvec pi_ivec
Definition: pg.h:340
static m0_bcount_t count
Definition: xcode.c:167
M0_INTERNAL void ut_dummy_paritybufs_delete(struct pargrp_iomap *map, bool do_free)
Definition: io_dummy.c:281
struct m0_sm ioo_sm
M0_INTERNAL struct nw_xfer_request * ut_dummy_xfer_req_create(void)
Definition: io_dummy.c:178
int(* iro_application_data_copy)(struct m0_op_io *ioo, enum copy_direction dir, enum page_attr filter)
Definition: pg.h:583
static int ut_mock_handle_executed_adc(struct m0_op_io *ioo, enum copy_direction dir, enum page_attr filter)
Definition: io_req.c:126
struct m0_fid fid
Definition: di.c:46
M0_INTERNAL int m0_bufvec_alloc(struct m0_bufvec *bufvec, uint32_t num_segs, m0_bcount_t seg_size)
Definition: vec.c:220
struct m0_vec iv_vec
Definition: vec.h:139
unsigned int op_code
Definition: client.h:650
struct m0_semaphore cpus_sem
Definition: io_req.c:45
static struct m0_sm_ast ast[NR]
Definition: locality.c:44
static void ut_test_ioreq_sm_failed_locked(void)
Definition: io_req.c:98
M0_INTERNAL void m0_bufvec_free(struct m0_bufvec *bufvec)
Definition: vec.c:395
static void ut_test_ioreq_iosm_handle_executed(void)
Definition: io_req.c:413
M0_INTERNAL void m0_sm_group_unlock(struct m0_sm_group *grp)
Definition: sm.c:96
void(* iro_iosm_handle_executed)(struct m0_sm_group *grp, struct m0_sm_ast *ast)
Definition: pg.h:622
m0_bindex_t * iv_index
Definition: vec.h:141
Definition: filter.py:1
static int ioreq_parity_recalc(struct m0_op_io *ioo)
Definition: io_req.c:1339
int i
Definition: dir.c:1033
static int device_check(struct m0_op_io *ioo)
Definition: io_req.c:1455
static void ut_test_ioreq_dgmode_write(void)
Definition: io_req.c:1186
static int ut_mock_ioreq_parity_verify(struct m0_op_io *ioo)
Definition: io_req.c:398
M0_INTERNAL void ut_realm_entity_setup(struct m0_realm *realm, struct m0_entity *ent, struct m0_client *cinst)
Definition: client.c:60
static void ioreq_iosm_handle_launch(struct m0_sm_group *grp, struct m0_sm_ast *ast)
Definition: io_req.c:316
struct nw_xfer_request ioo_nwxfer
int(* nxo_distribute)(struct nw_xfer_request *xfer)
struct m0_op_obj ioo_oo
struct m0_sm op_sm
Definition: client.h:656
struct m0_indexvec ioo_ext
M0_INTERNAL void ut_dummy_ioo_delete(struct m0_op_io *ioo, struct m0_client *instance)
Definition: io_dummy.c:463
M0_INTERNAL void m0_fi_disable(const char *fp_func, const char *fp_tag)
Definition: finject.c:485
static struct m0_client * dummy_instance
Definition: io_req.c:54
static void m0_fi_enable(const char *func, const char *tag)
Definition: finject.h:276
M0_INTERNAL void ut_m0_client_fini(struct m0_client **instance)
Definition: client.c:354
M0_INTERNAL void ut_dummy_poolmach_delete(struct m0_pool_version *pv)
Definition: io_dummy.c:628
M0_INTERNAL int ut_io_req_init(void)
Definition: io_req.c:1272
M0_INTERNAL void m0_sm_group_init(struct m0_sm_group *grp)
Definition: sm.c:53
int32_t op_rc
Definition: client.h:652
static int ioreq_dgmode_recover(struct m0_op_io *ioo)
Definition: io_req.c:1371
M0_INTERNAL struct target_ioreq * ut_dummy_target_ioreq_create(void)
Definition: io_dummy.c:532
void m0_sm_state_set(struct m0_sm *mach, int state)
Definition: sm.c:478
const struct nw_xfer_ops * nxr_ops
struct m0_bufvec ioo_data
M0_INTERNAL void ioreq_sm_state_set_locked(struct m0_op_io *ioo, int state)
Definition: io_req.c:193
M0_INTERNAL void m0_bufvec_cursor_init(struct m0_bufvec_cursor *cur, const struct m0_bufvec *bvec)
Definition: vec.c:563
struct m0_obj * ioo_obj
m0_pi_calc_flag
Definition: cksum.h:65
M0_INTERNAL int ut_dummy_poolmach_create(struct m0_pool_version *pv)
Definition: io_dummy.c:563
static void ut_test_ioreq_dgmode_recover(void)
Definition: io_req.c:1240
uint64_t u_hi
Definition: types.h:36
M0_INTERNAL int m0_semaphore_init(struct m0_semaphore *semaphore, unsigned value)
Definition: semaphore.c:38
void * m0_alloc(size_t size)
Definition: memory.c:126
M0_INTERNAL void ut_shuffle_test_order(struct m0_ut_suite *suite)
Definition: client.c:1205
struct m0_pdclust_instance pi
Definition: fd.c:107
struct m0_sm_ast ioo_ast
static int ut_mock_ioreq_parity_recalc(struct m0_op_io *ioo)
Definition: io_req.c:138
uint32_t v_nr
Definition: vec.h:51
int32_t sm_rc
Definition: sm.h:336
static int ioreq_dgmode_write(struct m0_op_io *ioo, bool rmw)
Definition: io_req.c:1721
M0_INTERNAL struct pargrp_iomap * ut_dummy_pargrp_iomap_create(struct m0_client *instance, int num_blocks)
Definition: io_dummy.c:301
struct m0_htable nxr_tioreqs_hash
uint64_t ioo_map_idx
m0_bcount_t * v_count
Definition: vec.h:53
M0_INTERNAL bool m0_ivec_cursor_move(struct m0_ivec_cursor *cur, m0_bcount_t count)
Definition: vec.c:718
struct m0_tl ti_iofops
struct m0_uint128 en_id
Definition: client.h:708
struct m0_op_common oo_oc
static int application_data_copy(struct pargrp_iomap *map, struct m0_obj *obj, m0_bindex_t start, m0_bindex_t end, struct m0_bufvec_cursor *datacur, enum copy_direction dir, enum page_attr filter)
Definition: io_req.c:1017
static void ut_test_application_data_copy(void)
Definition: io_req.c:755
static void ut_test_ioreq_sm_state_set_locked(void)
Definition: io_req.c:73
copy_direction
int32_t ioo_rc
const char * ts_name
Definition: ut.h:99
static int ut_mock_handle_launch_dispatch(struct nw_xfer_request *xfer)
Definition: io_req.c:118
M0_INTERNAL struct m0_pdclust_layout * ut_dummy_pdclust_layout_create(struct m0_client *instance)
Definition: io_dummy.c:79
M0_INTERNAL void ioreq_sm_failed_locked(struct m0_op_io *ioo, int rc)
Definition: io_req.c:212
struct m0_realm * en_realm
Definition: client.h:710
struct m0_op_io * pi_ioo
Definition: pg.h:394
struct m0_sm_group en_sm_group
Definition: client.h:734
struct m0_sm_group op_sm_group
Definition: client.h:654
static int ut_mock_ioreq_dgmode_read(struct m0_op_io *ioo, bool rmw)
Definition: io_req.c:373
M0_INTERNAL struct m0_op_io * ut_dummy_ioo_create(struct m0_client *instance, int num_io_maps)
Definition: io_dummy.c:366
#define M0_FI_ENABLED(tag)
Definition: finject.h:231
Definition: fid.h:38
M0_INTERNAL void m0_sm_init(struct m0_sm *mach, const struct m0_sm_conf *conf, uint32_t state, struct m0_sm_group *grp)
Definition: sm.c:313
static void ioreq_iomaps_destroy(struct m0_op_io *ioo)
Definition: io_req.c:760
struct m0_fid ti_fid
static void ut_test_ioreq_parity_recalc(void)
Definition: io_req.c:867
#define M0_ALLOC_PTR(ptr)
Definition: memory.h:86
static struct m0_realm realm
Definition: sync.c:87
struct m0_entity * op_entity
Definition: client.h:660
static int ut_mock_io_launch_distribute(struct nw_xfer_request *xfer)
Definition: io_req.c:1128
int(* nxo_dispatch)(struct nw_xfer_request *xfer)
M0_INTERNAL void ut_dummy_xfer_req_delete(struct nw_xfer_request *xfer)
Definition: io_dummy.c:193
static int ioreq_dgmode_read(struct m0_op_io *ioo, bool rmw)
Definition: io_req.c:1561
static void ut_mock_ioreq_iosm_handle_executed(struct m0_sm_group *grp, struct m0_sm_ast *ast)
Definition: io_req.c:152
static bool flag
Definition: nucleus.c:266
static void ut_test_ioreq_application_data_copy(void)
Definition: io_req.c:917
int(* iro_dgmode_recover)(struct m0_op_io *ioo)
Definition: pg.h:643
struct m0_entity ob_entity
Definition: client.h:789
page_attr
void ut_mock_handle_executed_complete(struct nw_xfer_request *xfer, bool rmw)
Definition: io_req.c:145
M0_INTERNAL m0_bindex_t m0_ivec_cursor_index(const struct m0_ivec_cursor *cur)
Definition: vec.c:733
M0_INTERNAL void m0_sm_move(struct m0_sm *mach, int32_t rc, int state)
Definition: sm.c:485
struct data_buf *** pi_databufs
static struct m0 instance
Definition: main.c:78
M0_INTERNAL void m0_sm_group_lock(struct m0_sm_group *grp)
Definition: sm.c:83
static void m0_fi_enable_once(const char *func, const char *tag)
Definition: finject.h:301
uint64_t ioo_iomap_nr
static uint32_t ioreq_sm_state(const struct io_request *req)
Definition: file.c:975
static int ut_mock_ioreq_dgmode_recover(struct m0_op_io *ioo)
Definition: io_req.c:393
struct m0_client * re_instance
Definition: client.h:873
M0_INTERNAL void ut_set_node_state(struct m0_poolmach *pm, int node, enum m0_pool_nd_state state)
Definition: io_pargrp.c:1012
struct inode * dir
Definition: dir.c:1028
M0_INTERNAL void m0_fid_convert_gob2cob(const struct m0_fid *gob_fid, struct m0_fid *cob_fid, uint32_t device_id)
Definition: fid_convert.c:55
#define M0T1FS_LAYOUT_N
Definition: client.h:62
const struct m0_op_io_ops ioo_ops
Definition: io_req.c:1860
M0_INTERNAL void m0_client_init_io_op(void)
Definition: io.c:815
static int ioreq_application_data_copy(struct m0_op_io *ioo, enum copy_direction dir, enum page_attr filter)
Definition: io_req.c:1258
uint64_t u_lo
Definition: types.h:37
M0_INTERNAL void m0_sm_asts_run(struct m0_sm_group *grp)
Definition: sm.c:150
const struct pargrp_iomap_ops mock_iomap_ops
Definition: io_dummy.c:670
void m0_free(void *data)
Definition: memory.c:146
uint32_t sm_state
Definition: sm.h:307
struct m0_bufvec ioo_attr
static void ut_test_ioreq_iosm_handle_launch(void)
Definition: io_req.c:160
M0_INTERNAL void m0_bufvec_free2(struct m0_bufvec *bufvec)
Definition: vec.c:401
int32_t rc
Definition: trigger_fop.h:47
const struct pargrp_iomap_ops * pi_ops
#define M0_UT_ASSERT(a)
Definition: ut.h:46
struct m0_sm_conf m0_op_conf
Definition: client.c:145
struct pargrp_iomap ** ioo_iomaps
static int ut_mock_ioreq_dgmode_write(struct m0_op_io *ioo, bool rmw)
Definition: io_req.c:383
Definition: vec.h:145
M0_INTERNAL int m0_bufvec_empty_alloc(struct m0_bufvec *bufvec, uint32_t num_segs)
Definition: vec.c:213
M0_INTERNAL void m0_sm_fini(struct m0_sm *mach)
Definition: sm.c:331
M0_INTERNAL void ut_dummy_data_buf_init(struct data_buf *db)
Definition: io_dummy.c:215