On Sat, Mar 25, 2023 at 02:56:52PM +0800, zhanchengbin wrote: > If fsync fails during fsck, it is silent and users will not perceive it, so > a function to handle fsync failure should be added to fsck. > > Signed-off-by: zhanchengbin <zhanchengbin1@xxxxxxxxxx> > --- > e2fsck/ehandler.c | 24 ++++++++++++++++++++++++ > 1 file changed, 24 insertions(+) > > diff --git a/e2fsck/ehandler.c b/e2fsck/ehandler.c > index 71ca301c..ae35f3ef 100644 > --- a/e2fsck/ehandler.c > +++ b/e2fsck/ehandler.c > @@ -118,6 +118,29 @@ static errcode_t e2fsck_handle_write_error(io_channel channel, > return error; > } > > +static errcode_t e2fsck_handle_sync_error(io_channel channel, > + errcode_t error) > +{ > + ext2_filsys fs = (ext2_filsys) channel->app_data; > + e2fsck_t ctx; > + > + ctx = (e2fsck_t) fs->priv_data; > + if (ctx->flags & E2F_FLAG_EXITING) > + return 0; > + Nit: ^^^ unnecessary indentation > + if (operation) > + printf(_("Error sync (%s) while %s. "), I think we should be more explicit that *fsync* failed: "Error during fsync of dirty metadata while %s: %s", operation, error_message(...)? > + error_message(error), operation); > + else > + printf(_("Error sync (%s). "), > + error_message(error)); > + preenhalt(ctx); > + if (ask(ctx, _("Ignore error"), 1)) ask_yn()? Not sure what we're asking about here, or what happens if you answer NO? Unless we're using a redo file, dirty metadata flush has failed so we might as well keep going, right? --D > + return 0; > + > + return error; > +} > + > const char *ehandler_operation(const char *op) > { > const char *ret = operation; > @@ -130,4 +153,5 @@ void ehandler_init(io_channel channel) > { > channel->read_error = e2fsck_handle_read_error; > channel->write_error = e2fsck_handle_write_error; > + channel->sync_error = e2fsck_handle_sync_error; > } > -- > 2.31.1 >