| From 4c37e71b713ecffe81f8e6273c6835e54306d412 Mon Sep 17 00:00:00 2001 |
| From: Amir Goldstein <amir73il@gmail.com> |
| Date: Sun, 22 Dec 2019 22:47:54 +0200 |
| Subject: ovl: fix wrong WARN_ON() in ovl_cache_update_ino() |
| |
| From: Amir Goldstein <amir73il@gmail.com> |
| |
| commit 4c37e71b713ecffe81f8e6273c6835e54306d412 upstream. |
| |
| The WARN_ON() that child entry is always on overlay st_dev became wrong |
| when we allowed this function to update d_ino in non-samefs setup with xino |
| enabled. |
| |
| It is not true in case of xino bits overflow on a non-dir inode. Leave the |
| WARN_ON() only for directories, where assertion is still true. |
| |
| Fixes: adbf4f7ea834 ("ovl: consistent d_ino for non-samefs with xino") |
| Cc: <stable@vger.kernel.org> # v4.17+ |
| Signed-off-by: Amir Goldstein <amir73il@gmail.com> |
| Signed-off-by: Miklos Szeredi <mszeredi@redhat.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| fs/overlayfs/readdir.c | 8 +++++++- |
| 1 file changed, 7 insertions(+), 1 deletion(-) |
| |
| --- a/fs/overlayfs/readdir.c |
| +++ b/fs/overlayfs/readdir.c |
| @@ -507,7 +507,13 @@ get: |
| if (err) |
| goto fail; |
| |
| - WARN_ON_ONCE(dir->d_sb->s_dev != stat.dev); |
| + /* |
| + * Directory inode is always on overlay st_dev. |
| + * Non-dir with ovl_same_dev() could be on pseudo st_dev in case |
| + * of xino bits overflow. |
| + */ |
| + WARN_ON_ONCE(S_ISDIR(stat.mode) && |
| + dir->d_sb->s_dev != stat.dev); |
| ino = stat.ino; |
| } else if (xinobits && !OVL_TYPE_UPPER(type)) { |
| ino = ovl_remap_lower_ino(ino, xinobits, |