diff options
author | Amar Tumballi <amarts@redhat.com> | 2012-07-05 08:45:52 +0530 |
---|---|---|
committer | Anand Avati <avati@redhat.com> | 2012-07-11 22:25:52 -0700 |
commit | b1a5fa55695f497952264e35a9c8eb2bbf1ec4c3 (patch) | |
tree | 59c0b2e5cbdf7f4c97f3487c9e5e4ef99bca9763 /libglusterfs/src | |
parent | f671ce6c6fa619b5cea2559495b4b21920f5de73 (diff) |
core: check for pre-allocated blocks in backend fs, fix it.
There is a possibility that the backend FS (like XFS) can
allocate blocks beyond EOF for better performance reasons, which
results in 'st_blocks' with higher values than what is consumed by
the file descriptor. This would break few logic inside GlusterFS,
like quota behavior etc, thus we need the exact number of blocks
which are consumed by the file to the higher layers inside GlusterFS.
Currently, this logic won't work for sparse files (ie, file with holes)
Change-Id: Ied216733a8862e84f7da8386ae0a144f3f5cd5f2
BUG: 817343
Signed-off-by: Amar Tumballi <amarts@redhat.com>
Reviewed-on: http://review.gluster.com/3631
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Jeff Darcy <jdarcy@redhat.com>
Reviewed-by: Raghavendra Bhat <raghavendra@redhat.com>
Reviewed-by: Anand Avati <avati@redhat.com>
Diffstat (limited to 'libglusterfs/src')
-rw-r--r-- | libglusterfs/src/iatt.h | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/libglusterfs/src/iatt.h b/libglusterfs/src/iatt.h index eb916ad5edc..60ae5904703 100644 --- a/libglusterfs/src/iatt.h +++ b/libglusterfs/src/iatt.h @@ -265,6 +265,24 @@ iatt_from_stat (struct iatt *iatt, struct stat *stat) iatt->ia_blksize = stat->st_blksize; iatt->ia_blocks = stat->st_blocks; + /* There is a possibility that the backend FS (like XFS) can + allocate blocks beyond EOF for better performance reasons, which + results in 'st_blocks' with higher values than what is consumed by + the file descriptor. This would break few logic inside GlusterFS, + like quota behavior etc, thus we need the exact number of blocks + which are consumed by the file to the higher layers inside GlusterFS. + Currently, this logic won't work for sparse files (ie, file with + holes) + */ + { + uint64_t maxblocks; + + maxblocks = (iatt->ia_size + 511) / 512; + + if (iatt->ia_blocks > maxblocks) + iatt->ia_blocks = maxblocks; + } + iatt->ia_atime = stat->st_atime; iatt->ia_atime_nsec = ST_ATIM_NSEC (stat); |