Re: [PATCH] ext4: Support fast symlinks from ext3 file systems

2017-12-03 Thread Theodore Ts'o
On Mon, Nov 27, 2017 at 11:08:53AM -0700, Andreas Dilger wrote:
> On Nov 27, 2017, at 10:37 AM, Andi Kleen  wrote:
> > 
> > From: Andi Kleen 
> > 
> > dbb3c27f5b91c4 (ext4: change fast symlink test to not rely on i_blocks)
> > broke ~10 years old ext3 file systems created by 2.6.17. Any ELF
> > executable fails because the /lib/ld-linux.so.2 fast symlink
> > cannot be read anymore.
> > 
> > The patch assumed fast symlinks were created in a specific way,
> > but that's not true on these really old file systems.
> > 
> > The new behavior is apparently needed only with the large EA inode
> > feature.
> > 
> > Revert to the old behavior if the large EA inode feature is not set.
> > 
> > This makes my old VM boot again.
> > 
> > Fixes: dbb3c27f5b91c4 (ext4: change fast symlink test to not rely ...)
> > Signed-off-by: Andi Kleen 
> 
> Reviewed-by: Andreas Dilger 

Thanks, applied.

- Ted


Re: [PATCH] ext4: Support fast symlinks from ext3 file systems

2017-11-27 Thread Andreas Dilger
On Nov 27, 2017, at 10:37 AM, Andi Kleen  wrote:
> 
> From: Andi Kleen 
> 
> dbb3c27f5b91c4 (ext4: change fast symlink test to not rely on i_blocks)
> broke ~10 years old ext3 file systems created by 2.6.17. Any ELF
> executable fails because the /lib/ld-linux.so.2 fast symlink
> cannot be read anymore.
> 
> The patch assumed fast symlinks were created in a specific way,
> but that's not true on these really old file systems.
> 
> The new behavior is apparently needed only with the large EA inode
> feature.
> 
> Revert to the old behavior if the large EA inode feature is not set.
> 
> This makes my old VM boot again.
> 
> Fixes: dbb3c27f5b91c4 (ext4: change fast symlink test to not rely ...)
> Signed-off-by: Andi Kleen 

Reviewed-by: Andreas Dilger 

> ---
> fs/ext4/inode.c | 9 +
> 1 file changed, 9 insertions(+)
> 
> diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c
> index 0992d76f7ab1..6b82b0ff5e0b 100644
> --- a/fs/ext4/inode.c
> +++ b/fs/ext4/inode.c
> @@ -149,6 +149,15 @@ static int ext4_meta_trans_blocks(struct inode *inode, 
> int lblocks,
>  */
> int ext4_inode_is_fast_symlink(struct inode *inode)
> {
> + if (!(EXT4_I(inode)->i_flags & EXT4_EA_INODE_FL)) {
> + int ea_blocks = EXT4_I(inode)->i_file_acl ?
> + EXT4_CLUSTER_SIZE(inode->i_sb) >> 9 : 0;
> +
> + if (ext4_has_inline_data(inode))
> + return 0;
> +
> + return (S_ISLNK(inode->i_mode) && inode->i_blocks - ea_blocks 
> == 0);
> + }
>   return S_ISLNK(inode->i_mode) && inode->i_size &&
>  (inode->i_size < EXT4_N_BLOCKS * 4);
> }
> --
> 2.13.6
> 


Cheers, Andreas







signature.asc
Description: Message signed with OpenPGP


[PATCH] ext4: Support fast symlinks from ext3 file systems

2017-11-27 Thread Andi Kleen
From: Andi Kleen 

dbb3c27f5b91c4 (ext4: change fast symlink test to not rely on i_blocks)
broke ~10 years old ext3 file systems created by 2.6.17. Any ELF
executable fails because the /lib/ld-linux.so.2 fast symlink
cannot be read anymore.

The patch assumed fast symlinks were created in a specific way,
but that's not true on these really old file systems.

The new behavior is apparently needed only with the large EA inode
feature.

Revert to the old behavior if the large EA inode feature is not set.

This makes my old VM boot again.

Fixes: dbb3c27f5b91c4 (ext4: change fast symlink test to not rely ...)
Signed-off-by: Andi Kleen 
---
 fs/ext4/inode.c | 9 +
 1 file changed, 9 insertions(+)

diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c
index 0992d76f7ab1..6b82b0ff5e0b 100644
--- a/fs/ext4/inode.c
+++ b/fs/ext4/inode.c
@@ -149,6 +149,15 @@ static int ext4_meta_trans_blocks(struct inode *inode, int 
lblocks,
  */
 int ext4_inode_is_fast_symlink(struct inode *inode)
 {
+   if (!(EXT4_I(inode)->i_flags & EXT4_EA_INODE_FL)) {
+   int ea_blocks = EXT4_I(inode)->i_file_acl ?
+   EXT4_CLUSTER_SIZE(inode->i_sb) >> 9 : 0;
+
+   if (ext4_has_inline_data(inode))
+   return 0;
+
+   return (S_ISLNK(inode->i_mode) && inode->i_blocks - ea_blocks 
== 0);
+   }
return S_ISLNK(inode->i_mode) && inode->i_size &&
   (inode->i_size < EXT4_N_BLOCKS * 4);
 }
-- 
2.13.6