diff options
Diffstat (limited to 'fs/xfs/xfs_vfsops.c')
-rw-r--r-- | fs/xfs/xfs_vfsops.c | 74 |
1 files changed, 37 insertions, 37 deletions
diff --git a/fs/xfs/xfs_vfsops.c b/fs/xfs/xfs_vfsops.c index b53736650100..42bcc0215203 100644 --- a/fs/xfs/xfs_vfsops.c +++ b/fs/xfs/xfs_vfsops.c | |||
@@ -368,16 +368,6 @@ xfs_finish_flags( | |||
368 | } | 368 | } |
369 | 369 | ||
370 | /* | 370 | /* |
371 | * disallow mount attempts with (IRIX) project quota enabled | ||
372 | */ | ||
373 | if (XFS_SB_VERSION_HASQUOTA(&mp->m_sb) && | ||
374 | (mp->m_sb.sb_qflags & XFS_PQUOTA_ACCT)) { | ||
375 | cmn_err(CE_WARN, | ||
376 | "XFS: cannot mount a filesystem with IRIX project quota enabled"); | ||
377 | return XFS_ERROR(ENOSYS); | ||
378 | } | ||
379 | |||
380 | /* | ||
381 | * check for shared mount. | 371 | * check for shared mount. |
382 | */ | 372 | */ |
383 | if (ap->flags & XFSMNT_SHARED) { | 373 | if (ap->flags & XFSMNT_SHARED) { |
@@ -622,7 +612,34 @@ out: | |||
622 | return XFS_ERROR(error); | 612 | return XFS_ERROR(error); |
623 | } | 613 | } |
624 | 614 | ||
625 | #define REMOUNT_READONLY_FLAGS (SYNC_REMOUNT|SYNC_ATTR|SYNC_WAIT) | 615 | STATIC int |
616 | xfs_quiesce_fs( | ||
617 | xfs_mount_t *mp) | ||
618 | { | ||
619 | int count = 0, pincount; | ||
620 | |||
621 | xfs_refcache_purge_mp(mp); | ||
622 | xfs_flush_buftarg(mp->m_ddev_targp, 0); | ||
623 | xfs_finish_reclaim_all(mp, 0); | ||
624 | |||
625 | /* This loop must run at least twice. | ||
626 | * The first instance of the loop will flush | ||
627 | * most meta data but that will generate more | ||
628 | * meta data (typically directory updates). | ||
629 | * Which then must be flushed and logged before | ||
630 | * we can write the unmount record. | ||
631 | */ | ||
632 | do { | ||
633 | xfs_syncsub(mp, SYNC_REMOUNT|SYNC_ATTR|SYNC_WAIT, 0, NULL); | ||
634 | pincount = xfs_flush_buftarg(mp->m_ddev_targp, 1); | ||
635 | if (!pincount) { | ||
636 | delay(50); | ||
637 | count++; | ||
638 | } | ||
639 | } while (count < 2); | ||
640 | |||
641 | return 0; | ||
642 | } | ||
626 | 643 | ||
627 | STATIC int | 644 | STATIC int |
628 | xfs_mntupdate( | 645 | xfs_mntupdate( |
@@ -632,8 +649,7 @@ xfs_mntupdate( | |||
632 | { | 649 | { |
633 | struct vfs *vfsp = bhvtovfs(bdp); | 650 | struct vfs *vfsp = bhvtovfs(bdp); |
634 | xfs_mount_t *mp = XFS_BHVTOM(bdp); | 651 | xfs_mount_t *mp = XFS_BHVTOM(bdp); |
635 | int pincount, error; | 652 | int error; |
636 | int count = 0; | ||
637 | 653 | ||
638 | if (args->flags & XFSMNT_NOATIME) | 654 | if (args->flags & XFSMNT_NOATIME) |
639 | mp->m_flags |= XFS_MOUNT_NOATIME; | 655 | mp->m_flags |= XFS_MOUNT_NOATIME; |
@@ -645,25 +661,7 @@ xfs_mntupdate( | |||
645 | } | 661 | } |
646 | 662 | ||
647 | if (*flags & MS_RDONLY) { | 663 | if (*flags & MS_RDONLY) { |
648 | xfs_refcache_purge_mp(mp); | 664 | xfs_quiesce_fs(mp); |
649 | xfs_flush_buftarg(mp->m_ddev_targp, 0); | ||
650 | xfs_finish_reclaim_all(mp, 0); | ||
651 | |||
652 | /* This loop must run at least twice. | ||
653 | * The first instance of the loop will flush | ||
654 | * most meta data but that will generate more | ||
655 | * meta data (typically directory updates). | ||
656 | * Which then must be flushed and logged before | ||
657 | * we can write the unmount record. | ||
658 | */ | ||
659 | do { | ||
660 | VFS_SYNC(vfsp, REMOUNT_READONLY_FLAGS, NULL, error); | ||
661 | pincount = xfs_flush_buftarg(mp->m_ddev_targp, 1); | ||
662 | if (!pincount) { | ||
663 | delay(50); | ||
664 | count++; | ||
665 | } | ||
666 | } while (count < 2); | ||
667 | 665 | ||
668 | /* Ok now write out an unmount record */ | 666 | /* Ok now write out an unmount record */ |
669 | xfs_log_unmount_write(mp); | 667 | xfs_log_unmount_write(mp); |
@@ -879,10 +877,12 @@ xfs_sync( | |||
879 | int flags, | 877 | int flags, |
880 | cred_t *credp) | 878 | cred_t *credp) |
881 | { | 879 | { |
882 | xfs_mount_t *mp; | 880 | xfs_mount_t *mp = XFS_BHVTOM(bdp); |
883 | 881 | ||
884 | mp = XFS_BHVTOM(bdp); | 882 | if (unlikely(flags == SYNC_QUIESCE)) |
885 | return (xfs_syncsub(mp, flags, 0, NULL)); | 883 | return xfs_quiesce_fs(mp); |
884 | else | ||
885 | return xfs_syncsub(mp, flags, 0, NULL); | ||
886 | } | 886 | } |
887 | 887 | ||
888 | /* | 888 | /* |
@@ -1681,7 +1681,7 @@ suffix_strtoul(const char *cp, char **endp, unsigned int base) | |||
1681 | return simple_strtoul(cp, endp, base) << shift_left_factor; | 1681 | return simple_strtoul(cp, endp, base) << shift_left_factor; |
1682 | } | 1682 | } |
1683 | 1683 | ||
1684 | int | 1684 | STATIC int |
1685 | xfs_parseargs( | 1685 | xfs_parseargs( |
1686 | struct bhv_desc *bhv, | 1686 | struct bhv_desc *bhv, |
1687 | char *options, | 1687 | char *options, |
@@ -1867,7 +1867,7 @@ printk("XFS: irixsgid is now a sysctl(2) variable, option is deprecated.\n"); | |||
1867 | return 0; | 1867 | return 0; |
1868 | } | 1868 | } |
1869 | 1869 | ||
1870 | int | 1870 | STATIC int |
1871 | xfs_showargs( | 1871 | xfs_showargs( |
1872 | struct bhv_desc *bhv, | 1872 | struct bhv_desc *bhv, |
1873 | struct seq_file *m) | 1873 | struct seq_file *m) |