diff options
-rw-r--r-- | fs/gfs2/file.c | 13 |
1 files changed, 8 insertions, 5 deletions
diff --git a/fs/gfs2/file.c b/fs/gfs2/file.c index 310f2fb6f7ea..76834587a8a4 100644 --- a/fs/gfs2/file.c +++ b/fs/gfs2/file.c | |||
@@ -676,6 +676,7 @@ static int fallocate_chunk(struct inode *inode, loff_t offset, loff_t len, | |||
676 | struct gfs2_inode *ip = GFS2_I(inode); | 676 | struct gfs2_inode *ip = GFS2_I(inode); |
677 | struct buffer_head *dibh; | 677 | struct buffer_head *dibh; |
678 | int error; | 678 | int error; |
679 | loff_t size = len; | ||
679 | unsigned int nr_blks; | 680 | unsigned int nr_blks; |
680 | sector_t lblock = offset >> inode->i_blkbits; | 681 | sector_t lblock = offset >> inode->i_blkbits; |
681 | 682 | ||
@@ -709,8 +710,8 @@ static int fallocate_chunk(struct inode *inode, loff_t offset, loff_t len, | |||
709 | goto out; | 710 | goto out; |
710 | } | 711 | } |
711 | } | 712 | } |
712 | if (offset + len > inode->i_size && !(mode & FALLOC_FL_KEEP_SIZE)) | 713 | if (offset + size > inode->i_size && !(mode & FALLOC_FL_KEEP_SIZE)) |
713 | i_size_write(inode, offset + len); | 714 | i_size_write(inode, offset + size); |
714 | 715 | ||
715 | mark_inode_dirty(inode); | 716 | mark_inode_dirty(inode); |
716 | 717 | ||
@@ -779,12 +780,14 @@ static long gfs2_fallocate(struct file *file, int mode, loff_t offset, | |||
779 | if (unlikely(error)) | 780 | if (unlikely(error)) |
780 | goto out_uninit; | 781 | goto out_uninit; |
781 | 782 | ||
782 | if (!gfs2_write_alloc_required(ip, offset, len)) | ||
783 | goto out_unlock; | ||
784 | |||
785 | while (len > 0) { | 783 | while (len > 0) { |
786 | if (len < bytes) | 784 | if (len < bytes) |
787 | bytes = len; | 785 | bytes = len; |
786 | if (!gfs2_write_alloc_required(ip, offset, bytes)) { | ||
787 | len -= bytes; | ||
788 | offset += bytes; | ||
789 | continue; | ||
790 | } | ||
788 | qa = gfs2_qadata_get(ip); | 791 | qa = gfs2_qadata_get(ip); |
789 | if (!qa) { | 792 | if (!qa) { |
790 | error = -ENOMEM; | 793 | error = -ENOMEM; |