[PATCH] JFS: add nointegrity mount option (Karl Rister) (4 of 4)
Dave Kleikamp <[email protected]> Mon, 25 Aug 2003 14:42:17 -0500
| Newsgroups | gmane.comp.file-systems.jfs.patches |
|---|---|
| Message-ID | <[email protected]> |
# This is a BitKeeper generated patch for the following project: # Project Name: Linux kernel tree # This patch format is intended for GNU patch command version 2.5 or higher. # This patch includes the following deltas: # ChangeSet 1.1097.1.3 -> 1.1097.1.4 # fs/jfs/jfs_filsys.h 1.1 -> 1.2 # fs/jfs/jfs_txnmgr.c 1.27 -> 1.28 # fs/jfs/jfs_mount.c 1.8 -> 1.9 # fs/jfs/jfs_logmgr.c 1.18 -> 1.19 # Documentation/filesystems/jfs.txt 1.4 -> 1.5 # fs/jfs/jfs_incore.h 1.11 -> 1.12 # fs/jfs/super.c 1.20 -> 1.21 # fs/jfs/jfs_logmgr.h 1.7 -> 1.8 # # The following is the BitKeeper ChangeSet Log # -------------------------------------------- # 03/08/25 [email protected] 1.1097.1.4 # JFS: add nointegrity mount option (Karl Rister) # # This option allows a performance boost by not writing to the journal at the # expense of loss of data integrity if the system crashes or is powered off. # The intended use of this option is to allow faster restores from backup media. # -------------------------------------------- # diff -Nru a/Documentation/filesystems/jfs.txt b/Documentation/filesystems/jfs.txt --- a/Documentation/filesystems/jfs.txt Mon Aug 25 14:10:35 2003 +++ b/Documentation/filesystems/jfs.txt Mon Aug 25 14:10:35 2003 @@ -23,6 +23,15 @@ read-write. The resize keyword with no value will grow the volume to the full size of the partition. +nointegrity Do not write to the journal. The primary use of this option + is to allow for higher performance when restoring a volume + from backup media. The integrity of the volume is not + guaranteed if the system abnormally abends. + +integrity Default. Commit metadata changes to the journal. Use this + option to remount a volume where the nointegrity option was + previously specified in order to restore normal behavior. + JFS TODO list: Plans for our near term development items diff -Nru a/fs/jfs/jfs_filsys.h b/fs/jfs/jfs_filsys.h --- a/fs/jfs/jfs_filsys.h Mon Aug 25 14:10:34 2003 +++ b/fs/jfs/jfs_filsys.h Mon Aug 25 14:10:34 2003 @@ -1,5 +1,5 @@ /* - * Copyright (c) International Business Machines Corp., 2000-2001 + * Copyright (c) International Business Machines Corp., 2000-2003 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -29,6 +29,9 @@ /* * file system option (superblock flag) */ +/* mount time flag to disable journaling to disk */ +#define JFS_NOINTEGRITY 0x00000010 + /* platform option (conditional compilation) */ #define JFS_AIX 0x80000000 /* AIX support */ /* POSIX name/directory support */ diff -Nru a/fs/jfs/jfs_incore.h b/fs/jfs/jfs_incore.h --- a/fs/jfs/jfs_incore.h Mon Aug 25 14:10:35 2003 +++ b/fs/jfs/jfs_incore.h Mon Aug 25 14:10:35 2003 @@ -1,5 +1,5 @@ /* - * Copyright (c) International Business Machines Corp., 2000-2002 + * Copyright (c) International Business Machines Corp., 2000-2003 * Portions Copyright (c) Christoph Hellwig, 2001-2002 * * This program is free software; you can redistribute it and/or modify @@ -126,32 +126,34 @@ * JFS-private superblock information. */ struct jfs_sb_info { - unsigned long mntflag; /* 4: aggregate attributes */ - struct inode *ipbmap; /* 4: block map inode */ - struct inode *ipaimap; /* 4: aggregate inode map inode */ - struct inode *ipaimap2; /* 4: secondary aimap inode */ - struct inode *ipimap; /* 4: aggregate inode map inode */ - struct jfs_log *log; /* 4: log */ - short bsize; /* 2: logical block size */ - short l2bsize; /* 2: log2 logical block size */ - short nbperpage; /* 2: blocks per page */ - short l2nbperpage; /* 2: log2 blocks per page */ - short l2niperblk; /* 2: log2 inodes per page */ - kdev_t logdev; /* 2: external log device */ + unsigned long mntflag; /* aggregate attributes */ + struct inode *ipbmap; /* block map inode */ + struct inode *ipaimap; /* aggregate inode map inode */ + struct inode *ipaimap2; /* secondary aimap inode */ + struct inode *ipimap; /* aggregate inode map inode */ + struct jfs_log *log; /* log */ + short bsize; /* logical block size */ + short l2bsize; /* log2 logical block size */ + short nbperpage; /* blocks per page */ + short l2nbperpage; /* log2 blocks per page */ + short l2niperblk; /* log2 inodes per page */ + kdev_t logdev; /* external log device */ uint aggregate; /* volume identifier in log record */ - pxd_t logpxd; /* 8: pxd describing log */ - pxd_t fsckpxd; /* 8: pxd describing fsck wkspc */ - pxd_t ait2; /* 8: pxd describing AIT copy */ - char uuid[16]; /* 16: 128-bit uuid for volume */ - char loguuid[16]; /* 16: 128-bit uuid for log */ + pxd_t logpxd; /* pxd describing log */ + pxd_t fsckpxd; /* pxd describing fsck wkspc */ + pxd_t ait2; /* pxd describing AIT copy */ + char uuid[16]; /* 128-bit uuid for volume */ + char loguuid[16]; /* 128-bit uuid for log */ /* Formerly in ipimap */ - uint gengen; /* 4: inode generation generator*/ - uint inostamp; /* 4: shows inode belongs to fileset*/ + uint gengen; /* inode generation generator*/ + uint inostamp; /* shows inode belongs to fileset*/ /* Formerly in ipbmap */ - struct bmap *bmap; /* 4: incore bmap descriptor */ - struct nls_table *nls_tab; /* 4: current codepage */ - uint state; /* 4: mount/recovery state */ + struct bmap *bmap; /* incore bmap descriptor */ + struct nls_table *nls_tab; /* current codepage */ + uint state; /* mount/recovery state */ + unsigned long flag; /* mount time flags */ + uint p_state; /* state prior to going no integrity */ }; static inline struct jfs_inode_info *JFS_IP(struct inode *inode) diff -Nru a/fs/jfs/jfs_logmgr.c b/fs/jfs/jfs_logmgr.c --- a/fs/jfs/jfs_logmgr.c Mon Aug 25 14:10:34 2003 +++ b/fs/jfs/jfs_logmgr.c Mon Aug 25 14:10:35 2003 @@ -1,5 +1,5 @@ /* - * Copyright (c) International Business Machines Corp., 2000-2002 + * Copyright (c) International Business Machines Corp., 2000-2003 * Portions Copyright (c) Christoph Hellwig, 2001-2002 * * This program is free software; you can redistribute it and/or modify @@ -1238,6 +1238,15 @@ log->page = le32_to_cpu(logsuper->end) / LOGPSIZE; log->eor = le32_to_cpu(logsuper->end) - (LOGPSIZE * log->page); + /* check for disabled journaling to disk */ + if (JFS_SBI(log->sb)->flag & JFS_NOINTEGRITY) { + log->no_integrity = 1; + log->ni_page = log->page; + log->ni_eor = log->eor; + } + else + log->no_integrity = 0; + /* * initialize for log append write mode */ @@ -1518,6 +1527,14 @@ lrd.type = cpu_to_le16(LOG_SYNCPT); lrd.length = 0; lrd.log.syncpt.sync = 0; + + /* check for disabled journaling to disk */ + if (JFS_SBI(log->sb)->flag & JFS_NOINTEGRITY) { + log->no_integrity = 0; + log->page = log->ni_page; + log->eor = log->ni_eor; + } + lsn = lmWriteRecord(log, NULL, &lrd, NULL); bp = log->bp; lp = (struct logpage *) bp->l_ldata; @@ -1973,7 +1990,12 @@ set_bit(BH_Req, &bp->l_bh.b_state); bp->l_bh.b_rdev = bp->l_bh.b_dev; bp->l_bh.b_rsector = bp->l_blkno << (bp->l_log->l2bsize - 9); - generic_make_request(WRITE, &bp->l_bh); + + if (bp->l_log->no_integrity) + /* don't really do I/O */ + lbmIODone(&bp->l_bh, 1); + else + generic_make_request(WRITE, &bp->l_bh); INCREMENT(lmStat.submitted); run_task_queue(&tq_disk); diff -Nru a/fs/jfs/jfs_logmgr.h b/fs/jfs/jfs_logmgr.h --- a/fs/jfs/jfs_logmgr.h Mon Aug 25 14:10:35 2003 +++ b/fs/jfs/jfs_logmgr.h Mon Aug 25 14:10:35 2003 @@ -1,5 +1,5 @@ /* - * Copyright (c) International Business Machines Corp., 2000-2002 + * Copyright (c) International Business Machines Corp., 2000-2003 * Portions Copyright (c) Christoph Hellwig, 2001-2002 * * This program is free software; you can redistribute it and/or modify @@ -417,6 +417,10 @@ struct lbuf *wqueue; /* 4: log pageout queue */ int count; /* 4: count */ char uuid[16]; /* 16: 128-bit uuid of log device */ + + int no_integrity; /* flag to disable journaling to disk */ + int ni_page; /* backup of page for nointegrity option */ + int ni_eor; /* backup of eor for nointegrity option */ }; /* diff -Nru a/fs/jfs/jfs_mount.c b/fs/jfs/jfs_mount.c --- a/fs/jfs/jfs_mount.c Mon Aug 25 14:10:34 2003 +++ b/fs/jfs/jfs_mount.c Mon Aug 25 14:10:34 2003 @@ -1,5 +1,5 @@ /* - * Copyright (c) International Business Machines Corp., 2000-2002 + * Copyright (c) International Business Machines Corp., 2000-2003 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -420,12 +420,20 @@ struct buffer_head *bh; int rc; - /* - * Only fsck can fix dirty state - */ - if (sbi->state == FM_DIRTY) + if (sbi->flag & JFS_NOINTEGRITY) { + if (state == FM_DIRTY) { + sbi->p_state = state; + return 0; + } else if (state == FM_MOUNT) { + sbi->p_state = sbi->state; + state = FM_DIRTY; + } else if (state == FM_CLEAN) { + state = sbi->p_state; + } else + jfs_err("updateSuper: bad state"); + } else if (sbi->state == FM_DIRTY) return 0; - + if ((rc = readSuper(sb, &bh))) return rc; diff -Nru a/fs/jfs/jfs_txnmgr.c b/fs/jfs/jfs_txnmgr.c --- a/fs/jfs/jfs_txnmgr.c Mon Aug 25 14:10:34 2003 +++ b/fs/jfs/jfs_txnmgr.c Mon Aug 25 14:10:34 2003 @@ -1,5 +1,5 @@ /* - * Copyright (c) International Business Machines Corp., 2000-2002 + * Copyright (c) International Business Machines Corp., 2000-2003 * Portions Copyright (c) Christoph Hellwig, 2001-2002 * * This program is free software; you can redistribute it and/or modify @@ -2715,7 +2715,7 @@ /* We must have gotten ahead of the user thread */ jfs_info("txLazyCommit: tblk 0x%p not unlocked", tblk); - schedule(); + yield(); } jfs_info("txLazyCommit: processing tblk 0x%p", tblk); diff -Nru a/fs/jfs/super.c b/fs/jfs/super.c --- a/fs/jfs/super.c Mon Aug 25 14:10:35 2003 +++ b/fs/jfs/super.c Mon Aug 25 14:10:35 2003 @@ -1,5 +1,5 @@ /* - * Copyright (c) International Business Machines Corp., 2000-2002 + * Copyright (c) International Business Machines Corp., 2000-2003 * Portions Copyright (c) Christoph Hellwig, 2001-2002 * * This program is free software; you can redistribute it and/or modify @@ -142,7 +142,8 @@ return 0; } -static int parse_options(char *options, struct super_block *sb, s64 *newLVSize) +static int parse_options(char *options, struct super_block *sb, s64 *newLVSize, + int *flag) { void *nls_map = NULL; char *this_char; @@ -158,7 +159,11 @@ continue; if ((value = strchr(this_char, '=')) != NULL) *value++ = 0; - if (!strcmp(this_char, "iocharset")) { + if (!strcmp(this_char, "integrity")) { + *flag &= ~JFS_NOINTEGRITY; + } else if (!strcmp(this_char, "nointegrity")) { + *flag |= JFS_NOINTEGRITY; + } else if (!strcmp(this_char, "iocharset")) { if (!value || !*value) goto needs_arg; if (nls_map) /* specified iocharset twice! */ @@ -208,8 +213,9 @@ { s64 newLVSize = 0; int rc = 0; + int flag = JFS_SBI(sb)->flag; - if (!parse_options(data, sb, &newLVSize)) { + if (!parse_options(data, sb, &newLVSize, &flag)) { return -EINVAL; } if (newLVSize) { @@ -223,10 +229,24 @@ return rc; } - if ((sb->s_flags & MS_RDONLY) && !(*flags & MS_RDONLY)) + if ((sb->s_flags & MS_RDONLY) && !(*flags & MS_RDONLY)) { + JFS_SBI(sb)->flag = flag; return jfs_mount_rw(sb, 1); - else if ((!(sb->s_flags & MS_RDONLY)) && (*flags & MS_RDONLY)) - return jfs_umount_rw(sb); + } + if ((!(sb->s_flags & MS_RDONLY)) && (*flags & MS_RDONLY)) { + rc = jfs_umount_rw(sb); + JFS_SBI(sb)->flag = flag; + return rc; + } + if ((JFS_SBI(sb)->flag & JFS_NOINTEGRITY) != (flag & JFS_NOINTEGRITY)) + if (!(sb->s_flags & MS_RDONLY)) { + rc = jfs_umount_rw(sb); + if (rc) + return rc; + JFS_SBI(sb)->flag = flag; + return jfs_mount_rw(sb, 1); + } + JFS_SBI(sb)->flag = flag; return 0; } @@ -238,6 +258,7 @@ struct inode *inode; int rc; s64 newLVSize = 0; + int flag; jfs_info("In jfs_read_super s_dev=0x%x s_flags=0x%lx", sb->s_dev, sb->s_flags); @@ -248,10 +269,12 @@ memset(sbi, 0, sizeof (struct jfs_sb_info)); sb->u.generic_sbp = sbi; - if (!parse_options((char *) data, sb, &newLVSize)) { + flag = 0; + if (!parse_options((char *) data, sb, &newLVSize, &flag)) { kfree(sbi); return NULL; } + sbi->flag = flag; if (newLVSize) { printk(KERN_ERR "resize option for remount only\n");