1 /* SPDX-License-Identifier: BSD-3-Clause 2 * Copyright (C) 2022 Intel Corporation. 3 * All rights reserved. 4 */ 5 6 #ifndef FTL_WRITER_H 7 #define FTL_WRITER_H 8 9 #include "spdk/stdinc.h" 10 #include "spdk/queue.h" 11 12 #include "ftl_io.h" 13 14 struct ftl_writer { 15 struct spdk_ftl_dev *dev; 16 17 TAILQ_HEAD(, ftl_rq) rq_queue; 18 19 /* Band currently being written to */ 20 struct ftl_band *band; 21 22 /* Number of bands associated with writer */ 23 uint64_t num_bands; 24 25 /* Band next being written to */ 26 struct ftl_band *next_band; 27 28 /* List of full bands */ 29 TAILQ_HEAD(, ftl_band) full_bands; 30 31 /* FTL band limit which blocks writes */ 32 int limit; 33 34 /* Flag indicating halt has been requested */ 35 bool halt; 36 37 /* Which type of band the writer uses */ 38 enum ftl_band_type writer_type; 39 40 uint64_t last_seq_id; 41 42 /* FTL request to pad the current band */ 43 struct ftl_rq *pad; 44 }; 45 46 bool ftl_writer_is_halted(struct ftl_writer *writer); 47 48 void ftl_writer_init(struct spdk_ftl_dev *dev, struct ftl_writer *writer, 49 uint64_t limit, enum ftl_band_type type); 50 51 void ftl_writer_run(struct ftl_writer *writer); 52 53 void ftl_writer_band_state_change(struct ftl_band *band); 54 55 static inline void 56 ftl_writer_halt(struct ftl_writer *writer) 57 { 58 writer->halt = true; 59 } 60 61 static inline void 62 ftl_writer_resume(struct ftl_writer *writer) 63 { 64 writer->halt = false; 65 } 66 67 bool ftl_writer_is_halted(struct ftl_writer *writer); 68 69 void ftl_writer_run(struct ftl_writer *writer); 70 71 static inline void 72 ftl_writer_queue_rq(struct ftl_writer *writer, struct ftl_rq *rq) 73 { 74 TAILQ_INSERT_TAIL(&writer->rq_queue, rq, qentry); 75 } 76 77 /** 78 * @brief Returns free space in currently processing band 79 */ 80 uint64_t ftl_writer_get_free_blocks(struct ftl_writer *writer); 81 82 #endif /* FTL_WRITER_H */ 83