<feed xmlns='http://www.w3.org/2005/Atom'>
<title>linux/drivers/clocksource/Makefile, branch v3.4.47</title>
<subtitle>Linux kernel source tree</subtitle>
<id>https://git.amat.us/linux/atom/drivers/clocksource/Makefile?h=v3.4.47</id>
<link rel='self' href='https://git.amat.us/linux/atom/drivers/clocksource/Makefile?h=v3.4.47'/>
<link rel='alternate' type='text/html' href='https://git.amat.us/linux/'/>
<updated>2011-09-22T13:42:57Z</updated>
<entry>
<title>clocksource: add DBX500 PRCMU Timer support</title>
<updated>2011-09-22T13:42:57Z</updated>
<author>
<name>Mattias Wallin</name>
<email>mattias.wallin@stericsson.com</email>
</author>
<published>2011-05-27T08:30:12Z</published>
<link rel='alternate' type='text/html' href='https://git.amat.us/linux/commit/?id=489bccea6334514a8e13436f10d0a274777bf17a'/>
<id>urn:sha1:489bccea6334514a8e13436f10d0a274777bf17a</id>
<content type='text'>
This patch adds the DBX500 PRCMU Timer driver as a clocksource
and as sched_clock.

Cc: Thomas Gleixner &lt;tglx@linutronix.de&gt;
Signed-off-by: Mattias Wallin &lt;mattias.wallin@stericsson.com&gt;
Signed-off-by: Jonas Aaberg &lt;jonas.aberg@stericsson.com&gt;
Signed-off-by: Linus Walleij &lt;linus.walleij@linaro.org&gt;
</content>
</entry>
<entry>
<title>Merge branch 'timers-clocksource-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip</title>
<updated>2011-07-23T17:34:47Z</updated>
<author>
<name>Linus Torvalds</name>
<email>torvalds@linux-foundation.org</email>
</author>
<published>2011-07-23T17:34:47Z</published>
<link rel='alternate' type='text/html' href='https://git.amat.us/linux/commit/?id=9d0715630ebf7bf70daa5e6d8db0e3061268c61e'/>
<id>urn:sha1:9d0715630ebf7bf70daa5e6d8db0e3061268c61e</id>
<content type='text'>
* 'timers-clocksource-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip:
  clocksource: apb: Share APB timer code with other platforms
</content>
</entry>
<entry>
<title>clocksource: apb: Share APB timer code with other platforms</title>
<updated>2011-06-27T22:16:21Z</updated>
<author>
<name>Jamie Iles</name>
<email>jamie@jamieiles.com</email>
</author>
<published>2011-06-06T11:43:07Z</published>
<link rel='alternate' type='text/html' href='https://git.amat.us/linux/commit/?id=06c3df49521c1b112b777cc4946e5de057c814ba'/>
<id>urn:sha1:06c3df49521c1b112b777cc4946e5de057c814ba</id>
<content type='text'>
The APB timers are an IP block from Synopsys (DesignWare APB timers)
and are also found in other systems including ARM SoC's.  This patch
adds functions for creating clock_event_devices and clocksources from
APB timers but does not do the resource allocation.  This is handled
in a higher layer to allow the timers to be created from multiple
methods such as platform_devices.

Cc: Thomas Gleixner &lt;tglx@linutronix.de&gt;
Cc: Ingo Molnar &lt;mingo@redhat.com&gt;
Cc: "H. Peter Anvin" &lt;hpa@zytor.com&gt;
Cc: Jacob Pan &lt;jacob.jun.pan@linux.intel.com&gt;
Signed-off-by: Jamie Iles &lt;jamie@jamieiles.com&gt;
Signed-off-by: John Stultz &lt;john.stultz@linaro.org&gt;
</content>
</entry>
<entry>
<title>i8253: Consolidate all kernel definitions of i8253_lock</title>
<updated>2011-06-09T13:01:38Z</updated>
<author>
<name>Ralf Baechle</name>
<email>ralf@linux-mips.org</email>
</author>
<published>2011-06-01T18:04:59Z</published>
<link rel='alternate' type='text/html' href='https://git.amat.us/linux/commit/?id=15f304b664c0d0a3e76ed3a9ce3615a86908babe'/>
<id>urn:sha1:15f304b664c0d0a3e76ed3a9ce3615a86908babe</id>
<content type='text'>
Move them to drivers/clocksource/i8253.c and remove the
implementations in arch/

[ tglx: Avoid the extra file in lib - folded arch patches in. The
  export will become conditional in a later step ]

Signed-off-by: Ralf Baechle &lt;ralf@linux-mips.org&gt;
Link: http://lkml.kernel.org/r/20110601180610.221426078@duck.linux-mips.net
Cc: Russell King &lt;linux@arm.linux.org.uk&gt;
Signed-off-by: Thomas Gleixner &lt;tglx@linutronix.de&gt;

</content>
</entry>
<entry>
<title>clocksource: add common mmio clocksource</title>
<updated>2011-05-23T17:04:51Z</updated>
<author>
<name>Russell King</name>
<email>rmk+kernel@arm.linux.org.uk</email>
</author>
<published>2011-05-08T13:06:52Z</published>
<link rel='alternate' type='text/html' href='https://git.amat.us/linux/commit/?id=442c8176d2efa468577738e3a99a6e051f6e8e55'/>
<id>urn:sha1:442c8176d2efa468577738e3a99a6e051f6e8e55</id>
<content type='text'>
Add a generic mmio clocksource, covering both 32-bit and 16-bit register
access sizes, for up or down counters.  This can be used to easily
create clocksources for simple counter-based implementations.

Cc: Alessandro Rubini &lt;rubini@unipv.it&gt;
Cc: Colin Cross &lt;ccross@android.com&gt;
Cc: Eric Miao &lt;eric.y.miao@gmail.com&gt;
Cc: Erik Gilling &lt;konkers@android.com&gt;
Acked-by: "Hans J. Koch" &lt;hjk@hansjkoch.de&gt;
Cc: Imre Kaloz &lt;kaloz@openwrt.org&gt;
Cc: Krzysztof Halasa &lt;khc@pm.waw.pl&gt;
Cc: Kukjin Kim &lt;kgene.kim@samsung.com&gt;
Cc: Lennert Buytenhek &lt;kernel@wantstofly.org&gt;
Cc: Linus Walleij &lt;linus.walleij@stericsson.com&gt;
Cc: linux-omap@vger.kernel.org
Acked-by: Nicolas Pitre &lt;nico@fluxnic.net&gt;
Cc: Olof Johansson &lt;olof@lixom.net&gt;
Tested-by: Sascha Hauer &lt;s.hauer@pengutronix.de&gt;
Reviewed-by: Thomas Gleixner &lt;tglx@linutronix.de&gt;
Tested-by: Tony Lindgren &lt;tony@atomide.com&gt;
Reviewed-by: Viresh Kumar &lt;viresh.kumar@st.com&gt;
Cc: Wan ZongShun &lt;mcuos.com@gmail.com&gt;
Signed-off-by: Russell King &lt;rmk+kernel@arm.linux.org.uk&gt;
</content>
</entry>
<entry>
<title>clocksource: add common i8253 PIT clocksource</title>
<updated>2011-05-14T09:29:47Z</updated>
<author>
<name>Russell King</name>
<email>rmk+kernel@arm.linux.org.uk</email>
</author>
<published>2011-05-08T17:47:58Z</published>
<link rel='alternate' type='text/html' href='https://git.amat.us/linux/commit/?id=89c0b8e2520e12d69dafc663dfbd39f8180438ea'/>
<id>urn:sha1:89c0b8e2520e12d69dafc663dfbd39f8180438ea</id>
<content type='text'>
This is based upon both arch/arm/mach-footbridge/isa-timer.c and
arch/x86/kernel/i8253.c.

Acked-by: John Stultz &lt;john.stultz@linaro.org&gt;
Acked-by: Thomas Gleixner &lt;tglx@linutronix.de&gt;
Cc: "H. Peter Anvin" &lt;hpa@zytor.com&gt;
Cc: Ingo Molnar &lt;mingo@redhat.com&gt;
Cc: Ralf Baechle &lt;ralf@linux-mips.org&gt;
Signed-off-by: Russell King &lt;rmk+kernel@arm.linux.org.uk&gt;
</content>
</entry>
<entry>
<title>cs5535: add a generic clock event MFGPT driver</title>
<updated>2009-12-15T16:53:28Z</updated>
<author>
<name>Andres Salomon</name>
<email>dilinger@collabora.co.uk</email>
</author>
<published>2009-12-15T02:00:38Z</published>
<link rel='alternate' type='text/html' href='https://git.amat.us/linux/commit/?id=c30d7d2b9987e189bc6d5ec6635785b91a6ee81e'/>
<id>urn:sha1:c30d7d2b9987e189bc6d5ec6635785b91a6ee81e</id>
<content type='text'>
This is based on the old code in arch/x86/kernel/mfgpt_32.c, but is
modular and not Geode-specific.  There's no reason why the clock event
device needs to be registered so early at boot; the clockevent code is
perfectly capable of dynamic switching.

[akpm@linux-foundation.org: add linux/irq.h include]
Signed-off-by: Andres Salomon &lt;dilinger@collabora.co.uk&gt;
Cc: Jordan Crouse &lt;jordan@cosmicpenguin.net&gt;
Cc: Ingo Molnar &lt;mingo@elte.hu&gt;
Cc: Thomas Gleixner &lt;tglx@linutronix.de&gt;
Cc: john stultz &lt;johnstul@us.ibm.com&gt;
Cc: Chris Ball &lt;cjb@laptop.org&gt;
Signed-off-by: Andrew Morton &lt;akpm@linux-foundation.org&gt;
Signed-off-by: Linus Torvalds &lt;torvalds@linux-foundation.org&gt;
</content>
</entry>
<entry>
<title>clocksource: SuperH TMU Timer driver</title>
<updated>2009-05-03T08:41:15Z</updated>
<author>
<name>Magnus Damm</name>
<email>damm@igel.co.jp</email>
</author>
<published>2009-05-01T06:51:00Z</published>
<link rel='alternate' type='text/html' href='https://git.amat.us/linux/commit/?id=9570ef20423b549757aa484ad388f9a7d5bdc4d9'/>
<id>urn:sha1:9570ef20423b549757aa484ad388f9a7d5bdc4d9</id>
<content type='text'>
This patch adds a TMU driver for the SuperH architecture.

The TMU driver is a platform driver with early platform
support to allow using a TMU channel as clockevent or
clocksource during system bootup or later.

Clocksource or clockevent can be selected.
Both periodic and oneshot clockevents are supported.

Signed-off-by: Magnus Damm &lt;damm@igel.co.jp&gt;
Signed-off-by: Paul Mundt &lt;lethal@linux-sh.org&gt;
</content>
</entry>
<entry>
<title>clocksource: SuperH MTU2 Timer driver</title>
<updated>2009-05-03T08:36:02Z</updated>
<author>
<name>Magnus Damm</name>
<email>damm@igel.co.jp</email>
</author>
<published>2009-04-30T07:02:49Z</published>
<link rel='alternate' type='text/html' href='https://git.amat.us/linux/commit/?id=d5ed4c2e5ce9f5f6fd6a5a39ee1196a1f8a46eed'/>
<id>urn:sha1:d5ed4c2e5ce9f5f6fd6a5a39ee1196a1f8a46eed</id>
<content type='text'>
This patch adds a MTU2 driver for the SuperH architecture.

The MTU2 driver is a platform driver with early platform
support to allow using a MTU2 channel as only clockevent
during system bootup.

Clocksource on sh2a is currently unsupported due to code
generation issues with 64-bit math, so at this point only
periodic clockevent support is in place.

Signed-off-by: Magnus Damm &lt;damm@igel.co.jp&gt;
Signed-off-by: Paul Mundt &lt;lethal@linux-sh.org&gt;
</content>
</entry>
<entry>
<title>sh: CMT clockevent platform driver</title>
<updated>2009-01-29T07:56:32Z</updated>
<author>
<name>Magnus Damm</name>
<email>damm@igel.co.jp</email>
</author>
<published>2009-01-22T09:55:59Z</published>
<link rel='alternate' type='text/html' href='https://git.amat.us/linux/commit/?id=3fb1b6ad0679ad671bd496712b2a088550ee86b2'/>
<id>urn:sha1:3fb1b6ad0679ad671bd496712b2a088550ee86b2</id>
<content type='text'>
SuperH CMT clockevent driver.

Both 16-bit and 32-bit CMT versions are supported, but only 32-bit
is tested. This driver contains support for both clockevents and
clocksources, but no unregistration is supported at this point.

Works fine as clock source and/or event in periodic or oneshot mode.
Tested on sh7722 and sh7723, but should work with any cpu/architecture.

This version is lacking clocksource and early platform driver support
for now - this to minimize the amount of dependencies.

Signed-off-by: Magnus Damm &lt;damm@igel.co.jp&gt;
Signed-off-by: Paul Mundt &lt;lethal@linux-sh.org&gt;
</content>
</entry>
</feed>
r--</td><td class='upd'><a href='/linux/diff/drivers/net/hamradio/hdlcdrv.c?h=v3.12.17&amp;id=5af43c24ca59a448c9312dd4a4a51d27ec3b9a73'>drivers/net/hamradio/hdlcdrv.c</a></td><td class='right'>2</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.1%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/linux/diff/drivers/net/hamradio/yam.c?h=v3.12.17&amp;id=5af43c24ca59a448c9312dd4a4a51d27ec3b9a73'>drivers/net/hamradio/yam.c</a></td><td class='right'>2</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.1%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/linux/diff/drivers/net/team/team_mode_random.c?h=v3.12.17&amp;id=5af43c24ca59a448c9312dd4a4a51d27ec3b9a73'>drivers/net/team/team_mode_random.c</a></td><td class='right'>2</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.1%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/linux/diff/drivers/net/wireless/brcm80211/brcmfmac/p2p.c?h=v3.12.17&amp;id=5af43c24ca59a448c9312dd4a4a51d27ec3b9a73'>drivers/net/wireless/brcm80211/brcmfmac/p2p.c</a></td><td class='right'>2</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.1%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/linux/diff/drivers/net/wireless/mwifiex/cfg80211.c?h=v3.12.17&amp;id=5af43c24ca59a448c9312dd4a4a51d27ec3b9a73'>drivers/net/wireless/mwifiex/cfg80211.c</a></td><td class='right'>4</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.1%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/linux/diff/drivers/rtc/rtc-rs5c372.c?h=v3.12.17&amp;id=5af43c24ca59a448c9312dd4a4a51d27ec3b9a73'>drivers/rtc/rtc-rs5c372.c</a></td><td class='right'>5</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/linux/diff/drivers/scsi/sg.c?h=v3.12.17&amp;id=5af43c24ca59a448c9312dd4a4a51d27ec3b9a73'>drivers/scsi/sg.c</a></td><td class='right'>1</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/linux/diff/drivers/staging/android/logger.c?h=v3.12.17&amp;id=5af43c24ca59a448c9312dd4a4a51d27ec3b9a73'>drivers/staging/android/logger.c</a></td><td class='right'>1</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/linux/diff/drivers/usb/gadget/inode.c?h=v3.12.17&amp;id=5af43c24ca59a448c9312dd4a4a51d27ec3b9a73'>drivers/usb/gadget/inode.c</a></td><td class='right'>42</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 2.0%;'/><td class='rem' style='width: 0.7%;'/><td class='none' style='width: 97.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/linux/diff/fs/9p/vfs_addr.c?h=v3.12.17&amp;id=5af43c24ca59a448c9312dd4a4a51d27ec3b9a73'>fs/9p/vfs_addr.c</a></td><td class='right'>1</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/linux/diff/fs/afs/write.c?h=v3.12.17&amp;id=5af43c24ca59a448c9312dd4a4a51d27ec3b9a73'>fs/afs/write.c</a></td><td class='right'>1</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/linux/diff/fs/aio.c?h=v3.12.17&amp;id=5af43c24ca59a448c9312dd4a4a51d27ec3b9a73'>fs/aio.c</a></td><td class='right'>1578</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 34.9%;'/><td class='rem' style='width: 65.1%;'/><td class='none' style='width: 0.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/linux/diff/fs/bio.c?h=v3.12.17&amp;id=5af43c24ca59a448c9312dd4a4a51d27ec3b9a73'>fs/bio.c</a></td><td class='right'>1</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/linux/diff/fs/block_dev.c?h=v3.12.17&amp;id=5af43c24ca59a448c9312dd4a4a51d27ec3b9a73'>fs/block_dev.c</a></td><td class='right'>1</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/linux/diff/fs/btrfs/file.c?h=v3.12.17&amp;id=5af43c24ca59a448c9312dd4a4a51d27ec3b9a73'>fs/btrfs/file.c</a></td><td class='right'>1</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/linux/diff/fs/btrfs/inode.c?h=v3.12.17&amp;id=5af43c24ca59a448c9312dd4a4a51d27ec3b9a73'>fs/btrfs/inode.c</a></td><td class='right'>1</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/linux/diff/fs/ceph/file.c?h=v3.12.17&amp;id=5af43c24ca59a448c9312dd4a4a51d27ec3b9a73'>fs/ceph/file.c</a></td><td class='right'>1</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/linux/diff/fs/compat.c?h=v3.12.17&amp;id=5af43c24ca59a448c9312dd4a4a51d27ec3b9a73'>fs/compat.c</a></td><td class='right'>1</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/linux/diff/fs/direct-io.c?h=v3.12.17&amp;id=5af43c24ca59a448c9312dd4a4a51d27ec3b9a73'>fs/direct-io.c</a></td><td class='right'>1</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/linux/diff/fs/ecryptfs/file.c?h=v3.12.17&amp;id=5af43c24ca59a448c9312dd4a4a51d27ec3b9a73'>fs/ecryptfs/file.c</a></td><td class='right'>1</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/linux/diff/fs/ext2/inode.c?h=v3.12.17&amp;id=5af43c24ca59a448c9312dd4a4a51d27ec3b9a73'>fs/ext2/inode.c</a></td><td class='right'>1</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/linux/diff/fs/ext3/inode.c?h=v3.12.17&amp;id=5af43c24ca59a448c9312dd4a4a51d27ec3b9a73'>fs/ext3/inode.c</a></td><td class='right'>1</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/linux/diff/fs/ext4/file.c?h=v3.12.17&amp;id=5af43c24ca59a448c9312dd4a4a51d27ec3b9a73'>fs/ext4/file.c</a></td><td class='right'>1</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/linux/diff/fs/ext4/indirect.c?h=v3.12.17&amp;id=5af43c24ca59a448c9312dd4a4a51d27ec3b9a73'>fs/ext4/indirect.c</a></td><td class='right'>1</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/linux/diff/fs/ext4/inode.c?h=v3.12.17&amp;id=5af43c24ca59a448c9312dd4a4a51d27ec3b9a73'>fs/ext4/inode.c</a></td><td class='right'>1</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/linux/diff/fs/ext4/page-io.c?h=v3.12.17&amp;id=5af43c24ca59a448c9312dd4a4a51d27ec3b9a73'>fs/ext4/page-io.c</a></td><td class='right'>1</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/linux/diff/fs/f2fs/data.c?h=v3.12.17&amp;id=5af43c24ca59a448c9312dd4a4a51d27ec3b9a73'>fs/f2fs/data.c</a></td><td class='right'>1</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/linux/diff/fs/fat/inode.c?h=v3.12.17&amp;id=5af43c24ca59a448c9312dd4a4a51d27ec3b9a73'>fs/fat/inode.c</a></td><td class='right'>1</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/linux/diff/fs/fuse/cuse.c?h=v3.12.17&amp;id=5af43c24ca59a448c9312dd4a4a51d27ec3b9a73'>fs/fuse/cuse.c</a></td><td class='right'>1</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/linux/diff/fs/fuse/dev.c?h=v3.12.17&amp;id=5af43c24ca59a448c9312dd4a4a51d27ec3b9a73'>fs/fuse/dev.c</a></td><td class='right'>1</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/linux/diff/fs/fuse/file.c?h=v3.12.17&amp;id=5af43c24ca59a448c9312dd4a4a51d27ec3b9a73'>fs/fuse/file.c</a></td><td class='right'>1</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/linux/diff/fs/gfs2/aops.c?h=v3.12.17&amp;id=5af43c24ca59a448c9312dd4a4a51d27ec3b9a73'>fs/gfs2/aops.c</a></td><td class='right'>1</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/linux/diff/fs/gfs2/file.c?h=v3.12.17&amp;id=5af43c24ca59a448c9312dd4a4a51d27ec3b9a73'>fs/gfs2/file.c</a></td><td class='right'>1</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/linux/diff/fs/hfs/inode.c?h=v3.12.17&amp;id=5af43c24ca59a448c9312dd4a4a51d27ec3b9a73'>fs/hfs/inode.c</a></td><td class='right'>1</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/linux/diff/fs/hfsplus/inode.c?h=v3.12.17&amp;id=5af43c24ca59a448c9312dd4a4a51d27ec3b9a73'>fs/hfsplus/inode.c</a></td><td class='right'>1</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/linux/diff/fs/hugetlbfs/inode.c?h=v3.12.17&amp;id=5af43c24ca59a448c9312dd4a4a51d27ec3b9a73'>fs/hugetlbfs/inode.c</a></td><td class='right'>24</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.6%;'/><td class='rem' style='width: 0.9%;'/><td class='none' style='width: 98.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/linux/diff/fs/jfs/inode.c?h=v3.12.17&amp;id=5af43c24ca59a448c9312dd4a4a51d27ec3b9a73'>fs/jfs/inode.c</a></td><td class='right'>1</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/linux/diff/fs/nilfs2/inode.c?h=v3.12.17&amp;id=5af43c24ca59a448c9312dd4a4a51d27ec3b9a73'>fs/nilfs2/inode.c</a></td><td class='right'>2</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.1%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/linux/diff/fs/ntfs/file.c?h=v3.12.17&amp;id=5af43c24ca59a448c9312dd4a4a51d27ec3b9a73'>fs/ntfs/file.c</a></td><td class='right'>1</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/linux/diff/fs/ntfs/inode.c?h=v3.12.17&amp;id=5af43c24ca59a448c9312dd4a4a51d27ec3b9a73'>fs/ntfs/inode.c</a></td><td class='right'>1</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/linux/diff/fs/ocfs2/aops.h?h=v3.12.17&amp;id=5af43c24ca59a448c9312dd4a4a51d27ec3b9a73'>fs/ocfs2/aops.h</a></td><td class='right'>2</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/linux/diff/fs/ocfs2/dlmglue.c?h=v3.12.17&amp;id=5af43c24ca59a448c9312dd4a4a51d27ec3b9a73'>fs/ocfs2/dlmglue.c</a></td><td class='right'>2</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.1%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/linux/diff/fs/ocfs2/inode.h?h=v3.12.17&amp;id=5af43c24ca59a448c9312dd4a4a51d27ec3b9a73'>fs/ocfs2/inode.h</a></td><td class='right'>2</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.1%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/linux/diff/fs/pipe.c?h=v3.12.17&amp;id=5af43c24ca59a448c9312dd4a4a51d27ec3b9a73'>fs/pipe.c</a></td><td class='right'>1</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/linux/diff/fs/read_write.c?h=v3.12.17&amp;id=5af43c24ca59a448c9312dd4a4a51d27ec3b9a73'>fs/read_write.c</a></td><td class='right'>35</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 2.0%;'/><td class='none' style='width: 97.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/linux/diff/fs/reiserfs/inode.c?h=v3.12.17&amp;id=5af43c24ca59a448c9312dd4a4a51d27ec3b9a73'>fs/reiserfs/inode.c</a></td><td class='right'>1</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/linux/diff/fs/ubifs/file.c?h=v3.12.17&amp;id=5af43c24ca59a448c9312dd4a4a51d27ec3b9a73'>fs/ubifs/file.c</a></td><td class='right'>1</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/linux/diff/fs/udf/inode.c?h=v3.12.17&amp;id=5af43c24ca59a448c9312dd4a4a51d27ec3b9a73'>fs/udf/inode.c</a></td><td class='right'>1</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/linux/diff/fs/xfs/xfs_aops.c?h=v3.12.17&amp;id=5af43c24ca59a448c9312dd4a4a51d27ec3b9a73'>fs/xfs/xfs_aops.c</a></td><td class='right'>1</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/linux/diff/fs/xfs/xfs_file.c?h=v3.12.17&amp;id=5af43c24ca59a448c9312dd4a4a51d27ec3b9a73'>fs/xfs/xfs_file.c</a></td><td class='right'>1</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/linux/diff/include/linux/aio.h?h=v3.12.17&amp;id=5af43c24ca59a448c9312dd4a4a51d27ec3b9a73'>include/linux/aio.h</a></td><td class='right'>178</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.6%;'/><td class='rem' style='width: 9.6%;'/><td class='none' style='width: 88.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/linux/diff/include/linux/cgroup.h?h=v3.12.17&amp;id=5af43c24ca59a448c9312dd4a4a51d27ec3b9a73'>include/linux/cgroup.h</a></td><td class='right'>1</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/linux/diff/include/linux/errno.h?h=v3.12.17&amp;id=5af43c24ca59a448c9312dd4a4a51d27ec3b9a73'>include/linux/errno.h</a></td><td class='right'>1</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.1%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/linux/diff/include/linux/hugetlb.h?h=v3.12.17&amp;id=5af43c24ca59a448c9312dd4a4a51d27ec3b9a73'>include/linux/hugetlb.h</a></td><td class='right'>19</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.8%;'/><td class='rem' style='width: 0.4%;'/><td class='none' style='width: 98.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/linux/diff/include/linux/mm.h?h=v3.12.17&amp;id=5af43c24ca59a448c9312dd4a4a51d27ec3b9a73'>include/linux/mm.h</a></td><td class='right'>20</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.8%;'/><td class='rem' style='width: 0.4%;'/><td class='none' style='width: 98.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/linux/diff/include/linux/pid_namespace.h?h=v3.12.17&amp;id=5af43c24ca59a448c9312dd4a4a51d27ec3b9a73'>include/linux/pid_namespace.h</a></td><td class='right'>1</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/linux/diff/include/linux/random.h?h=v3.12.17&amp;id=5af43c24ca59a448c9312dd4a4a51d27ec3b9a73'>include/linux/random.h</a></td><td class='right'>7</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.4%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/linux/diff/include/linux/sched.h?h=v3.12.17&amp;id=5af43c24ca59a448c9312dd4a4a51d27ec3b9a73'>include/linux/sched.h</a></td><td class='right'>2</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.1%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/linux/diff/include/linux/wait.h?h=v3.12.17&amp;id=5af43c24ca59a448c9312dd4a4a51d27ec3b9a73'>include/linux/wait.h</a></td><td class='right'>86</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 5.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 94.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/linux/diff/include/linux/writeback.h?h=v3.12.17&amp;id=5af43c24ca59a448c9312dd4a4a51d27ec3b9a73'>include/linux/writeback.h</a></td><td class='right'>1</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/linux/diff/ipc/shm.c?h=v3.12.17&amp;id=5af43c24ca59a448c9312dd4a4a51d27ec3b9a73'>ipc/shm.c</a></td><td class='right'>6</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.1%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/linux/diff/kernel/fork.c?h=v3.12.17&amp;id=5af43c24ca59a448c9312dd4a4a51d27ec3b9a73'>kernel/fork.c</a></td><td class='right'>1</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/linux/diff/kernel/printk.c?h=v3.12.17&amp;id=5af43c24ca59a448c9312dd4a4a51d27ec3b9a73'>kernel/printk.c</a></td><td class='right'>1</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/linux/diff/kernel/ptrace.c?h=v3.12.17&amp;id=5af43c24ca59a448c9312dd4a4a51d27ec3b9a73'>kernel/ptrace.c</a></td><td class='right'>1</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/linux/diff/mm/memcontrol.c?h=v3.12.17&amp;id=5af43c24ca59a448c9312dd4a4a51d27ec3b9a73'>mm/memcontrol.c</a></td><td class='right'>36</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.6%;'/><td class='rem' style='width: 0.6%;'/><td class='none' style='width: 97.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/linux/diff/mm/mmap.c?h=v3.12.17&amp;id=5af43c24ca59a448c9312dd4a4a51d27ec3b9a73'>mm/mmap.c</a></td><td class='right'>7</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.1%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/linux/diff/mm/mmu_context.c?h=v3.12.17&amp;id=5af43c24ca59a448c9312dd4a4a51d27ec3b9a73'>mm/mmu_context.c</a></td><td class='right'>3</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.2%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/linux/diff/mm/page_io.c?h=v3.12.17&amp;id=5af43c24ca59a448c9312dd4a4a51d27ec3b9a73'>mm/page_io.c</a></td><td class='right'>1</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/linux/diff/mm/shmem.c?h=v3.12.17&amp;id=5af43c24ca59a448c9312dd4a4a51d27ec3b9a73'>mm/shmem.c</a></td><td class='right'>1</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/linux/diff/mm/swap.c?h=v3.12.17&amp;id=5af43c24ca59a448c9312dd4a4a51d27ec3b9a73'>mm/swap.c</a></td><td class='right'>1</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/linux/diff/mm/vmalloc.c?h=v3.12.17&amp;id=5af43c24ca59a448c9312dd4a4a51d27ec3b9a73'>mm/vmalloc.c</a></td><td class='right'>2</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/linux/diff/security/keys/internal.h?h=v3.12.17&amp;id=5af43c24ca59a448c9312dd4a4a51d27ec3b9a73'>security/keys/internal.h</a></td><td class='right'>2</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/linux/diff/security/keys/keyctl.c?h=v3.12.17&amp;id=5af43c24ca59a448c9312dd4a4a51d27ec3b9a73'>security/keys/keyctl.c</a></td><td class='right'>1</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/linux/diff/sound/core/pcm_native.c?h=v3.12.17&amp;id=5af43c24ca59a448c9312dd4a4a51d27ec3b9a73'>sound/core/pcm_native.c</a></td><td class='right'>2</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.1%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
</table><div class='diffstat-summary'>89 files changed, 900 insertions, 1364 deletions</div><table summary='diff' class='diff'><tr><td><div class='head'>diff --git a/Documentation/cgroups/memory.txt b/Documentation/cgroups/memory.txt<br/>index 09027a9fece..ddf4f93967a 100644<br/>--- a/<a href='/linux/tree/Documentation/cgroups/memory.txt?h=v3.12.17&amp;id=9affd6becbfb2c3f0d04e554bb87234761b37aba'>Documentation/cgroups/memory.txt</a><br/>+++ b/<a href='/linux/tree/Documentation/cgroups/memory.txt?h=v3.12.17&amp;id=5af43c24ca59a448c9312dd4a4a51d27ec3b9a73'>Documentation/cgroups/memory.txt</a></div><div class='hunk'>@@ -480,7 +480,9 @@ memory.stat file includes following statistics</div><div class='ctx'> </div><div class='ctx'> # per-memory cgroup local status</div><div class='ctx'> cache		- # of bytes of page cache memory.</div><div class='del'>-rss		- # of bytes of anonymous and swap cache memory.</div><div class='add'>+rss		- # of bytes of anonymous and swap cache memory (includes</div><div class='add'>+		transparent hugepages).</div><div class='add'>+rss_huge	- # of bytes of anonymous transparent hugepages.</div><div class='ctx'> mapped_file	- # of bytes of mapped file (includes tmpfs/shmem)</div><div class='ctx'> pgpgin		- # of charging events to the memory cgroup. The charging</div><div class='ctx'> 		event happens each time a page is accounted as either mapped</div><div class='head'>diff --git a/arch/s390/hypfs/inode.c b/arch/s390/hypfs/inode.c<br/>index 5f7d7ba2874..7a539f4f5e3 100644<br/>--- a/<a href='/linux/tree/arch/s390/hypfs/inode.c?h=v3.12.17&amp;id=9affd6becbfb2c3f0d04e554bb87234761b37aba'>arch/s390/hypfs/inode.c</a><br/>+++ b/<a href='/linux/tree/arch/s390/hypfs/inode.c?h=v3.12.17&amp;id=5af43c24ca59a448c9312dd4a4a51d27ec3b9a73'>arch/s390/hypfs/inode.c</a></div><div class='hunk'>@@ -21,6 +21,7 @@</div><div class='ctx'> #include &lt;linux/module.h&gt;</div><div class='ctx'> #include &lt;linux/seq_file.h&gt;</div><div class='ctx'> #include &lt;linux/mount.h&gt;</div><div class='add'>+#include &lt;linux/aio.h&gt;</div><div class='ctx'> #include &lt;asm/ebcdic.h&gt;</div><div class='ctx'> #include "hypfs.h"</div><div class='ctx'> </div><div class='head'>diff --git a/arch/sparc/kernel/leon_smp.c b/arch/sparc/kernel/leon_smp.c<br/>index 9b40c9c12a0..6cfc1b09ec2 100644<br/>--- a/<a href='/linux/tree/arch/sparc/kernel/leon_smp.c?h=v3.12.17&amp;id=9affd6becbfb2c3f0d04e554bb87234761b37aba'>arch/sparc/kernel/leon_smp.c</a><br/>+++ b/<a href='/linux/tree/arch/sparc/kernel/leon_smp.c?h=v3.12.17&amp;id=5af43c24ca59a448c9312dd4a4a51d27ec3b9a73'>arch/sparc/kernel/leon_smp.c</a></div><div class='hunk'>@@ -253,24 +253,15 @@ void __init leon_smp_done(void)</div><div class='ctx'> </div><div class='ctx'> 	/* Free unneeded trap tables */</div><div class='ctx'> 	if (!cpu_present(1)) {</div><div class='del'>-		ClearPageReserved(virt_to_page(&amp;trapbase_cpu1));</div><div class='del'>-		init_page_count(virt_to_page(&amp;trapbase_cpu1));</div><div class='del'>-		free_page((unsigned long)&amp;trapbase_cpu1);</div><div class='del'>-		totalram_pages++;</div><div class='add'>+		free_reserved_page(virt_to_page(&amp;trapbase_cpu1));</div><div class='ctx'> 		num_physpages++;</div><div class='ctx'> 	}</div><div class='ctx'> 	if (!cpu_present(2)) {</div><div class='del'>-		ClearPageReserved(virt_to_page(&amp;trapbase_cpu2));</div><div class='del'>-		init_page_count(virt_to_page(&amp;trapbase_cpu2));</div><div class='del'>-		free_page((unsigned long)&amp;trapbase_cpu2);</div><div class='del'>-		totalram_pages++;</div><div class='add'>+		free_reserved_page(virt_to_page(&amp;trapbase_cpu2));</div><div class='ctx'> 		num_physpages++;</div><div class='ctx'> 	}</div><div class='ctx'> 	if (!cpu_present(3)) {</div><div class='del'>-		ClearPageReserved(virt_to_page(&amp;trapbase_cpu3));</div><div class='del'>-		init_page_count(virt_to_page(&amp;trapbase_cpu3));</div><div class='del'>-		free_page((unsigned long)&amp;trapbase_cpu3);</div><div class='del'>-		totalram_pages++;</div><div class='add'>+		free_reserved_page(virt_to_page(&amp;trapbase_cpu3));</div><div class='ctx'> 		num_physpages++;</div><div class='ctx'> 	}</div><div class='ctx'> 	/* Ok, they are spinning and ready to go. */</div><div class='head'>diff --git a/arch/sparc/mm/init_32.c b/arch/sparc/mm/init_32.c<br/>index 4490c397bb5..af472cf7c69 100644<br/>--- a/<a href='/linux/tree/arch/sparc/mm/init_32.c?h=v3.12.17&amp;id=9affd6becbfb2c3f0d04e554bb87234761b37aba'>arch/sparc/mm/init_32.c</a><br/>+++ b/<a href='/linux/tree/arch/sparc/mm/init_32.c?h=v3.12.17&amp;id=5af43c24ca59a448c9312dd4a4a51d27ec3b9a73'>arch/sparc/mm/init_32.c</a></div><div class='hunk'>@@ -366,45 +366,14 @@ void __init mem_init(void)</div><div class='ctx'> </div><div class='ctx'> void free_initmem (void)</div><div class='ctx'> {</div><div class='del'>-	unsigned long addr;</div><div class='del'>-	unsigned long freed;</div><div class='del'>-</div><div class='del'>-	addr = (unsigned long)(&amp;__init_begin);</div><div class='del'>-	freed = (unsigned long)(&amp;__init_end) - addr;</div><div class='del'>-	for (; addr &lt; (unsigned long)(&amp;__init_end); addr += PAGE_SIZE) {</div><div class='del'>-		struct page *p;</div><div class='del'>-</div><div class='del'>-		memset((void *)addr, POISON_FREE_INITMEM, PAGE_SIZE);</div><div class='del'>-		p = virt_to_page(addr);</div><div class='del'>-</div><div class='del'>-		ClearPageReserved(p);</div><div class='del'>-		init_page_count(p);</div><div class='del'>-		__free_page(p);</div><div class='del'>-		totalram_pages++;</div><div class='del'>-		num_physpages++;</div><div class='del'>-	}</div><div class='del'>-	printk(KERN_INFO "Freeing unused kernel memory: %ldk freed\n",</div><div class='del'>-		freed &gt;&gt; 10);</div><div class='add'>+	num_physpages += free_initmem_default(POISON_FREE_INITMEM);</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> #ifdef CONFIG_BLK_DEV_INITRD</div><div class='ctx'> void free_initrd_mem(unsigned long start, unsigned long end)</div><div class='ctx'> {</div><div class='del'>-	if (start &lt; end)</div><div class='del'>-		printk(KERN_INFO "Freeing initrd memory: %ldk freed\n",</div><div class='del'>-			(end - start) &gt;&gt; 10);</div><div class='del'>-	for (; start &lt; end; start += PAGE_SIZE) {</div><div class='del'>-		struct page *p;</div><div class='del'>-</div><div class='del'>-		memset((void *)start, POISON_FREE_INITMEM, PAGE_SIZE);</div><div class='del'>-		p = virt_to_page(start);</div><div class='del'>-</div><div class='del'>-		ClearPageReserved(p);</div><div class='del'>-		init_page_count(p);</div><div class='del'>-		__free_page(p);</div><div class='del'>-		totalram_pages++;</div><div class='del'>-		num_physpages++;</div><div class='del'>-	}</div><div class='add'>+	num_physpages += free_reserved_area(start, end, POISON_FREE_INITMEM,</div><div class='add'>+					    "initrd");</div><div class='ctx'> }</div><div class='ctx'> #endif</div><div class='ctx'> </div><div class='head'>diff --git a/arch/sparc/mm/init_64.c b/arch/sparc/mm/init_64.c<br/>index cf72a8a5b3a..a7171997adf 100644<br/>--- a/<a href='/linux/tree/arch/sparc/mm/init_64.c?h=v3.12.17&amp;id=9affd6becbfb2c3f0d04e554bb87234761b37aba'>arch/sparc/mm/init_64.c</a><br/>+++ b/<a href='/linux/tree/arch/sparc/mm/init_64.c?h=v3.12.17&amp;id=5af43c24ca59a448c9312dd4a4a51d27ec3b9a73'>arch/sparc/mm/init_64.c</a></div><div class='hunk'>@@ -2059,8 +2059,7 @@ void __init mem_init(void)</div><div class='ctx'> 	/* We subtract one to account for the mem_map_zero page</div><div class='ctx'> 	 * allocated below.</div><div class='ctx'> 	 */</div><div class='del'>-	totalram_pages -= 1;</div><div class='del'>-	num_physpages = totalram_pages;</div><div class='add'>+	num_physpages = totalram_pages - 1;</div><div class='ctx'> </div><div class='ctx'> 	/*</div><div class='ctx'> 	 * Set up the zero page, mark it reserved, so that page count</div><div class='hunk'>@@ -2071,7 +2070,7 @@ void __init mem_init(void)</div><div class='ctx'> 		prom_printf("paging_init: Cannot alloc zero page.\n");</div><div class='ctx'> 		prom_halt();</div><div class='ctx'> 	}</div><div class='del'>-	SetPageReserved(mem_map_zero);</div><div class='add'>+	mark_page_reserved(mem_map_zero);</div><div class='ctx'> </div><div class='ctx'> 	codepages = (((unsigned long) _etext) - ((unsigned long) _start));</div><div class='ctx'> 	codepages = PAGE_ALIGN(codepages) &gt;&gt; PAGE_SHIFT;</div><div class='hunk'>@@ -2111,37 +2110,22 @@ void free_initmem(void)</div><div class='ctx'> 	initend = (unsigned long)(__init_end) &amp; PAGE_MASK;</div><div class='ctx'> 	for (; addr &lt; initend; addr += PAGE_SIZE) {</div><div class='ctx'> 		unsigned long page;</div><div class='del'>-		struct page *p;</div><div class='ctx'> </div><div class='ctx'> 		page = (addr +</div><div class='ctx'> 			((unsigned long) __va(kern_base)) -</div><div class='ctx'> 			((unsigned long) KERNBASE));</div><div class='ctx'> 		memset((void *)addr, POISON_FREE_INITMEM, PAGE_SIZE);</div><div class='ctx'> </div><div class='del'>-		if (do_free) {</div><div class='del'>-			p = virt_to_page(page);</div><div class='del'>-</div><div class='del'>-			ClearPageReserved(p);</div><div class='del'>-			init_page_count(p);</div><div class='del'>-			__free_page(p);</div><div class='del'>-			totalram_pages++;</div><div class='del'>-		}</div><div class='add'>+		if (do_free)</div><div class='add'>+			free_reserved_page(virt_to_page(page));</div><div class='ctx'> 	}</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> #ifdef CONFIG_BLK_DEV_INITRD</div><div class='ctx'> void free_initrd_mem(unsigned long start, unsigned long end)</div><div class='ctx'> {</div><div class='del'>-	if (start &lt; end)</div><div class='del'>-		printk ("Freeing initrd memory: %ldk freed\n", (end - start) &gt;&gt; 10);</div><div class='del'>-	for (; start &lt; end; start += PAGE_SIZE) {</div><div class='del'>-		struct page *p = virt_to_page(start);</div><div class='del'>-</div><div class='del'>-		ClearPageReserved(p);</div><div class='del'>-		init_page_count(p);</div><div class='del'>-		__free_page(p);</div><div class='del'>-		totalram_pages++;</div><div class='del'>-	}</div><div class='add'>+	num_physpages += free_reserved_area(start, end, POISON_FREE_INITMEM,</div><div class='add'>+					    "initrd");</div><div class='ctx'> }</div><div class='ctx'> #endif</div><div class='ctx'> </div><div class='head'>diff --git a/block/scsi_ioctl.c b/block/scsi_ioctl.c<br/>index 9a87daa6f4f..a5ffcc988f0 100644<br/>--- a/<a href='/linux/tree/block/scsi_ioctl.c?h=v3.12.17&amp;id=9affd6becbfb2c3f0d04e554bb87234761b37aba'>block/scsi_ioctl.c</a><br/>+++ b/<a href='/linux/tree/block/scsi_ioctl.c?h=v3.12.17&amp;id=5af43c24ca59a448c9312dd4a4a51d27ec3b9a73'>block/scsi_ioctl.c</a></div><div class='hunk'>@@ -27,6 +27,7 @@</div><div class='ctx'> #include &lt;linux/ratelimit.h&gt;</div><div class='ctx'> #include &lt;linux/slab.h&gt;</div><div class='ctx'> #include &lt;linux/times.h&gt;</div><div class='add'>+#include &lt;linux/uio.h&gt;</div><div class='ctx'> #include &lt;asm/uaccess.h&gt;</div><div class='ctx'> </div><div class='ctx'> #include &lt;scsi/scsi.h&gt;</div><div class='head'>diff --git a/drivers/char/mem.c b/drivers/char/mem.c<br/>index 2c644afbcdd..1ccbe9482fa 100644<br/>--- a/<a href='/linux/tree/drivers/char/mem.c?h=v3.12.17&amp;id=9affd6becbfb2c3f0d04e554bb87234761b37aba'>drivers/char/mem.c</a><br/>+++ b/<a href='/linux/tree/drivers/char/mem.c?h=v3.12.17&amp;id=5af43c24ca59a448c9312dd4a4a51d27ec3b9a73'>drivers/char/mem.c</a></div><div class='hunk'>@@ -28,6 +28,7 @@</div><div class='ctx'> #include &lt;linux/pfn.h&gt;</div><div class='ctx'> #include &lt;linux/export.h&gt;</div><div class='ctx'> #include &lt;linux/io.h&gt;</div><div class='add'>+#include &lt;linux/aio.h&gt;</div><div class='ctx'> </div><div class='ctx'> #include &lt;asm/uaccess.h&gt;</div><div class='ctx'> </div><div class='hunk'>@@ -627,6 +628,18 @@ static ssize_t write_null(struct file *file, const char __user *buf,</div><div class='ctx'> 	return count;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+static ssize_t aio_read_null(struct kiocb *iocb, const struct iovec *iov,</div><div class='add'>+			     unsigned long nr_segs, loff_t pos)</div><div class='add'>+{</div><div class='add'>+	return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static ssize_t aio_write_null(struct kiocb *iocb, const struct iovec *iov,</div><div class='add'>+			      unsigned long nr_segs, loff_t pos)</div><div class='add'>+{</div><div class='add'>+	return iov_length(iov, nr_segs);</div><div class='add'>+}</div><div class='add'>+</div><div class='ctx'> static int pipe_to_null(struct pipe_inode_info *info, struct pipe_buffer *buf,</div><div class='ctx'> 			struct splice_desc *sd)</div><div class='ctx'> {</div><div class='hunk'>@@ -670,6 +683,24 @@ static ssize_t read_zero(struct file *file, char __user *buf,</div><div class='ctx'> 	return written ? written : -EFAULT;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+static ssize_t aio_read_zero(struct kiocb *iocb, const struct iovec *iov,</div><div class='add'>+			     unsigned long nr_segs, loff_t pos)</div><div class='add'>+{</div><div class='add'>+	size_t written = 0;</div><div class='add'>+	unsigned long i;</div><div class='add'>+	ssize_t ret;</div><div class='add'>+</div><div class='add'>+	for (i = 0; i &lt; nr_segs; i++) {</div><div class='add'>+		ret = read_zero(iocb-&gt;ki_filp, iov[i].iov_base, iov[i].iov_len,</div><div class='add'>+				&amp;pos);</div><div class='add'>+		if (ret &lt; 0)</div><div class='add'>+			break;</div><div class='add'>+		written += ret;</div><div class='add'>+	}</div><div class='add'>+</div><div class='add'>+	return written ? written : -EFAULT;</div><div class='add'>+}</div><div class='add'>+</div><div class='ctx'> static int mmap_zero(struct file *file, struct vm_area_struct *vma)</div><div class='ctx'> {</div><div class='ctx'> #ifndef CONFIG_MMU</div><div class='hunk'>@@ -738,6 +769,7 @@ static int open_port(struct inode *inode, struct file *filp)</div><div class='ctx'> #define full_lseek      null_lseek</div><div class='ctx'> #define write_zero	write_null</div><div class='ctx'> #define read_full       read_zero</div><div class='add'>+#define aio_write_zero	aio_write_null</div><div class='ctx'> #define open_mem	open_port</div><div class='ctx'> #define open_kmem	open_mem</div><div class='ctx'> #define open_oldmem	open_mem</div><div class='hunk'>@@ -766,6 +798,8 @@ static const struct file_operations null_fops = {</div><div class='ctx'> 	.llseek		= null_lseek,</div><div class='ctx'> 	.read		= read_null,</div><div class='ctx'> 	.write		= write_null,</div><div class='add'>+	.aio_read	= aio_read_null,</div><div class='add'>+	.aio_write	= aio_write_null,</div><div class='ctx'> 	.splice_write	= splice_write_null,</div><div class='ctx'> };</div><div class='ctx'> </div><div class='hunk'>@@ -782,6 +816,8 @@ static const struct file_operations zero_fops = {</div><div class='ctx'> 	.llseek		= zero_lseek,</div><div class='ctx'> 	.read		= read_zero,</div><div class='ctx'> 	.write		= write_zero,</div><div class='add'>+	.aio_read	= aio_read_zero,</div><div class='add'>+	.aio_write	= aio_write_zero,</div><div class='ctx'> 	.mmap		= mmap_zero,</div><div class='ctx'> };</div><div class='ctx'> </div><div class='head'>diff --git a/drivers/infiniband/hw/cxgb3/cxio_resource.c b/drivers/infiniband/hw/cxgb3/cxio_resource.c<br/>index 31f9201b298..c40088ecf9f 100644<br/>--- a/<a href='/linux/tree/drivers/infiniband/hw/cxgb3/cxio_resource.c?h=v3.12.17&amp;id=9affd6becbfb2c3f0d04e554bb87234761b37aba'>drivers/infiniband/hw/cxgb3/cxio_resource.c</a><br/>+++ b/<a href='/linux/tree/drivers/infiniband/hw/cxgb3/cxio_resource.c?h=v3.12.17&amp;id=5af43c24ca59a448c9312dd4a4a51d27ec3b9a73'>drivers/infiniband/hw/cxgb3/cxio_resource.c</a></div><div class='hunk'>@@ -62,13 +62,13 @@ static int __cxio_init_resource_fifo(struct kfifo *fifo,</div><div class='ctx'> 		kfifo_in(fifo, (unsigned char *) &amp;entry, sizeof(u32));</div><div class='ctx'> 	if (random) {</div><div class='ctx'> 		j = 0;</div><div class='del'>-		random_bytes = random32();</div><div class='add'>+		random_bytes = prandom_u32();</div><div class='ctx'> 		for (i = 0; i &lt; RANDOM_SIZE; i++)</div><div class='ctx'> 			rarray[i] = i + skip_low;</div><div class='ctx'> 		for (i = skip_low + RANDOM_SIZE; i &lt; nr - skip_high; i++) {</div><div class='ctx'> 			if (j &gt;= RANDOM_SIZE) {</div><div class='ctx'> 				j = 0;</div><div class='del'>-				random_bytes = random32();</div><div class='add'>+				random_bytes = prandom_u32();</div><div class='ctx'> 			}</div><div class='ctx'> 			idx = (random_bytes &gt;&gt; (j * 2)) &amp; 0xF;</div><div class='ctx'> 			kfifo_in(fifo,</div><div class='head'>diff --git a/drivers/infiniband/hw/cxgb4/id_table.c b/drivers/infiniband/hw/cxgb4/id_table.c<br/>index f95e5df30db..0161ae6ad62 100644<br/>--- a/<a href='/linux/tree/drivers/infiniband/hw/cxgb4/id_table.c?h=v3.12.17&amp;id=9affd6becbfb2c3f0d04e554bb87234761b37aba'>drivers/infiniband/hw/cxgb4/id_table.c</a><br/>+++ b/<a href='/linux/tree/drivers/infiniband/hw/cxgb4/id_table.c?h=v3.12.17&amp;id=5af43c24ca59a448c9312dd4a4a51d27ec3b9a73'>drivers/infiniband/hw/cxgb4/id_table.c</a></div><div class='hunk'>@@ -54,7 +54,7 @@ u32 c4iw_id_alloc(struct c4iw_id_table *alloc)</div><div class='ctx'> </div><div class='ctx'> 	if (obj &lt; alloc-&gt;max) {</div><div class='ctx'> 		if (alloc-&gt;flags &amp; C4IW_ID_TABLE_F_RANDOM)</div><div class='del'>-			alloc-&gt;last += random32() % RANDOM_SKIP;</div><div class='add'>+			alloc-&gt;last += prandom_u32() % RANDOM_SKIP;</div><div class='ctx'> 		else</div><div class='ctx'> 			alloc-&gt;last = obj + 1;</div><div class='ctx'> 		if (alloc-&gt;last &gt;= alloc-&gt;max)</div><div class='hunk'>@@ -88,7 +88,7 @@ int c4iw_id_table_alloc(struct c4iw_id_table *alloc, u32 start, u32 num,</div><div class='ctx'> 	alloc-&gt;start = start;</div><div class='ctx'> 	alloc-&gt;flags = flags;</div><div class='ctx'> 	if (flags &amp; C4IW_ID_TABLE_F_RANDOM)</div><div class='del'>-		alloc-&gt;last = random32() % RANDOM_SKIP;</div><div class='add'>+		alloc-&gt;last = prandom_u32() % RANDOM_SKIP;</div><div class='ctx'> 	else</div><div class='ctx'> 		alloc-&gt;last = 0;</div><div class='ctx'> 	alloc-&gt;max  = num;</div><div class='head'>diff --git a/drivers/infiniband/hw/ipath/ipath_file_ops.c b/drivers/infiniband/hw/ipath/ipath_file_ops.c<br/>index aed8afee56d..6d7f453b4d0 100644<br/>--- a/<a href='/linux/tree/drivers/infiniband/hw/ipath/ipath_file_ops.c?h=v3.12.17&amp;id=9affd6becbfb2c3f0d04e554bb87234761b37aba'>drivers/infiniband/hw/ipath/ipath_file_ops.c</a><br/>+++ b/<a href='/linux/tree/drivers/infiniband/hw/ipath/ipath_file_ops.c?h=v3.12.17&amp;id=5af43c24ca59a448c9312dd4a4a51d27ec3b9a73'>drivers/infiniband/hw/ipath/ipath_file_ops.c</a></div><div class='hunk'>@@ -40,6 +40,7 @@</div><div class='ctx'> #include &lt;linux/slab.h&gt;</div><div class='ctx'> #include &lt;linux/highmem.h&gt;</div><div class='ctx'> #include &lt;linux/io.h&gt;</div><div class='add'>+#include &lt;linux/aio.h&gt;</div><div class='ctx'> #include &lt;linux/jiffies.h&gt;</div><div class='ctx'> #include &lt;linux/cpu.h&gt;</div><div class='ctx'> #include &lt;asm/pgtable.h&gt;</div><div class='head'>diff --git a/drivers/infiniband/hw/mlx4/mad.c b/drivers/infiniband/hw/mlx4/mad.c<br/>index 934792c477b..4d599cedbb0 100644<br/>--- a/<a href='/linux/tree/drivers/infiniband/hw/mlx4/mad.c?h=v3.12.17&amp;id=9affd6becbfb2c3f0d04e554bb87234761b37aba'>drivers/infiniband/hw/mlx4/mad.c</a><br/>+++ b/<a href='/linux/tree/drivers/infiniband/hw/mlx4/mad.c?h=v3.12.17&amp;id=5af43c24ca59a448c9312dd4a4a51d27ec3b9a73'>drivers/infiniband/hw/mlx4/mad.c</a></div><div class='hunk'>@@ -93,7 +93,7 @@ static void __propagate_pkey_ev(struct mlx4_ib_dev *dev, int port_num,</div><div class='ctx'> __be64 mlx4_ib_gen_node_guid(void)</div><div class='ctx'> {</div><div class='ctx'> #define NODE_GUID_HI	((u64) (((u64)IB_OPENIB_OUI) &lt;&lt; 40))</div><div class='del'>-	return cpu_to_be64(NODE_GUID_HI | random32());</div><div class='add'>+	return cpu_to_be64(NODE_GUID_HI | prandom_u32());</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> __be64 mlx4_ib_get_new_demux_tid(struct mlx4_ib_demux_ctx *ctx)</div><div class='head'>diff --git a/drivers/infiniband/hw/qib/qib_file_ops.c b/drivers/infiniband/hw/qib/qib_file_ops.c<br/>index 4f7aa301b3b..b56c9428f3c 100644<br/>--- a/<a href='/linux/tree/drivers/infiniband/hw/qib/qib_file_ops.c?h=v3.12.17&amp;id=9affd6becbfb2c3f0d04e554bb87234761b37aba'>drivers/infiniband/hw/qib/qib_file_ops.c</a><br/>+++ b/<a href='/linux/tree/drivers/infiniband/hw/qib/qib_file_ops.c?h=v3.12.17&amp;id=5af43c24ca59a448c9312dd4a4a51d27ec3b9a73'>drivers/infiniband/hw/qib/qib_file_ops.c</a></div><div class='hunk'>@@ -39,7 +39,7 @@</div><div class='ctx'> #include &lt;linux/vmalloc.h&gt;</div><div class='ctx'> #include &lt;linux/highmem.h&gt;</div><div class='ctx'> #include &lt;linux/io.h&gt;</div><div class='del'>-#include &lt;linux/uio.h&gt;</div><div class='add'>+#include &lt;linux/aio.h&gt;</div><div class='ctx'> #include &lt;linux/jiffies.h&gt;</div><div class='ctx'> #include &lt;asm/pgtable.h&gt;</div><div class='ctx'> #include &lt;linux/delay.h&gt;</div><div class='head'>diff --git a/drivers/infiniband/ulp/ipoib/ipoib_cm.c b/drivers/infiniband/ulp/ipoib/ipoib_cm.c<br/>index 1ef880de3a4..3eceb61e353 100644<br/>--- a/<a href='/linux/tree/drivers/infiniband/ulp/ipoib/ipoib_cm.c?h=v3.12.17&amp;id=9affd6becbfb2c3f0d04e554bb87234761b37aba'>drivers/infiniband/ulp/ipoib/ipoib_cm.c</a><br/>+++ b/<a href='/linux/tree/drivers/infiniband/ulp/ipoib/ipoib_cm.c?h=v3.12.17&amp;id=5af43c24ca59a448c9312dd4a4a51d27ec3b9a73'>drivers/infiniband/ulp/ipoib/ipoib_cm.c</a></div><div class='hunk'>@@ -460,7 +460,7 @@ static int ipoib_cm_req_handler(struct ib_cm_id *cm_id, struct ib_cm_event *even</div><div class='ctx'> 		goto err_qp;</div><div class='ctx'> 	}</div><div class='ctx'> </div><div class='del'>-	psn = random32() &amp; 0xffffff;</div><div class='add'>+	psn = prandom_u32() &amp; 0xffffff;</div><div class='ctx'> 	ret = ipoib_cm_modify_rx_qp(dev, cm_id, p-&gt;qp, psn);</div><div class='ctx'> 	if (ret)</div><div class='ctx'> 		goto err_modify;</div><div class='head'>diff --git a/drivers/net/ethernet/broadcom/cnic.c b/drivers/net/ethernet/broadcom/cnic.c<br/>index 40649a8bf39..6b0dc131b20 100644<br/>--- a/<a href='/linux/tree/drivers/net/ethernet/broadcom/cnic.c?h=v3.12.17&amp;id=9affd6becbfb2c3f0d04e554bb87234761b37aba'>drivers/net/ethernet/broadcom/cnic.c</a><br/>+++ b/<a href='/linux/tree/drivers/net/ethernet/broadcom/cnic.c?h=v3.12.17&amp;id=5af43c24ca59a448c9312dd4a4a51d27ec3b9a73'>drivers/net/ethernet/broadcom/cnic.c</a></div><div class='hunk'>@@ -4085,7 +4085,7 @@ static int cnic_cm_alloc_mem(struct cnic_dev *dev)</div><div class='ctx'> 	if (!cp-&gt;csk_tbl)</div><div class='ctx'> 		return -ENOMEM;</div><div class='ctx'> </div><div class='del'>-	port_id = random32();</div><div class='add'>+	port_id = prandom_u32();</div><div class='ctx'> 	port_id %= CNIC_LOCAL_PORT_RANGE;</div><div class='ctx'> 	if (cnic_init_id_tbl(&amp;cp-&gt;csk_port_tbl, CNIC_LOCAL_PORT_RANGE,</div><div class='ctx'> 			     CNIC_LOCAL_PORT_MIN, port_id)) {</div><div class='hunk'>@@ -4145,7 +4145,7 @@ static int cnic_cm_init_bnx2_hw(struct cnic_dev *dev)</div><div class='ctx'> {</div><div class='ctx'> 	u32 seed;</div><div class='ctx'> </div><div class='del'>-	seed = random32();</div><div class='add'>+	seed = prandom_u32();</div><div class='ctx'> 	cnic_ctx_wr(dev, 45, 0, seed);</div><div class='ctx'> 	return 0;</div><div class='ctx'> }</div><div class='head'>diff --git a/drivers/net/hamradio/baycom_epp.c b/drivers/net/hamradio/baycom_epp.c<br/>index 49b8b58fc5c..484f77ec2ce 100644<br/>--- a/<a href='/linux/tree/drivers/net/hamradio/baycom_epp.c?h=v3.12.17&amp;id=9affd6becbfb2c3f0d04e554bb87234761b37aba'>drivers/net/hamradio/baycom_epp.c</a><br/>+++ b/<a href='/linux/tree/drivers/net/hamradio/baycom_epp.c?h=v3.12.17&amp;id=5af43c24ca59a448c9312dd4a4a51d27ec3b9a73'>drivers/net/hamradio/baycom_epp.c</a></div><div class='hunk'>@@ -449,7 +449,7 @@ static int transmit(struct baycom_state *bc, int cnt, unsigned char stat)</div><div class='ctx'> 			if ((--bc-&gt;hdlctx.slotcnt) &gt; 0)</div><div class='ctx'> 				return 0;</div><div class='ctx'> 			bc-&gt;hdlctx.slotcnt = bc-&gt;ch_params.slottime;</div><div class='del'>-			if ((random32() % 256) &gt; bc-&gt;ch_params.ppersist)</div><div class='add'>+			if ((prandom_u32() % 256) &gt; bc-&gt;ch_params.ppersist)</div><div class='ctx'> 				return 0;</div><div class='ctx'> 		}</div><div class='ctx'> 	}</div><div class='head'>diff --git a/drivers/net/hamradio/hdlcdrv.c b/drivers/net/hamradio/hdlcdrv.c<br/>index a4a3516b6bb..3169252613f 100644<br/>--- a/<a href='/linux/tree/drivers/net/hamradio/hdlcdrv.c?h=v3.12.17&amp;id=9affd6becbfb2c3f0d04e554bb87234761b37aba'>drivers/net/hamradio/hdlcdrv.c</a><br/>+++ b/<a href='/linux/tree/drivers/net/hamradio/hdlcdrv.c?h=v3.12.17&amp;id=5af43c24ca59a448c9312dd4a4a51d27ec3b9a73'>drivers/net/hamradio/hdlcdrv.c</a></div><div class='hunk'>@@ -389,7 +389,7 @@ void hdlcdrv_arbitrate(struct net_device *dev, struct hdlcdrv_state *s)</div><div class='ctx'> 	if ((--s-&gt;hdlctx.slotcnt) &gt; 0)</div><div class='ctx'> 		return;</div><div class='ctx'> 	s-&gt;hdlctx.slotcnt = s-&gt;ch_params.slottime;</div><div class='del'>-	if ((random32() % 256) &gt; s-&gt;ch_params.ppersist)</div><div class='add'>+	if ((prandom_u32() % 256) &gt; s-&gt;ch_params.ppersist)</div><div class='ctx'> 		return;</div><div class='ctx'> 	start_tx(dev, s);</div><div class='ctx'> }</div><div class='head'>diff --git a/drivers/net/hamradio/yam.c b/drivers/net/hamradio/yam.c<br/>index b2d863f2ea4..0721e72f929 100644<br/>--- a/<a href='/linux/tree/drivers/net/hamradio/yam.c?h=v3.12.17&amp;id=9affd6becbfb2c3f0d04e554bb87234761b37aba'>drivers/net/hamradio/yam.c</a><br/>+++ b/<a href='/linux/tree/drivers/net/hamradio/yam.c?h=v3.12.17&amp;id=5af43c24ca59a448c9312dd4a4a51d27ec3b9a73'>drivers/net/hamradio/yam.c</a></div><div class='hunk'>@@ -638,7 +638,7 @@ static void yam_arbitrate(struct net_device *dev)</div><div class='ctx'> 	yp-&gt;slotcnt = yp-&gt;slot / 10;</div><div class='ctx'> </div><div class='ctx'> 	/* is random &gt; persist ? */</div><div class='del'>-	if ((random32() % 256) &gt; yp-&gt;pers)</div><div class='add'>+	if ((prandom_u32() % 256) &gt; yp-&gt;pers)</div><div class='ctx'> 		return;</div><div class='ctx'> </div><div class='ctx'> 	yam_start_tx(dev, yp);</div><div class='head'>diff --git a/drivers/net/team/team_mode_random.c b/drivers/net/team/team_mode_random.c<br/>index 9eabfaa22f3..5ca14d463ba 100644<br/>--- a/<a href='/linux/tree/drivers/net/team/team_mode_random.c?h=v3.12.17&amp;id=9affd6becbfb2c3f0d04e554bb87234761b37aba'>drivers/net/team/team_mode_random.c</a><br/>+++ b/<a href='/linux/tree/drivers/net/team/team_mode_random.c?h=v3.12.17&amp;id=5af43c24ca59a448c9312dd4a4a51d27ec3b9a73'>drivers/net/team/team_mode_random.c</a></div><div class='hunk'>@@ -18,7 +18,7 @@</div><div class='ctx'> </div><div class='ctx'> static u32 random_N(unsigned int N)</div><div class='ctx'> {</div><div class='del'>-	return reciprocal_divide(random32(), N);</div><div class='add'>+	return reciprocal_divide(prandom_u32(), N);</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> static bool rnd_transmit(struct team *team, struct sk_buff *skb)</div><div class='head'>diff --git a/drivers/net/wireless/brcm80211/brcmfmac/p2p.c b/drivers/net/wireless/brcm80211/brcmfmac/p2p.c<br/>index 2b90da0d85f..e7a1a477099 100644<br/>--- a/<a href='/linux/tree/drivers/net/wireless/brcm80211/brcmfmac/p2p.c?h=v3.12.17&amp;id=9affd6becbfb2c3f0d04e554bb87234761b37aba'>drivers/net/wireless/brcm80211/brcmfmac/p2p.c</a><br/>+++ b/<a href='/linux/tree/drivers/net/wireless/brcm80211/brcmfmac/p2p.c?h=v3.12.17&amp;id=5af43c24ca59a448c9312dd4a4a51d27ec3b9a73'>drivers/net/wireless/brcm80211/brcmfmac/p2p.c</a></div><div class='hunk'>@@ -1117,7 +1117,7 @@ static void brcmf_p2p_afx_handler(struct work_struct *work)</div><div class='ctx'> 	if (afx_hdl-&gt;is_listen &amp;&amp; afx_hdl-&gt;my_listen_chan)</div><div class='ctx'> 		/* 100ms ~ 300ms */</div><div class='ctx'> 		err = brcmf_p2p_discover_listen(p2p, afx_hdl-&gt;my_listen_chan,</div><div class='del'>-						100 * (1 + (random32() % 3)));</div><div class='add'>+						100 * (1 + prandom_u32() % 3));</div><div class='ctx'> 	else</div><div class='ctx'> 		err = brcmf_p2p_act_frm_search(p2p, afx_hdl-&gt;peer_listen_chan);</div><div class='ctx'> </div><div class='head'>diff --git a/drivers/net/wireless/mwifiex/cfg80211.c b/drivers/net/wireless/mwifiex/cfg80211.c<br/>index a0cb0770d31..d3c8ece980d 100644<br/>--- a/<a href='/linux/tree/drivers/net/wireless/mwifiex/cfg80211.c?h=v3.12.17&amp;id=9affd6becbfb2c3f0d04e554bb87234761b37aba'>drivers/net/wireless/mwifiex/cfg80211.c</a><br/>+++ b/<a href='/linux/tree/drivers/net/wireless/mwifiex/cfg80211.c?h=v3.12.17&amp;id=5af43c24ca59a448c9312dd4a4a51d27ec3b9a73'>drivers/net/wireless/mwifiex/cfg80211.c</a></div><div class='hunk'>@@ -216,7 +216,7 @@ mwifiex_cfg80211_mgmt_tx(struct wiphy *wiphy, struct wireless_dev *wdev,</div><div class='ctx'> 	mwifiex_form_mgmt_frame(skb, buf, len);</div><div class='ctx'> 	mwifiex_queue_tx_pkt(priv, skb);</div><div class='ctx'> </div><div class='del'>-	*cookie = random32() | 1;</div><div class='add'>+	*cookie = prandom_u32() | 1;</div><div class='ctx'> 	cfg80211_mgmt_tx_status(wdev, *cookie, buf, len, true, GFP_ATOMIC);</div><div class='ctx'> </div><div class='ctx'> 	wiphy_dbg(wiphy, "info: management frame transmitted\n");</div><div class='hunk'>@@ -271,7 +271,7 @@ mwifiex_cfg80211_remain_on_channel(struct wiphy *wiphy,</div><div class='ctx'> 					 duration);</div><div class='ctx'> </div><div class='ctx'> 	if (!ret) {</div><div class='del'>-		*cookie = random32() | 1;</div><div class='add'>+		*cookie = prandom_u32() | 1;</div><div class='ctx'> 		priv-&gt;roc_cfg.cookie = *cookie;</div><div class='ctx'> 		priv-&gt;roc_cfg.chan = *chan;</div><div class='ctx'> </div><div class='head'>diff --git a/drivers/rtc/rtc-rs5c372.c b/drivers/rtc/rtc-rs5c372.c<br/>index 224d634322b..ccf54f06396 100644<br/>--- a/<a href='/linux/tree/drivers/rtc/rtc-rs5c372.c?h=v3.12.17&amp;id=9affd6becbfb2c3f0d04e554bb87234761b37aba'>drivers/rtc/rtc-rs5c372.c</a><br/>+++ b/<a href='/linux/tree/drivers/rtc/rtc-rs5c372.c?h=v3.12.17&amp;id=5af43c24ca59a448c9312dd4a4a51d27ec3b9a73'>drivers/rtc/rtc-rs5c372.c</a></div><div class='hunk'>@@ -68,6 +68,7 @@</div><div class='ctx'> enum rtc_type {</div><div class='ctx'> 	rtc_undef = 0,</div><div class='ctx'> 	rtc_r2025sd,</div><div class='add'>+	rtc_r2221tl,</div><div class='ctx'> 	rtc_rs5c372a,</div><div class='ctx'> 	rtc_rs5c372b,</div><div class='ctx'> 	rtc_rv5c386,</div><div class='hunk'>@@ -76,6 +77,7 @@ enum rtc_type {</div><div class='ctx'> </div><div class='ctx'> static const struct i2c_device_id rs5c372_id[] = {</div><div class='ctx'> 	{ "r2025sd", rtc_r2025sd },</div><div class='add'>+	{ "r2221tl", rtc_r2221tl },</div><div class='ctx'> 	{ "rs5c372a", rtc_rs5c372a },</div><div class='ctx'> 	{ "rs5c372b", rtc_rs5c372b },</div><div class='ctx'> 	{ "rv5c386", rtc_rv5c386 },</div><div class='hunk'>@@ -529,6 +531,7 @@ static int rs5c_oscillator_setup(struct rs5c372 *rs5c372)</div><div class='ctx'> 		rs5c372-&gt;time24 = 1;</div><div class='ctx'> 		break;</div><div class='ctx'> 	case rtc_r2025sd:</div><div class='add'>+	case rtc_r2221tl:</div><div class='ctx'> 	case rtc_rv5c386:</div><div class='ctx'> 	case rtc_rv5c387a:</div><div class='ctx'> 		buf[0] |= RV5C387_CTRL1_24;</div><div class='hunk'>@@ -609,6 +612,7 @@ static int rs5c372_probe(struct i2c_client *client,</div><div class='ctx'> 			rs5c372-&gt;time24 = 1;</div><div class='ctx'> 		break;</div><div class='ctx'> 	case rtc_r2025sd:</div><div class='add'>+	case rtc_r2221tl:</div><div class='ctx'> 	case rtc_rv5c386:</div><div class='ctx'> 	case rtc_rv5c387a:</div><div class='ctx'> 		if (rs5c372-&gt;regs[RS5C_REG_CTRL1] &amp; RV5C387_CTRL1_24)</div><div class='hunk'>@@ -640,6 +644,7 @@ static int rs5c372_probe(struct i2c_client *client,</div><div class='ctx'> 	dev_info(&amp;client-&gt;dev, "%s found, %s, driver version " DRV_VERSION "\n",</div><div class='ctx'> 			({ char *s; switch (rs5c372-&gt;type) {</div><div class='ctx'> 			case rtc_r2025sd:	s = "r2025sd"; break;</div><div class='add'>+			case rtc_r2221tl:	s = "r2221tl"; break;</div><div class='ctx'> 			case rtc_rs5c372a:	s = "rs5c372a"; break;</div><div class='ctx'> 			case rtc_rs5c372b:	s = "rs5c372b"; break;</div><div class='ctx'> 			case rtc_rv5c386:	s = "rv5c386"; break;</div><div class='head'>diff --git a/drivers/scsi/sg.c b/drivers/scsi/sg.c<br/>index 9f0c4654745..df5e961484e 100644<br/>--- a/<a href='/linux/tree/drivers/scsi/sg.c?h=v3.12.17&amp;id=9affd6becbfb2c3f0d04e554bb87234761b37aba'>drivers/scsi/sg.c</a><br/>+++ b/<a href='/linux/tree/drivers/scsi/sg.c?h=v3.12.17&amp;id=5af43c24ca59a448c9312dd4a4a51d27ec3b9a73'>drivers/scsi/sg.c</a></div><div class='hunk'>@@ -35,6 +35,7 @@ static int sg_version_num = 30534;	/* 2 digits for each component */</div><div class='ctx'> #include &lt;linux/sched.h&gt;</div><div class='ctx'> #include &lt;linux/string.h&gt;</div><div class='ctx'> #include &lt;linux/mm.h&gt;</div><div class='add'>+#include &lt;linux/aio.h&gt;</div><div class='ctx'> #include &lt;linux/errno.h&gt;</div><div class='ctx'> #include &lt;linux/mtio.h&gt;</div><div class='ctx'> #include &lt;linux/ioctl.h&gt;</div><div class='head'>diff --git a/drivers/staging/android/logger.c b/drivers/staging/android/logger.c<br/>index b14a5574255..b040200a5a5 100644<br/>--- a/<a href='/linux/tree/drivers/staging/android/logger.c?h=v3.12.17&amp;id=9affd6becbfb2c3f0d04e554bb87234761b37aba'>drivers/staging/android/logger.c</a><br/>+++ b/<a href='/linux/tree/drivers/staging/android/logger.c?h=v3.12.17&amp;id=5af43c24ca59a448c9312dd4a4a51d27ec3b9a73'>drivers/staging/android/logger.c</a></div><div class='hunk'>@@ -28,6 +28,7 @@</div><div class='ctx'> #include &lt;linux/slab.h&gt;</div><div class='ctx'> #include &lt;linux/time.h&gt;</div><div class='ctx'> #include &lt;linux/vmalloc.h&gt;</div><div class='add'>+#include &lt;linux/aio.h&gt;</div><div class='ctx'> #include "logger.h"</div><div class='ctx'> </div><div class='ctx'> #include &lt;asm/ioctls.h&gt;</div><div class='head'>diff --git a/drivers/usb/gadget/inode.c b/drivers/usb/gadget/inode.c<br/>index dda0dc4a556..570c005062a 100644<br/>--- a/<a href='/linux/tree/drivers/usb/gadget/inode.c?h=v3.12.17&amp;id=9affd6becbfb2c3f0d04e554bb87234761b37aba'>drivers/usb/gadget/inode.c</a><br/>+++ b/<a href='/linux/tree/drivers/usb/gadget/inode.c?h=v3.12.17&amp;id=5af43c24ca59a448c9312dd4a4a51d27ec3b9a73'>drivers/usb/gadget/inode.c</a></div><div class='hunk'>@@ -24,6 +24,8 @@</div><div class='ctx'> #include &lt;linux/sched.h&gt;</div><div class='ctx'> #include &lt;linux/slab.h&gt;</div><div class='ctx'> #include &lt;linux/poll.h&gt;</div><div class='add'>+#include &lt;linux/mmu_context.h&gt;</div><div class='add'>+#include &lt;linux/aio.h&gt;</div><div class='ctx'> </div><div class='ctx'> #include &lt;linux/device.h&gt;</div><div class='ctx'> #include &lt;linux/moduleparam.h&gt;</div><div class='hunk'>@@ -513,6 +515,9 @@ static long ep_ioctl(struct file *fd, unsigned code, unsigned long value)</div><div class='ctx'> struct kiocb_priv {</div><div class='ctx'> 	struct usb_request	*req;</div><div class='ctx'> 	struct ep_data		*epdata;</div><div class='add'>+	struct kiocb		*iocb;</div><div class='add'>+	struct mm_struct	*mm;</div><div class='add'>+	struct work_struct	work;</div><div class='ctx'> 	void			*buf;</div><div class='ctx'> 	const struct iovec	*iv;</div><div class='ctx'> 	unsigned long		nr_segs;</div><div class='hunk'>@@ -528,7 +533,6 @@ static int ep_aio_cancel(struct kiocb *iocb, struct io_event *e)</div><div class='ctx'> 	local_irq_disable();</div><div class='ctx'> 	epdata = priv-&gt;epdata;</div><div class='ctx'> 	// spin_lock(&amp;epdata-&gt;dev-&gt;lock);</div><div class='del'>-	kiocbSetCancelled(iocb);</div><div class='ctx'> 	if (likely(epdata &amp;&amp; epdata-&gt;ep &amp;&amp; priv-&gt;req))</div><div class='ctx'> 		value = usb_ep_dequeue (epdata-&gt;ep, priv-&gt;req);</div><div class='ctx'> 	else</div><div class='hunk'>@@ -540,15 +544,12 @@ static int ep_aio_cancel(struct kiocb *iocb, struct io_event *e)</div><div class='ctx'> 	return value;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-static ssize_t ep_aio_read_retry(struct kiocb *iocb)</div><div class='add'>+static ssize_t ep_copy_to_user(struct kiocb_priv *priv)</div><div class='ctx'> {</div><div class='del'>-	struct kiocb_priv	*priv = iocb-&gt;private;</div><div class='ctx'> 	ssize_t			len, total;</div><div class='ctx'> 	void			*to_copy;</div><div class='ctx'> 	int			i;</div><div class='ctx'> </div><div class='del'>-	/* we "retry" to get the right mm context for this: */</div><div class='del'>-</div><div class='ctx'> 	/* copy stuff into user buffers */</div><div class='ctx'> 	total = priv-&gt;actual;</div><div class='ctx'> 	len = 0;</div><div class='hunk'>@@ -568,9 +569,26 @@ static ssize_t ep_aio_read_retry(struct kiocb *iocb)</div><div class='ctx'> 		if (total == 0)</div><div class='ctx'> 			break;</div><div class='ctx'> 	}</div><div class='add'>+</div><div class='add'>+	return len;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void ep_user_copy_worker(struct work_struct *work)</div><div class='add'>+{</div><div class='add'>+	struct kiocb_priv *priv = container_of(work, struct kiocb_priv, work);</div><div class='add'>+	struct mm_struct *mm = priv-&gt;mm;</div><div class='add'>+	struct kiocb *iocb = priv-&gt;iocb;</div><div class='add'>+	size_t ret;</div><div class='add'>+</div><div class='add'>+	use_mm(mm);</div><div class='add'>+	ret = ep_copy_to_user(priv);</div><div class='add'>+	unuse_mm(mm);</div><div class='add'>+</div><div class='add'>+	/* completing the iocb can drop the ctx and mm, don't touch mm after */</div><div class='add'>+	aio_complete(iocb, ret, ret);</div><div class='add'>+</div><div class='ctx'> 	kfree(priv-&gt;buf);</div><div class='ctx'> 	kfree(priv);</div><div class='del'>-	return len;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> static void ep_aio_complete(struct usb_ep *ep, struct usb_request *req)</div><div class='hunk'>@@ -596,14 +614,14 @@ static void ep_aio_complete(struct usb_ep *ep, struct usb_request *req)</div><div class='ctx'> 		aio_complete(iocb, req-&gt;actual ? req-&gt;actual : req-&gt;status,</div><div class='ctx'> 				req-&gt;status);</div><div class='ctx'> 	} else {</div><div class='del'>-		/* retry() won't report both; so we hide some faults */</div><div class='add'>+		/* ep_copy_to_user() won't report both; we hide some faults */</div><div class='ctx'> 		if (unlikely(0 != req-&gt;status))</div><div class='ctx'> 			DBG(epdata-&gt;dev, "%s fault %d len %d\n",</div><div class='ctx'> 				ep-&gt;name, req-&gt;status, req-&gt;actual);</div><div class='ctx'> </div><div class='ctx'> 		priv-&gt;buf = req-&gt;buf;</div><div class='ctx'> 		priv-&gt;actual = req-&gt;actual;</div><div class='del'>-		kick_iocb(iocb);</div><div class='add'>+		schedule_work(&amp;priv-&gt;work);</div><div class='ctx'> 	}</div><div class='ctx'> 	spin_unlock(&amp;epdata-&gt;dev-&gt;lock);</div><div class='ctx'> </div><div class='hunk'>@@ -633,8 +651,10 @@ fail:</div><div class='ctx'> 		return value;</div><div class='ctx'> 	}</div><div class='ctx'> 	iocb-&gt;private = priv;</div><div class='add'>+	priv-&gt;iocb = iocb;</div><div class='ctx'> 	priv-&gt;iv = iv;</div><div class='ctx'> 	priv-&gt;nr_segs = nr_segs;</div><div class='add'>+	INIT_WORK(&amp;priv-&gt;work, ep_user_copy_worker);</div><div class='ctx'> </div><div class='ctx'> 	value = get_ready_ep(iocb-&gt;ki_filp-&gt;f_flags, epdata);</div><div class='ctx'> 	if (unlikely(value &lt; 0)) {</div><div class='hunk'>@@ -642,10 +662,11 @@ fail:</div><div class='ctx'> 		goto fail;</div><div class='ctx'> 	}</div><div class='ctx'> </div><div class='del'>-	iocb-&gt;ki_cancel = ep_aio_cancel;</div><div class='add'>+	kiocb_set_cancel_fn(iocb, ep_aio_cancel);</div><div class='ctx'> 	get_ep(epdata);</div><div class='ctx'> 	priv-&gt;epdata = epdata;</div><div class='ctx'> 	priv-&gt;actual = 0;</div><div class='add'>+	priv-&gt;mm = current-&gt;mm; /* mm teardown waits for iocbs in exit_aio() */</div><div class='ctx'> </div><div class='ctx'> 	/* each kiocb is coupled to one usb_request, but we can't</div><div class='ctx'> 	 * allocate or submit those if the host disconnected.</div><div class='hunk'>@@ -674,7 +695,7 @@ fail:</div><div class='ctx'> 		kfree(priv);</div><div class='ctx'> 		put_ep(epdata);</div><div class='ctx'> 	} else</div><div class='del'>-		value = (iv ? -EIOCBRETRY : -EIOCBQUEUED);</div><div class='add'>+		value = -EIOCBQUEUED;</div><div class='ctx'> 	return value;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='hunk'>@@ -692,7 +713,6 @@ ep_aio_read(struct kiocb *iocb, const struct iovec *iov,</div><div class='ctx'> 	if (unlikely(!buf))</div><div class='ctx'> 		return -ENOMEM;</div><div class='ctx'> </div><div class='del'>-	iocb-&gt;ki_retry = ep_aio_read_retry;</div><div class='ctx'> 	return ep_aio_rwtail(iocb, buf, iocb-&gt;ki_left, epdata, iov, nr_segs);</div><div class='ctx'> }</div><div class='ctx'> </div><div class='head'>diff --git a/fs/9p/vfs_addr.c b/fs/9p/vfs_addr.c<br/>index 0ad61c6a65a..055562c580b 100644<br/>--- a/<a href='/linux/tree/fs/9p/vfs_addr.c?h=v3.12.17&amp;id=9affd6becbfb2c3f0d04e554bb87234761b37aba'>fs/9p/vfs_addr.c</a><br/>+++ b/<a href='/linux/tree/fs/9p/vfs_addr.c?h=v3.12.17&amp;id=5af43c24ca59a448c9312dd4a4a51d27ec3b9a73'>fs/9p/vfs_addr.c</a></div><div class='hunk'>@@ -33,6 +33,7 @@</div><div class='ctx'> #include &lt;linux/pagemap.h&gt;</div><div class='ctx'> #include &lt;linux/idr.h&gt;</div><div class='ctx'> #include &lt;linux/sched.h&gt;</div><div class='add'>+#include &lt;linux/aio.h&gt;</div><div class='ctx'> #include &lt;net/9p/9p.h&gt;</div><div class='ctx'> #include &lt;net/9p/client.h&gt;</div><div class='ctx'> </div><div class='head'>diff --git a/fs/afs/write.c b/fs/afs/write.c<br/>index 7e03eadb40c..a890db4b989 100644<br/>--- a/<a href='/linux/tree/fs/afs/write.c?h=v3.12.17&amp;id=9affd6becbfb2c3f0d04e554bb87234761b37aba'>fs/afs/write.c</a><br/>+++ b/<a href='/linux/tree/fs/afs/write.c?h=v3.12.17&amp;id=5af43c24ca59a448c9312dd4a4a51d27ec3b9a73'>fs/afs/write.c</a></div><div class='hunk'>@@ -14,6 +14,7 @@</div><div class='ctx'> #include &lt;linux/pagemap.h&gt;</div><div class='ctx'> #include &lt;linux/writeback.h&gt;</div><div class='ctx'> #include &lt;linux/pagevec.h&gt;</div><div class='add'>+#include &lt;linux/aio.h&gt;</div><div class='ctx'> #include "internal.h"</div><div class='ctx'> </div><div class='ctx'> static int afs_write_back_from_locked_page(struct afs_writeback *wb,</div><div class='head'>diff --git a/fs/aio.c b/fs/aio.c<br/>index 351afe7ac78..c5b1a8c1041 100644<br/>--- a/<a href='/linux/tree/fs/aio.c?h=v3.12.17&amp;id=9affd6becbfb2c3f0d04e554bb87234761b37aba'>fs/aio.c</a><br/>+++ b/<a href='/linux/tree/fs/aio.c?h=v3.12.17&amp;id=5af43c24ca59a448c9312dd4a4a51d27ec3b9a73'>fs/aio.c</a></div><div class='hunk'>@@ -8,6 +8,8 @@</div><div class='ctx'>  *</div><div class='ctx'>  *	See ../COPYING for licensing terms.</div><div class='ctx'>  */</div><div class='add'>+#define pr_fmt(fmt) "%s: " fmt, __func__</div><div class='add'>+</div><div class='ctx'> #include &lt;linux/kernel.h&gt;</div><div class='ctx'> #include &lt;linux/init.h&gt;</div><div class='ctx'> #include &lt;linux/errno.h&gt;</div><div class='hunk'>@@ -18,8 +20,6 @@</div><div class='ctx'> #include &lt;linux/backing-dev.h&gt;</div><div class='ctx'> #include &lt;linux/uio.h&gt;</div><div class='ctx'> </div><div class='del'>-#define DEBUG 0</div><div class='del'>-</div><div class='ctx'> #include &lt;linux/sched.h&gt;</div><div class='ctx'> #include &lt;linux/fs.h&gt;</div><div class='ctx'> #include &lt;linux/file.h&gt;</div><div class='hunk'>@@ -39,11 +39,76 @@</div><div class='ctx'> #include &lt;asm/kmap_types.h&gt;</div><div class='ctx'> #include &lt;asm/uaccess.h&gt;</div><div class='ctx'> </div><div class='del'>-#if DEBUG &gt; 1</div><div class='del'>-#define dprintk		printk</div><div class='del'>-#else</div><div class='del'>-#define dprintk(x...)	do { ; } while (0)</div><div class='del'>-#endif</div><div class='add'>+#define AIO_RING_MAGIC			0xa10a10a1</div><div class='add'>+#define AIO_RING_COMPAT_FEATURES	1</div><div class='add'>+#define AIO_RING_INCOMPAT_FEATURES	0</div><div class='add'>+struct aio_ring {</div><div class='add'>+	unsigned	id;	/* kernel internal index number */</div><div class='add'>+	unsigned	nr;	/* number of io_events */</div><div class='add'>+	unsigned	head;</div><div class='add'>+	unsigned	tail;</div><div class='add'>+</div><div class='add'>+	unsigned	magic;</div><div class='add'>+	unsigned	compat_features;</div><div class='add'>+	unsigned	incompat_features;</div><div class='add'>+	unsigned	header_length;	/* size of aio_ring */</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+	struct io_event		io_events[0];</div><div class='add'>+}; /* 128 bytes + ring size */</div><div class='add'>+</div><div class='add'>+#define AIO_RING_PAGES	8</div><div class='add'>+</div><div class='add'>+struct kioctx {</div><div class='add'>+	atomic_t		users;</div><div class='add'>+	atomic_t		dead;</div><div class='add'>+</div><div class='add'>+	/* This needs improving */</div><div class='add'>+	unsigned long		user_id;</div><div class='add'>+	struct hlist_node	list;</div><div class='add'>+</div><div class='add'>+	/*</div><div class='add'>+	 * This is what userspace passed to io_setup(), it's not used for</div><div class='add'>+	 * anything but counting against the global max_reqs quota.</div><div class='add'>+	 *</div><div class='add'>+	 * The real limit is nr_events - 1, which will be larger (see</div><div class='add'>+	 * aio_setup_ring())</div><div class='add'>+	 */</div><div class='add'>+	unsigned		max_reqs;</div><div class='add'>+</div><div class='add'>+	/* Size of ringbuffer, in units of struct io_event */</div><div class='add'>+	unsigned		nr_events;</div><div class='add'>+</div><div class='add'>+	unsigned long		mmap_base;</div><div class='add'>+	unsigned long		mmap_size;</div><div class='add'>+</div><div class='add'>+	struct page		**ring_pages;</div><div class='add'>+	long			nr_pages;</div><div class='add'>+</div><div class='add'>+	struct rcu_head		rcu_head;</div><div class='add'>+	struct work_struct	rcu_work;</div><div class='add'>+</div><div class='add'>+	struct {</div><div class='add'>+		atomic_t	reqs_active;</div><div class='add'>+	} ____cacheline_aligned_in_smp;</div><div class='add'>+</div><div class='add'>+	struct {</div><div class='add'>+		spinlock_t	ctx_lock;</div><div class='add'>+		struct list_head active_reqs;	/* used for cancellation */</div><div class='add'>+	} ____cacheline_aligned_in_smp;</div><div class='add'>+</div><div class='add'>+	struct {</div><div class='add'>+		struct mutex	ring_lock;</div><div class='add'>+		wait_queue_head_t wait;</div><div class='add'>+	} ____cacheline_aligned_in_smp;</div><div class='add'>+</div><div class='add'>+	struct {</div><div class='add'>+		unsigned	tail;</div><div class='add'>+		spinlock_t	completion_lock;</div><div class='add'>+	} ____cacheline_aligned_in_smp;</div><div class='add'>+</div><div class='add'>+	struct page		*internal_pages[AIO_RING_PAGES];</div><div class='add'>+};</div><div class='ctx'> </div><div class='ctx'> /*------ sysctl variables----*/</div><div class='ctx'> static DEFINE_SPINLOCK(aio_nr_lock);</div><div class='hunk'>@@ -54,11 +119,6 @@ unsigned long aio_max_nr = 0x10000; /* system wide maximum number of aio request</div><div class='ctx'> static struct kmem_cache	*kiocb_cachep;</div><div class='ctx'> static struct kmem_cache	*kioctx_cachep;</div><div class='ctx'> </div><div class='del'>-static struct workqueue_struct *aio_wq;</div><div class='del'>-</div><div class='del'>-static void aio_kick_handler(struct work_struct *);</div><div class='del'>-static void aio_queue_work(struct kioctx *);</div><div class='del'>-</div><div class='ctx'> /* aio_setup</div><div class='ctx'>  *	Creates the slab caches used by the aio routines, panic on</div><div class='ctx'>  *	failure as this is done early during the boot sequence.</div><div class='hunk'>@@ -68,10 +128,7 @@ static int __init aio_setup(void)</div><div class='ctx'> 	kiocb_cachep = KMEM_CACHE(kiocb, SLAB_HWCACHE_ALIGN|SLAB_PANIC);</div><div class='ctx'> 	kioctx_cachep = KMEM_CACHE(kioctx,SLAB_HWCACHE_ALIGN|SLAB_PANIC);</div><div class='ctx'> </div><div class='del'>-	aio_wq = alloc_workqueue("aio", 0, 1);	/* used to limit concurrency */</div><div class='del'>-	BUG_ON(!aio_wq);</div><div class='del'>-</div><div class='del'>-	pr_debug("aio_setup: sizeof(struct page) = %d\n", (int)sizeof(struct page));</div><div class='add'>+	pr_debug("sizeof(struct page) = %zu\n", sizeof(struct page));</div><div class='ctx'> </div><div class='ctx'> 	return 0;</div><div class='ctx'> }</div><div class='hunk'>@@ -79,28 +136,23 @@ __initcall(aio_setup);</div><div class='ctx'> </div><div class='ctx'> static void aio_free_ring(struct kioctx *ctx)</div><div class='ctx'> {</div><div class='del'>-	struct aio_ring_info *info = &amp;ctx-&gt;ring_info;</div><div class='ctx'> 	long i;</div><div class='ctx'> </div><div class='del'>-	for (i=0; i&lt;info-&gt;nr_pages; i++)</div><div class='del'>-		put_page(info-&gt;ring_pages[i]);</div><div class='add'>+	for (i = 0; i &lt; ctx-&gt;nr_pages; i++)</div><div class='add'>+		put_page(ctx-&gt;ring_pages[i]);</div><div class='ctx'> </div><div class='del'>-	if (info-&gt;mmap_size) {</div><div class='del'>-		BUG_ON(ctx-&gt;mm != current-&gt;mm);</div><div class='del'>-		vm_munmap(info-&gt;mmap_base, info-&gt;mmap_size);</div><div class='del'>-	}</div><div class='add'>+	if (ctx-&gt;mmap_size)</div><div class='add'>+		vm_munmap(ctx-&gt;mmap_base, ctx-&gt;mmap_size);</div><div class='ctx'> </div><div class='del'>-	if (info-&gt;ring_pages &amp;&amp; info-&gt;ring_pages != info-&gt;internal_pages)</div><div class='del'>-		kfree(info-&gt;ring_pages);</div><div class='del'>-	info-&gt;ring_pages = NULL;</div><div class='del'>-	info-&gt;nr = 0;</div><div class='add'>+	if (ctx-&gt;ring_pages &amp;&amp; ctx-&gt;ring_pages != ctx-&gt;internal_pages)</div><div class='add'>+		kfree(ctx-&gt;ring_pages);</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> static int aio_setup_ring(struct kioctx *ctx)</div><div class='ctx'> {</div><div class='ctx'> 	struct aio_ring *ring;</div><div class='del'>-	struct aio_ring_info *info = &amp;ctx-&gt;ring_info;</div><div class='ctx'> 	unsigned nr_events = ctx-&gt;max_reqs;</div><div class='add'>+	struct mm_struct *mm = current-&gt;mm;</div><div class='ctx'> 	unsigned long size, populate;</div><div class='ctx'> 	int nr_pages;</div><div class='ctx'> </div><div class='hunk'>@@ -116,46 +168,44 @@ static int aio_setup_ring(struct kioctx *ctx)</div><div class='ctx'> </div><div class='ctx'> 	nr_events = (PAGE_SIZE * nr_pages - sizeof(struct aio_ring)) / sizeof(struct io_event);</div><div class='ctx'> </div><div class='del'>-	info-&gt;nr = 0;</div><div class='del'>-	info-&gt;ring_pages = info-&gt;internal_pages;</div><div class='add'>+	ctx-&gt;nr_events = 0;</div><div class='add'>+	ctx-&gt;ring_pages = ctx-&gt;internal_pages;</div><div class='ctx'> 	if (nr_pages &gt; AIO_RING_PAGES) {</div><div class='del'>-		info-&gt;ring_pages = kcalloc(nr_pages, sizeof(struct page *), GFP_KERNEL);</div><div class='del'>-		if (!info-&gt;ring_pages)</div><div class='add'>+		ctx-&gt;ring_pages = kcalloc(nr_pages, sizeof(struct page *),</div><div class='add'>+					  GFP_KERNEL);</div><div class='add'>+		if (!ctx-&gt;ring_pages)</div><div class='ctx'> 			return -ENOMEM;</div><div class='ctx'> 	}</div><div class='ctx'> </div><div class='del'>-	info-&gt;mmap_size = nr_pages * PAGE_SIZE;</div><div class='del'>-	dprintk("attempting mmap of %lu bytes\n", info-&gt;mmap_size);</div><div class='del'>-	down_write(&amp;ctx-&gt;mm-&gt;mmap_sem);</div><div class='del'>-	info-&gt;mmap_base = do_mmap_pgoff(NULL, 0, info-&gt;mmap_size, </div><div class='del'>-					PROT_READ|PROT_WRITE,</div><div class='del'>-					MAP_ANONYMOUS|MAP_PRIVATE, 0,</div><div class='del'>-					&amp;populate);</div><div class='del'>-	if (IS_ERR((void *)info-&gt;mmap_base)) {</div><div class='del'>-		up_write(&amp;ctx-&gt;mm-&gt;mmap_sem);</div><div class='del'>-		info-&gt;mmap_size = 0;</div><div class='add'>+	ctx-&gt;mmap_size = nr_pages * PAGE_SIZE;</div><div class='add'>+	pr_debug("attempting mmap of %lu bytes\n", ctx-&gt;mmap_size);</div><div class='add'>+	down_write(&amp;mm-&gt;mmap_sem);</div><div class='add'>+	ctx-&gt;mmap_base = do_mmap_pgoff(NULL, 0, ctx-&gt;mmap_size,</div><div class='add'>+				       PROT_READ|PROT_WRITE,</div><div class='add'>+				       MAP_ANONYMOUS|MAP_PRIVATE, 0, &amp;populate);</div><div class='add'>+	if (IS_ERR((void *)ctx-&gt;mmap_base)) {</div><div class='add'>+		up_write(&amp;mm-&gt;mmap_sem);</div><div class='add'>+		ctx-&gt;mmap_size = 0;</div><div class='ctx'> 		aio_free_ring(ctx);</div><div class='ctx'> 		return -EAGAIN;</div><div class='ctx'> 	}</div><div class='ctx'> </div><div class='del'>-	dprintk("mmap address: 0x%08lx\n", info-&gt;mmap_base);</div><div class='del'>-	info-&gt;nr_pages = get_user_pages(current, ctx-&gt;mm,</div><div class='del'>-					info-&gt;mmap_base, nr_pages, </div><div class='del'>-					1, 0, info-&gt;ring_pages, NULL);</div><div class='del'>-	up_write(&amp;ctx-&gt;mm-&gt;mmap_sem);</div><div class='add'>+	pr_debug("mmap address: 0x%08lx\n", ctx-&gt;mmap_base);</div><div class='add'>+	ctx-&gt;nr_pages = get_user_pages(current, mm, ctx-&gt;mmap_base, nr_pages,</div><div class='add'>+				       1, 0, ctx-&gt;ring_pages, NULL);</div><div class='add'>+	up_write(&amp;mm-&gt;mmap_sem);</div><div class='ctx'> </div><div class='del'>-	if (unlikely(info-&gt;nr_pages != nr_pages)) {</div><div class='add'>+	if (unlikely(ctx-&gt;nr_pages != nr_pages)) {</div><div class='ctx'> 		aio_free_ring(ctx);</div><div class='ctx'> 		return -EAGAIN;</div><div class='ctx'> 	}</div><div class='ctx'> 	if (populate)</div><div class='del'>-		mm_populate(info-&gt;mmap_base, populate);</div><div class='add'>+		mm_populate(ctx-&gt;mmap_base, populate);</div><div class='ctx'> </div><div class='del'>-	ctx-&gt;user_id = info-&gt;mmap_base;</div><div class='add'>+	ctx-&gt;user_id = ctx-&gt;mmap_base;</div><div class='add'>+	ctx-&gt;nr_events = nr_events; /* trusted copy */</div><div class='ctx'> </div><div class='del'>-	info-&gt;nr = nr_events;		/* trusted copy */</div><div class='del'>-</div><div class='del'>-	ring = kmap_atomic(info-&gt;ring_pages[0]);</div><div class='add'>+	ring = kmap_atomic(ctx-&gt;ring_pages[0]);</div><div class='ctx'> 	ring-&gt;nr = nr_events;	/* user copy */</div><div class='ctx'> 	ring-&gt;id = ctx-&gt;user_id;</div><div class='ctx'> 	ring-&gt;head = ring-&gt;tail = 0;</div><div class='hunk'>@@ -164,72 +214,133 @@ static int aio_setup_ring(struct kioctx *ctx)</div><div class='ctx'> 	ring-&gt;incompat_features = AIO_RING_INCOMPAT_FEATURES;</div><div class='ctx'> 	ring-&gt;header_length = sizeof(struct aio_ring);</div><div class='ctx'> 	kunmap_atomic(ring);</div><div class='add'>+	flush_dcache_page(ctx-&gt;ring_pages[0]);</div><div class='ctx'> </div><div class='ctx'> 	return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-/* aio_ring_event: returns a pointer to the event at the given index from</div><div class='del'>- * kmap_atomic().  Release the pointer with put_aio_ring_event();</div><div class='del'>- */</div><div class='ctx'> #define AIO_EVENTS_PER_PAGE	(PAGE_SIZE / sizeof(struct io_event))</div><div class='ctx'> #define AIO_EVENTS_FIRST_PAGE	((PAGE_SIZE - sizeof(struct aio_ring)) / sizeof(struct io_event))</div><div class='ctx'> #define AIO_EVENTS_OFFSET	(AIO_EVENTS_PER_PAGE - AIO_EVENTS_FIRST_PAGE)</div><div class='ctx'> </div><div class='del'>-#define aio_ring_event(info, nr) ({					\</div><div class='del'>-	unsigned pos = (nr) + AIO_EVENTS_OFFSET;			\</div><div class='del'>-	struct io_event *__event;					\</div><div class='del'>-	__event = kmap_atomic(						\</div><div class='del'>-			(info)-&gt;ring_pages[pos / AIO_EVENTS_PER_PAGE]); \</div><div class='del'>-	__event += pos % AIO_EVENTS_PER_PAGE;				\</div><div class='del'>-	__event;							\</div><div class='del'>-})</div><div class='del'>-</div><div class='del'>-#define put_aio_ring_event(event) do {		\</div><div class='del'>-	struct io_event *__event = (event);	\</div><div class='del'>-	(void)__event;				\</div><div class='del'>-	kunmap_atomic((void *)((unsigned long)__event &amp; PAGE_MASK)); \</div><div class='del'>-} while(0)</div><div class='del'>-</div><div class='del'>-static void ctx_rcu_free(struct rcu_head *head)</div><div class='add'>+void kiocb_set_cancel_fn(struct kiocb *req, kiocb_cancel_fn *cancel)</div><div class='add'>+{</div><div class='add'>+	struct kioctx *ctx = req-&gt;ki_ctx;</div><div class='add'>+	unsigned long flags;</div><div class='add'>+</div><div class='add'>+	spin_lock_irqsave(&amp;ctx-&gt;ctx_lock, flags);</div><div class='add'>+</div><div class='add'>+	if (!req-&gt;ki_list.next)</div><div class='add'>+		list_add(&amp;req-&gt;ki_list, &amp;ctx-&gt;active_reqs);</div><div class='add'>+</div><div class='add'>+	req-&gt;ki_cancel = cancel;</div><div class='add'>+</div><div class='add'>+	spin_unlock_irqrestore(&amp;ctx-&gt;ctx_lock, flags);</div><div class='add'>+}</div><div class='add'>+EXPORT_SYMBOL(kiocb_set_cancel_fn);</div><div class='add'>+</div><div class='add'>+static int kiocb_cancel(struct kioctx *ctx, struct kiocb *kiocb,</div><div class='add'>+			struct io_event *res)</div><div class='add'>+{</div><div class='add'>+	kiocb_cancel_fn *old, *cancel;</div><div class='add'>+	int ret = -EINVAL;</div><div class='add'>+</div><div class='add'>+	/*</div><div class='add'>+	 * Don't want to set kiocb-&gt;ki_cancel = KIOCB_CANCELLED unless it</div><div class='add'>+	 * actually has a cancel function, hence the cmpxchg()</div><div class='add'>+	 */</div><div class='add'>+</div><div class='add'>+	cancel = ACCESS_ONCE(kiocb-&gt;ki_cancel);</div><div class='add'>+	do {</div><div class='add'>+		if (!cancel || cancel == KIOCB_CANCELLED)</div><div class='add'>+			return ret;</div><div class='add'>+</div><div class='add'>+		old = cancel;</div><div class='add'>+		cancel = cmpxchg(&amp;kiocb-&gt;ki_cancel, old, KIOCB_CANCELLED);</div><div class='add'>+	} while (cancel != old);</div><div class='add'>+</div><div class='add'>+	atomic_inc(&amp;kiocb-&gt;ki_users);</div><div class='add'>+	spin_unlock_irq(&amp;ctx-&gt;ctx_lock);</div><div class='add'>+</div><div class='add'>+	memset(res, 0, sizeof(*res));</div><div class='add'>+	res-&gt;obj = (u64)(unsigned long)kiocb-&gt;ki_obj.user;</div><div class='add'>+	res-&gt;data = kiocb-&gt;ki_user_data;</div><div class='add'>+	ret = cancel(kiocb, res);</div><div class='add'>+</div><div class='add'>+	spin_lock_irq(&amp;ctx-&gt;ctx_lock);</div><div class='add'>+</div><div class='add'>+	return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void free_ioctx_rcu(struct rcu_head *head)</div><div class='ctx'> {</div><div class='ctx'> 	struct kioctx *ctx = container_of(head, struct kioctx, rcu_head);</div><div class='ctx'> 	kmem_cache_free(kioctx_cachep, ctx);</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-/* __put_ioctx</div><div class='del'>- *	Called when the last user of an aio context has gone away,</div><div class='del'>- *	and the struct needs to be freed.</div><div class='add'>+/*</div><div class='add'>+ * When this function runs, the kioctx has been removed from the "hash table"</div><div class='add'>+ * and ctx-&gt;users has dropped to 0, so we know no more kiocbs can be submitted -</div><div class='add'>+ * now it's safe to cancel any that need to be.</div><div class='ctx'>  */</div><div class='del'>-static void __put_ioctx(struct kioctx *ctx)</div><div class='add'>+static void free_ioctx(struct kioctx *ctx)</div><div class='ctx'> {</div><div class='del'>-	unsigned nr_events = ctx-&gt;max_reqs;</div><div class='del'>-	BUG_ON(ctx-&gt;reqs_active);</div><div class='add'>+	struct aio_ring *ring;</div><div class='add'>+	struct io_event res;</div><div class='add'>+	struct kiocb *req;</div><div class='add'>+	unsigned head, avail;</div><div class='ctx'> </div><div class='del'>-	cancel_delayed_work_sync(&amp;ctx-&gt;wq);</div><div class='del'>-	aio_free_ring(ctx);</div><div class='del'>-	mmdrop(ctx-&gt;mm);</div><div class='del'>-	ctx-&gt;mm = NULL;</div><div class='del'>-	if (nr_events) {</div><div class='del'>-		spin_lock(&amp;aio_nr_lock);</div><div class='del'>-		BUG_ON(aio_nr - nr_events &gt; aio_nr);</div><div class='del'>-		aio_nr -= nr_events;</div><div class='del'>-		spin_unlock(&amp;aio_nr_lock);</div><div class='add'>+	spin_lock_irq(&amp;ctx-&gt;ctx_lock);</div><div class='add'>+</div><div class='add'>+	while (!list_empty(&amp;ctx-&gt;active_reqs)) {</div><div class='add'>+		req = list_first_entry(&amp;ctx-&gt;active_reqs,</div><div class='add'>+				       struct kiocb, ki_list);</div><div class='add'>+</div><div class='add'>+		list_del_init(&amp;req-&gt;ki_list);</div><div class='add'>+		kiocb_cancel(ctx, req, &amp;res);</div><div class='ctx'> 	}</div><div class='del'>-	pr_debug("__put_ioctx: freeing %p\n", ctx);</div><div class='del'>-	call_rcu(&amp;ctx-&gt;rcu_head, ctx_rcu_free);</div><div class='del'>-}</div><div class='ctx'> </div><div class='del'>-static inline int try_get_ioctx(struct kioctx *kioctx)</div><div class='del'>-{</div><div class='del'>-	return atomic_inc_not_zero(&amp;kioctx-&gt;users);</div><div class='add'>+	spin_unlock_irq(&amp;ctx-&gt;ctx_lock);</div><div class='add'>+</div><div class='add'>+	ring = kmap_atomic(ctx-&gt;ring_pages[0]);</div><div class='add'>+	head = ring-&gt;head;</div><div class='add'>+	kunmap_atomic(ring);</div><div class='add'>+</div><div class='add'>+	while (atomic_read(&amp;ctx-&gt;reqs_active) &gt; 0) {</div><div class='add'>+		wait_event(ctx-&gt;wait, head != ctx-&gt;tail);</div><div class='add'>+</div><div class='add'>+		avail = (head &lt;= ctx-&gt;tail ? ctx-&gt;tail : ctx-&gt;nr_events) - head;</div><div class='add'>+</div><div class='add'>+		atomic_sub(avail, &amp;ctx-&gt;reqs_active);</div><div class='add'>+		head += avail;</div><div class='add'>+		head %= ctx-&gt;nr_events;</div><div class='add'>+	}</div><div class='add'>+</div><div class='add'>+	WARN_ON(atomic_read(&amp;ctx-&gt;reqs_active) &lt; 0);</div><div class='add'>+</div><div class='add'>+	aio_free_ring(ctx);</div><div class='add'>+</div><div class='add'>+	spin_lock(&amp;aio_nr_lock);</div><div class='add'>+	BUG_ON(aio_nr - ctx-&gt;max_reqs &gt; aio_nr);</div><div class='add'>+	aio_nr -= ctx-&gt;max_reqs;</div><div class='add'>+	spin_unlock(&amp;aio_nr_lock);</div><div class='add'>+</div><div class='add'>+	pr_debug("freeing %p\n", ctx);</div><div class='add'>+</div><div class='add'>+	/*</div><div class='add'>+	 * Here the call_rcu() is between the wait_event() for reqs_active to</div><div class='add'>+	 * hit 0, and freeing the ioctx.</div><div class='add'>+	 *</div><div class='add'>+	 * aio_complete() decrements reqs_active, but it has to touch the ioctx</div><div class='add'>+	 * after to issue a wakeup so we use rcu.</div><div class='add'>+	 */</div><div class='add'>+	call_rcu(&amp;ctx-&gt;rcu_head, free_ioctx_rcu);</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-static inline void put_ioctx(struct kioctx *kioctx)</div><div class='add'>+static void put_ioctx(struct kioctx *ctx)</div><div class='ctx'> {</div><div class='del'>-	BUG_ON(atomic_read(&amp;kioctx-&gt;users) &lt;= 0);</div><div class='del'>-	if (unlikely(atomic_dec_and_test(&amp;kioctx-&gt;users)))</div><div class='del'>-		__put_ioctx(kioctx);</div><div class='add'>+	if (unlikely(atomic_dec_and_test(&amp;ctx-&gt;users)))</div><div class='add'>+		free_ioctx(ctx);</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> /* ioctx_alloc</div><div class='hunk'>@@ -237,7 +348,7 @@ static inline void put_ioctx(struct kioctx *kioctx)</div><div class='ctx'>  */</div><div class='ctx'> static struct kioctx *ioctx_alloc(unsigned nr_events)</div><div class='ctx'> {</div><div class='del'>-	struct mm_struct *mm;</div><div class='add'>+	struct mm_struct *mm = current-&gt;mm;</div><div class='ctx'> 	struct kioctx *ctx;</div><div class='ctx'> 	int err = -ENOMEM;</div><div class='ctx'> </div><div class='hunk'>@@ -256,17 +367,15 @@ static struct kioctx *ioctx_alloc(unsigned nr_events)</div><div class='ctx'> 		return ERR_PTR(-ENOMEM);</div><div class='ctx'> </div><div class='ctx'> 	ctx-&gt;max_reqs = nr_events;</div><div class='del'>-	mm = ctx-&gt;mm = current-&gt;mm;</div><div class='del'>-	atomic_inc(&amp;mm-&gt;mm_count);</div><div class='ctx'> </div><div class='ctx'> 	atomic_set(&amp;ctx-&gt;users, 2);</div><div class='add'>+	atomic_set(&amp;ctx-&gt;dead, 0);</div><div class='ctx'> 	spin_lock_init(&amp;ctx-&gt;ctx_lock);</div><div class='del'>-	spin_lock_init(&amp;ctx-&gt;ring_info.ring_lock);</div><div class='add'>+	spin_lock_init(&amp;ctx-&gt;completion_lock);</div><div class='add'>+	mutex_init(&amp;ctx-&gt;ring_lock);</div><div class='ctx'> 	init_waitqueue_head(&amp;ctx-&gt;wait);</div><div class='ctx'> </div><div class='ctx'> 	INIT_LIST_HEAD(&amp;ctx-&gt;active_reqs);</div><div class='del'>-	INIT_LIST_HEAD(&amp;ctx-&gt;run_list);</div><div class='del'>-	INIT_DELAYED_WORK(&amp;ctx-&gt;wq, aio_kick_handler);</div><div class='ctx'> </div><div class='ctx'> 	if (aio_setup_ring(ctx) &lt; 0)</div><div class='ctx'> 		goto out_freectx;</div><div class='hunk'>@@ -286,64 +395,56 @@ static struct kioctx *ioctx_alloc(unsigned nr_events)</div><div class='ctx'> 	hlist_add_head_rcu(&amp;ctx-&gt;list, &amp;mm-&gt;ioctx_list);</div><div class='ctx'> 	spin_unlock(&amp;mm-&gt;ioctx_lock);</div><div class='ctx'> </div><div class='del'>-	dprintk("aio: allocated ioctx %p[%ld]: mm=%p mask=0x%x\n",</div><div class='del'>-		ctx, ctx-&gt;user_id, current-&gt;mm, ctx-&gt;ring_info.nr);</div><div class='add'>+	pr_debug("allocated ioctx %p[%ld]: mm=%p mask=0x%x\n",</div><div class='add'>+		 ctx, ctx-&gt;user_id, mm, ctx-&gt;nr_events);</div><div class='ctx'> 	return ctx;</div><div class='ctx'> </div><div class='ctx'> out_cleanup:</div><div class='ctx'> 	err = -EAGAIN;</div><div class='ctx'> 	aio_free_ring(ctx);</div><div class='ctx'> out_freectx:</div><div class='del'>-	mmdrop(mm);</div><div class='ctx'> 	kmem_cache_free(kioctx_cachep, ctx);</div><div class='del'>-	dprintk("aio: error allocating ioctx %d\n", err);</div><div class='add'>+	pr_debug("error allocating ioctx %d\n", err);</div><div class='ctx'> 	return ERR_PTR(err);</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-/* kill_ctx</div><div class='del'>- *	Cancels all outstanding aio requests on an aio context.  Used </div><div class='del'>- *	when the processes owning a context have all exited to encourage </div><div class='del'>- *	the rapid destruction of the kioctx.</div><div class='del'>- */</div><div class='del'>-static void kill_ctx(struct kioctx *ctx)</div><div class='add'>+static void kill_ioctx_work(struct work_struct *work)</div><div class='ctx'> {</div><div class='del'>-	int (*cancel)(struct kiocb *, struct io_event *);</div><div class='del'>-	struct task_struct *tsk = current;</div><div class='del'>-	DECLARE_WAITQUEUE(wait, tsk);</div><div class='del'>-	struct io_event res;</div><div class='add'>+	struct kioctx *ctx = container_of(work, struct kioctx, rcu_work);</div><div class='ctx'> </div><div class='del'>-	spin_lock_irq(&amp;ctx-&gt;ctx_lock);</div><div class='del'>-	ctx-&gt;dead = 1;</div><div class='del'>-	while (!list_empty(&amp;ctx-&gt;active_reqs)) {</div><div class='del'>-		struct list_head *pos = ctx-&gt;active_reqs.next;</div><div class='del'>-		struct kiocb *iocb = list_kiocb(pos);</div><div class='del'>-		list_del_init(&amp;iocb-&gt;ki_list);</div><div class='del'>-		cancel = iocb-&gt;ki_cancel;</div><div class='del'>-		kiocbSetCancelled(iocb);</div><div class='del'>-		if (cancel) {</div><div class='del'>-			iocb-&gt;ki_users++;</div><div class='del'>-			spin_unlock_irq(&amp;ctx-&gt;ctx_lock);</div><div class='del'>-			cancel(iocb, &amp;res);</div><div class='del'>-			spin_lock_irq(&amp;ctx-&gt;ctx_lock);</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='add'>+	wake_up_all(&amp;ctx-&gt;wait);</div><div class='add'>+	put_ioctx(ctx);</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	if (!ctx-&gt;reqs_active)</div><div class='del'>-		goto out;</div><div class='add'>+static void kill_ioctx_rcu(struct rcu_head *head)</div><div class='add'>+{</div><div class='add'>+	struct kioctx *ctx = container_of(head, struct kioctx, rcu_head);</div><div class='ctx'> </div><div class='del'>-	add_wait_queue(&amp;ctx-&gt;wait, &amp;wait);</div><div class='del'>-	set_task_state(tsk, TASK_UNINTERRUPTIBLE);</div><div class='del'>-	while (ctx-&gt;reqs_active) {</div><div class='del'>-		spin_unlock_irq(&amp;ctx-&gt;ctx_lock);</div><div class='del'>-		io_schedule();</div><div class='del'>-		set_task_state(tsk, TASK_UNINTERRUPTIBLE);</div><div class='del'>-		spin_lock_irq(&amp;ctx-&gt;ctx_lock);</div><div class='del'>-	}</div><div class='del'>-	__set_task_state(tsk, TASK_RUNNING);</div><div class='del'>-	remove_wait_queue(&amp;ctx-&gt;wait, &amp;wait);</div><div class='add'>+	INIT_WORK(&amp;ctx-&gt;rcu_work, kill_ioctx_work);</div><div class='add'>+	schedule_work(&amp;ctx-&gt;rcu_work);</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-out:</div><div class='del'>-	spin_unlock_irq(&amp;ctx-&gt;ctx_lock);</div><div class='add'>+/* kill_ioctx</div><div class='add'>+ *	Cancels all outstanding aio requests on an aio context.  Used</div><div class='add'>+ *	when the processes owning a context have all exited to encourage</div><div class='add'>+ *	the rapid destruction of the kioctx.</div><div class='add'>+ */</div><div class='add'>+static void kill_ioctx(struct kioctx *ctx)</div><div class='add'>+{</div><div class='add'>+	if (!atomic_xchg(&amp;ctx-&gt;dead, 1)) {</div><div class='add'>+		hlist_del_rcu(&amp;ctx-&gt;list);</div><div class='add'>+		/* Between hlist_del_rcu() and dropping the initial ref */</div><div class='add'>+		synchronize_rcu();</div><div class='add'>+</div><div class='add'>+		/*</div><div class='add'>+		 * We can't punt to workqueue here because put_ioctx() -&gt;</div><div class='add'>+		 * free_ioctx() will unmap the ringbuffer, and that has to be</div><div class='add'>+		 * done in the original process's context. kill_ioctx_rcu/work()</div><div class='add'>+		 * exist for exit_aio(), as in that path free_ioctx() won't do</div><div class='add'>+		 * the unmap.</div><div class='add'>+		 */</div><div class='add'>+		kill_ioctx_work(&amp;ctx-&gt;rcu_work);</div><div class='add'>+	}</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> /* wait_on_sync_kiocb:</div><div class='hunk'>@@ -351,9 +452,9 @@ out:</div><div class='ctx'>  */</div><div class='ctx'> ssize_t wait_on_sync_kiocb(struct kiocb *iocb)</div><div class='ctx'> {</div><div class='del'>-	while (iocb-&gt;ki_users) {</div><div class='add'>+	while (atomic_read(&amp;iocb-&gt;ki_users)) {</div><div class='ctx'> 		set_current_state(TASK_UNINTERRUPTIBLE);</div><div class='del'>-		if (!iocb-&gt;ki_users)</div><div class='add'>+		if (!atomic_read(&amp;iocb-&gt;ki_users))</div><div class='ctx'> 			break;</div><div class='ctx'> 		io_schedule();</div><div class='ctx'> 	}</div><div class='hunk'>@@ -362,28 +463,26 @@ ssize_t wait_on_sync_kiocb(struct kiocb *iocb)</div><div class='ctx'> }</div><div class='ctx'> EXPORT_SYMBOL(wait_on_sync_kiocb);</div><div class='ctx'> </div><div class='del'>-/* exit_aio: called when the last user of mm goes away.  At this point, </div><div class='del'>- * there is no way for any new requests to be submited or any of the </div><div class='del'>- * io_* syscalls to be called on the context.  However, there may be </div><div class='del'>- * outstanding requests which hold references to the context; as they </div><div class='del'>- * go away, they will call put_ioctx and release any pinned memory</div><div class='del'>- * associated with the request (held via struct page * references).</div><div class='add'>+/*</div><div class='add'>+ * exit_aio: called when the last user of mm goes away.  At this point, there is</div><div class='add'>+ * no way for any new requests to be submited or any of the io_* syscalls to be</div><div class='add'>+ * called on the context.</div><div class='add'>+ *</div><div class='add'>+ * There may be outstanding kiocbs, but free_ioctx() will explicitly wait on</div><div class='add'>+ * them.</div><div class='ctx'>  */</div><div class='ctx'> void exit_aio(struct mm_struct *mm)</div><div class='ctx'> {</div><div class='ctx'> 	struct kioctx *ctx;</div><div class='add'>+	struct hlist_node *n;</div><div class='ctx'> </div><div class='del'>-	while (!hlist_empty(&amp;mm-&gt;ioctx_list)) {</div><div class='del'>-		ctx = hlist_entry(mm-&gt;ioctx_list.first, struct kioctx, list);</div><div class='del'>-		hlist_del_rcu(&amp;ctx-&gt;list);</div><div class='del'>-</div><div class='del'>-		kill_ctx(ctx);</div><div class='del'>-</div><div class='add'>+	hlist_for_each_entry_safe(ctx, n, &amp;mm-&gt;ioctx_list, list) {</div><div class='ctx'> 		if (1 != atomic_read(&amp;ctx-&gt;users))</div><div class='ctx'> 			printk(KERN_DEBUG</div><div class='ctx'> 				"exit_aio:ioctx still alive: %d %d %d\n",</div><div class='del'>-				atomic_read(&amp;ctx-&gt;users), ctx-&gt;dead,</div><div class='del'>-				ctx-&gt;reqs_active);</div><div class='add'>+				atomic_read(&amp;ctx-&gt;users),</div><div class='add'>+				atomic_read(&amp;ctx-&gt;dead),</div><div class='add'>+				atomic_read(&amp;ctx-&gt;reqs_active));</div><div class='ctx'> 		/*</div><div class='ctx'> 		 * We don't need to bother with munmap() here -</div><div class='ctx'> 		 * exit_mmap(mm) is coming and it'll unmap everything.</div><div class='hunk'>@@ -391,150 +490,53 @@ void exit_aio(struct mm_struct *mm)</div><div class='ctx'> 		 * as indicator that it needs to unmap the area,</div><div class='ctx'> 		 * just set it to 0; aio_free_ring() is the only</div><div class='ctx'> 		 * place that uses -&gt;mmap_size, so it's safe.</div><div class='del'>-		 * That way we get all munmap done to current-&gt;mm -</div><div class='del'>-		 * all other callers have ctx-&gt;mm == current-&gt;mm.</div><div class='ctx'> 		 */</div><div class='del'>-		ctx-&gt;ring_info.mmap_size = 0;</div><div class='del'>-		put_ioctx(ctx);</div><div class='add'>+		ctx-&gt;mmap_size = 0;</div><div class='add'>+</div><div class='add'>+		if (!atomic_xchg(&amp;ctx-&gt;dead, 1)) {</div><div class='add'>+			hlist_del_rcu(&amp;ctx-&gt;list);</div><div class='add'>+			call_rcu(&amp;ctx-&gt;rcu_head, kill_ioctx_rcu);</div><div class='add'>+		}</div><div class='ctx'> 	}</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> /* aio_get_req</div><div class='del'>- *	Allocate a slot for an aio request.  Increments the users count</div><div class='add'>+ *	Allocate a slot for an aio request.  Increments the ki_users count</div><div class='ctx'>  * of the kioctx so that the kioctx stays around until all requests are</div><div class='ctx'>  * complete.  Returns NULL if no requests are free.</div><div class='ctx'>  *</div><div class='del'>- * Returns with kiocb-&gt;users set to 2.  The io submit code path holds</div><div class='add'>+ * Returns with kiocb-&gt;ki_users set to 2.  The io submit code path holds</div><div class='ctx'>  * an extra reference while submitting the i/o.</div><div class='ctx'>  * This prevents races between the aio code path referencing the</div><div class='ctx'>  * req (after submitting it) and aio_complete() freeing the req.</div><div class='ctx'>  */</div><div class='del'>-static struct kiocb *__aio_get_req(struct kioctx *ctx)</div><div class='add'>+static inline struct kiocb *aio_get_req(struct kioctx *ctx)</div><div class='ctx'> {</div><div class='del'>-	struct kiocb *req = NULL;</div><div class='add'>+	struct kiocb *req;</div><div class='ctx'> </div><div class='del'>-	req = kmem_cache_alloc(kiocb_cachep, GFP_KERNEL);</div><div class='del'>-	if (unlikely(!req))</div><div class='add'>+	if (atomic_read(&amp;ctx-&gt;reqs_active) &gt;= ctx-&gt;nr_events)</div><div class='ctx'> 		return NULL;</div><div class='ctx'> </div><div class='del'>-	req-&gt;ki_flags = 0;</div><div class='del'>-	req-&gt;ki_users = 2;</div><div class='del'>-	req-&gt;ki_key = 0;</div><div class='del'>-	req-&gt;ki_ctx = ctx;</div><div class='del'>-	req-&gt;ki_cancel = NULL;</div><div class='del'>-	req-&gt;ki_retry = NULL;</div><div class='del'>-	req-&gt;ki_dtor = NULL;</div><div class='del'>-	req-&gt;private = NULL;</div><div class='del'>-	req-&gt;ki_iovec = NULL;</div><div class='del'>-	INIT_LIST_HEAD(&amp;req-&gt;ki_run_list);</div><div class='del'>-	req-&gt;ki_eventfd = NULL;</div><div class='del'>-</div><div class='del'>-	return req;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/*</div><div class='del'>- * struct kiocb's are allocated in batches to reduce the number of</div><div class='del'>- * times the ctx lock is acquired and released.</div><div class='del'>- */</div><div class='del'>-#define KIOCB_BATCH_SIZE	32L</div><div class='del'>-struct kiocb_batch {</div><div class='del'>-	struct list_head head;</div><div class='del'>-	long count; /* number of requests left to allocate */</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-static void kiocb_batch_init(struct kiocb_batch *batch, long total)</div><div class='del'>-{</div><div class='del'>-	INIT_LIST_HEAD(&amp;batch-&gt;head);</div><div class='del'>-	batch-&gt;count = total;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static void kiocb_batch_free(struct kioctx *ctx, struct kiocb_batch *batch)</div><div class='del'>-{</div><div class='del'>-	struct kiocb *req, *n;</div><div class='del'>-</div><div class='del'>-	if (list_empty(&amp;batch-&gt;head))</div><div class='del'>-		return;</div><div class='del'>-</div><div class='del'>-	spin_lock_irq(&amp;ctx-&gt;ctx_lock);</div><div class='del'>-	list_for_each_entry_safe(req, n, &amp;batch-&gt;head, ki_batch) {</div><div class='del'>-		list_del(&amp;req-&gt;ki_batch);</div><div class='del'>-		list_del(&amp;req-&gt;ki_list);</div><div class='del'>-		kmem_cache_free(kiocb_cachep, req);</div><div class='del'>-		ctx-&gt;reqs_active--;</div><div class='del'>-	}</div><div class='del'>-	if (unlikely(!ctx-&gt;reqs_active &amp;&amp; ctx-&gt;dead))</div><div class='del'>-		wake_up_all(&amp;ctx-&gt;wait);</div><div class='del'>-	spin_unlock_irq(&amp;ctx-&gt;ctx_lock);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/*</div><div class='del'>- * Allocate a batch of kiocbs.  This avoids taking and dropping the</div><div class='del'>- * context lock a lot during setup.</div><div class='del'>- */</div><div class='del'>-static int kiocb_batch_refill(struct kioctx *ctx, struct kiocb_batch *batch)</div><div class='del'>-{</div><div class='del'>-	unsigned short allocated, to_alloc;</div><div class='del'>-	long avail;</div><div class='del'>-	struct kiocb *req, *n;</div><div class='del'>-	struct aio_ring *ring;</div><div class='del'>-</div><div class='del'>-	to_alloc = min(batch-&gt;count, KIOCB_BATCH_SIZE);</div><div class='del'>-	for (allocated = 0; allocated &lt; to_alloc; allocated++) {</div><div class='del'>-		req = __aio_get_req(ctx);</div><div class='del'>-		if (!req)</div><div class='del'>-			/* allocation failed, go with what we've got */</div><div class='del'>-			break;</div><div class='del'>-		list_add(&amp;req-&gt;ki_batch, &amp;batch-&gt;head);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	if (allocated == 0)</div><div class='del'>-		goto out;</div><div class='del'>-</div><div class='del'>-	spin_lock_irq(&amp;ctx-&gt;ctx_lock);</div><div class='del'>-	ring = kmap_atomic(ctx-&gt;ring_info.ring_pages[0]);</div><div class='del'>-</div><div class='del'>-	avail = aio_ring_avail(&amp;ctx-&gt;ring_info, ring) - ctx-&gt;reqs_active;</div><div class='del'>-	BUG_ON(avail &lt; 0);</div><div class='del'>-	if (avail &lt; allocated) {</div><div class='del'>-		/* Trim back the number of requests. */</div><div class='del'>-		list_for_each_entry_safe(req, n, &amp;batch-&gt;head, ki_batch) {</div><div class='del'>-			list_del(&amp;req-&gt;ki_batch);</div><div class='del'>-			kmem_cache_free(kiocb_cachep, req);</div><div class='del'>-			if (--allocated &lt;= avail)</div><div class='del'>-				break;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	batch-&gt;count -= allocated;</div><div class='del'>-	list_for_each_entry(req, &amp;batch-&gt;head, ki_batch) {</div><div class='del'>-		list_add(&amp;req-&gt;ki_list, &amp;ctx-&gt;active_reqs);</div><div class='del'>-		ctx-&gt;reqs_active++;</div><div class='del'>-	}</div><div class='add'>+	if (atomic_inc_return(&amp;ctx-&gt;reqs_active) &gt; ctx-&gt;nr_events - 1)</div><div class='add'>+		goto out_put;</div><div class='ctx'> </div><div class='del'>-	kunmap_atomic(ring);</div><div class='del'>-	spin_unlock_irq(&amp;ctx-&gt;ctx_lock);</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-	return allocated;</div><div class='del'>-}</div><div class='add'>+	req = kmem_cache_alloc(kiocb_cachep, GFP_KERNEL|__GFP_ZERO);</div><div class='add'>+	if (unlikely(!req))</div><div class='add'>+		goto out_put;</div><div class='ctx'> </div><div class='del'>-static inline struct kiocb *aio_get_req(struct kioctx *ctx,</div><div class='del'>-					struct kiocb_batch *batch)</div><div class='del'>-{</div><div class='del'>-	struct kiocb *req;</div><div class='add'>+	atomic_set(&amp;req-&gt;ki_users, 2);</div><div class='add'>+	req-&gt;ki_ctx = ctx;</div><div class='ctx'> </div><div class='del'>-	if (list_empty(&amp;batch-&gt;head))</div><div class='del'>-		if (kiocb_batch_refill(ctx, batch) == 0)</div><div class='del'>-			return NULL;</div><div class='del'>-	req = list_first_entry(&amp;batch-&gt;head, struct kiocb, ki_batch);</div><div class='del'>-	list_del(&amp;req-&gt;ki_batch);</div><div class='ctx'> 	return req;</div><div class='add'>+out_put:</div><div class='add'>+	atomic_dec(&amp;ctx-&gt;reqs_active);</div><div class='add'>+	return NULL;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-static inline void really_put_req(struct kioctx *ctx, struct kiocb *req)</div><div class='add'>+static void kiocb_free(struct kiocb *req)</div><div class='ctx'> {</div><div class='del'>-	assert_spin_locked(&amp;ctx-&gt;ctx_lock);</div><div class='del'>-</div><div class='add'>+	if (req-&gt;ki_filp)</div><div class='add'>+		fput(req-&gt;ki_filp);</div><div class='ctx'> 	if (req-&gt;ki_eventfd != NULL)</div><div class='ctx'> 		eventfd_ctx_put(req-&gt;ki_eventfd);</div><div class='ctx'> 	if (req-&gt;ki_dtor)</div><div class='hunk'>@@ -542,48 +544,12 @@ static inline void really_put_req(struct kioctx *ctx, struct kiocb *req)</div><div class='ctx'> 	if (req-&gt;ki_iovec != &amp;req-&gt;ki_inline_vec)</div><div class='ctx'> 		kfree(req-&gt;ki_iovec);</div><div class='ctx'> 	kmem_cache_free(kiocb_cachep, req);</div><div class='del'>-	ctx-&gt;reqs_active--;</div><div class='del'>-</div><div class='del'>-	if (unlikely(!ctx-&gt;reqs_active &amp;&amp; ctx-&gt;dead))</div><div class='del'>-		wake_up_all(&amp;ctx-&gt;wait);</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-/* __aio_put_req</div><div class='del'>- *	Returns true if this put was the last user of the request.</div><div class='del'>- */</div><div class='del'>-static int __aio_put_req(struct kioctx *ctx, struct kiocb *req)</div><div class='add'>+void aio_put_req(struct kiocb *req)</div><div class='ctx'> {</div><div class='del'>-	dprintk(KERN_DEBUG "aio_put(%p): f_count=%ld\n",</div><div class='del'>-		req, atomic_long_read(&amp;req-&gt;ki_filp-&gt;f_count));</div><div class='del'>-</div><div class='del'>-	assert_spin_locked(&amp;ctx-&gt;ctx_lock);</div><div class='del'>-</div><div class='del'>-	req-&gt;ki_users--;</div><div class='del'>-	BUG_ON(req-&gt;ki_users &lt; 0);</div><div class='del'>-	if (likely(req-&gt;ki_users))</div><div class='del'>-		return 0;</div><div class='del'>-	list_del(&amp;req-&gt;ki_list);		/* remove from active_reqs */</div><div class='del'>-	req-&gt;ki_cancel = NULL;</div><div class='del'>-	req-&gt;ki_retry = NULL;</div><div class='del'>-</div><div class='del'>-	fput(req-&gt;ki_filp);</div><div class='del'>-	req-&gt;ki_filp = NULL;</div><div class='del'>-	really_put_req(ctx, req);</div><div class='del'>-	return 1;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/* aio_put_req</div><div class='del'>- *	Returns true if this put was the last user of the kiocb,</div><div class='del'>- *	false if the request is still in use.</div><div class='del'>- */</div><div class='del'>-int aio_put_req(struct kiocb *req)</div><div class='del'>-{</div><div class='del'>-	struct kioctx *ctx = req-&gt;ki_ctx;</div><div class='del'>-	int ret;</div><div class='del'>-	spin_lock_irq(&amp;ctx-&gt;ctx_lock);</div><div class='del'>-	ret = __aio_put_req(ctx, req);</div><div class='del'>-	spin_unlock_irq(&amp;ctx-&gt;ctx_lock);</div><div class='del'>-	return ret;</div><div class='add'>+	if (atomic_dec_and_test(&amp;req-&gt;ki_users))</div><div class='add'>+		kiocb_free(req);</div><div class='ctx'> }</div><div class='ctx'> EXPORT_SYMBOL(aio_put_req);</div><div class='ctx'> </div><div class='hunk'>@@ -595,13 +561,8 @@ static struct kioctx *lookup_ioctx(unsigned long ctx_id)</div><div class='ctx'> 	rcu_read_lock();</div><div class='ctx'> </div><div class='ctx'> 	hlist_for_each_entry_rcu(ctx, &amp;mm-&gt;ioctx_list, list) {</div><div class='del'>-		/*</div><div class='del'>-		 * RCU protects us against accessing freed memory but</div><div class='del'>-		 * we have to be careful not to get a reference when the</div><div class='del'>-		 * reference count already dropped to 0 (ctx-&gt;dead test</div><div class='del'>-		 * is unreliable because of races).</div><div class='del'>-		 */</div><div class='del'>-		if (ctx-&gt;user_id == ctx_id &amp;&amp; !ctx-&gt;dead &amp;&amp; try_get_ioctx(ctx)){</div><div class='add'>+		if (ctx-&gt;user_id == ctx_id) {</div><div class='add'>+			atomic_inc(&amp;ctx-&gt;users);</div><div class='ctx'> 			ret = ctx;</div><div class='ctx'> 			break;</div><div class='ctx'> 		}</div><div class='hunk'>@@ -611,295 +572,16 @@ static struct kioctx *lookup_ioctx(unsigned long ctx_id)</div><div class='ctx'> 	return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-/*</div><div class='del'>- * Queue up a kiocb to be retried. Assumes that the kiocb</div><div class='del'>- * has already been marked as kicked, and places it on</div><div class='del'>- * the retry run list for the corresponding ioctx, if it</div><div class='del'>- * isn't already queued. Returns 1 if it actually queued</div><div class='del'>- * the kiocb (to tell the caller to activate the work</div><div class='del'>- * queue to process it), or 0, if it found that it was</div><div class='del'>- * already queued.</div><div class='del'>- */</div><div class='del'>-static inline int __queue_kicked_iocb(struct kiocb *iocb)</div><div class='del'>-{</div><div class='del'>-	struct kioctx *ctx = iocb-&gt;ki_ctx;</div><div class='del'>-</div><div class='del'>-	assert_spin_locked(&amp;ctx-&gt;ctx_lock);</div><div class='del'>-</div><div class='del'>-	if (list_empty(&amp;iocb-&gt;ki_run_list)) {</div><div class='del'>-		list_add_tail(&amp;iocb-&gt;ki_run_list,</div><div class='del'>-			&amp;ctx-&gt;run_list);</div><div class='del'>-		return 1;</div><div class='del'>-	}</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/* aio_run_iocb</div><div class='del'>- *	This is the core aio execution routine. It is</div><div class='del'>- *	invoked both for initial i/o submission and</div><div class='del'>- *	subsequent retries via the aio_kick_handler.</div><div class='del'>- *	Expects to be invoked with iocb-&gt;ki_ctx-&gt;lock</div><div class='del'>- *	already held. The lock is released and reacquired</div><div class='del'>- *	as needed during processing.</div><div class='del'>- *</div><div class='del'>- * Calls the iocb retry method (already setup for the</div><div class='del'>- * iocb on initial submission) for operation specific</div><div class='del'>- * handling, but takes care of most of common retry</div><div class='del'>- * execution details for a given iocb. The retry method</div><div class='del'>- * needs to be non-blocking as far as possible, to avoid</div><div class='del'>- * holding up other iocbs waiting to be serviced by the</div><div class='del'>- * retry kernel thread.</div><div class='del'>- *</div><div class='del'>- * The trickier parts in this code have to do with</div><div class='del'>- * ensuring that only one retry instance is in progress</div><div class='del'>- * for a given iocb at any time. Providing that guarantee</div><div class='del'>- * simplifies the coding of individual aio operations as</div><div class='del'>- * it avoids various potential races.</div><div class='del'>- */</div><div class='del'>-static ssize_t aio_run_iocb(struct kiocb *iocb)</div><div class='del'>-{</div><div class='del'>-	struct kioctx	*ctx = iocb-&gt;ki_ctx;</div><div class='del'>-	ssize_t (*retry)(struct kiocb *);</div><div class='del'>-	ssize_t ret;</div><div class='del'>-</div><div class='del'>-	if (!(retry = iocb-&gt;ki_retry)) {</div><div class='del'>-		printk("aio_run_iocb: iocb-&gt;ki_retry = NULL\n");</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	/*</div><div class='del'>-	 * We don't want the next retry iteration for this</div><div class='del'>-	 * operation to start until this one has returned and</div><div class='del'>-	 * updated the iocb state. However, wait_queue functions</div><div class='del'>-	 * can trigger a kick_iocb from interrupt context in the</div><div class='del'>-	 * meantime, indicating that data is available for the next</div><div class='del'>-	 * iteration. We want to remember that and enable the</div><div class='del'>-	 * next retry iteration _after_ we are through with</div><div class='del'>-	 * this one.</div><div class='del'>-	 *</div><div class='del'>-	 * So, in order to be able to register a "kick", but</div><div class='del'>-	 * prevent it from being queued now, we clear the kick</div><div class='del'>-	 * flag, but make the kick code *think* that the iocb is</div><div class='del'>-	 * still on the run list until we are actually done.</div><div class='del'>-	 * When we are done with this iteration, we check if</div><div class='del'>-	 * the iocb was kicked in the meantime and if so, queue</div><div class='del'>-	 * it up afresh.</div><div class='del'>-	 */</div><div class='del'>-</div><div class='del'>-	kiocbClearKicked(iocb);</div><div class='del'>-</div><div class='del'>-	/*</div><div class='del'>-	 * This is so that aio_complete knows it doesn't need to</div><div class='del'>-	 * pull the iocb off the run list (We can't just call</div><div class='del'>-	 * INIT_LIST_HEAD because we don't want a kick_iocb to</div><div class='del'>-	 * queue this on the run list yet)</div><div class='del'>-	 */</div><div class='del'>-	iocb-&gt;ki_run_list.next = iocb-&gt;ki_run_list.prev = NULL;</div><div class='del'>-	spin_unlock_irq(&amp;ctx-&gt;ctx_lock);</div><div class='del'>-</div><div class='del'>-	/* Quit retrying if the i/o has been cancelled */</div><div class='del'>-	if (kiocbIsCancelled(iocb)) {</div><div class='del'>-		ret = -EINTR;</div><div class='del'>-		aio_complete(iocb, ret, 0);</div><div class='del'>-		/* must not access the iocb after this */</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	/*</div><div class='del'>-	 * Now we are all set to call the retry method in async</div><div class='del'>-	 * context.</div><div class='del'>-	 */</div><div class='del'>-	ret = retry(iocb);</div><div class='del'>-</div><div class='del'>-	if (ret != -EIOCBRETRY &amp;&amp; ret != -EIOCBQUEUED) {</div><div class='del'>-		/*</div><div class='del'>-		 * There's no easy way to restart the syscall since other AIO's</div><div class='del'>-		 * may be already running. Just fail this IO with EINTR.</div><div class='del'>-		 */</div><div class='del'>-		if (unlikely(ret == -ERESTARTSYS || ret == -ERESTARTNOINTR ||</div><div class='del'>-			     ret == -ERESTARTNOHAND || ret == -ERESTART_RESTARTBLOCK))</div><div class='del'>-			ret = -EINTR;</div><div class='del'>-		aio_complete(iocb, ret, 0);</div><div class='del'>-	}</div><div class='del'>-out:</div><div class='del'>-	spin_lock_irq(&amp;ctx-&gt;ctx_lock);</div><div class='del'>-</div><div class='del'>-	if (-EIOCBRETRY == ret) {</div><div class='del'>-		/*</div><div class='del'>-		 * OK, now that we are done with this iteration</div><div class='del'>-		 * and know that there is more left to go,</div><div class='del'>-		 * this is where we let go so that a subsequent</div><div class='del'>-		 * "kick" can start the next iteration</div><div class='del'>-		 */</div><div class='del'>-</div><div class='del'>-		/* will make __queue_kicked_iocb succeed from here on */</div><div class='del'>-		INIT_LIST_HEAD(&amp;iocb-&gt;ki_run_list);</div><div class='del'>-		/* we must queue the next iteration ourselves, if it</div><div class='del'>-		 * has already been kicked */</div><div class='del'>-		if (kiocbIsKicked(iocb)) {</div><div class='del'>-			__queue_kicked_iocb(iocb);</div><div class='del'>-</div><div class='del'>-			/*</div><div class='del'>-			 * __queue_kicked_iocb will always return 1 here, because</div><div class='del'>-			 * iocb-&gt;ki_run_list is empty at this point so it should</div><div class='del'>-			 * be safe to unconditionally queue the context into the</div><div class='del'>-			 * work queue.</div><div class='del'>-			 */</div><div class='del'>-			aio_queue_work(ctx);</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-	return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/*</div><div class='del'>- * __aio_run_iocbs:</div><div class='del'>- * 	Process all pending retries queued on the ioctx</div><div class='del'>- * 	run list.</div><div class='del'>- * Assumes it is operating within the aio issuer's mm</div><div class='del'>- * context.</div><div class='del'>- */</div><div class='del'>-static int __aio_run_iocbs(struct kioctx *ctx)</div><div class='del'>-{</div><div class='del'>-	struct kiocb *iocb;</div><div class='del'>-	struct list_head run_list;</div><div class='del'>-</div><div class='del'>-	assert_spin_locked(&amp;ctx-&gt;ctx_lock);</div><div class='del'>-</div><div class='del'>-	list_replace_init(&amp;ctx-&gt;run_list, &amp;run_list);</div><div class='del'>-	while (!list_empty(&amp;run_list)) {</div><div class='del'>-		iocb = list_entry(run_list.next, struct kiocb,</div><div class='del'>-			ki_run_list);</div><div class='del'>-		list_del(&amp;iocb-&gt;ki_run_list);</div><div class='del'>-		/*</div><div class='del'>-		 * Hold an extra reference while retrying i/o.</div><div class='del'>-		 */</div><div class='del'>-		iocb-&gt;ki_users++;       /* grab extra reference */</div><div class='del'>-		aio_run_iocb(iocb);</div><div class='del'>-		__aio_put_req(ctx, iocb);</div><div class='del'>- 	}</div><div class='del'>-	if (!list_empty(&amp;ctx-&gt;run_list))</div><div class='del'>-		return 1;</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static void aio_queue_work(struct kioctx * ctx)</div><div class='del'>-{</div><div class='del'>-	unsigned long timeout;</div><div class='del'>-	/*</div><div class='del'>-	 * if someone is waiting, get the work started right</div><div class='del'>-	 * away, otherwise, use a longer delay</div><div class='del'>-	 */</div><div class='del'>-	smp_mb();</div><div class='del'>-	if (waitqueue_active(&amp;ctx-&gt;wait))</div><div class='del'>-		timeout = 1;</div><div class='del'>-	else</div><div class='del'>-		timeout = HZ/10;</div><div class='del'>-	queue_delayed_work(aio_wq, &amp;ctx-&gt;wq, timeout);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/*</div><div class='del'>- * aio_run_all_iocbs:</div><div class='del'>- *	Process all pending retries queued on the ioctx</div><div class='del'>- *	run list, and keep running them until the list</div><div class='del'>- *	stays empty.</div><div class='del'>- * Assumes it is operating within the aio issuer's mm context.</div><div class='del'>- */</div><div class='del'>-static inline void aio_run_all_iocbs(struct kioctx *ctx)</div><div class='del'>-{</div><div class='del'>-	spin_lock_irq(&amp;ctx-&gt;ctx_lock);</div><div class='del'>-	while (__aio_run_iocbs(ctx))</div><div class='del'>-		;</div><div class='del'>-	spin_unlock_irq(&amp;ctx-&gt;ctx_lock);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/*</div><div class='del'>- * aio_kick_handler:</div><div class='del'>- * 	Work queue handler triggered to process pending</div><div class='del'>- * 	retries on an ioctx. Takes on the aio issuer's</div><div class='del'>- *	mm context before running the iocbs, so that</div><div class='del'>- *	copy_xxx_user operates on the issuer's address</div><div class='del'>- *      space.</div><div class='del'>- * Run on aiod's context.</div><div class='del'>- */</div><div class='del'>-static void aio_kick_handler(struct work_struct *work)</div><div class='del'>-{</div><div class='del'>-	struct kioctx *ctx = container_of(work, struct kioctx, wq.work);</div><div class='del'>-	mm_segment_t oldfs = get_fs();</div><div class='del'>-	struct mm_struct *mm;</div><div class='del'>-	int requeue;</div><div class='del'>-</div><div class='del'>-	set_fs(USER_DS);</div><div class='del'>-	use_mm(ctx-&gt;mm);</div><div class='del'>-	spin_lock_irq(&amp;ctx-&gt;ctx_lock);</div><div class='del'>-	requeue =__aio_run_iocbs(ctx);</div><div class='del'>-	mm = ctx-&gt;mm;</div><div class='del'>-	spin_unlock_irq(&amp;ctx-&gt;ctx_lock);</div><div class='del'>- 	unuse_mm(mm);</div><div class='del'>-	set_fs(oldfs);</div><div class='del'>-	/*</div><div class='del'>-	 * we're in a worker thread already; no point using non-zero delay</div><div class='del'>-	 */</div><div class='del'>-	if (requeue)</div><div class='del'>-		queue_delayed_work(aio_wq, &amp;ctx-&gt;wq, 0);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/*</div><div class='del'>- * Called by kick_iocb to queue the kiocb for retry</div><div class='del'>- * and if required activate the aio work queue to process</div><div class='del'>- * it</div><div class='del'>- */</div><div class='del'>-static void try_queue_kicked_iocb(struct kiocb *iocb)</div><div class='del'>-{</div><div class='del'>- 	struct kioctx	*ctx = iocb-&gt;ki_ctx;</div><div class='del'>-	unsigned long flags;</div><div class='del'>-	int run = 0;</div><div class='del'>-</div><div class='del'>-	spin_lock_irqsave(&amp;ctx-&gt;ctx_lock, flags);</div><div class='del'>-	/* set this inside the lock so that we can't race with aio_run_iocb()</div><div class='del'>-	 * testing it and putting the iocb on the run list under the lock */</div><div class='del'>-	if (!kiocbTryKick(iocb))</div><div class='del'>-		run = __queue_kicked_iocb(iocb);</div><div class='del'>-	spin_unlock_irqrestore(&amp;ctx-&gt;ctx_lock, flags);</div><div class='del'>-	if (run)</div><div class='del'>-		aio_queue_work(ctx);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/*</div><div class='del'>- * kick_iocb:</div><div class='del'>- *      Called typically from a wait queue callback context</div><div class='del'>- *      to trigger a retry of the iocb.</div><div class='del'>- *      The retry is usually executed by aio workqueue</div><div class='del'>- *      threads (See aio_kick_handler).</div><div class='del'>- */</div><div class='del'>-void kick_iocb(struct kiocb *iocb)</div><div class='del'>-{</div><div class='del'>-	/* sync iocbs are easy: they can only ever be executing from a </div><div class='del'>-	 * single context. */</div><div class='del'>-	if (is_sync_kiocb(iocb)) {</div><div class='del'>-		kiocbSetKicked(iocb);</div><div class='del'>-	        wake_up_process(iocb-&gt;ki_obj.tsk);</div><div class='del'>-		return;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	try_queue_kicked_iocb(iocb);</div><div class='del'>-}</div><div class='del'>-EXPORT_SYMBOL(kick_iocb);</div><div class='del'>-</div><div class='ctx'> /* aio_complete</div><div class='ctx'>  *	Called when the io request on the given iocb is complete.</div><div class='del'>- *	Returns true if this is the last user of the request.  The </div><div class='del'>- *	only other user of the request can be the cancellation code.</div><div class='ctx'>  */</div><div class='del'>-int aio_complete(struct kiocb *iocb, long res, long res2)</div><div class='add'>+void aio_complete(struct kiocb *iocb, long res, long res2)</div><div class='ctx'> {</div><div class='ctx'> 	struct kioctx	*ctx = iocb-&gt;ki_ctx;</div><div class='del'>-	struct aio_ring_info	*info;</div><div class='ctx'> 	struct aio_ring	*ring;</div><div class='del'>-	struct io_event	*event;</div><div class='add'>+	struct io_event	*ev_page, *event;</div><div class='ctx'> 	unsigned long	flags;</div><div class='del'>-	unsigned long	tail;</div><div class='del'>-	int		ret;</div><div class='add'>+	unsigned tail, pos;</div><div class='ctx'> </div><div class='ctx'> 	/*</div><div class='ctx'> 	 * Special case handling for sync iocbs:</div><div class='hunk'>@@ -909,61 +591,81 @@ int aio_complete(struct kiocb *iocb, long res, long res2)</div><div class='ctx'> 	 *  - the sync task helpfully left a reference to itself in the iocb</div><div class='ctx'> 	 */</div><div class='ctx'> 	if (is_sync_kiocb(iocb)) {</div><div class='del'>-		BUG_ON(iocb-&gt;ki_users != 1);</div><div class='add'>+		BUG_ON(atomic_read(&amp;iocb-&gt;ki_users) != 1);</div><div class='ctx'> 		iocb-&gt;ki_user_data = res;</div><div class='del'>-		iocb-&gt;ki_users = 0;</div><div class='add'>+		atomic_set(&amp;iocb-&gt;ki_users, 0);</div><div class='ctx'> 		wake_up_process(iocb-&gt;ki_obj.tsk);</div><div class='del'>-		return 1;</div><div class='add'>+		return;</div><div class='ctx'> 	}</div><div class='ctx'> </div><div class='del'>-	info = &amp;ctx-&gt;ring_info;</div><div class='del'>-</div><div class='del'>-	/* add a completion event to the ring buffer.</div><div class='del'>-	 * must be done holding ctx-&gt;ctx_lock to prevent</div><div class='del'>-	 * other code from messing with the tail</div><div class='del'>-	 * pointer since we might be called from irq</div><div class='del'>-	 * context.</div><div class='add'>+	/*</div><div class='add'>+	 * Take rcu_read_lock() in case the kioctx is being destroyed, as we</div><div class='add'>+	 * need to issue a wakeup after decrementing reqs_active.</div><div class='ctx'> 	 */</div><div class='del'>-	spin_lock_irqsave(&amp;ctx-&gt;ctx_lock, flags);</div><div class='add'>+	rcu_read_lock();</div><div class='ctx'> </div><div class='del'>-	if (iocb-&gt;ki_run_list.prev &amp;&amp; !list_empty(&amp;iocb-&gt;ki_run_list))</div><div class='del'>-		list_del_init(&amp;iocb-&gt;ki_run_list);</div><div class='add'>+	if (iocb-&gt;ki_list.next) {</div><div class='add'>+		unsigned long flags;</div><div class='add'>+</div><div class='add'>+		spin_lock_irqsave(&amp;ctx-&gt;ctx_lock, flags);</div><div class='add'>+		list_del(&amp;iocb-&gt;ki_list);</div><div class='add'>+		spin_unlock_irqrestore(&amp;ctx-&gt;ctx_lock, flags);</div><div class='add'>+	}</div><div class='ctx'> </div><div class='ctx'> 	/*</div><div class='ctx'> 	 * cancelled requests don't get events, userland was given one</div><div class='ctx'> 	 * when the event got cancelled.</div><div class='ctx'> 	 */</div><div class='del'>-	if (kiocbIsCancelled(iocb))</div><div class='add'>+	if (unlikely(xchg(&amp;iocb-&gt;ki_cancel,</div><div class='add'>+			  KIOCB_CANCELLED) == KIOCB_CANCELLED)) {</div><div class='add'>+		atomic_dec(&amp;ctx-&gt;reqs_active);</div><div class='add'>+		/* Still need the wake_up in case free_ioctx is waiting */</div><div class='ctx'> 		goto put_rq;</div><div class='add'>+	}</div><div class='ctx'> </div><div class='del'>-	ring = kmap_atomic(info-&gt;ring_pages[0]);</div><div class='add'>+	/*</div><div class='add'>+	 * Add a completion event to the ring buffer. Must be done holding</div><div class='add'>+	 * ctx-&gt;ctx_lock to prevent other code from messing with the tail</div><div class='add'>+	 * pointer since we might be called from irq context.</div><div class='add'>+	 */</div><div class='add'>+	spin_lock_irqsave(&amp;ctx-&gt;completion_lock, flags);</div><div class='ctx'> </div><div class='del'>-	tail = info-&gt;tail;</div><div class='del'>-	event = aio_ring_event(info, tail);</div><div class='del'>-	if (++tail &gt;= info-&gt;nr)</div><div class='add'>+	tail = ctx-&gt;tail;</div><div class='add'>+	pos = tail + AIO_EVENTS_OFFSET;</div><div class='add'>+</div><div class='add'>+	if (++tail &gt;= ctx-&gt;nr_events)</div><div class='ctx'> 		tail = 0;</div><div class='ctx'> </div><div class='add'>+	ev_page = kmap_atomic(ctx-&gt;ring_pages[pos / AIO_EVENTS_PER_PAGE]);</div><div class='add'>+	event = ev_page + pos % AIO_EVENTS_PER_PAGE;</div><div class='add'>+</div><div class='ctx'> 	event-&gt;obj = (u64)(unsigned long)iocb-&gt;ki_obj.user;</div><div class='ctx'> 	event-&gt;data = iocb-&gt;ki_user_data;</div><div class='ctx'> 	event-&gt;res = res;</div><div class='ctx'> 	event-&gt;res2 = res2;</div><div class='ctx'> </div><div class='del'>-	dprintk("aio_complete: %p[%lu]: %p: %p %Lx %lx %lx\n",</div><div class='del'>-		ctx, tail, iocb, iocb-&gt;ki_obj.user, iocb-&gt;ki_user_data,</div><div class='del'>-		res, res2);</div><div class='add'>+	kunmap_atomic(ev_page);</div><div class='add'>+	flush_dcache_page(ctx-&gt;ring_pages[pos / AIO_EVENTS_PER_PAGE]);</div><div class='add'>+</div><div class='add'>+	pr_debug("%p[%u]: %p: %p %Lx %lx %lx\n",</div><div class='add'>+		 ctx, tail, iocb, iocb-&gt;ki_obj.user, iocb-&gt;ki_user_data,</div><div class='add'>+		 res, res2);</div><div class='ctx'> </div><div class='ctx'> 	/* after flagging the request as done, we</div><div class='ctx'> 	 * must never even look at it again</div><div class='ctx'> 	 */</div><div class='ctx'> 	smp_wmb();	/* make event visible before updating tail */</div><div class='ctx'> </div><div class='del'>-	info-&gt;tail = tail;</div><div class='del'>-	ring-&gt;tail = tail;</div><div class='add'>+	ctx-&gt;tail = tail;</div><div class='ctx'> </div><div class='del'>-	put_aio_ring_event(event);</div><div class='add'>+	ring = kmap_atomic(ctx-&gt;ring_pages[0]);</div><div class='add'>+	ring-&gt;tail = tail;</div><div class='ctx'> 	kunmap_atomic(ring);</div><div class='add'>+	flush_dcache_page(ctx-&gt;ring_pages[0]);</div><div class='add'>+</div><div class='add'>+	spin_unlock_irqrestore(&amp;ctx-&gt;completion_lock, flags);</div><div class='ctx'> </div><div class='del'>-	pr_debug("added to ring %p at [%lu]\n", iocb, tail);</div><div class='add'>+	pr_debug("added to ring %p at [%u]\n", iocb, tail);</div><div class='ctx'> </div><div class='ctx'> 	/*</div><div class='ctx'> 	 * Check if the user asked us to deliver the result through an</div><div class='hunk'>@@ -975,7 +677,7 @@ int aio_complete(struct kiocb *iocb, long res, long res2)</div><div class='ctx'> </div><div class='ctx'> put_rq:</div><div class='ctx'> 	/* everything turned out well, dispose of the aiocb. */</div><div class='del'>-	ret = __aio_put_req(ctx, iocb);</div><div class='add'>+	aio_put_req(iocb);</div><div class='ctx'> </div><div class='ctx'> 	/*</div><div class='ctx'> 	 * We have to order our ring_info tail store above and test</div><div class='hunk'>@@ -988,233 +690,133 @@ put_rq:</div><div class='ctx'> 	if (waitqueue_active(&amp;ctx-&gt;wait))</div><div class='ctx'> 		wake_up(&amp;ctx-&gt;wait);</div><div class='ctx'> </div><div class='del'>-	spin_unlock_irqrestore(&amp;ctx-&gt;ctx_lock, flags);</div><div class='del'>-	return ret;</div><div class='add'>+	rcu_read_unlock();</div><div class='ctx'> }</div><div class='ctx'> EXPORT_SYMBOL(aio_complete);</div><div class='ctx'> </div><div class='del'>-/* aio_read_evt</div><div class='del'>- *	Pull an event off of the ioctx's event ring.  Returns the number of </div><div class='del'>- *	events fetched (0 or 1 ;-)</div><div class='del'>- *	FIXME: make this use cmpxchg.</div><div class='del'>- *	TODO: make the ringbuffer user mmap()able (requires FIXME).</div><div class='add'>+/* aio_read_events</div><div class='add'>+ *	Pull an event off of the ioctx's event ring.  Returns the number of</div><div class='add'>+ *	events fetched</div><div class='ctx'>  */</div><div class='del'>-static int aio_read_evt(struct kioctx *ioctx, struct io_event *ent)</div><div class='add'>+static long aio_read_events_ring(struct kioctx *ctx,</div><div class='add'>+				 struct io_event __user *event, long nr)</div><div class='ctx'> {</div><div class='del'>-	struct aio_ring_info *info = &amp;ioctx-&gt;ring_info;</div><div class='ctx'> 	struct aio_ring *ring;</div><div class='del'>-	unsigned long head;</div><div class='del'>-	int ret = 0;</div><div class='del'>-</div><div class='del'>-	ring = kmap_atomic(info-&gt;ring_pages[0]);</div><div class='del'>-	dprintk("in aio_read_evt h%lu t%lu m%lu\n",</div><div class='del'>-		 (unsigned long)ring-&gt;head, (unsigned long)ring-&gt;tail,</div><div class='del'>-		 (unsigned long)ring-&gt;nr);</div><div class='del'>-</div><div class='del'>-	if (ring-&gt;head == ring-&gt;tail)</div><div class='del'>-		goto out;</div><div class='add'>+	unsigned head, pos;</div><div class='add'>+	long ret = 0;</div><div class='add'>+	int copy_ret;</div><div class='ctx'> </div><div class='del'>-	spin_lock(&amp;info-&gt;ring_lock);</div><div class='del'>-</div><div class='del'>-	head = ring-&gt;head % info-&gt;nr;</div><div class='del'>-	if (head != ring-&gt;tail) {</div><div class='del'>-		struct io_event *evp = aio_ring_event(info, head);</div><div class='del'>-		*ent = *evp;</div><div class='del'>-		head = (head + 1) % info-&gt;nr;</div><div class='del'>-		smp_mb(); /* finish reading the event before updatng the head */</div><div class='del'>-		ring-&gt;head = head;</div><div class='del'>-		ret = 1;</div><div class='del'>-		put_aio_ring_event(evp);</div><div class='del'>-	}</div><div class='del'>-	spin_unlock(&amp;info-&gt;ring_lock);</div><div class='add'>+	mutex_lock(&amp;ctx-&gt;ring_lock);</div><div class='ctx'> </div><div class='del'>-out:</div><div class='del'>-	dprintk("leaving aio_read_evt: %d  h%lu t%lu\n", ret,</div><div class='del'>-		 (unsigned long)ring-&gt;head, (unsigned long)ring-&gt;tail);</div><div class='add'>+	ring = kmap_atomic(ctx-&gt;ring_pages[0]);</div><div class='add'>+	head = ring-&gt;head;</div><div class='ctx'> 	kunmap_atomic(ring);</div><div class='del'>-	return ret;</div><div class='del'>-}</div><div class='ctx'> </div><div class='del'>-struct aio_timeout {</div><div class='del'>-	struct timer_list	timer;</div><div class='del'>-	int			timed_out;</div><div class='del'>-	struct task_struct	*p;</div><div class='del'>-};</div><div class='add'>+	pr_debug("h%u t%u m%u\n", head, ctx-&gt;tail, ctx-&gt;nr_events);</div><div class='ctx'> </div><div class='del'>-static void timeout_func(unsigned long data)</div><div class='del'>-{</div><div class='del'>-	struct aio_timeout *to = (struct aio_timeout *)data;</div><div class='add'>+	if (head == ctx-&gt;tail)</div><div class='add'>+		goto out;</div><div class='ctx'> </div><div class='del'>-	to-&gt;timed_out = 1;</div><div class='del'>-	wake_up_process(to-&gt;p);</div><div class='del'>-}</div><div class='add'>+	while (ret &lt; nr) {</div><div class='add'>+		long avail;</div><div class='add'>+		struct io_event *ev;</div><div class='add'>+		struct page *page;</div><div class='ctx'> </div><div class='del'>-static inline void init_timeout(struct aio_timeout *to)</div><div class='del'>-{</div><div class='del'>-	setup_timer_on_stack(&amp;to-&gt;timer, timeout_func, (unsigned long) to);</div><div class='del'>-	to-&gt;timed_out = 0;</div><div class='del'>-	to-&gt;p = current;</div><div class='del'>-}</div><div class='add'>+		avail = (head &lt;= ctx-&gt;tail ? ctx-&gt;tail : ctx-&gt;nr_events) - head;</div><div class='add'>+		if (head == ctx-&gt;tail)</div><div class='add'>+			break;</div><div class='ctx'> </div><div class='del'>-static inline void set_timeout(long start_jiffies, struct aio_timeout *to,</div><div class='del'>-			       const struct timespec *ts)</div><div class='del'>-{</div><div class='del'>-	to-&gt;timer.expires = start_jiffies + timespec_to_jiffies(ts);</div><div class='del'>-	if (time_after(to-&gt;timer.expires, jiffies))</div><div class='del'>-		add_timer(&amp;to-&gt;timer);</div><div class='del'>-	else</div><div class='del'>-		to-&gt;timed_out = 1;</div><div class='del'>-}</div><div class='add'>+		avail = min(avail, nr - ret);</div><div class='add'>+		avail = min_t(long, avail, AIO_EVENTS_PER_PAGE -</div><div class='add'>+			    ((head + AIO_EVENTS_OFFSET) % AIO_EVENTS_PER_PAGE));</div><div class='ctx'> </div><div class='del'>-static inline void clear_timeout(struct aio_timeout *to)</div><div class='del'>-{</div><div class='del'>-	del_singleshot_timer_sync(&amp;to-&gt;timer);</div><div class='del'>-}</div><div class='add'>+		pos = head + AIO_EVENTS_OFFSET;</div><div class='add'>+		page = ctx-&gt;ring_pages[pos / AIO_EVENTS_PER_PAGE];</div><div class='add'>+		pos %= AIO_EVENTS_PER_PAGE;</div><div class='ctx'> </div><div class='del'>-static int read_events(struct kioctx *ctx,</div><div class='del'>-			long min_nr, long nr,</div><div class='del'>-			struct io_event __user *event,</div><div class='del'>-			struct timespec __user *timeout)</div><div class='del'>-{</div><div class='del'>-	long			start_jiffies = jiffies;</div><div class='del'>-	struct task_struct	*tsk = current;</div><div class='del'>-	DECLARE_WAITQUEUE(wait, tsk);</div><div class='del'>-	int			ret;</div><div class='del'>-	int			i = 0;</div><div class='del'>-	struct io_event		ent;</div><div class='del'>-	struct aio_timeout	to;</div><div class='del'>-	int			retry = 0;</div><div class='del'>-</div><div class='del'>-	/* needed to zero any padding within an entry (there shouldn't be </div><div class='del'>-	 * any, but C is fun!</div><div class='del'>-	 */</div><div class='del'>-	memset(&amp;ent, 0, sizeof(ent));</div><div class='del'>-retry:</div><div class='del'>-	ret = 0;</div><div class='del'>-	while (likely(i &lt; nr)) {</div><div class='del'>-		ret = aio_read_evt(ctx, &amp;ent);</div><div class='del'>-		if (unlikely(ret &lt;= 0))</div><div class='del'>-			break;</div><div class='del'>-</div><div class='del'>-		dprintk("read event: %Lx %Lx %Lx %Lx\n",</div><div class='del'>-			ent.data, ent.obj, ent.res, ent.res2);</div><div class='add'>+		ev = kmap(page);</div><div class='add'>+		copy_ret = copy_to_user(event + ret, ev + pos,</div><div class='add'>+					sizeof(*ev) * avail);</div><div class='add'>+		kunmap(page);</div><div class='ctx'> </div><div class='del'>-		/* Could we split the check in two? */</div><div class='del'>-		ret = -EFAULT;</div><div class='del'>-		if (unlikely(copy_to_user(event, &amp;ent, sizeof(ent)))) {</div><div class='del'>-			dprintk("aio: lost an event due to EFAULT.\n");</div><div class='del'>-			break;</div><div class='add'>+		if (unlikely(copy_ret)) {</div><div class='add'>+			ret = -EFAULT;</div><div class='add'>+			goto out;</div><div class='ctx'> 		}</div><div class='del'>-		ret = 0;</div><div class='ctx'> </div><div class='del'>-		/* Good, event copied to userland, update counts. */</div><div class='del'>-		event ++;</div><div class='del'>-		i ++;</div><div class='add'>+		ret += avail;</div><div class='add'>+		head += avail;</div><div class='add'>+		head %= ctx-&gt;nr_events;</div><div class='ctx'> 	}</div><div class='ctx'> </div><div class='del'>-	if (min_nr &lt;= i)</div><div class='del'>-		return i;</div><div class='del'>-	if (ret)</div><div class='del'>-		return ret;</div><div class='add'>+	ring = kmap_atomic(ctx-&gt;ring_pages[0]);</div><div class='add'>+	ring-&gt;head = head;</div><div class='add'>+	kunmap_atomic(ring);</div><div class='add'>+	flush_dcache_page(ctx-&gt;ring_pages[0]);</div><div class='ctx'> </div><div class='del'>-	/* End fast path */</div><div class='add'>+	pr_debug("%li  h%u t%u\n", ret, head, ctx-&gt;tail);</div><div class='ctx'> </div><div class='del'>-	/* racey check, but it gets redone */</div><div class='del'>-	if (!retry &amp;&amp; unlikely(!list_empty(&amp;ctx-&gt;run_list))) {</div><div class='del'>-		retry = 1;</div><div class='del'>-		aio_run_all_iocbs(ctx);</div><div class='del'>-		goto retry;</div><div class='del'>-	}</div><div class='add'>+	atomic_sub(ret, &amp;ctx-&gt;reqs_active);</div><div class='add'>+out:</div><div class='add'>+	mutex_unlock(&amp;ctx-&gt;ring_lock);</div><div class='ctx'> </div><div class='del'>-	init_timeout(&amp;to);</div><div class='del'>-	if (timeout) {</div><div class='del'>-		struct timespec	ts;</div><div class='del'>-		ret = -EFAULT;</div><div class='del'>-		if (unlikely(copy_from_user(&amp;ts, timeout, sizeof(ts))))</div><div class='del'>-			goto out;</div><div class='add'>+	return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-		set_timeout(start_jiffies, &amp;to, &amp;ts);</div><div class='del'>-	}</div><div class='add'>+static bool aio_read_events(struct kioctx *ctx, long min_nr, long nr,</div><div class='add'>+			    struct io_event __user *event, long *i)</div><div class='add'>+{</div><div class='add'>+	long ret = aio_read_events_ring(ctx, event + *i, nr - *i);</div><div class='ctx'> </div><div class='del'>-	while (likely(i &lt; nr)) {</div><div class='del'>-		add_wait_queue_exclusive(&amp;ctx-&gt;wait, &amp;wait);</div><div class='del'>-		do {</div><div class='del'>-			set_task_state(tsk, TASK_INTERRUPTIBLE);</div><div class='del'>-			ret = aio_read_evt(ctx, &amp;ent);</div><div class='del'>-			if (ret)</div><div class='del'>-				break;</div><div class='del'>-			if (min_nr &lt;= i)</div><div class='del'>-				break;</div><div class='del'>-			if (unlikely(ctx-&gt;dead)) {</div><div class='del'>-				ret = -EINVAL;</div><div class='del'>-				break;</div><div class='del'>-			}</div><div class='del'>-			if (to.timed_out)	/* Only check after read evt */</div><div class='del'>-				break;</div><div class='del'>-			/* Try to only show up in io wait if there are ops</div><div class='del'>-			 *  in flight */</div><div class='del'>-			if (ctx-&gt;reqs_active)</div><div class='del'>-				io_schedule();</div><div class='del'>-			else</div><div class='del'>-				schedule();</div><div class='del'>-			if (signal_pending(tsk)) {</div><div class='del'>-				ret = -EINTR;</div><div class='del'>-				break;</div><div class='del'>-			}</div><div class='del'>-			/*ret = aio_read_evt(ctx, &amp;ent);*/</div><div class='del'>-		} while (1) ;</div><div class='del'>-</div><div class='del'>-		set_task_state(tsk, TASK_RUNNING);</div><div class='del'>-		remove_wait_queue(&amp;ctx-&gt;wait, &amp;wait);</div><div class='del'>-</div><div class='del'>-		if (unlikely(ret &lt;= 0))</div><div class='del'>-			break;</div><div class='add'>+	if (ret &gt; 0)</div><div class='add'>+		*i += ret;</div><div class='ctx'> </div><div class='del'>-		ret = -EFAULT;</div><div class='del'>-		if (unlikely(copy_to_user(event, &amp;ent, sizeof(ent)))) {</div><div class='del'>-			dprintk("aio: lost an event due to EFAULT.\n");</div><div class='del'>-			break;</div><div class='del'>-		}</div><div class='add'>+	if (unlikely(atomic_read(&amp;ctx-&gt;dead)))</div><div class='add'>+		ret = -EINVAL;</div><div class='ctx'> </div><div class='del'>-		/* Good, event copied to userland, update counts. */</div><div class='del'>-		event ++;</div><div class='del'>-		i ++;</div><div class='del'>-	}</div><div class='add'>+	if (!*i)</div><div class='add'>+		*i = ret;</div><div class='ctx'> </div><div class='del'>-	if (timeout)</div><div class='del'>-		clear_timeout(&amp;to);</div><div class='del'>-out:</div><div class='del'>-	destroy_timer_on_stack(&amp;to.timer);</div><div class='del'>-	return i ? i : ret;</div><div class='add'>+	return ret &lt; 0 || *i &gt;= min_nr;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-/* Take an ioctx and remove it from the list of ioctx's.  Protects </div><div class='del'>- * against races with itself via -&gt;dead.</div><div class='del'>- */</div><div class='del'>-static void io_destroy(struct kioctx *ioctx)</div><div class='add'>+static long read_events(struct kioctx *ctx, long min_nr, long nr,</div><div class='add'>+			struct io_event __user *event,</div><div class='add'>+			struct timespec __user *timeout)</div><div class='ctx'> {</div><div class='del'>-	struct mm_struct *mm = current-&gt;mm;</div><div class='del'>-	int was_dead;</div><div class='add'>+	ktime_t until = { .tv64 = KTIME_MAX };</div><div class='add'>+	long ret = 0;</div><div class='ctx'> </div><div class='del'>-	/* delete the entry from the list is someone else hasn't already */</div><div class='del'>-	spin_lock(&amp;mm-&gt;ioctx_lock);</div><div class='del'>-	was_dead = ioctx-&gt;dead;</div><div class='del'>-	ioctx-&gt;dead = 1;</div><div class='del'>-	hlist_del_rcu(&amp;ioctx-&gt;list);</div><div class='del'>-	spin_unlock(&amp;mm-&gt;ioctx_lock);</div><div class='add'>+	if (timeout) {</div><div class='add'>+		struct timespec	ts;</div><div class='ctx'> </div><div class='del'>-	dprintk("aio_release(%p)\n", ioctx);</div><div class='del'>-	if (likely(!was_dead))</div><div class='del'>-		put_ioctx(ioctx);	/* twice for the list */</div><div class='add'>+		if (unlikely(copy_from_user(&amp;ts, timeout, sizeof(ts))))</div><div class='add'>+			return -EFAULT;</div><div class='ctx'> </div><div class='del'>-	kill_ctx(ioctx);</div><div class='add'>+		until = timespec_to_ktime(ts);</div><div class='add'>+	}</div><div class='ctx'> </div><div class='ctx'> 	/*</div><div class='del'>-	 * Wake up any waiters.  The setting of ctx-&gt;dead must be seen</div><div class='del'>-	 * by other CPUs at this point.  Right now, we rely on the</div><div class='del'>-	 * locking done by the above calls to ensure this consistency.</div><div class='add'>+	 * Note that aio_read_events() is being called as the conditional - i.e.</div><div class='add'>+	 * we're calling it after prepare_to_wait() has set task state to</div><div class='add'>+	 * TASK_INTERRUPTIBLE.</div><div class='add'>+	 *</div><div class='add'>+	 * But aio_read_events() can block, and if it blocks it's going to flip</div><div class='add'>+	 * the task state back to TASK_RUNNING.</div><div class='add'>+	 *</div><div class='add'>+	 * This should be ok, provided it doesn't flip the state back to</div><div class='add'>+	 * TASK_RUNNING and return 0 too much - that causes us to spin. That</div><div class='add'>+	 * will only happen if the mutex_lock() call blocks, and we then find</div><div class='add'>+	 * the ringbuffer empty. So in practice we should be ok, but it's</div><div class='add'>+	 * something to be aware of when touching this code.</div><div class='ctx'> 	 */</div><div class='del'>-	wake_up_all(&amp;ioctx-&gt;wait);</div><div class='add'>+	wait_event_interruptible_hrtimeout(ctx-&gt;wait,</div><div class='add'>+			aio_read_events(ctx, min_nr, nr, event, &amp;ret), until);</div><div class='add'>+</div><div class='add'>+	if (!ret &amp;&amp; signal_pending(current))</div><div class='add'>+		ret = -EINTR;</div><div class='add'>+</div><div class='add'>+	return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> /* sys_io_setup:</div><div class='hunk'>@@ -1252,7 +854,7 @@ SYSCALL_DEFINE2(io_setup, unsigned, nr_events, aio_context_t __user *, ctxp)</div><div class='ctx'> 	if (!IS_ERR(ioctx)) {</div><div class='ctx'> 		ret = put_user(ioctx-&gt;user_id, ctxp);</div><div class='ctx'> 		if (ret)</div><div class='del'>-			io_destroy(ioctx);</div><div class='add'>+			kill_ioctx(ioctx);</div><div class='ctx'> 		put_ioctx(ioctx);</div><div class='ctx'> 	}</div><div class='ctx'> </div><div class='hunk'>@@ -1270,7 +872,7 @@ SYSCALL_DEFINE1(io_destroy, aio_context_t, ctx)</div><div class='ctx'> {</div><div class='ctx'> 	struct kioctx *ioctx = lookup_ioctx(ctx);</div><div class='ctx'> 	if (likely(NULL != ioctx)) {</div><div class='del'>-		io_destroy(ioctx);</div><div class='add'>+		kill_ioctx(ioctx);</div><div class='ctx'> 		put_ioctx(ioctx);</div><div class='ctx'> 		return 0;</div><div class='ctx'> 	}</div><div class='hunk'>@@ -1301,30 +903,21 @@ static void aio_advance_iovec(struct kiocb *iocb, ssize_t ret)</div><div class='ctx'> 	BUG_ON(ret &gt; 0 &amp;&amp; iocb-&gt;ki_left == 0);</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-static ssize_t aio_rw_vect_retry(struct kiocb *iocb)</div><div class='add'>+typedef ssize_t (aio_rw_op)(struct kiocb *, const struct iovec *,</div><div class='add'>+			    unsigned long, loff_t);</div><div class='add'>+</div><div class='add'>+static ssize_t aio_rw_vect_retry(struct kiocb *iocb, int rw, aio_rw_op *rw_op)</div><div class='ctx'> {</div><div class='ctx'> 	struct file *file = iocb-&gt;ki_filp;</div><div class='ctx'> 	struct address_space *mapping = file-&gt;f_mapping;</div><div class='ctx'> 	struct inode *inode = mapping-&gt;host;</div><div class='del'>-	ssize_t (*rw_op)(struct kiocb *, const struct iovec *,</div><div class='del'>-			 unsigned long, loff_t);</div><div class='ctx'> 	ssize_t ret = 0;</div><div class='del'>-	unsigned short opcode;</div><div class='del'>-</div><div class='del'>-	if ((iocb-&gt;ki_opcode == IOCB_CMD_PREADV) ||</div><div class='del'>-		(iocb-&gt;ki_opcode == IOCB_CMD_PREAD)) {</div><div class='del'>-		rw_op = file-&gt;f_op-&gt;aio_read;</div><div class='del'>-		opcode = IOCB_CMD_PREADV;</div><div class='del'>-	} else {</div><div class='del'>-		rw_op = file-&gt;f_op-&gt;aio_write;</div><div class='del'>-		opcode = IOCB_CMD_PWRITEV;</div><div class='del'>-	}</div><div class='ctx'> </div><div class='ctx'> 	/* This matches the pread()/pwrite() logic */</div><div class='ctx'> 	if (iocb-&gt;ki_pos &lt; 0)</div><div class='ctx'> 		return -EINVAL;</div><div class='ctx'> </div><div class='del'>-	if (opcode == IOCB_CMD_PWRITEV)</div><div class='add'>+	if (rw == WRITE)</div><div class='ctx'> 		file_start_write(file);</div><div class='ctx'> 	do {</div><div class='ctx'> 		ret = rw_op(iocb, &amp;iocb-&gt;ki_iovec[iocb-&gt;ki_cur_seg],</div><div class='hunk'>@@ -1336,9 +929,9 @@ static ssize_t aio_rw_vect_retry(struct kiocb *iocb)</div><div class='ctx'> 	/* retry all partial writes.  retry partial reads as long as its a</div><div class='ctx'> 	 * regular file. */</div><div class='ctx'> 	} while (ret &gt; 0 &amp;&amp; iocb-&gt;ki_left &gt; 0 &amp;&amp;</div><div class='del'>-		 (opcode == IOCB_CMD_PWRITEV ||</div><div class='add'>+		 (rw == WRITE ||</div><div class='ctx'> 		  (!S_ISFIFO(inode-&gt;i_mode) &amp;&amp; !S_ISSOCK(inode-&gt;i_mode))));</div><div class='del'>-	if (opcode == IOCB_CMD_PWRITEV)</div><div class='add'>+	if (rw == WRITE)</div><div class='ctx'> 		file_end_write(file);</div><div class='ctx'> </div><div class='ctx'> 	/* This means we must have transferred all that we could */</div><div class='hunk'>@@ -1348,81 +941,49 @@ static ssize_t aio_rw_vect_retry(struct kiocb *iocb)</div><div class='ctx'> </div><div class='ctx'> 	/* If we managed to write some out we return that, rather than</div><div class='ctx'> 	 * the eventual error. */</div><div class='del'>-	if (opcode == IOCB_CMD_PWRITEV</div><div class='del'>-	    &amp;&amp; ret &lt; 0 &amp;&amp; ret != -EIOCBQUEUED &amp;&amp; ret != -EIOCBRETRY</div><div class='add'>+	if (rw == WRITE</div><div class='add'>+	    &amp;&amp; ret &lt; 0 &amp;&amp; ret != -EIOCBQUEUED</div><div class='ctx'> 	    &amp;&amp; iocb-&gt;ki_nbytes - iocb-&gt;ki_left)</div><div class='ctx'> 		ret = iocb-&gt;ki_nbytes - iocb-&gt;ki_left;</div><div class='ctx'> </div><div class='ctx'> 	return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-static ssize_t aio_fdsync(struct kiocb *iocb)</div><div class='del'>-{</div><div class='del'>-	struct file *file = iocb-&gt;ki_filp;</div><div class='del'>-	ssize_t ret = -EINVAL;</div><div class='del'>-</div><div class='del'>-	if (file-&gt;f_op-&gt;aio_fsync)</div><div class='del'>-		ret = file-&gt;f_op-&gt;aio_fsync(iocb, 1);</div><div class='del'>-	return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static ssize_t aio_fsync(struct kiocb *iocb)</div><div class='del'>-{</div><div class='del'>-	struct file *file = iocb-&gt;ki_filp;</div><div class='del'>-	ssize_t ret = -EINVAL;</div><div class='del'>-</div><div class='del'>-	if (file-&gt;f_op-&gt;aio_fsync)</div><div class='del'>-		ret = file-&gt;f_op-&gt;aio_fsync(iocb, 0);</div><div class='del'>-	return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static ssize_t aio_setup_vectored_rw(int type, struct kiocb *kiocb, bool compat)</div><div class='add'>+static ssize_t aio_setup_vectored_rw(int rw, struct kiocb *kiocb, bool compat)</div><div class='ctx'> {</div><div class='ctx'> 	ssize_t ret;</div><div class='ctx'> </div><div class='add'>+	kiocb-&gt;ki_nr_segs = kiocb-&gt;ki_nbytes;</div><div class='add'>+</div><div class='ctx'> #ifdef CONFIG_COMPAT</div><div class='ctx'> 	if (compat)</div><div class='del'>-		ret = compat_rw_copy_check_uvector(type,</div><div class='add'>+		ret = compat_rw_copy_check_uvector(rw,</div><div class='ctx'> 				(struct compat_iovec __user *)kiocb-&gt;ki_buf,</div><div class='del'>-				kiocb-&gt;ki_nbytes, 1, &amp;kiocb-&gt;ki_inline_vec,</div><div class='add'>+				kiocb-&gt;ki_nr_segs, 1, &amp;kiocb-&gt;ki_inline_vec,</div><div class='ctx'> 				&amp;kiocb-&gt;ki_iovec);</div><div class='ctx'> 	else</div><div class='ctx'> #endif</div><div class='del'>-		ret = rw_copy_check_uvector(type,</div><div class='add'>+		ret = rw_copy_check_uvector(rw,</div><div class='ctx'> 				(struct iovec __user *)kiocb-&gt;ki_buf,</div><div class='del'>-				kiocb-&gt;ki_nbytes, 1, &amp;kiocb-&gt;ki_inline_vec,</div><div class='add'>+				kiocb-&gt;ki_nr_segs, 1, &amp;kiocb-&gt;ki_inline_vec,</div><div class='ctx'> 				&amp;kiocb-&gt;ki_iovec);</div><div class='ctx'> 	if (ret &lt; 0)</div><div class='del'>-		goto out;</div><div class='del'>-</div><div class='del'>-	ret = rw_verify_area(type, kiocb-&gt;ki_filp, &amp;kiocb-&gt;ki_pos, ret);</div><div class='del'>-	if (ret &lt; 0)</div><div class='del'>-		goto out;</div><div class='add'>+		return ret;</div><div class='ctx'> </div><div class='del'>-	kiocb-&gt;ki_nr_segs = kiocb-&gt;ki_nbytes;</div><div class='del'>-	kiocb-&gt;ki_cur_seg = 0;</div><div class='del'>-	/* ki_nbytes/left now reflect bytes instead of segs */</div><div class='add'>+	/* ki_nbytes now reflect bytes instead of segs */</div><div class='ctx'> 	kiocb-&gt;ki_nbytes = ret;</div><div class='del'>-	kiocb-&gt;ki_left = ret;</div><div class='del'>-</div><div class='del'>-	ret = 0;</div><div class='del'>-out:</div><div class='del'>-	return ret;</div><div class='add'>+	return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-static ssize_t aio_setup_single_vector(int type, struct file * file, struct kiocb *kiocb)</div><div class='add'>+static ssize_t aio_setup_single_vector(int rw, struct kiocb *kiocb)</div><div class='ctx'> {</div><div class='del'>-	int bytes;</div><div class='del'>-</div><div class='del'>-	bytes = rw_verify_area(type, file, &amp;kiocb-&gt;ki_pos, kiocb-&gt;ki_left);</div><div class='del'>-	if (bytes &lt; 0)</div><div class='del'>-		return bytes;</div><div class='add'>+	if (unlikely(!access_ok(!rw, kiocb-&gt;ki_buf, kiocb-&gt;ki_nbytes)))</div><div class='add'>+		return -EFAULT;</div><div class='ctx'> </div><div class='ctx'> 	kiocb-&gt;ki_iovec = &amp;kiocb-&gt;ki_inline_vec;</div><div class='ctx'> 	kiocb-&gt;ki_iovec-&gt;iov_base = kiocb-&gt;ki_buf;</div><div class='del'>-	kiocb-&gt;ki_iovec-&gt;iov_len = bytes;</div><div class='add'>+	kiocb-&gt;ki_iovec-&gt;iov_len = kiocb-&gt;ki_nbytes;</div><div class='ctx'> 	kiocb-&gt;ki_nr_segs = 1;</div><div class='del'>-	kiocb-&gt;ki_cur_seg = 0;</div><div class='ctx'> 	return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='hunk'>@@ -1431,96 +992,95 @@ static ssize_t aio_setup_single_vector(int type, struct file * file, struct kioc</div><div class='ctx'>  *	Performs the initial checks and aio retry method</div><div class='ctx'>  *	setup for the kiocb at the time of io submission.</div><div class='ctx'>  */</div><div class='del'>-static ssize_t aio_setup_iocb(struct kiocb *kiocb, bool compat)</div><div class='add'>+static ssize_t aio_run_iocb(struct kiocb *req, bool compat)</div><div class='ctx'> {</div><div class='del'>-	struct file *file = kiocb-&gt;ki_filp;</div><div class='del'>-	ssize_t ret = 0;</div><div class='add'>+	struct file *file = req-&gt;ki_filp;</div><div class='add'>+	ssize_t ret;</div><div class='add'>+	int rw;</div><div class='add'>+	fmode_t mode;</div><div class='add'>+	aio_rw_op *rw_op;</div><div class='ctx'> </div><div class='del'>-	switch (kiocb-&gt;ki_opcode) {</div><div class='add'>+	switch (req-&gt;ki_opcode) {</div><div class='ctx'> 	case IOCB_CMD_PREAD:</div><div class='del'>-		ret = -EBADF;</div><div class='del'>-		if (unlikely(!(file-&gt;f_mode &amp; FMODE_READ)))</div><div class='del'>-			break;</div><div class='del'>-		ret = -EFAULT;</div><div class='del'>-		if (unlikely(!access_ok(VERIFY_WRITE, kiocb-&gt;ki_buf,</div><div class='del'>-			kiocb-&gt;ki_left)))</div><div class='del'>-			break;</div><div class='del'>-		ret = aio_setup_single_vector(READ, file, kiocb);</div><div class='del'>-		if (ret)</div><div class='del'>-			break;</div><div class='del'>-		ret = -EINVAL;</div><div class='del'>-		if (file-&gt;f_op-&gt;aio_read)</div><div class='del'>-			kiocb-&gt;ki_retry = aio_rw_vect_retry;</div><div class='del'>-		break;</div><div class='del'>-	case IOCB_CMD_PWRITE:</div><div class='del'>-		ret = -EBADF;</div><div class='del'>-		if (unlikely(!(file-&gt;f_mode &amp; FMODE_WRITE)))</div><div class='del'>-			break;</div><div class='del'>-		ret = -EFAULT;</div><div class='del'>-		if (unlikely(!access_ok(VERIFY_READ, kiocb-&gt;ki_buf,</div><div class='del'>-			kiocb-&gt;ki_left)))</div><div class='del'>-			break;</div><div class='del'>-		ret = aio_setup_single_vector(WRITE, file, kiocb);</div><div class='del'>-		if (ret)</div><div class='del'>-			break;</div><div class='del'>-		ret = -EINVAL;</div><div class='del'>-		if (file-&gt;f_op-&gt;aio_write)</div><div class='del'>-			kiocb-&gt;ki_retry = aio_rw_vect_retry;</div><div class='del'>-		break;</div><div class='ctx'> 	case IOCB_CMD_PREADV:</div><div class='del'>-		ret = -EBADF;</div><div class='del'>-		if (unlikely(!(file-&gt;f_mode &amp; FMODE_READ)))</div><div class='del'>-			break;</div><div class='del'>-		ret = aio_setup_vectored_rw(READ, kiocb, compat);</div><div class='del'>-		if (ret)</div><div class='del'>-			break;</div><div class='del'>-		ret = -EINVAL;</div><div class='del'>-		if (file-&gt;f_op-&gt;aio_read)</div><div class='del'>-			kiocb-&gt;ki_retry = aio_rw_vect_retry;</div><div class='del'>-		break;</div><div class='add'>+		mode	= FMODE_READ;</div><div class='add'>+		rw	= READ;</div><div class='add'>+		rw_op	= file-&gt;f_op-&gt;aio_read;</div><div class='add'>+		goto rw_common;</div><div class='add'>+</div><div class='add'>+	case IOCB_CMD_PWRITE:</div><div class='ctx'> 	case IOCB_CMD_PWRITEV:</div><div class='del'>-		ret = -EBADF;</div><div class='del'>-		if (unlikely(!(file-&gt;f_mode &amp; FMODE_WRITE)))</div><div class='del'>-			break;</div><div class='del'>-		ret = aio_setup_vectored_rw(WRITE, kiocb, compat);</div><div class='add'>+		mode	= FMODE_WRITE;</div><div class='add'>+		rw	= WRITE;</div><div class='add'>+		rw_op	= file-&gt;f_op-&gt;aio_write;</div><div class='add'>+		goto rw_common;</div><div class='add'>+rw_common:</div><div class='add'>+		if (unlikely(!(file-&gt;f_mode &amp; mode)))</div><div class='add'>+			return -EBADF;</div><div class='add'>+</div><div class='add'>+		if (!rw_op)</div><div class='add'>+			return -EINVAL;</div><div class='add'>+</div><div class='add'>+		ret = (req-&gt;ki_opcode == IOCB_CMD_PREADV ||</div><div class='add'>+		       req-&gt;ki_opcode == IOCB_CMD_PWRITEV)</div><div class='add'>+			? aio_setup_vectored_rw(rw, req, compat)</div><div class='add'>+			: aio_setup_single_vector(rw, req);</div><div class='ctx'> 		if (ret)</div><div class='del'>-			break;</div><div class='del'>-		ret = -EINVAL;</div><div class='del'>-		if (file-&gt;f_op-&gt;aio_write)</div><div class='del'>-			kiocb-&gt;ki_retry = aio_rw_vect_retry;</div><div class='add'>+			return ret;</div><div class='add'>+</div><div class='add'>+		ret = rw_verify_area(rw, file, &amp;req-&gt;ki_pos, req-&gt;ki_nbytes);</div><div class='add'>+		if (ret &lt; 0)</div><div class='add'>+			return ret;</div><div class='add'>+</div><div class='add'>+		req-&gt;ki_nbytes = ret;</div><div class='add'>+		req-&gt;ki_left = ret;</div><div class='add'>+</div><div class='add'>+		ret = aio_rw_vect_retry(req, rw, rw_op);</div><div class='ctx'> 		break;</div><div class='add'>+</div><div class='ctx'> 	case IOCB_CMD_FDSYNC:</div><div class='del'>-		ret = -EINVAL;</div><div class='del'>-		if (file-&gt;f_op-&gt;aio_fsync)</div><div class='del'>-			kiocb-&gt;ki_retry = aio_fdsync;</div><div class='add'>+		if (!file-&gt;f_op-&gt;aio_fsync)</div><div class='add'>+			return -EINVAL;</div><div class='add'>+</div><div class='add'>+		ret = file-&gt;f_op-&gt;aio_fsync(req, 1);</div><div class='ctx'> 		break;</div><div class='add'>+</div><div class='ctx'> 	case IOCB_CMD_FSYNC:</div><div class='del'>-		ret = -EINVAL;</div><div class='del'>-		if (file-&gt;f_op-&gt;aio_fsync)</div><div class='del'>-			kiocb-&gt;ki_retry = aio_fsync;</div><div class='add'>+		if (!file-&gt;f_op-&gt;aio_fsync)</div><div class='add'>+			return -EINVAL;</div><div class='add'>+</div><div class='add'>+		ret = file-&gt;f_op-&gt;aio_fsync(req, 0);</div><div class='ctx'> 		break;</div><div class='add'>+</div><div class='ctx'> 	default:</div><div class='del'>-		dprintk("EINVAL: io_submit: no operation provided\n");</div><div class='del'>-		ret = -EINVAL;</div><div class='add'>+		pr_debug("EINVAL: no operation provided\n");</div><div class='add'>+		return -EINVAL;</div><div class='ctx'> 	}</div><div class='ctx'> </div><div class='del'>-	if (!kiocb-&gt;ki_retry)</div><div class='del'>-		return ret;</div><div class='add'>+	if (ret != -EIOCBQUEUED) {</div><div class='add'>+		/*</div><div class='add'>+		 * There's no easy way to restart the syscall since other AIO's</div><div class='add'>+		 * may be already running. Just fail this IO with EINTR.</div><div class='add'>+		 */</div><div class='add'>+		if (unlikely(ret == -ERESTARTSYS || ret == -ERESTARTNOINTR ||</div><div class='add'>+			     ret == -ERESTARTNOHAND ||</div><div class='add'>+			     ret == -ERESTART_RESTARTBLOCK))</div><div class='add'>+			ret = -EINTR;</div><div class='add'>+		aio_complete(req, ret, 0);</div><div class='add'>+	}</div><div class='ctx'> </div><div class='ctx'> 	return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> static int io_submit_one(struct kioctx *ctx, struct iocb __user *user_iocb,</div><div class='del'>-			 struct iocb *iocb, struct kiocb_batch *batch,</div><div class='del'>-			 bool compat)</div><div class='add'>+			 struct iocb *iocb, bool compat)</div><div class='ctx'> {</div><div class='ctx'> 	struct kiocb *req;</div><div class='del'>-	struct file *file;</div><div class='ctx'> 	ssize_t ret;</div><div class='ctx'> </div><div class='ctx'> 	/* enforce forwards compatibility on users */</div><div class='ctx'> 	if (unlikely(iocb-&gt;aio_reserved1 || iocb-&gt;aio_reserved2)) {</div><div class='del'>-		pr_debug("EINVAL: io_submit: reserve field set\n");</div><div class='add'>+		pr_debug("EINVAL: reserve field set\n");</div><div class='ctx'> 		return -EINVAL;</div><div class='ctx'> 	}</div><div class='ctx'> </div><div class='hunk'>@@ -1534,16 +1094,16 @@ static int io_submit_one(struct kioctx *ctx, struct iocb __user *user_iocb,</div><div class='ctx'> 		return -EINVAL;</div><div class='ctx'> 	}</div><div class='ctx'> </div><div class='del'>-	file = fget(iocb-&gt;aio_fildes);</div><div class='del'>-	if (unlikely(!file))</div><div class='del'>-		return -EBADF;</div><div class='del'>-</div><div class='del'>-	req = aio_get_req(ctx, batch);  /* returns with 2 references to req */</div><div class='del'>-	if (unlikely(!req)) {</div><div class='del'>-		fput(file);</div><div class='add'>+	req = aio_get_req(ctx);</div><div class='add'>+	if (unlikely(!req))</div><div class='ctx'> 		return -EAGAIN;</div><div class='add'>+</div><div class='add'>+	req-&gt;ki_filp = fget(iocb-&gt;aio_fildes);</div><div class='add'>+	if (unlikely(!req-&gt;ki_filp)) {</div><div class='add'>+		ret = -EBADF;</div><div class='add'>+		goto out_put_req;</div><div class='ctx'> 	}</div><div class='del'>-	req-&gt;ki_filp = file;</div><div class='add'>+</div><div class='ctx'> 	if (iocb-&gt;aio_flags &amp; IOCB_FLAG_RESFD) {</div><div class='ctx'> 		/*</div><div class='ctx'> 		 * If the IOCB_FLAG_RESFD flag of aio_flags is set, get an</div><div class='hunk'>@@ -1559,9 +1119,9 @@ static int io_submit_one(struct kioctx *ctx, struct iocb __user *user_iocb,</div><div class='ctx'> 		}</div><div class='ctx'> 	}</div><div class='ctx'> </div><div class='del'>-	ret = put_user(req-&gt;ki_key, &amp;user_iocb-&gt;aio_key);</div><div class='add'>+	ret = put_user(KIOCB_KEY, &amp;user_iocb-&gt;aio_key);</div><div class='ctx'> 	if (unlikely(ret)) {</div><div class='del'>-		dprintk("EFAULT: aio_key\n");</div><div class='add'>+		pr_debug("EFAULT: aio_key\n");</div><div class='ctx'> 		goto out_put_req;</div><div class='ctx'> 	}</div><div class='ctx'> </div><div class='hunk'>@@ -1573,41 +1133,14 @@ static int io_submit_one(struct kioctx *ctx, struct iocb __user *user_iocb,</div><div class='ctx'> 	req-&gt;ki_left = req-&gt;ki_nbytes = iocb-&gt;aio_nbytes;</div><div class='ctx'> 	req-&gt;ki_opcode = iocb-&gt;aio_lio_opcode;</div><div class='ctx'> </div><div class='del'>-	ret = aio_setup_iocb(req, compat);</div><div class='del'>-</div><div class='add'>+	ret = aio_run_iocb(req, compat);</div><div class='ctx'> 	if (ret)</div><div class='ctx'> 		goto out_put_req;</div><div class='ctx'> </div><div class='del'>-	spin_lock_irq(&amp;ctx-&gt;ctx_lock);</div><div class='del'>-	/*</div><div class='del'>-	 * We could have raced with io_destroy() and are currently holding a</div><div class='del'>-	 * reference to ctx which should be destroyed. We cannot submit IO</div><div class='del'>-	 * since ctx gets freed as soon as io_submit() puts its reference.  The</div><div class='del'>-	 * check here is reliable: io_destroy() sets ctx-&gt;dead before waiting</div><div class='del'>-	 * for outstanding IO and the barrier between these two is realized by</div><div class='del'>-	 * unlock of mm-&gt;ioctx_lock and lock of ctx-&gt;ctx_lock.  Analogously we</div><div class='del'>-	 * increment ctx-&gt;reqs_active before checking for ctx-&gt;dead and the</div><div class='del'>-	 * barrier is realized by unlock and lock of ctx-&gt;ctx_lock. Thus if we</div><div class='del'>-	 * don't see ctx-&gt;dead set here, io_destroy() waits for our IO to</div><div class='del'>-	 * finish.</div><div class='del'>-	 */</div><div class='del'>-	if (ctx-&gt;dead) {</div><div class='del'>-		spin_unlock_irq(&amp;ctx-&gt;ctx_lock);</div><div class='del'>-		ret = -EINVAL;</div><div class='del'>-		goto out_put_req;</div><div class='del'>-	}</div><div class='del'>-	aio_run_iocb(req);</div><div class='del'>-	if (!list_empty(&amp;ctx-&gt;run_list)) {</div><div class='del'>-		/* drain the run list */</div><div class='del'>-		while (__aio_run_iocbs(ctx))</div><div class='del'>-			;</div><div class='del'>-	}</div><div class='del'>-	spin_unlock_irq(&amp;ctx-&gt;ctx_lock);</div><div class='del'>-</div><div class='ctx'> 	aio_put_req(req);	/* drop extra ref to req */</div><div class='ctx'> 	return 0;</div><div class='del'>-</div><div class='ctx'> out_put_req:</div><div class='add'>+	atomic_dec(&amp;ctx-&gt;reqs_active);</div><div class='ctx'> 	aio_put_req(req);	/* drop extra ref to req */</div><div class='ctx'> 	aio_put_req(req);	/* drop i/o ref to req */</div><div class='ctx'> 	return ret;</div><div class='hunk'>@@ -1620,7 +1153,6 @@ long do_io_submit(aio_context_t ctx_id, long nr,</div><div class='ctx'> 	long ret = 0;</div><div class='ctx'> 	int i = 0;</div><div class='ctx'> 	struct blk_plug plug;</div><div class='del'>-	struct kiocb_batch batch;</div><div class='ctx'> </div><div class='ctx'> 	if (unlikely(nr &lt; 0))</div><div class='ctx'> 		return -EINVAL;</div><div class='hunk'>@@ -1633,12 +1165,10 @@ long do_io_submit(aio_context_t ctx_id, long nr,</div><div class='ctx'> </div><div class='ctx'> 	ctx = lookup_ioctx(ctx_id);</div><div class='ctx'> 	if (unlikely(!ctx)) {</div><div class='del'>-		pr_debug("EINVAL: io_submit: invalid context id\n");</div><div class='add'>+		pr_debug("EINVAL: invalid context id\n");</div><div class='ctx'> 		return -EINVAL;</div><div class='ctx'> 	}</div><div class='ctx'> </div><div class='del'>-	kiocb_batch_init(&amp;batch, nr);</div><div class='del'>-</div><div class='ctx'> 	blk_start_plug(&amp;plug);</div><div class='ctx'> </div><div class='ctx'> 	/*</div><div class='hunk'>@@ -1659,13 +1189,12 @@ long do_io_submit(aio_context_t ctx_id, long nr,</div><div class='ctx'> 			break;</div><div class='ctx'> 		}</div><div class='ctx'> </div><div class='del'>-		ret = io_submit_one(ctx, user_iocb, &amp;tmp, &amp;batch, compat);</div><div class='add'>+		ret = io_submit_one(ctx, user_iocb, &amp;tmp, compat);</div><div class='ctx'> 		if (ret)</div><div class='ctx'> 			break;</div><div class='ctx'> 	}</div><div class='ctx'> 	blk_finish_plug(&amp;plug);</div><div class='ctx'> </div><div class='del'>-	kiocb_batch_free(ctx, &amp;batch);</div><div class='ctx'> 	put_ioctx(ctx);</div><div class='ctx'> 	return i ? i : ret;</div><div class='ctx'> }</div><div class='hunk'>@@ -1698,10 +1227,13 @@ static struct kiocb *lookup_kiocb(struct kioctx *ctx, struct iocb __user *iocb,</div><div class='ctx'> </div><div class='ctx'> 	assert_spin_locked(&amp;ctx-&gt;ctx_lock);</div><div class='ctx'> </div><div class='add'>+	if (key != KIOCB_KEY)</div><div class='add'>+		return NULL;</div><div class='add'>+</div><div class='ctx'> 	/* TODO: use a hash or array, this sucks. */</div><div class='ctx'> 	list_for_each(pos, &amp;ctx-&gt;active_reqs) {</div><div class='ctx'> 		struct kiocb *kiocb = list_kiocb(pos);</div><div class='del'>-		if (kiocb-&gt;ki_obj.user == iocb &amp;&amp; kiocb-&gt;ki_key == key)</div><div class='add'>+		if (kiocb-&gt;ki_obj.user == iocb)</div><div class='ctx'> 			return kiocb;</div><div class='ctx'> 	}</div><div class='ctx'> 	return NULL;</div><div class='hunk'>@@ -1720,7 +1252,7 @@ static struct kiocb *lookup_kiocb(struct kioctx *ctx, struct iocb __user *iocb,</div><div class='ctx'> SYSCALL_DEFINE3(io_cancel, aio_context_t, ctx_id, struct iocb __user *, iocb,</div><div class='ctx'> 		struct io_event __user *, result)</div><div class='ctx'> {</div><div class='del'>-	int (*cancel)(struct kiocb *iocb, struct io_event *res);</div><div class='add'>+	struct io_event res;</div><div class='ctx'> 	struct kioctx *ctx;</div><div class='ctx'> 	struct kiocb *kiocb;</div><div class='ctx'> 	u32 key;</div><div class='hunk'>@@ -1735,32 +1267,22 @@ SYSCALL_DEFINE3(io_cancel, aio_context_t, ctx_id, struct iocb __user *, iocb,</div><div class='ctx'> 		return -EINVAL;</div><div class='ctx'> </div><div class='ctx'> 	spin_lock_irq(&amp;ctx-&gt;ctx_lock);</div><div class='del'>-	ret = -EAGAIN;</div><div class='add'>+</div><div class='ctx'> 	kiocb = lookup_kiocb(ctx, iocb, key);</div><div class='del'>-	if (kiocb &amp;&amp; kiocb-&gt;ki_cancel) {</div><div class='del'>-		cancel = kiocb-&gt;ki_cancel;</div><div class='del'>-		kiocb-&gt;ki_users ++;</div><div class='del'>-		kiocbSetCancelled(kiocb);</div><div class='del'>-	} else</div><div class='del'>-		cancel = NULL;</div><div class='add'>+	if (kiocb)</div><div class='add'>+		ret = kiocb_cancel(ctx, kiocb, &amp;res);</div><div class='add'>+	else</div><div class='add'>+		ret = -EINVAL;</div><div class='add'>+</div><div class='ctx'> 	spin_unlock_irq(&amp;ctx-&gt;ctx_lock);</div><div class='ctx'> </div><div class='del'>-	if (NULL != cancel) {</div><div class='del'>-		struct io_event tmp;</div><div class='del'>-		pr_debug("calling cancel\n");</div><div class='del'>-		memset(&amp;tmp, 0, sizeof(tmp));</div><div class='del'>-		tmp.obj = (u64)(unsigned long)kiocb-&gt;ki_obj.user;</div><div class='del'>-		tmp.data = kiocb-&gt;ki_user_data;</div><div class='del'>-		ret = cancel(kiocb, &amp;tmp);</div><div class='del'>-		if (!ret) {</div><div class='del'>-			/* Cancellation succeeded -- copy the result</div><div class='del'>-			 * into the user's buffer.</div><div class='del'>-			 */</div><div class='del'>-			if (copy_to_user(result, &amp;tmp, sizeof(tmp)))</div><div class='del'>-				ret = -EFAULT;</div><div class='del'>-		}</div><div class='del'>-	} else</div><div class='del'>-		ret = -EINVAL;</div><div class='add'>+	if (!ret) {</div><div class='add'>+		/* Cancellation succeeded -- copy the result</div><div class='add'>+		 * into the user's buffer.</div><div class='add'>+		 */</div><div class='add'>+		if (copy_to_user(result, &amp;res, sizeof(res)))</div><div class='add'>+			ret = -EFAULT;</div><div class='add'>+	}</div><div class='ctx'> </div><div class='ctx'> 	put_ioctx(ctx);</div><div class='ctx'> </div><div class='head'>diff --git a/fs/bio.c b/fs/bio.c<br/>index b96fc6ce485..954d73124b4 100644<br/>--- a/<a href='/linux/tree/fs/bio.c?h=v3.12.17&amp;id=9affd6becbfb2c3f0d04e554bb87234761b37aba'>fs/bio.c</a><br/>+++ b/<a href='/linux/tree/fs/bio.c?h=v3.12.17&amp;id=5af43c24ca59a448c9312dd4a4a51d27ec3b9a73'>fs/bio.c</a></div><div class='hunk'>@@ -19,6 +19,7 @@</div><div class='ctx'> #include &lt;linux/swap.h&gt;</div><div class='ctx'> #include &lt;linux/bio.h&gt;</div><div class='ctx'> #include &lt;linux/blkdev.h&gt;</div><div class='add'>+#include &lt;linux/uio.h&gt;</div><div class='ctx'> #include &lt;linux/iocontext.h&gt;</div><div class='ctx'> #include &lt;linux/slab.h&gt;</div><div class='ctx'> #include &lt;linux/init.h&gt;</div><div class='head'>diff --git a/fs/block_dev.c b/fs/block_dev.c<br/>index 3823d3ffb76..d9871c1f089 100644<br/>--- a/<a href='/linux/tree/fs/block_dev.c?h=v3.12.17&amp;id=9affd6becbfb2c3f0d04e554bb87234761b37aba'>fs/block_dev.c</a><br/>+++ b/<a href='/linux/tree/fs/block_dev.c?h=v3.12.17&amp;id=5af43c24ca59a448c9312dd4a4a51d27ec3b9a73'>fs/block_dev.c</a></div><div class='hunk'>@@ -27,6 +27,7 @@</div><div class='ctx'> #include &lt;linux/namei.h&gt;</div><div class='ctx'> #include &lt;linux/log2.h&gt;</div><div class='ctx'> #include &lt;linux/cleancache.h&gt;</div><div class='add'>+#include &lt;linux/aio.h&gt;</div><div class='ctx'> #include &lt;asm/uaccess.h&gt;</div><div class='ctx'> #include "internal.h"</div><div class='ctx'> </div><div class='head'>diff --git a/fs/btrfs/file.c b/fs/btrfs/file.c<br/>index bb8b7a0e28a..bc4d54c465a 100644<br/>--- a/<a href='/linux/tree/fs/btrfs/file.c?h=v3.12.17&amp;id=9affd6becbfb2c3f0d04e554bb87234761b37aba'>fs/btrfs/file.c</a><br/>+++ b/<a href='/linux/tree/fs/btrfs/file.c?h=v3.12.17&amp;id=5af43c24ca59a448c9312dd4a4a51d27ec3b9a73'>fs/btrfs/file.c</a></div><div class='hunk'>@@ -24,6 +24,7 @@</div><div class='ctx'> #include &lt;linux/string.h&gt;</div><div class='ctx'> #include &lt;linux/backing-dev.h&gt;</div><div class='ctx'> #include &lt;linux/mpage.h&gt;</div><div class='add'>+#include &lt;linux/aio.h&gt;</div><div class='ctx'> #include &lt;linux/falloc.h&gt;</div><div class='ctx'> #include &lt;linux/swap.h&gt;</div><div class='ctx'> #include &lt;linux/writeback.h&gt;</div><div class='head'>diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c<br/>index 09c58a35b42..898da0a01e0 100644<br/>--- a/<a href='/linux/tree/fs/btrfs/inode.c?h=v3.12.17&amp;id=9affd6becbfb2c3f0d04e554bb87234761b37aba'>fs/btrfs/inode.c</a><br/>+++ b/<a href='/linux/tree/fs/btrfs/inode.c?h=v3.12.17&amp;id=5af43c24ca59a448c9312dd4a4a51d27ec3b9a73'>fs/btrfs/inode.c</a></div><div class='hunk'>@@ -32,6 +32,7 @@</div><div class='ctx'> #include &lt;linux/writeback.h&gt;</div><div class='ctx'> #include &lt;linux/statfs.h&gt;</div><div class='ctx'> #include &lt;linux/compat.h&gt;</div><div class='add'>+#include &lt;linux/aio.h&gt;</div><div class='ctx'> #include &lt;linux/bit_spinlock.h&gt;</div><div class='ctx'> #include &lt;linux/xattr.h&gt;</div><div class='ctx'> #include &lt;linux/posix_acl.h&gt;</div><div class='head'>diff --git a/fs/ceph/file.c b/fs/ceph/file.c<br/>index d70830c6683..656e1690743 100644<br/>--- a/<a href='/linux/tree/fs/ceph/file.c?h=v3.12.17&amp;id=9affd6becbfb2c3f0d04e554bb87234761b37aba'>fs/ceph/file.c</a><br/>+++ b/<a href='/linux/tree/fs/ceph/file.c?h=v3.12.17&amp;id=5af43c24ca59a448c9312dd4a4a51d27ec3b9a73'>fs/ceph/file.c</a></div><div class='hunk'>@@ -7,6 +7,7 @@</div><div class='ctx'> #include &lt;linux/mount.h&gt;</div><div class='ctx'> #include &lt;linux/namei.h&gt;</div><div class='ctx'> #include &lt;linux/writeback.h&gt;</div><div class='add'>+#include &lt;linux/aio.h&gt;</div><div class='ctx'> </div><div class='ctx'> #include "super.h"</div><div class='ctx'> #include "mds_client.h"</div><div class='head'>diff --git a/fs/compat.c b/fs/compat.c<br/>index 93f7d021b71..fc3b55dce18 100644<br/>--- a/<a href='/linux/tree/fs/compat.c?h=v3.12.17&amp;id=9affd6becbfb2c3f0d04e554bb87234761b37aba'>fs/compat.c</a><br/>+++ b/<a href='/linux/tree/fs/compat.c?h=v3.12.17&amp;id=5af43c24ca59a448c9312dd4a4a51d27ec3b9a73'>fs/compat.c</a></div><div class='hunk'>@@ -47,6 +47,7 @@</div><div class='ctx'> #include &lt;linux/fs_struct.h&gt;</div><div class='ctx'> #include &lt;linux/slab.h&gt;</div><div class='ctx'> #include &lt;linux/pagemap.h&gt;</div><div class='add'>+#include &lt;linux/aio.h&gt;</div><div class='ctx'> </div><div class='ctx'> #include &lt;asm/uaccess.h&gt;</div><div class='ctx'> #include &lt;asm/mmu_context.h&gt;</div><div class='head'>diff --git a/fs/direct-io.c b/fs/direct-io.c<br/>index cfb816dc6d9..51d16e067d6 100644<br/>--- a/<a href='/linux/tree/fs/direct-io.c?h=v3.12.17&amp;id=9affd6becbfb2c3f0d04e554bb87234761b37aba'>fs/direct-io.c</a><br/>+++ b/<a href='/linux/tree/fs/direct-io.c?h=v3.12.17&amp;id=5af43c24ca59a448c9312dd4a4a51d27ec3b9a73'>fs/direct-io.c</a></div><div class='hunk'>@@ -37,6 +37,7 @@</div><div class='ctx'> #include &lt;linux/uio.h&gt;</div><div class='ctx'> #include &lt;linux/atomic.h&gt;</div><div class='ctx'> #include &lt;linux/prefetch.h&gt;</div><div class='add'>+#include &lt;linux/aio.h&gt;</div><div class='ctx'> </div><div class='ctx'> /*</div><div class='ctx'>  * How many user pages to map in one call to get_user_pages().  This determines</div><div class='head'>diff --git a/fs/ecryptfs/file.c b/fs/ecryptfs/file.c<br/>index 63b1f54b6a1..201f0a0d6b0 100644<br/>--- a/<a href='/linux/tree/fs/ecryptfs/file.c?h=v3.12.17&amp;id=9affd6becbfb2c3f0d04e554bb87234761b37aba'>fs/ecryptfs/file.c</a><br/>+++ b/<a href='/linux/tree/fs/ecryptfs/file.c?h=v3.12.17&amp;id=5af43c24ca59a448c9312dd4a4a51d27ec3b9a73'>fs/ecryptfs/file.c</a></div><div class='hunk'>@@ -31,6 +31,7 @@</div><div class='ctx'> #include &lt;linux/security.h&gt;</div><div class='ctx'> #include &lt;linux/compat.h&gt;</div><div class='ctx'> #include &lt;linux/fs_stack.h&gt;</div><div class='add'>+#include &lt;linux/aio.h&gt;</div><div class='ctx'> #include "ecryptfs_kernel.h"</div><div class='ctx'> </div><div class='ctx'> /**</div><div class='head'>diff --git a/fs/ext2/inode.c b/fs/ext2/inode.c<br/>index fe60cc1117d..0a87bb10998 100644<br/>--- a/<a href='/linux/tree/fs/ext2/inode.c?h=v3.12.17&amp;id=9affd6becbfb2c3f0d04e554bb87234761b37aba'>fs/ext2/inode.c</a><br/>+++ b/<a href='/linux/tree/fs/ext2/inode.c?h=v3.12.17&amp;id=5af43c24ca59a448c9312dd4a4a51d27ec3b9a73'>fs/ext2/inode.c</a></div><div class='hunk'>@@ -31,6 +31,7 @@</div><div class='ctx'> #include &lt;linux/mpage.h&gt;</div><div class='ctx'> #include &lt;linux/fiemap.h&gt;</div><div class='ctx'> #include &lt;linux/namei.h&gt;</div><div class='add'>+#include &lt;linux/aio.h&gt;</div><div class='ctx'> #include "ext2.h"</div><div class='ctx'> #include "acl.h"</div><div class='ctx'> #include "xip.h"</div><div class='head'>diff --git a/fs/ext3/inode.c b/fs/ext3/inode.c<br/>index d706dbfa622..23c71282564 100644<br/>--- a/<a href='/linux/tree/fs/ext3/inode.c?h=v3.12.17&amp;id=9affd6becbfb2c3f0d04e554bb87234761b37aba'>fs/ext3/inode.c</a><br/>+++ b/<a href='/linux/tree/fs/ext3/inode.c?h=v3.12.17&amp;id=5af43c24ca59a448c9312dd4a4a51d27ec3b9a73'>fs/ext3/inode.c</a></div><div class='hunk'>@@ -27,6 +27,7 @@</div><div class='ctx'> #include &lt;linux/writeback.h&gt;</div><div class='ctx'> #include &lt;linux/mpage.h&gt;</div><div class='ctx'> #include &lt;linux/namei.h&gt;</div><div class='add'>+#include &lt;linux/aio.h&gt;</div><div class='ctx'> #include "ext3.h"</div><div class='ctx'> #include "xattr.h"</div><div class='ctx'> #include "acl.h"</div><div class='head'>diff --git a/fs/ext4/file.c b/fs/ext4/file.c<br/>index 64848b595b2..4959e29573b 100644<br/>--- a/<a href='/linux/tree/fs/ext4/file.c?h=v3.12.17&amp;id=9affd6becbfb2c3f0d04e554bb87234761b37aba'>fs/ext4/file.c</a><br/>+++ b/<a href='/linux/tree/fs/ext4/file.c?h=v3.12.17&amp;id=5af43c24ca59a448c9312dd4a4a51d27ec3b9a73'>fs/ext4/file.c</a></div><div class='hunk'>@@ -23,6 +23,7 @@</div><div class='ctx'> #include &lt;linux/jbd2.h&gt;</div><div class='ctx'> #include &lt;linux/mount.h&gt;</div><div class='ctx'> #include &lt;linux/path.h&gt;</div><div class='add'>+#include &lt;linux/aio.h&gt;</div><div class='ctx'> #include &lt;linux/quotaops.h&gt;</div><div class='ctx'> #include &lt;linux/pagevec.h&gt;</div><div class='ctx'> #include "ext4.h"</div><div class='head'>diff --git a/fs/ext4/indirect.c b/fs/ext4/indirect.c<br/>index 98be6f69746..b8d5d351e24 100644<br/>--- a/<a href='/linux/tree/fs/ext4/indirect.c?h=v3.12.17&amp;id=9affd6becbfb2c3f0d04e554bb87234761b37aba'>fs/ext4/indirect.c</a><br/>+++ b/<a href='/linux/tree/fs/ext4/indirect.c?h=v3.12.17&amp;id=5af43c24ca59a448c9312dd4a4a51d27ec3b9a73'>fs/ext4/indirect.c</a></div><div class='hunk'>@@ -20,6 +20,7 @@</div><div class='ctx'>  *	(sct@redhat.com), 1993, 1998</div><div class='ctx'>  */</div><div class='ctx'> </div><div class='add'>+#include &lt;linux/aio.h&gt;</div><div class='ctx'> #include "ext4_jbd2.h"</div><div class='ctx'> #include "truncate.h"</div><div class='ctx'> #include "ext4_extents.h"	/* Needed for EXT_MAX_BLOCKS */</div><div class='head'>diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c<br/>index 793d44b84d7..0723774bdfb 100644<br/>--- a/<a href='/linux/tree/fs/ext4/inode.c?h=v3.12.17&amp;id=9affd6becbfb2c3f0d04e554bb87234761b37aba'>fs/ext4/inode.c</a><br/>+++ b/<a href='/linux/tree/fs/ext4/inode.c?h=v3.12.17&amp;id=5af43c24ca59a448c9312dd4a4a51d27ec3b9a73'>fs/ext4/inode.c</a></div><div class='hunk'>@@ -37,6 +37,7 @@</div><div class='ctx'> #include &lt;linux/printk.h&gt;</div><div class='ctx'> #include &lt;linux/slab.h&gt;</div><div class='ctx'> #include &lt;linux/ratelimit.h&gt;</div><div class='add'>+#include &lt;linux/aio.h&gt;</div><div class='ctx'> </div><div class='ctx'> #include "ext4_jbd2.h"</div><div class='ctx'> #include "xattr.h"</div><div class='head'>diff --git a/fs/ext4/page-io.c b/fs/ext4/page-io.c<br/>index 5929cd0baa2..19599bded62 100644<br/>--- a/<a href='/linux/tree/fs/ext4/page-io.c?h=v3.12.17&amp;id=9affd6becbfb2c3f0d04e554bb87234761b37aba'>fs/ext4/page-io.c</a><br/>+++ b/<a href='/linux/tree/fs/ext4/page-io.c?h=v3.12.17&amp;id=5af43c24ca59a448c9312dd4a4a51d27ec3b9a73'>fs/ext4/page-io.c</a></div><div class='hunk'>@@ -18,6 +18,7 @@</div><div class='ctx'> #include &lt;linux/pagevec.h&gt;</div><div class='ctx'> #include &lt;linux/mpage.h&gt;</div><div class='ctx'> #include &lt;linux/namei.h&gt;</div><div class='add'>+#include &lt;linux/aio.h&gt;</div><div class='ctx'> #include &lt;linux/uio.h&gt;</div><div class='ctx'> #include &lt;linux/bio.h&gt;</div><div class='ctx'> #include &lt;linux/workqueue.h&gt;</div><div class='head'>diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c<br/>index 7bd22a20112..d0ed4ba4b61 100644<br/>--- a/<a href='/linux/tree/fs/f2fs/data.c?h=v3.12.17&amp;id=9affd6becbfb2c3f0d04e554bb87234761b37aba'>fs/f2fs/data.c</a><br/>+++ b/<a href='/linux/tree/fs/f2fs/data.c?h=v3.12.17&amp;id=5af43c24ca59a448c9312dd4a4a51d27ec3b9a73'>fs/f2fs/data.c</a></div><div class='hunk'>@@ -12,6 +12,7 @@</div><div class='ctx'> #include &lt;linux/f2fs_fs.h&gt;</div><div class='ctx'> #include &lt;linux/buffer_head.h&gt;</div><div class='ctx'> #include &lt;linux/mpage.h&gt;</div><div class='add'>+#include &lt;linux/aio.h&gt;</div><div class='ctx'> #include &lt;linux/writeback.h&gt;</div><div class='ctx'> #include &lt;linux/backing-dev.h&gt;</div><div class='ctx'> #include &lt;linux/blkdev.h&gt;</div><div class='head'>diff --git a/fs/fat/inode.c b/fs/fat/inode.c<br/>index 4ff901632b2..dfce656ddb3 100644<br/>--- a/<a href='/linux/tree/fs/fat/inode.c?h=v3.12.17&amp;id=9affd6becbfb2c3f0d04e554bb87234761b37aba'>fs/fat/inode.c</a><br/>+++ b/<a href='/linux/tree/fs/fat/inode.c?h=v3.12.17&amp;id=5af43c24ca59a448c9312dd4a4a51d27ec3b9a73'>fs/fat/inode.c</a></div><div class='hunk'>@@ -19,6 +19,7 @@</div><div class='ctx'> #include &lt;linux/mpage.h&gt;</div><div class='ctx'> #include &lt;linux/buffer_head.h&gt;</div><div class='ctx'> #include &lt;linux/mount.h&gt;</div><div class='add'>+#include &lt;linux/aio.h&gt;</div><div class='ctx'> #include &lt;linux/vfs.h&gt;</div><div class='ctx'> #include &lt;linux/parser.h&gt;</div><div class='ctx'> #include &lt;linux/uio.h&gt;</div><div class='head'>diff --git a/fs/fuse/cuse.c b/fs/fuse/cuse.c<br/>index b3aaf7b3578..aef34b1e635 100644<br/>--- a/<a href='/linux/tree/fs/fuse/cuse.c?h=v3.12.17&amp;id=9affd6becbfb2c3f0d04e554bb87234761b37aba'>fs/fuse/cuse.c</a><br/>+++ b/<a href='/linux/tree/fs/fuse/cuse.c?h=v3.12.17&amp;id=5af43c24ca59a448c9312dd4a4a51d27ec3b9a73'>fs/fuse/cuse.c</a></div><div class='hunk'>@@ -38,6 +38,7 @@</div><div class='ctx'> #include &lt;linux/device.h&gt;</div><div class='ctx'> #include &lt;linux/file.h&gt;</div><div class='ctx'> #include &lt;linux/fs.h&gt;</div><div class='add'>+#include &lt;linux/aio.h&gt;</div><div class='ctx'> #include &lt;linux/kdev_t.h&gt;</div><div class='ctx'> #include &lt;linux/kthread.h&gt;</div><div class='ctx'> #include &lt;linux/list.h&gt;</div><div class='head'>diff --git a/fs/fuse/dev.c b/fs/fuse/dev.c<br/>index a6c1664e330..1d55f946540 100644<br/>--- a/<a href='/linux/tree/fs/fuse/dev.c?h=v3.12.17&amp;id=9affd6becbfb2c3f0d04e554bb87234761b37aba'>fs/fuse/dev.c</a><br/>+++ b/<a href='/linux/tree/fs/fuse/dev.c?h=v3.12.17&amp;id=5af43c24ca59a448c9312dd4a4a51d27ec3b9a73'>fs/fuse/dev.c</a></div><div class='hunk'>@@ -19,6 +19,7 @@</div><div class='ctx'> #include &lt;linux/pipe_fs_i.h&gt;</div><div class='ctx'> #include &lt;linux/swap.h&gt;</div><div class='ctx'> #include &lt;linux/splice.h&gt;</div><div class='add'>+#include &lt;linux/aio.h&gt;</div><div class='ctx'> </div><div class='ctx'> MODULE_ALIAS_MISCDEV(FUSE_MINOR);</div><div class='ctx'> MODULE_ALIAS("devname:fuse");</div><div class='head'>diff --git a/fs/fuse/file.c b/fs/fuse/file.c<br/>index 4655e59d545..d1c9b85b3f5 100644<br/>--- a/<a href='/linux/tree/fs/fuse/file.c?h=v3.12.17&amp;id=9affd6becbfb2c3f0d04e554bb87234761b37aba'>fs/fuse/file.c</a><br/>+++ b/<a href='/linux/tree/fs/fuse/file.c?h=v3.12.17&amp;id=5af43c24ca59a448c9312dd4a4a51d27ec3b9a73'>fs/fuse/file.c</a></div><div class='hunk'>@@ -15,6 +15,7 @@</div><div class='ctx'> #include &lt;linux/module.h&gt;</div><div class='ctx'> #include &lt;linux/compat.h&gt;</div><div class='ctx'> #include &lt;linux/swap.h&gt;</div><div class='add'>+#include &lt;linux/aio.h&gt;</div><div class='ctx'> </div><div class='ctx'> static const struct file_operations fuse_direct_io_file_operations;</div><div class='ctx'> </div><div class='head'>diff --git a/fs/gfs2/aops.c b/fs/gfs2/aops.c<br/>index 9883694f1e7..0bad69ed633 100644<br/>--- a/<a href='/linux/tree/fs/gfs2/aops.c?h=v3.12.17&amp;id=9affd6becbfb2c3f0d04e554bb87234761b37aba'>fs/gfs2/aops.c</a><br/>+++ b/<a href='/linux/tree/fs/gfs2/aops.c?h=v3.12.17&amp;id=5af43c24ca59a448c9312dd4a4a51d27ec3b9a73'>fs/gfs2/aops.c</a></div><div class='hunk'>@@ -20,6 +20,7 @@</div><div class='ctx'> #include &lt;linux/swap.h&gt;</div><div class='ctx'> #include &lt;linux/gfs2_ondisk.h&gt;</div><div class='ctx'> #include &lt;linux/backing-dev.h&gt;</div><div class='add'>+#include &lt;linux/aio.h&gt;</div><div class='ctx'> </div><div class='ctx'> #include "gfs2.h"</div><div class='ctx'> #include "incore.h"</div><div class='head'>diff --git a/fs/gfs2/file.c b/fs/gfs2/file.c<br/>index d79c2dadc53..acd16764b13 100644<br/>--- a/<a href='/linux/tree/fs/gfs2/file.c?h=v3.12.17&amp;id=9affd6becbfb2c3f0d04e554bb87234761b37aba'>fs/gfs2/file.c</a><br/>+++ b/<a href='/linux/tree/fs/gfs2/file.c?h=v3.12.17&amp;id=5af43c24ca59a448c9312dd4a4a51d27ec3b9a73'>fs/gfs2/file.c</a></div><div class='hunk'>@@ -25,6 +25,7 @@</div><div class='ctx'> #include &lt;asm/uaccess.h&gt;</div><div class='ctx'> #include &lt;linux/dlm.h&gt;</div><div class='ctx'> #include &lt;linux/dlm_plock.h&gt;</div><div class='add'>+#include &lt;linux/aio.h&gt;</div><div class='ctx'> </div><div class='ctx'> #include "gfs2.h"</div><div class='ctx'> #include "incore.h"</div><div class='head'>diff --git a/fs/hfs/inode.c b/fs/hfs/inode.c<br/>index 716e1aafb2e..f9299d8a64e 100644<br/>--- a/<a href='/linux/tree/fs/hfs/inode.c?h=v3.12.17&amp;id=9affd6becbfb2c3f0d04e554bb87234761b37aba'>fs/hfs/inode.c</a><br/>+++ b/<a href='/linux/tree/fs/hfs/inode.c?h=v3.12.17&amp;id=5af43c24ca59a448c9312dd4a4a51d27ec3b9a73'>fs/hfs/inode.c</a></div><div class='hunk'>@@ -14,6 +14,7 @@</div><div class='ctx'> #include &lt;linux/pagemap.h&gt;</div><div class='ctx'> #include &lt;linux/mpage.h&gt;</div><div class='ctx'> #include &lt;linux/sched.h&gt;</div><div class='add'>+#include &lt;linux/aio.h&gt;</div><div class='ctx'> </div><div class='ctx'> #include "hfs_fs.h"</div><div class='ctx'> #include "btree.h"</div><div class='head'>diff --git a/fs/hfsplus/inode.c b/fs/hfsplus/inode.c<br/>index 7faaa964968..f833d35630a 100644<br/>--- a/<a href='/linux/tree/fs/hfsplus/inode.c?h=v3.12.17&amp;id=9affd6becbfb2c3f0d04e554bb87234761b37aba'>fs/hfsplus/inode.c</a><br/>+++ b/<a href='/linux/tree/fs/hfsplus/inode.c?h=v3.12.17&amp;id=5af43c24ca59a448c9312dd4a4a51d27ec3b9a73'>fs/hfsplus/inode.c</a></div><div class='hunk'>@@ -14,6 +14,7 @@</div><div class='ctx'> #include &lt;linux/pagemap.h&gt;</div><div class='ctx'> #include &lt;linux/mpage.h&gt;</div><div class='ctx'> #include &lt;linux/sched.h&gt;</div><div class='add'>+#include &lt;linux/aio.h&gt;</div><div class='ctx'> </div><div class='ctx'> #include "hfsplus_fs.h"</div><div class='ctx'> #include "hfsplus_raw.h"</div><div class='head'>diff --git a/fs/hugetlbfs/inode.c b/fs/hugetlbfs/inode.c