Commit ee34807a authored by Nathan Scott's avatar Nathan Scott

[XFS] Provide a mechiansm for flushing delalloc before quota reporting.

SGI-PV: 942815
SGI-Modid: xfs-linux:xfs-kern:23829a
Signed-off-by: default avatarNathan Scott <nathans@sgi.com>
parent c310ab6c
...@@ -117,6 +117,8 @@ fs_flush_pages( ...@@ -117,6 +117,8 @@ fs_flush_pages(
if (VN_CACHED(vp)) { if (VN_CACHED(vp)) {
filemap_fdatawrite(ip->i_mapping); filemap_fdatawrite(ip->i_mapping);
if (flags & XFS_B_ASYNC)
return 0;
filemap_fdatawait(ip->i_mapping); filemap_fdatawait(ip->i_mapping);
} }
......
...@@ -766,6 +766,18 @@ linvfs_show_options( ...@@ -766,6 +766,18 @@ linvfs_show_options(
return error; return error;
} }
STATIC int
linvfs_quotasync(
struct super_block *sb,
int type)
{
struct vfs *vfsp = LINVFS_GET_VFS(sb);
int error;
VFS_QUOTACTL(vfsp, Q_XQUOTASYNC, 0, (caddr_t)NULL, error);
return -error;
}
STATIC int STATIC int
linvfs_getxstate( linvfs_getxstate(
struct super_block *sb, struct super_block *sb,
...@@ -934,6 +946,7 @@ STATIC struct super_operations linvfs_sops = { ...@@ -934,6 +946,7 @@ STATIC struct super_operations linvfs_sops = {
}; };
STATIC struct quotactl_ops linvfs_qops = { STATIC struct quotactl_ops linvfs_qops = {
.quota_sync = linvfs_quotasync,
.get_xstate = linvfs_getxstate, .get_xstate = linvfs_getxstate,
.set_xstate = linvfs_setxstate, .set_xstate = linvfs_setxstate,
.get_xquota = linvfs_getxquota, .get_xquota = linvfs_getxquota,
......
/* /*
* Copyright (c) 2000-2003 Silicon Graphics, Inc. All Rights Reserved. * Copyright (c) 2000-2005 Silicon Graphics, Inc. All Rights Reserved.
* *
* This program is free software; you can redistribute it and/or modify it * This program is free software; you can redistribute it and/or modify it
* under the terms of version 2 of the GNU General Public License as * under the terms of version 2 of the GNU General Public License as
...@@ -109,7 +109,7 @@ xfs_qm_quotactl( ...@@ -109,7 +109,7 @@ xfs_qm_quotactl(
vfsp = bhvtovfs(bdp); vfsp = bhvtovfs(bdp);
mp = XFS_VFSTOM(vfsp); mp = XFS_VFSTOM(vfsp);
ASSERT(addr != NULL); ASSERT(addr != NULL || cmd == Q_XQUOTASYNC);
/* /*
* The following commands are valid even when quotaoff. * The following commands are valid even when quotaoff.
...@@ -147,6 +147,9 @@ xfs_qm_quotactl( ...@@ -147,6 +147,9 @@ xfs_qm_quotactl(
return XFS_ERROR(EROFS); return XFS_ERROR(EROFS);
break; break;
case Q_XQUOTASYNC:
return (xfs_sync_inodes(mp, SYNC_DELWRI, 0, NULL));
default: default:
break; break;
} }
......
...@@ -556,6 +556,7 @@ extern int xfs_readsb(xfs_mount_t *mp); ...@@ -556,6 +556,7 @@ extern int xfs_readsb(xfs_mount_t *mp);
extern void xfs_freesb(xfs_mount_t *); extern void xfs_freesb(xfs_mount_t *);
extern void xfs_do_force_shutdown(bhv_desc_t *, int, char *, int); extern void xfs_do_force_shutdown(bhv_desc_t *, int, char *, int);
extern int xfs_syncsub(xfs_mount_t *, int, int, int *); extern int xfs_syncsub(xfs_mount_t *, int, int, int *);
extern int xfs_sync_inodes(xfs_mount_t *, int, int, int *);
extern xfs_agnumber_t xfs_initialize_perag(xfs_mount_t *, xfs_agnumber_t); extern xfs_agnumber_t xfs_initialize_perag(xfs_mount_t *, xfs_agnumber_t);
extern void xfs_xlatesb(void *, struct xfs_sb *, int, __int64_t); extern void xfs_xlatesb(void *, struct xfs_sb *, int, __int64_t);
......
...@@ -903,7 +903,7 @@ xfs_sync( ...@@ -903,7 +903,7 @@ xfs_sync(
* only available by calling this routine. * only available by calling this routine.
* *
*/ */
STATIC int int
xfs_sync_inodes( xfs_sync_inodes(
xfs_mount_t *mp, xfs_mount_t *mp,
int flags, int flags,
...@@ -987,7 +987,7 @@ xfs_sync_inodes( ...@@ -987,7 +987,7 @@ xfs_sync_inodes(
ipointer = (xfs_iptr_t *)kmem_zalloc(sizeof(xfs_iptr_t), KM_SLEEP); ipointer = (xfs_iptr_t *)kmem_zalloc(sizeof(xfs_iptr_t), KM_SLEEP);
fflag = XFS_B_ASYNC; /* default is don't wait */ fflag = XFS_B_ASYNC; /* default is don't wait */
if (flags & SYNC_BDFLUSH) if (flags & (SYNC_BDFLUSH | SYNC_DELWRI))
fflag = XFS_B_DELWRI; fflag = XFS_B_DELWRI;
if (flags & SYNC_WAIT) if (flags & SYNC_WAIT)
fflag = 0; /* synchronous overrides all */ fflag = 0; /* synchronous overrides all */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment