b1991ee3e7
If a directory looks like it's in bad shape, try to sift through the rubble to find whatever directory entries we can, scan the directory tree for the parent (if needed), stage the new directory contents in a temporary file and use the atomic extent swapping mechanism to commit the results in bulk. Signed-off-by: Darrick J. Wong <djwong@kernel.org> Reviewed-by: Christoph Hellwig <hch@lst.de>
51 lines
1.2 KiB
C
51 lines
1.2 KiB
C
/* SPDX-License-Identifier: GPL-2.0-or-later */
|
|
/*
|
|
* Copyright (c) 2021-2024 Oracle. All Rights Reserved.
|
|
* Author: Darrick J. Wong <djwong@kernel.org>
|
|
*/
|
|
#ifndef __XFS_SCRUB_XFBLOB_H__
|
|
#define __XFS_SCRUB_XFBLOB_H__
|
|
|
|
struct xfblob {
|
|
struct xfile *xfile;
|
|
loff_t last_offset;
|
|
};
|
|
|
|
typedef loff_t xfblob_cookie;
|
|
|
|
int xfblob_create(const char *descr, struct xfblob **blobp);
|
|
void xfblob_destroy(struct xfblob *blob);
|
|
int xfblob_load(struct xfblob *blob, xfblob_cookie cookie, void *ptr,
|
|
uint32_t size);
|
|
int xfblob_store(struct xfblob *blob, xfblob_cookie *cookie, const void *ptr,
|
|
uint32_t size);
|
|
int xfblob_free(struct xfblob *blob, xfblob_cookie cookie);
|
|
unsigned long long xfblob_bytes(struct xfblob *blob);
|
|
void xfblob_truncate(struct xfblob *blob);
|
|
|
|
static inline int
|
|
xfblob_storename(
|
|
struct xfblob *blob,
|
|
xfblob_cookie *cookie,
|
|
const struct xfs_name *xname)
|
|
{
|
|
return xfblob_store(blob, cookie, xname->name, xname->len);
|
|
}
|
|
|
|
static inline int
|
|
xfblob_loadname(
|
|
struct xfblob *blob,
|
|
xfblob_cookie cookie,
|
|
struct xfs_name *xname,
|
|
uint32_t size)
|
|
{
|
|
int ret = xfblob_load(blob, cookie, (void *)xname->name, size);
|
|
if (ret)
|
|
return ret;
|
|
|
|
xname->len = size;
|
|
return 0;
|
|
}
|
|
|
|
#endif /* __XFS_SCRUB_XFBLOB_H__ */
|