Home | History | Annotate | Line # | Download | only in ufs
      1 /*	$NetBSD: ufs_wapbl.h,v 1.19 2020/04/11 17:43:54 jdolecek Exp $	*/
      2 
      3 /*-
      4  * Copyright (c) 2003,2006,2008 The NetBSD Foundation, Inc.
      5  * All rights reserved.
      6  *
      7  * This code is derived from software contributed to The NetBSD Foundation
      8  * by Wasabi Systems, Inc.
      9  *
     10  * Redistribution and use in source and binary forms, with or without
     11  * modification, are permitted provided that the following conditions
     12  * are met:
     13  * 1. Redistributions of source code must retain the above copyright
     14  *    notice, this list of conditions and the following disclaimer.
     15  * 2. Redistributions in binary form must reproduce the above copyright
     16  *    notice, this list of conditions and the following disclaimer in the
     17  *    documentation and/or other materials provided with the distribution.
     18  *
     19  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
     20  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
     21  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     22  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
     23  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     24  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     25  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     26  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     27  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     28  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     29  * POSSIBILITY OF SUCH DAMAGE.
     30  */
     31 
     32 
     33 #ifndef _UFS_UFS_UFS_WAPBL_H_
     34 #define	_UFS_UFS_UFS_WAPBL_H_
     35 
     36 #if defined(_KERNEL_OPT)
     37 #include "opt_wapbl.h"
     38 #endif
     39 
     40 /*
     41  * Information for the journal location stored in the superblock.
     42  * We store the journal version, some flags, the journal location
     43  * type, and some location specific "locators" that identify where
     44  * the log itself is located.
     45  */
     46 
     47 /* fs->fs_journal_version */
     48 #define	UFS_WAPBL_VERSION			1
     49 
     50 /* fs->fs_journal_location */
     51 #define	UFS_WAPBL_JOURNALLOC_NONE		0
     52 
     53 #define	UFS_WAPBL_JOURNALLOC_END_PARTITION	1
     54 #define	 UFS_WAPBL_EPART_ADDR			  0 /* locator slots */
     55 #define	 UFS_WAPBL_EPART_COUNT			  1
     56 #define	 UFS_WAPBL_EPART_BLKSZ			  2
     57 #define	 UFS_WAPBL_EPART_UNUSED			  3
     58 
     59 #define	UFS_WAPBL_JOURNALLOC_IN_FILESYSTEM	2
     60 #define	 UFS_WAPBL_INFS_ADDR			  0 /* locator slots */
     61 #define	 UFS_WAPBL_INFS_COUNT			  1
     62 #define	 UFS_WAPBL_INFS_BLKSZ			  2
     63 #define	 UFS_WAPBL_INFS_INO			  3
     64 
     65 /* fs->fs_journal_flags */
     66 #define	UFS_WAPBL_FLAGS_CREATE_LOG		0x1
     67 #define	UFS_WAPBL_FLAGS_CLEAR_LOG		0x2
     68 
     69 
     70 /*
     71  * The journal size is limited to between 1MB and 64MB.
     72  * The default journal size is the filesystem size divided by
     73  * the scale factor - this is 1M of journal per 1GB of filesystem
     74  * space.
     75  *
     76  * XXX: Is 64MB too limiting?  If user explicitly asks for more, allow it?
     77  */
     78 #define	UFS_WAPBL_JOURNAL_SCALE			1024
     79 #define	UFS_WAPBL_MIN_JOURNAL_SIZE		(1024 * 1024)
     80 #define	UFS_WAPBL_MAX_JOURNAL_SIZE		(64 * 1024 * 1024)
     81 
     82 
     83 #if defined(WAPBL)
     84 
     85 static __inline int
     86 ufs_wapbl_begin(struct mount *mp, const char *file, int line)
     87 {
     88 	if (mp->mnt_wapbl) {
     89 		int error;
     90 		error = wapbl_begin(mp->mnt_wapbl, file, line);
     91 		if (error)
     92 			return error;
     93 	}
     94 	return 0;
     95 }
     96 
     97 static __inline void
     98 ufs_wapbl_end(struct mount *mp)
     99 {
    100 	if (mp->mnt_wapbl) {
    101 		wapbl_end(mp->mnt_wapbl);
    102 	}
    103 }
    104 
    105 #define	UFS_WAPBL_BEGIN(mp)						\
    106 	ufs_wapbl_begin(mp, __func__, __LINE__)
    107 #define	UFS_WAPBL_END(mp) ufs_wapbl_end(mp)
    108 
    109 #define	UFS_WAPBL_UPDATE(vp, access, modify, flags)			\
    110 	if ((vp)->v_mount->mnt_wapbl) {					\
    111 		UFS_UPDATE(vp, access, modify, flags);			\
    112 	}
    113 
    114 #ifdef DIAGNOSTIC
    115 #define	UFS_WAPBL_JLOCK_ASSERT(mp)					\
    116 	if (mp->mnt_wapbl) wapbl_jlock_assert(mp->mnt_wapbl)
    117 #define	UFS_WAPBL_JUNLOCK_ASSERT(mp)					\
    118 	if (mp->mnt_wapbl) wapbl_junlock_assert(mp->mnt_wapbl)
    119 #else
    120 #define	UFS_WAPBL_JLOCK_ASSERT(mp)
    121 #define UFS_WAPBL_JUNLOCK_ASSERT(mp)
    122 #endif
    123 
    124 #define	UFS_WAPBL_REGISTER_INODE(mp, ino, mode)				\
    125 	if (mp->mnt_wapbl) wapbl_register_inode(mp->mnt_wapbl, ino, mode)
    126 #define	UFS_WAPBL_UNREGISTER_INODE(mp, ino, mode)			\
    127 	if (mp->mnt_wapbl) wapbl_unregister_inode(mp->mnt_wapbl, ino, mode)
    128 
    129 #define	UFS_WAPBL_REGISTER_DEALLOCATION(mp, blk, len, cookiep)		\
    130 	(mp->mnt_wapbl)							\
    131 	    ? wapbl_register_deallocation(mp->mnt_wapbl, blk, len,	\
    132 		false, cookiep)						\
    133 	    : 0
    134 
    135 #define	UFS_WAPBL_REGISTER_DEALLOCATION_FORCE(mp, blk, len)		\
    136 	(								\
    137 	  (mp->mnt_wapbl)						\
    138 	    ? wapbl_register_deallocation(mp->mnt_wapbl, blk, len,	\
    139 		true, NULL)						\
    140 	    : 0								\
    141 	)
    142 
    143 #define	UFS_WAPBL_UNREGISTER_DEALLOCATION(mp, cookie)			\
    144 	if (mp->mnt_wapbl) wapbl_unregister_deallocation(mp->mnt_wapbl, cookie)
    145 
    146 #else /* ! WAPBL */
    147 #define	UFS_WAPBL_BEGIN(mp) (__USE(mp), 0)
    148 #define	UFS_WAPBL_END(mp)	do { } while (0)
    149 #define	UFS_WAPBL_UPDATE(vp, access, modify, flags)	do { } while (0)
    150 #define	UFS_WAPBL_JLOCK_ASSERT(mp)
    151 #define	UFS_WAPBL_JUNLOCK_ASSERT(mp)
    152 #define	UFS_WAPBL_REGISTER_INODE(mp, ino, mode)		do { } while (0)
    153 #define	UFS_WAPBL_UNREGISTER_INODE(mp, ino, mode)	do { } while (0)
    154 #define	UFS_WAPBL_REGISTER_DEALLOCATION(mp, blk, len, cookiep)		0
    155 #define	UFS_WAPBL_REGISTER_DEALLOCATION_FORCE(mp, blk, len)		0
    156 #define	UFS_WAPBL_UNREGISTER_DEALLOCATION(mp, cookie)	do { } while (0)
    157 #endif
    158 
    159 #endif /* !_UFS_UFS_UFS_WAPBL_H_ */
    160