android_kernel_xiaomi_sm8350/include/linux
NeilBrown 0feae5c47a [PATCH] Fix dcache race during umount
The race is that the shrink_dcache_memory shrinker could get called while a
filesystem is being unmounted, and could try to prune a dentry belonging to
that filesystem.

If it does, then it will call in to iput on the inode while the dentry is
no longer able to be found by the umounting process.  If iput takes a
while, generic_shutdown_super could get all the way though
shrink_dcache_parent and shrink_dcache_anon and invalidate_inodes without
ever waiting on this particular inode.

Eventually the superblock gets freed anyway and if the iput tried to touch
it (which some filesystems certainly do), it will lose.  The promised
"Self-destruct in 5 seconds" doesn't lead to a nice day.

The race is closed by holding s_umount while calling prune_one_dentry on
someone else's dentry.  As a down_read_trylock is used,
shrink_dcache_memory will no longer try to prune the dentry of a filesystem
that is being unmounted, and unmount will not be able to start until any
such active prune_one_dentry completes.

This requires that prune_dcache *knows* which filesystem (if any) it is
doing the prune on behalf of so that it can be careful of other
filesystems.  shrink_dcache_memory isn't called it on behalf of any
filesystem, and so is careful of everything.

shrink_dcache_anon is now passed a super_block rather than the s_anon list
out of the superblock, so it can get the s_anon list itself, and can pass
the superblock down to prune_dcache.

If prune_dcache finds a dentry that it cannot free, it leaves it where it
is (at the tail of the list) and exits, on the assumption that some other
thread will be removing that dentry soon.  To try to make sure that some
work gets done, a limited number of dnetries which are untouchable are
skipped over while choosing the dentry to work on.

I believe this race was first found by Kirill Korotaev.

Cc: Jan Blunck <jblunck@suse.de>
Acked-by: Kirill Korotaev <dev@openvz.org>
Cc: Olaf Hering <olh@suse.de>
Acked-by: Balbir Singh <balbir@in.ibm.com>
Signed-off-by: Neil Brown <neilb@suse.de>
Signed-off-by: Balbir Singh <balbir@in.ibm.com>
Acked-by: David Howells <dhowells@redhat.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
2006-06-22 15:05:57 -07:00
..
amba
byteorder
dvb
hdlc
isdn
lockd
mmc [ARM] 3531/1: i.MX/MX1 SD/MMC ensure, that clock are stopped before new command and cleanups 2006-05-19 21:48:03 +01:00
mtd Merge git://git.infradead.org/hdrcleanup-2.6 2006-06-20 15:10:08 -07:00
netfilter Merge git://git.infradead.org/hdrcleanup-2.6 2006-06-20 15:10:08 -07:00
netfilter_arp
netfilter_bridge
netfilter_ipv4 Merge git://git.infradead.org/hdrcleanup-2.6 2006-06-20 15:10:08 -07:00
netfilter_ipv6
nfsd
raid
spi [PATCH] SPI: busnum == 0 needs to work 2006-05-16 14:33:57 -07:00
sunrpc
tc_act
tc_ematch
usb [PATCH] USB: move <linux/usb_input.h> to <linux/usb/input.h> 2006-06-21 15:04:18 -07:00
8250_pci.h
a.out.h
ac97_codec.h
acct.h
acpi.h
adb.h
adfs_fs_i.h
adfs_fs_sb.h
adfs_fs.h
affs_fs.h
affs_hardblocks.h Include <linux/types.h> and use __uXX types in <linux/affs_hardblocks.h> 2006-05-04 15:49:24 +01:00
agp_backend.h
agpgart.h
aio_abi.h
aio.h
amifd.h
amifdreg.h
amigaffs.h
apm_bios.h
arcdevice.h
arcfb.h
ata.h
atalk.h
atm_eni.h
atm_he.h
atm_idt77105.h
atm_nicstar.h
atm_suni.h
atm_tcp.h
atm_zatm.h
atm.h
atmapi.h
atmarp.h
atmbr2684.h
atmclip.h
atmdev.h
atmioc.h
atmlec.h
atmmpc.h
atmppp.h
atmsap.h
atmsvc.h
attribute_container.h
audit.h Merge branch 'audit.b21' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/audit-current 2006-06-20 15:37:56 -07:00
auto_fs4.h
auto_fs.h
auxvec.h
awe_voice.h
ax25.h
b1lli.h
b1pcmcia.h
backing-dev.h
backlight.h
baycom.h
bcd.h
bfs_fs.h
binfmts.h
bio.h
bit_spinlock.h
bitmap.h
bitops.h
blkdev.h Merge master.kernel.org:/pub/scm/linux/kernel/git/jejb/scsi-misc-2.6 2006-06-21 11:18:25 -07:00
blkpg.h
blktrace_api.h
blockgroup_lock.h
bootmem.h
bpqether.h
buffer_head.h
cache.h
calc64.h
capability.h
capi.h
cciss_ioctl.h
cd1400.h
cdev.h
cdk.h
cdrom.h
chio.h
circ_buf.h
clk.h
cm4000_cs.h
cn_proc.h
cobalt-nvram.h
coda_cache.h
coda_fs_i.h
coda_linux.h
coda_proc.h
coda_psdev.h
coda.h
coff.h
com20020.h
compat_ioctl.h
compat.h
compiler-gcc3.h
compiler-gcc4.h
compiler-gcc.h
compiler-intel.h
compiler.h Restore __attribute_const__ to user-visibility in linux/compiler.h...for now 2006-05-04 00:41:02 +01:00
completion.h
comstats.h
concap.h
config.h
configfs.h
connector.h
console_struct.h
console.h Add support for suspending and resuming the whole console subsystem 2006-06-19 18:16:01 -07:00
consolemap.h
cpu.h
cpufreq.h
cpumask.h
cpuset.h
cramfs_fs_sb.h
cramfs_fs.h Include <linux/types.h> and use __uXX types in <linux/cramfs_fs.h> 2006-05-04 17:50:04 +01:00
crash_dump.h
crc16.h
crc32.h
crc32c.h
crc-ccitt.h
crypto.h
cryptohash.h
ctype.h
cuda.h
cyclades.h
cyclomx.h
cycx_cfm.h
cycx_drv.h
cycx_x25.h
dcache.h [PATCH] Fix dcache race during umount 2006-06-22 15:05:57 -07:00
dccp.h
dcookies.h
debugfs.h
delay.h
devfs_fs_kernel.h
devfs_fs.h
device-mapper.h
device.h [PATCH] Driver Core: Make dev_info and friends print the bus name if there is no driver 2006-06-21 12:40:49 -07:00
devpts_fs.h
dio.h
dirent.h
divert.h Use __uXX types in <linux/divert.h> for struct divert_blk et al. 2006-05-04 15:07:59 +01:00
dm9000.h
dm-ioctl.h
dma-mapping.h dl2k: use DMA_48BIT_MASK constant 2006-05-10 14:04:22 -07:00
dmaengine.h [I/OAT]: Utility functions for offloading sk_buff to iovec copies 2006-06-17 21:25:46 -07:00
dmapool.h
dmi.h
dn.h
dnotify.h
dqblk_v1.h
dqblk_v2.h
dqblk_xfs.h
ds1286.h
ds1742rtc.h
ds17287rtc.h
dtlk.h
edd.h
efi.h
efs_dir.h
efs_fs_i.h
efs_fs_sb.h
efs_fs.h
efs_vh.h
eisa.h
elevator.h [PATCH] elevator switching race 2006-06-08 15:14:23 -07:00
elf-em.h
elf-fdpic.h
elf.h
elfcore.h
err.h
errno.h
errqueue.h
etherdevice.h
ethtool.h
eventpoll.h
ext2_fs_sb.h
ext2_fs.h
ext3_fs_i.h
ext3_fs_sb.h
ext3_fs.h Remove private struct dx_hash_info from public view in <linux/ext3_fs.h> 2006-05-04 17:28:26 +01:00
ext3_jbd.h
fadvise.h
fb.h
fcdevice.h
fcntl.h
fd1772.h
fd.h
fddidevice.h
fdreg.h
file.h
filter.h
firmware.h [PATCH] drivers/base/firmware_class.c: cleanups 2006-05-21 12:59:19 -07:00
flat.h
font.h
fs_enet_pd.h
fs_struct.h
fs_uart_pd.h [PATCH] ppc32 CPM_UART: fixes and improvements 2006-05-03 23:06:44 +10:00
fs.h [PATCH] remove steal_locks() 2006-06-22 15:05:57 -07:00
fsl_devices.h [PATCH] spi: add spi master driver for Freescale MPC83xx SPI controller 2006-05-21 12:59:19 -07:00
fsnotify.h [PATCH] log more info for directory entry change events 2006-06-20 05:25:28 -04:00
ftape-header-segment.h
ftape-vendors.h
ftape.h
fuse.h
futex.h
gameport.h
gen_stats.h
genalloc.h
generic_serial.h
genetlink.h
genhd.h
gfp.h
gigaset_dev.h
hardirq.h
harrier_defs.h
hash.h
hayesesp.h
hdlc.h
hdlcdrv.h
hdpu_features.h
hdreg.h
hdsmart.h
hiddev.h
highmem.h
highuid.h
hil_mlc.h
hil.h
hippidevice.h
hp_sdc.h
hpet.h
hpfs_fs.h
hrtimer.h
hugetlb.h
hwmon-sysfs.h
hwmon-vid.h
hwmon.h
hysdn_if.h
i2c-algo-bit.h
i2c-algo-ite.h
i2c-algo-pca.h
i2c-algo-pcf.h
i2c-algo-sgi.h
i2c-algo-sibyte.h
i2c-dev.h
i2c-id.h
i2c-isa.h
i2c-pxa.h
i2c.h
i2o-dev.h Use __uXX types in <linux/i2o_dev.h>, include <linux/ioctl.h> too 2006-05-04 17:32:44 +01:00
i2o.h [PATCH] I2O: Bugfixes to get I2O working again 2006-06-10 11:02:05 -07:00
i8k.h
ibmtr.h
icmp.h
icmpv6.h
ide.h
idr.h
if_arcnet.h
if_arp.h
if_bonding.h
if_bridge.h
if_cablemodem.h
if_ec.h
if_eql.h
if_ether.h
if_fc.h
if_fddi.h Remove struct fddi_statistics from user view in <linux/if_fddi.h> 2006-05-16 23:25:37 +01:00
if_frad.h
if_hippi.h
if_infiniband.h
if_ltalk.h
if_packet.h
if_plip.h
if_ppp.h
if_pppox.h
if_shaper.h
if_slip.h
if_strip.h
if_tr.h
if_tun.h
if_tunnel.h
if_vlan.h
if_wanpipe_common.h
if_wanpipe.h
if.h
igmp.h [IPV4] igmp: Fixup struct ip_mc_list::multiaddr type 2006-06-17 21:29:37 -07:00
in6.h
in_route.h
in.h
inet_diag.h
inet.h
inetdevice.h
init_task.h
init.h
initrd.h
inotify.h [PATCH] inotify (4/5): allow watch removal from event handler 2006-06-20 05:25:19 -04:00
input.h Merge git://git.infradead.org/hdrcleanup-2.6 2006-06-20 15:10:08 -07:00
interrupt.h
io.h [PATCH] add __iowrite64_copy 2006-06-20 20:24:58 -07:00
ioc3.h
ioc4.h
ioctl32.h
ioctl.h
ioport.h
ioprio.h
ip6_tunnel.h
ip_mp_alg.h
ip.h
ipc.h
ipmi_msgdefs.h
ipmi_smi.h
ipmi.h
ipsec.h
ipv6_route.h
ipv6.h
ipx.h
irda.h
irq_cpustat.h
irq.h
isa.h [PATCH] Driver model: add ISA bus 2006-06-21 12:40:49 -07:00
isapnp.h
isdn_divertif.h
isdn_ppp.h
isdn.h
isdnif.h
isicom.h
iso_fs.h
istallion.h
ite_gpio.h
ixjuser.h
jbd.h
jffs2.h Merge git://git.infradead.org/jffs2-xattr-2.6 2006-05-20 17:27:32 +01:00
jffs.h
jhash.h
jiffies.h
journal-head.h
joystick.h Switch to __s32 types in joystick.h instead of C99 types for consistency. 2006-06-03 00:27:53 +01:00
kallsyms.h
kbd_diacr.h
kbd_kern.h
kd.h
kdev_t.h
kernel_stat.h
kernel.h [PATCH] symbol_put_addr() locks kernel 2006-05-15 11:20:55 -07:00
kernelcapi.h
kexec.h
key-ui.h
key.h [PATCH] Keys: Fix race between two instantiators of a key 2006-06-22 15:05:56 -07:00
keyboard.h
keyctl.h
kfifo.h
klist.h
kmalloc_sizes.h
kmod.h
kobj_map.h
kobject.h [PATCH] Driver Core: Add /sys/hypervisor when needed 2006-06-21 12:40:48 -07:00
kprobes.h
kref.h
kthread.h
ktime.h
lapb.h
lcd.h
leds.h
libata.h
libps2.h
limits.h
linkage.h
linux_logo.h
list.h
llc.h
loop.h
lp.h
m48t86.h [PATCH] m48t86: ia64 build fix 2006-06-05 12:29:17 -07:00
major.h
matroxfb.h
mbcache.h
mc6821.h
mc146818rtc.h
mca-legacy.h
mca.h
memory_hotplug.h
memory.h
mempolicy.h Merge git://git.infradead.org/hdrcleanup-2.6 2006-06-20 15:10:08 -07:00
mempool.h
meye.h
migrate.h
mii.h
minix_fs.h
miscdevice.h
mm_inline.h
mm.h
mman.h
mmtimer.h
mmzone.h Merge git://git.infradead.org/hdrcleanup-2.6 2006-06-20 15:10:08 -07:00
mod_devicetable.h
module.h Merge git://git.infradead.org/hdrcleanup-2.6 2006-06-20 15:10:08 -07:00
moduleloader.h
moduleparam.h
mount.h
mpage.h
mqueue.h
mroute.h
msdos_fs.h
msg.h
mtio.h
mutex-debug.h
mutex.h
mv643xx.h
n_r3964.h
namei.h
namespace.h
nbd.h Use __uXX types in user-visible structures in <linux/nbd.h> 2006-05-04 02:55:50 +01:00
ncp_fs_i.h
ncp_fs_sb.h
ncp_fs.h
ncp_mount.h
ncp_no.h
ncp.h
net.h
netdevice.h Merge master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6 2006-06-20 17:39:53 -07:00
netfilter_arp.h
netfilter_bridge.h
netfilter_decnet.h
netfilter_ipv4.h
netfilter_ipv6.h
netfilter_logging.h
netfilter.h
netlink.h
netpoll.h
netrom.h
nfs2.h
nfs3.h
nfs4_acl.h
nfs4_mount.h
nfs4.h
nfs_fs_i.h
nfs_fs_sb.h
nfs_fs.h
nfs_idmap.h
nfs_mount.h
nfs_page.h
nfs_xdr.h
nfs.h
nfsacl.h
nfsd_idmap.h
nls.h
nmi.h
node.h
nodemask.h
notifier.h
nubus.h
numa.h
nvram.h
openprom_fs.h
oprofile.h
page-flags.h
pagemap.h
pagevec.h
param.h
parport_pc.h
parport.h
parser.h
patchkey.h
pci_ids.h Merge master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6 2006-06-19 18:55:56 -07:00
pci_regs.h [PATCH] PCI: Add PCI_CAP_ID_VNDR 2006-06-22 15:05:56 -07:00
pci-acpi.h [PATCH] PCI: fix pciehp compile issue when CONFIG_ACPI is not enabled 2006-06-11 14:02:27 -07:00
pci.h Merge git://git.infradead.org/hdrcleanup-2.6 2006-06-20 15:10:08 -07:00
pcieport_if.h
percpu_counter.h
percpu.h
personality.h
pfkeyv2.h [PFKEYV2]: Fix inconsistent typing in struct sadb_x_kmprivate. 2006-06-17 22:54:03 -07:00
pfn.h
pg.h
phonedev.h
phy.h
pid.h
pipe_fs_i.h [PATCH] splice: LRU fixups 2006-05-04 06:55:12 +02:00
pkt_cls.h
pkt_sched.h
pktcdvd.h
platform_device.h
pm_legacy.h
pm.h
pmu.h
pnp.h
pnpbios.h
poll.h
posix_acl_xattr.h
posix_acl.h
posix_types.h
posix-timers.h
ppdev.h
ppp_channel.h
ppp_defs.h Remove PPP_FCS from user view in <linux/ppp_defs.h>, remove __P mess entirely 2006-05-04 12:07:37 +01:00
ppp-comp.h
prctl.h
preempt.h
prefetch.h
prio_tree.h
proc_fs.h
profile.h
ps2esdi.h
ptrace.h
qic117.h
qnx4_fs.h
qnxtypes.h
quota.h
quotaio_v1.h
quotaio_v2.h
quotaops.h
radeonfb.h
radix-tree.h
raid_class.h
ramfs.h
random.h
raw.h
rbtree.h [RBTREE] Switch rb_colour() et al to en_US spelling of 'color' for consistency 2006-06-05 20:19:05 +01:00
rcupdate.h [PATCH] RCU: introduce rcu_needs_cpu() interface 2006-05-15 11:20:55 -07:00
reboot_fixups.h
reboot.h
reiserfs_acl.h
reiserfs_fs_i.h
reiserfs_fs_sb.h
reiserfs_fs.h
reiserfs_xattr.h
relay.h
resource.h
rio_drv.h
rio_ids.h
rio_regs.h
rio.h
rmap.h
romfs_fs.h
root_dev.h
rose.h
route.h
rslib.h
rtc.h
rtnetlink.h
rwsem-spinlock.h
rwsem.h
sc26198.h
scatterlist.h
scc.h
sched.h Merge branch 'audit.b21' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/audit-current 2006-06-20 15:37:56 -07:00
screen_info.h
sctp.h
scx200_gpio.h
scx200.h
sdla_fr.h
sdla.h
seccomp.h
securebits.h
security.h [PATCH] selinux: add hooks for key subsystem 2006-06-22 15:05:55 -07:00
selection.h
selinux_netlink.h
selinux.h [SECMARK]: Add SELinux exports 2006-06-17 21:29:55 -07:00
sem.h
seq_file.h
seqlock.h
serial167.h
serial_8250.h
serial_core.h Merge branch 'devel' of master.kernel.org:/home/rmk/linux-2.6-arm 2006-06-20 17:52:36 -07:00
serial_ip3106.h
serial_reg.h
serial.h
serialP.h
serio.h
shm.h
shmem_fs.h
signal.h
skbuff.h Merge git://git.infradead.org/hdrcleanup-2.6 2006-06-20 15:10:08 -07:00
slab.h Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6 2006-05-24 09:22:21 +01:00
smb_fs_i.h
smb_fs_sb.h
smb_fs.h
smb_mount.h
smb.h
smbno.h
smp_lock.h
smp.h
snmp.h
socket.h
sockios.h
som.h
sonet.h
sonypi.h
sort.h
sound.h
soundcard.h
spinlock_api_smp.h
spinlock_api_up.h
spinlock_types_up.h
spinlock_types.h
spinlock_up.h
spinlock.h
stallion.h
stat.h
statfs.h
stddef.h
stop_machine.h
string.h
stringify.h
superhyway.h
suspend.h
swap.h Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6 2006-05-24 09:22:21 +01:00
swapops.h
synclink.h
sys.h
syscalls.h Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6 2006-05-24 09:22:21 +01:00
sysctl.h [TCP]: Add tcp_slow_start_after_idle sysctl. 2006-06-17 21:30:53 -07:00
sysdev.h [PATCH] Driver Core: Allow sysdev_class have attributes 2006-06-21 12:40:48 -07:00
sysfs.h
sysrq.h
sysv_fs.h
tcp.h Merge git://git.infradead.org/hdrcleanup-2.6 2006-06-20 15:10:08 -07:00
telephony.h
termios.h
textsearch_fsm.h
textsearch.h
tfrc.h
thread_info.h
threads.h
ticable.h
time.h
timer.h
times.h
timex.h
tiocl.h
tipc_config.h
tipc.h
topology.h
toshiba.h
transport_class.h
trdevice.h
tty_driver.h
tty_flip.h
tty_ldisc.h
tty.h [PATCH] TTY: return class device pointer from tty_register_device() 2006-06-21 12:40:47 -07:00
types.h
udf_fs_i.h
udf_fs_sb.h
udf_fs.h
udp.h
ufs_fs_i.h
ufs_fs_sb.h
ufs_fs.h Remove unneeded inclusion of <linux/time.h> from <linux/ufs_fs.h> 2006-05-04 00:59:14 +01:00
uinput.h
uio.h
ultrasound.h
umem.h
un.h
unistd.h
usb_ch9.h
usb_gadget.h
usb_gadgetfs.h
usb_otg.h
usb_usual.h
usb.h [PATCH] USB: convert usb class devices to real devices 2006-06-21 15:04:19 -07:00
usbdevice_fs.h
user.h
utime.h
uts.h
utsname.h
vermagic.h
vfs.h
via.h
video_decoder.h
video_encoder.h
videodev2.h V4L/DVB (3774): Create V4L1 config options 2006-05-12 19:54:53 -03:00
videodev.h
videotext.h
vmalloc.h
vt_buffer.h
vt_kern.h Merge git://git.infradead.org/hdrcleanup-2.6 2006-06-20 15:10:08 -07:00
vt.h
wait.h
wanrouter.h
watchdog.h
wavefront.h
wireless.h
workqueue.h
writeback.h
x25.h
xattr.h
xfrm.h [IPSEC] xfrm: Abstract out encapsulation modes 2006-06-17 21:28:39 -07:00
yam.h
zconf.h
zftape.h
zlib.h
zorro_ids.h
zorro.h
zutil.h