linux-fsdevel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v2 3/5] fat: zero out seek range on _fat_get_block
@ 2013-11-17 11:38 Namjae Jeon
  2013-12-01 12:49 ` OGAWA Hirofumi
  0 siblings, 1 reply; 3+ messages in thread
From: Namjae Jeon @ 2013-11-17 11:38 UTC (permalink / raw)
  To: hirofumi, akpm
  Cc: linux-fsdevel, linux-kernel, Namjae Jeon, Namjae Jeon,
	Amit Sahrawat

From: Namjae Jeon <namjae.jeon@samsung.com>

For normal buffered write operations, normally if we try to write to an
offset > than file size, it does a cont_expand_zero till that offset.
Now, in case of fallocated regions, since the blocks are already allocated.
So, make it zero out that buffers for those blocks till the seek'ed offset.

Signed-off-by: Namjae Jeon <namjae.jeon@samsung.com>
Signed-off-by: Amit Sahrawat <a.sahrawat@samsung.com>
---
 fs/fat/cache.c |    3 ++-
 fs/fat/inode.c |   15 +++++++++++++--
 2 files changed, 15 insertions(+), 3 deletions(-)

diff --git a/fs/fat/cache.c b/fs/fat/cache.c
index a132666..c56bd7e 100644
--- a/fs/fat/cache.c
+++ b/fs/fat/cache.c
@@ -334,7 +334,8 @@ int fat_bmap(struct inode *inode, sector_t sector, sector_t *phys,
 		 */
 		last_block = (MSDOS_I(inode)->i_disksize + (blocksize - 1))
 			>> blocksize_bits;
-		if (sector >= last_block)
+		if (sector >= last_block &&
+		    MSDOS_I(inode)->mmu_private == MSDOS_I(inode)->i_disksize)
 			return 0;
 	}
 
diff --git a/fs/fat/inode.c b/fs/fat/inode.c
index 655dcc7..12a37a9 100644
--- a/fs/fat/inode.c
+++ b/fs/fat/inode.c
@@ -61,15 +61,26 @@ static inline int __fat_get_block(struct inode *inode, sector_t iblock,
 	struct super_block *sb = inode->i_sb;
 	struct msdos_sb_info *sbi = MSDOS_SB(sb);
 	unsigned long mapped_blocks;
-	sector_t phys;
+	sector_t phys, last_block, disk_block;
 	int err, offset;
+	const unsigned long blocksize = sb->s_blocksize;
+	const unsigned char blocksize_bits = sb->s_blocksize_bits;
 
 	err = fat_bmap(inode, iblock, &phys, &mapped_blocks, create);
 	if (err)
 		return err;
 	if (phys) {
-		map_bh(bh_result, sb, phys);
 		*max_blocks = min(mapped_blocks, *max_blocks);
+		last_block = (MSDOS_I(inode)->mmu_private + (blocksize - 1))
+			>> blocksize_bits;
+		disk_block = (MSDOS_I(inode)->i_disksize + (blocksize - 1))
+			>> blocksize_bits;
+		if (iblock >= last_block && iblock <= disk_block) {
+			MSDOS_I(inode)->mmu_private +=
+				*max_blocks << blocksize_bits;
+			set_buffer_new(bh_result);
+		}
+		map_bh(bh_result, sb, phys);
 		return 0;
 	}
 	if (!create)
-- 
1.7.9.5


^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [PATCH v2 3/5] fat: zero out seek range on _fat_get_block
  2013-11-17 11:38 [PATCH v2 3/5] fat: zero out seek range on _fat_get_block Namjae Jeon
@ 2013-12-01 12:49 ` OGAWA Hirofumi
  2013-12-05 14:15   ` Namjae Jeon
  0 siblings, 1 reply; 3+ messages in thread
From: OGAWA Hirofumi @ 2013-12-01 12:49 UTC (permalink / raw)
  To: Namjae Jeon; +Cc: akpm, linux-fsdevel, linux-kernel, Namjae Jeon, Amit Sahrawat

Namjae Jeon <linkinjeon@gmail.com> writes:

> --- a/fs/fat/cache.c
> +++ b/fs/fat/cache.c
> @@ -334,7 +334,8 @@ int fat_bmap(struct inode *inode, sector_t sector, sector_t *phys,
>  		 */
>  		last_block = (MSDOS_I(inode)->i_disksize + (blocksize - 1))
>  			>> blocksize_bits;
> -		if (sector >= last_block)
> +		if (sector >= last_block &&
> +		    MSDOS_I(inode)->mmu_private == MSDOS_I(inode)->i_disksize)
>  			return 0;

This is strange check. Why do we want to map even if "sector > ->i_disksize"
(when ->mmu_private != ->i_disksize)?


Another point, for ->bmap(), maybe we will need new flag to read beyond
->i_size? Because ->bmap() returns physical address even if > ->i_size.

> diff --git a/fs/fat/inode.c b/fs/fat/inode.c
> index 655dcc7..12a37a9 100644
> --- a/fs/fat/inode.c
> +++ b/fs/fat/inode.c
> @@ -61,15 +61,26 @@ static inline int __fat_get_block(struct inode *inode, sector_t iblock,
>  	struct super_block *sb = inode->i_sb;
>  	struct msdos_sb_info *sbi = MSDOS_SB(sb);
>  	unsigned long mapped_blocks;
> -	sector_t phys;
> +	sector_t phys, last_block, disk_block;
>  	int err, offset;
> +	const unsigned long blocksize = sb->s_blocksize;
> +	const unsigned char blocksize_bits = sb->s_blocksize_bits;
>  
>  	err = fat_bmap(inode, iblock, &phys, &mapped_blocks, create);
>  	if (err)
>  		return err;
>  	if (phys) {
> -		map_bh(bh_result, sb, phys);
>  		*max_blocks = min(mapped_blocks, *max_blocks);
> +		last_block = (MSDOS_I(inode)->mmu_private + (blocksize - 1))
> +			>> blocksize_bits;
> +		disk_block = (MSDOS_I(inode)->i_disksize + (blocksize - 1))
> +			>> blocksize_bits;
> +		if (iblock >= last_block && iblock <= disk_block) {
> +			MSDOS_I(inode)->mmu_private +=
> +				*max_blocks << blocksize_bits;
> +			set_buffer_new(bh_result);
> +		}
> +		map_bh(bh_result, sb, phys);
>  		return 0;
>  	}
>  	if (!create)

Let's give the name for this operation for readability, and make it
static function. With this, I think this one much readable.

static void check_fallocate_region()
{
	/* code here */
}
-- 
OGAWA Hirofumi <hirofumi@mail.parknet.co.jp>

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH v2 3/5] fat: zero out seek range on _fat_get_block
  2013-12-01 12:49 ` OGAWA Hirofumi
@ 2013-12-05 14:15   ` Namjae Jeon
  0 siblings, 0 replies; 3+ messages in thread
From: Namjae Jeon @ 2013-12-05 14:15 UTC (permalink / raw)
  To: OGAWA Hirofumi
  Cc: akpm, linux-fsdevel, linux-kernel, Namjae Jeon, Amit Sahrawat

2013/12/1, OGAWA Hirofumi <hirofumi@mail.parknet.co.jp>:
> Namjae Jeon <linkinjeon@gmail.com> writes:
>
>> --- a/fs/fat/cache.c
>> +++ b/fs/fat/cache.c
>> @@ -334,7 +334,8 @@ int fat_bmap(struct inode *inode, sector_t sector,
>> sector_t *phys,
>>  		 */
>>  		last_block = (MSDOS_I(inode)->i_disksize + (blocksize - 1))
>>  			>> blocksize_bits;
>> -		if (sector >= last_block)
>> +		if (sector >= last_block &&
>> +		    MSDOS_I(inode)->mmu_private == MSDOS_I(inode)->i_disksize)
>>  			return 0;
>
> This is strange check. Why do we want to map even if "sector >
> ->i_disksize"
> (when ->mmu_private != ->i_disksize)?
Yes, Don't want it. I will fix it.
>
>
> Another point, for ->bmap(), maybe we will need new flag to read beyond
> ->i_size? Because ->bmap() returns physical address even if > ->i_size.
Okay, I will change it as your comment.
>
>> diff --git a/fs/fat/inode.c b/fs/fat/inode.c
>> index 655dcc7..12a37a9 100644
>> --- a/fs/fat/inode.c
>> +++ b/fs/fat/inode.c
>> @@ -61,15 +61,26 @@ static inline int __fat_get_block(struct inode *inode,
>> sector_t iblock,
>>  	struct super_block *sb = inode->i_sb;
>>  	struct msdos_sb_info *sbi = MSDOS_SB(sb);
>>  	unsigned long mapped_blocks;
>> -	sector_t phys;
>> +	sector_t phys, last_block, disk_block;
>>  	int err, offset;
>> +	const unsigned long blocksize = sb->s_blocksize;
>> +	const unsigned char blocksize_bits = sb->s_blocksize_bits;
>>
>>  	err = fat_bmap(inode, iblock, &phys, &mapped_blocks, create);
>>  	if (err)
>>  		return err;
>>  	if (phys) {
>> -		map_bh(bh_result, sb, phys);
>>  		*max_blocks = min(mapped_blocks, *max_blocks);
>> +		last_block = (MSDOS_I(inode)->mmu_private + (blocksize - 1))
>> +			>> blocksize_bits;
>> +		disk_block = (MSDOS_I(inode)->i_disksize + (blocksize - 1))
>> +			>> blocksize_bits;
>> +		if (iblock >= last_block && iblock <= disk_block) {
>> +			MSDOS_I(inode)->mmu_private +=
>> +				*max_blocks << blocksize_bits;
>> +			set_buffer_new(bh_result);
>> +		}
>> +		map_bh(bh_result, sb, phys);
>>  		return 0;
>>  	}
>>  	if (!create)
>
> Let's give the name for this operation for readability, and make it
> static function. With this, I think this one much readable.
>
> static void check_fallocate_region()
> {
> 	/* code here */
> }
Okay, I will make it.
Thanks for review.
> --
> OGAWA Hirofumi <hirofumi@mail.parknet.co.jp>
>

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2013-12-05 14:15 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-11-17 11:38 [PATCH v2 3/5] fat: zero out seek range on _fat_get_block Namjae Jeon
2013-12-01 12:49 ` OGAWA Hirofumi
2013-12-05 14:15   ` Namjae Jeon

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).