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;
> }
>
next prev parent 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®