19 Aug, 2020

1 commit

  • commit 0dcd3c94e02438f4a571690e26f4ee997524102a upstream.

    Each ondisk inode should be aligned with inode slot boundary
    (32-byte alignment) because of nid calculation formula, so all
    compact inodes (32 byte) cannot across page boundary. However,
    extended inode is now 64-byte form, which can across page boundary
    in principle if the location is specified on purpose, although
    it's hard to be generated by mkfs due to the allocation policy
    and rarely used by Android use case now mainly for > 4GiB files.

    For now, only two fields `i_ctime_nsec` and `i_nlink' couldn't
    be read from disk properly and cause out-of-bound memory read
    with random value.

    Let's fix now.

    Fixes: 431339ba9042 ("staging: erofs: add inode operations")
    Cc: # 4.19+
    Link: https://lore.kernel.org/r/20200729175801.GA23973@xiangao.remote.csb
    Reviewed-by: Chao Yu
    Signed-off-by: Gao Xiang
    Signed-off-by: Greg Kroah-Hartman

    Gao Xiang
     

01 Jul, 2020

1 commit

  • commit 3c597282887fd55181578996dca52ce697d985a5 upstream.

    Hongyu reported "id != index" in z_erofs_onlinepage_fixup() with
    specific aarch64 environment easily, which wasn't shown before.

    After digging into that, I found that high 32 bits of page->private
    was set to 0xaaaaaaaa rather than 0 (due to z_erofs_onlinepage_init
    behavior with specific compiler options). Actually we only use low
    32 bits to keep the page information since page->private is only 4
    bytes on most 32-bit platforms. However z_erofs_onlinepage_fixup()
    uses the upper 32 bits by mistake.

    Let's fix it now.

    Reported-and-tested-by: Hongyu Jin
    Fixes: 3883a79abd02 ("staging: erofs: introduce VLE decompression support")
    Cc: # 4.19+
    Reviewed-by: Chao Yu
    Link: https://lore.kernel.org/r/20200618234349.22553-1-hsiangkao@aol.com
    Signed-off-by: Gao Xiang
    Signed-off-by: Greg Kroah-Hartman

    Gao Xiang
     

17 Apr, 2020

1 commit

  • commit 9d5a09c6f3b5fb85af20e3a34827b5d27d152b34 upstream.

    The remaining count should not include successful
    shrink attempts.

    Fixes: e7e9a307be9d ("staging: erofs: introduce workstation for decompression")
    Cc: # 4.19+
    Link: https://lore.kernel.org/r/20200226081008.86348-1-gaoxiang25@huawei.com
    Reviewed-by: Chao Yu
    Signed-off-by: Gao Xiang
    Signed-off-by: Greg Kroah-Hartman

    Gao Xiang
     

11 Feb, 2020

1 commit

  • commit 4d2024370d877f9ac8b98694bcff666da6a5d333 upstream.

    rq->out[1] should be valid before accessing. Otherwise,
    in very rare cases, out-of-bound dirty onstack rq->out[1]
    can equal to *in and lead to unintended memmove behavior.

    Link: https://lore.kernel.org/r/20200107022546.19432-1-gaoxiang25@huawei.com
    Fixes: 7fc45dbc938a ("staging: erofs: introduce generic decompression backend")
    Cc: # 5.3+
    Reviewed-by: Chao Yu
    Signed-off-by: Gao Xiang
    Signed-off-by: Greg Kroah-Hartman

    Gao Xiang
     

18 Dec, 2019

1 commit

  • commit 926d1650176448d7684b991fbe1a5b1a8289e97c upstream.

    As David reported [1], ENODATA returns when attempting
    to modify files by using EROFS as an overlayfs lower layer.

    The root cause is that listxattr could return unexpected
    -ENODATA by mistake for inodes without xattr. That breaks
    listxattr return value convention and it can cause copy
    up failure when used with overlayfs.

    Resolve by zeroing out if no xattr is found for listxattr.

    [1] https://lore.kernel.org/r/CAEvUa7nxnby+rxK-KRMA46=exeOMApkDMAV08AjMkkPnTPV4CQ@mail.gmail.com
    Link: https://lore.kernel.org/r/20191201084040.29275-1-hsiangkao@aol.com
    Fixes: cadf1ccf1b00 ("staging: erofs: add error handling for xattr submodule")
    Cc: # 4.19+
    Reviewed-by: Chao Yu
    Signed-off-by: Gao Xiang
    Signed-off-by: Greg Kroah-Hartman

    Gao Xiang
     

01 Oct, 2019

3 commits

  • Fix a recent cleanup patch. noio (bypass) chain is
    handled asynchronously against submit chain, therefore
    inplace I/O or pagevec cannot be applied to such pages.
    Add detailed comment for this as well.

    Fixes: 97e86a858bc3 ("staging: erofs: tidy up decompression frontend")
    Reviewed-by: Chao Yu
    Link: https://lore.kernel.org/r/20190922100434.229340-1-gaoxiang25@huawei.com
    Signed-off-by: Gao Xiang

    Gao Xiang
     
  • After doing more drop_caches stress test on
    our products, I found the mistake introduced by
    a very recent cleanup [1].

    The current rule is that "erofs_get_meta_page"
    should be returned with page locked (although
    it's mostly unnecessary for read-only fs after
    pages are PG_uptodate), but a fix should be
    done for this.

    [1] https://lore.kernel.org/r/20190904020912.63925-26-gaoxiang25@huawei.com
    Fixes: 618f40ea026b ("erofs: use read_cache_page_gfp for erofs_get_meta_page")
    Reviewed-by: Chao Yu
    Link: https://lore.kernel.org/r/20190921184355.149928-1-gaoxiang25@huawei.com
    Signed-off-by: Gao Xiang

    Gao Xiang
     
  • In case of error, the function read_mapping_page() returns
    ERR_PTR() not NULL. The NULL test in the return value check
    should be replaced with IS_ERR().

    Fixes: fe7c2423570d ("erofs: use read_mapping_page instead of sb_bread")
    Reviewed-by: Gao Xiang
    Reviewed-by: Chao Yu
    Signed-off-by: Wei Yongjun
    Link: https://lore.kernel.org/r/20190918083033.47780-1-weiyongjun1@huawei.com
    Signed-off-by: Gao Xiang

    Wei Yongjun
     

06 Sep, 2019

25 commits

  • As Christoph said [1], "I'd much prefer to just use
    read_cache_page_gfp, and live with the fact that this
    allocates bufferheads behind you for now. I'll try to
    speed up my attempts to get rid of the buffer heads on
    the block device mapping instead. "

    This simplifies the code a lot and a minor thing is
    "no REQ_META (e.g. for blktrace) on metadata at all..."

    [1] https://lore.kernel.org/r/20190903153704.GA2201@infradead.org/
    Reported-by: Christoph Hellwig
    Signed-off-by: Gao Xiang
    Link: https://lore.kernel.org/r/20190904020912.63925-26-gaoxiang25@huawei.com
    Signed-off-by: Greg Kroah-Hartman

    Gao Xiang
     
  • As Christoph said [1] [2], "Just use the slightly
    more complicated 32-bit version everywhere so that
    you have a single actually tested code path.
    And then remove this helper. "

    [1] https://lore.kernel.org/r/20190829102426.GE20598@infradead.org/
    [2] https://lore.kernel.org/r/20190902125320.GA16726@infradead.org/
    Reported-by: Christoph Hellwig
    Signed-off-by: Gao Xiang
    Link: https://lore.kernel.org/r/20190904020912.63925-25-gaoxiang25@huawei.com
    Signed-off-by: Greg Kroah-Hartman

    Gao Xiang
     
  • As Christoph said [1], "This seems to be your only direct
    use of buffer heads, which while not deprecated are a bit
    of an ugly step child. So if you can easily avoid creating
    a buffer_head dependency in a new filesystem I think you
    should avoid it. "

    [1] https://lore.kernel.org/r/20190902125109.GA9826@infradead.org/
    Reported-by: Christoph Hellwig
    Signed-off-by: Gao Xiang
    Link: https://lore.kernel.org/r/20190904020912.63925-24-gaoxiang25@huawei.com
    Signed-off-by: Greg Kroah-Hartman

    Gao Xiang
     
  • Add prefix "erofs_" to these functions and print
    sb->s_id as a prefix to erofs_{err, info} so that
    the user knows which file system is affected.

    Reported-by: Christoph Hellwig
    Signed-off-by: Gao Xiang
    Link: https://lore.kernel.org/r/20190904020912.63925-23-gaoxiang25@huawei.com
    Signed-off-by: Greg Kroah-Hartman

    Gao Xiang
     
  • As Christoph said [1], ".. and save one
    level of indentation."

    [1] https://lore.kernel.org/r/20190829102426.GE20598@infradead.org/
    Reported-by: Christoph Hellwig
    Signed-off-by: Gao Xiang
    Link: https://lore.kernel.org/r/20190904020912.63925-22-gaoxiang25@huawei.com
    Signed-off-by: Greg Kroah-Hartman

    Gao Xiang
     
  • As Christoph said [1],
    "vm_map_ram is supposed to generally behave better. So if
    it doesn't please report that that to the arch maintainer
    and linux-mm so that they can look into the issue. Having
    user make choices of deep down kernel internals is just
    a horrible interface.

    Please talk to maintainers of other bits of the kernel
    if you see issues and / or need enhancements. "

    Let's redo the previous conclusion and kill the vmap
    approach.

    [1] https://lore.kernel.org/r/20190830165533.GA10909@infradead.org/
    Reported-by: Christoph Hellwig
    Signed-off-by: Gao Xiang
    Link: https://lore.kernel.org/r/20190904020912.63925-21-gaoxiang25@huawei.com
    Signed-off-by: Greg Kroah-Hartman

    Gao Xiang
     
  • As Christoph suggested [1], "Please just use plain kmalloc
    everywhere and let the normal kernel error injection code
    take care of injeting any errors."

    [1] https://lore.kernel.org/r/20190829102426.GE20598@infradead.org/
    Reported-by: Christoph Hellwig
    Signed-off-by: Gao Xiang
    Link: https://lore.kernel.org/r/20190904020912.63925-20-gaoxiang25@huawei.com
    Signed-off-by: Greg Kroah-Hartman

    Gao Xiang
     
  • Add erofs_ prefix to free_inode, alloc_inode, ...

    Reported-by: Christoph Hellwig
    Signed-off-by: Gao Xiang
    Link: https://lore.kernel.org/r/20190904020912.63925-19-gaoxiang25@huawei.com
    Signed-off-by: Greg Kroah-Hartman

    Gao Xiang
     
  • As Christoph pointed out [1], "
    Why is there __submit_bio which really just obsfucates
    what is going on? Also why is __submit_bio using
    bio_set_op_attrs instead of opencode it as the comment
    right next to it asks you to? "

    Let's use submit_bio directly instead.

    [1] https://lore.kernel.org/r/20190830162812.GA10694@infradead.org/
    Reported-by: Christoph Hellwig
    Signed-off-by: Gao Xiang
    Link: https://lore.kernel.org/r/20190904020912.63925-18-gaoxiang25@huawei.com
    Signed-off-by: Greg Kroah-Hartman

    Gao Xiang
     
  • As Christoph pointed out [1],
    "Why is there __erofs_get_meta_page with the two weird
    booleans instead of a single erofs_get_meta_page that
    gets and gfp_t for additional flags and an unsigned int
    for additional bio op flags."

    And since all callers can handle errors, let's kill
    prio and nofail and erofs_get_inline_page() now.

    [1] https://lore.kernel.org/r/20190830162812.GA10694@infradead.org/
    Reported-by: Christoph Hellwig
    Signed-off-by: Gao Xiang
    Link: https://lore.kernel.org/r/20190904020912.63925-17-gaoxiang25@huawei.com
    Signed-off-by: Greg Kroah-Hartman

    Gao Xiang
     
  • As Christoph pointed out [1], "erofs_grab_bio tries to
    handle a bio_alloc failure, except that the function will
    not actually fail due the mempool backing it."

    Sorry about useless code, fix it now and
    localize erofs_grab_bio [2].

    [1] https://lore.kernel.org/r/20190830162812.GA10694@infradead.org/
    [2] https://lore.kernel.org/r/20190902122016.GL15931@infradead.org/
    Reported-by: Christoph Hellwig
    Signed-off-by: Gao Xiang
    Link: https://lore.kernel.org/r/20190904020912.63925-16-gaoxiang25@huawei.com
    Signed-off-by: Greg Kroah-Hartman

    Gao Xiang
     
  • As Christoph said [1], "That is some very verbose
    debug info. We usually don't add that and let
    people trace the function instead. "

    [1] https://lore.kernel.org/r/20190829101545.GC20598@infradead.org/
    Reported-by: Christoph Hellwig
    Signed-off-by: Gao Xiang
    Link: https://lore.kernel.org/r/20190904020912.63925-15-gaoxiang25@huawei.com
    Signed-off-by: Greg Kroah-Hartman

    Gao Xiang
     
  • As Christoph pointed out [1], "Why is the variable name
    for the on-disk subperblock layout? We usually still
    calls this something with sb in the name, e.g. dsb.
    for disksuper block. " Let's fix it.

    [1] https://lore.kernel.org/r/20190829101545.GC20598@infradead.org/
    Signed-off-by: Gao Xiang
    Link: https://lore.kernel.org/r/20190904020912.63925-14-gaoxiang25@huawei.com
    Signed-off-by: Greg Kroah-Hartman

    Gao Xiang
     
  • Fix as Christoph suggested [1] [2], "remove is_inode_fast_symlink
    and just opencode it in the few places using it"

    and
    "Please just set the ops directly instead of obsfucating that in
    a single caller, single line inline function. And please set it
    instead of the normal symlink iops in the same place where you
    also set those."

    [1] https://lore.kernel.org/r/20190830163910.GB29603@infradead.org/
    [2] https://lore.kernel.org/r/20190829102426.GE20598@infradead.org/
    Reported-by: Christoph Hellwig
    Signed-off-by: Gao Xiang
    Link: https://lore.kernel.org/r/20190904020912.63925-13-gaoxiang25@huawei.com
    Signed-off-by: Greg Kroah-Hartman

    Gao Xiang
     
  • As Christoph suggested [1], update them all.

    [1] https://lore.kernel.org/r/20190829102426.GE20598@infradead.org/
    Reported-by: Christoph Hellwig
    Signed-off-by: Gao Xiang
    Link: https://lore.kernel.org/r/20190904020912.63925-12-gaoxiang25@huawei.com
    Signed-off-by: Greg Kroah-Hartman

    Gao Xiang
     
  • As Christoph said [1] [2], update it now.

    [1] https://lore.kernel.org/r/20190902124521.GA22153@infradead.org/
    [2] https://lore.kernel.org/r/20190902120548.GB15931@infradead.org/
    Reported-by: Christoph Hellwig
    Signed-off-by: Gao Xiang
    Link: https://lore.kernel.org/r/20190904020912.63925-11-gaoxiang25@huawei.com
    Signed-off-by: Greg Kroah-Hartman

    Gao Xiang
     
  • As Christoph suggested [1], "Why is this called vnode instead
    of inode? That seems like a rather odd naming for a Linux
    file system."

    [1] https://lore.kernel.org/r/20190829101545.GC20598@infradead.org/
    Reported-by: Christoph Hellwig
    Signed-off-by: Gao Xiang
    Link: https://lore.kernel.org/r/20190904020912.63925-10-gaoxiang25@huawei.com
    Signed-off-by: Greg Kroah-Hartman

    Gao Xiang
     
  • As Christoph said [1] "having this function seems
    entirely pointless", let's kill those.

    filesystem function name
    ext2,f2fs,ext4,isofs,squashfs,cifs,... init_inodecache

    In addition, add a necessary "rcu_barrier()" on exit_fs();

    [1] https://lore.kernel.org/r/20190829101545.GC20598@infradead.org/
    Reported-by: Christoph Hellwig
    Signed-off-by: Gao Xiang
    Link: https://lore.kernel.org/r/20190904020912.63925-9-gaoxiang25@huawei.com
    Signed-off-by: Greg Kroah-Hartman

    Gao Xiang
     
  • updates inode naming
    - kill is_inode_layout_compression [1]
    - kill magic underscores [2] [3]
    - better naming for datamode & data_mapping_mode [3]
    - better naming erofs_inode_{compact, extended} [4]

    [1] https://lore.kernel.org/r/20190829102426.GE20598@infradead.org/
    [2] https://lore.kernel.org/r/20190829102426.GE20598@infradead.org/
    [3] https://lore.kernel.org/r/20190902122627.GN15931@infradead.org/
    [4] https://lore.kernel.org/r/20190902125438.GA17750@infradead.org/
    Reported-by: Christoph Hellwig
    Signed-off-by: Gao Xiang
    Link: https://lore.kernel.org/r/20190904020912.63925-8-gaoxiang25@huawei.com
    Signed-off-by: Greg Kroah-Hartman

    Gao Xiang
     
  • As Christoph said [1], "This is only cosmetic, why
    not stick to feature_compat and feature_incompat?"

    In my thought, requirements means "incompatible"
    instead of "feature" though.

    [1] https://lore.kernel.org/r/20190902125109.GA9826@infradead.org/
    Reported-by: Christoph Hellwig
    Signed-off-by: Gao Xiang
    Link: https://lore.kernel.org/r/20190904020912.63925-7-gaoxiang25@huawei.com
    Signed-off-by: Greg Kroah-Hartman

    Gao Xiang
     
  • As Christoph said, "This looks like a really obsfucated
    way to write:
    return datamode == EROFS_INODE_FLAT_COMPRESSION ||
    datamode == EROFS_INODE_FLAT_COMPRESSION_LEGACY; "

    Although I had my own consideration, it's the right way for now.

    [1] https://lore.kernel.org/r/20190829095954.GB20598@infradead.org/
    Reported-by: Christoph Hellwig
    Signed-off-by: Gao Xiang
    Link: https://lore.kernel.org/r/20190904020912.63925-6-gaoxiang25@huawei.com
    Signed-off-by: Greg Kroah-Hartman

    Gao Xiang
     
  • As Christoph suggested "Please don't add __packed" [1],
    remove all __packed except struct erofs_dirent here.

    Note that all on-disk fields except struct erofs_dirent
    (12 bytes with a 8-byte nid) in EROFS are naturally aligned.

    [1] https://lore.kernel.org/r/20190829095954.GB20598@infradead.org/
    Reported-by: Christoph Hellwig
    Signed-off-by: Gao Xiang
    Link: https://lore.kernel.org/r/20190904020912.63925-5-gaoxiang25@huawei.com
    Signed-off-by: Greg Kroah-Hartman

    Gao Xiang
     
  • As Christoph suggested [1], these macros are much
    more readable as a function.

    [1] https://lore.kernel.org/r/20190829095954.GB20598@infradead.org/
    Reported-by: Christoph Hellwig
    Signed-off-by: Gao Xiang
    Link: https://lore.kernel.org/r/20190904020912.63925-4-gaoxiang25@huawei.com
    Signed-off-by: Greg Kroah-Hartman

    Gao Xiang
     
  • As Christoph suggested [1], on-disk format should have
    explicitly assigned numbers.

    [1] https://lore.kernel.org/r/20190829095954.GB20598@infradead.org/
    Reported-by: Christoph Hellwig
    Signed-off-by: Gao Xiang
    Link: https://lore.kernel.org/r/20190904020912.63925-3-gaoxiang25@huawei.com
    Signed-off-by: Greg Kroah-Hartman

    Gao Xiang
     
  • As Christoph suggested [1], "Please remove all the byte offset comments.
    that is something that can easily be checked with gdb or pahole."

    [1] https://lore.kernel.org/r/20190829095954.GB20598@infradead.org/
    Reported-by: Christoph Hellwig
    Signed-off-by: Gao Xiang
    Link: https://lore.kernel.org/r/20190904020912.63925-2-gaoxiang25@huawei.com
    Signed-off-by: Greg Kroah-Hartman

    Gao Xiang
     

04 Sep, 2019

1 commit


30 Aug, 2019

2 commits

  • As Joe Perches suggested [1],
    err = bio_add_page(bio, page, PAGE_SIZE, 0);
    - if (unlikely(err != PAGE_SIZE)) {
    + if (err != PAGE_SIZE) {
    err = -EFAULT;
    goto err_out;
    }

    The initial assignment to err is odd as it's not
    actually an error value -E but a int size
    from a unsigned int len.

    Here the return is either 0 or PAGE_SIZE.

    This would be more legible to me as:

    if (bio_add_page(bio, page, PAGE_SIZE, 0) != PAGE_SIZE) {
    err = -EFAULT;
    goto err_out;
    }

    [1] https://lore.kernel.org/r/74c4784319b40deabfbaea92468f7e3ef44f1c96.camel@perches.com/
    Signed-off-by: Gao Xiang
    Link: https://lore.kernel.org/r/20190829171741.225219-1-gaoxiang25@huawei.com
    Signed-off-by: Greg Kroah-Hartman

    Gao Xiang
     
  • As Dan Carpenter suggested [1], I have to remove
    all erofs likely/unlikely annotations.

    [1] https://lore.kernel.org/linux-fsdevel/20190829154346.GK23584@kadam/
    Reported-by: Dan Carpenter
    Signed-off-by: Gao Xiang
    Link: https://lore.kernel.org/r/20190829163827.203274-1-gaoxiang25@huawei.com
    Signed-off-by: Greg Kroah-Hartman

    Gao Xiang
     

24 Aug, 2019

1 commit

  • EROFS filesystem has been merged into linux-staging for a year.

    EROFS is designed to be a better solution of saving extra storage
    space with guaranteed end-to-end performance for read-only files
    with the help of reduced metadata, fixed-sized output compression
    and decompression inplace technologies.

    In the past year, EROFS was greatly improved by many people as
    a staging driver, self-tested, betaed by a large number of our
    internal users, successfully applied to almost all in-service
    HUAWEI smartphones as the part of EMUI 9.1 and proven to be stable
    enough to be moved out of staging.

    EROFS is a self-contained filesystem driver. Although there are
    still some TODOs to be more generic, we have a dedicated team
    actively keeping on working on EROFS in order to make it better
    with the evolution of Linux kernel as the other in-kernel filesystems.

    As Pavel suggested, it's better to do as one commit since git
    can do moves and all histories will be saved in this way.

    Let's promote it from staging and enhance it more actively as
    a "real" part of kernel for more wider scenarios!

    Cc: Greg Kroah-Hartman
    Cc: Alexander Viro
    Cc: Andrew Morton
    Cc: Stephen Rothwell
    Cc: Theodore Ts'o
    Cc: Pavel Machek
    Cc: David Sterba
    Cc: Amir Goldstein
    Cc: Christoph Hellwig
    Cc: Darrick J . Wong
    Cc: Dave Chinner
    Cc: Jaegeuk Kim
    Cc: Jan Kara
    Cc: Richard Weinberger
    Cc: Linus Torvalds
    Cc: Chao Yu
    Cc: Miao Xie
    Cc: Li Guifu
    Cc: Fang Wei
    Signed-off-by: Gao Xiang
    Link: https://lore.kernel.org/r/20190822213659.5501-1-hsiangkao@aol.com
    Signed-off-by: Greg Kroah-Hartman

    Gao Xiang