fs: Add a header file for I/O iteration

Provide a struct iov_iter and some related functions to encapsulate an
iterator used when reading and writing files. This will be used with the
new 'file' uclass.

While it is modelled on Linux, I/O vectors have been omitted for now.
These can be added later without updating the interface used by the
uclass.

Signed-off-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
Simon Glass
2025-06-26 07:43:25 -06:00
parent dd58526971
commit 0577f4f81e
2 changed files with 86 additions and 0 deletions

View File

@@ -1200,6 +1200,7 @@ F: fs/dir-uclass.c
F: include/dir.h
F: include/fpga.h
F: include/fs.h
F: include/iovec.h
F: test/dm/fpga.c
FLATTENED DEVICE TREE

85
include/iovec.h Normal file
View File

@@ -0,0 +1,85 @@
/* SPDX-License-Identifier: GPL-2.0 */
/*
* Iterator for I/O, modelled on Linux but significantly simplified
*
* Copyright 2025 Simon Glass <sjg@chromium.org>
*/
#ifndef __IOVEC_H
#define __IOVEC_H
#include <linux/types.h>
/**
* enum iov_type_t - defines the type of this I/O vector
*
* @OIV_BUF: Simple buffer with a size
*/
enum iov_type_t {
OIV_BUF,
};
/**
* struct iov_iter - holds an interator for I/O
*
* Do not use this directly. Instead, call copy_to_iter()
*
* Note that this is much simpler than the Linux version, but can be extended
* later as needed. It is introduced so that we can use the desired API for
* read(), etc. It is also commented properly.
*
* @type: Type of the iterator (always OIV_BUF)
* @data_source: true if this iterator produces data, false if it consumes it
* @offset: Current offset within the buffer
* @buf: Contiguous data buffer to use (other things could be added to the
* union later)
* @count: Size of data buffer
*/
struct iov_iter {
enum iov_type_t type;
bool data_source;
ssize_t offset;
union {
void *ubuf;
};
ssize_t count;
};
/**
* iter_iov_ptr() - Get a pointer to the current position
*
* @iter: Iterator to examine
* Return: pointer to the start of the buffer portion to read/write
*/
static inline void *iter_iov_ptr(const struct iov_iter *iter)
{
return iter->ubuf + iter->offset;
};
/**
* iter_iov_avail() - Get the number of bytes available at the current postiion
*
* @iter: iterator to examine
* Return: number of bytes which can be read/written
*/
static inline ssize_t iter_iov_avail(const struct iov_iter *iter)
{
return iter->count - iter->offset;
};
static inline void iter_ubuf(struct iov_iter *iter, bool data_source, void *buf,
size_t count)
{
*iter = (struct iov_iter) {
.data_source = data_source,
.ubuf = buf,
.count = count,
};
}
static inline void iter_advance(struct iov_iter *iter, size_t len)
{
iter->offset += len;
}
#endif