xfs: create a sparse load xfarray function
authorDarrick J. Wong <djwong@kernel.org>
Thu, 22 Feb 2024 20:30:54 +0000 (12:30 -0800)
committerDarrick J. Wong <djwong@kernel.org>
Thu, 22 Feb 2024 20:30:54 +0000 (12:30 -0800)
Create a new method to load an xfarray element from the xfile, but with
a twist.  If we've never stored to the array index, zero the caller's
buffer.  This will facilitate RMWs updates of records in a sparse array
without fuss, since the sparse xfarray convention is that uninitialized
array elements default to zeroes.

This is a separate patch to reduce the size of the upcoming quotacheck
patch.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
Reviewed-by: Christoph Hellwig <hch@lst.de>
fs/xfs/scrub/xfarray.h

index ec643cc9fc143215506059e0ac1b437b0284a4fc..acb2f94c56c13da8ea3775f28c6b36fd32690ccf 100644 (file)
@@ -45,6 +45,25 @@ int xfarray_store(struct xfarray *array, xfarray_idx_t idx, const void *ptr);
 int xfarray_store_anywhere(struct xfarray *array, const void *ptr);
 bool xfarray_element_is_null(struct xfarray *array, const void *ptr);
 
+/*
+ * Load an array element, but zero the buffer if there's no data because we
+ * haven't stored to that array element yet.
+ */
+static inline int
+xfarray_load_sparse(
+       struct xfarray  *array,
+       uint64_t        idx,
+       void            *rec)
+{
+       int             error = xfarray_load(array, idx, rec);
+
+       if (error == -ENODATA) {
+               memset(rec, 0, array->obj_size);
+               return 0;
+       }
+       return error;
+}
+
 /* Append an element to the array. */
 static inline int xfarray_append(struct xfarray *array, const void *ptr)
 {