# git rev-parse -q --verify d9fb678414c048e185eaddadd18d75f5e8832ff3^{commit} d9fb678414c048e185eaddadd18d75f5e8832ff3 already have revision, skipping fetch # git checkout -q -f -B kisskb d9fb678414c048e185eaddadd18d75f5e8832ff3 # git clean -qxdf # < git log -1 # commit d9fb678414c048e185eaddadd18d75f5e8832ff3 # Merge: 707a63e9a9dd 9d37e1cab2a9 # Author: Linus Torvalds # Date: Mon Sep 20 15:49:02 2021 -0700 # # Merge tag 'afs-fixes-20210913' of git://git.kernel.org/pub/scm/linux/kernel/git/dhowells/linux-fs # # Pull AFS fixes from David Howells: # "Fixes for AFS problems that can cause data corruption due to # interaction with another client modifying data cached locally: # # - When d_revalidating a dentry, don't look at the inode to which it # points. Only check the directory to which the dentry belongs. This # was confusing things and causing the silly-rename cleanup code to # remove the file now at the dentry of a file that got deleted. # # - Fix mmap data coherency. When a callback break is received that # relates to a file that we have cached, the data content may have # been changed (there are other reasons, such as the user's rights # having been changed). However, we're checking it lazily, only on # entry to the kernel, which doesn't happen if we have a writeable # shared mapped page on that file. # # We make the kernel keep track of mmapped files and clear all PTEs # mapping to that file as soon as the callback comes in by calling # unmap_mapping_pages() (we don't necessarily want to zap the # pagecache). This causes the kernel to be reentered when userspace # tries to access the mmapped address range again - and at that point # we can query the server and, if we need to, zap the page cache. # # Ideally, I would check each file at the point of notification, but # that involves poking the server[*] - which is holding an exclusive # lock on the vnode it is changing, waiting for all the clients it # notified to reply. This could then deadlock against the server. # Further, invalidating the pagecache might call ->launder_page(), # which would try to write to the file, which would definitely # deadlock. (AFS doesn't lease file access). # # [*] Checking to see if the file content has changed is a matter of # comparing the current data version number, but we have to ask # the server for that. We also need to get a new callback promise # and we need to poke the server for that too. # # - Add some more points at which the inode is validated, since we're # doing it lazily, notably in ->read_iter() and ->page_mkwrite(), but # also when performing some directory operations. # # Ideally, checking in ->read_iter() would be done in some derivation # of filemap_read(). If we're going to call the server to read the # file, then we get the file status fetch as part of that. # # - The above is now causing us to make a lot more calls to # afs_validate() to check the inode - and afs_validate() takes the # RCU read lock each time to make a quick check (ie. # afs_check_validity()). This is entirely for the purpose of checking # cb_s_break to see if the server we're using reinitialised its list # of callbacks - however this isn't a very common event, so most of # the time we're taking this needlessly. # # Add a new cell-wide counter to count the number of # reinitialisations done by any server and check that - and only if # that changes, take the RCU read lock and check the server list (the # server list may change, but the cell a file is part of won't). # # - Don't update vnode->cb_s_break and ->cb_v_break inside the validity # checking loop. The cb_lock is done with read_seqretry, so we might # go round the loop a second time after resetting those values - and # that could cause someone else checking validity to miss something # (I think). # # Also included are patches for fixes for some bugs encountered whilst # debugging this: # # - Fix a leak of afs_read objects and fix a leak of keys hidden by # that. # # - Fix a leak of pages that couldn't be added to extend a writeback. # # - Fix the maintenance of i_blocks when i_size is changed by a local # write or a local dir edit" # # Link: https://bugzilla.kernel.org/show_bug.cgi?id=214217 [1] # Link: https://lore.kernel.org/r/163111665183.283156.17200205573146438918.stgit@warthog.procyon.org.uk/ # v1 # Link: https://lore.kernel.org/r/163113612442.352844.11162345591911691150.stgit@warthog.procyon.org.uk/ # i_blocks patch # # * tag 'afs-fixes-20210913' of git://git.kernel.org/pub/scm/linux/kernel/git/dhowells/linux-fs: # afs: Fix updating of i_blocks on file/dir extension # afs: Fix corruption in reads at fpos 2G-4G from an OpenAFS server # afs: Try to avoid taking RCU read lock when checking vnode validity # afs: Fix mmap coherency vs 3rd-party changes # afs: Fix incorrect triggering of sillyrename on 3rd-party invalidation # afs: Add missing vnode validation checks # afs: Fix page leak # afs: Fix missing put on afs_read objects and missing get on the key therein # < /opt/cross/kisskb/korg/gcc-8.1.0-nolibc/m68k-linux/bin/m68k-linux-gcc --version # < /opt/cross/kisskb/korg/gcc-8.1.0-nolibc/m68k-linux/bin/m68k-linux-ld --version # < git log --format=%s --max-count=1 d9fb678414c048e185eaddadd18d75f5e8832ff3 # < make -s -j 32 ARCH=m68k O=/kisskb/build/linus_m68k-allmodconfig_m68k-gcc8 CROSS_COMPILE=/opt/cross/kisskb/korg/gcc-8.1.0-nolibc/m68k-linux/bin/m68k-linux- allmodconfig # Added to kconfig CONFIG_BUILD_DOCSRC=n # Added to kconfig CONFIG_MODULE_SIG=n # Added to kconfig CONFIG_SAMPLES=n # < make -s -j 32 ARCH=m68k O=/kisskb/build/linus_m68k-allmodconfig_m68k-gcc8 CROSS_COMPILE=/opt/cross/kisskb/korg/gcc-8.1.0-nolibc/m68k-linux/bin/m68k-linux- help # make -s -j 32 ARCH=m68k O=/kisskb/build/linus_m68k-allmodconfig_m68k-gcc8 CROSS_COMPILE=/opt/cross/kisskb/korg/gcc-8.1.0-nolibc/m68k-linux/bin/m68k-linux- olddefconfig # make -s -j 32 ARCH=m68k O=/kisskb/build/linus_m68k-allmodconfig_m68k-gcc8 CROSS_COMPILE=/opt/cross/kisskb/korg/gcc-8.1.0-nolibc/m68k-linux/bin/m68k-linux- Completed OK # rm -rf /kisskb/build/linus_m68k-allmodconfig_m68k-gcc8 # Build took: 0:08:41.951681