Lines Matching +full:skip +full:- +full:recall
1 // SPDX-License-Identifier: GPL-2.0-or-later
43 int err = -EIO; in ocfs2_symlink_get_block()
48 struct ocfs2_super *osb = OCFS2_SB(inode->i_sb); in ocfs2_symlink_get_block()
51 (unsigned long long)OCFS2_I(inode)->ip_blkno, in ocfs2_symlink_get_block()
56 if ((iblock << inode->i_sb->s_blocksize_bits) > PATH_MAX + 1) { in ocfs2_symlink_get_block()
67 fe = (struct ocfs2_dinode *) bh->b_data; in ocfs2_symlink_get_block()
69 if ((u64)iblock >= ocfs2_clusters_to_blocks(inode->i_sb, in ocfs2_symlink_get_block()
70 le32_to_cpu(fe->i_clusters))) { in ocfs2_symlink_get_block()
71 err = -ENOMEM; in ocfs2_symlink_get_block()
80 u64 blkno = le64_to_cpu(fe->id2.i_list.l_recs[0].e_blkno) + in ocfs2_symlink_get_block()
82 buffer_cache_bh = sb_getblk(osb->sb, blkno); in ocfs2_symlink_get_block()
84 err = -ENOMEM; in ocfs2_symlink_get_block()
94 memcpy_to_folio(bh_result->b_folio, in ocfs2_symlink_get_block()
95 bh_result->b_size * iblock, in ocfs2_symlink_get_block()
96 buffer_cache_bh->b_data, in ocfs2_symlink_get_block()
97 bh_result->b_size); in ocfs2_symlink_get_block()
103 map_bh(bh_result, inode->i_sb, in ocfs2_symlink_get_block()
104 le64_to_cpu(fe->id2.i_list.l_recs[0].e_blkno) + iblock); in ocfs2_symlink_get_block()
120 down_read(&oi->ip_alloc_sem); in ocfs2_lock_get_block()
122 up_read(&oi->ip_alloc_sem); in ocfs2_lock_get_block()
132 u64 max_blocks = bh_result->b_size >> inode->i_blkbits; in ocfs2_get_block()
134 struct ocfs2_super *osb = OCFS2_SB(inode->i_sb); in ocfs2_get_block()
136 trace_ocfs2_get_block((unsigned long long)OCFS2_I(inode)->ip_blkno, in ocfs2_get_block()
139 if (OCFS2_I(inode)->ip_flags & OCFS2_INODE_SYSTEM_FILE) in ocfs2_get_block()
141 inode, inode->i_ino); in ocfs2_get_block()
143 if (S_ISLNK(inode->i_mode)) { in ocfs2_get_block()
161 * ocfs2 never allocates in this function - the only time we in ocfs2_get_block()
179 map_bh(bh_result, inode->i_sb, p_blkno); in ocfs2_get_block()
181 bh_result->b_size = count << inode->i_blkbits; in ocfs2_get_block()
185 err = -EIO; in ocfs2_get_block()
190 (unsigned long long)OCFS2_I(inode)->ip_blkno); in ocfs2_get_block()
191 …, "Size %llu, clusters %u\n", (unsigned long long)i_size_read(inode), OCFS2_I(inode)->ip_clusters); in ocfs2_get_block()
197 past_eof = ocfs2_blocks_for_bytes(inode->i_sb, i_size_read(inode)); in ocfs2_get_block()
199 trace_ocfs2_get_block_end((unsigned long long)OCFS2_I(inode)->ip_blkno, in ocfs2_get_block()
206 err = -EIO; in ocfs2_get_block()
215 struct ocfs2_dinode *di = (struct ocfs2_dinode *)di_bh->b_data; in ocfs2_read_inline_data()
217 if (!(le16_to_cpu(di->i_dyn_features) & OCFS2_INLINE_DATA_FL)) { in ocfs2_read_inline_data()
218 ocfs2_error(inode->i_sb, "Inode %llu lost inline data flag\n", in ocfs2_read_inline_data()
219 (unsigned long long)OCFS2_I(inode)->ip_blkno); in ocfs2_read_inline_data()
220 return -EROFS; in ocfs2_read_inline_data()
226 size > ocfs2_max_inline_data_with_xattr(inode->i_sb, di)) { in ocfs2_read_inline_data()
227 ocfs2_error(inode->i_sb, in ocfs2_read_inline_data()
229 (unsigned long long)OCFS2_I(inode)->ip_blkno, in ocfs2_read_inline_data()
231 return -EROFS; in ocfs2_read_inline_data()
234 folio_fill_tail(folio, 0, di->id2.i_data.id_data, size); in ocfs2_read_inline_data()
246 BUG_ON(!(OCFS2_I(inode)->ip_dyn_features & OCFS2_INLINE_DATA_FL)); in ocfs2_readpage_inline()
264 struct inode *inode = folio->mapping->host; in ocfs2_read_folio()
269 trace_ocfs2_readpage((unsigned long long)oi->ip_blkno, folio->index); in ocfs2_read_folio()
279 if (down_read_trylock(&oi->ip_alloc_sem) == 0) { in ocfs2_read_folio()
287 down_read(&oi->ip_alloc_sem); in ocfs2_read_folio()
288 up_read(&oi->ip_alloc_sem); in ocfs2_read_folio()
295 * block_read_full_folio->get_block freaks out if it is asked to read in ocfs2_read_folio()
297 * (generic_file_read, vm_ops->fault) are clever enough to check i_size in ocfs2_read_folio()
309 if (oi->ip_dyn_features & OCFS2_INLINE_DATA_FL) in ocfs2_read_folio()
316 up_read(&oi->ip_alloc_sem); in ocfs2_read_folio()
326 * This is used only for read-ahead. Failures or difficult to handle
329 * Right now, we don't bother with BH_Boundary - in-inode extent lists
337 struct inode *inode = rac->mapping->host; in ocfs2_readahead()
348 if (down_read_trylock(&oi->ip_alloc_sem) == 0) in ocfs2_readahead()
352 * Don't bother with inline-data. There isn't anything in ocfs2_readahead()
353 * to read-ahead in that case anyway... in ocfs2_readahead()
355 if (oi->ip_dyn_features & OCFS2_INLINE_DATA_FL) in ocfs2_readahead()
359 * Check whether a remote node truncated this file - we just in ocfs2_readahead()
368 up_read(&oi->ip_alloc_sem); in ocfs2_readahead()
378 * ->writepages is called during the process of invalidating the page cache
393 * their fixes when they happen) --Mark */
404 unsigned blocksize = head->b_size; in walk_page_buffers()
412 next = bh->b_this_page; in walk_page_buffers()
431 struct inode *inode = mapping->host; in ocfs2_bmap()
433 trace_ocfs2_bmap((unsigned long long)OCFS2_I(inode)->ip_blkno, in ocfs2_bmap()
437 * The swap code (ab-)uses ->bmap to get a block mapping and then in ocfs2_bmap()
439 * that on refcounted inodes, so we have to skip out here. And yes, in ocfs2_bmap()
451 if (err != -ENOENT) in ocfs2_bmap()
455 down_read(&OCFS2_I(inode)->ip_alloc_sem); in ocfs2_bmap()
458 if (!(OCFS2_I(inode)->ip_dyn_features & OCFS2_INLINE_DATA_FL)) in ocfs2_bmap()
463 up_read(&OCFS2_I(inode)->ip_alloc_sem); in ocfs2_bmap()
494 if (unlikely(PAGE_SHIFT > osb->s_clustersize_bits)) { in ocfs2_figure_cluster_boundaries()
497 cpp = 1 << (PAGE_SHIFT - osb->s_clustersize_bits); in ocfs2_figure_cluster_boundaries()
500 cluster_start = cluster_start << osb->s_clustersize_bits; in ocfs2_figure_cluster_boundaries()
502 cluster_end = cluster_start + osb->s_clustersize; in ocfs2_figure_cluster_boundaries()
535 memset(kaddr + cluster_start, 0, from - cluster_start); in ocfs2_clear_folio_regions()
537 memset(kaddr + to, 0, cluster_end - to); in ocfs2_clear_folio_regions()
539 memset(kaddr + cluster_start, 0, cluster_end - cluster_start); in ocfs2_clear_folio_regions()
549 * read-in the blocks at the tail of our file. Avoid reading them by
557 if (ocfs2_sparse_alloc(OCFS2_SB(inode->i_sb))) in ocfs2_should_read_blk()
571 * This will also skip zeroing, which is handled externally.
587 bh = bh->b_this_page, block_start += bsize) { in ocfs2_map_folio_blocks()
593 * Ignore blocks outside of our i/o range - in ocfs2_map_folio_blocks()
610 map_bh(bh, inode->i_sb, *p_blkno); in ocfs2_map_folio_blocks()
628 * If we issued read requests - let them complete. in ocfs2_map_folio_blocks()
631 wait_on_buffer(*--wait_bh); in ocfs2_map_folio_blocks()
633 ret = -EIO; in ocfs2_map_folio_blocks()
640 * If we get -EIO above, zero out any newly allocated blocks in ocfs2_map_folio_blocks()
652 folio_zero_range(folio, block_start, bh->b_size); in ocfs2_map_folio_blocks()
658 bh = bh->b_this_page; in ocfs2_map_folio_blocks()
746 * IMHO -Mark
780 if (wc->w_target_locked) { in ocfs2_unlock_folios()
781 BUG_ON(!wc->w_target_folio); in ocfs2_unlock_folios()
782 for (i = 0; i < wc->w_num_folios; i++) { in ocfs2_unlock_folios()
783 if (wc->w_target_folio == wc->w_folios[i]) { in ocfs2_unlock_folios()
784 wc->w_folios[i] = NULL; in ocfs2_unlock_folios()
788 folio_mark_accessed(wc->w_target_folio); in ocfs2_unlock_folios()
789 folio_put(wc->w_target_folio); in ocfs2_unlock_folios()
791 ocfs2_unlock_and_free_folios(wc->w_folios, wc->w_num_folios); in ocfs2_unlock_folios()
801 list_del(&ue->ue_node); in ocfs2_free_unwritten_list()
802 spin_lock(&oi->ip_lock); in ocfs2_free_unwritten_list()
803 list_del(&ue->ue_ip_node); in ocfs2_free_unwritten_list()
804 spin_unlock(&oi->ip_lock); in ocfs2_free_unwritten_list()
812 ocfs2_free_unwritten_list(inode, &wc->w_unwritten_list); in ocfs2_free_write_ctxt()
814 brelse(wc->w_di_bh); in ocfs2_free_write_ctxt()
828 return -ENOMEM; in ocfs2_alloc_write_ctxt()
830 wc->w_cpos = pos >> osb->s_clustersize_bits; in ocfs2_alloc_write_ctxt()
831 wc->w_first_new_cpos = UINT_MAX; in ocfs2_alloc_write_ctxt()
832 cend = (pos + len - 1) >> osb->s_clustersize_bits; in ocfs2_alloc_write_ctxt()
833 wc->w_clen = cend - wc->w_cpos + 1; in ocfs2_alloc_write_ctxt()
835 wc->w_di_bh = di_bh; in ocfs2_alloc_write_ctxt()
836 wc->w_type = type; in ocfs2_alloc_write_ctxt()
838 if (unlikely(PAGE_SHIFT > osb->s_clustersize_bits)) in ocfs2_alloc_write_ctxt()
839 wc->w_large_pages = 1; in ocfs2_alloc_write_ctxt()
841 wc->w_large_pages = 0; in ocfs2_alloc_write_ctxt()
843 ocfs2_init_dealloc_ctxt(&wc->w_dealloc); in ocfs2_alloc_write_ctxt()
844 INIT_LIST_HEAD(&wc->w_unwritten_list); in ocfs2_alloc_write_ctxt()
869 block_end = block_start + bh->b_size; in ocfs2_zero_new_buffers()
889 bh = bh->b_this_page; in ocfs2_zero_new_buffers()
902 unsigned from = user_pos & (PAGE_SIZE - 1), in ocfs2_write_failure()
905 if (wc->w_target_folio) in ocfs2_write_failure()
906 ocfs2_zero_new_buffers(wc->w_target_folio, from, to); in ocfs2_write_failure()
908 for (i = 0; i < wc->w_num_folios; i++) { in ocfs2_write_failure()
909 struct folio *folio = wc->w_folios[i]; in ocfs2_write_failure()
913 ocfs2_jbd2_inode_add_write(wc->w_handle, inode, in ocfs2_write_failure()
930 ocfs2_figure_cluster_boundaries(OCFS2_SB(inode->i_sb), cpos, in ocfs2_prepare_folio_for_write()
939 if (folio == wc->w_target_folio) { in ocfs2_prepare_folio_for_write()
940 map_from = user_pos & (PAGE_SIZE - 1); in ocfs2_prepare_folio_for_write()
982 * Above, we have also rewritten 'to' and 'from' - as far as in ocfs2_prepare_folio_for_write()
986 * We can skip this if the folio is uptodate - it's already in ocfs2_prepare_folio_for_write()
990 ocfs2_clear_folio_regions(folio, OCFS2_SB(inode->i_sb), in ocfs2_prepare_folio_for_write()
1008 struct inode *inode = mapping->host; in ocfs2_grab_folios_for_write()
1021 wc->w_num_folios = ocfs2_pages_per_cluster(inode->i_sb); in ocfs2_grab_folios_for_write()
1022 start = ocfs2_align_clusters_to_page_index(inode->i_sb, cpos); in ocfs2_grab_folios_for_write()
1030 end_index = ((last_byte - 1) >> PAGE_SHIFT) + 1; in ocfs2_grab_folios_for_write()
1031 if ((start + wc->w_num_folios) > end_index) in ocfs2_grab_folios_for_write()
1032 wc->w_num_folios = end_index - start; in ocfs2_grab_folios_for_write()
1034 wc->w_num_folios = 1; in ocfs2_grab_folios_for_write()
1037 end_index = (user_pos + user_len - 1) >> PAGE_SHIFT; in ocfs2_grab_folios_for_write()
1039 for(i = 0; i < wc->w_num_folios; i++) { in ocfs2_grab_folios_for_write()
1043 wc->w_type == OCFS2_WRITE_MMAP) { in ocfs2_grab_folios_for_write()
1052 if (mmap_folio->mapping != mapping) { in ocfs2_grab_folios_for_write()
1053 WARN_ON(mmap_folio->mapping); in ocfs2_grab_folios_for_write()
1055 ret = -EAGAIN; in ocfs2_grab_folios_for_write()
1060 wc->w_folios[i] = mmap_folio; in ocfs2_grab_folios_for_write()
1061 wc->w_target_locked = true; in ocfs2_grab_folios_for_write()
1063 wc->w_type == OCFS2_WRITE_DIRECT) { in ocfs2_grab_folios_for_write()
1065 wc->w_folios[i] = NULL; in ocfs2_grab_folios_for_write()
1068 wc->w_folios[i] = __filemap_get_folio(mapping, index, in ocfs2_grab_folios_for_write()
1071 if (IS_ERR(wc->w_folios[i])) { in ocfs2_grab_folios_for_write()
1072 ret = PTR_ERR(wc->w_folios[i]); in ocfs2_grab_folios_for_write()
1074 wc->w_folios[i] = NULL; in ocfs2_grab_folios_for_write()
1078 folio_wait_stable(wc->w_folios[i]); in ocfs2_grab_folios_for_write()
1081 wc->w_target_folio = wc->w_folios[i]; in ocfs2_grab_folios_for_write()
1085 wc->w_target_locked = false; in ocfs2_grab_folios_for_write()
1103 struct inode *inode = mapping->host; in ocfs2_write_cluster()
1105 int bpc = ocfs2_clusters_to_blocks(inode->i_sb, 1); in ocfs2_write_cluster()
1111 * This is safe to call with the page locks - it won't take in ocfs2_write_cluster()
1115 ret = ocfs2_add_inode_data(OCFS2_SB(inode->i_sb), inode, in ocfs2_write_cluster()
1117 wc->w_di_bh, wc->w_handle, in ocfs2_write_cluster()
1125 * If need be, we could handle -EAGAIN for a in ocfs2_write_cluster()
1128 mlog_bug_on_msg(ret == -EAGAIN, in ocfs2_write_cluster()
1130 (unsigned long long)OCFS2_I(inode)->ip_blkno); in ocfs2_write_cluster()
1137 wc->w_di_bh); in ocfs2_write_cluster()
1139 wc->w_handle, cpos, 1, *phys, in ocfs2_write_cluster()
1140 meta_ac, &wc->w_dealloc); in ocfs2_write_cluster()
1155 (unsigned long long)OCFS2_I(inode)->ip_blkno, cpos); in ocfs2_write_cluster()
1161 p_blkno = ocfs2_clusters_to_blocks(inode->i_sb, *phys); in ocfs2_write_cluster()
1163 p_blkno += (user_pos >> inode->i_sb->s_blocksize_bits) & (u64)(bpc - 1); in ocfs2_write_cluster()
1165 for (i = 0; i < wc->w_num_folios; i++) { in ocfs2_write_cluster()
1169 if (wc->w_folios[i] == NULL) { in ocfs2_write_cluster()
1170 p_blkno += (1 << (PAGE_SHIFT - inode->i_sb->s_blocksize_bits)); in ocfs2_write_cluster()
1175 wc->w_folios[i], cpos, user_pos, user_len, in ocfs2_write_cluster()
1205 struct ocfs2_super *osb = OCFS2_SB(mapping->host->i_sb); in ocfs2_write_cluster_by_desc()
1207 for (i = 0; i < wc->w_clen; i++) { in ocfs2_write_cluster_by_desc()
1208 desc = &wc->w_desc[i]; in ocfs2_write_cluster_by_desc()
1215 cluster_off = pos & (osb->s_clustersize - 1); in ocfs2_write_cluster_by_desc()
1216 if ((cluster_off + local_len) > osb->s_clustersize) in ocfs2_write_cluster_by_desc()
1217 local_len = osb->s_clustersize - cluster_off; in ocfs2_write_cluster_by_desc()
1219 ret = ocfs2_write_cluster(mapping, &desc->c_phys, in ocfs2_write_cluster_by_desc()
1220 desc->c_new, in ocfs2_write_cluster_by_desc()
1221 desc->c_clear_unwritten, in ocfs2_write_cluster_by_desc()
1222 desc->c_needs_zero, in ocfs2_write_cluster_by_desc()
1224 wc, desc->c_cpos, pos, local_len); in ocfs2_write_cluster_by_desc()
1230 len -= local_len; in ocfs2_write_cluster_by_desc()
1250 wc->w_target_from = pos & (PAGE_SIZE - 1); in ocfs2_set_target_boundaries()
1251 wc->w_target_to = wc->w_target_from + len; in ocfs2_set_target_boundaries()
1257 * Allocating write - we may have different boundaries based in ocfs2_set_target_boundaries()
1265 if (wc->w_large_pages) { in ocfs2_set_target_boundaries()
1272 desc = &wc->w_desc[0]; in ocfs2_set_target_boundaries()
1273 if (desc->c_needs_zero) in ocfs2_set_target_boundaries()
1275 desc->c_cpos, in ocfs2_set_target_boundaries()
1276 &wc->w_target_from, in ocfs2_set_target_boundaries()
1279 desc = &wc->w_desc[wc->w_clen - 1]; in ocfs2_set_target_boundaries()
1280 if (desc->c_needs_zero) in ocfs2_set_target_boundaries()
1282 desc->c_cpos, in ocfs2_set_target_boundaries()
1284 &wc->w_target_to); in ocfs2_set_target_boundaries()
1286 wc->w_target_from = 0; in ocfs2_set_target_boundaries()
1287 wc->w_target_to = PAGE_SIZE; in ocfs2_set_target_boundaries()
1306 if (!desc->c_needs_zero) in ocfs2_unwritten_check()
1310 spin_lock(&oi->ip_lock); in ocfs2_unwritten_check()
1314 list_for_each_entry(ue, &oi->ip_unwritten_list, ue_ip_node) { in ocfs2_unwritten_check()
1315 if (desc->c_cpos == ue->ue_cpos) { in ocfs2_unwritten_check()
1316 BUG_ON(desc->c_new); in ocfs2_unwritten_check()
1317 desc->c_needs_zero = 0; in ocfs2_unwritten_check()
1318 desc->c_clear_unwritten = 0; in ocfs2_unwritten_check()
1323 if (wc->w_type != OCFS2_WRITE_DIRECT) in ocfs2_unwritten_check()
1327 spin_unlock(&oi->ip_lock); in ocfs2_unwritten_check()
1331 ret = -ENOMEM; in ocfs2_unwritten_check()
1337 new->ue_cpos = desc->c_cpos; in ocfs2_unwritten_check()
1338 new->ue_phys = desc->c_phys; in ocfs2_unwritten_check()
1339 desc->c_clear_unwritten = 0; in ocfs2_unwritten_check()
1340 list_add_tail(&new->ue_ip_node, &oi->ip_unwritten_list); in ocfs2_unwritten_check()
1341 list_add_tail(&new->ue_node, &wc->w_unwritten_list); in ocfs2_unwritten_check()
1342 wc->w_unwritten_count++; in ocfs2_unwritten_check()
1345 spin_unlock(&oi->ip_lock); in ocfs2_unwritten_check()
1352 * Populate each single-cluster write descriptor in the write context
1374 for (i = 0; i < wc->w_clen; i++) { in ocfs2_populate_write_desc()
1375 desc = &wc->w_desc[i]; in ocfs2_populate_write_desc()
1376 desc->c_cpos = wc->w_cpos + i; in ocfs2_populate_write_desc()
1382 ret = ocfs2_get_clusters(inode, desc->c_cpos, &phys, in ocfs2_populate_write_desc()
1393 * Assume worst case - that we're writing in in ocfs2_populate_write_desc()
1412 * If w_first_new_cpos is < UINT_MAX, we have a non-sparse in ocfs2_populate_write_desc()
1417 if (desc->c_cpos >= wc->w_first_new_cpos) { in ocfs2_populate_write_desc()
1419 desc->c_needs_zero = 1; in ocfs2_populate_write_desc()
1422 desc->c_phys = phys; in ocfs2_populate_write_desc()
1424 desc->c_new = 1; in ocfs2_populate_write_desc()
1425 desc->c_needs_zero = 1; in ocfs2_populate_write_desc()
1426 desc->c_clear_unwritten = 1; in ocfs2_populate_write_desc()
1431 desc->c_clear_unwritten = 1; in ocfs2_populate_write_desc()
1432 desc->c_needs_zero = 1; in ocfs2_populate_write_desc()
1441 num_clusters--; in ocfs2_populate_write_desc()
1454 struct ocfs2_super *osb = OCFS2_SB(inode->i_sb); in ocfs2_write_begin_inline()
1457 struct ocfs2_dinode *di = (struct ocfs2_dinode *)wc->w_di_bh->b_data; in ocfs2_write_begin_inline()
1478 wc->w_target_folio = folio; in ocfs2_write_begin_inline()
1479 wc->w_folios[0] = folio; in ocfs2_write_begin_inline()
1480 wc->w_num_folios = 1; in ocfs2_write_begin_inline()
1482 ret = ocfs2_journal_access_di(handle, INODE_CACHE(inode), wc->w_di_bh, in ocfs2_write_begin_inline()
1491 if (!(OCFS2_I(inode)->ip_dyn_features & OCFS2_INLINE_DATA_FL)) in ocfs2_write_begin_inline()
1495 ret = ocfs2_read_inline_data(inode, folio, wc->w_di_bh); in ocfs2_write_begin_inline()
1503 wc->w_handle = handle; in ocfs2_write_begin_inline()
1510 struct ocfs2_dinode *di = (struct ocfs2_dinode *)di_bh->b_data; in ocfs2_size_fits_inline_data()
1512 if (new_size <= le16_to_cpu(di->id2.i_data.id_count)) in ocfs2_size_fits_inline_data()
1526 trace_ocfs2_try_to_write_inline_data((unsigned long long)oi->ip_blkno, in ocfs2_try_to_write_inline_data()
1528 oi->ip_dyn_features); in ocfs2_try_to_write_inline_data()
1533 if (oi->ip_dyn_features & OCFS2_INLINE_DATA_FL) { in ocfs2_try_to_write_inline_data()
1535 ocfs2_size_fits_inline_data(wc->w_di_bh, end)) in ocfs2_try_to_write_inline_data()
1539 * The write won't fit - we have to give this inode an in ocfs2_try_to_write_inline_data()
1542 ret = ocfs2_convert_inline_data_to_extents(inode, wc->w_di_bh); in ocfs2_try_to_write_inline_data()
1551 if (oi->ip_clusters != 0 || i_size_read(inode) != 0) in ocfs2_try_to_write_inline_data()
1557 di = (struct ocfs2_dinode *)wc->w_di_bh->b_data; in ocfs2_try_to_write_inline_data()
1559 end > ocfs2_max_inline_data_with_xattr(inode->i_sb, di)) in ocfs2_try_to_write_inline_data()
1584 * write path can treat it as an non-allocating write, which has no
1595 BUG_ON(ocfs2_sparse_alloc(OCFS2_SB(inode->i_sb))); in ocfs2_expand_nonsparse_inode()
1606 wc->w_first_new_cpos = in ocfs2_expand_nonsparse_inode()
1607 ocfs2_clusters_for_bytes(inode->i_sb, i_size_read(inode)); in ocfs2_expand_nonsparse_inode()
1617 BUG_ON(!ocfs2_sparse_alloc(OCFS2_SB(inode->i_sb))); in ocfs2_zero_tail()
1632 struct inode *inode = mapping->host; in ocfs2_write_begin_nolock()
1633 struct ocfs2_super *osb = OCFS2_SB(inode->i_sb); in ocfs2_write_begin_nolock()
1679 clusters_need = wc->w_clen; in ocfs2_write_begin_nolock()
1681 wc->w_cpos, wc->w_clen, UINT_MAX); in ocfs2_write_begin_nolock()
1696 di = (struct ocfs2_dinode *)wc->w_di_bh->b_data; in ocfs2_write_begin_nolock()
1699 (unsigned long long)OCFS2_I(inode)->ip_blkno, in ocfs2_write_begin_nolock()
1701 le32_to_cpu(di->i_clusters), in ocfs2_write_begin_nolock()
1714 * ocfs2_lock_allocators(). It greatly over-estimates in ocfs2_write_begin_nolock()
1718 wc->w_di_bh); in ocfs2_write_begin_nolock()
1728 data_ac->ac_resv = &OCFS2_I(inode)->ip_la_data_resv; in ocfs2_write_begin_nolock()
1730 credits = ocfs2_calc_extend_credits(inode->i_sb, in ocfs2_write_begin_nolock()
1731 &di->id2.i_list); in ocfs2_write_begin_nolock()
1738 * and non-sparse clusters we just extended. For non-sparse writes, in ocfs2_write_begin_nolock()
1741 if (wc->w_clen && (wc->w_desc[0].c_needs_zero || in ocfs2_write_begin_nolock()
1742 wc->w_desc[wc->w_clen - 1].c_needs_zero)) in ocfs2_write_begin_nolock()
1756 wc->w_handle = handle; in ocfs2_write_begin_nolock()
1760 ocfs2_clusters_to_bytes(osb->sb, clusters_to_alloc)); in ocfs2_write_begin_nolock()
1765 ret = ocfs2_journal_access_di(handle, INODE_CACHE(inode), wc->w_di_bh, in ocfs2_write_begin_nolock()
1777 ret = ocfs2_grab_folios_for_write(mapping, wc, wc->w_cpos, pos, len, in ocfs2_write_begin_nolock()
1781 * ocfs2_grab_folios_for_write() returns -EAGAIN if it in ocfs2_write_begin_nolock()
1784 * the caller, page_mkwrite(), to re-try the operation. in ocfs2_write_begin_nolock()
1786 if (type == OCFS2_WRITE_MMAP && ret == -EAGAIN) { in ocfs2_write_begin_nolock()
1787 BUG_ON(wc->w_target_folio); in ocfs2_write_begin_nolock()
1810 *foliop = wc->w_target_folio; in ocfs2_write_begin_nolock()
1816 ocfs2_clusters_to_bytes(osb->sb, clusters_to_alloc)); in ocfs2_write_begin_nolock()
1825 * retrying again on ENOSPC, or when returning non-VM_FAULT_LOCKED in ocfs2_write_begin_nolock()
1828 if (wc->w_target_locked) in ocfs2_write_begin_nolock()
1842 if (ret == -ENOSPC && try_free) { in ocfs2_write_begin_nolock()
1867 struct inode *inode = mapping->host; in ocfs2_write_begin()
1878 * ocfs2_write() will be safe against ->read_folio(). This in ocfs2_write_begin()
1882 down_write(&OCFS2_I(inode)->ip_alloc_sem); in ocfs2_write_begin()
1896 up_write(&OCFS2_I(inode)->ip_alloc_sem); in ocfs2_write_begin()
1910 if (!folio_test_uptodate(wc->w_target_folio)) { in ocfs2_write_end_inline()
1916 memcpy_from_folio(di->id2.i_data.id_data + pos, wc->w_target_folio, in ocfs2_write_end_inline()
1920 (unsigned long long)OCFS2_I(inode)->ip_blkno, in ocfs2_write_end_inline()
1922 le16_to_cpu(di->id2.i_data.id_count), in ocfs2_write_end_inline()
1923 le16_to_cpu(di->i_dyn_features)); in ocfs2_write_end_inline()
1930 size_t from, to, start = pos & (PAGE_SIZE - 1); in ocfs2_write_end_nolock()
1931 struct inode *inode = mapping->host; in ocfs2_write_end_nolock()
1932 struct ocfs2_super *osb = OCFS2_SB(inode->i_sb); in ocfs2_write_end_nolock()
1934 struct ocfs2_dinode *di = (struct ocfs2_dinode *)wc->w_di_bh->b_data; in ocfs2_write_end_nolock()
1935 handle_t *handle = wc->w_handle; in ocfs2_write_end_nolock()
1937 BUG_ON(!list_empty(&wc->w_unwritten_list)); in ocfs2_write_end_nolock()
1941 wc->w_di_bh, OCFS2_JOURNAL_ACCESS_WRITE); in ocfs2_write_end_nolock()
1949 if (OCFS2_I(inode)->ip_dyn_features & OCFS2_INLINE_DATA_FL) { in ocfs2_write_end_nolock()
1954 if (unlikely(copied < len) && wc->w_target_folio) { in ocfs2_write_end_nolock()
1957 if (!folio_test_uptodate(wc->w_target_folio)) in ocfs2_write_end_nolock()
1961 if (new_isize > folio_pos(wc->w_target_folio)) in ocfs2_write_end_nolock()
1962 ocfs2_zero_new_buffers(wc->w_target_folio, start+copied, in ocfs2_write_end_nolock()
1972 block_invalidate_folio(wc->w_target_folio, 0, in ocfs2_write_end_nolock()
1973 folio_size(wc->w_target_folio)); in ocfs2_write_end_nolock()
1976 if (wc->w_target_folio) in ocfs2_write_end_nolock()
1977 flush_dcache_folio(wc->w_target_folio); in ocfs2_write_end_nolock()
1979 for (i = 0; i < wc->w_num_folios; i++) { in ocfs2_write_end_nolock()
1980 struct folio *folio = wc->w_folios[i]; in ocfs2_write_end_nolock()
1986 if (folio == wc->w_target_folio) { in ocfs2_write_end_nolock()
1987 from = wc->w_target_from; in ocfs2_write_end_nolock()
1988 to = wc->w_target_to; in ocfs2_write_end_nolock()
1996 * a hole-filling write in which case we want in ocfs2_write_end_nolock()
2006 loff_t length = to - from; in ocfs2_write_end_nolock()
2016 if (wc->w_type != OCFS2_WRITE_DIRECT) { in ocfs2_write_end_nolock()
2022 inode->i_blocks = ocfs2_inode_sector_count(inode); in ocfs2_write_end_nolock()
2023 di->i_size = cpu_to_le64((u64)i_size_read(inode)); in ocfs2_write_end_nolock()
2025 di->i_mtime = di->i_ctime = cpu_to_le64(inode_get_mtime_sec(inode)); in ocfs2_write_end_nolock()
2026 di->i_mtime_nsec = di->i_ctime_nsec = cpu_to_le32(inode_get_mtime_nsec(inode)); in ocfs2_write_end_nolock()
2031 ocfs2_journal_dirty(handle, wc->w_di_bh); in ocfs2_write_end_nolock()
2044 ocfs2_run_deallocs(osb, &wc->w_dealloc); in ocfs2_write_end_nolock()
2046 brelse(wc->w_di_bh); in ocfs2_write_end_nolock()
2058 struct inode *inode = mapping->host; in ocfs2_write_end()
2062 up_write(&OCFS2_I(inode)->ip_alloc_sem); in ocfs2_write_end()
2080 if (bh->b_private) in ocfs2_dio_alloc_write_ctx()
2081 return bh->b_private; in ocfs2_dio_alloc_write_ctx()
2086 INIT_LIST_HEAD(&dwc->dw_zero_list); in ocfs2_dio_alloc_write_ctx()
2087 dwc->dw_zero_count = 0; in ocfs2_dio_alloc_write_ctx()
2088 dwc->dw_orphaned = 0; in ocfs2_dio_alloc_write_ctx()
2089 dwc->dw_writer_pid = task_pid_nr(current); in ocfs2_dio_alloc_write_ctx()
2090 bh->b_private = dwc; in ocfs2_dio_alloc_write_ctx()
2099 ocfs2_free_unwritten_list(inode, &dwc->dw_zero_list); in ocfs2_dio_free_write_ctx()
2106 * From do_direct_io in direct-io.c:
2107 * "So what we do is to permit the ->get_blocks function to populate
2111 * This function is called directly from get_more_blocks in direct-io.c.
2113 * called like this: dio->get_blocks(dio->inode, fs_startblk,
2114 * fs_count, map_bh, dio->rw == WRITE);
2119 struct ocfs2_super *osb = OCFS2_SB(inode->i_sb); in ocfs2_dio_wr_get_block()
2126 unsigned int i_blkbits = inode->i_sb->s_blocksize_bits; in ocfs2_dio_wr_get_block()
2128 sector_t endblk = (i_size_read(inode) - 1) >> i_blkbits; in ocfs2_dio_wr_get_block()
2129 unsigned len, total_len = bh_result->b_size; in ocfs2_dio_wr_get_block()
2132 len = osb->s_clustersize - (pos & (osb->s_clustersize - 1)); in ocfs2_dio_wr_get_block()
2136 * bh_result->b_size is count in get_more_blocks according to write in ocfs2_dio_wr_get_block()
2142 * |--------|---------|---------|--------- in ocfs2_dio_wr_get_block()
2143 * |<-------area in file------->| in ocfs2_dio_wr_get_block()
2147 ((iblock + ((len - 1) >> i_blkbits)) > endblk)) in ocfs2_dio_wr_get_block()
2148 len = (endblk - iblock + 1) << i_blkbits; in ocfs2_dio_wr_get_block()
2151 inode->i_ino, pos, len, total_len); in ocfs2_dio_wr_get_block()
2160 /* This is the fast path for re-write. */ in ocfs2_dio_wr_get_block()
2168 bh_result->b_state = 0; in ocfs2_dio_wr_get_block()
2173 ret = -ENOMEM; in ocfs2_dio_wr_get_block()
2178 if (ocfs2_clusters_for_bytes(inode->i_sb, pos + total_len) > in ocfs2_dio_wr_get_block()
2179 ocfs2_clusters_for_bytes(inode->i_sb, i_size_read(inode)) && in ocfs2_dio_wr_get_block()
2180 !dwc->dw_orphaned) { in ocfs2_dio_wr_get_block()
2183 * inode to orphan dir, so we can recall those spaces when in ocfs2_dio_wr_get_block()
2191 dwc->dw_orphaned = 1; in ocfs2_dio_wr_get_block()
2200 down_write(&oi->ip_alloc_sem); in ocfs2_dio_wr_get_block()
2214 ret = ocfs2_write_begin_nolock(inode->i_mapping, pos, len, in ocfs2_dio_wr_get_block()
2222 desc = &wc->w_desc[0]; in ocfs2_dio_wr_get_block()
2224 p_blkno = ocfs2_clusters_to_blocks(inode->i_sb, desc->c_phys); in ocfs2_dio_wr_get_block()
2226 p_blkno += iblock & (u64)(ocfs2_clusters_to_blocks(inode->i_sb, 1) - 1); in ocfs2_dio_wr_get_block()
2228 map_bh(bh_result, inode->i_sb, p_blkno); in ocfs2_dio_wr_get_block()
2229 bh_result->b_size = len; in ocfs2_dio_wr_get_block()
2230 if (desc->c_needs_zero) in ocfs2_dio_wr_get_block()
2240 if (!list_empty(&wc->w_unwritten_list)) { in ocfs2_dio_wr_get_block()
2243 ue = list_first_entry(&wc->w_unwritten_list, in ocfs2_dio_wr_get_block()
2246 BUG_ON(ue->ue_cpos != desc->c_cpos); in ocfs2_dio_wr_get_block()
2248 ue->ue_phys = desc->c_phys; in ocfs2_dio_wr_get_block()
2250 list_splice_tail_init(&wc->w_unwritten_list, &dwc->dw_zero_list); in ocfs2_dio_wr_get_block()
2251 dwc->dw_zero_count += wc->w_unwritten_count; in ocfs2_dio_wr_get_block()
2254 ret = ocfs2_write_end_nolock(inode->i_mapping, pos, len, len, wc); in ocfs2_dio_wr_get_block()
2258 up_write(&oi->ip_alloc_sem); in ocfs2_dio_wr_get_block()
2272 struct ocfs2_super *osb = OCFS2_SB(inode->i_sb); in ocfs2_dio_end_io_write()
2286 * of these happen, we can skip all this. */ in ocfs2_dio_end_io_write()
2287 if (list_empty(&dwc->dw_zero_list) && in ocfs2_dio_end_io_write()
2289 !dwc->dw_orphaned) in ocfs2_dio_end_io_write()
2298 down_write(&oi->ip_alloc_sem); in ocfs2_dio_end_io_write()
2301 if (dwc->dw_orphaned) { in ocfs2_dio_end_io_write()
2302 BUG_ON(dwc->dw_writer_pid != task_pid_nr(current)); in ocfs2_dio_end_io_write()
2312 di = (struct ocfs2_dinode *)di_bh->b_data; in ocfs2_dio_end_io_write()
2322 ret = ocfs2_lock_allocators(inode, &et, 0, dwc->dw_zero_count*2, in ocfs2_dio_end_io_write()
2329 credits = ocfs2_calc_extend_credits(inode->i_sb, &di->id2.i_list); in ocfs2_dio_end_io_write()
2344 list_for_each_entry(ue, &dwc->dw_zero_list, ue_node) { in ocfs2_dio_end_io_write()
2351 ue->ue_cpos, 1, in ocfs2_dio_end_io_write()
2352 ue->ue_phys, in ocfs2_dio_end_io_write()
2368 up_write(&oi->ip_alloc_sem); in ocfs2_dio_end_io_write()
2392 struct inode *inode = file_inode(iocb->ki_filp); in ocfs2_dio_end_io()
2419 struct file *file = iocb->ki_filp; in ocfs2_direct_IO()
2420 struct inode *inode = file->f_mapping->host; in ocfs2_direct_IO()
2421 struct ocfs2_super *osb = OCFS2_SB(inode->i_sb); in ocfs2_direct_IO()
2428 if (OCFS2_I(inode)->ip_dyn_features & OCFS2_INLINE_DATA_FL) in ocfs2_direct_IO()
2432 if (iocb->ki_pos + iter->count > i_size_read(inode) && in ocfs2_direct_IO()
2441 return __blockdev_direct_IO(iocb, inode, inode->i_sb->s_bdev, in ocfs2_direct_IO()