> loff_t size; > unsigned long len; > + int ret; > struct file *file = vma->vm_file; > struct inode *inode = file->f_path.dentry->d_inode; > struct address_space *mapping = inode->i_mapping; > + handle_t *handle; > + get_block_t *get_block; > + int retries = 0; > > /* > + * This check is racy but catches the common case. We rely on > + * __block_page_mkwrite() to do a reliable check. > */ > + vfs_check_frozen(inode->i_sb, SB_FREEZE_WRITE); > + /* Delalloc case is easy... */ > + if (test_opt(inode->i_sb, DELALLOC) && > + !ext4_should_journal_data(inode) && > + !ext4_nonda_switch(inode->i_sb)) { > + do { > + ret = __block_page_mkwrite(vma, vmf, > + ext4_da_get_block_prep); > + } while (ret == -ENOSPC && > + ext4_should_retry_alloc(inode->i_sb, &retries)); > + goto out_ret; Is there any way to simply provide a different vm_operations_struct and thus ->fault implementation for the delalloc vs non-delalloc case? I think splitting those two cases completely would make the code a lot more readable, even if there is a tiny amount of code duplication. -- To unsubscribe from this list: send the line "unsubscribe linux-ext4" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html