1 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
2  * Copyright by The HDF Group.                                               *
3  * All rights reserved.                                                      *
4  *                                                                           *
5  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
6  * terms governing use, modification, and redistribution, is contained in    *
7  * the COPYING file, which can be found at the root of the source code       *
8  * distribution tree, or in https://www.hdfgroup.org/licenses.               *
9  * If you do not have access to either file, you may request a copy from     *
10  * help@hdfgroup.org.                                                        *
11  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
12 
13 /*
14  * Purpose:     Dataset callbacks for the native VOL connector
15  *
16  */
17 
18 #define H5D_FRIEND /* Suppress error about including H5Dpkg    */
19 
20 #include "H5private.h"   /* Generic Functions                        */
21 #include "H5CXprivate.h" /* API Contexts                             */
22 #include "H5Dpkg.h"      /* Datasets                                 */
23 #include "H5Eprivate.h"  /* Error handling                           */
24 #include "H5Fprivate.h"  /* Files                                    */
25 #include "H5Gprivate.h"  /* Groups                                   */
26 #include "H5Iprivate.h"  /* IDs                                      */
27 #include "H5Pprivate.h"  /* Property lists                           */
28 #include "H5Sprivate.h"  /* Dataspaces                               */
29 #include "H5VLprivate.h" /* Virtual Object Layer                     */
30 
31 #include "H5VLnative_private.h" /* Native VOL connector                     */
32 
33 /*-------------------------------------------------------------------------
34  * Function:    H5VL__native_dataset_create
35  *
36  * Purpose:     Handles the dataset create callback
37  *
38  * Return:      Success:    dataset pointer
39  *              Failure:    NULL
40  *
41  *-------------------------------------------------------------------------
42  */
43 void *
H5VL__native_dataset_create(void * obj,const H5VL_loc_params_t * loc_params,const char * name,hid_t lcpl_id,hid_t type_id,hid_t space_id,hid_t dcpl_id,hid_t dapl_id,hid_t H5_ATTR_UNUSED dxpl_id,void H5_ATTR_UNUSED ** req)44 H5VL__native_dataset_create(void *obj, const H5VL_loc_params_t *loc_params, const char *name, hid_t lcpl_id,
45                             hid_t type_id, hid_t space_id, hid_t dcpl_id, hid_t dapl_id,
46                             hid_t H5_ATTR_UNUSED dxpl_id, void H5_ATTR_UNUSED **req)
47 {
48     H5G_loc_t    loc;         /* Object location to insert dataset into */
49     H5D_t *      dset = NULL; /* New dataset's info */
50     const H5S_t *space;       /* Dataspace for dataset */
51     void *       ret_value;
52 
53     FUNC_ENTER_PACKAGE
54 
55     /* Check arguments */
56     if (H5G_loc_real(obj, loc_params->obj_type, &loc) < 0)
57         HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "not a file or file object")
58     if (H5I_DATATYPE != H5I_get_type(type_id))
59         HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "not a datatype ID")
60     if (NULL == (space = (const H5S_t *)H5I_object_verify(space_id, H5I_DATASPACE)))
61         HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "not a dataspace ID")
62 
63     /* H5Dcreate_anon */
64     if (NULL == name) {
65         /* build and open the new dataset */
66         if (NULL == (dset = H5D__create(loc.oloc->file, type_id, space, dcpl_id, dapl_id)))
67             HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, NULL, "unable to create dataset")
68     } /* end if */
69     /* H5Dcreate2 */
70     else {
71         /* Create the new dataset & get its ID */
72         if (NULL == (dset = H5D__create_named(&loc, name, type_id, space, lcpl_id, dcpl_id, dapl_id)))
73             HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, NULL, "unable to create dataset")
74     } /* end else */
75 
76     ret_value = (void *)dset;
77 
78 done:
79     if (NULL == name) {
80         /* Release the dataset's object header, if it was created */
81         if (dset) {
82             H5O_loc_t *oloc; /* Object location for dataset */
83 
84             /* Get the new dataset's object location */
85             if (NULL == (oloc = H5D_oloc(dset)))
86                 HDONE_ERROR(H5E_DATASET, H5E_CANTGET, NULL, "unable to get object location of dataset")
87 
88             /* Decrement refcount on dataset's object header in memory */
89             if (H5O_dec_rc_by_loc(oloc) < 0)
90                 HDONE_ERROR(H5E_DATASET, H5E_CANTDEC, NULL,
91                             "unable to decrement refcount on newly created object")
92         } /* end if */
93     }     /* end if */
94 
95     FUNC_LEAVE_NOAPI(ret_value)
96 } /* end H5VL__native_dataset_create() */
97 
98 /*-------------------------------------------------------------------------
99  * Function:    H5VL__native_dataset_open
100  *
101  * Purpose:     Handles the dataset open callback
102  *
103  * Return:      Success:    dataset pointer
104  *              Failure:    NULL
105  *
106  *-------------------------------------------------------------------------
107  */
108 void *
H5VL__native_dataset_open(void * obj,const H5VL_loc_params_t * loc_params,const char * name,hid_t dapl_id,hid_t H5_ATTR_UNUSED dxpl_id,void H5_ATTR_UNUSED ** req)109 H5VL__native_dataset_open(void *obj, const H5VL_loc_params_t *loc_params, const char *name, hid_t dapl_id,
110                           hid_t H5_ATTR_UNUSED dxpl_id, void H5_ATTR_UNUSED **req)
111 {
112     H5D_t *   dset = NULL;
113     H5G_loc_t loc; /* Object location of group */
114     void *    ret_value = NULL;
115 
116     FUNC_ENTER_PACKAGE
117 
118     if (H5G_loc_real(obj, loc_params->obj_type, &loc) < 0)
119         HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "not a file or file object")
120 
121     /* Open the dataset */
122     if (NULL == (dset = H5D__open_name(&loc, name, dapl_id)))
123         HGOTO_ERROR(H5E_DATASET, H5E_CANTOPENOBJ, NULL, "unable to open dataset")
124 
125     ret_value = (void *)dset;
126 
127 done:
128     FUNC_LEAVE_NOAPI(ret_value)
129 } /* end H5VL__native_dataset_open() */
130 
131 /*-------------------------------------------------------------------------
132  * Function:    H5VL__native_dataset_read
133  *
134  * Purpose:     Handles the dataset read callback
135  *
136  * Return:      SUCCEED/FAIL
137  *
138  *-------------------------------------------------------------------------
139  */
140 herr_t
H5VL__native_dataset_read(void * obj,hid_t mem_type_id,hid_t mem_space_id,hid_t file_space_id,hid_t dxpl_id,void * buf,void H5_ATTR_UNUSED ** req)141 H5VL__native_dataset_read(void *obj, hid_t mem_type_id, hid_t mem_space_id, hid_t file_space_id,
142                           hid_t dxpl_id, void *buf, void H5_ATTR_UNUSED **req)
143 {
144     H5D_t *      dset       = (H5D_t *)obj;
145     const H5S_t *mem_space  = NULL;
146     const H5S_t *file_space = NULL;
147     herr_t       ret_value  = SUCCEED; /* Return value */
148 
149     FUNC_ENTER_PACKAGE
150 
151     /* Check arguments */
152     if (NULL == dset->oloc.file)
153         HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "dataset is not associated with a file")
154 
155     /* Get validated dataspace pointers */
156     if (H5S_get_validated_dataspace(mem_space_id, &mem_space) < 0)
157         HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "could not get a validated dataspace from mem_space_id")
158     if (H5S_get_validated_dataspace(file_space_id, &file_space) < 0)
159         HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "could not get a validated dataspace from file_space_id")
160 
161     /* Set DXPL for operation */
162     H5CX_set_dxpl(dxpl_id);
163 
164     /* Read raw data */
165     if (H5D__read(dset, mem_type_id, mem_space, file_space, buf /*out*/) < 0)
166         HGOTO_ERROR(H5E_DATASET, H5E_READERROR, FAIL, "can't read data")
167 
168 done:
169     FUNC_LEAVE_NOAPI(ret_value)
170 } /* end H5VL__native_dataset_read() */
171 
172 /*-------------------------------------------------------------------------
173  * Function:    H5VL__native_dataset_write
174  *
175  * Purpose:     Handles the dataset write callback
176  *
177  * Return:      SUCCEED/FAIL
178  *
179  *-------------------------------------------------------------------------
180  */
181 herr_t
H5VL__native_dataset_write(void * obj,hid_t mem_type_id,hid_t mem_space_id,hid_t file_space_id,hid_t dxpl_id,const void * buf,void H5_ATTR_UNUSED ** req)182 H5VL__native_dataset_write(void *obj, hid_t mem_type_id, hid_t mem_space_id, hid_t file_space_id,
183                            hid_t dxpl_id, const void *buf, void H5_ATTR_UNUSED **req)
184 {
185     H5D_t *      dset       = (H5D_t *)obj;
186     const H5S_t *mem_space  = NULL;
187     const H5S_t *file_space = NULL;
188     herr_t       ret_value  = SUCCEED; /* Return value */
189 
190     FUNC_ENTER_PACKAGE
191 
192     /* check arguments */
193     if (NULL == dset->oloc.file)
194         HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "dataset is not associated with a file")
195 
196     /* Get validated dataspace pointers */
197     if (H5S_get_validated_dataspace(mem_space_id, &mem_space) < 0)
198         HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "could not get a validated dataspace from mem_space_id")
199     if (H5S_get_validated_dataspace(file_space_id, &file_space) < 0)
200         HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "could not get a validated dataspace from file_space_id")
201 
202     /* Set DXPL for operation */
203     H5CX_set_dxpl(dxpl_id);
204 
205     /* Write the data */
206     if (H5D__write(dset, mem_type_id, mem_space, file_space, buf) < 0)
207         HGOTO_ERROR(H5E_DATASET, H5E_WRITEERROR, FAIL, "can't write data")
208 
209 done:
210     FUNC_LEAVE_NOAPI(ret_value)
211 } /* end H5VL__native_dataset_write() */
212 
213 /*-------------------------------------------------------------------------
214  * Function:    H5VL__native_dataset_get
215  *
216  * Purpose:     Handles the dataset get callback
217  *
218  * Return:      SUCCEED/FAIL
219  *
220  *-------------------------------------------------------------------------
221  */
222 herr_t
H5VL__native_dataset_get(void * obj,H5VL_dataset_get_t get_type,hid_t H5_ATTR_UNUSED dxpl_id,void H5_ATTR_UNUSED ** req,va_list arguments)223 H5VL__native_dataset_get(void *obj, H5VL_dataset_get_t get_type, hid_t H5_ATTR_UNUSED dxpl_id,
224                          void H5_ATTR_UNUSED **req, va_list arguments)
225 {
226     H5D_t *dset      = (H5D_t *)obj;
227     herr_t ret_value = SUCCEED; /* Return value */
228 
229     FUNC_ENTER_PACKAGE
230 
231     switch (get_type) {
232         /* H5Dget_space */
233         case H5VL_DATASET_GET_SPACE: {
234             hid_t *ret_id = HDva_arg(arguments, hid_t *);
235 
236             if ((*ret_id = H5D__get_space(dset)) < 0)
237                 HGOTO_ERROR(H5E_ARGS, H5E_CANTGET, FAIL, "can't get space ID of dataset")
238 
239             break;
240         }
241 
242         /* H5Dget_space_status */
243         case H5VL_DATASET_GET_SPACE_STATUS: {
244             H5D_space_status_t *allocation = HDva_arg(arguments, H5D_space_status_t *);
245 
246             /* Read data space address and return */
247             if (H5D__get_space_status(dset, allocation) < 0)
248                 HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to get space status")
249 
250             break;
251         }
252 
253         /* H5Dget_type */
254         case H5VL_DATASET_GET_TYPE: {
255             hid_t *ret_id = HDva_arg(arguments, hid_t *);
256 
257             if ((*ret_id = H5D__get_type(dset)) < 0)
258                 HGOTO_ERROR(H5E_ARGS, H5E_CANTGET, FAIL, "can't get datatype ID of dataset")
259 
260             break;
261         }
262 
263         /* H5Dget_create_plist */
264         case H5VL_DATASET_GET_DCPL: {
265             hid_t *ret_id = HDva_arg(arguments, hid_t *);
266 
267             if ((*ret_id = H5D_get_create_plist(dset)) < 0)
268                 HGOTO_ERROR(H5E_ARGS, H5E_CANTGET, FAIL, "can't get creation property list for dataset")
269 
270             break;
271         }
272 
273         /* H5Dget_access_plist */
274         case H5VL_DATASET_GET_DAPL: {
275             hid_t *ret_id = HDva_arg(arguments, hid_t *);
276 
277             if ((*ret_id = H5D_get_access_plist(dset)) < 0)
278                 HGOTO_ERROR(H5E_ARGS, H5E_CANTGET, FAIL, "can't get access property list for dataset")
279 
280             break;
281         }
282 
283         /* H5Dget_storage_size */
284         case H5VL_DATASET_GET_STORAGE_SIZE: {
285             hsize_t *ret = HDva_arg(arguments, hsize_t *);
286 
287             /* Set return value */
288             if (H5D__get_storage_size(dset, ret) < 0)
289                 HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't get size of dataset's storage")
290             break;
291         }
292 
293         default:
294             HGOTO_ERROR(H5E_VOL, H5E_CANTGET, FAIL, "can't get this type of information from dataset")
295     } /* end switch */
296 
297 done:
298     FUNC_LEAVE_NOAPI(ret_value)
299 } /* end H5VL__native_dataset_get() */
300 
301 /*-------------------------------------------------------------------------
302  * Function:    H5VL__native_dataset_specific
303  *
304  * Purpose:     Handles the dataset specific callback
305  *
306  * Return:      SUCCEED/FAIL
307  *
308  *-------------------------------------------------------------------------
309  */
310 herr_t
H5VL__native_dataset_specific(void * obj,H5VL_dataset_specific_t specific_type,hid_t H5_ATTR_UNUSED dxpl_id,void H5_ATTR_UNUSED ** req,va_list arguments)311 H5VL__native_dataset_specific(void *obj, H5VL_dataset_specific_t specific_type, hid_t H5_ATTR_UNUSED dxpl_id,
312                               void H5_ATTR_UNUSED **req, va_list arguments)
313 {
314     H5D_t *dset      = (H5D_t *)obj;
315     herr_t ret_value = SUCCEED; /* Return value */
316 
317     FUNC_ENTER_PACKAGE
318 
319     switch (specific_type) {
320         /* H5Dspecific_space */
321         case H5VL_DATASET_SET_EXTENT: { /* H5Dset_extent (H5Dextend - deprecated) */
322             const hsize_t *size = HDva_arg(arguments, const hsize_t *);
323 
324             if (H5D__set_extent(dset, size) < 0)
325                 HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to set extent of dataset")
326             break;
327         }
328 
329         case H5VL_DATASET_FLUSH: { /* H5Dflush */
330             hid_t dset_id = HDva_arg(arguments, hid_t);
331 
332             /* Flush the dataset */
333             if (H5D__flush(dset, dset_id) < 0)
334                 HGOTO_ERROR(H5E_DATASET, H5E_CANTFLUSH, FAIL, "unable to flush dataset")
335 
336             break;
337         }
338 
339         case H5VL_DATASET_REFRESH: { /* H5Drefresh */
340             hid_t dset_id = HDva_arg(arguments, hid_t);
341 
342             /* Refresh the dataset */
343             if ((H5D__refresh(dset_id, dset)) < 0)
344                 HGOTO_ERROR(H5E_DATASET, H5E_CANTLOAD, FAIL, "unable to refresh dataset")
345 
346             break;
347         }
348 
349         default:
350             HGOTO_ERROR(H5E_VOL, H5E_UNSUPPORTED, FAIL, "invalid specific operation")
351     } /* end switch */
352 
353 done:
354     FUNC_LEAVE_NOAPI(ret_value)
355 } /* end H5VL__native_dataset_specific() */
356 
357 /*-------------------------------------------------------------------------
358  * Function:    H5VL__native_dataset_optional
359  *
360  * Purpose:     Handles the dataset optional callback
361  *
362  * Return:      SUCCEED/FAIL
363  *
364  *-------------------------------------------------------------------------
365  */
366 herr_t
H5VL__native_dataset_optional(void * obj,H5VL_dataset_optional_t optional_type,hid_t dxpl_id,void H5_ATTR_UNUSED ** req,va_list arguments)367 H5VL__native_dataset_optional(void *obj, H5VL_dataset_optional_t optional_type, hid_t dxpl_id,
368                               void H5_ATTR_UNUSED **req, va_list arguments)
369 {
370     H5D_t *dset      = (H5D_t *)obj; /* Dataset */
371     herr_t ret_value = SUCCEED;      /* Return value */
372 
373     FUNC_ENTER_PACKAGE
374 
375     /* Sanity checks */
376     HDassert(dset);
377 
378     /* Set DXPL for operation */
379     H5CX_set_dxpl(dxpl_id);
380 
381     switch (optional_type) {
382         case H5VL_NATIVE_DATASET_FORMAT_CONVERT: { /* H5Dformat_convert */
383             switch (dset->shared->layout.type) {
384                 case H5D_CHUNKED:
385                     /* Convert the chunk indexing type to version 1 B-tree if not */
386                     if (dset->shared->layout.u.chunk.idx_type != H5D_CHUNK_IDX_BTREE)
387                         if ((H5D__format_convert(dset)) < 0)
388                             HGOTO_ERROR(H5E_DATASET, H5E_CANTLOAD, FAIL,
389                                         "unable to downgrade chunk indexing type for dataset")
390                     break;
391 
392                 case H5D_CONTIGUOUS:
393                 case H5D_COMPACT:
394                     /* Downgrade the layout version to 3 if greater than 3 */
395                     if (dset->shared->layout.version > H5O_LAYOUT_VERSION_DEFAULT)
396                         if ((H5D__format_convert(dset)) < 0)
397                             HGOTO_ERROR(H5E_DATASET, H5E_CANTLOAD, FAIL,
398                                         "unable to downgrade layout version for dataset")
399                     break;
400 
401                 case H5D_VIRTUAL:
402                     /* Nothing to do even though layout is version 4 */
403                     break;
404 
405                 case H5D_LAYOUT_ERROR:
406                 case H5D_NLAYOUTS:
407                     HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid dataset layout type")
408 
409                 default:
410                     HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "unknown dataset layout type")
411             } /* end switch */
412 
413             break;
414         }
415 
416         case H5VL_NATIVE_DATASET_GET_CHUNK_INDEX_TYPE: { /* H5Dget_chunk_index_type */
417             H5D_chunk_index_t *idx_type = HDva_arg(arguments, H5D_chunk_index_t *);
418 
419             /* Make sure the dataset is chunked */
420             if (H5D_CHUNKED != dset->shared->layout.type)
421                 HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a chunked dataset")
422 
423             /* Get the chunk indexing type */
424             *idx_type = dset->shared->layout.u.chunk.idx_type;
425 
426             break;
427         }
428 
429         case H5VL_NATIVE_DATASET_GET_CHUNK_STORAGE_SIZE: { /* H5Dget_chunk_storage_size */
430             hsize_t *offset       = HDva_arg(arguments, hsize_t *);
431             hsize_t *chunk_nbytes = HDva_arg(arguments, hsize_t *);
432 
433             /* Make sure the dataset is chunked */
434             if (H5D_CHUNKED != dset->shared->layout.type)
435                 HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a chunked dataset")
436 
437             /* Call private function */
438             if (H5D__get_chunk_storage_size(dset, offset, chunk_nbytes) < 0)
439                 HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't get storage size of chunk")
440 
441             break;
442         }
443 
444         case H5VL_NATIVE_DATASET_GET_NUM_CHUNKS: { /* H5Dget_num_chunks */
445             const H5S_t *space    = NULL;
446             hid_t        space_id = HDva_arg(arguments, hid_t);
447             hsize_t *    nchunks  = HDva_arg(arguments, hsize_t *);
448 
449             HDassert(dset->shared);
450             HDassert(dset->shared->space);
451 
452             /* When default dataspace is given, use the dataset's dataspace */
453             if (space_id == H5S_ALL)
454                 space = dset->shared->space;
455             else /*  otherwise, use the given space ID */
456                 if (NULL == (space = (const H5S_t *)H5I_object_verify(space_id, H5I_DATASPACE)))
457                 HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a valid dataspace ID")
458 
459             /* Make sure the dataset is chunked */
460             if (H5D_CHUNKED != dset->shared->layout.type)
461                 HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a chunked dataset")
462 
463             /* Call private function */
464             if (H5D__get_num_chunks(dset, space, nchunks) < 0)
465                 HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't get number of chunks")
466 
467             break;
468         }
469 
470         case H5VL_NATIVE_DATASET_GET_CHUNK_INFO_BY_IDX: { /* H5Dget_chunk_info */
471             const H5S_t *space       = NULL;
472             hid_t        space_id    = HDva_arg(arguments, hid_t);
473             hsize_t      chk_index   = HDva_arg(arguments, hsize_t);
474             hsize_t *    offset      = HDva_arg(arguments, hsize_t *);
475             unsigned *   filter_mask = HDva_arg(arguments, unsigned *);
476             haddr_t *    addr        = HDva_arg(arguments, haddr_t *);
477             hsize_t *    size        = HDva_arg(arguments, hsize_t *);
478 
479             HDassert(dset->shared);
480             HDassert(dset->shared->space);
481 
482             /* When default dataspace is given, use the dataset's dataspace */
483             if (space_id == H5S_ALL)
484                 space = dset->shared->space;
485             else /*  otherwise, use the given space ID */
486                 if (NULL == (space = (const H5S_t *)H5I_object_verify(space_id, H5I_DATASPACE)))
487                 HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a valid dataspace ID")
488 
489             /* Make sure the dataset is chunked */
490             if (H5D_CHUNKED != dset->shared->layout.type)
491                 HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a chunked dataset")
492 
493             /* Call private function */
494             if (H5D__get_chunk_info(dset, space, chk_index, offset, filter_mask, addr, size) < 0)
495                 HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't get chunk info by index")
496             break;
497         }
498 
499         case H5VL_NATIVE_DATASET_GET_CHUNK_INFO_BY_COORD: { /* H5Dget_chunk_info_by_coord */
500             hsize_t * offset      = HDva_arg(arguments, hsize_t *);
501             unsigned *filter_mask = HDva_arg(arguments, unsigned *);
502             haddr_t * addr        = HDva_arg(arguments, haddr_t *);
503             hsize_t * size        = HDva_arg(arguments, hsize_t *);
504 
505             HDassert(dset->shared);
506 
507             /* Make sure the dataset is chunked */
508             if (H5D_CHUNKED != dset->shared->layout.type)
509                 HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a chunked dataset")
510 
511             /* Call private function */
512             if (H5D__get_chunk_info_by_coord(dset, offset, filter_mask, addr, size) < 0)
513                 HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't get chunk info by its logical coordinates")
514 
515             break;
516         }
517 
518         case H5VL_NATIVE_DATASET_CHUNK_READ: { /* H5Dread_chunk */
519             const hsize_t *offset  = HDva_arg(arguments, hsize_t *);
520             uint32_t *     filters = HDva_arg(arguments, uint32_t *);
521             void *         buf     = HDva_arg(arguments, void *);
522             hsize_t        offset_copy[H5O_LAYOUT_NDIMS]; /* Internal copy of chunk offset */
523 
524             /* Check arguments */
525             if (NULL == dset->oloc.file)
526                 HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "dataset is not associated with a file")
527             if (H5D_CHUNKED != dset->shared->layout.type)
528                 HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a chunked dataset")
529 
530             /* Copy the user's offset array so we can be sure it's terminated properly.
531              * (we don't want to mess with the user's buffer).
532              */
533             if (H5D__get_offset_copy(dset, offset, offset_copy) < 0)
534                 HGOTO_ERROR(H5E_DATASET, H5E_CANTALLOC, FAIL, "failure to copy offset array")
535 
536             /* Read the raw chunk */
537             if (H5D__chunk_direct_read(dset, offset_copy, filters, buf) < 0)
538                 HGOTO_ERROR(H5E_DATASET, H5E_READERROR, FAIL, "can't read unprocessed chunk data")
539 
540             break;
541         }
542 
543         case H5VL_NATIVE_DATASET_CHUNK_WRITE: { /* H5Dwrite_chunk */
544             uint32_t       filters      = HDva_arg(arguments, uint32_t);
545             const hsize_t *offset       = HDva_arg(arguments, const hsize_t *);
546             uint32_t       data_size_32 = HDva_arg(arguments, uint32_t);
547             const void *   buf          = HDva_arg(arguments, const void *);
548             hsize_t        offset_copy[H5O_LAYOUT_NDIMS]; /* Internal copy of chunk offset */
549 
550             /* Check arguments */
551             if (NULL == dset->oloc.file)
552                 HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "dataset is not associated with a file")
553             if (H5D_CHUNKED != dset->shared->layout.type)
554                 HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a chunked dataset")
555 
556             /* Copy the user's offset array so we can be sure it's terminated properly.
557              * (we don't want to mess with the user's buffer).
558              */
559             if (H5D__get_offset_copy(dset, offset, offset_copy) < 0)
560                 HGOTO_ERROR(H5E_DATASET, H5E_CANTALLOC, FAIL, "failure to copy offset array")
561 
562             /* Write chunk */
563             if (H5D__chunk_direct_write(dset, filters, offset_copy, data_size_32, buf) < 0)
564                 HGOTO_ERROR(H5E_DATASET, H5E_WRITEERROR, FAIL, "can't write unprocessed chunk data")
565 
566             break;
567         }
568 
569         case H5VL_NATIVE_DATASET_GET_VLEN_BUF_SIZE: { /* H5Dvlen_get_buf_size */
570             hid_t    type_id  = HDva_arg(arguments, hid_t);
571             hid_t    space_id = HDva_arg(arguments, hid_t);
572             hsize_t *size     = HDva_arg(arguments, hsize_t *);
573 
574             if (H5D__vlen_get_buf_size(dset, type_id, space_id, size) < 0)
575                 HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't get size of vlen buf needed")
576             break;
577         }
578 
579         /* H5Dget_offset */
580         case H5VL_NATIVE_DATASET_GET_OFFSET: {
581             haddr_t *ret = HDva_arg(arguments, haddr_t *);
582 
583             /* Set return value */
584             *ret = H5D__get_offset(dset);
585             if (!H5F_addr_defined(*ret))
586                 *ret = HADDR_UNDEF;
587             break;
588         }
589 
590         default:
591             HGOTO_ERROR(H5E_VOL, H5E_UNSUPPORTED, FAIL, "invalid optional operation")
592     } /* end switch */
593 
594 done:
595     FUNC_LEAVE_NOAPI(ret_value)
596 } /* end H5VL__native_dataset_optional() */
597 
598 /*-------------------------------------------------------------------------
599  * Function:    H5VL__native_dataset_close
600  *
601  * Purpose:     Handles the dataset close callback
602  *
603  * Return:      Success:    SUCCEED
604  *              Failure:    FAIL (dataset will not be closed)
605  *
606  *-------------------------------------------------------------------------
607  */
608 herr_t
H5VL__native_dataset_close(void * dset,hid_t H5_ATTR_UNUSED dxpl_id,void H5_ATTR_UNUSED ** req)609 H5VL__native_dataset_close(void *dset, hid_t H5_ATTR_UNUSED dxpl_id, void H5_ATTR_UNUSED **req)
610 {
611     herr_t ret_value = SUCCEED; /* Return value */
612 
613     FUNC_ENTER_PACKAGE
614 
615     if (H5D_close((H5D_t *)dset) < 0)
616         HGOTO_ERROR(H5E_DATASET, H5E_CANTDEC, FAIL, "can't close dataset")
617 
618 done:
619     FUNC_LEAVE_NOAPI(ret_value)
620 } /* end H5VL__native_dataset_close() */
621