|
Lines 38-44
static vm_fault_t f2fs_filemap_fault(struct vm_fault *vmf)
Link Here
|
| 38 |
struct inode *inode = file_inode(vmf->vma->vm_file); |
38 |
struct inode *inode = file_inode(vmf->vma->vm_file); |
| 39 |
vm_fault_t ret; |
39 |
vm_fault_t ret; |
| 40 |
|
40 |
|
|
|
41 |
down_read(&F2FS_I(inode)->i_mmap_sem); |
| 41 |
ret = filemap_fault(vmf); |
42 |
ret = filemap_fault(vmf); |
|
|
43 |
up_read(&F2FS_I(inode)->i_mmap_sem); |
| 44 |
|
| 42 |
if (!ret) |
45 |
if (!ret) |
| 43 |
f2fs_update_iostat(F2FS_I_SB(inode), APP_MAPPED_READ_IO, |
46 |
f2fs_update_iostat(F2FS_I_SB(inode), APP_MAPPED_READ_IO, |
| 44 |
F2FS_BLKSIZE); |
47 |
F2FS_BLKSIZE); |
|
Lines 98-104
static vm_fault_t f2fs_vm_page_mkwrite(struct vm_fault *vmf)
Link Here
|
| 98 |
f2fs_bug_on(sbi, f2fs_has_inline_data(inode)); |
101 |
f2fs_bug_on(sbi, f2fs_has_inline_data(inode)); |
| 99 |
|
102 |
|
| 100 |
file_update_time(vmf->vma->vm_file); |
103 |
file_update_time(vmf->vma->vm_file); |
| 101 |
filemap_invalidate_lock_shared(inode->i_mapping); |
104 |
down_read(&F2FS_I(inode)->i_mmap_sem); |
| 102 |
lock_page(page); |
105 |
lock_page(page); |
| 103 |
if (unlikely(page->mapping != inode->i_mapping || |
106 |
if (unlikely(page->mapping != inode->i_mapping || |
| 104 |
page_offset(page) > i_size_read(inode) || |
107 |
page_offset(page) > i_size_read(inode) || |
|
Lines 156-162
static vm_fault_t f2fs_vm_page_mkwrite(struct vm_fault *vmf)
Link Here
|
| 156 |
|
159 |
|
| 157 |
trace_f2fs_vm_page_mkwrite(page, DATA); |
160 |
trace_f2fs_vm_page_mkwrite(page, DATA); |
| 158 |
out_sem: |
161 |
out_sem: |
| 159 |
filemap_invalidate_unlock_shared(inode->i_mapping); |
162 |
up_read(&F2FS_I(inode)->i_mmap_sem); |
| 160 |
|
163 |
|
| 161 |
sb_end_pagefault(inode->i_sb); |
164 |
sb_end_pagefault(inode->i_sb); |
| 162 |
err: |
165 |
err: |
|
Lines 936-942
int f2fs_setattr(struct user_namespace *mnt_userns, struct dentry *dentry,
Link Here
|
| 936 |
} |
939 |
} |
| 937 |
|
940 |
|
| 938 |
down_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]); |
941 |
down_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]); |
| 939 |
filemap_invalidate_lock(inode->i_mapping); |
942 |
down_write(&F2FS_I(inode)->i_mmap_sem); |
| 940 |
|
943 |
|
| 941 |
truncate_setsize(inode, attr->ia_size); |
944 |
truncate_setsize(inode, attr->ia_size); |
| 942 |
|
945 |
|
|
Lines 946-952
int f2fs_setattr(struct user_namespace *mnt_userns, struct dentry *dentry,
Link Here
|
| 946 |
* do not trim all blocks after i_size if target size is |
949 |
* do not trim all blocks after i_size if target size is |
| 947 |
* larger than i_size. |
950 |
* larger than i_size. |
| 948 |
*/ |
951 |
*/ |
| 949 |
filemap_invalidate_unlock(inode->i_mapping); |
952 |
up_write(&F2FS_I(inode)->i_mmap_sem); |
| 950 |
up_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]); |
953 |
up_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]); |
| 951 |
if (err) |
954 |
if (err) |
| 952 |
return err; |
955 |
return err; |
|
Lines 1090-1096
static int punch_hole(struct inode *inode, loff_t offset, loff_t len)
Link Here
|
| 1090 |
blk_end = (loff_t)pg_end << PAGE_SHIFT; |
1093 |
blk_end = (loff_t)pg_end << PAGE_SHIFT; |
| 1091 |
|
1094 |
|
| 1092 |
down_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]); |
1095 |
down_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]); |
| 1093 |
filemap_invalidate_lock(mapping); |
1096 |
down_write(&F2FS_I(inode)->i_mmap_sem); |
| 1094 |
|
1097 |
|
| 1095 |
truncate_pagecache_range(inode, blk_start, blk_end - 1); |
1098 |
truncate_pagecache_range(inode, blk_start, blk_end - 1); |
| 1096 |
|
1099 |
|
|
Lines 1098-1104
static int punch_hole(struct inode *inode, loff_t offset, loff_t len)
Link Here
|
| 1098 |
ret = f2fs_truncate_hole(inode, pg_start, pg_end); |
1101 |
ret = f2fs_truncate_hole(inode, pg_start, pg_end); |
| 1099 |
f2fs_unlock_op(sbi); |
1102 |
f2fs_unlock_op(sbi); |
| 1100 |
|
1103 |
|
| 1101 |
filemap_invalidate_unlock(mapping); |
1104 |
up_write(&F2FS_I(inode)->i_mmap_sem); |
| 1102 |
up_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]); |
1105 |
up_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]); |
| 1103 |
} |
1106 |
} |
| 1104 |
} |
1107 |
} |
|
Lines 1333-1339
static int f2fs_do_collapse(struct inode *inode, loff_t offset, loff_t len)
Link Here
|
| 1333 |
|
1336 |
|
| 1334 |
/* avoid gc operation during block exchange */ |
1337 |
/* avoid gc operation during block exchange */ |
| 1335 |
down_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]); |
1338 |
down_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]); |
| 1336 |
filemap_invalidate_lock(inode->i_mapping); |
1339 |
down_write(&F2FS_I(inode)->i_mmap_sem); |
| 1337 |
|
1340 |
|
| 1338 |
f2fs_lock_op(sbi); |
1341 |
f2fs_lock_op(sbi); |
| 1339 |
f2fs_drop_extent_tree(inode); |
1342 |
f2fs_drop_extent_tree(inode); |
|
Lines 1341-1347
static int f2fs_do_collapse(struct inode *inode, loff_t offset, loff_t len)
Link Here
|
| 1341 |
ret = __exchange_data_block(inode, inode, end, start, nrpages - end, true); |
1344 |
ret = __exchange_data_block(inode, inode, end, start, nrpages - end, true); |
| 1342 |
f2fs_unlock_op(sbi); |
1345 |
f2fs_unlock_op(sbi); |
| 1343 |
|
1346 |
|
| 1344 |
filemap_invalidate_unlock(inode->i_mapping); |
1347 |
up_write(&F2FS_I(inode)->i_mmap_sem); |
| 1345 |
up_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]); |
1348 |
up_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]); |
| 1346 |
return ret; |
1349 |
return ret; |
| 1347 |
} |
1350 |
} |
|
Lines 1372-1384
static int f2fs_collapse_range(struct inode *inode, loff_t offset, loff_t len)
Link Here
|
| 1372 |
return ret; |
1375 |
return ret; |
| 1373 |
|
1376 |
|
| 1374 |
/* write out all moved pages, if possible */ |
1377 |
/* write out all moved pages, if possible */ |
| 1375 |
filemap_invalidate_lock(inode->i_mapping); |
1378 |
down_write(&F2FS_I(inode)->i_mmap_sem); |
| 1376 |
filemap_write_and_wait_range(inode->i_mapping, offset, LLONG_MAX); |
1379 |
filemap_write_and_wait_range(inode->i_mapping, offset, LLONG_MAX); |
| 1377 |
truncate_pagecache(inode, offset); |
1380 |
truncate_pagecache(inode, offset); |
| 1378 |
|
1381 |
|
| 1379 |
new_size = i_size_read(inode) - len; |
1382 |
new_size = i_size_read(inode) - len; |
| 1380 |
ret = f2fs_truncate_blocks(inode, new_size, true); |
1383 |
ret = f2fs_truncate_blocks(inode, new_size, true); |
| 1381 |
filemap_invalidate_unlock(inode->i_mapping); |
1384 |
up_write(&F2FS_I(inode)->i_mmap_sem); |
| 1382 |
if (!ret) |
1385 |
if (!ret) |
| 1383 |
f2fs_i_size_write(inode, new_size); |
1386 |
f2fs_i_size_write(inode, new_size); |
| 1384 |
return ret; |
1387 |
return ret; |
|
Lines 1478-1484
static int f2fs_zero_range(struct inode *inode, loff_t offset, loff_t len,
Link Here
|
| 1478 |
pgoff_t end; |
1481 |
pgoff_t end; |
| 1479 |
|
1482 |
|
| 1480 |
down_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]); |
1483 |
down_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]); |
| 1481 |
filemap_invalidate_lock(mapping); |
1484 |
down_write(&F2FS_I(inode)->i_mmap_sem); |
| 1482 |
|
1485 |
|
| 1483 |
truncate_pagecache_range(inode, |
1486 |
truncate_pagecache_range(inode, |
| 1484 |
(loff_t)index << PAGE_SHIFT, |
1487 |
(loff_t)index << PAGE_SHIFT, |
|
Lines 1490-1496
static int f2fs_zero_range(struct inode *inode, loff_t offset, loff_t len,
Link Here
|
| 1490 |
ret = f2fs_get_dnode_of_data(&dn, index, ALLOC_NODE); |
1493 |
ret = f2fs_get_dnode_of_data(&dn, index, ALLOC_NODE); |
| 1491 |
if (ret) { |
1494 |
if (ret) { |
| 1492 |
f2fs_unlock_op(sbi); |
1495 |
f2fs_unlock_op(sbi); |
| 1493 |
filemap_invalidate_unlock(mapping); |
1496 |
up_write(&F2FS_I(inode)->i_mmap_sem); |
| 1494 |
up_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]); |
1497 |
up_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]); |
| 1495 |
goto out; |
1498 |
goto out; |
| 1496 |
} |
1499 |
} |
|
Lines 1502-1508
static int f2fs_zero_range(struct inode *inode, loff_t offset, loff_t len,
Link Here
|
| 1502 |
f2fs_put_dnode(&dn); |
1505 |
f2fs_put_dnode(&dn); |
| 1503 |
|
1506 |
|
| 1504 |
f2fs_unlock_op(sbi); |
1507 |
f2fs_unlock_op(sbi); |
| 1505 |
filemap_invalidate_unlock(mapping); |
1508 |
up_write(&F2FS_I(inode)->i_mmap_sem); |
| 1506 |
up_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]); |
1509 |
up_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]); |
| 1507 |
|
1510 |
|
| 1508 |
f2fs_balance_fs(sbi, dn.node_changed); |
1511 |
f2fs_balance_fs(sbi, dn.node_changed); |
|
Lines 1537-1543
static int f2fs_zero_range(struct inode *inode, loff_t offset, loff_t len,
Link Here
|
| 1537 |
static int f2fs_insert_range(struct inode *inode, loff_t offset, loff_t len) |
1540 |
static int f2fs_insert_range(struct inode *inode, loff_t offset, loff_t len) |
| 1538 |
{ |
1541 |
{ |
| 1539 |
struct f2fs_sb_info *sbi = F2FS_I_SB(inode); |
1542 |
struct f2fs_sb_info *sbi = F2FS_I_SB(inode); |
| 1540 |
struct address_space *mapping = inode->i_mapping; |
|
|
| 1541 |
pgoff_t nr, pg_start, pg_end, delta, idx; |
1543 |
pgoff_t nr, pg_start, pg_end, delta, idx; |
| 1542 |
loff_t new_size; |
1544 |
loff_t new_size; |
| 1543 |
int ret = 0; |
1545 |
int ret = 0; |
|
Lines 1560-1573
static int f2fs_insert_range(struct inode *inode, loff_t offset, loff_t len)
Link Here
|
| 1560 |
|
1562 |
|
| 1561 |
f2fs_balance_fs(sbi, true); |
1563 |
f2fs_balance_fs(sbi, true); |
| 1562 |
|
1564 |
|
| 1563 |
filemap_invalidate_lock(mapping); |
1565 |
down_write(&F2FS_I(inode)->i_mmap_sem); |
| 1564 |
ret = f2fs_truncate_blocks(inode, i_size_read(inode), true); |
1566 |
ret = f2fs_truncate_blocks(inode, i_size_read(inode), true); |
| 1565 |
filemap_invalidate_unlock(mapping); |
1567 |
up_write(&F2FS_I(inode)->i_mmap_sem); |
| 1566 |
if (ret) |
1568 |
if (ret) |
| 1567 |
return ret; |
1569 |
return ret; |
| 1568 |
|
1570 |
|
| 1569 |
/* write out all dirty pages from offset */ |
1571 |
/* write out all dirty pages from offset */ |
| 1570 |
ret = filemap_write_and_wait_range(mapping, offset, LLONG_MAX); |
1572 |
ret = filemap_write_and_wait_range(inode->i_mapping, offset, LLONG_MAX); |
| 1571 |
if (ret) |
1573 |
if (ret) |
| 1572 |
return ret; |
1574 |
return ret; |
| 1573 |
|
1575 |
|
|
Lines 1578-1584
static int f2fs_insert_range(struct inode *inode, loff_t offset, loff_t len)
Link Here
|
| 1578 |
|
1580 |
|
| 1579 |
/* avoid gc operation during block exchange */ |
1581 |
/* avoid gc operation during block exchange */ |
| 1580 |
down_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]); |
1582 |
down_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]); |
| 1581 |
filemap_invalidate_lock(mapping); |
1583 |
down_write(&F2FS_I(inode)->i_mmap_sem); |
| 1582 |
truncate_pagecache(inode, offset); |
1584 |
truncate_pagecache(inode, offset); |
| 1583 |
|
1585 |
|
| 1584 |
while (!ret && idx > pg_start) { |
1586 |
while (!ret && idx > pg_start) { |
|
Lines 1594-1607
static int f2fs_insert_range(struct inode *inode, loff_t offset, loff_t len)
Link Here
|
| 1594 |
idx + delta, nr, false); |
1596 |
idx + delta, nr, false); |
| 1595 |
f2fs_unlock_op(sbi); |
1597 |
f2fs_unlock_op(sbi); |
| 1596 |
} |
1598 |
} |
| 1597 |
filemap_invalidate_unlock(mapping); |
1599 |
up_write(&F2FS_I(inode)->i_mmap_sem); |
| 1598 |
up_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]); |
1600 |
up_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]); |
| 1599 |
|
1601 |
|
| 1600 |
/* write out all moved pages, if possible */ |
1602 |
/* write out all moved pages, if possible */ |
| 1601 |
filemap_invalidate_lock(mapping); |
1603 |
down_write(&F2FS_I(inode)->i_mmap_sem); |
| 1602 |
filemap_write_and_wait_range(mapping, offset, LLONG_MAX); |
1604 |
filemap_write_and_wait_range(inode->i_mapping, offset, LLONG_MAX); |
| 1603 |
truncate_pagecache(inode, offset); |
1605 |
truncate_pagecache(inode, offset); |
| 1604 |
filemap_invalidate_unlock(mapping); |
1606 |
up_write(&F2FS_I(inode)->i_mmap_sem); |
| 1605 |
|
1607 |
|
| 1606 |
if (!ret) |
1608 |
if (!ret) |
| 1607 |
f2fs_i_size_write(inode, new_size); |
1609 |
f2fs_i_size_write(inode, new_size); |
|
Lines 3435-3441
static int f2fs_release_compress_blocks(struct file *filp, unsigned long arg)
Link Here
|
| 3435 |
goto out; |
3437 |
goto out; |
| 3436 |
|
3438 |
|
| 3437 |
down_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]); |
3439 |
down_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]); |
| 3438 |
filemap_invalidate_lock(inode->i_mapping); |
3440 |
down_write(&F2FS_I(inode)->i_mmap_sem); |
| 3439 |
|
3441 |
|
| 3440 |
last_idx = DIV_ROUND_UP(i_size_read(inode), PAGE_SIZE); |
3442 |
last_idx = DIV_ROUND_UP(i_size_read(inode), PAGE_SIZE); |
| 3441 |
|
3443 |
|
|
Lines 3471-3477
static int f2fs_release_compress_blocks(struct file *filp, unsigned long arg)
Link Here
|
| 3471 |
} |
3473 |
} |
| 3472 |
|
3474 |
|
| 3473 |
up_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]); |
3475 |
up_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]); |
| 3474 |
filemap_invalidate_unlock(inode->i_mapping); |
3476 |
up_write(&F2FS_I(inode)->i_mmap_sem); |
| 3475 |
out: |
3477 |
out: |
| 3476 |
inode_unlock(inode); |
3478 |
inode_unlock(inode); |
| 3477 |
|
3479 |
|
|
Lines 3588-3594
static int f2fs_reserve_compress_blocks(struct file *filp, unsigned long arg)
Link Here
|
| 3588 |
} |
3590 |
} |
| 3589 |
|
3591 |
|
| 3590 |
down_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]); |
3592 |
down_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]); |
| 3591 |
filemap_invalidate_lock(inode->i_mapping); |
3593 |
down_write(&F2FS_I(inode)->i_mmap_sem); |
| 3592 |
|
3594 |
|
| 3593 |
last_idx = DIV_ROUND_UP(i_size_read(inode), PAGE_SIZE); |
3595 |
last_idx = DIV_ROUND_UP(i_size_read(inode), PAGE_SIZE); |
| 3594 |
|
3596 |
|
|
Lines 3624-3630
static int f2fs_reserve_compress_blocks(struct file *filp, unsigned long arg)
Link Here
|
| 3624 |
} |
3626 |
} |
| 3625 |
|
3627 |
|
| 3626 |
up_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]); |
3628 |
up_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]); |
| 3627 |
filemap_invalidate_unlock(inode->i_mapping); |
3629 |
up_write(&F2FS_I(inode)->i_mmap_sem); |
| 3628 |
|
3630 |
|
| 3629 |
if (ret >= 0) { |
3631 |
if (ret >= 0) { |
| 3630 |
clear_inode_flag(inode, FI_COMPRESS_RELEASED); |
3632 |
clear_inode_flag(inode, FI_COMPRESS_RELEASED); |
|
Lines 3743-3749
static int f2fs_sec_trim_file(struct file *filp, unsigned long arg)
Link Here
|
| 3743 |
goto err; |
3745 |
goto err; |
| 3744 |
|
3746 |
|
| 3745 |
down_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]); |
3747 |
down_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]); |
| 3746 |
filemap_invalidate_lock(mapping); |
3748 |
down_write(&F2FS_I(inode)->i_mmap_sem); |
| 3747 |
|
3749 |
|
| 3748 |
ret = filemap_write_and_wait_range(mapping, range.start, |
3750 |
ret = filemap_write_and_wait_range(mapping, range.start, |
| 3749 |
to_end ? LLONG_MAX : end_addr - 1); |
3751 |
to_end ? LLONG_MAX : end_addr - 1); |
|
Lines 3830-3836
static int f2fs_sec_trim_file(struct file *filp, unsigned long arg)
Link Here
|
| 3830 |
ret = f2fs_secure_erase(prev_bdev, inode, prev_index, |
3832 |
ret = f2fs_secure_erase(prev_bdev, inode, prev_index, |
| 3831 |
prev_block, len, range.flags); |
3833 |
prev_block, len, range.flags); |
| 3832 |
out: |
3834 |
out: |
| 3833 |
filemap_invalidate_unlock(mapping); |
3835 |
up_write(&F2FS_I(inode)->i_mmap_sem); |
| 3834 |
up_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]); |
3836 |
up_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]); |
| 3835 |
err: |
3837 |
err: |
| 3836 |
inode_unlock(inode); |
3838 |
inode_unlock(inode); |
|
Lines 4308-4316
static ssize_t f2fs_file_write_iter(struct kiocb *iocb, struct iov_iter *from)
Link Here
|
| 4308 |
/* if we couldn't write data, we should deallocate blocks. */ |
4310 |
/* if we couldn't write data, we should deallocate blocks. */ |
| 4309 |
if (preallocated && i_size_read(inode) < target_size) { |
4311 |
if (preallocated && i_size_read(inode) < target_size) { |
| 4310 |
down_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]); |
4312 |
down_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]); |
| 4311 |
filemap_invalidate_lock(inode->i_mapping); |
4313 |
down_write(&F2FS_I(inode)->i_mmap_sem); |
| 4312 |
f2fs_truncate(inode); |
4314 |
f2fs_truncate(inode); |
| 4313 |
filemap_invalidate_unlock(inode->i_mapping); |
4315 |
up_write(&F2FS_I(inode)->i_mmap_sem); |
| 4314 |
up_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]); |
4316 |
up_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]); |
| 4315 |
} |
4317 |
} |
| 4316 |
|
4318 |
|