1/* 2 * sb.h - NILFS on-memory super block structure. 3 * 4 * Copyright (C) 2005-2008 Nippon Telegraph and Telephone Corporation. 5 * 6 * This program is free software; you can redistribute it and/or modify 7 * it under the terms of the GNU General Public License as published by 8 * the Free Software Foundation; either version 2 of the License, or 9 * (at your option) any later version. 10 * 11 * This program is distributed in the hope that it will be useful, 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 * GNU General Public License for more details. 15 * 16 * You should have received a copy of the GNU General Public License 17 * along with this program; if not, write to the Free Software 18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 19 * 20 * Written by Ryusuke Konishi <ryusuke@osrg.net> 21 * 22 */ 23 24#ifndef _NILFS_SB 25#define _NILFS_SB 26 27#include <linux/types.h> 28#include <linux/fs.h> 29 30/* 31 * Mount options 32 */ 33struct nilfs_mount_options { 34 unsigned long mount_opt; 35 __u64 snapshot_cno; 36}; 37 38struct the_nilfs; 39struct nilfs_sc_info; 40 41/* 42 * NILFS super-block data in memory 43 */ 44struct nilfs_sb_info { 45 /* Snapshot status */ 46 __u64 s_snapshot_cno; /* Checkpoint number */ 47 atomic_t s_inodes_count; 48 atomic_t s_blocks_count; /* Reserved (might be deleted) */ 49 50 /* Mount options */ 51 unsigned long s_mount_opt; 52 uid_t s_resuid; 53 gid_t s_resgid; 54 55 unsigned long s_interval; /* construction interval */ 56 unsigned long s_watermark; /* threshold of data amount 57 for the segment construction */ 58 59 /* Fundamental members */ 60 struct super_block *s_super; /* reverse pointer to super_block */ 61 struct the_nilfs *s_nilfs; 62 struct list_head s_list; /* list head for nilfs->ns_supers */ 63 atomic_t s_count; /* reference count */ 64 65 /* Segment constructor */ 66 struct list_head s_dirty_files; /* dirty files list */ 67 struct nilfs_sc_info *s_sc_info; /* segment constructor info */ 68 spinlock_t s_inode_lock; /* Lock for the nilfs inode. 69 It covers s_dirty_files list */ 70 71 /* Metadata files */ 72 struct inode *s_ifile; /* index file inode */ 73 74 /* Inode allocator */ 75 spinlock_t s_next_gen_lock; 76 u32 s_next_generation; 77}; 78 79static inline struct nilfs_sb_info *NILFS_SB(struct super_block *sb) 80{ 81 return sb->s_fs_info; 82} 83 84static inline struct nilfs_sc_info *NILFS_SC(struct nilfs_sb_info *sbi) 85{ 86 return sbi->s_sc_info; 87} 88 89/* 90 * Bit operations for the mount option 91 */ 92#define nilfs_clear_opt(sbi, opt) \ 93 do { (sbi)->s_mount_opt &= ~NILFS_MOUNT_##opt; } while (0) 94#define nilfs_set_opt(sbi, opt) \ 95 do { (sbi)->s_mount_opt |= NILFS_MOUNT_##opt; } while (0) 96#define nilfs_test_opt(sbi, opt) ((sbi)->s_mount_opt & NILFS_MOUNT_##opt) 97#define nilfs_write_opt(sbi, mask, opt) \ 98 do { (sbi)->s_mount_opt = \ 99 (((sbi)->s_mount_opt & ~NILFS_MOUNT_##mask) | \ 100 NILFS_MOUNT_##opt); \ 101 } while (0) 102 103#endif /* _NILFS_SB */ 104