| From 556b8883cfac3d3203557e161ea8005f8b5479b2 Mon Sep 17 00:00:00 2001 |
| From: Dave Chinner <dchinner@redhat.com> |
| Date: Fri, 6 Jun 2014 16:00:43 +1000 |
| Subject: xfs: xfs_readsb needs to check for magic numbers |
| |
| From: Dave Chinner <dchinner@redhat.com> |
| |
| commit 556b8883cfac3d3203557e161ea8005f8b5479b2 upstream. |
| |
| Commit daba542 ("xfs: skip verification on initial "guess" |
| superblock read") dropped the use of a verifier for the initial |
| superblock read so we can probe the sector size of the filesystem |
| stored in the superblock. It, however, now fails to validate that |
| what was read initially is actually an XFS superblock and hence will |
| fail the sector size check and return ENOSYS. |
| |
| This causes probe-based mounts to fail because it expects XFS to |
| return EINVAL when it doesn't recognise the superblock format. |
| |
| Reported-by: Plamen Petrov <plamen.sisi@gmail.com> |
| Tested-by: Plamen Petrov <plamen.sisi@gmail.com> |
| Signed-off-by: Dave Chinner <dchinner@redhat.com> |
| Reviewed-by: Christoph Hellwig <hch@lst.de> |
| Signed-off-by: Dave Chinner <david@fromorbit.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| fs/xfs/xfs_mount.c | 23 +++++++++++++++++------ |
| 1 file changed, 17 insertions(+), 6 deletions(-) |
| |
| --- a/fs/xfs/xfs_mount.c |
| +++ b/fs/xfs/xfs_mount.c |
| @@ -320,8 +320,19 @@ reread: |
| /* |
| * Initialize the mount structure from the superblock. |
| */ |
| - xfs_sb_from_disk(&mp->m_sb, XFS_BUF_TO_SBP(bp)); |
| - xfs_sb_quota_from_disk(&mp->m_sb); |
| + xfs_sb_from_disk(sbp, XFS_BUF_TO_SBP(bp)); |
| + xfs_sb_quota_from_disk(sbp); |
| + |
| + /* |
| + * If we haven't validated the superblock, do so now before we try |
| + * to check the sector size and reread the superblock appropriately. |
| + */ |
| + if (sbp->sb_magicnum != XFS_SB_MAGIC) { |
| + if (loud) |
| + xfs_warn(mp, "Invalid superblock magic number"); |
| + error = EINVAL; |
| + goto release_buf; |
| + } |
| |
| /* |
| * We must be able to do sector-sized and sector-aligned IO. |
| @@ -334,11 +345,11 @@ reread: |
| goto release_buf; |
| } |
| |
| - /* |
| - * Re-read the superblock so the buffer is correctly sized, |
| - * and properly verified. |
| - */ |
| if (buf_ops == NULL) { |
| + /* |
| + * Re-read the superblock so the buffer is correctly sized, |
| + * and properly verified. |
| + */ |
| xfs_buf_relse(bp); |
| sector_size = sbp->sb_sectsize; |
| buf_ops = loud ? &xfs_sb_buf_ops : &xfs_sb_quiet_buf_ops; |