Track the relative sequence of opening and closing bands and chunks. Necessary for detecting the most recent user data during dirty shutdown recovery. Signed-off-by: Artur Paszkiewicz <artur.paszkiewicz@intel.com> Signed-off-by: Kozlowski Mateusz <mateusz.kozlowski@intel.com> Change-Id: I682030e58284d7b090667e4e5a9f4bbc7615708a Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/13366 Tested-by: SPDK CI Jenkins <sys_sgci@intel.com> Community-CI: Mellanox Build Bot Reviewed-by: Ben Walker <benjamin.walker@intel.com> Reviewed-by: Jim Harris <james.r.harris@intel.com>
80 lines
1.6 KiB
C
80 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;
|
|
|
|
uint64_t last_seq_id;
|
|
};
|
|
|
|
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 */
|