https://github.com/torvalds/linux
Revision 66f9311381b4772003d595fb6c518f1647450db0 authored by Alain Renaud on 08 June 2012, 19:34:46 UTC, committed by Ben Myers on 20 June 2012, 19:57:28 UTC
On filesytems with a block size smaller than PAGE_SIZE we currently have a problem with unwritten extents. If a we have multi-block page for which an unwritten extent has been allocated, and only some of the buffers have been written to, and they are not contiguous, we can expose stale data from disk in the blocks between the writes after extent conversion. Example of a page with unwritten and real data. buffer content 0 empty b_state = 0 1 DATA b_state = 0x1023 Uptodate,Dirty,Mapped,Unwritten 2 DATA b_state = 0x1023 Uptodate,Dirty,Mapped,Unwritten 3 empty b_state = 0 4 empty b_state = 0 5 DATA b_state = 0x1023 Uptodate,Dirty,Mapped,Unwritten 6 DATA b_state = 0x1023 Uptodate,Dirty,Mapped,Unwritten 7 empty b_state = 0 Buffers 1, 2, 5, and 6 have been written to, leaving 0, 3, 4, and 7 empty. Currently buffers 1, 2, 5, and 6 are added to a single ioend, and when IO has completed, extent conversion creates a real extent from block 1 through block 6, leaving 0 and 7 unwritten. However buffers 3 and 4 were not written to disk, so stale data is exposed from those blocks on a subsequent read. Fix this by setting iomap_valid = 0 when we find a buffer that is not Uptodate. This ensures that buffers 5 and 6 are not added to the same ioend as buffers 1 and 2. Later these blocks will be converted into two separate real extents, leaving the blocks in between unwritten. Signed-off-by: Alain Renaud <arenaud@sgi.com> Reviewed-by: Dave Chinner <dchinner@redhat.com> Signed-off-by: Ben Myers <bpm@sgi.com>
1 parent f8f5701
Tip revision: 66f9311381b4772003d595fb6c518f1647450db0 authored by Alain Renaud on 08 June 2012, 19:34:46 UTC
xfs: xfs_vm_writepage clear iomap_valid when !buffer_uptodate (REV2)
xfs: xfs_vm_writepage clear iomap_valid when !buffer_uptodate (REV2)
Tip revision: 66f9311
File | Mode | Size |
---|---|---|
lzo | ||
mpi | ||
raid6 | ||
reed_solomon | ||
xz | ||
zlib_deflate | ||
zlib_inflate | ||
.gitignore | -rw-r--r-- | 51 bytes |
Kconfig | -rw-r--r-- | 9.0 KB |
Kconfig.debug | -rw-r--r-- | 45.0 KB |
Kconfig.kgdb | -rw-r--r-- | 2.3 KB |
Kconfig.kmemcheck | -rw-r--r-- | 2.9 KB |
Makefile | -rw-r--r-- | 4.1 KB |
argv_split.c | -rw-r--r-- | 1.8 KB |
atomic64.c | -rw-r--r-- | 4.2 KB |
atomic64_test.c | -rw-r--r-- | 3.5 KB |
audit.c | -rw-r--r-- | 1.2 KB |
average.c | -rw-r--r-- | 1.9 KB |
bcd.c | -rw-r--r-- | 257 bytes |
bch.c | -rw-r--r-- | 35.6 KB |
bitmap.c | -rw-r--r-- | 34.7 KB |
bitrev.c | -rw-r--r-- | 2.1 KB |
bsearch.c | -rw-r--r-- | 1.6 KB |
btree.c | -rw-r--r-- | 19.2 KB |
bug.c | -rw-r--r-- | 4.7 KB |
bust_spinlocks.c | -rw-r--r-- | 636 bytes |
check_signature.c | -rw-r--r-- | 599 bytes |
checksum.c | -rw-r--r-- | 4.8 KB |
clz_tab.c | -rw-r--r-- | 855 bytes |
cmdline.c | -rw-r--r-- | 3.6 KB |
cordic.c | -rw-r--r-- | 2.5 KB |
cpu-notifier-error-inject.c | -rw-r--r-- | 1.5 KB |
cpu_rmap.c | -rw-r--r-- | 6.8 KB |
cpumask.c | -rw-r--r-- | 4.4 KB |
crc-ccitt.c | -rw-r--r-- | 3.0 KB |
crc-itu-t.c | -rw-r--r-- | 2.8 KB |
crc-t10dif.c | -rw-r--r-- | 2.9 KB |
crc16.c | -rw-r--r-- | 2.8 KB |
crc32.c | -rw-r--r-- | 41.8 KB |
crc32defs.h | -rw-r--r-- | 2.0 KB |
crc7.c | -rw-r--r-- | 2.3 KB |
crc8.c | -rw-r--r-- | 2.4 KB |
ctype.c | -rw-r--r-- | 1.4 KB |
debug_locks.c | -rw-r--r-- | 1.1 KB |
debugobjects.c | -rw-r--r-- | 26.2 KB |
dec_and_lock.c | -rw-r--r-- | 784 bytes |
decompress.c | -rw-r--r-- | 1.3 KB |
decompress_bunzip2.c | -rw-r--r-- | 23.4 KB |
decompress_inflate.c | -rw-r--r-- | 3.7 KB |
decompress_unlzma.c | -rw-r--r-- | 15.8 KB |
decompress_unlzo.c | -rw-r--r-- | 6.8 KB |
decompress_unxz.c | -rw-r--r-- | 10.6 KB |
devres.c | -rw-r--r-- | 9.2 KB |
digsig.c | -rw-r--r-- | 5.7 KB |
div64.c | -rw-r--r-- | 3.1 KB |
dma-debug.c | -rw-r--r-- | 33.2 KB |
dump_stack.c | -rw-r--r-- | 290 bytes |
dynamic_debug.c | -rw-r--r-- | 24.9 KB |
dynamic_queue_limits.c | -rw-r--r-- | 4.3 KB |
extable.c | -rw-r--r-- | 2.4 KB |
fault-inject.c | -rw-r--r-- | 5.9 KB |
find_last_bit.c | -rw-r--r-- | 1.1 KB |
find_next_bit.c | -rw-r--r-- | 6.4 KB |
flex_array.c | -rw-r--r-- | 10.9 KB |
gcd.c | -rw-r--r-- | 291 bytes |
gen_crc32table.c | -rw-r--r-- | 3.2 KB |
genalloc.c | -rw-r--r-- | 11.1 KB |
halfmd4.c | -rw-r--r-- | 2.0 KB |
hexdump.c | -rw-r--r-- | 7.0 KB |
hweight.c | -rw-r--r-- | 1.9 KB |
idr.c | -rw-r--r-- | 23.5 KB |
inflate.c | -rw-r--r-- | 38.6 KB |
int_sqrt.c | -rw-r--r-- | 533 bytes |
iomap.c | -rw-r--r-- | 6.5 KB |
iomap_copy.c | -rw-r--r-- | 2.1 KB |
iommu-helper.c | -rw-r--r-- | 1.0 KB |
ioremap.c | -rw-r--r-- | 2.1 KB |
irq_regs.c | -rw-r--r-- | 604 bytes |
is_single_threaded.c | -rw-r--r-- | 1.3 KB |
jedec_ddr_data.c | -rw-r--r-- | 3.0 KB |
kasprintf.c | -rw-r--r-- | 704 bytes |
klist.c | -rw-r--r-- | 9.3 KB |
kobject.c | -rw-r--r-- | 23.2 KB |
kobject_uevent.c | -rw-r--r-- | 10.4 KB |
kstrtox.c | -rw-r--r-- | 6.0 KB |
kstrtox.h | -rw-r--r-- | 254 bytes |
lcm.c | -rw-r--r-- | 288 bytes |
libcrc32c.c | -rw-r--r-- | 2.1 KB |
list_debug.c | -rw-r--r-- | 2.6 KB |
list_sort.c | -rw-r--r-- | 7.0 KB |
llist.c | -rw-r--r-- | 2.7 KB |
locking-selftest-hardirq.h | -rw-r--r-- | 207 bytes |
locking-selftest-mutex.h | -rw-r--r-- | 120 bytes |
locking-selftest-rlock-hardirq.h | -rw-r--r-- | 74 bytes |
locking-selftest-rlock-softirq.h | -rw-r--r-- | 74 bytes |
locking-selftest-rlock.h | -rw-r--r-- | 158 bytes |
locking-selftest-rsem.h | -rw-r--r-- | 163 bytes |
locking-selftest-softirq.h | -rw-r--r-- | 207 bytes |
locking-selftest-spin-hardirq.h | -rw-r--r-- | 73 bytes |
locking-selftest-spin-softirq.h | -rw-r--r-- | 73 bytes |
locking-selftest-spin.h | -rw-r--r-- | 118 bytes |
locking-selftest-wlock-hardirq.h | -rw-r--r-- | 74 bytes |
locking-selftest-wlock-softirq.h | -rw-r--r-- | 74 bytes |
locking-selftest-wlock.h | -rw-r--r-- | 158 bytes |
locking-selftest-wsem.h | -rw-r--r-- | 163 bytes |
locking-selftest.c | -rw-r--r-- | 28.6 KB |
lru_cache.c | -rw-r--r-- | 14.6 KB |
md5.c | -rw-r--r-- | 3.7 KB |
nlattr.c | -rw-r--r-- | 12.3 KB |
parser.c | -rw-r--r-- | 6.1 KB |
pci_iomap.c | -rw-r--r-- | 1.4 KB |
percpu_counter.c | -rw-r--r-- | 5.1 KB |
plist.c | -rw-r--r-- | 4.7 KB |
prio_heap.c | -rw-r--r-- | 1.4 KB |
prio_tree.c | -rw-r--r-- | 11.8 KB |
proportions.c | -rw-r--r-- | 9.3 KB |
radix-tree.c | -rw-r--r-- | 38.6 KB |
random32.c | -rw-r--r-- | 3.9 KB |
ratelimit.c | -rw-r--r-- | 1.5 KB |
rational.c | -rw-r--r-- | 1.5 KB |
rbtree.c | -rw-r--r-- | 10.1 KB |
reciprocal_div.c | -rw-r--r-- | 218 bytes |
rwsem-spinlock.c | -rw-r--r-- | 7.0 KB |
rwsem.c | -rw-r--r-- | 8.1 KB |
scatterlist.c | -rw-r--r-- | 12.7 KB |
sha1.c | -rw-r--r-- | 6.1 KB |
show_mem.c | -rw-r--r-- | 1.3 KB |
smp_processor_id.c | -rw-r--r-- | 1.1 KB |
sort.c | -rw-r--r-- | 2.5 KB |
spinlock_debug.c | -rw-r--r-- | 6.8 KB |
stmp_device.c | -rw-r--r-- | 2.1 KB |
string.c | -rw-r--r-- | 16.2 KB |
string_helpers.c | -rw-r--r-- | 1.7 KB |
strncpy_from_user.c | -rw-r--r-- | 2.9 KB |
strnlen_user.c | -rw-r--r-- | 3.6 KB |
swiotlb.c | -rw-r--r-- | 25.6 KB |
syscall.c | -rw-r--r-- | 2.4 KB |
test-kstrtox.c | -rw-r--r-- | 17.4 KB |
textsearch.c | -rw-r--r-- | 9.6 KB |
timerqueue.c | -rw-r--r-- | 3.1 KB |
ts_bm.c | -rw-r--r-- | 5.3 KB |
ts_fsm.c | -rw-r--r-- | 10.6 KB |
ts_kmp.c | -rw-r--r-- | 4.3 KB |
uuid.c | -rw-r--r-- | 1.4 KB |
vsprintf.c | -rw-r--r-- | 51.0 KB |
![swh spinner](/static/img/swh-spinner.gif)
Computing file changes ...