Spdk/lib/ftl/ftl_writer.h
Kozlowski Mateusz 31cf633679 FTL: Add writer logic
Add writer - tracks and manages band state transitions and write pointer as IO
is issued to it.

Signed-off-by: Kozlowski Mateusz <mateusz.kozlowski@intel.com>
Signed-off-by: Artur Paszkiewicz <artur.paszkiewicz@intel.com>
Change-Id: I5f878dc15bc1c1ac84835f75fe440672fad541d5
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/13335
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: Ben Walker <benjamin.walker@intel.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
2022-08-19 17:37:14 +00:00

78 lines
1.6 KiB
C

/* SPDX-License-Identifier: BSD-3-Clause
* Copyright (c) Intel Corporation.
* All rights reserved.
*/
#ifndef FTL_WRITER_H
#define FTL_WRITER_H
#include "spdk/stdinc.h"
#include "spdk/queue.h"
#include "ftl_io.h"
struct ftl_writer {
struct spdk_ftl_dev *dev;
TAILQ_HEAD(, ftl_rq) rq_queue;
/* Band currently being written to */
struct ftl_band *band;
/* Number of bands associated with writer */
uint64_t num_bands;
/* Band next being written to */
struct ftl_band *next_band;
/* List of full bands */
TAILQ_HEAD(, ftl_band) full_bands;
/* FTL band limit which blocks writes */
int limit;
/* Flag indicating halt has been requested */
bool halt;
/* Which type of band the writer uses */
enum ftl_band_type writer_type;
};
bool ftl_writer_is_halted(struct ftl_writer *writer);
void ftl_writer_init(struct spdk_ftl_dev *dev, struct ftl_writer *writer,
uint64_t limit, enum ftl_band_type type);
void ftl_writer_run(struct ftl_writer *writer);
void ftl_writer_band_state_change(struct ftl_band *band);
static inline void
ftl_writer_halt(struct ftl_writer *writer)
{
writer->halt = true;
}
static inline void
ftl_writer_resume(struct ftl_writer *writer)
{
writer->halt = false;
}
bool ftl_writer_is_halted(struct ftl_writer *writer);
void ftl_writer_run(struct ftl_writer *writer);
static inline void
ftl_writer_queue_rq(struct ftl_writer *writer, struct ftl_rq *rq)
{
TAILQ_INSERT_TAIL(&writer->rq_queue, rq, qentry);
}
/**
* @brief Returns free space in currently processing band
*/
uint64_t ftl_writer_get_free_blocks(struct ftl_writer *writer);
#endif /* FTL_WRITER_H */