@@ -261,6 +261,11 @@ static errcode_t write_backup_super(ext2_filsys fs, dgrp_t group,
errcode_t ext2fs_flush(ext2_filsys fs)
{
+ return ext2fs_flush2(fs, 0);
+}
+
+errcode_t ext2fs_flush2(ext2_filsys fs, int flags)
+{
dgrp_t i;
errcode_t retval;
unsigned long fs_state;
@@ -401,14 +406,16 @@ write_primary_superblock_only:
ext2fs_swap_super(super_shadow);
#endif
- retval = io_channel_flush(fs->io);
+ if (!(flags & EXT2_FLAG_FLUSH_NO_SYNC))
+ retval = io_channel_flush(fs->io);
retval = write_primary_superblock(fs, super_shadow);
if (retval)
goto errout;
fs->flags &= ~EXT2_FLAG_DIRTY;
- retval = io_channel_flush(fs->io);
+ if (!(flags & EXT2_FLAG_FLUSH_NO_SYNC))
+ retval = io_channel_flush(fs->io);
errout:
fs->super->s_state = fs_state;
#ifdef WORDS_BIGENDIAN
@@ -422,6 +429,11 @@ errout:
errcode_t ext2fs_close(ext2_filsys fs)
{
+ return ext2fs_close2(fs, 0);
+}
+
+errcode_t ext2fs_close2(ext2_filsys fs, int flags)
+{
errcode_t retval;
int meta_blks;
io_stats stats = 0;
@@ -446,7 +458,7 @@ errcode_t ext2fs_close(ext2_filsys fs)
fs->flags |= EXT2_FLAG_SUPER_ONLY | EXT2_FLAG_DIRTY;
}
if (fs->flags & EXT2_FLAG_DIRTY) {
- retval = ext2fs_flush(fs);
+ retval = ext2fs_flush2(fs, flags);
if (retval)
return retval;
}
@@ -593,6 +593,12 @@ typedef struct stat ext2fs_struct_stat;
#endif
/*
+ * For ext2fs_close2 and ext2fs_flush2, this flag allows you to avoid
+ * the fsync call.
+ */
+#define EXT2_FLAG_FLUSH_NO_SYNC 1
+
+/*
* function prototypes
*/
@@ -876,7 +882,9 @@ extern errcode_t ext2fs_check_desc(ext2_filsys fs);
/* closefs.c */
extern errcode_t ext2fs_close(ext2_filsys fs);
+extern errcode_t ext2fs_close2(ext2_filsys fs, int flags);
extern errcode_t ext2fs_flush(ext2_filsys fs);
+extern errcode_t ext2fs_flush2(ext2_filsys fs, int flags);
extern int ext2fs_bg_has_super(ext2_filsys fs, int group_block);
extern errcode_t ext2fs_super_and_bgd_loc2(ext2_filsys fs,
dgrp_t group,