diff --git a/fs/buffer.c b/fs/buffer.c index 6a8752f7bbed..805cc0a2ecab 100644 --- a/fs/buffer.c +++ b/fs/buffer.c @@ -2621,7 +2621,8 @@ int block_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf, unsigned long end; loff_t size; int ret; - + pr_info("BUFFER_DEBUG: block_page_mkwrite called for inode %lu, folio index %lu, uptodate=%d\n", + inode->i_ino, folio->index, folio_test_uptodate(folio)); folio_lock(folio); size = i_size_read(inode); if ((folio->mapping != inode->i_mapping) || @@ -2630,7 +2631,7 @@ int block_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf, ret = -EFAULT; goto out_unlock; } - + pr_info("BUFFER_DEBUG: Folio checks passed, calling __block_write_begin\n"); end = folio_size(folio); /* folio is wholly or partially inside EOF */ if (folio_pos(folio) + end > size) diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index e99306a8f47c..776f30993dcd 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c @@ -6675,7 +6675,8 @@ vm_fault_t ext4_page_mkwrite(struct vm_fault *vmf) struct address_space *mapping = inode->i_mapping; get_block_t *get_block = ext4_get_block; int retries = 0; - + pr_info("EXT4_DEBUG: ext4_page_mkwrite called for inode %lu, folio index %lu, uptodate=%d\n", + inode->i_ino, folio->index, folio_test_uptodate(folio)); if (unlikely(IS_IMMUTABLE(inode))) return VM_FAULT_SIGBUS; @@ -6688,6 +6689,13 @@ vm_fault_t ext4_page_mkwrite(struct vm_fault *vmf) if (err) goto out_ret; + folio_lock(folio); + if (!folio_test_uptodate(folio)) { + folio_unlock(folio); + ret = VM_FAULT_SIGBUS; + goto out; + } + folio_unlock(folio); /* * On data journalling we skip straight to the transaction handle: * there's no delalloc; page truncated will be checked later; the @@ -6700,19 +6708,27 @@ vm_fault_t ext4_page_mkwrite(struct vm_fault *vmf) /* Delalloc case is easy... */ if (test_opt(inode->i_sb, DELALLOC) && !ext4_nonda_switch(inode->i_sb)) { + pr_info("EXT4_DEBUG: Taking delalloc path, calling block_page_mkwrite\n"); do { err = block_page_mkwrite(vma, vmf, ext4_da_get_block_prep); + pr_info("EXT4_DEBUG: block_page_mkwrite returned err=%d\n", err); } while (err == -ENOSPC && ext4_should_retry_alloc(inode->i_sb, &retries)); goto out_ret; } folio_lock(folio); + /*if (!folio_test_uptodate(folio)) { + folio_unlock(folio); + ret = VM_FAULT_SIGBUS; + goto out; + }*/ size = i_size_read(inode); /* Page got truncated from under us? */ if (folio->mapping != mapping || folio_pos(folio) > size) { folio_unlock(folio); + pr_info("EXT4_DEBUG: Folio truncated, returning VM_FAULT_NOPAGE\n"); ret = VM_FAULT_NOPAGE; goto out; }