[XFS] Provide a mechiansm for flushing delalloc before quota reporting.
authorNathan Scott <nathans@sgi.com>
Tue, 1 Nov 2005 23:32:38 +0000 (10:32 +1100)
committerNathan Scott <nathans@sgi.com>
Tue, 1 Nov 2005 23:32:38 +0000 (10:32 +1100)
SGI-PV: 942815
SGI-Modid: xfs-linux:xfs-kern:23829a

Signed-off-by: Nathan Scott <nathans@sgi.com>
fs/xfs/linux-2.6/xfs_fs_subr.c
fs/xfs/linux-2.6/xfs_super.c
fs/xfs/quota/xfs_qm_syscalls.c
fs/xfs/xfs_mount.h
fs/xfs/xfs_vfsops.c

index 05ebd30ec96f2fcf0181c8164f4745b41e94ea43..88134cba5cb0c20434921f2b0d32fd89de286c81 100644 (file)
@@ -117,6 +117,8 @@ fs_flush_pages(
 
        if (VN_CACHED(vp)) {
                filemap_fdatawrite(ip->i_mapping);
+               if (flags & XFS_B_ASYNC)
+                       return 0;
                filemap_fdatawait(ip->i_mapping);
        }
 
index d2701cc624b918a592ea9f10b6b2d2b2633465d1..fa87279405d85f5641b71b0b9b191480e13e2534 100644 (file)
@@ -766,6 +766,18 @@ linvfs_show_options(
        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,
@@ -934,6 +946,7 @@ STATIC struct super_operations linvfs_sops = {
 };
 
 STATIC struct quotactl_ops linvfs_qops = {
+       .quota_sync             = linvfs_quotasync,
        .get_xstate             = linvfs_getxstate,
        .set_xstate             = linvfs_setxstate,
        .get_xquota             = linvfs_getxquota,
index 4e397940b3a6889dad1549e2dc31bcd240c71d27..485f83d41191b9b2cfb3a7d047ba25fbc61a6ea3 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * 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
@@ -109,7 +109,7 @@ xfs_qm_quotactl(
        vfsp = bhvtovfs(bdp);
        mp = XFS_VFSTOM(vfsp);
 
-       ASSERT(addr != NULL);
+       ASSERT(addr != NULL || cmd == Q_XQUOTASYNC);
 
        /*
         * The following commands are valid even when quotaoff.
@@ -147,6 +147,9 @@ xfs_qm_quotactl(
                        return XFS_ERROR(EROFS);
                break;
 
+       case Q_XQUOTASYNC:
+               return (xfs_sync_inodes(mp, SYNC_DELWRI, 0, NULL));
+
        default:
                break;
        }
index bc55931ac74e93e3751e8f68fadf41791f1be70c..0653beecf93a08d4acc4d3b00b761cc471e20606 100644 (file)
@@ -556,6 +556,7 @@ extern int  xfs_readsb(xfs_mount_t *mp);
 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);
 
index 8238c7517822f2da54642d4d7b9c36c08b733da4..9142351df515c589d36612b936acc395bb0d9601 100644 (file)
@@ -903,7 +903,7 @@ xfs_sync(
  * only available by calling this routine.
  *
  */
-STATIC int
+int
 xfs_sync_inodes(
        xfs_mount_t     *mp,
        int             flags,
@@ -987,7 +987,7 @@ xfs_sync_inodes(
        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 */