Lukas Czerner
332391a993
fs: Fix page cache inconsistency when mixing buffered and AIO DIO
...
Currently when mixing buffered reads and asynchronous direct writes it
is possible to end up with the situation where we have stale data in the
page cache while the new data is already written to disk. This is
permanent until the affected pages are flushed away. Despite the fact
that mixing buffered and direct IO is ill-advised it does pose a thread
for a data integrity, is unexpected and should be fixed.
Fix this by deferring completion of asynchronous direct writes to a
process context in the case that there are mapped pages to be found in
the inode. Later before the completion in dio_complete() invalidate
the pages in question. This ensures that after the completion the pages
in the written area are either unmapped, or populated with up-to-date
data. Also do the same for the iomap case which uses
iomap_dio_complete() instead.
This has a side effect of deferring the completion to a process context
for every AIO DIO that happens on inode that has pages mapped. However
since the consensus is that this is ill-advised practice the performance
implication should not be a problem.
This was based on proposal from Jeff Moyer, thanks!
Reviewed-by: Jan Kara <jack@suse.cz>
Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Jeff Moyer <jmoyer@redhat.com>
Signed-off-by: Lukas Czerner <lczerner@redhat.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
2017-09-25 08:56:05 -06:00
..
kasan
Merge branch 'linus' into locking/core, to pick up fixes
2017-08-10 12:20:53 +02:00
backing-dev.c
mm/backing-dev.c: fix an error handling path in 'cgwb_create()'
2017-09-11 14:16:44 -06:00
balloon_compaction.c
mm/migrate: new migrate mode MIGRATE_SYNC_NO_COPY
2017-09-08 18:26:46 -07:00
bootmem.c
cleancache.c
fs: switch ->s_uuid to uuid_t
2017-06-05 16:59:12 +02:00
cma.c
cma: fix calculation of aligned offset
2017-07-10 16:32:32 -07:00
cma.h
cma: Store a name in the cma structure
2017-04-18 20:41:12 +02:00
cma_debug.c
mm/cma_debug.c: fix stack corruption due to sprintf usage
2017-08-18 15:32:02 -07:00
compaction.c
mm, compaction: skip over holes in __reset_isolation_suitable
2017-07-06 16:24:32 -07:00
debug.c
mm: make tlb_flush_pending global
2017-08-10 15:54:07 -07:00
debug_page_ref.c
dmapool.c
early_ioremap.c
x86/mm: Add support to access boot related data in the clear
2017-07-18 11:38:02 +02:00
fadvise.c
mm: fadvise: avoid fadvise for fs without backing device
2017-09-08 18:26:47 -07:00
failslab.c
filemap.c
fs: Fix page cache inconsistency when mixing buffered and AIO DIO
2017-09-25 08:56:05 -06:00
frame_vector.c
treewide: use kv[mz]alloc* rather than opencoded variants
2017-05-08 17:15:13 -07:00
frontswap.c
gup.c
mm/device-public-memory: device memory cache coherent with CPU
2017-09-08 18:26:46 -07:00
highmem.c
hmm.c
mm/hmm: avoid bloating arch that do not make use of HMM
2017-09-08 18:26:46 -07:00
huge_memory.c
mm: soft-dirty: keep soft-dirty bits over thp migration
2017-09-08 18:26:45 -07:00
hugetlb.c
powerpc updates for 4.14
2017-09-07 10:15:40 -07:00
hugetlb_cgroup.c
hwpoison-inject.c
mm: hwpoison: call shake_page() unconditionally
2017-05-03 15:52:12 -07:00
init-mm.c
internal.h
mm, oom: do not rely on TIF_MEMDIE for memory reserves access
2017-09-06 17:27:30 -07:00
interval_tree.c
lib/interval_tree: fast overlap detection
2017-09-08 18:26:49 -07:00
Kconfig
mm/hmm: avoid bloating arch that do not make use of HMM
2017-09-08 18:26:46 -07:00
Kconfig.debug
mm: enable page poisoning early at boot
2017-05-03 15:52:10 -07:00
khugepaged.c
mm: make PR_SET_THP_DISABLE immediately active
2017-07-10 16:32:31 -07:00
kmemcheck.c
mm: Rename SLAB_DESTROY_BY_RCU to SLAB_TYPESAFE_BY_RCU
2017-04-18 11:42:36 -07:00
kmemleak-test.c
kmemleak.c
mm: kmemleak: treat vm_struct as alternative reference to vmalloc'ed objects
2017-07-06 16:24:34 -07:00
ksm.c
mm/ksm.c: constify attribute_group structures
2017-09-06 17:27:27 -07:00
list_lru.c
mm/list_lru.c: fix list_lru_count_node() to be race free
2017-07-10 16:32:33 -07:00
maccess.c
madvise.c
mm/device-public-memory: device memory cache coherent with CPU
2017-09-08 18:26:46 -07:00
Makefile
mm/hmm: avoid bloating arch that do not make use of HMM
2017-09-08 18:26:46 -07:00
memblock.c
mm/memblock.c: reversed logic in memblock_discard()
2017-08-25 16:12:46 -07:00
memcontrol.c
mem/memcg: cache rightmost node
2017-09-08 18:26:49 -07:00
memory-failure.c
x86/mm, mm/hwpoison: Clear PRESENT bit for kernel 1:1 mappings of poison pages
2017-08-17 10:30:49 +02:00
memory.c
lib/interval_tree: fast overlap detection
2017-09-08 18:26:49 -07:00
memory_hotplug.c
mm/ZONE_DEVICE: new type of ZONE_DEVICE for unaddressable memory
2017-09-08 18:26:46 -07:00
mempolicy.c
mm/mempolicy.c: remove BUG_ON() checks for VMA inside mpol_misplaced()
2017-09-08 18:26:47 -07:00
mempool.c
sched/wait: Rename wait_queue_t => wait_queue_entry_t
2017-06-20 12:18:27 +02:00
memtest.c
migrate.c
mm/hmm: avoid bloating arch that do not make use of HMM
2017-09-08 18:26:46 -07:00
mincore.c
mlock.c
mm/mlock.c: use page_zone() instead of page_zone_id()
2017-09-08 18:26:47 -07:00
mm_init.c
mmap.c
lib/interval_tree: fast overlap detection
2017-09-08 18:26:49 -07:00
mmu_context.c
mmu_notifier.c
mm/mmu_notifier: kill invalidate_page
2017-08-31 16:13:00 -07:00
mmzone.c
mprotect.c
mm/ZONE_DEVICE: new type of ZONE_DEVICE for unaddressable memory
2017-09-08 18:26:46 -07:00
mremap.c
mm: thp: check pmd migration entry in common path
2017-09-08 18:26:45 -07:00
msync.c
nobootmem.c
mm: discard memblock data later
2017-08-18 15:32:01 -07:00
nommu.c
Merge branch 'work.set_fs' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
2017-09-14 18:13:32 -07:00
oom_kill.c
mm: oom: let oom_reap_task and exit_mmap run concurrently
2017-09-06 17:27:30 -07:00
page-writeback.c
mm: rename global_page_state to global_zone_page_state
2017-09-06 17:27:29 -07:00
page_alloc.c
mm/page_alloc.c: apply gfp_allowed_mask before the first allocation attempt
2017-09-08 18:26:47 -07:00
page_counter.c
page_ext.c
mm, page_ext: periodically reschedule during page_ext_init()
2017-09-06 17:27:26 -07:00
page_idle.c
mm/page_idle.c: constify attribute_group structures
2017-09-06 17:27:27 -07:00
page_io.c
Merge branch 'for-4.14/block' of git://git.kernel.dk/linux-block
2017-09-07 11:59:42 -07:00
page_isolation.c
mm: unify new_node_page and alloc_migrate_target
2017-07-10 16:32:31 -07:00
page_owner.c
mm, page_owner: skip unnecessary stack_trace entries
2017-09-13 18:53:16 -07:00
page_poison.c
mm: enable page poisoning early at boot
2017-05-03 15:52:10 -07:00
page_vma_mapped.c
mm/migrate: support un-addressable ZONE_DEVICE page in migration
2017-09-08 18:26:46 -07:00
pagewalk.c
mm/hugetlb: add size parameter to huge_pte_offset()
2017-07-06 16:24:34 -07:00
percpu-internal.h
percpu: skip chunks if the alloc does not fit in the contig hint
2017-07-26 17:41:05 -04:00
percpu-km.c
percpu: replace area map allocator with bitmap
2017-07-26 17:41:05 -04:00
percpu-stats.c
percpu: add first_bit to keep track of the first free in the bitmap
2017-07-26 17:41:05 -04:00
percpu-vm.c
percpu: fix static checker warnings in pcpu_destroy_chunk
2017-06-29 11:23:38 -04:00
percpu.c
percpu: update header to contain bitmap allocator explanation.
2017-07-26 17:41:06 -04:00
pgtable-generic.c
mm: thp: enable thp migration in generic path
2017-09-08 18:26:45 -07:00
process_vm_access.c
quicklist.c
readahead.c
rmap.c
lib/interval_tree: fast overlap detection
2017-09-08 18:26:49 -07:00
rodata_test.c
mm: remove rodata_test_data export, add pr_fmt
2017-05-03 15:52:09 -07:00
shmem.c
mm: treewide: remove GFP_TEMPORARY allocation flag
2017-09-13 18:53:16 -07:00
slab.c
mm: memcontrol: account slab stats per lruvec
2017-07-06 16:24:35 -07:00
slab.h
locking/lockdep: Rework FS_RECLAIM annotation
2017-08-10 12:29:03 +02:00
slab_common.c
mm: allow slab_nomerge to be set at build time
2017-07-06 16:24:31 -07:00
slob.c
locking/lockdep: Rework FS_RECLAIM annotation
2017-08-10 12:29:03 +02:00
slub.c
mm: treewide: remove GFP_TEMPORARY allocation flag
2017-09-13 18:53:16 -07:00
sparse-vmemmap.c
mm, sparse, page_ext: drop ugly N_HIGH_MEMORY branches for allocations
2017-09-06 17:27:26 -07:00
sparse.c
mm/sparse.c: fix typo in online_mem_sections
2017-09-08 18:26:47 -07:00
swap.c
mm/device-public-memory: device memory cache coherent with CPU
2017-09-08 18:26:46 -07:00
swap_cgroup.c
mm, THP, swap: delay splitting THP during swap out
2017-07-06 16:24:31 -07:00
swap_slots.c
mm/swap_slots.c: don't disable preemption while taking the per-CPU cache
2017-07-10 16:32:32 -07:00
swap_state.c
mm, swap: add sysfs interface for VMA based swap readahead
2017-09-06 17:27:29 -07:00
swapfile.c
mm/swapfile.c: fix swapon frontswap_map memory leak on error
2017-09-08 18:26:47 -07:00
truncate.c
mm/truncate.c: fix THP handling in invalidate_mapping_pages()
2017-07-10 16:32:32 -07:00
usercopy.c
mm/usercopy: Drop extra is_vmalloc_or_module() check
2017-04-05 12:30:18 -07:00
userfaultfd.c
userfaultfd: shmem: wire up shmem_mfill_zeropage_pte
2017-09-06 17:27:28 -07:00
util.c
mm: rename global_page_state to global_zone_page_state
2017-09-06 17:27:29 -07:00
vmacache.c
vmalloc.c
mm/vmalloc.c: don't reinvent the wheel but use existing llist API
2017-09-06 17:27:29 -07:00
vmpressure.c
mm, vmpressure: pass-through notification support
2017-07-10 16:32:31 -07:00
vmscan.c
mm, THP, swap: add THP swapping out fallback counting
2017-09-06 17:27:28 -07:00
vmstat.c
mm: consider the number in local CPUs when reading NUMA stats
2017-09-08 18:26:47 -07:00
workingset.c
mm: memcontrol: per-lruvec stats infrastructure
2017-07-06 16:24:35 -07:00
z3fold.c
z3fold: use per-cpu unbuddied lists
2017-09-06 17:27:30 -07:00
zbud.c
zpool.c
zsmalloc.c
mm/zsmalloc.c: change stat type parameter to int
2017-09-08 18:26:47 -07:00
zswap.c
mm/zswap.c: delete an error message for a failed memory allocation in zswap_dstmem_prepare()
2017-07-06 16:24:35 -07:00