mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: "Namjae Jeon" <namjae.jeon@samsung.com>
To: "'Christoph Hellwig'" <hch@lst.de>
Cc: <linux-kernel@vger.kernel.org>, <linux-fsdevel@vger.kernel.org>,
	<gregkh@linuxfoundation.org>, <valdis.kletnieks@vt.edu>,
	<sj1557.seo@samsung.com>, <linkinjeon@gmail.com>,
	<pali.rohar@gmail.com>
Subject: RE: [PATCH v9 03/13] exfat: add inode operations
Date: Fri, 10 Jan 2020 08:23:23 +0900	[thread overview]
Message-ID: <001801d5c743$c9c058e0$5d410aa0$@samsung.com> (raw)
In-Reply-To: <20200108175044.GA14009@lst.de>

> > +#include "exfat_fs.h"
> > +
> > +/* 2-level option flag */
> > +enum {
> > +	BMAP_NOT_CREATE,
> > +	BMAP_ADD_CLUSTER,
> > +};
> 
> I looked at how this flag is used and found the get_block code a little
> confusing.  Let me know what you think of the following untested patch to
> streamline that area:
I will check and test this patch.

Thanks!

> 
> 
> diff --git a/fs/exfat/inode.c b/fs/exfat/inode.c index
> c2b04537cb24..ccf9700c6a55 100644
> --- a/fs/exfat/inode.c
> +++ b/fs/exfat/inode.c
> @@ -17,12 +17,6 @@
>  #include "exfat_raw.h"
>  #include "exfat_fs.h"
> 
> -/* 2-level option flag */
> -enum {
> -	BMAP_NOT_CREATE,
> -	BMAP_ADD_CLUSTER,
> -};
> -
>  static int __exfat_write_inode(struct inode *inode, int sync)  {
>  	int ret = -EIO;
> @@ -298,109 +292,91 @@ static int exfat_map_cluster(struct inode *inode,
> unsigned int clu_offset,
>  	return 0;
>  }
> 
> -static int exfat_bmap(struct inode *inode, sector_t sector, sector_t
> *phys,
> -		unsigned long *mapped_blocks, int *create)
> +static int exfat_map_new_buffer(struct exfat_inode_info *ei,
> +		struct buffer_head *bh, loff_t pos)
>  {
> -	struct super_block *sb = inode->i_sb;
> -	struct exfat_sb_info *sbi = EXFAT_SB(sb);
> -	sector_t last_block;
> -	unsigned int cluster, clu_offset, sec_offset;
> -	int err = 0;
> -
> -	*phys = 0;
> -	*mapped_blocks = 0;
> -
> -	last_block = EXFAT_B_TO_BLK_ROUND_UP(i_size_read(inode), sb);
> -	if (sector >= last_block && *create == BMAP_NOT_CREATE)
> -		return 0;
> -
> -	/* Is this block already allocated? */
> -	clu_offset = sector >> sbi->sect_per_clus_bits;  /* cluster offset
> */
> -
> -	err = exfat_map_cluster(inode, clu_offset, &cluster,
> -		*create & BMAP_ADD_CLUSTER);
> -	if (err) {
> -		if (err != -ENOSPC)
> -			return -EIO;
> -		return err;
> -	}
> -
> -	if (cluster != EXFAT_EOF_CLUSTER) {
> -		/* sector offset in cluster */
> -		sec_offset = sector & (sbi->sect_per_clus - 1);
> -
> -		*phys = exfat_cluster_to_sector(sbi, cluster) + sec_offset;
> -		*mapped_blocks = sbi->sect_per_clus - sec_offset;
> -	}
> +	if (buffer_delay(bh) && pos > ei->i_size_aligned)
> +		return -EIO;
> +	set_buffer_new(bh);
> 
> -	if (sector < last_block)
> -		*create = BMAP_NOT_CREATE;
> +	/*
> +	 * Adjust i_size_aligned if i_size_ondisk is bigger than it.
> +	 * (i.e. non-DA)
> +	 */
> +	if (ei->i_size_ondisk > ei->i_size_aligned)
> +		ei->i_size_aligned = ei->i_size_ondisk;
>  	return 0;
>  }
> 
>  static int exfat_get_block(struct inode *inode, sector_t iblock,
>  		struct buffer_head *bh_result, int create)  {
> +	struct exfat_inode_info *ei = EXFAT_I(inode);
>  	struct super_block *sb = inode->i_sb;
> +	struct exfat_sb_info *sbi = EXFAT_SB(sb);
>  	unsigned long max_blocks = bh_result->b_size >> inode->i_blkbits;
>  	int err = 0;
> -	unsigned long mapped_blocks;
> -	sector_t phys;
> +	unsigned long mapped_blocks = 0;
> +	unsigned int cluster, sec_offset;
> +	sector_t last_block;
> +	sector_t phys = 0;
>  	loff_t pos;
> -	int bmap_create = create ? BMAP_ADD_CLUSTER : BMAP_NOT_CREATE;
> +
> +	mutex_lock(&sbi->s_lock);
> +	last_block = EXFAT_B_TO_BLK_ROUND_UP(i_size_read(inode), sb);
> +	if (iblock >= last_block && !create)
> +		goto done;
> 
> -	mutex_lock(&EXFAT_SB(sb)->s_lock);
> -	err = exfat_bmap(inode, iblock, &phys, &mapped_blocks,
> &bmap_create);
> +	/* Is this block already allocated? */
> +	err = exfat_map_cluster(inode, iblock >> sbi->sect_per_clus_bits,
> +				&cluster, create);
>  	if (err) {
> -		if (err != -ENOSPC)
> -			exfat_fs_error_ratelimit(sb,
> -				"failed to bmap (inode : %p iblock : %llu,
> err : %d)",
> -				inode, (unsigned long long)iblock, err);
> +		if (err == -ENOSPC)
> +			goto unlock_ret;
> +
> +		exfat_fs_error_ratelimit(sb,
> +			"failed to bmap (inode : %p iblock : %llu, err :
%d)",
> +			inode, (unsigned long long)iblock, err);
>  		goto unlock_ret;
>  	}
> 
> -	if (phys) {
> -		max_blocks = min(mapped_blocks, max_blocks);
> -
> -		/* Treat newly added block / cluster */
> -		if (bmap_create || buffer_delay(bh_result)) {
> -			/* Update i_size_ondisk */
> -			pos = EXFAT_BLK_TO_B((iblock + 1), sb);
> -			if (EXFAT_I(inode)->i_size_ondisk < pos)
> -				EXFAT_I(inode)->i_size_ondisk = pos;
> -
> -			if (bmap_create) {
> -				if (buffer_delay(bh_result) &&
> -				    pos > EXFAT_I(inode)->i_size_aligned) {
> -					exfat_fs_error(sb,
> -						"requested for bmap out of
> range(pos : (%llu) > i_size_aligned(%llu)\n",
> -						pos,
> -
EXFAT_I(inode)->i_size_aligned);
> -					err = -EIO;
> -					goto unlock_ret;
> -				}
> -				set_buffer_new(bh_result);
> -
> -				/*
> -				 * adjust i_size_aligned if i_size_ondisk is
> -				 * bigger than it. (i.e. non-DA)
> -				 */
> -				if (EXFAT_I(inode)->i_size_ondisk >
> -				    EXFAT_I(inode)->i_size_aligned) {
> -					EXFAT_I(inode)->i_size_aligned =
> -
EXFAT_I(inode)->i_size_ondisk;
> -				}
> -			}
> +	if (cluster == EXFAT_EOF_CLUSTER)
> +		goto done;
> +
> +	/* sector offset in cluster */
> +	sec_offset = iblock & (sbi->sect_per_clus - 1);
> +
> +	phys = exfat_cluster_to_sector(sbi, cluster) + sec_offset;
> +	mapped_blocks = sbi->sect_per_clus - sec_offset;
> +	max_blocks = min(mapped_blocks, max_blocks);
> 
> -			if (buffer_delay(bh_result))
> -				clear_buffer_delay(bh_result);
> +	/* Treat newly added block / cluster */
> +	if (iblock < last_block)
> +		create = 0;
> +
> +	if (create || buffer_delay(bh_result)) {
> +		pos = EXFAT_BLK_TO_B((iblock + 1), sb);
> +		if (ei->i_size_ondisk < pos)
> +			ei->i_size_ondisk = pos;
> +	}
> +
> +	if (create) {
> +		err = exfat_map_new_buffer(ei, bh_result, pos);
> +		if (err) {
> +			exfat_fs_error(sb,
> +				"requested for bmap out of range(pos :
(%llu) >
> i_size_aligned(%llu)\n",
> +				pos, ei->i_size_aligned);
> +			goto unlock_ret;
>  		}
> -		map_bh(bh_result, sb, phys);
>  	}
> 
> +	if (buffer_delay(bh_result))
> +		clear_buffer_delay(bh_result);
> +	map_bh(bh_result, sb, phys);
> +done:
>  	bh_result->b_size = EXFAT_BLK_TO_B(max_blocks, sb);
>  unlock_ret:
> -	mutex_unlock(&EXFAT_SB(sb)->s_lock);
> +	mutex_unlock(&sbi->s_lock);
>  	return err;
>  }
> 


  reply	other threads:[~2020-01-09 23:23 UTC|newest]

Thread overview: 56+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <CGME20200102082359epcas1p2aa1eca9729a6ec54ec3b8140615dca6e@epcas1p2.samsung.com>
2020-01-02  8:20 ` [PATCH v9 00/13] add the latest exfat driver Namjae Jeon
     [not found]   ` <CGME20200102082400epcas1p4cd0ad14967bd8d231fc0efcede8bd99c@epcas1p4.samsung.com>
2020-01-02  8:20     ` [PATCH v9 01/13] exfat: add in-memory and on-disk structures and headers Namjae Jeon
2020-01-08 17:08       ` Christoph Hellwig
2020-01-09 22:43         ` Namjae Jeon
     [not found]   ` <CGME20200102082401epcas1p2f33f3c11ecedabff2165ba216854d8fe@epcas1p2.samsung.com>
2020-01-02  8:20     ` [PATCH v9 02/13] exfat: add super block operations Namjae Jeon
2020-01-08 17:21       ` Christoph Hellwig
2020-01-09 23:21         ` Namjae Jeon
     [not found]   ` <CGME20200102082402epcas1p47cdc0873473f99c5d81f56865bb94abc@epcas1p4.samsung.com>
2020-01-02  8:20     ` [PATCH v9 03/13] exfat: add inode operations Namjae Jeon
2020-01-08 17:50       ` Christoph Hellwig
2020-01-09 23:23         ` Namjae Jeon [this message]
     [not found]   ` <CGME20200102082402epcas1p22cdd763b3c72166c0a91f9ba8db6a9b8@epcas1p2.samsung.com>
2020-01-02  8:20     ` [PATCH v9 04/13] exfat: add directory operations Namjae Jeon
2020-01-08 17:52       ` Christoph Hellwig
     [not found]   ` <CGME20200102082403epcas1p432813ab4fd8ed07075e89e48a0ce34d7@epcas1p4.samsung.com>
2020-01-02  8:20     ` [PATCH v9 05/13] exfat: add file operations Namjae Jeon
2020-01-08 17:56       ` Christoph Hellwig
     [not found]   ` <CGME20200102082404epcas1p4a28c34799df317165ddf8bd5a0b433e9@epcas1p4.samsung.com>
2020-01-02  8:20     ` [PATCH v9 06/13] exfat: add exfat entry operations Namjae Jeon
2020-01-08 18:00       ` Christoph Hellwig
2020-01-09 23:24         ` Namjae Jeon
     [not found]   ` <CGME20200102082405epcas1p41dd62d00104cb0daa4fe85641cb8ee22@epcas1p4.samsung.com>
2020-01-02  8:20     ` [PATCH v9 07/13] exfat: add bitmap operations Namjae Jeon
2020-01-08 18:01       ` Christoph Hellwig
     [not found]   ` <CGME20200102082405epcas1p160f24165fc8ae8f51080e75bb585e0c7@epcas1p1.samsung.com>
2020-01-02  8:20     ` [PATCH v9 08/13] exfat: add exfat cache Namjae Jeon
2020-01-08 18:02       ` Christoph Hellwig
     [not found]   ` <CGME20200102082406epcas1p268f260d90213bdaabee25a7518f86625@epcas1p2.samsung.com>
2020-01-02  8:20     ` [PATCH v9 09/13] exfat: add misc operations Namjae Jeon
2020-01-02  9:19       ` Pali Rohár
2020-01-02 11:30         ` Namjae Jeon
2020-01-02 11:40           ` Pali Rohár
2020-01-03 18:36             ` Pali Rohár
2020-01-03 23:28               ` Namjae Jeon
2020-01-08 18:03         ` Christoph Hellwig
2020-01-08 19:40           ` Arnd Bergmann
2020-01-09 23:32             ` Namjae Jeon
     [not found]   ` <CGME20200102082407epcas1p4cf10cd3d0ca2903707ab01b1cc523a05@epcas1p4.samsung.com>
2020-01-02  8:20     ` [PATCH v9 10/13] exfat: add nls operations Namjae Jeon
2020-01-02 13:55       ` Pali Rohár
2020-01-03  7:06         ` Namjae Jeon
2020-01-03  8:44           ` Pali Rohár
2020-01-02 14:20       ` Pali Rohár
2020-01-03  4:44         ` Namjae Jeon
2020-01-03  9:40       ` Pali Rohár
2020-01-03 12:31         ` Pali Rohár
2020-01-09 22:35           ` Namjae Jeon
2020-01-05 15:24       ` Pali Rohár
2020-01-05 16:51       ` Pali Rohár
2020-01-06 19:46         ` Gabriel Krisman Bertazi
2020-01-07 11:52           ` Pali Rohár
2020-01-09 22:04             ` [PATCH v9 09/13] exfat: add misc operations Valdis Klētnieks
2020-01-09 23:41               ` Namjae Jeon
2020-01-09 22:37         ` [PATCH v9 10/13] exfat: add nls operations Namjae Jeon
     [not found]   ` <CGME20200102082408epcas1p28d46af675103d2cd92232a4f7b712c46@epcas1p2.samsung.com>
2020-01-02  8:20     ` [PATCH v9 11/13] exfat: add Kconfig and Makefile Namjae Jeon
2020-01-02 12:53       ` Pali Rohár
     [not found]   ` <CGME20200102082408epcas1p194621a6aa6729011703f0c5a076a7396@epcas1p1.samsung.com>
2020-01-02  8:20     ` [PATCH v9 12/13] exfat: add exfat in fs/Kconfig and fs/Makefile Namjae Jeon
2020-01-02 12:58       ` Pali Rohár
2020-01-02 13:07         ` Namjae Jeon
2020-01-02 13:10           ` Pali Rohár
2020-01-02 14:19           ` Greg KH
2020-01-02 23:48             ` Namjae Jeon
2020-01-04  5:22       ` kbuild test robot
     [not found]   ` <CGME20200102082409epcas1p4210cf0ea40d23689c4a5ba18b50979cf@epcas1p4.samsung.com>
2020-01-02  8:20     ` [PATCH v9 13/13] MAINTAINERS: add exfat filesystem Namjae Jeon

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to='001801d5c743$c9c058e0$5d410aa0$@samsung.com' \
    --to=namjae.jeon@samsung.com \
    --cc=gregkh@linuxfoundation.org \
    --cc=hch@lst.de \
    --cc=linkinjeon@gmail.com \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=pali.rohar@gmail.com \
    --cc=sj1557.seo@samsung.com \
    --cc=valdis.kletnieks@vt.edu \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®