Bugzilla – Attachment 859551 Details for
Bug 1200450
F2FS source code bug
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Forgot Password
[patch]
Revert f2fs-Convert-to-using-invalidate_lock.patch
revert-f2fs-Convert-to-using-invalidate_lock.patch (text/plain), 11.05 KB, created by
Twój
on 2022-06-13 10:07:47 UTC
(
hide
)
Description:
Revert f2fs-Convert-to-using-invalidate_lock.patch
Filename:
MIME Type:
Creator:
Twój
Created:
2022-06-13 10:07:47 UTC
Size:
11.05 KB
patch
obsolete
>diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c >index dd600b4..a86f004 100644 >--- a/fs/f2fs/data.c >+++ b/fs/f2fs/data.c >@@ -3207,12 +3207,12 @@ static void f2fs_write_failed(struct address_space *mapping, loff_t to) > /* In the fs-verity case, f2fs_end_enable_verity() does the truncate */ > if (to > i_size && !f2fs_verity_in_progress(inode)) { > down_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]); >- filemap_invalidate_lock(mapping); >+ down_write(&F2FS_I(inode)->i_mmap_sem); > > truncate_pagecache(inode, i_size); > f2fs_truncate_blocks(inode, i_size, true); > >- filemap_invalidate_unlock(mapping); >+ up_write(&F2FS_I(inode)->i_mmap_sem); > up_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]); > } > } >@@ -3872,7 +3872,7 @@ static int f2fs_migrate_blocks(struct inode *inode, block_t start_blk, > int ret = 0; > > down_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]); >- filemap_invalidate_lock(inode->i_mapping); >+ down_write(&F2FS_I(inode)->i_mmap_sem); > > set_inode_flag(inode, FI_ALIGNED_WRITE); > >@@ -3914,7 +3914,7 @@ static int f2fs_migrate_blocks(struct inode *inode, block_t start_blk, > clear_inode_flag(inode, FI_DO_DEFRAG); > clear_inode_flag(inode, FI_ALIGNED_WRITE); > >- filemap_invalidate_unlock(inode->i_mapping); >+ up_write(&F2FS_I(inode)->i_mmap_sem); > up_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]); > > return ret; >diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h >index 424d139..db95829 100644 >--- a/fs/f2fs/f2fs.h >+++ b/fs/f2fs/f2fs.h >@@ -755,6 +755,7 @@ struct f2fs_inode_info { > > /* avoid racing between foreground op and gc */ > struct rw_semaphore i_gc_rwsem[2]; >+ struct rw_semaphore i_mmap_sem; > struct rw_semaphore i_xattr_sem; /* avoid racing between reading and changing EAs */ > > int i_extra_isize; /* size of extra space located in i_addr */ >diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c >index 9ae81fd..74f934d 100644 >--- a/fs/f2fs/file.c >+++ b/fs/f2fs/file.c >@@ -38,7 +38,10 @@ static vm_fault_t f2fs_filemap_fault(struct vm_fault *vmf) > struct inode *inode = file_inode(vmf->vma->vm_file); > vm_fault_t ret; > >+ down_read(&F2FS_I(inode)->i_mmap_sem); > ret = filemap_fault(vmf); >+ up_read(&F2FS_I(inode)->i_mmap_sem); >+ > if (!ret) > f2fs_update_iostat(F2FS_I_SB(inode), APP_MAPPED_READ_IO, > F2FS_BLKSIZE); >@@ -98,7 +101,7 @@ static vm_fault_t f2fs_vm_page_mkwrite(struct vm_fault *vmf) > f2fs_bug_on(sbi, f2fs_has_inline_data(inode)); > > file_update_time(vmf->vma->vm_file); >- filemap_invalidate_lock_shared(inode->i_mapping); >+ down_read(&F2FS_I(inode)->i_mmap_sem); > lock_page(page); > if (unlikely(page->mapping != inode->i_mapping || > page_offset(page) > i_size_read(inode) || >@@ -156,7 +159,7 @@ static vm_fault_t f2fs_vm_page_mkwrite(struct vm_fault *vmf) > > trace_f2fs_vm_page_mkwrite(page, DATA); > out_sem: >- filemap_invalidate_unlock_shared(inode->i_mapping); >+ up_read(&F2FS_I(inode)->i_mmap_sem); > > sb_end_pagefault(inode->i_sb); > err: >@@ -936,7 +939,7 @@ int f2fs_setattr(struct user_namespace *mnt_userns, struct dentry *dentry, > } > > down_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]); >- filemap_invalidate_lock(inode->i_mapping); >+ down_write(&F2FS_I(inode)->i_mmap_sem); > > truncate_setsize(inode, attr->ia_size); > >@@ -946,7 +949,7 @@ int f2fs_setattr(struct user_namespace *mnt_userns, struct dentry *dentry, > * do not trim all blocks after i_size if target size is > * larger than i_size. > */ >- filemap_invalidate_unlock(inode->i_mapping); >+ up_write(&F2FS_I(inode)->i_mmap_sem); > up_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]); > if (err) > return err; >@@ -1090,7 +1093,7 @@ static int punch_hole(struct inode *inode, loff_t offset, loff_t len) > blk_end = (loff_t)pg_end << PAGE_SHIFT; > > down_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]); >- filemap_invalidate_lock(mapping); >+ down_write(&F2FS_I(inode)->i_mmap_sem); > > truncate_pagecache_range(inode, blk_start, blk_end - 1); > >@@ -1098,7 +1101,7 @@ static int punch_hole(struct inode *inode, loff_t offset, loff_t len) > ret = f2fs_truncate_hole(inode, pg_start, pg_end); > f2fs_unlock_op(sbi); > >- filemap_invalidate_unlock(mapping); >+ up_write(&F2FS_I(inode)->i_mmap_sem); > up_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]); > } > } >@@ -1333,7 +1336,7 @@ static int f2fs_do_collapse(struct inode *inode, loff_t offset, loff_t len) > > /* avoid gc operation during block exchange */ > down_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]); >- filemap_invalidate_lock(inode->i_mapping); >+ down_write(&F2FS_I(inode)->i_mmap_sem); > > f2fs_lock_op(sbi); > f2fs_drop_extent_tree(inode); >@@ -1341,7 +1344,7 @@ static int f2fs_do_collapse(struct inode *inode, loff_t offset, loff_t len) > ret = __exchange_data_block(inode, inode, end, start, nrpages - end, true); > f2fs_unlock_op(sbi); > >- filemap_invalidate_unlock(inode->i_mapping); >+ up_write(&F2FS_I(inode)->i_mmap_sem); > up_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]); > return ret; > } >@@ -1372,13 +1375,13 @@ static int f2fs_collapse_range(struct inode *inode, loff_t offset, loff_t len) > return ret; > > /* write out all moved pages, if possible */ >- filemap_invalidate_lock(inode->i_mapping); >+ down_write(&F2FS_I(inode)->i_mmap_sem); > filemap_write_and_wait_range(inode->i_mapping, offset, LLONG_MAX); > truncate_pagecache(inode, offset); > > new_size = i_size_read(inode) - len; > ret = f2fs_truncate_blocks(inode, new_size, true); >- filemap_invalidate_unlock(inode->i_mapping); >+ up_write(&F2FS_I(inode)->i_mmap_sem); > if (!ret) > f2fs_i_size_write(inode, new_size); > return ret; >@@ -1478,7 +1481,7 @@ static int f2fs_zero_range(struct inode *inode, loff_t offset, loff_t len, > pgoff_t end; > > down_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]); >- filemap_invalidate_lock(mapping); >+ down_write(&F2FS_I(inode)->i_mmap_sem); > > truncate_pagecache_range(inode, > (loff_t)index << PAGE_SHIFT, >@@ -1490,7 +1493,7 @@ static int f2fs_zero_range(struct inode *inode, loff_t offset, loff_t len, > ret = f2fs_get_dnode_of_data(&dn, index, ALLOC_NODE); > if (ret) { > f2fs_unlock_op(sbi); >- filemap_invalidate_unlock(mapping); >+ up_write(&F2FS_I(inode)->i_mmap_sem); > up_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]); > goto out; > } >@@ -1502,7 +1505,7 @@ static int f2fs_zero_range(struct inode *inode, loff_t offset, loff_t len, > f2fs_put_dnode(&dn); > > f2fs_unlock_op(sbi); >- filemap_invalidate_unlock(mapping); >+ up_write(&F2FS_I(inode)->i_mmap_sem); > up_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]); > > f2fs_balance_fs(sbi, dn.node_changed); >@@ -1537,7 +1540,6 @@ static int f2fs_zero_range(struct inode *inode, loff_t offset, loff_t len, > static int f2fs_insert_range(struct inode *inode, loff_t offset, loff_t len) > { > struct f2fs_sb_info *sbi = F2FS_I_SB(inode); >- struct address_space *mapping = inode->i_mapping; > pgoff_t nr, pg_start, pg_end, delta, idx; > loff_t new_size; > int ret = 0; >@@ -1560,14 +1562,14 @@ static int f2fs_insert_range(struct inode *inode, loff_t offset, loff_t len) > > f2fs_balance_fs(sbi, true); > >- filemap_invalidate_lock(mapping); >+ down_write(&F2FS_I(inode)->i_mmap_sem); > ret = f2fs_truncate_blocks(inode, i_size_read(inode), true); >- filemap_invalidate_unlock(mapping); >+ up_write(&F2FS_I(inode)->i_mmap_sem); > if (ret) > return ret; > > /* write out all dirty pages from offset */ >- ret = filemap_write_and_wait_range(mapping, offset, LLONG_MAX); >+ ret = filemap_write_and_wait_range(inode->i_mapping, offset, LLONG_MAX); > if (ret) > return ret; > >@@ -1578,7 +1580,7 @@ static int f2fs_insert_range(struct inode *inode, loff_t offset, loff_t len) > > /* avoid gc operation during block exchange */ > down_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]); >- filemap_invalidate_lock(mapping); >+ down_write(&F2FS_I(inode)->i_mmap_sem); > truncate_pagecache(inode, offset); > > while (!ret && idx > pg_start) { >@@ -1594,14 +1596,14 @@ static int f2fs_insert_range(struct inode *inode, loff_t offset, loff_t len) > idx + delta, nr, false); > f2fs_unlock_op(sbi); > } >- filemap_invalidate_unlock(mapping); >+ up_write(&F2FS_I(inode)->i_mmap_sem); > up_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]); > > /* write out all moved pages, if possible */ >- filemap_invalidate_lock(mapping); >- filemap_write_and_wait_range(mapping, offset, LLONG_MAX); >+ down_write(&F2FS_I(inode)->i_mmap_sem); >+ filemap_write_and_wait_range(inode->i_mapping, offset, LLONG_MAX); > truncate_pagecache(inode, offset); >- filemap_invalidate_unlock(mapping); >+ up_write(&F2FS_I(inode)->i_mmap_sem); > > if (!ret) > f2fs_i_size_write(inode, new_size); >@@ -3435,7 +3437,7 @@ static int f2fs_release_compress_blocks(struct file *filp, unsigned long arg) > goto out; > > down_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]); >- filemap_invalidate_lock(inode->i_mapping); >+ down_write(&F2FS_I(inode)->i_mmap_sem); > > last_idx = DIV_ROUND_UP(i_size_read(inode), PAGE_SIZE); > >@@ -3471,7 +3473,7 @@ static int f2fs_release_compress_blocks(struct file *filp, unsigned long arg) > } > > up_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]); >- filemap_invalidate_unlock(inode->i_mapping); >+ up_write(&F2FS_I(inode)->i_mmap_sem); > out: > inode_unlock(inode); > >@@ -3588,7 +3590,7 @@ static int f2fs_reserve_compress_blocks(struct file *filp, unsigned long arg) > } > > down_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]); >- filemap_invalidate_lock(inode->i_mapping); >+ down_write(&F2FS_I(inode)->i_mmap_sem); > > last_idx = DIV_ROUND_UP(i_size_read(inode), PAGE_SIZE); > >@@ -3624,7 +3626,7 @@ static int f2fs_reserve_compress_blocks(struct file *filp, unsigned long arg) > } > > up_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]); >- filemap_invalidate_unlock(inode->i_mapping); >+ up_write(&F2FS_I(inode)->i_mmap_sem); > > if (ret >= 0) { > clear_inode_flag(inode, FI_COMPRESS_RELEASED); >@@ -3743,7 +3745,7 @@ static int f2fs_sec_trim_file(struct file *filp, unsigned long arg) > goto err; > > down_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]); >- filemap_invalidate_lock(mapping); >+ down_write(&F2FS_I(inode)->i_mmap_sem); > > ret = filemap_write_and_wait_range(mapping, range.start, > to_end ? LLONG_MAX : end_addr - 1); >@@ -3830,7 +3832,7 @@ static int f2fs_sec_trim_file(struct file *filp, unsigned long arg) > ret = f2fs_secure_erase(prev_bdev, inode, prev_index, > prev_block, len, range.flags); > out: >- filemap_invalidate_unlock(mapping); >+ up_write(&F2FS_I(inode)->i_mmap_sem); > up_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]); > err: > inode_unlock(inode); >@@ -4308,9 +4310,9 @@ static ssize_t f2fs_file_write_iter(struct kiocb *iocb, struct iov_iter *from) > /* if we couldn't write data, we should deallocate blocks. */ > if (preallocated && i_size_read(inode) < target_size) { > down_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]); >- filemap_invalidate_lock(inode->i_mapping); >+ down_write(&F2FS_I(inode)->i_mmap_sem); > f2fs_truncate(inode); >- filemap_invalidate_unlock(inode->i_mapping); >+ up_write(&F2FS_I(inode)->i_mmap_sem); > up_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]); > } > >diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c >index 86c6e75..187e345 100644 >--- a/fs/f2fs/super.c >+++ b/fs/f2fs/super.c >@@ -1289,6 +1289,7 @@ static struct inode *f2fs_alloc_inode(struct super_block *sb) > mutex_init(&fi->inmem_lock); > init_rwsem(&fi->i_gc_rwsem[READ]); > init_rwsem(&fi->i_gc_rwsem[WRITE]); >+ init_rwsem(&fi->i_mmap_sem); > init_rwsem(&fi->i_xattr_sem); > > /* Will be used by directory only */
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
Actions:
View
|
Diff
Attachments on
bug 1200450
: 859551