8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 1) /* SPDX-License-Identifier: GPL-2.0 */
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 2) /*
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 3) * Simple zone file system for zoned block devices.
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 4) *
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 5) * Copyright (C) 2019 Western Digital Corporation or its affiliates.
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 6) */
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 7) #ifndef __ZONEFS_H__
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 8) #define __ZONEFS_H__
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 9)
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 10) #include <linux/fs.h>
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 11) #include <linux/magic.h>
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 12) #include <linux/uuid.h>
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 13) #include <linux/mutex.h>
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 14) #include <linux/rwsem.h>
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 15)
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 16) /*
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 17) * Maximum length of file names: this only needs to be large enough to fit
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 18) * the zone group directory names and a decimal zone number for file names.
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 19) * 16 characters is plenty.
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 20) */
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 21) #define ZONEFS_NAME_MAX 16
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 22)
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 23) /*
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 24) * Zone types: ZONEFS_ZTYPE_SEQ is used for all sequential zone types
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 25) * defined in linux/blkzoned.h, that is, BLK_ZONE_TYPE_SEQWRITE_REQ and
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 26) * BLK_ZONE_TYPE_SEQWRITE_PREF.
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 27) */
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 28) enum zonefs_ztype {
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 29) ZONEFS_ZTYPE_CNV,
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 30) ZONEFS_ZTYPE_SEQ,
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 31) ZONEFS_ZTYPE_MAX,
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 32) };
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 33)
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 34) static inline enum zonefs_ztype zonefs_zone_type(struct blk_zone *zone)
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 35) {
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 36) if (zone->type == BLK_ZONE_TYPE_CONVENTIONAL)
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 37) return ZONEFS_ZTYPE_CNV;
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 38) return ZONEFS_ZTYPE_SEQ;
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 39) }
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 40)
b5c00e975779c (Johannes Thumshirn 2020-09-11 17:56:50 +0900 41) #define ZONEFS_ZONE_OPEN (1 << 0)
b5c00e975779c (Johannes Thumshirn 2020-09-11 17:56:50 +0900 42)
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 43) /*
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 44) * In-memory inode data.
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 45) */
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 46) struct zonefs_inode_info {
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 47) struct inode i_vnode;
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 48)
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 49) /* File zone type */
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 50) enum zonefs_ztype i_ztype;
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 51)
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 52) /* File zone start sector (512B unit) */
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 53) sector_t i_zsector;
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 54)
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 55) /* File zone write pointer position (sequential zones only) */
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 56) loff_t i_wpoffset;
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 57)
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 58) /* File maximum size */
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 59) loff_t i_max_size;
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 60)
e3c3155bc95ab (Johannes Thumshirn 2020-07-21 21:10:26 +0900 61) /* File zone size */
e3c3155bc95ab (Johannes Thumshirn 2020-07-21 21:10:26 +0900 62) loff_t i_zone_size;
e3c3155bc95ab (Johannes Thumshirn 2020-07-21 21:10:26 +0900 63)
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 64) /*
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 65) * To serialise fully against both syscall and mmap based IO and
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 66) * sequential file truncation, two locks are used. For serializing
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 67) * zonefs_seq_file_truncate() against zonefs_iomap_begin(), that is,
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 68) * file truncate operations against block mapping, i_truncate_mutex is
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 69) * used. i_truncate_mutex also protects against concurrent accesses
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 70) * and changes to the inode private data, and in particular changes to
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 71) * a sequential file size on completion of direct IO writes.
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 72) * Serialization of mmap read IOs with truncate and syscall IO
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 73) * operations is done with i_mmap_sem in addition to i_truncate_mutex.
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 74) * Only zonefs_seq_file_truncate() takes both lock (i_mmap_sem first,
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 75) * i_truncate_mutex second).
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 76) */
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 77) struct mutex i_truncate_mutex;
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 78) struct rw_semaphore i_mmap_sem;
b5c00e975779c (Johannes Thumshirn 2020-09-11 17:56:50 +0900 79)
b5c00e975779c (Johannes Thumshirn 2020-09-11 17:56:50 +0900 80) /* guarded by i_truncate_mutex */
b5c00e975779c (Johannes Thumshirn 2020-09-11 17:56:50 +0900 81) unsigned int i_wr_refcnt;
b5c00e975779c (Johannes Thumshirn 2020-09-11 17:56:50 +0900 82) unsigned int i_flags;
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 83) };
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 84)
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 85) static inline struct zonefs_inode_info *ZONEFS_I(struct inode *inode)
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 86) {
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 87) return container_of(inode, struct zonefs_inode_info, i_vnode);
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 88) }
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 89)
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 90) /*
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 91) * On-disk super block (block 0).
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 92) */
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 93) #define ZONEFS_LABEL_LEN 64
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 94) #define ZONEFS_UUID_SIZE 16
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 95) #define ZONEFS_SUPER_SIZE 4096
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 96)
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 97) struct zonefs_super {
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 98)
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 99) /* Magic number */
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 100) __le32 s_magic;
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 101)
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 102) /* Checksum */
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 103) __le32 s_crc;
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 104)
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 105) /* Volume label */
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 106) char s_label[ZONEFS_LABEL_LEN];
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 107)
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 108) /* 128-bit uuid */
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 109) __u8 s_uuid[ZONEFS_UUID_SIZE];
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 110)
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 111) /* Features */
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 112) __le64 s_features;
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 113)
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 114) /* UID/GID to use for files */
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 115) __le32 s_uid;
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 116) __le32 s_gid;
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 117)
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 118) /* File permissions */
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 119) __le32 s_perm;
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 120)
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 121) /* Padding to ZONEFS_SUPER_SIZE bytes */
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 122) __u8 s_reserved[3988];
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 123)
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 124) } __packed;
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 125)
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 126) /*
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 127) * Feature flags: specified in the s_features field of the on-disk super
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 128) * block struct zonefs_super and in-memory in the s_feartures field of
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 129) * struct zonefs_sb_info.
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 130) */
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 131) enum zonefs_features {
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 132) /*
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 133) * Aggregate contiguous conventional zones into a single file.
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 134) */
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 135) ZONEFS_F_AGGRCNV = 1ULL << 0,
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 136) /*
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 137) * Use super block specified UID for files instead of default 0.
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 138) */
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 139) ZONEFS_F_UID = 1ULL << 1,
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 140) /*
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 141) * Use super block specified GID for files instead of default 0.
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 142) */
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 143) ZONEFS_F_GID = 1ULL << 2,
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 144) /*
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 145) * Use super block specified file permissions instead of default 640.
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 146) */
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 147) ZONEFS_F_PERM = 1ULL << 3,
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 148) };
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 149)
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 150) #define ZONEFS_F_DEFINED_FEATURES \
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 151) (ZONEFS_F_AGGRCNV | ZONEFS_F_UID | ZONEFS_F_GID | ZONEFS_F_PERM)
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 152)
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 153) /*
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 154) * Mount options for zone write pointer error handling.
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 155) */
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 156) #define ZONEFS_MNTOPT_ERRORS_RO (1 << 0) /* Make zone file readonly */
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 157) #define ZONEFS_MNTOPT_ERRORS_ZRO (1 << 1) /* Make zone file offline */
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 158) #define ZONEFS_MNTOPT_ERRORS_ZOL (1 << 2) /* Make zone file offline */
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 159) #define ZONEFS_MNTOPT_ERRORS_REPAIR (1 << 3) /* Remount read-only */
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 160) #define ZONEFS_MNTOPT_ERRORS_MASK \
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 161) (ZONEFS_MNTOPT_ERRORS_RO | ZONEFS_MNTOPT_ERRORS_ZRO | \
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 162) ZONEFS_MNTOPT_ERRORS_ZOL | ZONEFS_MNTOPT_ERRORS_REPAIR)
b5c00e975779c (Johannes Thumshirn 2020-09-11 17:56:50 +0900 163) #define ZONEFS_MNTOPT_EXPLICIT_OPEN (1 << 4) /* Explicit open/close of zones on open/close */
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 164)
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 165) /*
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 166) * In-memory Super block information.
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 167) */
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 168) struct zonefs_sb_info {
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 169)
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 170) unsigned long s_mount_opts;
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 171)
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 172) spinlock_t s_lock;
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 173)
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 174) unsigned long long s_features;
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 175) kuid_t s_uid;
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 176) kgid_t s_gid;
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 177) umode_t s_perm;
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 178) uuid_t s_uuid;
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 179) unsigned int s_zone_sectors_shift;
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 180)
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 181) unsigned int s_nr_files[ZONEFS_ZTYPE_MAX];
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 182)
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 183) loff_t s_blocks;
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 184) loff_t s_used_blocks;
b5c00e975779c (Johannes Thumshirn 2020-09-11 17:56:50 +0900 185)
b5c00e975779c (Johannes Thumshirn 2020-09-11 17:56:50 +0900 186) unsigned int s_max_open_zones;
b5c00e975779c (Johannes Thumshirn 2020-09-11 17:56:50 +0900 187) atomic_t s_open_zones;
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 188) };
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 189)
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 190) static inline struct zonefs_sb_info *ZONEFS_SB(struct super_block *sb)
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 191) {
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 192) return sb->s_fs_info;
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 193) }
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 194)
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 195) #define zonefs_info(sb, format, args...) \
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 196) pr_info("zonefs (%s): " format, sb->s_id, ## args)
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 197) #define zonefs_err(sb, format, args...) \
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 198) pr_err("zonefs (%s) ERROR: " format, sb->s_id, ## args)
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 199) #define zonefs_warn(sb, format, args...) \
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 200) pr_warn("zonefs (%s) WARNING: " format, sb->s_id, ## args)
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 201)
8dcc1a9d90c10 (Damien Le Moal 2019-12-25 16:07:44 +0900 202) #endif