if (VN_CACHED(vp)) {
                filemap_fdatawrite(ip->i_mapping);
+               if (flags & XFS_B_ASYNC)
+                       return 0;
                filemap_fdatawait(ip->i_mapping);
        }
 
 
        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
 linvfs_getxstate(
        struct super_block      *sb,
 };
 
 STATIC struct quotactl_ops linvfs_qops = {
+       .quota_sync             = linvfs_quotasync,
        .get_xstate             = linvfs_getxstate,
        .set_xstate             = linvfs_setxstate,
        .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
  * under the terms of version 2 of the GNU General Public License as
        vfsp = bhvtovfs(bdp);
        mp = XFS_VFSTOM(vfsp);
 
-       ASSERT(addr != NULL);
+       ASSERT(addr != NULL || cmd == Q_XQUOTASYNC);
 
        /*
         * The following commands are valid even when quotaoff.
                        return XFS_ERROR(EROFS);
                break;
 
+       case Q_XQUOTASYNC:
+               return (xfs_sync_inodes(mp, SYNC_DELWRI, 0, NULL));
+
        default:
                break;
        }
 
 extern void    xfs_freesb(xfs_mount_t *);
 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_sync_inodes(xfs_mount_t *, int, int, int *);
 extern xfs_agnumber_t  xfs_initialize_perag(xfs_mount_t *, xfs_agnumber_t);
 extern void    xfs_xlatesb(void *, struct xfs_sb *, int, __int64_t);
 
 
  * only available by calling this routine.
  *
  */
-STATIC int
+int
 xfs_sync_inodes(
        xfs_mount_t     *mp,
        int             flags,
        ipointer = (xfs_iptr_t *)kmem_zalloc(sizeof(xfs_iptr_t), KM_SLEEP);
 
        fflag = XFS_B_ASYNC;            /* default is don't wait */
-       if (flags & SYNC_BDFLUSH)
+       if (flags & (SYNC_BDFLUSH | SYNC_DELWRI))
                fflag = XFS_B_DELWRI;
        if (flags & SYNC_WAIT)
                fflag = 0;              /* synchronous overrides all */