|
@@ -611,11 +611,28 @@ static int jfs_freeze(struct super_block *sb)
|
|
|
{
|
|
|
struct jfs_sb_info *sbi = JFS_SBI(sb);
|
|
|
struct jfs_log *log = sbi->log;
|
|
|
+ int rc = 0;
|
|
|
|
|
|
if (!(sb->s_flags & MS_RDONLY)) {
|
|
|
txQuiesce(sb);
|
|
|
- lmLogShutdown(log);
|
|
|
- updateSuper(sb, FM_CLEAN);
|
|
|
+ rc = lmLogShutdown(log);
|
|
|
+ if (rc) {
|
|
|
+ jfs_error(sb, "jfs_freeze: lmLogShutdown failed");
|
|
|
+
|
|
|
+ /* let operations fail rather than hang */
|
|
|
+ txResume(sb);
|
|
|
+
|
|
|
+ return rc;
|
|
|
+ }
|
|
|
+ rc = updateSuper(sb, FM_CLEAN);
|
|
|
+ if (rc) {
|
|
|
+ jfs_err("jfs_freeze: updateSuper failed\n");
|
|
|
+ /*
|
|
|
+ * Don't fail here. Everything succeeded except
|
|
|
+ * marking the superblock clean, so there's really
|
|
|
+ * no harm in leaving it frozen for now.
|
|
|
+ */
|
|
|
+ }
|
|
|
}
|
|
|
return 0;
|
|
|
}
|
|
@@ -627,13 +644,18 @@ static int jfs_unfreeze(struct super_block *sb)
|
|
|
int rc = 0;
|
|
|
|
|
|
if (!(sb->s_flags & MS_RDONLY)) {
|
|
|
- updateSuper(sb, FM_MOUNT);
|
|
|
- if ((rc = lmLogInit(log)))
|
|
|
- jfs_err("jfs_unlock failed with return code %d", rc);
|
|
|
- else
|
|
|
- txResume(sb);
|
|
|
+ rc = updateSuper(sb, FM_MOUNT);
|
|
|
+ if (rc) {
|
|
|
+ jfs_error(sb, "jfs_unfreeze: updateSuper failed");
|
|
|
+ goto out;
|
|
|
+ }
|
|
|
+ rc = lmLogInit(log);
|
|
|
+ if (rc)
|
|
|
+ jfs_error(sb, "jfs_unfreeze: lmLogInit failed");
|
|
|
+out:
|
|
|
+ txResume(sb);
|
|
|
}
|
|
|
- return 0;
|
|
|
+ return rc;
|
|
|
}
|
|
|
|
|
|
static struct dentry *jfs_do_mount(struct file_system_type *fs_type,
|