Trond Myklebust
daf3761c9f
namei: results of d_is_negative() should be checked after dentry revalidation
...
Leandro Awa writes:
"After switching to version 4.1.6, our parallelized and distributed
workflows now fail consistently with errors of the form:
T34: ./regex.c:39:22: error: config.h: No such file or directory
From our 'git bisect' testing, the following commit appears to be the
possible cause of the behavior we've been seeing: commit 766c4cbfac "
Al Viro says:
"What happens is that 766c4cbfac got the things subtly wrong.
We used to treat d_is_negative() after lookup_fast() as "fall with
ENOENT". That was wrong - checking ->d_flags outside of ->d_seq
protection is unreliable and failing with hard error on what should've
fallen back to non-RCU pathname resolution is a bug.
Unfortunately, we'd pulled the test too far up and ran afoul of
another kind of staleness. The dentry might have been absolutely
stable from the RCU point of view (and we might be on UP, etc), but
stale from the remote fs point of view. If ->d_revalidate() returns
"it's actually stale", dentry gets thrown away and the original code
wouldn't even have looked at its ->d_flags.
What we need is to check ->d_flags where 766c4cbfac does (prior to
->d_seq validation) but only use the result in cases where we do not
discard this dentry outright"
Reported-by: Leandro Awa <lawa@nvidia.com>
Link: https://bugzilla.kernel.org/show_bug.cgi?id=104911
Fixes: 766c4cbfac ("namei: d_is_negative() should be checked...")
Tested-by: Leandro Awa <lawa@nvidia.com>
Cc: stable@vger.kernel.org # v4.1+
Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
Acked-by: Al Viro <viro@zeniv.linux.org.uk>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2015-10-10 10:17:27 -07:00
..
9p
9p: fix return code of read() when count is 0
2015-08-23 14:21:36 -05:00
adfs
fs/adfs: remove unneeded cast
2015-06-30 19:44:57 -07:00
affs
fs/affs: make root lookup from blkdev logical size
2015-09-10 13:29:01 -07:00
afs
net: Add a struct net parameter to sock_create_kern
2015-05-11 10:50:17 -04:00
autofs4
make simple_positive() public
2015-06-23 18:02:01 -04:00
befs
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
2015-07-04 19:36:06 -07:00
bfs
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
2015-04-26 17:22:07 -07:00
btrfs
Merge branch 'for-linus-4.3' of git://git.kernel.org/pub/scm/linux/kernel/git/mason/linux-btrfs
2015-10-09 16:39:35 -07:00
cachefiles
Merge branch 'fscache-fixes' into for-next
2015-06-23 18:01:30 -04:00
ceph
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/sage/ceph-client
2015-09-11 12:33:03 -07:00
cifs
[CIFS] Update cifs version number
2015-10-03 16:54:17 -05:00
coda
fs/coda: fix readlink buffer overflow
2015-09-10 13:29:01 -07:00
configfs
configfs: fix kernel infoleak through user-controlled format string
2015-07-17 16:39:53 -07:00
cramfs
debugfs
debugfs: Export bool read/write functions
2015-07-20 18:44:50 +01:00
devpts
devpts: if initialization failed, don't crash when opening /dev/ptmx
2015-06-30 19:44:58 -07:00
dlm
dlm for 4.3
2015-09-03 12:57:48 -07:00
ecryptfs
Invalidate stale eCryptfs dcache entries caused by unlinked lower inodes
2015-09-08 11:26:17 -07:00
efivarfs
Merge branch 'x86-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
2015-05-06 10:57:37 -07:00
efs
fs/efs: femove unneeded cast
2015-06-25 17:00:42 -07:00
exofs
pagemap.h: move dir_pages() over there
2015-06-23 18:02:00 -04:00
exportfs
ext2
ext2: huge page fault support
2015-09-08 15:35:28 -07:00
ext4
ext4: start transaction before calling into DAX
2015-09-08 15:35:28 -07:00
f2fs
Merge tag 'for-f2fs-4.3' of git://git.kernel.org/pub/scm/linux/kernel/git/jaegeuk/f2fs
2015-09-03 13:10:22 -07:00
fat
writeback: separate out include/linux/backing-dev-defs.h
2015-06-02 08:33:34 -06:00
freevxfs
freevxfs: Grammar s/an negative/a negative/
2015-08-07 13:59:24 +02:00
fscache
FS-Cache: Retain the netfs context in the retrieval op earlier
2015-04-02 14:28:53 +01:00
fuse
fs/fuse: fix ioctl type confusion
2015-08-16 12:35:44 -07:00
gfs2
GFS2: merge window
2015-09-11 12:23:51 -07:00
hfs
hfs: fix B-tree corruption after insertion at position 0
2015-09-10 13:29:01 -07:00
hfsplus
hfs,hfsplus: cache pages correctly between bnode_create and bnode_free
2015-09-10 13:29:01 -07:00
hostfs
fs: create and use seq_show_option for escaping
2015-09-04 16:54:41 -07:00
hpfs
hpfs: update ctime and mtime on directory modification
2015-09-03 11:55:30 -07:00
hugetlbfs
hugetlbfs: add hugetlbfs_fallocate()
2015-09-08 15:35:28 -07:00
isofs
VFS: normal filesystems (and lustre): d_inode() annotations
2015-04-15 15:06:57 -04:00
jbd2
jbd2: limit number of reserved credits
2015-08-04 11:21:52 -04:00
jffs2
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
2015-07-04 19:36:06 -07:00
jfs
Merge branch 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jack/linux-fs
2015-09-03 12:28:30 -07:00
kernfs
kernfs: implement kernfs_path_len()
2015-08-18 15:49:15 -07:00
lockd
lockd: NLM grace period shouldn't block NFSv4 opens
2015-08-13 10:22:06 -04:00
logfs
block: remove bio_get_nr_vecs()
2015-08-13 12:32:04 -06:00
minix
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
2015-07-04 19:36:06 -07:00
ncpfs
ncpfs: successful rename() should invalidate caches for parents
2015-06-14 11:31:39 -04:00
nfs
NFS: Fix a tracepoint NULL-pointer dereference
2015-10-06 18:56:25 -04:00
nfs_common
lockd: NLM grace period shouldn't block NFSv4 opens
2015-08-13 10:22:06 -04:00
nfsd
NFS client updates for Linux 4.3
2015-09-07 14:02:24 -07:00
nilfs2
block: remove bio_get_nr_vecs()
2015-08-13 12:32:04 -06:00
nls
notify
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
2015-09-05 20:34:28 -07:00
ntfs
ntfs: delete unnecessary checks before calling iput()
2015-09-04 16:54:41 -07:00
ocfs2
ocfs2/dlm: fix deadlock when dispatch assert master
2015-09-22 15:09:53 -07:00
omfs
omfs: fix potential integer overflow in allocator
2015-05-28 18:25:19 -07:00
openpromfs
overlayfs
fs: create and use seq_show_option for escaping
2015-09-04 16:54:41 -07:00
proc
proc: convert to kstrto*()/kstrto*_from_user()
2015-09-10 13:29:01 -07:00
pstore
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/ebiederm/user-namespace
2015-07-03 15:20:57 -07:00
qnx4
qnx6
pagemap.h: move dir_pages() over there
2015-06-23 18:02:00 -04:00
quota
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
2015-09-05 20:34:28 -07:00
ramfs
VFS: normal filesystems (and lustre): d_inode() annotations
2015-04-15 15:06:57 -04:00
reiserfs
fs: create and use seq_show_option for escaping
2015-09-04 16:54:41 -07:00
romfs
make new_sync_{read,write}() static
2015-04-11 22:29:40 -04:00
squashfs
fs: cleanup slight list_entry abuse
2015-06-23 18:01:59 -04:00
sysfs
vfs: Commit to never having exectuables on proc and sysfs.
2015-07-10 10:39:25 -05:00
sysv
pagemap.h: move dir_pages() over there
2015-06-23 18:02:00 -04:00
tracefs
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
2015-07-04 19:36:06 -07:00
ubifs
UBIFS: Kill unneeded locking in ubifs_init_security
2015-09-29 12:45:42 +02:00
udf
udf: Don't modify filesystem for read-only mounts
2015-08-20 14:58:35 +02:00
ufs
fix ufs write vs readpage race when writing into a hole
2015-09-09 10:43:12 -07:00
xfs
xfs: huge page fault support
2015-09-08 15:35:28 -07:00
aio.c
mm: move ->mremap() from file_operations to vm_operations_struct
2015-09-04 16:54:41 -07:00
anon_inodes.c
attr.c
bad_inode.c
binfmt_aout.c
binfmt_elf.c
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
2015-07-04 19:36:06 -07:00
binfmt_elf_fdpic.c
binfmt_em86.c
binfmt_flat.c
binfmt_misc.c
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
2015-04-26 17:22:07 -07:00
binfmt_script.c
block_dev.c
blockdev: don't set S_DAX for misaligned partitions
2015-09-15 20:08:05 -04:00
buffer.c
fs: use helper bio_add_page() instead of open coding on bi_io_vec
2015-08-13 12:32:00 -06:00
char_dev.c
fs/char_dev.c: fix incorrect documentation for unregister_chrdev_region
2015-08-05 13:49:35 -07:00
compat.c
compat_binfmt_elf.c
compat_ioctl.c
ioctl_compat: handle FITRIM
2015-07-09 11:42:21 -07:00
coredump.c
fs: Don't dump core if the corefile would become world-readable.
2015-09-10 13:29:01 -07:00
dax.c
dax: fix NULL pointer in __dax_pmd_fault()
2015-10-01 21:42:35 -04:00
dcache.c
dcache: Reduce the scope of i_lock in d_splice_alias
2015-08-21 02:34:37 -04:00
dcookies.c
direct-io.c
block: remove bio_get_nr_vecs()
2015-08-13 12:32:04 -06:00
drop_caches.c
inode: convert inode_sb_list_lock to per-sb
2015-08-17 18:39:46 -04:00
eventfd.c
eventpoll.c
exec.c
vfs: Commit to never having exectuables on proc and sysfs.
2015-07-10 10:39:25 -05:00
fcntl.c
fhandle.c
vfs: read file_handle only once in handle_to_path
2015-06-02 10:29:07 -07:00
file.c
fs/file.c: __fget() and dup2() atomicity rules
2015-07-01 02:31:08 -04:00
file_table.c
fs, file table: reinit files_stat.max_files after deferred memory initialisation
2015-08-07 04:39:40 +03:00
filesystems.c
fs-writeback.c
fs-writeback: unplug before cond_resched in writeback_sb_inodes
2015-09-19 18:50:19 -07:00
fs_pin.c
fs_pin: Allow for the possibility that m_list or s_list go unused.
2015-04-09 11:39:55 -05:00
fs_struct.c
inode.c
inode: don't softlockup when evicting inodes
2015-08-18 10:20:09 -07:00
internal.h
inode: rename i_wb_list to i_io_list
2015-08-17 23:38:10 -04:00
ioctl.c
Kconfig
fs: Remove ext3 filesystem driver
2015-07-23 20:59:40 +02:00
Kconfig.binfmt
mm: split ET_DYN ASLR from mmap ASLR
2015-04-14 16:49:05 -07:00
libfs.c
fs: Set the size of empty dirs to 0.
2015-08-12 15:28:45 -05:00
locks.c
fs: fix fs/locks.c kernel-doc warning
2015-08-31 16:27:25 -04:00
Makefile
userfaultfd: buildsystem activation
2015-09-04 16:54:41 -07:00
mbcache.c
mount.h
fs: use seq_open_private() for proc_mounts
2015-06-30 19:44:56 -07:00
mpage.c
block: remove bio_get_nr_vecs()
2015-08-13 12:32:04 -06:00
namei.c
namei: results of d_is_negative() should be checked after dentry revalidation
2015-10-10 10:17:27 -07:00
namespace.c
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/ebiederm/user-namespace
2015-09-01 16:13:25 -07:00
no-block.c
nsfs.c
fs/seq_file: convert int seq_vprint/seq_printf/etc... returns to void
2015-09-11 15:21:34 -07:00
open.c
vfs: Commit to never having exectuables on proc and sysfs.
2015-07-10 10:39:25 -05:00
pipe.c
VFS: assorted weird filesystems: d_inode() annotations
2015-04-15 15:06:58 -04:00
pnode.c
mnt: Don't propagate unmounts to locked mounts
2015-04-02 20:34:20 -05:00
pnode.h
mnt: Clarify and correct the disconnect logic in umount_tree
2015-07-22 20:33:27 -05:00
posix_acl.c
fs/posix_acl.c: make posix_acl_create() safer and cleaner
2015-06-23 18:01:07 -04:00
proc_namespace.c
fs: use seq_open_private() for proc_mounts
2015-06-30 19:44:56 -07:00
read_write.c
new_sync_write(): discard ->ki_pos unless the return value is positive
2015-04-11 22:29:46 -04:00
readdir.c
select.c
locking/arch: Rename set_mb() to smp_store_mb()
2015-05-19 08:32:00 +02:00
seq_file.c
fs/seq_file: convert int seq_vprint/seq_printf/etc... returns to void
2015-09-11 15:21:34 -07:00
signalfd.c
signalfd: fix information leak in signalfd_copyinfo
2015-08-07 04:39:40 +03:00
splice.c
Merge branch 'akpm' (patches from Andrew)
2015-06-24 20:47:21 -07:00
stack.c
stat.c
VFS: assorted d_backing_inode() annotations
2015-04-15 15:06:59 -04:00
statfs.c
super.c
Merge branch 'superblock-scaling' of git://git.kernel.org/pub/scm/linux/kernel/git/josef/btrfs-next into for-next
2015-08-21 02:31:20 -04:00
sync.c
timerfd.c
userfaultfd.c
userfaultfd: revert "userfaultfd: waitqueue: add nr wake parameter to __wake_up_locked_key"
2015-09-22 15:09:53 -07:00
utimes.c
xattr.c
evm: fix potential race when removing xattrs
2015-05-21 13:28:47 -04:00