| From 9ea7464aa0966a0eee436e7ab40ae926d94fe468 Mon Sep 17 00:00:00 2001 |
| From: Amir Goldstein <amir73il@gmail.com> |
| Date: Wed, 17 Jun 2020 09:57:11 +0300 |
| Subject: [PATCH] ovl: relax WARN_ON() when decoding lower directory file |
| handle |
| |
| commit 124c2de2c0aee96271e4ddab190083d8aa7aa71a upstream. |
| |
| Decoding a lower directory file handle to overlay path with cold |
| inode/dentry cache may go as follows: |
| |
| 1. Decode real lower file handle to lower dir path |
| 2. Check if lower dir is indexed (was copied up) |
| 3. If indexed, get the upper dir path from index |
| 4. Lookup upper dir path in overlay |
| 5. If overlay path found, verify that overlay lower is the lower dir |
| from step 1 |
| |
| On failure to verify step 5 above, user will get an ESTALE error and a |
| WARN_ON will be printed. |
| |
| A mismatch in step 5 could be a result of lower directory that was renamed |
| while overlay was offline, after that lower directory has been copied up |
| and indexed. |
| |
| This is a scripted reproducer based on xfstest overlay/052: |
| |
| # Create lower subdir |
| create_dirs |
| create_test_files $lower/lowertestdir/subdir |
| mount_dirs |
| # Copy up lower dir and encode lower subdir file handle |
| touch $SCRATCH_MNT/lowertestdir |
| test_file_handles $SCRATCH_MNT/lowertestdir/subdir -p -o $tmp.fhandle |
| # Rename lower dir offline |
| unmount_dirs |
| mv $lower/lowertestdir $lower/lowertestdir.new/ |
| mount_dirs |
| # Attempt to decode lower subdir file handle |
| test_file_handles $SCRATCH_MNT -p -i $tmp.fhandle |
| |
| Since this WARN_ON() can be triggered by user we need to relax it. |
| |
| Fixes: 4b91c30a5a19 ("ovl: lookup connected ancestor of dir in inode cache") |
| Cc: <stable@vger.kernel.org> # v4.16+ |
| Signed-off-by: Amir Goldstein <amir73il@gmail.com> |
| Signed-off-by: Miklos Szeredi <mszeredi@redhat.com> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/fs/overlayfs/export.c b/fs/overlayfs/export.c |
| index 73c9775215b3..11dd8177770d 100644 |
| --- a/fs/overlayfs/export.c |
| +++ b/fs/overlayfs/export.c |
| @@ -482,7 +482,7 @@ static struct dentry *ovl_lookup_real_inode(struct super_block *sb, |
| if (IS_ERR_OR_NULL(this)) |
| return this; |
| |
| - if (WARN_ON(ovl_dentry_real_at(this, layer->idx) != real)) { |
| + if (ovl_dentry_real_at(this, layer->idx) != real) { |
| dput(this); |
| this = ERR_PTR(-EIO); |
| } |
| -- |
| 2.27.0 |
| |