1 // SPDX-License-Identifier: GPL-2.0-or-later << 2 /* 1 /* 3 * Copyright (C) International Business Mach 2 * Copyright (C) International Business Machines Corp., 2000-2004 >> 3 * >> 4 * This program is free software; you can redistribute it and/or modify >> 5 * it under the terms of the GNU General Public License as published by >> 6 * the Free Software Foundation; either version 2 of the License, or >> 7 * (at your option) any later version. >> 8 * >> 9 * This program is distributed in the hope that it will be useful, >> 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of >> 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See >> 12 * the GNU General Public License for more details. >> 13 * >> 14 * You should have received a copy of the GNU General Public License >> 15 * along with this program; if not, write to the Free Software >> 16 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 4 */ 17 */ 5 18 6 /* 19 /* 7 * jfs_umount.c 20 * jfs_umount.c 8 * 21 * 9 * note: file system in transition to aggregat 22 * note: file system in transition to aggregate/fileset: 10 * (ref. jfs_mount.c) 23 * (ref. jfs_mount.c) 11 * 24 * 12 * file system unmount is interpreted as mount 25 * file system unmount is interpreted as mount of the single/only 13 * fileset in the aggregate and, if unmount of 26 * fileset in the aggregate and, if unmount of the last fileset, 14 * as unmount of the aggerate; 27 * as unmount of the aggerate; 15 */ 28 */ 16 29 17 #include <linux/fs.h> 30 #include <linux/fs.h> 18 #include "jfs_incore.h" 31 #include "jfs_incore.h" 19 #include "jfs_filsys.h" 32 #include "jfs_filsys.h" 20 #include "jfs_superblock.h" 33 #include "jfs_superblock.h" 21 #include "jfs_dmap.h" 34 #include "jfs_dmap.h" 22 #include "jfs_imap.h" 35 #include "jfs_imap.h" 23 #include "jfs_metapage.h" 36 #include "jfs_metapage.h" 24 #include "jfs_debug.h" 37 #include "jfs_debug.h" 25 38 26 /* 39 /* 27 * NAME: jfs_umount(vfsp, flags, crp) 40 * NAME: jfs_umount(vfsp, flags, crp) 28 * 41 * 29 * FUNCTION: vfs_umount() 42 * FUNCTION: vfs_umount() 30 * 43 * 31 * PARAMETERS: vfsp - virtual file system 44 * PARAMETERS: vfsp - virtual file system pointer 32 * flags - unmount for shutdown 45 * flags - unmount for shutdown 33 * crp - credential 46 * crp - credential 34 * 47 * 35 * RETURN : EBUSY - device has open file 48 * RETURN : EBUSY - device has open files 36 */ 49 */ 37 int jfs_umount(struct super_block *sb) 50 int jfs_umount(struct super_block *sb) 38 { 51 { 39 struct jfs_sb_info *sbi = JFS_SBI(sb); 52 struct jfs_sb_info *sbi = JFS_SBI(sb); 40 struct inode *ipbmap = sbi->ipbmap; 53 struct inode *ipbmap = sbi->ipbmap; 41 struct inode *ipimap = sbi->ipimap; 54 struct inode *ipimap = sbi->ipimap; 42 struct inode *ipaimap = sbi->ipaimap; 55 struct inode *ipaimap = sbi->ipaimap; 43 struct inode *ipaimap2 = sbi->ipaimap2 56 struct inode *ipaimap2 = sbi->ipaimap2; 44 struct jfs_log *log; 57 struct jfs_log *log; 45 int rc = 0; 58 int rc = 0; 46 59 47 jfs_info("UnMount JFS: sb:0x%p", sb); 60 jfs_info("UnMount JFS: sb:0x%p", sb); 48 61 49 /* 62 /* 50 * update superblock and close lo 63 * update superblock and close log 51 * 64 * 52 * if mounted read-write and log based 65 * if mounted read-write and log based recovery was enabled 53 */ 66 */ 54 if ((log = sbi->log)) 67 if ((log = sbi->log)) 55 /* 68 /* 56 * Wait for outstanding transa 69 * Wait for outstanding transactions to be written to log: 57 */ 70 */ 58 jfs_flush_journal(log, 2); 71 jfs_flush_journal(log, 2); 59 72 60 /* 73 /* 61 * close fileset inode allocation map 74 * close fileset inode allocation map (aka fileset inode) 62 */ 75 */ 63 diUnmount(ipimap, 0); 76 diUnmount(ipimap, 0); 64 77 65 diFreeSpecial(ipimap); 78 diFreeSpecial(ipimap); 66 sbi->ipimap = NULL; 79 sbi->ipimap = NULL; 67 80 68 /* 81 /* 69 * close secondary aggregate inode all 82 * close secondary aggregate inode allocation map 70 */ 83 */ >> 84 ipaimap2 = sbi->ipaimap2; 71 if (ipaimap2) { 85 if (ipaimap2) { 72 diUnmount(ipaimap2, 0); 86 diUnmount(ipaimap2, 0); 73 diFreeSpecial(ipaimap2); 87 diFreeSpecial(ipaimap2); 74 sbi->ipaimap2 = NULL; 88 sbi->ipaimap2 = NULL; 75 } 89 } 76 90 77 /* 91 /* 78 * close aggregate inode allocation ma 92 * close aggregate inode allocation map 79 */ 93 */ >> 94 ipaimap = sbi->ipaimap; 80 diUnmount(ipaimap, 0); 95 diUnmount(ipaimap, 0); 81 diFreeSpecial(ipaimap); 96 diFreeSpecial(ipaimap); 82 sbi->ipaimap = NULL; 97 sbi->ipaimap = NULL; 83 98 84 /* 99 /* 85 * close aggregate block allocation ma 100 * close aggregate block allocation map 86 */ 101 */ 87 dbUnmount(ipbmap, 0); 102 dbUnmount(ipbmap, 0); 88 103 89 diFreeSpecial(ipbmap); 104 diFreeSpecial(ipbmap); 90 sbi->ipbmap = NULL; !! 105 sbi->ipimap = NULL; 91 106 92 /* 107 /* 93 * Make sure all metadata makes it to 108 * Make sure all metadata makes it to disk before we mark 94 * the superblock as clean 109 * the superblock as clean 95 */ 110 */ 96 filemap_write_and_wait(sbi->direct_ino 111 filemap_write_and_wait(sbi->direct_inode->i_mapping); 97 112 98 /* 113 /* 99 * ensure all file system file pages a 114 * ensure all file system file pages are propagated to their 100 * home blocks on disk (and their in-m 115 * home blocks on disk (and their in-memory buffer pages are 101 * invalidated) BEFORE updating file s 116 * invalidated) BEFORE updating file system superblock state 102 * (to signify file system is unmounte 117 * (to signify file system is unmounted cleanly, and thus in 103 * consistent state) and log superbloc 118 * consistent state) and log superblock active file system 104 * list (to signify skip logredo()). 119 * list (to signify skip logredo()). 105 */ 120 */ 106 if (log) { /* log = NULL 121 if (log) { /* log = NULL if read-only mount */ 107 updateSuper(sb, FM_CLEAN); 122 updateSuper(sb, FM_CLEAN); 108 123 109 /* 124 /* 110 * close log: 125 * close log: 111 * 126 * 112 * remove file system from log 127 * remove file system from log active file system list. 113 */ 128 */ 114 rc = lmLogClose(sb); 129 rc = lmLogClose(sb); 115 } 130 } 116 jfs_info("UnMount JFS Complete: rc = % 131 jfs_info("UnMount JFS Complete: rc = %d", rc); 117 return rc; 132 return rc; 118 } 133 } 119 134 120 135 121 int jfs_umount_rw(struct super_block *sb) 136 int jfs_umount_rw(struct super_block *sb) 122 { 137 { 123 struct jfs_sb_info *sbi = JFS_SBI(sb); 138 struct jfs_sb_info *sbi = JFS_SBI(sb); 124 struct jfs_log *log = sbi->log; 139 struct jfs_log *log = sbi->log; 125 140 126 if (!log) 141 if (!log) 127 return 0; 142 return 0; 128 143 129 /* 144 /* 130 * close log: 145 * close log: 131 * 146 * 132 * remove file system from log active 147 * remove file system from log active file system list. 133 */ 148 */ 134 jfs_flush_journal(log, 2); 149 jfs_flush_journal(log, 2); 135 150 136 /* 151 /* 137 * Make sure all metadata makes it to 152 * Make sure all metadata makes it to disk 138 */ 153 */ 139 dbSync(sbi->ipbmap); 154 dbSync(sbi->ipbmap); 140 diSync(sbi->ipimap); 155 diSync(sbi->ipimap); 141 156 142 /* 157 /* 143 * Note that we have to do this even i 158 * Note that we have to do this even if sync_blockdev() will 144 * do exactly the same a few instructi 159 * do exactly the same a few instructions later: We can't 145 * mark the superblock clean before ev 160 * mark the superblock clean before everything is flushed to 146 * disk. 161 * disk. 147 */ 162 */ 148 filemap_write_and_wait(sbi->direct_ino 163 filemap_write_and_wait(sbi->direct_inode->i_mapping); 149 164 150 updateSuper(sb, FM_CLEAN); 165 updateSuper(sb, FM_CLEAN); 151 166 152 return lmLogClose(sb); 167 return lmLogClose(sb); 153 } 168 } 154 169
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.