diff options
Diffstat (limited to 'fs')
-rw-r--r-- | fs/gfs2/file.c | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/fs/gfs2/file.c b/fs/gfs2/file.c index 23eab473f09d..a9f5cbe45cd9 100644 --- a/fs/gfs2/file.c +++ b/fs/gfs2/file.c | |||
@@ -816,6 +816,7 @@ static long gfs2_fallocate(struct file *file, int mode, loff_t offset, | |||
816 | loff_t bytes, max_bytes; | 816 | loff_t bytes, max_bytes; |
817 | struct gfs2_alloc *al; | 817 | struct gfs2_alloc *al; |
818 | int error; | 818 | int error; |
819 | loff_t bsize_mask = ~((loff_t)sdp->sd_sb.sb_bsize - 1); | ||
819 | loff_t next = (offset + len - 1) >> sdp->sd_sb.sb_bsize_shift; | 820 | loff_t next = (offset + len - 1) >> sdp->sd_sb.sb_bsize_shift; |
820 | next = (next + 1) << sdp->sd_sb.sb_bsize_shift; | 821 | next = (next + 1) << sdp->sd_sb.sb_bsize_shift; |
821 | 822 | ||
@@ -823,13 +824,15 @@ static long gfs2_fallocate(struct file *file, int mode, loff_t offset, | |||
823 | if (mode & ~FALLOC_FL_KEEP_SIZE) | 824 | if (mode & ~FALLOC_FL_KEEP_SIZE) |
824 | return -EOPNOTSUPP; | 825 | return -EOPNOTSUPP; |
825 | 826 | ||
826 | offset = (offset >> sdp->sd_sb.sb_bsize_shift) << | 827 | offset &= bsize_mask; |
827 | sdp->sd_sb.sb_bsize_shift; | ||
828 | 828 | ||
829 | len = next - offset; | 829 | len = next - offset; |
830 | bytes = sdp->sd_max_rg_data * sdp->sd_sb.sb_bsize / 2; | 830 | bytes = sdp->sd_max_rg_data * sdp->sd_sb.sb_bsize / 2; |
831 | if (!bytes) | 831 | if (!bytes) |
832 | bytes = UINT_MAX; | 832 | bytes = UINT_MAX; |
833 | bytes &= bsize_mask; | ||
834 | if (bytes == 0) | ||
835 | bytes = sdp->sd_sb.sb_bsize; | ||
833 | 836 | ||
834 | gfs2_holder_init(ip->i_gl, LM_ST_EXCLUSIVE, 0, &ip->i_gh); | 837 | gfs2_holder_init(ip->i_gl, LM_ST_EXCLUSIVE, 0, &ip->i_gh); |
835 | error = gfs2_glock_nq(&ip->i_gh); | 838 | error = gfs2_glock_nq(&ip->i_gh); |
@@ -860,6 +863,9 @@ retry: | |||
860 | if (error) { | 863 | if (error) { |
861 | if (error == -ENOSPC && bytes > sdp->sd_sb.sb_bsize) { | 864 | if (error == -ENOSPC && bytes > sdp->sd_sb.sb_bsize) { |
862 | bytes >>= 1; | 865 | bytes >>= 1; |
866 | bytes &= bsize_mask; | ||
867 | if (bytes == 0) | ||
868 | bytes = sdp->sd_sb.sb_bsize; | ||
863 | goto retry; | 869 | goto retry; |
864 | } | 870 | } |
865 | goto out_qunlock; | 871 | goto out_qunlock; |