1*783f6184SRyusuke Konishi /* 2*783f6184SRyusuke Konishi * super.c - NILFS module and super block management. 3*783f6184SRyusuke Konishi * 4*783f6184SRyusuke Konishi * Copyright (C) 2005-2008 Nippon Telegraph and Telephone Corporation. 5*783f6184SRyusuke Konishi * 6*783f6184SRyusuke Konishi * This program is free software; you can redistribute it and/or modify 7*783f6184SRyusuke Konishi * it under the terms of the GNU General Public License as published by 8*783f6184SRyusuke Konishi * the Free Software Foundation; either version 2 of the License, or 9*783f6184SRyusuke Konishi * (at your option) any later version. 10*783f6184SRyusuke Konishi * 11*783f6184SRyusuke Konishi * This program is distributed in the hope that it will be useful, 12*783f6184SRyusuke Konishi * but WITHOUT ANY WARRANTY; without even the implied warranty of 13*783f6184SRyusuke Konishi * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14*783f6184SRyusuke Konishi * GNU General Public License for more details. 15*783f6184SRyusuke Konishi * 16*783f6184SRyusuke Konishi * You should have received a copy of the GNU General Public License 17*783f6184SRyusuke Konishi * along with this program; if not, write to the Free Software 18*783f6184SRyusuke Konishi * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 19*783f6184SRyusuke Konishi * 20*783f6184SRyusuke Konishi * Written by Ryusuke Konishi <ryusuke@osrg.net> 21*783f6184SRyusuke Konishi */ 22*783f6184SRyusuke Konishi /* 23*783f6184SRyusuke Konishi * linux/fs/ext2/super.c 24*783f6184SRyusuke Konishi * 25*783f6184SRyusuke Konishi * Copyright (C) 1992, 1993, 1994, 1995 26*783f6184SRyusuke Konishi * Remy Card (card@masi.ibp.fr) 27*783f6184SRyusuke Konishi * Laboratoire MASI - Institut Blaise Pascal 28*783f6184SRyusuke Konishi * Universite Pierre et Marie Curie (Paris VI) 29*783f6184SRyusuke Konishi * 30*783f6184SRyusuke Konishi * from 31*783f6184SRyusuke Konishi * 32*783f6184SRyusuke Konishi * linux/fs/minix/inode.c 33*783f6184SRyusuke Konishi * 34*783f6184SRyusuke Konishi * Copyright (C) 1991, 1992 Linus Torvalds 35*783f6184SRyusuke Konishi * 36*783f6184SRyusuke Konishi * Big-endian to little-endian byte-swapping/bitmaps by 37*783f6184SRyusuke Konishi * David S. Miller (davem@caip.rutgers.edu), 1995 38*783f6184SRyusuke Konishi */ 39*783f6184SRyusuke Konishi 40*783f6184SRyusuke Konishi #include <linux/module.h> 41*783f6184SRyusuke Konishi #include <linux/string.h> 42*783f6184SRyusuke Konishi #include <linux/slab.h> 43*783f6184SRyusuke Konishi #include <linux/init.h> 44*783f6184SRyusuke Konishi #include <linux/blkdev.h> 45*783f6184SRyusuke Konishi #include <linux/parser.h> 46*783f6184SRyusuke Konishi #include <linux/random.h> 47*783f6184SRyusuke Konishi #include <linux/crc32.h> 48*783f6184SRyusuke Konishi #include <linux/smp_lock.h> 49*783f6184SRyusuke Konishi #include <linux/vfs.h> 50*783f6184SRyusuke Konishi #include <linux/writeback.h> 51*783f6184SRyusuke Konishi #include <linux/kobject.h> 52*783f6184SRyusuke Konishi #include <linux/exportfs.h> 53*783f6184SRyusuke Konishi #include "nilfs.h" 54*783f6184SRyusuke Konishi #include "mdt.h" 55*783f6184SRyusuke Konishi #include "alloc.h" 56*783f6184SRyusuke Konishi #include "page.h" 57*783f6184SRyusuke Konishi #include "cpfile.h" 58*783f6184SRyusuke Konishi #include "ifile.h" 59*783f6184SRyusuke Konishi #include "dat.h" 60*783f6184SRyusuke Konishi #include "segment.h" 61*783f6184SRyusuke Konishi #include "segbuf.h" 62*783f6184SRyusuke Konishi 63*783f6184SRyusuke Konishi MODULE_AUTHOR("NTT Corp."); 64*783f6184SRyusuke Konishi MODULE_DESCRIPTION("A New Implementation of the Log-structured Filesystem " 65*783f6184SRyusuke Konishi "(NILFS)"); 66*783f6184SRyusuke Konishi MODULE_VERSION(NILFS_VERSION); 67*783f6184SRyusuke Konishi MODULE_LICENSE("GPL"); 68*783f6184SRyusuke Konishi 69*783f6184SRyusuke Konishi static int nilfs_remount(struct super_block *sb, int *flags, char *data); 70*783f6184SRyusuke Konishi static int test_exclusive_mount(struct file_system_type *fs_type, 71*783f6184SRyusuke Konishi struct block_device *bdev, int flags); 72*783f6184SRyusuke Konishi 73*783f6184SRyusuke Konishi /** 74*783f6184SRyusuke Konishi * nilfs_error() - report failure condition on a filesystem 75*783f6184SRyusuke Konishi * 76*783f6184SRyusuke Konishi * nilfs_error() sets an ERROR_FS flag on the superblock as well as 77*783f6184SRyusuke Konishi * reporting an error message. It should be called when NILFS detects 78*783f6184SRyusuke Konishi * incoherences or defects of meta data on disk. As for sustainable 79*783f6184SRyusuke Konishi * errors such as a single-shot I/O error, nilfs_warning() or the printk() 80*783f6184SRyusuke Konishi * function should be used instead. 81*783f6184SRyusuke Konishi * 82*783f6184SRyusuke Konishi * The segment constructor must not call this function because it can 83*783f6184SRyusuke Konishi * kill itself. 84*783f6184SRyusuke Konishi */ 85*783f6184SRyusuke Konishi void nilfs_error(struct super_block *sb, const char *function, 86*783f6184SRyusuke Konishi const char *fmt, ...) 87*783f6184SRyusuke Konishi { 88*783f6184SRyusuke Konishi struct nilfs_sb_info *sbi = NILFS_SB(sb); 89*783f6184SRyusuke Konishi va_list args; 90*783f6184SRyusuke Konishi 91*783f6184SRyusuke Konishi va_start(args, fmt); 92*783f6184SRyusuke Konishi printk(KERN_CRIT "NILFS error (device %s): %s: ", sb->s_id, function); 93*783f6184SRyusuke Konishi vprintk(fmt, args); 94*783f6184SRyusuke Konishi printk("\n"); 95*783f6184SRyusuke Konishi va_end(args); 96*783f6184SRyusuke Konishi 97*783f6184SRyusuke Konishi if (!(sb->s_flags & MS_RDONLY)) { 98*783f6184SRyusuke Konishi struct the_nilfs *nilfs = sbi->s_nilfs; 99*783f6184SRyusuke Konishi 100*783f6184SRyusuke Konishi if (!nilfs_test_opt(sbi, ERRORS_CONT)) 101*783f6184SRyusuke Konishi nilfs_detach_segment_constructor(sbi); 102*783f6184SRyusuke Konishi 103*783f6184SRyusuke Konishi down_write(&nilfs->ns_sem); 104*783f6184SRyusuke Konishi if (!(nilfs->ns_mount_state & NILFS_ERROR_FS)) { 105*783f6184SRyusuke Konishi nilfs->ns_mount_state |= NILFS_ERROR_FS; 106*783f6184SRyusuke Konishi nilfs->ns_sbp->s_state |= cpu_to_le16(NILFS_ERROR_FS); 107*783f6184SRyusuke Konishi nilfs_commit_super(sbi); 108*783f6184SRyusuke Konishi } 109*783f6184SRyusuke Konishi up_write(&nilfs->ns_sem); 110*783f6184SRyusuke Konishi 111*783f6184SRyusuke Konishi if (nilfs_test_opt(sbi, ERRORS_RO)) { 112*783f6184SRyusuke Konishi printk(KERN_CRIT "Remounting filesystem read-only\n"); 113*783f6184SRyusuke Konishi sb->s_flags |= MS_RDONLY; 114*783f6184SRyusuke Konishi } 115*783f6184SRyusuke Konishi } 116*783f6184SRyusuke Konishi 117*783f6184SRyusuke Konishi if (nilfs_test_opt(sbi, ERRORS_PANIC)) 118*783f6184SRyusuke Konishi panic("NILFS (device %s): panic forced after error\n", 119*783f6184SRyusuke Konishi sb->s_id); 120*783f6184SRyusuke Konishi } 121*783f6184SRyusuke Konishi 122*783f6184SRyusuke Konishi void nilfs_warning(struct super_block *sb, const char *function, 123*783f6184SRyusuke Konishi const char *fmt, ...) 124*783f6184SRyusuke Konishi { 125*783f6184SRyusuke Konishi va_list args; 126*783f6184SRyusuke Konishi 127*783f6184SRyusuke Konishi va_start(args, fmt); 128*783f6184SRyusuke Konishi printk(KERN_WARNING "NILFS warning (device %s): %s: ", 129*783f6184SRyusuke Konishi sb->s_id, function); 130*783f6184SRyusuke Konishi vprintk(fmt, args); 131*783f6184SRyusuke Konishi printk("\n"); 132*783f6184SRyusuke Konishi va_end(args); 133*783f6184SRyusuke Konishi } 134*783f6184SRyusuke Konishi 135*783f6184SRyusuke Konishi static struct kmem_cache *nilfs_inode_cachep; 136*783f6184SRyusuke Konishi 137*783f6184SRyusuke Konishi struct inode *nilfs_alloc_inode(struct super_block *sb) 138*783f6184SRyusuke Konishi { 139*783f6184SRyusuke Konishi struct nilfs_inode_info *ii; 140*783f6184SRyusuke Konishi 141*783f6184SRyusuke Konishi ii = kmem_cache_alloc(nilfs_inode_cachep, GFP_NOFS); 142*783f6184SRyusuke Konishi if (!ii) 143*783f6184SRyusuke Konishi return NULL; 144*783f6184SRyusuke Konishi ii->i_bh = NULL; 145*783f6184SRyusuke Konishi ii->i_state = 0; 146*783f6184SRyusuke Konishi ii->vfs_inode.i_version = 1; 147*783f6184SRyusuke Konishi nilfs_btnode_cache_init(&ii->i_btnode_cache); 148*783f6184SRyusuke Konishi return &ii->vfs_inode; 149*783f6184SRyusuke Konishi } 150*783f6184SRyusuke Konishi 151*783f6184SRyusuke Konishi void nilfs_destroy_inode(struct inode *inode) 152*783f6184SRyusuke Konishi { 153*783f6184SRyusuke Konishi kmem_cache_free(nilfs_inode_cachep, NILFS_I(inode)); 154*783f6184SRyusuke Konishi } 155*783f6184SRyusuke Konishi 156*783f6184SRyusuke Konishi static void init_once(void *obj) 157*783f6184SRyusuke Konishi { 158*783f6184SRyusuke Konishi struct nilfs_inode_info *ii = obj; 159*783f6184SRyusuke Konishi 160*783f6184SRyusuke Konishi INIT_LIST_HEAD(&ii->i_dirty); 161*783f6184SRyusuke Konishi #ifdef CONFIG_NILFS_XATTR 162*783f6184SRyusuke Konishi init_rwsem(&ii->xattr_sem); 163*783f6184SRyusuke Konishi #endif 164*783f6184SRyusuke Konishi nilfs_btnode_cache_init_once(&ii->i_btnode_cache); 165*783f6184SRyusuke Konishi ii->i_bmap = (struct nilfs_bmap *)&ii->i_bmap_union; 166*783f6184SRyusuke Konishi inode_init_once(&ii->vfs_inode); 167*783f6184SRyusuke Konishi } 168*783f6184SRyusuke Konishi 169*783f6184SRyusuke Konishi static int nilfs_init_inode_cache(void) 170*783f6184SRyusuke Konishi { 171*783f6184SRyusuke Konishi nilfs_inode_cachep = kmem_cache_create("nilfs2_inode_cache", 172*783f6184SRyusuke Konishi sizeof(struct nilfs_inode_info), 173*783f6184SRyusuke Konishi 0, SLAB_RECLAIM_ACCOUNT, 174*783f6184SRyusuke Konishi init_once); 175*783f6184SRyusuke Konishi 176*783f6184SRyusuke Konishi return (nilfs_inode_cachep == NULL) ? -ENOMEM : 0; 177*783f6184SRyusuke Konishi } 178*783f6184SRyusuke Konishi 179*783f6184SRyusuke Konishi static inline void nilfs_destroy_inode_cache(void) 180*783f6184SRyusuke Konishi { 181*783f6184SRyusuke Konishi kmem_cache_destroy(nilfs_inode_cachep); 182*783f6184SRyusuke Konishi } 183*783f6184SRyusuke Konishi 184*783f6184SRyusuke Konishi static void nilfs_clear_inode(struct inode *inode) 185*783f6184SRyusuke Konishi { 186*783f6184SRyusuke Konishi struct nilfs_inode_info *ii = NILFS_I(inode); 187*783f6184SRyusuke Konishi struct nilfs_transaction_info ti; 188*783f6184SRyusuke Konishi struct nilfs_sb_info *sbi = NILFS_SB(inode->i_sb); 189*783f6184SRyusuke Konishi 190*783f6184SRyusuke Konishi #ifdef CONFIG_NILFS_POSIX_ACL 191*783f6184SRyusuke Konishi if (ii->i_acl && ii->i_acl != NILFS_ACL_NOT_CACHED) { 192*783f6184SRyusuke Konishi posix_acl_release(ii->i_acl); 193*783f6184SRyusuke Konishi ii->i_acl = NILFS_ACL_NOT_CACHED; 194*783f6184SRyusuke Konishi } 195*783f6184SRyusuke Konishi if (ii->i_default_acl && ii->i_default_acl != NILFS_ACL_NOT_CACHED) { 196*783f6184SRyusuke Konishi posix_acl_release(ii->i_default_acl); 197*783f6184SRyusuke Konishi ii->i_default_acl = NILFS_ACL_NOT_CACHED; 198*783f6184SRyusuke Konishi } 199*783f6184SRyusuke Konishi #endif 200*783f6184SRyusuke Konishi /* 201*783f6184SRyusuke Konishi * Free resources allocated in nilfs_read_inode(), here. 202*783f6184SRyusuke Konishi */ 203*783f6184SRyusuke Konishi nilfs_transaction_begin(inode->i_sb, &ti, 0); 204*783f6184SRyusuke Konishi 205*783f6184SRyusuke Konishi spin_lock(&sbi->s_inode_lock); 206*783f6184SRyusuke Konishi if (!list_empty(&ii->i_dirty)) 207*783f6184SRyusuke Konishi list_del_init(&ii->i_dirty); 208*783f6184SRyusuke Konishi brelse(ii->i_bh); 209*783f6184SRyusuke Konishi ii->i_bh = NULL; 210*783f6184SRyusuke Konishi spin_unlock(&sbi->s_inode_lock); 211*783f6184SRyusuke Konishi 212*783f6184SRyusuke Konishi if (test_bit(NILFS_I_BMAP, &ii->i_state)) 213*783f6184SRyusuke Konishi nilfs_bmap_clear(ii->i_bmap); 214*783f6184SRyusuke Konishi 215*783f6184SRyusuke Konishi nilfs_btnode_cache_clear(&ii->i_btnode_cache); 216*783f6184SRyusuke Konishi 217*783f6184SRyusuke Konishi nilfs_transaction_end(inode->i_sb, 0); 218*783f6184SRyusuke Konishi } 219*783f6184SRyusuke Konishi 220*783f6184SRyusuke Konishi /** 221*783f6184SRyusuke Konishi * nilfs_update_last_segment - change pointer to the latest segment 222*783f6184SRyusuke Konishi * @sbi: nilfs_sb_info 223*783f6184SRyusuke Konishi * @update_cno: flag whether to update checkpoint number. 224*783f6184SRyusuke Konishi * 225*783f6184SRyusuke Konishi * nilfs_update_last_segment() changes information in the super block 226*783f6184SRyusuke Konishi * after a partial segment is written out successfully. The super 227*783f6184SRyusuke Konishi * block is marked dirty. It will be written out at the next VFS sync 228*783f6184SRyusuke Konishi * operations such as sync_supers() and generic_shutdown_super(). 229*783f6184SRyusuke Konishi */ 230*783f6184SRyusuke Konishi void nilfs_update_last_segment(struct nilfs_sb_info *sbi, int update_cno) 231*783f6184SRyusuke Konishi { 232*783f6184SRyusuke Konishi struct the_nilfs *nilfs = sbi->s_nilfs; 233*783f6184SRyusuke Konishi struct nilfs_super_block *sbp = nilfs->ns_sbp; 234*783f6184SRyusuke Konishi 235*783f6184SRyusuke Konishi /* nilfs->sem must be locked by the caller. */ 236*783f6184SRyusuke Konishi spin_lock(&nilfs->ns_last_segment_lock); 237*783f6184SRyusuke Konishi if (update_cno) 238*783f6184SRyusuke Konishi nilfs->ns_last_cno = nilfs->ns_cno++; 239*783f6184SRyusuke Konishi sbp->s_last_seq = cpu_to_le64(nilfs->ns_last_seq); 240*783f6184SRyusuke Konishi sbp->s_last_pseg = cpu_to_le64(nilfs->ns_last_pseg); 241*783f6184SRyusuke Konishi sbp->s_last_cno = cpu_to_le64(nilfs->ns_last_cno); 242*783f6184SRyusuke Konishi spin_unlock(&nilfs->ns_last_segment_lock); 243*783f6184SRyusuke Konishi 244*783f6184SRyusuke Konishi sbi->s_super->s_dirt = 1; /* must be set if delaying the call of 245*783f6184SRyusuke Konishi nilfs_commit_super() */ 246*783f6184SRyusuke Konishi } 247*783f6184SRyusuke Konishi 248*783f6184SRyusuke Konishi static int nilfs_sync_super(struct nilfs_sb_info *sbi) 249*783f6184SRyusuke Konishi { 250*783f6184SRyusuke Konishi struct the_nilfs *nilfs = sbi->s_nilfs; 251*783f6184SRyusuke Konishi int err; 252*783f6184SRyusuke Konishi int barrier_done = 0; 253*783f6184SRyusuke Konishi 254*783f6184SRyusuke Konishi if (nilfs_test_opt(sbi, BARRIER)) { 255*783f6184SRyusuke Konishi set_buffer_ordered(nilfs->ns_sbh); 256*783f6184SRyusuke Konishi barrier_done = 1; 257*783f6184SRyusuke Konishi } 258*783f6184SRyusuke Konishi retry: 259*783f6184SRyusuke Konishi set_buffer_dirty(nilfs->ns_sbh); 260*783f6184SRyusuke Konishi err = sync_dirty_buffer(nilfs->ns_sbh); 261*783f6184SRyusuke Konishi if (err == -EOPNOTSUPP && barrier_done) { 262*783f6184SRyusuke Konishi nilfs_warning(sbi->s_super, __func__, 263*783f6184SRyusuke Konishi "barrier-based sync failed. " 264*783f6184SRyusuke Konishi "disabling barriers\n"); 265*783f6184SRyusuke Konishi nilfs_clear_opt(sbi, BARRIER); 266*783f6184SRyusuke Konishi barrier_done = 0; 267*783f6184SRyusuke Konishi clear_buffer_ordered(nilfs->ns_sbh); 268*783f6184SRyusuke Konishi goto retry; 269*783f6184SRyusuke Konishi } 270*783f6184SRyusuke Konishi if (unlikely(err)) 271*783f6184SRyusuke Konishi printk(KERN_ERR 272*783f6184SRyusuke Konishi "NILFS: unable to write superblock (err=%d)\n", err); 273*783f6184SRyusuke Konishi else { 274*783f6184SRyusuke Konishi nilfs_dispose_used_segments(nilfs); 275*783f6184SRyusuke Konishi clear_nilfs_discontinued(nilfs); 276*783f6184SRyusuke Konishi } 277*783f6184SRyusuke Konishi 278*783f6184SRyusuke Konishi return err; 279*783f6184SRyusuke Konishi } 280*783f6184SRyusuke Konishi 281*783f6184SRyusuke Konishi int nilfs_commit_super(struct nilfs_sb_info *sbi) 282*783f6184SRyusuke Konishi { 283*783f6184SRyusuke Konishi struct the_nilfs *nilfs = sbi->s_nilfs; 284*783f6184SRyusuke Konishi struct nilfs_super_block *sbp = nilfs->ns_sbp; 285*783f6184SRyusuke Konishi sector_t nfreeblocks; 286*783f6184SRyusuke Konishi int err; 287*783f6184SRyusuke Konishi 288*783f6184SRyusuke Konishi /* nilfs->sem must be locked by the caller. */ 289*783f6184SRyusuke Konishi err = nilfs_count_free_blocks(nilfs, &nfreeblocks); 290*783f6184SRyusuke Konishi if (unlikely(err)) { 291*783f6184SRyusuke Konishi printk(KERN_ERR "NILFS: failed to count free blocks\n"); 292*783f6184SRyusuke Konishi return err; 293*783f6184SRyusuke Konishi } 294*783f6184SRyusuke Konishi sbp->s_free_blocks_count = cpu_to_le64(nfreeblocks); 295*783f6184SRyusuke Konishi sbp->s_wtime = cpu_to_le64(get_seconds()); 296*783f6184SRyusuke Konishi sbp->s_sum = 0; 297*783f6184SRyusuke Konishi sbp->s_sum = crc32_le(nilfs->ns_crc_seed, (unsigned char *)sbp, 298*783f6184SRyusuke Konishi le16_to_cpu(sbp->s_bytes)); 299*783f6184SRyusuke Konishi 300*783f6184SRyusuke Konishi sbi->s_super->s_dirt = 0; 301*783f6184SRyusuke Konishi return nilfs_sync_super(sbi); 302*783f6184SRyusuke Konishi } 303*783f6184SRyusuke Konishi 304*783f6184SRyusuke Konishi static void nilfs_put_super(struct super_block *sb) 305*783f6184SRyusuke Konishi { 306*783f6184SRyusuke Konishi struct nilfs_sb_info *sbi = NILFS_SB(sb); 307*783f6184SRyusuke Konishi struct the_nilfs *nilfs = sbi->s_nilfs; 308*783f6184SRyusuke Konishi 309*783f6184SRyusuke Konishi nilfs_detach_segment_constructor(sbi); 310*783f6184SRyusuke Konishi 311*783f6184SRyusuke Konishi if (!(sb->s_flags & MS_RDONLY)) { 312*783f6184SRyusuke Konishi down_write(&nilfs->ns_sem); 313*783f6184SRyusuke Konishi nilfs->ns_sbp->s_state = cpu_to_le16(nilfs->ns_mount_state); 314*783f6184SRyusuke Konishi nilfs_commit_super(sbi); 315*783f6184SRyusuke Konishi up_write(&nilfs->ns_sem); 316*783f6184SRyusuke Konishi } 317*783f6184SRyusuke Konishi 318*783f6184SRyusuke Konishi nilfs_detach_checkpoint(sbi); 319*783f6184SRyusuke Konishi put_nilfs(sbi->s_nilfs); 320*783f6184SRyusuke Konishi sbi->s_super = NULL; 321*783f6184SRyusuke Konishi sb->s_fs_info = NULL; 322*783f6184SRyusuke Konishi kfree(sbi); 323*783f6184SRyusuke Konishi } 324*783f6184SRyusuke Konishi 325*783f6184SRyusuke Konishi /** 326*783f6184SRyusuke Konishi * nilfs_write_super - write super block(s) of NILFS 327*783f6184SRyusuke Konishi * @sb: super_block 328*783f6184SRyusuke Konishi * 329*783f6184SRyusuke Konishi * nilfs_write_super() gets a fs-dependent lock, writes super block(s), and 330*783f6184SRyusuke Konishi * clears s_dirt. This function is called in the section protected by 331*783f6184SRyusuke Konishi * lock_super(). 332*783f6184SRyusuke Konishi * 333*783f6184SRyusuke Konishi * The s_dirt flag is managed by each filesystem and we protect it by ns_sem 334*783f6184SRyusuke Konishi * of the struct the_nilfs. Lock order must be as follows: 335*783f6184SRyusuke Konishi * 336*783f6184SRyusuke Konishi * 1. lock_super() 337*783f6184SRyusuke Konishi * 2. down_write(&nilfs->ns_sem) 338*783f6184SRyusuke Konishi * 339*783f6184SRyusuke Konishi * Inside NILFS, locking ns_sem is enough to protect s_dirt and the buffer 340*783f6184SRyusuke Konishi * of the super block (nilfs->ns_sbp). 341*783f6184SRyusuke Konishi * 342*783f6184SRyusuke Konishi * In most cases, VFS functions call lock_super() before calling these 343*783f6184SRyusuke Konishi * methods. So we must be careful not to bring on deadlocks when using 344*783f6184SRyusuke Konishi * lock_super(); see generic_shutdown_super(), write_super(), and so on. 345*783f6184SRyusuke Konishi * 346*783f6184SRyusuke Konishi * Note that order of lock_kernel() and lock_super() depends on contexts 347*783f6184SRyusuke Konishi * of VFS. We should also note that lock_kernel() can be used in its 348*783f6184SRyusuke Konishi * protective section and only the outermost one has an effect. 349*783f6184SRyusuke Konishi */ 350*783f6184SRyusuke Konishi static void nilfs_write_super(struct super_block *sb) 351*783f6184SRyusuke Konishi { 352*783f6184SRyusuke Konishi struct nilfs_sb_info *sbi = NILFS_SB(sb); 353*783f6184SRyusuke Konishi struct the_nilfs *nilfs = sbi->s_nilfs; 354*783f6184SRyusuke Konishi 355*783f6184SRyusuke Konishi down_write(&nilfs->ns_sem); 356*783f6184SRyusuke Konishi if (!(sb->s_flags & MS_RDONLY)) 357*783f6184SRyusuke Konishi nilfs_commit_super(sbi); 358*783f6184SRyusuke Konishi sb->s_dirt = 0; 359*783f6184SRyusuke Konishi up_write(&nilfs->ns_sem); 360*783f6184SRyusuke Konishi } 361*783f6184SRyusuke Konishi 362*783f6184SRyusuke Konishi static int nilfs_sync_fs(struct super_block *sb, int wait) 363*783f6184SRyusuke Konishi { 364*783f6184SRyusuke Konishi int err = 0; 365*783f6184SRyusuke Konishi 366*783f6184SRyusuke Konishi /* This function is called when super block should be written back */ 367*783f6184SRyusuke Konishi if (wait) 368*783f6184SRyusuke Konishi err = nilfs_construct_segment(sb); 369*783f6184SRyusuke Konishi return err; 370*783f6184SRyusuke Konishi } 371*783f6184SRyusuke Konishi 372*783f6184SRyusuke Konishi int nilfs_attach_checkpoint(struct nilfs_sb_info *sbi, __u64 cno) 373*783f6184SRyusuke Konishi { 374*783f6184SRyusuke Konishi struct the_nilfs *nilfs = sbi->s_nilfs; 375*783f6184SRyusuke Konishi struct nilfs_checkpoint *raw_cp; 376*783f6184SRyusuke Konishi struct buffer_head *bh_cp; 377*783f6184SRyusuke Konishi int err; 378*783f6184SRyusuke Konishi 379*783f6184SRyusuke Konishi down_write(&nilfs->ns_sem); 380*783f6184SRyusuke Konishi list_add(&sbi->s_list, &nilfs->ns_supers); 381*783f6184SRyusuke Konishi up_write(&nilfs->ns_sem); 382*783f6184SRyusuke Konishi 383*783f6184SRyusuke Konishi sbi->s_ifile = nilfs_mdt_new( 384*783f6184SRyusuke Konishi nilfs, sbi->s_super, NILFS_IFILE_INO, NILFS_IFILE_GFP); 385*783f6184SRyusuke Konishi if (!sbi->s_ifile) 386*783f6184SRyusuke Konishi return -ENOMEM; 387*783f6184SRyusuke Konishi 388*783f6184SRyusuke Konishi err = nilfs_palloc_init_blockgroup(sbi->s_ifile, nilfs->ns_inode_size); 389*783f6184SRyusuke Konishi if (unlikely(err)) 390*783f6184SRyusuke Konishi goto failed; 391*783f6184SRyusuke Konishi 392*783f6184SRyusuke Konishi err = nilfs_cpfile_get_checkpoint(nilfs->ns_cpfile, cno, 0, &raw_cp, 393*783f6184SRyusuke Konishi &bh_cp); 394*783f6184SRyusuke Konishi if (unlikely(err)) { 395*783f6184SRyusuke Konishi if (err == -ENOENT || err == -EINVAL) { 396*783f6184SRyusuke Konishi printk(KERN_ERR 397*783f6184SRyusuke Konishi "NILFS: Invalid checkpoint " 398*783f6184SRyusuke Konishi "(checkpoint number=%llu)\n", 399*783f6184SRyusuke Konishi (unsigned long long)cno); 400*783f6184SRyusuke Konishi err = -EINVAL; 401*783f6184SRyusuke Konishi } 402*783f6184SRyusuke Konishi goto failed; 403*783f6184SRyusuke Konishi } 404*783f6184SRyusuke Konishi err = nilfs_read_inode_common(sbi->s_ifile, &raw_cp->cp_ifile_inode); 405*783f6184SRyusuke Konishi if (unlikely(err)) 406*783f6184SRyusuke Konishi goto failed_bh; 407*783f6184SRyusuke Konishi atomic_set(&sbi->s_inodes_count, le64_to_cpu(raw_cp->cp_inodes_count)); 408*783f6184SRyusuke Konishi atomic_set(&sbi->s_blocks_count, le64_to_cpu(raw_cp->cp_blocks_count)); 409*783f6184SRyusuke Konishi 410*783f6184SRyusuke Konishi nilfs_cpfile_put_checkpoint(nilfs->ns_cpfile, cno, bh_cp); 411*783f6184SRyusuke Konishi return 0; 412*783f6184SRyusuke Konishi 413*783f6184SRyusuke Konishi failed_bh: 414*783f6184SRyusuke Konishi nilfs_cpfile_put_checkpoint(nilfs->ns_cpfile, cno, bh_cp); 415*783f6184SRyusuke Konishi failed: 416*783f6184SRyusuke Konishi nilfs_mdt_destroy(sbi->s_ifile); 417*783f6184SRyusuke Konishi sbi->s_ifile = NULL; 418*783f6184SRyusuke Konishi 419*783f6184SRyusuke Konishi down_write(&nilfs->ns_sem); 420*783f6184SRyusuke Konishi list_del_init(&sbi->s_list); 421*783f6184SRyusuke Konishi up_write(&nilfs->ns_sem); 422*783f6184SRyusuke Konishi 423*783f6184SRyusuke Konishi return err; 424*783f6184SRyusuke Konishi } 425*783f6184SRyusuke Konishi 426*783f6184SRyusuke Konishi void nilfs_detach_checkpoint(struct nilfs_sb_info *sbi) 427*783f6184SRyusuke Konishi { 428*783f6184SRyusuke Konishi struct the_nilfs *nilfs = sbi->s_nilfs; 429*783f6184SRyusuke Konishi 430*783f6184SRyusuke Konishi nilfs_mdt_clear(sbi->s_ifile); 431*783f6184SRyusuke Konishi nilfs_mdt_destroy(sbi->s_ifile); 432*783f6184SRyusuke Konishi sbi->s_ifile = NULL; 433*783f6184SRyusuke Konishi down_write(&nilfs->ns_sem); 434*783f6184SRyusuke Konishi list_del_init(&sbi->s_list); 435*783f6184SRyusuke Konishi up_write(&nilfs->ns_sem); 436*783f6184SRyusuke Konishi } 437*783f6184SRyusuke Konishi 438*783f6184SRyusuke Konishi static int nilfs_mark_recovery_complete(struct nilfs_sb_info *sbi) 439*783f6184SRyusuke Konishi { 440*783f6184SRyusuke Konishi struct the_nilfs *nilfs = sbi->s_nilfs; 441*783f6184SRyusuke Konishi int err = 0; 442*783f6184SRyusuke Konishi 443*783f6184SRyusuke Konishi down_write(&nilfs->ns_sem); 444*783f6184SRyusuke Konishi if (!(nilfs->ns_mount_state & NILFS_VALID_FS)) { 445*783f6184SRyusuke Konishi nilfs->ns_mount_state |= NILFS_VALID_FS; 446*783f6184SRyusuke Konishi err = nilfs_commit_super(sbi); 447*783f6184SRyusuke Konishi if (likely(!err)) 448*783f6184SRyusuke Konishi printk(KERN_INFO "NILFS: recovery complete.\n"); 449*783f6184SRyusuke Konishi } 450*783f6184SRyusuke Konishi up_write(&nilfs->ns_sem); 451*783f6184SRyusuke Konishi return err; 452*783f6184SRyusuke Konishi } 453*783f6184SRyusuke Konishi 454*783f6184SRyusuke Konishi static int nilfs_statfs(struct dentry *dentry, struct kstatfs *buf) 455*783f6184SRyusuke Konishi { 456*783f6184SRyusuke Konishi struct super_block *sb = dentry->d_sb; 457*783f6184SRyusuke Konishi struct nilfs_sb_info *sbi = NILFS_SB(sb); 458*783f6184SRyusuke Konishi unsigned long long blocks; 459*783f6184SRyusuke Konishi unsigned long overhead; 460*783f6184SRyusuke Konishi unsigned long nrsvblocks; 461*783f6184SRyusuke Konishi sector_t nfreeblocks; 462*783f6184SRyusuke Konishi struct the_nilfs *nilfs = sbi->s_nilfs; 463*783f6184SRyusuke Konishi int err; 464*783f6184SRyusuke Konishi 465*783f6184SRyusuke Konishi /* 466*783f6184SRyusuke Konishi * Compute all of the segment blocks 467*783f6184SRyusuke Konishi * 468*783f6184SRyusuke Konishi * The blocks before first segment and after last segment 469*783f6184SRyusuke Konishi * are excluded. 470*783f6184SRyusuke Konishi */ 471*783f6184SRyusuke Konishi blocks = nilfs->ns_blocks_per_segment * nilfs->ns_nsegments 472*783f6184SRyusuke Konishi - nilfs->ns_first_data_block; 473*783f6184SRyusuke Konishi nrsvblocks = nilfs->ns_nrsvsegs * nilfs->ns_blocks_per_segment; 474*783f6184SRyusuke Konishi 475*783f6184SRyusuke Konishi /* 476*783f6184SRyusuke Konishi * Compute the overhead 477*783f6184SRyusuke Konishi * 478*783f6184SRyusuke Konishi * When distributing meta data blocks outside semgent structure, 479*783f6184SRyusuke Konishi * We must count them as the overhead. 480*783f6184SRyusuke Konishi */ 481*783f6184SRyusuke Konishi overhead = 0; 482*783f6184SRyusuke Konishi 483*783f6184SRyusuke Konishi err = nilfs_count_free_blocks(nilfs, &nfreeblocks); 484*783f6184SRyusuke Konishi if (unlikely(err)) 485*783f6184SRyusuke Konishi return err; 486*783f6184SRyusuke Konishi 487*783f6184SRyusuke Konishi buf->f_type = NILFS_SUPER_MAGIC; 488*783f6184SRyusuke Konishi buf->f_bsize = sb->s_blocksize; 489*783f6184SRyusuke Konishi buf->f_blocks = blocks - overhead; 490*783f6184SRyusuke Konishi buf->f_bfree = nfreeblocks; 491*783f6184SRyusuke Konishi buf->f_bavail = (buf->f_bfree >= nrsvblocks) ? 492*783f6184SRyusuke Konishi (buf->f_bfree - nrsvblocks) : 0; 493*783f6184SRyusuke Konishi buf->f_files = atomic_read(&sbi->s_inodes_count); 494*783f6184SRyusuke Konishi buf->f_ffree = 0; /* nilfs_count_free_inodes(sb); */ 495*783f6184SRyusuke Konishi buf->f_namelen = NILFS_NAME_LEN; 496*783f6184SRyusuke Konishi return 0; 497*783f6184SRyusuke Konishi } 498*783f6184SRyusuke Konishi 499*783f6184SRyusuke Konishi static struct super_operations nilfs_sops = { 500*783f6184SRyusuke Konishi .alloc_inode = nilfs_alloc_inode, 501*783f6184SRyusuke Konishi .destroy_inode = nilfs_destroy_inode, 502*783f6184SRyusuke Konishi .dirty_inode = nilfs_dirty_inode, 503*783f6184SRyusuke Konishi /* .write_inode = nilfs_write_inode, */ 504*783f6184SRyusuke Konishi /* .put_inode = nilfs_put_inode, */ 505*783f6184SRyusuke Konishi /* .drop_inode = nilfs_drop_inode, */ 506*783f6184SRyusuke Konishi .delete_inode = nilfs_delete_inode, 507*783f6184SRyusuke Konishi .put_super = nilfs_put_super, 508*783f6184SRyusuke Konishi .write_super = nilfs_write_super, 509*783f6184SRyusuke Konishi .sync_fs = nilfs_sync_fs, 510*783f6184SRyusuke Konishi /* .write_super_lockfs */ 511*783f6184SRyusuke Konishi /* .unlockfs */ 512*783f6184SRyusuke Konishi .statfs = nilfs_statfs, 513*783f6184SRyusuke Konishi .remount_fs = nilfs_remount, 514*783f6184SRyusuke Konishi .clear_inode = nilfs_clear_inode, 515*783f6184SRyusuke Konishi /* .umount_begin */ 516*783f6184SRyusuke Konishi /* .show_options */ 517*783f6184SRyusuke Konishi }; 518*783f6184SRyusuke Konishi 519*783f6184SRyusuke Konishi static struct inode * 520*783f6184SRyusuke Konishi nilfs_nfs_get_inode(struct super_block *sb, u64 ino, u32 generation) 521*783f6184SRyusuke Konishi { 522*783f6184SRyusuke Konishi struct inode *inode; 523*783f6184SRyusuke Konishi 524*783f6184SRyusuke Konishi if (ino < NILFS_FIRST_INO(sb) && ino != NILFS_ROOT_INO && 525*783f6184SRyusuke Konishi ino != NILFS_SKETCH_INO) 526*783f6184SRyusuke Konishi return ERR_PTR(-ESTALE); 527*783f6184SRyusuke Konishi 528*783f6184SRyusuke Konishi inode = nilfs_iget(sb, ino); 529*783f6184SRyusuke Konishi if (IS_ERR(inode)) 530*783f6184SRyusuke Konishi return ERR_CAST(inode); 531*783f6184SRyusuke Konishi if (generation && inode->i_generation != generation) { 532*783f6184SRyusuke Konishi iput(inode); 533*783f6184SRyusuke Konishi return ERR_PTR(-ESTALE); 534*783f6184SRyusuke Konishi } 535*783f6184SRyusuke Konishi 536*783f6184SRyusuke Konishi return inode; 537*783f6184SRyusuke Konishi } 538*783f6184SRyusuke Konishi 539*783f6184SRyusuke Konishi static struct dentry * 540*783f6184SRyusuke Konishi nilfs_fh_to_dentry(struct super_block *sb, struct fid *fid, int fh_len, 541*783f6184SRyusuke Konishi int fh_type) 542*783f6184SRyusuke Konishi { 543*783f6184SRyusuke Konishi return generic_fh_to_dentry(sb, fid, fh_len, fh_type, 544*783f6184SRyusuke Konishi nilfs_nfs_get_inode); 545*783f6184SRyusuke Konishi } 546*783f6184SRyusuke Konishi 547*783f6184SRyusuke Konishi static struct dentry * 548*783f6184SRyusuke Konishi nilfs_fh_to_parent(struct super_block *sb, struct fid *fid, int fh_len, 549*783f6184SRyusuke Konishi int fh_type) 550*783f6184SRyusuke Konishi { 551*783f6184SRyusuke Konishi return generic_fh_to_parent(sb, fid, fh_len, fh_type, 552*783f6184SRyusuke Konishi nilfs_nfs_get_inode); 553*783f6184SRyusuke Konishi } 554*783f6184SRyusuke Konishi 555*783f6184SRyusuke Konishi static struct export_operations nilfs_export_ops = { 556*783f6184SRyusuke Konishi .fh_to_dentry = nilfs_fh_to_dentry, 557*783f6184SRyusuke Konishi .fh_to_parent = nilfs_fh_to_parent, 558*783f6184SRyusuke Konishi .get_parent = nilfs_get_parent, 559*783f6184SRyusuke Konishi }; 560*783f6184SRyusuke Konishi 561*783f6184SRyusuke Konishi enum { 562*783f6184SRyusuke Konishi Opt_err_cont, Opt_err_panic, Opt_err_ro, 563*783f6184SRyusuke Konishi Opt_barrier, Opt_snapshot, Opt_order, 564*783f6184SRyusuke Konishi Opt_err, 565*783f6184SRyusuke Konishi }; 566*783f6184SRyusuke Konishi 567*783f6184SRyusuke Konishi static match_table_t tokens = { 568*783f6184SRyusuke Konishi {Opt_err_cont, "errors=continue"}, 569*783f6184SRyusuke Konishi {Opt_err_panic, "errors=panic"}, 570*783f6184SRyusuke Konishi {Opt_err_ro, "errors=remount-ro"}, 571*783f6184SRyusuke Konishi {Opt_barrier, "barrier=%s"}, 572*783f6184SRyusuke Konishi {Opt_snapshot, "cp=%u"}, 573*783f6184SRyusuke Konishi {Opt_order, "order=%s"}, 574*783f6184SRyusuke Konishi {Opt_err, NULL} 575*783f6184SRyusuke Konishi }; 576*783f6184SRyusuke Konishi 577*783f6184SRyusuke Konishi static int match_bool(substring_t *s, int *result) 578*783f6184SRyusuke Konishi { 579*783f6184SRyusuke Konishi int len = s->to - s->from; 580*783f6184SRyusuke Konishi 581*783f6184SRyusuke Konishi if (strncmp(s->from, "on", len) == 0) 582*783f6184SRyusuke Konishi *result = 1; 583*783f6184SRyusuke Konishi else if (strncmp(s->from, "off", len) == 0) 584*783f6184SRyusuke Konishi *result = 0; 585*783f6184SRyusuke Konishi else 586*783f6184SRyusuke Konishi return 1; 587*783f6184SRyusuke Konishi return 0; 588*783f6184SRyusuke Konishi } 589*783f6184SRyusuke Konishi 590*783f6184SRyusuke Konishi static int parse_options(char *options, struct super_block *sb) 591*783f6184SRyusuke Konishi { 592*783f6184SRyusuke Konishi struct nilfs_sb_info *sbi = NILFS_SB(sb); 593*783f6184SRyusuke Konishi char *p; 594*783f6184SRyusuke Konishi substring_t args[MAX_OPT_ARGS]; 595*783f6184SRyusuke Konishi int option; 596*783f6184SRyusuke Konishi 597*783f6184SRyusuke Konishi if (!options) 598*783f6184SRyusuke Konishi return 1; 599*783f6184SRyusuke Konishi 600*783f6184SRyusuke Konishi while ((p = strsep(&options, ",")) != NULL) { 601*783f6184SRyusuke Konishi int token; 602*783f6184SRyusuke Konishi if (!*p) 603*783f6184SRyusuke Konishi continue; 604*783f6184SRyusuke Konishi 605*783f6184SRyusuke Konishi token = match_token(p, tokens, args); 606*783f6184SRyusuke Konishi switch (token) { 607*783f6184SRyusuke Konishi case Opt_barrier: 608*783f6184SRyusuke Konishi if (match_bool(&args[0], &option)) 609*783f6184SRyusuke Konishi return 0; 610*783f6184SRyusuke Konishi if (option) 611*783f6184SRyusuke Konishi nilfs_set_opt(sbi, BARRIER); 612*783f6184SRyusuke Konishi else 613*783f6184SRyusuke Konishi nilfs_clear_opt(sbi, BARRIER); 614*783f6184SRyusuke Konishi break; 615*783f6184SRyusuke Konishi case Opt_order: 616*783f6184SRyusuke Konishi if (strcmp(args[0].from, "relaxed") == 0) 617*783f6184SRyusuke Konishi /* Ordered data semantics */ 618*783f6184SRyusuke Konishi nilfs_clear_opt(sbi, STRICT_ORDER); 619*783f6184SRyusuke Konishi else if (strcmp(args[0].from, "strict") == 0) 620*783f6184SRyusuke Konishi /* Strict in-order semantics */ 621*783f6184SRyusuke Konishi nilfs_set_opt(sbi, STRICT_ORDER); 622*783f6184SRyusuke Konishi else 623*783f6184SRyusuke Konishi return 0; 624*783f6184SRyusuke Konishi break; 625*783f6184SRyusuke Konishi case Opt_err_panic: 626*783f6184SRyusuke Konishi nilfs_write_opt(sbi, ERROR_MODE, ERRORS_PANIC); 627*783f6184SRyusuke Konishi break; 628*783f6184SRyusuke Konishi case Opt_err_ro: 629*783f6184SRyusuke Konishi nilfs_write_opt(sbi, ERROR_MODE, ERRORS_RO); 630*783f6184SRyusuke Konishi break; 631*783f6184SRyusuke Konishi case Opt_err_cont: 632*783f6184SRyusuke Konishi nilfs_write_opt(sbi, ERROR_MODE, ERRORS_CONT); 633*783f6184SRyusuke Konishi break; 634*783f6184SRyusuke Konishi case Opt_snapshot: 635*783f6184SRyusuke Konishi if (match_int(&args[0], &option) || option <= 0) 636*783f6184SRyusuke Konishi return 0; 637*783f6184SRyusuke Konishi if (!(sb->s_flags & MS_RDONLY)) 638*783f6184SRyusuke Konishi return 0; 639*783f6184SRyusuke Konishi sbi->s_snapshot_cno = option; 640*783f6184SRyusuke Konishi nilfs_set_opt(sbi, SNAPSHOT); 641*783f6184SRyusuke Konishi break; 642*783f6184SRyusuke Konishi default: 643*783f6184SRyusuke Konishi printk(KERN_ERR 644*783f6184SRyusuke Konishi "NILFS: Unrecognized mount option \"%s\"\n", p); 645*783f6184SRyusuke Konishi return 0; 646*783f6184SRyusuke Konishi } 647*783f6184SRyusuke Konishi } 648*783f6184SRyusuke Konishi return 1; 649*783f6184SRyusuke Konishi } 650*783f6184SRyusuke Konishi 651*783f6184SRyusuke Konishi static inline void 652*783f6184SRyusuke Konishi nilfs_set_default_options(struct nilfs_sb_info *sbi, 653*783f6184SRyusuke Konishi struct nilfs_super_block *sbp) 654*783f6184SRyusuke Konishi { 655*783f6184SRyusuke Konishi sbi->s_mount_opt = 656*783f6184SRyusuke Konishi NILFS_MOUNT_ERRORS_CONT | NILFS_MOUNT_BARRIER; 657*783f6184SRyusuke Konishi } 658*783f6184SRyusuke Konishi 659*783f6184SRyusuke Konishi static int nilfs_setup_super(struct nilfs_sb_info *sbi) 660*783f6184SRyusuke Konishi { 661*783f6184SRyusuke Konishi struct the_nilfs *nilfs = sbi->s_nilfs; 662*783f6184SRyusuke Konishi struct nilfs_super_block *sbp = nilfs->ns_sbp; 663*783f6184SRyusuke Konishi int max_mnt_count = le16_to_cpu(sbp->s_max_mnt_count); 664*783f6184SRyusuke Konishi int mnt_count = le16_to_cpu(sbp->s_mnt_count); 665*783f6184SRyusuke Konishi 666*783f6184SRyusuke Konishi /* nilfs->sem must be locked by the caller. */ 667*783f6184SRyusuke Konishi if (!(nilfs->ns_mount_state & NILFS_VALID_FS)) { 668*783f6184SRyusuke Konishi printk(KERN_WARNING "NILFS warning: mounting unchecked fs\n"); 669*783f6184SRyusuke Konishi } else if (nilfs->ns_mount_state & NILFS_ERROR_FS) { 670*783f6184SRyusuke Konishi printk(KERN_WARNING 671*783f6184SRyusuke Konishi "NILFS warning: mounting fs with errors\n"); 672*783f6184SRyusuke Konishi #if 0 673*783f6184SRyusuke Konishi } else if (max_mnt_count >= 0 && mnt_count >= max_mnt_count) { 674*783f6184SRyusuke Konishi printk(KERN_WARNING 675*783f6184SRyusuke Konishi "NILFS warning: maximal mount count reached\n"); 676*783f6184SRyusuke Konishi #endif 677*783f6184SRyusuke Konishi } 678*783f6184SRyusuke Konishi if (!max_mnt_count) 679*783f6184SRyusuke Konishi sbp->s_max_mnt_count = cpu_to_le16(NILFS_DFL_MAX_MNT_COUNT); 680*783f6184SRyusuke Konishi 681*783f6184SRyusuke Konishi sbp->s_mnt_count = cpu_to_le16(mnt_count + 1); 682*783f6184SRyusuke Konishi sbp->s_state = cpu_to_le16(le16_to_cpu(sbp->s_state) & ~NILFS_VALID_FS); 683*783f6184SRyusuke Konishi sbp->s_mtime = cpu_to_le64(get_seconds()); 684*783f6184SRyusuke Konishi return nilfs_commit_super(sbi); 685*783f6184SRyusuke Konishi } 686*783f6184SRyusuke Konishi 687*783f6184SRyusuke Konishi struct nilfs_super_block * 688*783f6184SRyusuke Konishi nilfs_load_super_block(struct super_block *sb, struct buffer_head **pbh) 689*783f6184SRyusuke Konishi { 690*783f6184SRyusuke Konishi int blocksize; 691*783f6184SRyusuke Konishi unsigned long offset, sb_index; 692*783f6184SRyusuke Konishi 693*783f6184SRyusuke Konishi /* 694*783f6184SRyusuke Konishi * Adjusting block size 695*783f6184SRyusuke Konishi * Blocksize will be enlarged when it is smaller than hardware 696*783f6184SRyusuke Konishi * sector size. 697*783f6184SRyusuke Konishi * Disk format of superblock does not change. 698*783f6184SRyusuke Konishi */ 699*783f6184SRyusuke Konishi blocksize = sb_min_blocksize(sb, BLOCK_SIZE); 700*783f6184SRyusuke Konishi if (!blocksize) { 701*783f6184SRyusuke Konishi printk(KERN_ERR 702*783f6184SRyusuke Konishi "NILFS: unable to set blocksize of superblock\n"); 703*783f6184SRyusuke Konishi return NULL; 704*783f6184SRyusuke Konishi } 705*783f6184SRyusuke Konishi sb_index = NILFS_SB_OFFSET_BYTES / blocksize; 706*783f6184SRyusuke Konishi offset = NILFS_SB_OFFSET_BYTES % blocksize; 707*783f6184SRyusuke Konishi 708*783f6184SRyusuke Konishi *pbh = sb_bread(sb, sb_index); 709*783f6184SRyusuke Konishi if (!*pbh) { 710*783f6184SRyusuke Konishi printk(KERN_ERR "NILFS: unable to read superblock\n"); 711*783f6184SRyusuke Konishi return NULL; 712*783f6184SRyusuke Konishi } 713*783f6184SRyusuke Konishi return (struct nilfs_super_block *)((char *)(*pbh)->b_data + offset); 714*783f6184SRyusuke Konishi } 715*783f6184SRyusuke Konishi 716*783f6184SRyusuke Konishi struct nilfs_super_block * 717*783f6184SRyusuke Konishi nilfs_reload_super_block(struct super_block *sb, struct buffer_head **pbh, 718*783f6184SRyusuke Konishi int blocksize) 719*783f6184SRyusuke Konishi { 720*783f6184SRyusuke Konishi struct nilfs_super_block *sbp; 721*783f6184SRyusuke Konishi unsigned long offset, sb_index; 722*783f6184SRyusuke Konishi int hw_blocksize = bdev_hardsect_size(sb->s_bdev); 723*783f6184SRyusuke Konishi 724*783f6184SRyusuke Konishi if (blocksize < hw_blocksize) { 725*783f6184SRyusuke Konishi printk(KERN_ERR 726*783f6184SRyusuke Konishi "NILFS: blocksize %d too small for device " 727*783f6184SRyusuke Konishi "(sector-size = %d).\n", 728*783f6184SRyusuke Konishi blocksize, hw_blocksize); 729*783f6184SRyusuke Konishi goto failed_sbh; 730*783f6184SRyusuke Konishi } 731*783f6184SRyusuke Konishi brelse(*pbh); 732*783f6184SRyusuke Konishi sb_set_blocksize(sb, blocksize); 733*783f6184SRyusuke Konishi 734*783f6184SRyusuke Konishi sb_index = NILFS_SB_OFFSET_BYTES / blocksize; 735*783f6184SRyusuke Konishi offset = NILFS_SB_OFFSET_BYTES % blocksize; 736*783f6184SRyusuke Konishi 737*783f6184SRyusuke Konishi *pbh = sb_bread(sb, sb_index); 738*783f6184SRyusuke Konishi if (!*pbh) { 739*783f6184SRyusuke Konishi printk(KERN_ERR 740*783f6184SRyusuke Konishi "NILFS: cannot read superblock on 2nd try.\n"); 741*783f6184SRyusuke Konishi goto failed; 742*783f6184SRyusuke Konishi } 743*783f6184SRyusuke Konishi 744*783f6184SRyusuke Konishi sbp = (struct nilfs_super_block *)((char *)(*pbh)->b_data + offset); 745*783f6184SRyusuke Konishi if (sbp->s_magic != cpu_to_le16(NILFS_SUPER_MAGIC)) { 746*783f6184SRyusuke Konishi printk(KERN_ERR 747*783f6184SRyusuke Konishi "NILFS: !? Magic mismatch on 2nd try.\n"); 748*783f6184SRyusuke Konishi goto failed_sbh; 749*783f6184SRyusuke Konishi } 750*783f6184SRyusuke Konishi return sbp; 751*783f6184SRyusuke Konishi 752*783f6184SRyusuke Konishi failed_sbh: 753*783f6184SRyusuke Konishi brelse(*pbh); 754*783f6184SRyusuke Konishi 755*783f6184SRyusuke Konishi failed: 756*783f6184SRyusuke Konishi return NULL; 757*783f6184SRyusuke Konishi } 758*783f6184SRyusuke Konishi 759*783f6184SRyusuke Konishi int nilfs_store_magic_and_option(struct super_block *sb, 760*783f6184SRyusuke Konishi struct nilfs_super_block *sbp, 761*783f6184SRyusuke Konishi char *data) 762*783f6184SRyusuke Konishi { 763*783f6184SRyusuke Konishi struct nilfs_sb_info *sbi = NILFS_SB(sb); 764*783f6184SRyusuke Konishi 765*783f6184SRyusuke Konishi /* trying to fill super (1st stage) */ 766*783f6184SRyusuke Konishi sb->s_magic = le16_to_cpu(sbp->s_magic); 767*783f6184SRyusuke Konishi 768*783f6184SRyusuke Konishi /* FS independent flags */ 769*783f6184SRyusuke Konishi #ifdef NILFS_ATIME_DISABLE 770*783f6184SRyusuke Konishi sb->s_flags |= MS_NOATIME; 771*783f6184SRyusuke Konishi #endif 772*783f6184SRyusuke Konishi 773*783f6184SRyusuke Konishi if (sb->s_magic != NILFS_SUPER_MAGIC) { 774*783f6184SRyusuke Konishi printk("NILFS: Can't find nilfs on dev %s.\n", sb->s_id); 775*783f6184SRyusuke Konishi return -EINVAL; 776*783f6184SRyusuke Konishi } 777*783f6184SRyusuke Konishi 778*783f6184SRyusuke Konishi nilfs_set_default_options(sbi, sbp); 779*783f6184SRyusuke Konishi 780*783f6184SRyusuke Konishi sbi->s_resuid = le16_to_cpu(sbp->s_def_resuid); 781*783f6184SRyusuke Konishi sbi->s_resgid = le16_to_cpu(sbp->s_def_resgid); 782*783f6184SRyusuke Konishi sbi->s_interval = le32_to_cpu(sbp->s_c_interval); 783*783f6184SRyusuke Konishi sbi->s_watermark = le32_to_cpu(sbp->s_c_block_max); 784*783f6184SRyusuke Konishi 785*783f6184SRyusuke Konishi if (!parse_options(data, sb)) 786*783f6184SRyusuke Konishi return -EINVAL; 787*783f6184SRyusuke Konishi 788*783f6184SRyusuke Konishi return 0; 789*783f6184SRyusuke Konishi } 790*783f6184SRyusuke Konishi 791*783f6184SRyusuke Konishi /** 792*783f6184SRyusuke Konishi * nilfs_fill_super() - initialize a super block instance 793*783f6184SRyusuke Konishi * @sb: super_block 794*783f6184SRyusuke Konishi * @data: mount options 795*783f6184SRyusuke Konishi * @silent: silent mode flag 796*783f6184SRyusuke Konishi * @nilfs: the_nilfs struct 797*783f6184SRyusuke Konishi * 798*783f6184SRyusuke Konishi * This function is called exclusively by bd_mount_mutex. 799*783f6184SRyusuke Konishi * So, the recovery process is protected from other simultaneous mounts. 800*783f6184SRyusuke Konishi */ 801*783f6184SRyusuke Konishi static int 802*783f6184SRyusuke Konishi nilfs_fill_super(struct super_block *sb, void *data, int silent, 803*783f6184SRyusuke Konishi struct the_nilfs *nilfs) 804*783f6184SRyusuke Konishi { 805*783f6184SRyusuke Konishi struct nilfs_sb_info *sbi; 806*783f6184SRyusuke Konishi struct inode *root; 807*783f6184SRyusuke Konishi __u64 cno; 808*783f6184SRyusuke Konishi int err; 809*783f6184SRyusuke Konishi 810*783f6184SRyusuke Konishi sbi = kzalloc(sizeof(*sbi), GFP_KERNEL); 811*783f6184SRyusuke Konishi if (!sbi) 812*783f6184SRyusuke Konishi return -ENOMEM; 813*783f6184SRyusuke Konishi 814*783f6184SRyusuke Konishi sb->s_fs_info = sbi; 815*783f6184SRyusuke Konishi 816*783f6184SRyusuke Konishi get_nilfs(nilfs); 817*783f6184SRyusuke Konishi sbi->s_nilfs = nilfs; 818*783f6184SRyusuke Konishi sbi->s_super = sb; 819*783f6184SRyusuke Konishi 820*783f6184SRyusuke Konishi err = init_nilfs(nilfs, sbi, (char *)data); 821*783f6184SRyusuke Konishi if (err) 822*783f6184SRyusuke Konishi goto failed_sbi; 823*783f6184SRyusuke Konishi 824*783f6184SRyusuke Konishi spin_lock_init(&sbi->s_inode_lock); 825*783f6184SRyusuke Konishi INIT_LIST_HEAD(&sbi->s_dirty_files); 826*783f6184SRyusuke Konishi INIT_LIST_HEAD(&sbi->s_list); 827*783f6184SRyusuke Konishi 828*783f6184SRyusuke Konishi /* 829*783f6184SRyusuke Konishi * Following initialization is overlapped because 830*783f6184SRyusuke Konishi * nilfs_sb_info structure has been cleared at the beginning. 831*783f6184SRyusuke Konishi * But we reserve them to keep our interest and make ready 832*783f6184SRyusuke Konishi * for the future change. 833*783f6184SRyusuke Konishi */ 834*783f6184SRyusuke Konishi get_random_bytes(&sbi->s_next_generation, 835*783f6184SRyusuke Konishi sizeof(sbi->s_next_generation)); 836*783f6184SRyusuke Konishi spin_lock_init(&sbi->s_next_gen_lock); 837*783f6184SRyusuke Konishi 838*783f6184SRyusuke Konishi sb->s_op = &nilfs_sops; 839*783f6184SRyusuke Konishi sb->s_export_op = &nilfs_export_ops; 840*783f6184SRyusuke Konishi sb->s_root = NULL; 841*783f6184SRyusuke Konishi 842*783f6184SRyusuke Konishi if (!nilfs_loaded(nilfs)) { 843*783f6184SRyusuke Konishi err = load_nilfs(nilfs, sbi); 844*783f6184SRyusuke Konishi if (err) 845*783f6184SRyusuke Konishi goto failed_sbi; 846*783f6184SRyusuke Konishi } 847*783f6184SRyusuke Konishi cno = nilfs_last_cno(nilfs); 848*783f6184SRyusuke Konishi 849*783f6184SRyusuke Konishi if (sb->s_flags & MS_RDONLY) { 850*783f6184SRyusuke Konishi if (nilfs_test_opt(sbi, SNAPSHOT)) { 851*783f6184SRyusuke Konishi if (!nilfs_cpfile_is_snapshot(nilfs->ns_cpfile, 852*783f6184SRyusuke Konishi sbi->s_snapshot_cno)) { 853*783f6184SRyusuke Konishi printk(KERN_ERR 854*783f6184SRyusuke Konishi "NILFS: The specified checkpoint is " 855*783f6184SRyusuke Konishi "not a snapshot " 856*783f6184SRyusuke Konishi "(checkpoint number=%llu).\n", 857*783f6184SRyusuke Konishi (unsigned long long)sbi->s_snapshot_cno); 858*783f6184SRyusuke Konishi err = -EINVAL; 859*783f6184SRyusuke Konishi goto failed_sbi; 860*783f6184SRyusuke Konishi } 861*783f6184SRyusuke Konishi cno = sbi->s_snapshot_cno; 862*783f6184SRyusuke Konishi } else 863*783f6184SRyusuke Konishi /* Read-only mount */ 864*783f6184SRyusuke Konishi sbi->s_snapshot_cno = cno; 865*783f6184SRyusuke Konishi } 866*783f6184SRyusuke Konishi 867*783f6184SRyusuke Konishi err = nilfs_attach_checkpoint(sbi, cno); 868*783f6184SRyusuke Konishi if (err) { 869*783f6184SRyusuke Konishi printk(KERN_ERR "NILFS: error loading a checkpoint" 870*783f6184SRyusuke Konishi " (checkpoint number=%llu).\n", (unsigned long long)cno); 871*783f6184SRyusuke Konishi goto failed_sbi; 872*783f6184SRyusuke Konishi } 873*783f6184SRyusuke Konishi 874*783f6184SRyusuke Konishi if (!(sb->s_flags & MS_RDONLY)) { 875*783f6184SRyusuke Konishi err = nilfs_attach_segment_constructor(sbi, NULL); 876*783f6184SRyusuke Konishi if (err) 877*783f6184SRyusuke Konishi goto failed_checkpoint; 878*783f6184SRyusuke Konishi } 879*783f6184SRyusuke Konishi 880*783f6184SRyusuke Konishi root = nilfs_iget(sb, NILFS_ROOT_INO); 881*783f6184SRyusuke Konishi if (IS_ERR(root)) { 882*783f6184SRyusuke Konishi printk(KERN_ERR "NILFS: get root inode failed\n"); 883*783f6184SRyusuke Konishi err = PTR_ERR(root); 884*783f6184SRyusuke Konishi goto failed_segctor; 885*783f6184SRyusuke Konishi } 886*783f6184SRyusuke Konishi if (!S_ISDIR(root->i_mode) || !root->i_blocks || !root->i_size) { 887*783f6184SRyusuke Konishi iput(root); 888*783f6184SRyusuke Konishi printk(KERN_ERR "NILFS: corrupt root inode.\n"); 889*783f6184SRyusuke Konishi err = -EINVAL; 890*783f6184SRyusuke Konishi goto failed_segctor; 891*783f6184SRyusuke Konishi } 892*783f6184SRyusuke Konishi sb->s_root = d_alloc_root(root); 893*783f6184SRyusuke Konishi if (!sb->s_root) { 894*783f6184SRyusuke Konishi iput(root); 895*783f6184SRyusuke Konishi printk(KERN_ERR "NILFS: get root dentry failed\n"); 896*783f6184SRyusuke Konishi err = -ENOMEM; 897*783f6184SRyusuke Konishi goto failed_segctor; 898*783f6184SRyusuke Konishi } 899*783f6184SRyusuke Konishi 900*783f6184SRyusuke Konishi if (!(sb->s_flags & MS_RDONLY)) { 901*783f6184SRyusuke Konishi down_write(&nilfs->ns_sem); 902*783f6184SRyusuke Konishi nilfs_setup_super(sbi); 903*783f6184SRyusuke Konishi up_write(&nilfs->ns_sem); 904*783f6184SRyusuke Konishi } 905*783f6184SRyusuke Konishi 906*783f6184SRyusuke Konishi err = nilfs_mark_recovery_complete(sbi); 907*783f6184SRyusuke Konishi if (unlikely(err)) { 908*783f6184SRyusuke Konishi printk(KERN_ERR "NILFS: recovery failed.\n"); 909*783f6184SRyusuke Konishi goto failed_root; 910*783f6184SRyusuke Konishi } 911*783f6184SRyusuke Konishi 912*783f6184SRyusuke Konishi return 0; 913*783f6184SRyusuke Konishi 914*783f6184SRyusuke Konishi failed_root: 915*783f6184SRyusuke Konishi dput(sb->s_root); 916*783f6184SRyusuke Konishi sb->s_root = NULL; 917*783f6184SRyusuke Konishi 918*783f6184SRyusuke Konishi failed_segctor: 919*783f6184SRyusuke Konishi nilfs_detach_segment_constructor(sbi); 920*783f6184SRyusuke Konishi 921*783f6184SRyusuke Konishi failed_checkpoint: 922*783f6184SRyusuke Konishi nilfs_detach_checkpoint(sbi); 923*783f6184SRyusuke Konishi 924*783f6184SRyusuke Konishi failed_sbi: 925*783f6184SRyusuke Konishi put_nilfs(nilfs); 926*783f6184SRyusuke Konishi sb->s_fs_info = NULL; 927*783f6184SRyusuke Konishi kfree(sbi); 928*783f6184SRyusuke Konishi return err; 929*783f6184SRyusuke Konishi } 930*783f6184SRyusuke Konishi 931*783f6184SRyusuke Konishi static int nilfs_remount(struct super_block *sb, int *flags, char *data) 932*783f6184SRyusuke Konishi { 933*783f6184SRyusuke Konishi struct nilfs_sb_info *sbi = NILFS_SB(sb); 934*783f6184SRyusuke Konishi struct nilfs_super_block *sbp; 935*783f6184SRyusuke Konishi struct the_nilfs *nilfs = sbi->s_nilfs; 936*783f6184SRyusuke Konishi unsigned long old_sb_flags; 937*783f6184SRyusuke Konishi struct nilfs_mount_options old_opts; 938*783f6184SRyusuke Konishi int err; 939*783f6184SRyusuke Konishi 940*783f6184SRyusuke Konishi old_sb_flags = sb->s_flags; 941*783f6184SRyusuke Konishi old_opts.mount_opt = sbi->s_mount_opt; 942*783f6184SRyusuke Konishi old_opts.snapshot_cno = sbi->s_snapshot_cno; 943*783f6184SRyusuke Konishi 944*783f6184SRyusuke Konishi if (!parse_options(data, sb)) { 945*783f6184SRyusuke Konishi err = -EINVAL; 946*783f6184SRyusuke Konishi goto restore_opts; 947*783f6184SRyusuke Konishi } 948*783f6184SRyusuke Konishi sb->s_flags = (sb->s_flags & ~MS_POSIXACL); 949*783f6184SRyusuke Konishi 950*783f6184SRyusuke Konishi if ((*flags & MS_RDONLY) && 951*783f6184SRyusuke Konishi sbi->s_snapshot_cno != old_opts.snapshot_cno) { 952*783f6184SRyusuke Konishi printk(KERN_WARNING "NILFS (device %s): couldn't " 953*783f6184SRyusuke Konishi "remount to a different snapshot. \n", 954*783f6184SRyusuke Konishi sb->s_id); 955*783f6184SRyusuke Konishi err = -EINVAL; 956*783f6184SRyusuke Konishi goto restore_opts; 957*783f6184SRyusuke Konishi } 958*783f6184SRyusuke Konishi 959*783f6184SRyusuke Konishi if ((*flags & MS_RDONLY) == (sb->s_flags & MS_RDONLY)) 960*783f6184SRyusuke Konishi goto out; 961*783f6184SRyusuke Konishi if (*flags & MS_RDONLY) { 962*783f6184SRyusuke Konishi /* Shutting down the segment constructor */ 963*783f6184SRyusuke Konishi nilfs_detach_segment_constructor(sbi); 964*783f6184SRyusuke Konishi sb->s_flags |= MS_RDONLY; 965*783f6184SRyusuke Konishi 966*783f6184SRyusuke Konishi sbi->s_snapshot_cno = nilfs_last_cno(nilfs); 967*783f6184SRyusuke Konishi /* nilfs_set_opt(sbi, SNAPSHOT); */ 968*783f6184SRyusuke Konishi 969*783f6184SRyusuke Konishi /* 970*783f6184SRyusuke Konishi * Remounting a valid RW partition RDONLY, so set 971*783f6184SRyusuke Konishi * the RDONLY flag and then mark the partition as valid again. 972*783f6184SRyusuke Konishi */ 973*783f6184SRyusuke Konishi down_write(&nilfs->ns_sem); 974*783f6184SRyusuke Konishi sbp = nilfs->ns_sbp; 975*783f6184SRyusuke Konishi if (!(sbp->s_state & le16_to_cpu(NILFS_VALID_FS)) && 976*783f6184SRyusuke Konishi (nilfs->ns_mount_state & NILFS_VALID_FS)) 977*783f6184SRyusuke Konishi sbp->s_state = cpu_to_le16(nilfs->ns_mount_state); 978*783f6184SRyusuke Konishi sbp->s_mtime = cpu_to_le64(get_seconds()); 979*783f6184SRyusuke Konishi nilfs_commit_super(sbi); 980*783f6184SRyusuke Konishi up_write(&nilfs->ns_sem); 981*783f6184SRyusuke Konishi } else { 982*783f6184SRyusuke Konishi /* 983*783f6184SRyusuke Konishi * Mounting a RDONLY partition read-write, so reread and 984*783f6184SRyusuke Konishi * store the current valid flag. (It may have been changed 985*783f6184SRyusuke Konishi * by fsck since we originally mounted the partition.) 986*783f6184SRyusuke Konishi */ 987*783f6184SRyusuke Konishi down(&sb->s_bdev->bd_mount_sem); 988*783f6184SRyusuke Konishi /* Check existing RW-mount */ 989*783f6184SRyusuke Konishi if (test_exclusive_mount(sb->s_type, sb->s_bdev, 0)) { 990*783f6184SRyusuke Konishi printk(KERN_WARNING "NILFS (device %s): couldn't " 991*783f6184SRyusuke Konishi "remount because a RW-mount exists.\n", 992*783f6184SRyusuke Konishi sb->s_id); 993*783f6184SRyusuke Konishi err = -EBUSY; 994*783f6184SRyusuke Konishi goto rw_remount_failed; 995*783f6184SRyusuke Konishi } 996*783f6184SRyusuke Konishi if (sbi->s_snapshot_cno != nilfs_last_cno(nilfs)) { 997*783f6184SRyusuke Konishi printk(KERN_WARNING "NILFS (device %s): couldn't " 998*783f6184SRyusuke Konishi "remount because the current RO-mount is not " 999*783f6184SRyusuke Konishi "the latest one.\n", 1000*783f6184SRyusuke Konishi sb->s_id); 1001*783f6184SRyusuke Konishi err = -EINVAL; 1002*783f6184SRyusuke Konishi goto rw_remount_failed; 1003*783f6184SRyusuke Konishi } 1004*783f6184SRyusuke Konishi sb->s_flags &= ~MS_RDONLY; 1005*783f6184SRyusuke Konishi nilfs_clear_opt(sbi, SNAPSHOT); 1006*783f6184SRyusuke Konishi sbi->s_snapshot_cno = 0; 1007*783f6184SRyusuke Konishi 1008*783f6184SRyusuke Konishi err = nilfs_attach_segment_constructor(sbi, NULL); 1009*783f6184SRyusuke Konishi if (err) 1010*783f6184SRyusuke Konishi goto rw_remount_failed; 1011*783f6184SRyusuke Konishi 1012*783f6184SRyusuke Konishi down_write(&nilfs->ns_sem); 1013*783f6184SRyusuke Konishi nilfs_setup_super(sbi); 1014*783f6184SRyusuke Konishi up_write(&nilfs->ns_sem); 1015*783f6184SRyusuke Konishi 1016*783f6184SRyusuke Konishi up(&sb->s_bdev->bd_mount_sem); 1017*783f6184SRyusuke Konishi } 1018*783f6184SRyusuke Konishi out: 1019*783f6184SRyusuke Konishi return 0; 1020*783f6184SRyusuke Konishi 1021*783f6184SRyusuke Konishi rw_remount_failed: 1022*783f6184SRyusuke Konishi up(&sb->s_bdev->bd_mount_sem); 1023*783f6184SRyusuke Konishi restore_opts: 1024*783f6184SRyusuke Konishi sb->s_flags = old_sb_flags; 1025*783f6184SRyusuke Konishi sbi->s_mount_opt = old_opts.mount_opt; 1026*783f6184SRyusuke Konishi sbi->s_snapshot_cno = old_opts.snapshot_cno; 1027*783f6184SRyusuke Konishi return err; 1028*783f6184SRyusuke Konishi } 1029*783f6184SRyusuke Konishi 1030*783f6184SRyusuke Konishi struct nilfs_super_data { 1031*783f6184SRyusuke Konishi struct block_device *bdev; 1032*783f6184SRyusuke Konishi __u64 cno; 1033*783f6184SRyusuke Konishi int flags; 1034*783f6184SRyusuke Konishi }; 1035*783f6184SRyusuke Konishi 1036*783f6184SRyusuke Konishi /** 1037*783f6184SRyusuke Konishi * nilfs_identify - pre-read mount options needed to identify mount instance 1038*783f6184SRyusuke Konishi * @data: mount options 1039*783f6184SRyusuke Konishi * @sd: nilfs_super_data 1040*783f6184SRyusuke Konishi */ 1041*783f6184SRyusuke Konishi static int nilfs_identify(char *data, struct nilfs_super_data *sd) 1042*783f6184SRyusuke Konishi { 1043*783f6184SRyusuke Konishi char *p, *options = data; 1044*783f6184SRyusuke Konishi substring_t args[MAX_OPT_ARGS]; 1045*783f6184SRyusuke Konishi int option, token; 1046*783f6184SRyusuke Konishi int ret = 0; 1047*783f6184SRyusuke Konishi 1048*783f6184SRyusuke Konishi do { 1049*783f6184SRyusuke Konishi p = strsep(&options, ","); 1050*783f6184SRyusuke Konishi if (p != NULL && *p) { 1051*783f6184SRyusuke Konishi token = match_token(p, tokens, args); 1052*783f6184SRyusuke Konishi if (token == Opt_snapshot) { 1053*783f6184SRyusuke Konishi if (!(sd->flags & MS_RDONLY)) 1054*783f6184SRyusuke Konishi ret++; 1055*783f6184SRyusuke Konishi else { 1056*783f6184SRyusuke Konishi ret = match_int(&args[0], &option); 1057*783f6184SRyusuke Konishi if (!ret) { 1058*783f6184SRyusuke Konishi if (option > 0) 1059*783f6184SRyusuke Konishi sd->cno = option; 1060*783f6184SRyusuke Konishi else 1061*783f6184SRyusuke Konishi ret++; 1062*783f6184SRyusuke Konishi } 1063*783f6184SRyusuke Konishi } 1064*783f6184SRyusuke Konishi } 1065*783f6184SRyusuke Konishi if (ret) 1066*783f6184SRyusuke Konishi printk(KERN_ERR 1067*783f6184SRyusuke Konishi "NILFS: invalid mount option: %s\n", p); 1068*783f6184SRyusuke Konishi } 1069*783f6184SRyusuke Konishi if (!options) 1070*783f6184SRyusuke Konishi break; 1071*783f6184SRyusuke Konishi BUG_ON(options == data); 1072*783f6184SRyusuke Konishi *(options - 1) = ','; 1073*783f6184SRyusuke Konishi } while (!ret); 1074*783f6184SRyusuke Konishi return ret; 1075*783f6184SRyusuke Konishi } 1076*783f6184SRyusuke Konishi 1077*783f6184SRyusuke Konishi static int nilfs_set_bdev_super(struct super_block *s, void *data) 1078*783f6184SRyusuke Konishi { 1079*783f6184SRyusuke Konishi struct nilfs_super_data *sd = data; 1080*783f6184SRyusuke Konishi 1081*783f6184SRyusuke Konishi s->s_bdev = sd->bdev; 1082*783f6184SRyusuke Konishi s->s_dev = s->s_bdev->bd_dev; 1083*783f6184SRyusuke Konishi return 0; 1084*783f6184SRyusuke Konishi } 1085*783f6184SRyusuke Konishi 1086*783f6184SRyusuke Konishi static int nilfs_test_bdev_super(struct super_block *s, void *data) 1087*783f6184SRyusuke Konishi { 1088*783f6184SRyusuke Konishi struct nilfs_super_data *sd = data; 1089*783f6184SRyusuke Konishi 1090*783f6184SRyusuke Konishi return s->s_bdev == sd->bdev; 1091*783f6184SRyusuke Konishi } 1092*783f6184SRyusuke Konishi 1093*783f6184SRyusuke Konishi static int nilfs_test_bdev_super2(struct super_block *s, void *data) 1094*783f6184SRyusuke Konishi { 1095*783f6184SRyusuke Konishi struct nilfs_super_data *sd = data; 1096*783f6184SRyusuke Konishi int ret; 1097*783f6184SRyusuke Konishi 1098*783f6184SRyusuke Konishi if (s->s_bdev != sd->bdev) 1099*783f6184SRyusuke Konishi return 0; 1100*783f6184SRyusuke Konishi 1101*783f6184SRyusuke Konishi if (!((s->s_flags | sd->flags) & MS_RDONLY)) 1102*783f6184SRyusuke Konishi return 1; /* Reuse an old R/W-mode super_block */ 1103*783f6184SRyusuke Konishi 1104*783f6184SRyusuke Konishi if (s->s_flags & sd->flags & MS_RDONLY) { 1105*783f6184SRyusuke Konishi if (down_read_trylock(&s->s_umount)) { 1106*783f6184SRyusuke Konishi ret = s->s_root && 1107*783f6184SRyusuke Konishi (sd->cno == NILFS_SB(s)->s_snapshot_cno); 1108*783f6184SRyusuke Konishi up_read(&s->s_umount); 1109*783f6184SRyusuke Konishi /* 1110*783f6184SRyusuke Konishi * This path is locked with sb_lock by sget(). 1111*783f6184SRyusuke Konishi * So, drop_super() causes deadlock. 1112*783f6184SRyusuke Konishi */ 1113*783f6184SRyusuke Konishi return ret; 1114*783f6184SRyusuke Konishi } 1115*783f6184SRyusuke Konishi } 1116*783f6184SRyusuke Konishi return 0; 1117*783f6184SRyusuke Konishi } 1118*783f6184SRyusuke Konishi 1119*783f6184SRyusuke Konishi static int 1120*783f6184SRyusuke Konishi nilfs_get_sb(struct file_system_type *fs_type, int flags, 1121*783f6184SRyusuke Konishi const char *dev_name, void *data, struct vfsmount *mnt) 1122*783f6184SRyusuke Konishi { 1123*783f6184SRyusuke Konishi struct nilfs_super_data sd; 1124*783f6184SRyusuke Konishi struct super_block *s, *s2; 1125*783f6184SRyusuke Konishi struct the_nilfs *nilfs = NULL; 1126*783f6184SRyusuke Konishi int err, need_to_close = 1; 1127*783f6184SRyusuke Konishi 1128*783f6184SRyusuke Konishi sd.bdev = open_bdev_exclusive(dev_name, flags, fs_type); 1129*783f6184SRyusuke Konishi if (IS_ERR(sd.bdev)) 1130*783f6184SRyusuke Konishi return PTR_ERR(sd.bdev); 1131*783f6184SRyusuke Konishi 1132*783f6184SRyusuke Konishi /* 1133*783f6184SRyusuke Konishi * To get mount instance using sget() vfs-routine, NILFS needs 1134*783f6184SRyusuke Konishi * much more information than normal filesystems to identify mount 1135*783f6184SRyusuke Konishi * instance. For snapshot mounts, not only a mount type (ro-mount 1136*783f6184SRyusuke Konishi * or rw-mount) but also a checkpoint number is required. 1137*783f6184SRyusuke Konishi * The results are passed in sget() using nilfs_super_data. 1138*783f6184SRyusuke Konishi */ 1139*783f6184SRyusuke Konishi sd.cno = 0; 1140*783f6184SRyusuke Konishi sd.flags = flags; 1141*783f6184SRyusuke Konishi if (nilfs_identify((char *)data, &sd)) { 1142*783f6184SRyusuke Konishi err = -EINVAL; 1143*783f6184SRyusuke Konishi goto failed; 1144*783f6184SRyusuke Konishi } 1145*783f6184SRyusuke Konishi 1146*783f6184SRyusuke Konishi /* 1147*783f6184SRyusuke Konishi * once the super is inserted into the list by sget, s_umount 1148*783f6184SRyusuke Konishi * will protect the lockfs code from trying to start a snapshot 1149*783f6184SRyusuke Konishi * while we are mounting 1150*783f6184SRyusuke Konishi */ 1151*783f6184SRyusuke Konishi down(&sd.bdev->bd_mount_sem); 1152*783f6184SRyusuke Konishi if (!sd.cno && 1153*783f6184SRyusuke Konishi (err = test_exclusive_mount(fs_type, sd.bdev, flags ^ MS_RDONLY))) { 1154*783f6184SRyusuke Konishi err = (err < 0) ? : -EBUSY; 1155*783f6184SRyusuke Konishi goto failed_unlock; 1156*783f6184SRyusuke Konishi } 1157*783f6184SRyusuke Konishi 1158*783f6184SRyusuke Konishi /* 1159*783f6184SRyusuke Konishi * Phase-1: search any existent instance and get the_nilfs 1160*783f6184SRyusuke Konishi */ 1161*783f6184SRyusuke Konishi s = sget(fs_type, nilfs_test_bdev_super, nilfs_set_bdev_super, &sd); 1162*783f6184SRyusuke Konishi if (IS_ERR(s)) 1163*783f6184SRyusuke Konishi goto error_s; 1164*783f6184SRyusuke Konishi 1165*783f6184SRyusuke Konishi if (!s->s_root) { 1166*783f6184SRyusuke Konishi err = -ENOMEM; 1167*783f6184SRyusuke Konishi nilfs = alloc_nilfs(sd.bdev); 1168*783f6184SRyusuke Konishi if (!nilfs) 1169*783f6184SRyusuke Konishi goto cancel_new; 1170*783f6184SRyusuke Konishi } else { 1171*783f6184SRyusuke Konishi struct nilfs_sb_info *sbi = NILFS_SB(s); 1172*783f6184SRyusuke Konishi 1173*783f6184SRyusuke Konishi BUG_ON(!sbi || !sbi->s_nilfs); 1174*783f6184SRyusuke Konishi /* 1175*783f6184SRyusuke Konishi * s_umount protects super_block from unmount process; 1176*783f6184SRyusuke Konishi * It covers pointers of nilfs_sb_info and the_nilfs. 1177*783f6184SRyusuke Konishi */ 1178*783f6184SRyusuke Konishi nilfs = sbi->s_nilfs; 1179*783f6184SRyusuke Konishi get_nilfs(nilfs); 1180*783f6184SRyusuke Konishi up_write(&s->s_umount); 1181*783f6184SRyusuke Konishi 1182*783f6184SRyusuke Konishi /* 1183*783f6184SRyusuke Konishi * Phase-2: search specified snapshot or R/W mode super_block 1184*783f6184SRyusuke Konishi */ 1185*783f6184SRyusuke Konishi if (!sd.cno) 1186*783f6184SRyusuke Konishi /* trying to get the latest checkpoint. */ 1187*783f6184SRyusuke Konishi sd.cno = nilfs_last_cno(nilfs); 1188*783f6184SRyusuke Konishi 1189*783f6184SRyusuke Konishi s2 = sget(fs_type, nilfs_test_bdev_super2, 1190*783f6184SRyusuke Konishi nilfs_set_bdev_super, &sd); 1191*783f6184SRyusuke Konishi deactivate_super(s); 1192*783f6184SRyusuke Konishi /* 1193*783f6184SRyusuke Konishi * Although deactivate_super() invokes close_bdev_exclusive() at 1194*783f6184SRyusuke Konishi * kill_block_super(). Here, s is an existent mount; we need 1195*783f6184SRyusuke Konishi * one more close_bdev_exclusive() call. 1196*783f6184SRyusuke Konishi */ 1197*783f6184SRyusuke Konishi s = s2; 1198*783f6184SRyusuke Konishi if (IS_ERR(s)) 1199*783f6184SRyusuke Konishi goto error_s; 1200*783f6184SRyusuke Konishi } 1201*783f6184SRyusuke Konishi 1202*783f6184SRyusuke Konishi if (!s->s_root) { 1203*783f6184SRyusuke Konishi char b[BDEVNAME_SIZE]; 1204*783f6184SRyusuke Konishi 1205*783f6184SRyusuke Konishi s->s_flags = flags; 1206*783f6184SRyusuke Konishi strlcpy(s->s_id, bdevname(sd.bdev, b), sizeof(s->s_id)); 1207*783f6184SRyusuke Konishi sb_set_blocksize(s, block_size(sd.bdev)); 1208*783f6184SRyusuke Konishi 1209*783f6184SRyusuke Konishi err = nilfs_fill_super(s, data, flags & MS_VERBOSE, nilfs); 1210*783f6184SRyusuke Konishi if (err) 1211*783f6184SRyusuke Konishi goto cancel_new; 1212*783f6184SRyusuke Konishi 1213*783f6184SRyusuke Konishi s->s_flags |= MS_ACTIVE; 1214*783f6184SRyusuke Konishi need_to_close = 0; 1215*783f6184SRyusuke Konishi } else if (!(s->s_flags & MS_RDONLY)) { 1216*783f6184SRyusuke Konishi err = -EBUSY; 1217*783f6184SRyusuke Konishi } 1218*783f6184SRyusuke Konishi 1219*783f6184SRyusuke Konishi up(&sd.bdev->bd_mount_sem); 1220*783f6184SRyusuke Konishi put_nilfs(nilfs); 1221*783f6184SRyusuke Konishi if (need_to_close) 1222*783f6184SRyusuke Konishi close_bdev_exclusive(sd.bdev, flags); 1223*783f6184SRyusuke Konishi simple_set_mnt(mnt, s); 1224*783f6184SRyusuke Konishi return 0; 1225*783f6184SRyusuke Konishi 1226*783f6184SRyusuke Konishi error_s: 1227*783f6184SRyusuke Konishi up(&sd.bdev->bd_mount_sem); 1228*783f6184SRyusuke Konishi if (nilfs) 1229*783f6184SRyusuke Konishi put_nilfs(nilfs); 1230*783f6184SRyusuke Konishi close_bdev_exclusive(sd.bdev, flags); 1231*783f6184SRyusuke Konishi return PTR_ERR(s); 1232*783f6184SRyusuke Konishi 1233*783f6184SRyusuke Konishi failed_unlock: 1234*783f6184SRyusuke Konishi up(&sd.bdev->bd_mount_sem); 1235*783f6184SRyusuke Konishi failed: 1236*783f6184SRyusuke Konishi close_bdev_exclusive(sd.bdev, flags); 1237*783f6184SRyusuke Konishi 1238*783f6184SRyusuke Konishi return err; 1239*783f6184SRyusuke Konishi 1240*783f6184SRyusuke Konishi cancel_new: 1241*783f6184SRyusuke Konishi /* Abandoning the newly allocated superblock */ 1242*783f6184SRyusuke Konishi up(&sd.bdev->bd_mount_sem); 1243*783f6184SRyusuke Konishi if (nilfs) 1244*783f6184SRyusuke Konishi put_nilfs(nilfs); 1245*783f6184SRyusuke Konishi up_write(&s->s_umount); 1246*783f6184SRyusuke Konishi deactivate_super(s); 1247*783f6184SRyusuke Konishi /* 1248*783f6184SRyusuke Konishi * deactivate_super() invokes close_bdev_exclusive(). 1249*783f6184SRyusuke Konishi * We must finish all post-cleaning before this call; 1250*783f6184SRyusuke Konishi * put_nilfs() and unlocking bd_mount_sem need the block device. 1251*783f6184SRyusuke Konishi */ 1252*783f6184SRyusuke Konishi return err; 1253*783f6184SRyusuke Konishi } 1254*783f6184SRyusuke Konishi 1255*783f6184SRyusuke Konishi static int nilfs_test_bdev_super3(struct super_block *s, void *data) 1256*783f6184SRyusuke Konishi { 1257*783f6184SRyusuke Konishi struct nilfs_super_data *sd = data; 1258*783f6184SRyusuke Konishi int ret; 1259*783f6184SRyusuke Konishi 1260*783f6184SRyusuke Konishi if (s->s_bdev != sd->bdev) 1261*783f6184SRyusuke Konishi return 0; 1262*783f6184SRyusuke Konishi if (down_read_trylock(&s->s_umount)) { 1263*783f6184SRyusuke Konishi ret = (s->s_flags & MS_RDONLY) && s->s_root && 1264*783f6184SRyusuke Konishi nilfs_test_opt(NILFS_SB(s), SNAPSHOT); 1265*783f6184SRyusuke Konishi up_read(&s->s_umount); 1266*783f6184SRyusuke Konishi if (ret) 1267*783f6184SRyusuke Konishi return 0; /* ignore snapshot mounts */ 1268*783f6184SRyusuke Konishi } 1269*783f6184SRyusuke Konishi return !((sd->flags ^ s->s_flags) & MS_RDONLY); 1270*783f6184SRyusuke Konishi } 1271*783f6184SRyusuke Konishi 1272*783f6184SRyusuke Konishi static int __false_bdev_super(struct super_block *s, void *data) 1273*783f6184SRyusuke Konishi { 1274*783f6184SRyusuke Konishi #if 0 /* XXX: workaround for lock debug. This is not good idea */ 1275*783f6184SRyusuke Konishi up_write(&s->s_umount); 1276*783f6184SRyusuke Konishi #endif 1277*783f6184SRyusuke Konishi return -EFAULT; 1278*783f6184SRyusuke Konishi } 1279*783f6184SRyusuke Konishi 1280*783f6184SRyusuke Konishi /** 1281*783f6184SRyusuke Konishi * test_exclusive_mount - check whether an exclusive RW/RO mount exists or not. 1282*783f6184SRyusuke Konishi * fs_type: filesystem type 1283*783f6184SRyusuke Konishi * bdev: block device 1284*783f6184SRyusuke Konishi * flag: 0 (check rw-mount) or MS_RDONLY (check ro-mount) 1285*783f6184SRyusuke Konishi * res: pointer to an integer to store result 1286*783f6184SRyusuke Konishi * 1287*783f6184SRyusuke Konishi * This function must be called within a section protected by bd_mount_mutex. 1288*783f6184SRyusuke Konishi */ 1289*783f6184SRyusuke Konishi static int test_exclusive_mount(struct file_system_type *fs_type, 1290*783f6184SRyusuke Konishi struct block_device *bdev, int flags) 1291*783f6184SRyusuke Konishi { 1292*783f6184SRyusuke Konishi struct super_block *s; 1293*783f6184SRyusuke Konishi struct nilfs_super_data sd = { .flags = flags, .bdev = bdev }; 1294*783f6184SRyusuke Konishi 1295*783f6184SRyusuke Konishi s = sget(fs_type, nilfs_test_bdev_super3, __false_bdev_super, &sd); 1296*783f6184SRyusuke Konishi if (IS_ERR(s)) { 1297*783f6184SRyusuke Konishi if (PTR_ERR(s) != -EFAULT) 1298*783f6184SRyusuke Konishi return PTR_ERR(s); 1299*783f6184SRyusuke Konishi return 0; /* Not found */ 1300*783f6184SRyusuke Konishi } 1301*783f6184SRyusuke Konishi up_write(&s->s_umount); 1302*783f6184SRyusuke Konishi deactivate_super(s); 1303*783f6184SRyusuke Konishi return 1; /* Found */ 1304*783f6184SRyusuke Konishi } 1305*783f6184SRyusuke Konishi 1306*783f6184SRyusuke Konishi struct file_system_type nilfs_fs_type = { 1307*783f6184SRyusuke Konishi .owner = THIS_MODULE, 1308*783f6184SRyusuke Konishi .name = "nilfs2", 1309*783f6184SRyusuke Konishi .get_sb = nilfs_get_sb, 1310*783f6184SRyusuke Konishi .kill_sb = kill_block_super, 1311*783f6184SRyusuke Konishi .fs_flags = FS_REQUIRES_DEV, 1312*783f6184SRyusuke Konishi }; 1313*783f6184SRyusuke Konishi 1314*783f6184SRyusuke Konishi static int __init init_nilfs_fs(void) 1315*783f6184SRyusuke Konishi { 1316*783f6184SRyusuke Konishi int err; 1317*783f6184SRyusuke Konishi 1318*783f6184SRyusuke Konishi err = nilfs_init_inode_cache(); 1319*783f6184SRyusuke Konishi if (err) 1320*783f6184SRyusuke Konishi goto failed; 1321*783f6184SRyusuke Konishi 1322*783f6184SRyusuke Konishi err = nilfs_init_transaction_cache(); 1323*783f6184SRyusuke Konishi if (err) 1324*783f6184SRyusuke Konishi goto failed_inode_cache; 1325*783f6184SRyusuke Konishi 1326*783f6184SRyusuke Konishi err = nilfs_init_segbuf_cache(); 1327*783f6184SRyusuke Konishi if (err) 1328*783f6184SRyusuke Konishi goto failed_transaction_cache; 1329*783f6184SRyusuke Konishi 1330*783f6184SRyusuke Konishi err = nilfs_btree_path_cache_init(); 1331*783f6184SRyusuke Konishi if (err) 1332*783f6184SRyusuke Konishi goto failed_segbuf_cache; 1333*783f6184SRyusuke Konishi 1334*783f6184SRyusuke Konishi err = register_filesystem(&nilfs_fs_type); 1335*783f6184SRyusuke Konishi if (err) 1336*783f6184SRyusuke Konishi goto failed_btree_path_cache; 1337*783f6184SRyusuke Konishi 1338*783f6184SRyusuke Konishi return 0; 1339*783f6184SRyusuke Konishi 1340*783f6184SRyusuke Konishi failed_btree_path_cache: 1341*783f6184SRyusuke Konishi nilfs_btree_path_cache_destroy(); 1342*783f6184SRyusuke Konishi 1343*783f6184SRyusuke Konishi failed_segbuf_cache: 1344*783f6184SRyusuke Konishi nilfs_destroy_segbuf_cache(); 1345*783f6184SRyusuke Konishi 1346*783f6184SRyusuke Konishi failed_transaction_cache: 1347*783f6184SRyusuke Konishi nilfs_destroy_transaction_cache(); 1348*783f6184SRyusuke Konishi 1349*783f6184SRyusuke Konishi failed_inode_cache: 1350*783f6184SRyusuke Konishi nilfs_destroy_inode_cache(); 1351*783f6184SRyusuke Konishi 1352*783f6184SRyusuke Konishi failed: 1353*783f6184SRyusuke Konishi return err; 1354*783f6184SRyusuke Konishi } 1355*783f6184SRyusuke Konishi 1356*783f6184SRyusuke Konishi static void __exit exit_nilfs_fs(void) 1357*783f6184SRyusuke Konishi { 1358*783f6184SRyusuke Konishi nilfs_destroy_segbuf_cache(); 1359*783f6184SRyusuke Konishi nilfs_destroy_transaction_cache(); 1360*783f6184SRyusuke Konishi nilfs_destroy_inode_cache(); 1361*783f6184SRyusuke Konishi nilfs_btree_path_cache_destroy(); 1362*783f6184SRyusuke Konishi unregister_filesystem(&nilfs_fs_type); 1363*783f6184SRyusuke Konishi } 1364*783f6184SRyusuke Konishi 1365*783f6184SRyusuke Konishi module_init(init_nilfs_fs) 1366*783f6184SRyusuke Konishi module_exit(exit_nilfs_fs) 1367