Hello,

Milos Nikic, le mar. 27 janv. 2026 15:16:41 -0800, a ecrit:
> Now that we have a write barrier lets use it at some
> critical points.

I have applied only the parts that sync on shutdown/syncfs/readonly,
I have not applied the getblk and inode write parts: could you
benchmark it a bit to check so we have an idea how much it can affect
i/o-intensive performance?

Samuel

> ---
>  ext2fs/getblk.c | 9 ++++++++-
>  ext2fs/hyper.c  | 8 +++++++-
>  ext2fs/inode.c  | 7 ++++++-
>  ext2fs/pager.c  | 9 ++++++++-
>  4 files changed, 29 insertions(+), 4 deletions(-)
> 
> diff --git a/ext2fs/getblk.c b/ext2fs/getblk.c
> index ed6e3e09..49ab5740 100644
> --- a/ext2fs/getblk.c
> +++ b/ext2fs/getblk.c
> @@ -234,7 +234,14 @@ block_getblk (struct node *node, block_t block, int nr, 
> int create, int zero,
>    bh[nr] = *result;
>  
>    if (diskfs_synchronous || diskfs_node_disknode (node)->info.i_osync)
> -    sync_global_ptr (bh, 1);
> +    {
> +      sync_global_ptr (bh, 1);
> +      /* We just wrote a new indirect block pointer.
> +         If this doesn't hit the platter, the file is corrupt. */
> +      error_t err = store_sync (store);
> +      if (err && err != EOPNOTSUPP)
> +     ext2_warning ("indirect block flush failed: %s", strerror (err));
> +    }
>    else
>      record_indir_poke (node, bh);
>  
> diff --git a/ext2fs/hyper.c b/ext2fs/hyper.c
> index 59458724..847f9f2b 100644
> --- a/ext2fs/hyper.c
> +++ b/ext2fs/hyper.c
> @@ -220,7 +220,13 @@ diskfs_set_hypermetadata (int wait, int clean)
>     }
>  
>    sync_global (wait);
> -
> +  if (wait)
> +    {
> +      error_t err = store_sync (store);
> +      /* Ignore EOPNOTSUPP (legacy drivers), but warn on real I/O errors */
> +      if (err && err != EOPNOTSUPP)
> +        ext2_warning ("device flush failed: %s", strerror (err));
> +    }
>    return 0;
>  }
>  
> diff --git a/ext2fs/inode.c b/ext2fs/inode.c
> index 8d1656f6..8d10af01 100644
> --- a/ext2fs/inode.c
> +++ b/ext2fs/inode.c
> @@ -569,7 +569,12 @@ diskfs_write_disknode (struct node *np, int wait)
>    if (di)
>      {
>        if (wait)
> -     sync_global_ptr (di, 1);
> +        {
> +       sync_global_ptr (di, 1);
> +          error_t err = store_sync (store);
> +          if (err && err != EOPNOTSUPP)
> +            ext2_warning ("inode flush failed: %s", strerror (err));
> +        }
>        else
>       record_global_poke (di);
>      }
> diff --git a/ext2fs/pager.c b/ext2fs/pager.c
> index a7801bea..1c795784 100644
> --- a/ext2fs/pager.c
> +++ b/ext2fs/pager.c
> @@ -1575,7 +1575,7 @@ diskfs_shutdown_pager (void)
>  
>    /* Sync everything on the the disk pager.  */
>    sync_global (1);
> -
> +  store_sync (store);
>    /* Despite the name of this function, we never actually shutdown the disk
>       pager, just make sure it's synced. */
>  }
> @@ -1596,6 +1596,13 @@ diskfs_sync_everything (int wait)
>  
>    /* Do things on the the disk pager.  */
>    sync_global (wait);
> +  if (wait)
> +    {
> +      error_t err = store_sync (store);
> +      /* Ignore EOPNOTSUPP (drivers), but warn on real I/O errors */
> +      if (err && err != EOPNOTSUPP)
> +        ext2_warning ("device flush failed: %s", strerror (err));
> +    }
>  }
>  
>  static void
> -- 
> 2.52.0
> 
> 

-- 
Samuel
        /* Amuse the user in a SPARC fashion */
        if (err) printk(
KERN_CRIT "      _______________________________ \n"
KERN_CRIT "     < Your System ate a SPARC! Gah! >\n"
KERN_CRIT "      ------------------------------- \n"
KERN_CRIT "             \\   ^__^\n"
KERN_CRIT "              \\  (xx)\\_______\n"
KERN_CRIT "                 (__)\\       )\\/\\\n"
KERN_CRIT "                  U  ||----w |\n"
KERN_CRIT "                     ||     ||\n");
(From linux/arch/parisc/kernel/traps.c:die_if_kernel())

Reply via email to