3934e8ebb7
Create a simple 'big array' data structure for storage of fixed-size metadata records that will be used to reconstruct a btree index. For repair operations, the most important operations are append, iterate, and sort. Earlier implementations of the big array used linked lists and suffered from severe problems -- pinning all records in kernel memory was not a good idea and frequently lead to OOM situations; random access was very inefficient; and record overhead for the lists was unacceptably high at 40-60%. Therefore, the big memory array relies on the 'xfile' abstraction, which creates a memfd file and stores the records in page cache pages. Since the memfd is created in tmpfs, the memory pages can be pushed out to disk if necessary and we have a built-in usage limit of 50% of physical memory. Signed-off-by: Darrick J. Wong <djwong@kernel.org> Reviewed-by: Kent Overstreet <kent.overstreet@linux.dev> Reviewed-by: Dave Chinner <dchinner@redhat.com>
58 lines
1.4 KiB
C
58 lines
1.4 KiB
C
/* SPDX-License-Identifier: GPL-2.0-or-later */
|
|
/*
|
|
* Copyright (C) 2018-2023 Oracle. All Rights Reserved.
|
|
* Author: Darrick J. Wong <djwong@kernel.org>
|
|
*/
|
|
#ifndef __XFS_SCRUB_XFILE_H__
|
|
#define __XFS_SCRUB_XFILE_H__
|
|
|
|
struct xfile {
|
|
struct file *file;
|
|
};
|
|
|
|
int xfile_create(const char *description, loff_t isize, struct xfile **xfilep);
|
|
void xfile_destroy(struct xfile *xf);
|
|
|
|
ssize_t xfile_pread(struct xfile *xf, void *buf, size_t count, loff_t pos);
|
|
ssize_t xfile_pwrite(struct xfile *xf, const void *buf, size_t count,
|
|
loff_t pos);
|
|
|
|
/*
|
|
* Load an object. Since we're treating this file as "memory", any error or
|
|
* short IO is treated as a failure to allocate memory.
|
|
*/
|
|
static inline int
|
|
xfile_obj_load(struct xfile *xf, void *buf, size_t count, loff_t pos)
|
|
{
|
|
ssize_t ret = xfile_pread(xf, buf, count, pos);
|
|
|
|
if (ret < 0 || ret != count)
|
|
return -ENOMEM;
|
|
return 0;
|
|
}
|
|
|
|
/*
|
|
* Store an object. Since we're treating this file as "memory", any error or
|
|
* short IO is treated as a failure to allocate memory.
|
|
*/
|
|
static inline int
|
|
xfile_obj_store(struct xfile *xf, const void *buf, size_t count, loff_t pos)
|
|
{
|
|
ssize_t ret = xfile_pwrite(xf, buf, count, pos);
|
|
|
|
if (ret < 0 || ret != count)
|
|
return -ENOMEM;
|
|
return 0;
|
|
}
|
|
|
|
loff_t xfile_seek_data(struct xfile *xf, loff_t pos);
|
|
|
|
struct xfile_stat {
|
|
loff_t size;
|
|
unsigned long long bytes;
|
|
};
|
|
|
|
int xfile_stat(struct xfile *xf, struct xfile_stat *statbuf);
|
|
|
|
#endif /* __XFS_SCRUB_XFILE_H__ */
|