}
+/*
+ * NAME: lmLogWait()
+ *
+ * FUNCTION: wait for all outstanding log records to be written to disk
+ */
+void lmLogWait(log_t *log)
+{
+ int i;
+
+ jFYI(1, ("lmLogWait: log:0x%p\n", log));
+
+ if (log->cqueue.head || !list_empty(&log->synclist)) {
+ /*
+ * If there was very recent activity, we may need to wait
+ * for the lazycommit thread to catch up
+ */
+
+ for (i = 0; i < 800; i++) { /* Too much? */
+ current->state = TASK_INTERRUPTIBLE;
+ schedule_timeout(HZ / 4);
+ if ((log->cqueue.head == NULL) &&
+ list_empty(&log->synclist))
+ break;
+ }
+ }
+ assert(log->cqueue.head == NULL);
+ assert(list_empty(&log->synclist));
+}
+
/*
* NAME: lmLogShutdown()
*
jFYI(1, ("lmLogShutdown: log:0x%p\n", log));
- if (log->cqueue.head || !list_empty(&log->synclist)) {
- /*
- * If there was very recent activity, we may need to wait
- * for the lazycommit thread to catch up
- */
- int i;
-
- for (i = 0; i < 800; i++) { /* Too much? */
- current->state = TASK_INTERRUPTIBLE;
- schedule_timeout(HZ / 4);
- if ((log->cqueue.head == NULL) &&
- list_empty(&log->synclist))
- break;
- }
- }
- assert(log->cqueue.head == NULL);
- assert(list_empty(&log->synclist));
+ lmLogWait(log);
/*
* We need to make sure all of the "written" metapages
*
* if mounted read-write and log based recovery was enabled
*/
- if ((log = sbi->log)) {
+ if ((log = sbi->log))
/*
- * close log:
- *
- * remove file system from log active file system list.
+ * Wait for outstanding transactions to be written to log:
*/
- log = sbi->log;
- rc = lmLogClose(sb, log);
- }
+ lmLogWait(log);
/*
* close fileset inode allocation map (aka fileset inode)
diFreeSpecial(ipbmap);
sbi->ipimap = NULL;
+ /*
+ * Make sure all metadata makes it to disk before we mark
+ * the superblock as clean
+ */
+ filemap_fdatawait(sbi->direct_inode->i_mapping);
+ filemap_fdatawrite(sbi->direct_inode->i_mapping);
+ filemap_fdatawait(sbi->direct_inode->i_mapping);
+
/*
* ensure all file system file pages are propagated to their
* home blocks on disk (and their in-memory buffer pages are
* consistent state) and log superblock active file system
* list (to signify skip logredo()).
*/
- if (log) /* log = NULL if read-only mount */
+ if (log) { /* log = NULL if read-only mount */
rc = updateSuper(sb, FM_CLEAN);
-
+ /*
+ * close log:
+ *
+ * remove file system from log active file system list.
+ */
+ rc = lmLogClose(sb, log);
+ }
jFYI(0, (" UnMount JFS Complete: %d\n", rc));
return rc;
}
int jfs_umount_rw(struct super_block *sb)
{
struct jfs_sb_info *sbi = JFS_SBI(sb);
+ log_t *log = sbi->log;
- if (!sbi->log)
+ if (!log)
return 0;
/*
*
* remove file system from log active file system list.
*/
- lmLogClose(sb, sbi->log);
+ lmLogWait(log);
+ /*
+ * Make sure all metadata makes it to disk
+ */
dbSync(sbi->ipbmap);
diSync(sbi->ipimap);
+ filemap_fdatawait(sbi->direct_inode->i_mapping);
+ filemap_fdatawrite(sbi->direct_inode->i_mapping);
+ filemap_fdatawait(sbi->direct_inode->i_mapping);
- sbi->log = 0;
+ updateSuper(sb, FM_CLEAN);
+ sbi->log = NULL;
- return updateSuper(sb, FM_CLEAN);
-
+ return lmLogClose(sb, log);
}