erofs: use kmap_local_page() only for erofs_bread()
authorGao Xiang <hsiangkao@linux.alibaba.com>
Tue, 18 Oct 2022 10:53:13 +0000 (18:53 +0800)
committerGao Xiang <hsiangkao@linux.alibaba.com>
Wed, 7 Dec 2022 02:56:31 +0000 (10:56 +0800)
Convert all mapped erofs_bread() users to use kmap_local_page()
instead of kmap() or kmap_atomic().

Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
Reviewed-and-tested-by: Jingbo Xu <jefflexu@linux.alibaba.com>
Reviewed-by: Chao Yu <chao@kernel.org>
Link: https://lore.kernel.org/r/20221018105313.4940-1-hsiangkao@linux.alibaba.com
Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
fs/erofs/data.c
fs/erofs/inode.c
fs/erofs/internal.h
fs/erofs/xattr.c
fs/erofs/zmap.c

index c9526c627dda3d7b457b7c023b93e4c777890203..f57f921683d7fda945ed724f2b1f88a974407b6a 100644 (file)
@@ -13,9 +13,7 @@
 void erofs_unmap_metabuf(struct erofs_buf *buf)
 {
        if (buf->kmap_type == EROFS_KMAP)
-               kunmap(buf->page);
-       else if (buf->kmap_type == EROFS_KMAP_ATOMIC)
-               kunmap_atomic(buf->base);
+               kunmap_local(buf->base);
        buf->base = NULL;
        buf->kmap_type = EROFS_NO_KMAP;
 }
@@ -54,9 +52,7 @@ void *erofs_bread(struct erofs_buf *buf, struct inode *inode,
        }
        if (buf->kmap_type == EROFS_NO_KMAP) {
                if (type == EROFS_KMAP)
-                       buf->base = kmap(page);
-               else if (type == EROFS_KMAP_ATOMIC)
-                       buf->base = kmap_atomic(page);
+                       buf->base = kmap_local_page(page);
                buf->kmap_type = type;
        } else if (buf->kmap_type != type) {
                DBG_BUGON(1);
index 85932086d23ff0f45d221e08a438509029cecc4d..5b3a793103af3cdddd6d6f2385aed8a8bf708f94 100644 (file)
@@ -268,6 +268,7 @@ static int erofs_fill_inode(struct inode *inode)
        case S_IFDIR:
                inode->i_op = &erofs_dir_iops;
                inode->i_fop = &erofs_dir_fops;
+               inode_nohighmem(inode);
                break;
        case S_IFLNK:
                err = erofs_fill_symlink(inode, kaddr, ofs);
index e51f27b6bde15008f198589959d2c58e9a9476e9..bb8501c0ff5b5443552720b3da6a473b738235b1 100644 (file)
@@ -255,8 +255,7 @@ static inline int erofs_wait_on_workgroup_freezed(struct erofs_workgroup *grp)
 
 enum erofs_kmap_type {
        EROFS_NO_KMAP,          /* don't map the buffer */
-       EROFS_KMAP,             /* use kmap() to map the buffer */
-       EROFS_KMAP_ATOMIC,      /* use kmap_atomic() to map the buffer */
+       EROFS_KMAP,             /* use kmap_local_page() to map the buffer */
 };
 
 struct erofs_buf {
index 8106bcb5a38d1199d410f48ac7a343ec2987c834..a62fb8a3318a5eb41797abc0f2621dad5455b15b 100644 (file)
@@ -148,7 +148,7 @@ static inline int xattr_iter_fixup(struct xattr_iter *it)
 
        it->blkaddr += erofs_blknr(it->ofs);
        it->kaddr = erofs_read_metabuf(&it->buf, it->sb, it->blkaddr,
-                                      EROFS_KMAP_ATOMIC);
+                                      EROFS_KMAP);
        if (IS_ERR(it->kaddr))
                return PTR_ERR(it->kaddr);
        it->ofs = erofs_blkoff(it->ofs);
@@ -174,7 +174,7 @@ static int inline_xattr_iter_begin(struct xattr_iter *it,
        it->ofs = erofs_blkoff(iloc(sbi, vi->nid) + inline_xattr_ofs);
 
        it->kaddr = erofs_read_metabuf(&it->buf, inode->i_sb, it->blkaddr,
-                                      EROFS_KMAP_ATOMIC);
+                                      EROFS_KMAP);
        if (IS_ERR(it->kaddr))
                return PTR_ERR(it->kaddr);
        return vi->xattr_isize - xattr_header_sz;
@@ -368,7 +368,7 @@ static int shared_getxattr(struct inode *inode, struct getxattr_iter *it)
 
                it->it.ofs = xattrblock_offset(sbi, vi->xattr_shared_xattrs[i]);
                it->it.kaddr = erofs_read_metabuf(&it->it.buf, sb, blkaddr,
-                                                 EROFS_KMAP_ATOMIC);
+                                                 EROFS_KMAP);
                if (IS_ERR(it->it.kaddr))
                        return PTR_ERR(it->it.kaddr);
                it->it.blkaddr = blkaddr;
@@ -580,7 +580,7 @@ static int shared_listxattr(struct listxattr_iter *it)
 
                it->it.ofs = xattrblock_offset(sbi, vi->xattr_shared_xattrs[i]);
                it->it.kaddr = erofs_read_metabuf(&it->it.buf, sb, blkaddr,
-                                                 EROFS_KMAP_ATOMIC);
+                                                 EROFS_KMAP);
                if (IS_ERR(it->it.kaddr))
                        return PTR_ERR(it->it.kaddr);
                it->it.blkaddr = blkaddr;
index 0bb66927e3d0678343da58bbd4aaa5249c1a4980..749a5ac943f4f1e4fea9dc3553ba71aa476192c0 100644 (file)
@@ -178,7 +178,7 @@ static int legacy_load_cluster_from_disk(struct z_erofs_maprecorder *m,
        unsigned int advise, type;
 
        m->kaddr = erofs_read_metabuf(&m->map->buf, inode->i_sb,
-                                     erofs_blknr(pos), EROFS_KMAP_ATOMIC);
+                                     erofs_blknr(pos), EROFS_KMAP);
        if (IS_ERR(m->kaddr))
                return PTR_ERR(m->kaddr);
 
@@ -416,7 +416,7 @@ static int compacted_load_cluster_from_disk(struct z_erofs_maprecorder *m,
 out:
        pos += lcn * (1 << amortizedshift);
        m->kaddr = erofs_read_metabuf(&m->map->buf, inode->i_sb,
-                                     erofs_blknr(pos), EROFS_KMAP_ATOMIC);
+                                     erofs_blknr(pos), EROFS_KMAP);
        if (IS_ERR(m->kaddr))
                return PTR_ERR(m->kaddr);
        return unpack_compacted_index(m, amortizedshift, pos, lookahead);