Loading fs/xfs/linux-2.6/xfs_super.c +4 −2 Original line number Diff line number Diff line Loading @@ -590,8 +590,10 @@ linvfs_sync_super( int error; int flags = SYNC_FSDATA; if (wait) flags |= SYNC_WAIT; if (unlikely(sb->s_frozen == SB_FREEZE_WRITE)) flags = SYNC_QUIESCE; else flags = SYNC_FSDATA | (wait ? SYNC_WAIT : 0); VFS_SYNC(vfsp, flags, NULL, error); sb->s_dirt = 0; Loading fs/xfs/linux-2.6/xfs_vfs.h +1 −0 Original line number Diff line number Diff line Loading @@ -107,6 +107,7 @@ typedef enum { #define SYNC_FSDATA 0x0020 /* flush fs data (e.g. superblocks) */ #define SYNC_REFCACHE 0x0040 /* prune some of the nfs ref cache */ #define SYNC_REMOUNT 0x0080 /* remount readonly, no dummy LRs */ #define SYNC_QUIESCE 0x0100 /* quiesce fileystem for a snapshot */ typedef int (*vfs_mount_t)(bhv_desc_t *, struct xfs_mount_args *, struct cred *); Loading fs/xfs/xfs_vfsops.c +35 −25 Original line number Diff line number Diff line Loading @@ -612,29 +612,12 @@ xfs_unmount( return XFS_ERROR(error); } #define REMOUNT_READONLY_FLAGS (SYNC_REMOUNT|SYNC_ATTR|SYNC_WAIT) STATIC int xfs_mntupdate( bhv_desc_t *bdp, int *flags, struct xfs_mount_args *args) xfs_quiesce_fs( xfs_mount_t *mp) { struct vfs *vfsp = bhvtovfs(bdp); xfs_mount_t *mp = XFS_BHVTOM(bdp); int pincount, error; int count = 0; if (args->flags & XFSMNT_NOATIME) mp->m_flags |= XFS_MOUNT_NOATIME; else mp->m_flags &= ~XFS_MOUNT_NOATIME; int count = 0, pincount; if (!(vfsp->vfs_flag & VFS_RDONLY)) { VFS_SYNC(vfsp, SYNC_FSDATA|SYNC_BDFLUSH|SYNC_ATTR, NULL, error); } if (*flags & MS_RDONLY) { xfs_refcache_purge_mp(mp); xfs_flush_buftarg(mp->m_ddev_targp, 0); xfs_finish_reclaim_all(mp, 0); Loading @@ -647,7 +630,7 @@ xfs_mntupdate( * we can write the unmount record. */ do { VFS_SYNC(vfsp, REMOUNT_READONLY_FLAGS, NULL, error); xfs_syncsub(mp, SYNC_REMOUNT|SYNC_ATTR|SYNC_WAIT, 0, NULL); pincount = xfs_flush_buftarg(mp->m_ddev_targp, 1); if (!pincount) { delay(50); Loading @@ -655,6 +638,31 @@ xfs_mntupdate( } } while (count < 2); return 0; } STATIC int xfs_mntupdate( bhv_desc_t *bdp, int *flags, struct xfs_mount_args *args) { struct vfs *vfsp = bhvtovfs(bdp); xfs_mount_t *mp = XFS_BHVTOM(bdp); int error; if (args->flags & XFSMNT_NOATIME) mp->m_flags |= XFS_MOUNT_NOATIME; else mp->m_flags &= ~XFS_MOUNT_NOATIME; if (!(vfsp->vfs_flag & VFS_RDONLY)) { VFS_SYNC(vfsp, SYNC_FSDATA|SYNC_BDFLUSH|SYNC_ATTR, NULL, error); } if (*flags & MS_RDONLY) { xfs_quiesce_fs(mp); /* Ok now write out an unmount record */ xfs_log_unmount_write(mp); xfs_unmountfs_writesb(mp); Loading Loading @@ -869,10 +877,12 @@ xfs_sync( int flags, cred_t *credp) { xfs_mount_t *mp; xfs_mount_t *mp = XFS_BHVTOM(bdp); mp = XFS_BHVTOM(bdp); return (xfs_syncsub(mp, flags, 0, NULL)); if (unlikely(flags == SYNC_QUIESCE)) return xfs_quiesce_fs(mp); else return xfs_syncsub(mp, flags, 0, NULL); } /* Loading Loading
fs/xfs/linux-2.6/xfs_super.c +4 −2 Original line number Diff line number Diff line Loading @@ -590,8 +590,10 @@ linvfs_sync_super( int error; int flags = SYNC_FSDATA; if (wait) flags |= SYNC_WAIT; if (unlikely(sb->s_frozen == SB_FREEZE_WRITE)) flags = SYNC_QUIESCE; else flags = SYNC_FSDATA | (wait ? SYNC_WAIT : 0); VFS_SYNC(vfsp, flags, NULL, error); sb->s_dirt = 0; Loading
fs/xfs/linux-2.6/xfs_vfs.h +1 −0 Original line number Diff line number Diff line Loading @@ -107,6 +107,7 @@ typedef enum { #define SYNC_FSDATA 0x0020 /* flush fs data (e.g. superblocks) */ #define SYNC_REFCACHE 0x0040 /* prune some of the nfs ref cache */ #define SYNC_REMOUNT 0x0080 /* remount readonly, no dummy LRs */ #define SYNC_QUIESCE 0x0100 /* quiesce fileystem for a snapshot */ typedef int (*vfs_mount_t)(bhv_desc_t *, struct xfs_mount_args *, struct cred *); Loading
fs/xfs/xfs_vfsops.c +35 −25 Original line number Diff line number Diff line Loading @@ -612,29 +612,12 @@ xfs_unmount( return XFS_ERROR(error); } #define REMOUNT_READONLY_FLAGS (SYNC_REMOUNT|SYNC_ATTR|SYNC_WAIT) STATIC int xfs_mntupdate( bhv_desc_t *bdp, int *flags, struct xfs_mount_args *args) xfs_quiesce_fs( xfs_mount_t *mp) { struct vfs *vfsp = bhvtovfs(bdp); xfs_mount_t *mp = XFS_BHVTOM(bdp); int pincount, error; int count = 0; if (args->flags & XFSMNT_NOATIME) mp->m_flags |= XFS_MOUNT_NOATIME; else mp->m_flags &= ~XFS_MOUNT_NOATIME; int count = 0, pincount; if (!(vfsp->vfs_flag & VFS_RDONLY)) { VFS_SYNC(vfsp, SYNC_FSDATA|SYNC_BDFLUSH|SYNC_ATTR, NULL, error); } if (*flags & MS_RDONLY) { xfs_refcache_purge_mp(mp); xfs_flush_buftarg(mp->m_ddev_targp, 0); xfs_finish_reclaim_all(mp, 0); Loading @@ -647,7 +630,7 @@ xfs_mntupdate( * we can write the unmount record. */ do { VFS_SYNC(vfsp, REMOUNT_READONLY_FLAGS, NULL, error); xfs_syncsub(mp, SYNC_REMOUNT|SYNC_ATTR|SYNC_WAIT, 0, NULL); pincount = xfs_flush_buftarg(mp->m_ddev_targp, 1); if (!pincount) { delay(50); Loading @@ -655,6 +638,31 @@ xfs_mntupdate( } } while (count < 2); return 0; } STATIC int xfs_mntupdate( bhv_desc_t *bdp, int *flags, struct xfs_mount_args *args) { struct vfs *vfsp = bhvtovfs(bdp); xfs_mount_t *mp = XFS_BHVTOM(bdp); int error; if (args->flags & XFSMNT_NOATIME) mp->m_flags |= XFS_MOUNT_NOATIME; else mp->m_flags &= ~XFS_MOUNT_NOATIME; if (!(vfsp->vfs_flag & VFS_RDONLY)) { VFS_SYNC(vfsp, SYNC_FSDATA|SYNC_BDFLUSH|SYNC_ATTR, NULL, error); } if (*flags & MS_RDONLY) { xfs_quiesce_fs(mp); /* Ok now write out an unmount record */ xfs_log_unmount_write(mp); xfs_unmountfs_writesb(mp); Loading Loading @@ -869,10 +877,12 @@ xfs_sync( int flags, cred_t *credp) { xfs_mount_t *mp; xfs_mount_t *mp = XFS_BHVTOM(bdp); mp = XFS_BHVTOM(bdp); return (xfs_syncsub(mp, flags, 0, NULL)); if (unlikely(flags == SYNC_QUIESCE)) return xfs_quiesce_fs(mp); else return xfs_syncsub(mp, flags, 0, NULL); } /* Loading