On 2018年07月11日 21:08, Carlos Maiolino wrote:
On Fri, Jul 06, 2018 at 11:12:28AM +0800, Shan Hai wrote:
Return non-zero blocks for inline data even though the inode has
no external blocks, otherwise the "ls -ls" would show zero blocks
occupied by the file.
Is there any issue you ran into while leaving inodes with zero blocks allocated?
Inodes should actually report the real amount of allocated blocks, not fake it.
Inodes with inlined data should actually report 0 blocks, otherwise, many
applications which actually relies on the amount of allocated blocks for each
file will misbehave.
Man ls(1) reads:
-s, --size
print the allocated size of each file, in blocks
So the 'ls -ls' would report 0 blocks when the data is inlined, a file
holds data
but it consumes 0 blocks, how is it possible :), this patch fixes this
problem.
Thanks
Shan Hai
Signed-off-by: Shan Hai <shan.hai@xxxxxxxxxx>
---
fs/xfs/xfs_iops.c | 8 +++++++-
1 file changed, 7 insertions(+), 1 deletion(-)
diff --git a/fs/xfs/xfs_iops.c b/fs/xfs/xfs_iops.c
index 0fa29f39d658..63be1355a473 100644
--- a/fs/xfs/xfs_iops.c
+++ b/fs/xfs/xfs_iops.c
@@ -500,8 +500,14 @@ xfs_vn_getattr(
stat->atime = inode->i_atime;
stat->mtime = inode->i_mtime;
stat->ctime = inode->i_ctime;
- stat->blocks =
+
+ if (xfs_sb_version_hasinlinedata(&mp->m_sb) &&
+ XFS_IFORK_FORMAT(ip, XFS_DATA_FORK) == XFS_DINODE_FMT_LOCAL) {
+ stat->blocks = BTOBB(XFS_ISIZE(ip));
+ } else {
+ stat->blocks =
XFS_FSB_TO_BB(mp, ip->i_d.di_nblocks + ip->i_delayed_blks);
+ }
if (ip->i_d.di_version == 3) {
if (request_mask & STATX_BTIME) {
--
2.11.0
--
To unsubscribe from this list: send the line "unsubscribe linux-xfs" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
--
To unsubscribe from this list: send the line "unsubscribe linux-xfs" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html