xfs: Show realtime device stats on statfs calls if realtime flags set
authorRichard Wareing <rwareing@fb.com>
Mon, 8 Jan 2018 18:41:33 +0000 (10:41 -0800)
committerDarrick J. Wong <darrick.wong@oracle.com>
Mon, 8 Jan 2018 18:41:33 +0000 (10:41 -0800)
- Reports realtime device free blocks in statfs calls if (realtime)
  inheritance bit is set on the inode of directory, or realtime flag
  in the case of files.  This is a bit more intuitive, especially for
  use-cases which are using a much larger device for the realtime device.
- Add XFS_IS_REALTIME_MOUNT option to gate based on the existence of a
  realtime device on the mount, similar to the XFS_IS_REALTIME_INODE
  option.

Reviewed-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Dave Chinner <dchinner@redhat.com>
Signed-off-by: Richard Wareing <rwareing@fb.com>
Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>
Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
fs/xfs/xfs_linux.h
fs/xfs/xfs_super.c

index 99562ec..74d3576 100644 (file)
@@ -285,8 +285,10 @@ static inline uint64_t howmany_64(uint64_t x, uint32_t y)
 #define XFS_IS_REALTIME_INODE(ip)                      \
        (((ip)->i_d.di_flags & XFS_DIFLAG_REALTIME) &&  \
         (ip)->i_mount->m_rtdev_targp)
+#define XFS_IS_REALTIME_MOUNT(mp) ((mp)->m_rtdev_targp ? 1 : 0)
 #else
 #define XFS_IS_REALTIME_INODE(ip) (0)
+#define XFS_IS_REALTIME_MOUNT(mp) (0)
 #endif
 
 #endif /* __XFS_LINUX__ */
index 1dacccc..a663355 100644 (file)
@@ -1153,6 +1153,14 @@ xfs_fs_statfs(
            ((mp->m_qflags & (XFS_PQUOTA_ACCT|XFS_PQUOTA_ENFD))) ==
                              (XFS_PQUOTA_ACCT|XFS_PQUOTA_ENFD))
                xfs_qm_statvfs(ip, statp);
+
+       if (XFS_IS_REALTIME_MOUNT(mp) &&
+           (ip->i_d.di_flags & (XFS_DIFLAG_RTINHERIT | XFS_DIFLAG_REALTIME))) {
+               statp->f_blocks = sbp->sb_rblocks;
+               statp->f_bavail = statp->f_bfree =
+                       sbp->sb_frextents * sbp->sb_rextsize;
+       }
+
        return 0;
 }