diff options
Diffstat (limited to 'fs/xfs/xfs_vfsops.c')
| -rw-r--r-- | fs/xfs/xfs_vfsops.c | 27 |
1 files changed, 9 insertions, 18 deletions
diff --git a/fs/xfs/xfs_vfsops.c b/fs/xfs/xfs_vfsops.c index f0e09ca14139..36ea1b2094f2 100644 --- a/fs/xfs/xfs_vfsops.c +++ b/fs/xfs/xfs_vfsops.c | |||
| @@ -669,31 +669,22 @@ xfs_mntupdate( | |||
| 669 | xfs_mount_t *mp = XFS_BHVTOM(bdp); | 669 | xfs_mount_t *mp = XFS_BHVTOM(bdp); |
| 670 | int error; | 670 | int error; |
| 671 | 671 | ||
| 672 | if (args->flags & XFSMNT_BARRIER) | 672 | if (!(*flags & MS_RDONLY)) { /* rw/ro -> rw */ |
| 673 | mp->m_flags |= XFS_MOUNT_BARRIER; | 673 | if (vfsp->vfs_flag & VFS_RDONLY) |
| 674 | else | 674 | vfsp->vfs_flag &= ~VFS_RDONLY; |
| 675 | mp->m_flags &= ~XFS_MOUNT_BARRIER; | 675 | if (args->flags & XFSMNT_BARRIER) { |
| 676 | 676 | mp->m_flags |= XFS_MOUNT_BARRIER; | |
| 677 | if ((vfsp->vfs_flag & VFS_RDONLY) && | ||
| 678 | !(*flags & MS_RDONLY)) { | ||
| 679 | vfsp->vfs_flag &= ~VFS_RDONLY; | ||
| 680 | |||
| 681 | if (args->flags & XFSMNT_BARRIER) | ||
| 682 | xfs_mountfs_check_barriers(mp); | 677 | xfs_mountfs_check_barriers(mp); |
| 683 | } | 678 | } else { |
| 684 | 679 | mp->m_flags &= ~XFS_MOUNT_BARRIER; | |
| 685 | if (!(vfsp->vfs_flag & VFS_RDONLY) && | 680 | } |
| 686 | (*flags & MS_RDONLY)) { | 681 | } else if (!(vfsp->vfs_flag & VFS_RDONLY)) { /* rw -> ro */ |
| 687 | VFS_SYNC(vfsp, SYNC_FSDATA|SYNC_BDFLUSH|SYNC_ATTR, NULL, error); | 682 | VFS_SYNC(vfsp, SYNC_FSDATA|SYNC_BDFLUSH|SYNC_ATTR, NULL, error); |
| 688 | |||
| 689 | xfs_quiesce_fs(mp); | 683 | xfs_quiesce_fs(mp); |
| 690 | |||
| 691 | /* Ok now write out an unmount record */ | ||
| 692 | xfs_log_unmount_write(mp); | 684 | xfs_log_unmount_write(mp); |
| 693 | xfs_unmountfs_writesb(mp); | 685 | xfs_unmountfs_writesb(mp); |
| 694 | vfsp->vfs_flag |= VFS_RDONLY; | 686 | vfsp->vfs_flag |= VFS_RDONLY; |
| 695 | } | 687 | } |
| 696 | |||
| 697 | return 0; | 688 | return 0; |
| 698 | } | 689 | } |
| 699 | 690 | ||
