Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge commit 'v2.6.39-rc7' into perf/core

Merge reason: pull in the latest fixes.

Signed-off-by: Ingo Molnar <mingo@elte.hu>

+4441 -2319
+1
Documentation/DocBook/media-entities.tmpl
··· 294 294 <!ENTITY sub-srggb10 SYSTEM "v4l/pixfmt-srggb10.xml"> 295 295 <!ENTITY sub-srggb8 SYSTEM "v4l/pixfmt-srggb8.xml"> 296 296 <!ENTITY sub-y10 SYSTEM "v4l/pixfmt-y10.xml"> 297 + <!ENTITY sub-y12 SYSTEM "v4l/pixfmt-y12.xml"> 297 298 <!ENTITY sub-pixfmt SYSTEM "v4l/pixfmt.xml"> 298 299 <!ENTITY sub-cropcap SYSTEM "v4l/vidioc-cropcap.xml"> 299 300 <!ENTITY sub-dbg-g-register SYSTEM "v4l/vidioc-dbg-g-register.xml">
+1 -1
Documentation/DocBook/v4l/media-ioc-setup-link.xml
··· 34 34 <varlistentry> 35 35 <term><parameter>request</parameter></term> 36 36 <listitem> 37 - <para>MEDIA_IOC_ENUM_LINKS</para> 37 + <para>MEDIA_IOC_SETUP_LINK</para> 38 38 </listitem> 39 39 </varlistentry> 40 40 <varlistentry>
+79
Documentation/DocBook/v4l/pixfmt-y12.xml
··· 1 + <refentry id="V4L2-PIX-FMT-Y12"> 2 + <refmeta> 3 + <refentrytitle>V4L2_PIX_FMT_Y12 ('Y12 ')</refentrytitle> 4 + &manvol; 5 + </refmeta> 6 + <refnamediv> 7 + <refname><constant>V4L2_PIX_FMT_Y12</constant></refname> 8 + <refpurpose>Grey-scale image</refpurpose> 9 + </refnamediv> 10 + <refsect1> 11 + <title>Description</title> 12 + 13 + <para>This is a grey-scale image with a depth of 12 bits per pixel. Pixels 14 + are stored in 16-bit words with unused high bits padded with 0. The least 15 + significant byte is stored at lower memory addresses (little-endian).</para> 16 + 17 + <example> 18 + <title><constant>V4L2_PIX_FMT_Y12</constant> 4 &times; 4 19 + pixel image</title> 20 + 21 + <formalpara> 22 + <title>Byte Order.</title> 23 + <para>Each cell is one byte. 24 + <informaltable frame="none"> 25 + <tgroup cols="9" align="center"> 26 + <colspec align="left" colwidth="2*" /> 27 + <tbody valign="top"> 28 + <row> 29 + <entry>start&nbsp;+&nbsp;0:</entry> 30 + <entry>Y'<subscript>00low</subscript></entry> 31 + <entry>Y'<subscript>00high</subscript></entry> 32 + <entry>Y'<subscript>01low</subscript></entry> 33 + <entry>Y'<subscript>01high</subscript></entry> 34 + <entry>Y'<subscript>02low</subscript></entry> 35 + <entry>Y'<subscript>02high</subscript></entry> 36 + <entry>Y'<subscript>03low</subscript></entry> 37 + <entry>Y'<subscript>03high</subscript></entry> 38 + </row> 39 + <row> 40 + <entry>start&nbsp;+&nbsp;8:</entry> 41 + <entry>Y'<subscript>10low</subscript></entry> 42 + <entry>Y'<subscript>10high</subscript></entry> 43 + <entry>Y'<subscript>11low</subscript></entry> 44 + <entry>Y'<subscript>11high</subscript></entry> 45 + <entry>Y'<subscript>12low</subscript></entry> 46 + <entry>Y'<subscript>12high</subscript></entry> 47 + <entry>Y'<subscript>13low</subscript></entry> 48 + <entry>Y'<subscript>13high</subscript></entry> 49 + </row> 50 + <row> 51 + <entry>start&nbsp;+&nbsp;16:</entry> 52 + <entry>Y'<subscript>20low</subscript></entry> 53 + <entry>Y'<subscript>20high</subscript></entry> 54 + <entry>Y'<subscript>21low</subscript></entry> 55 + <entry>Y'<subscript>21high</subscript></entry> 56 + <entry>Y'<subscript>22low</subscript></entry> 57 + <entry>Y'<subscript>22high</subscript></entry> 58 + <entry>Y'<subscript>23low</subscript></entry> 59 + <entry>Y'<subscript>23high</subscript></entry> 60 + </row> 61 + <row> 62 + <entry>start&nbsp;+&nbsp;24:</entry> 63 + <entry>Y'<subscript>30low</subscript></entry> 64 + <entry>Y'<subscript>30high</subscript></entry> 65 + <entry>Y'<subscript>31low</subscript></entry> 66 + <entry>Y'<subscript>31high</subscript></entry> 67 + <entry>Y'<subscript>32low</subscript></entry> 68 + <entry>Y'<subscript>32high</subscript></entry> 69 + <entry>Y'<subscript>33low</subscript></entry> 70 + <entry>Y'<subscript>33high</subscript></entry> 71 + </row> 72 + </tbody> 73 + </tgroup> 74 + </informaltable> 75 + </para> 76 + </formalpara> 77 + </example> 78 + </refsect1> 79 + </refentry>
+1
Documentation/DocBook/v4l/pixfmt.xml
··· 696 696 &sub-packed-yuv; 697 697 &sub-grey; 698 698 &sub-y10; 699 + &sub-y12; 699 700 &sub-y16; 700 701 &sub-yuyv; 701 702 &sub-uyvy;
+59
Documentation/DocBook/v4l/subdev-formats.xml
··· 456 456 <entry>b<subscript>1</subscript></entry> 457 457 <entry>b<subscript>0</subscript></entry> 458 458 </row> 459 + <row id="V4L2-MBUS-FMT-SGBRG8-1X8"> 460 + <entry>V4L2_MBUS_FMT_SGBRG8_1X8</entry> 461 + <entry>0x3013</entry> 462 + <entry></entry> 463 + <entry>-</entry> 464 + <entry>-</entry> 465 + <entry>-</entry> 466 + <entry>-</entry> 467 + <entry>g<subscript>7</subscript></entry> 468 + <entry>g<subscript>6</subscript></entry> 469 + <entry>g<subscript>5</subscript></entry> 470 + <entry>g<subscript>4</subscript></entry> 471 + <entry>g<subscript>3</subscript></entry> 472 + <entry>g<subscript>2</subscript></entry> 473 + <entry>g<subscript>1</subscript></entry> 474 + <entry>g<subscript>0</subscript></entry> 475 + </row> 459 476 <row id="V4L2-MBUS-FMT-SGRBG8-1X8"> 460 477 <entry>V4L2_MBUS_FMT_SGRBG8_1X8</entry> 461 478 <entry>0x3002</entry> ··· 489 472 <entry>g<subscript>2</subscript></entry> 490 473 <entry>g<subscript>1</subscript></entry> 491 474 <entry>g<subscript>0</subscript></entry> 475 + </row> 476 + <row id="V4L2-MBUS-FMT-SRGGB8-1X8"> 477 + <entry>V4L2_MBUS_FMT_SRGGB8_1X8</entry> 478 + <entry>0x3014</entry> 479 + <entry></entry> 480 + <entry>-</entry> 481 + <entry>-</entry> 482 + <entry>-</entry> 483 + <entry>-</entry> 484 + <entry>r<subscript>7</subscript></entry> 485 + <entry>r<subscript>6</subscript></entry> 486 + <entry>r<subscript>5</subscript></entry> 487 + <entry>r<subscript>4</subscript></entry> 488 + <entry>r<subscript>3</subscript></entry> 489 + <entry>r<subscript>2</subscript></entry> 490 + <entry>r<subscript>1</subscript></entry> 491 + <entry>r<subscript>0</subscript></entry> 492 492 </row> 493 493 <row id="V4L2-MBUS-FMT-SBGGR10-DPCM8-1X8"> 494 494 <entry>V4L2_MBUS_FMT_SBGGR10_DPCM8_1X8</entry> ··· 2192 2158 <entry>u<subscript>2</subscript></entry> 2193 2159 <entry>u<subscript>1</subscript></entry> 2194 2160 <entry>u<subscript>0</subscript></entry> 2161 + </row> 2162 + <row id="V4L2-MBUS-FMT-Y12-1X12"> 2163 + <entry>V4L2_MBUS_FMT_Y12_1X12</entry> 2164 + <entry>0x2013</entry> 2165 + <entry></entry> 2166 + <entry>-</entry> 2167 + <entry>-</entry> 2168 + <entry>-</entry> 2169 + <entry>-</entry> 2170 + <entry>-</entry> 2171 + <entry>-</entry> 2172 + <entry>-</entry> 2173 + <entry>-</entry> 2174 + <entry>y<subscript>11</subscript></entry> 2175 + <entry>y<subscript>10</subscript></entry> 2176 + <entry>y<subscript>9</subscript></entry> 2177 + <entry>y<subscript>8</subscript></entry> 2178 + <entry>y<subscript>7</subscript></entry> 2179 + <entry>y<subscript>6</subscript></entry> 2180 + <entry>y<subscript>5</subscript></entry> 2181 + <entry>y<subscript>4</subscript></entry> 2182 + <entry>y<subscript>3</subscript></entry> 2183 + <entry>y<subscript>2</subscript></entry> 2184 + <entry>y<subscript>1</subscript></entry> 2185 + <entry>y<subscript>0</subscript></entry> 2195 2186 </row> 2196 2187 <row id="V4L2-MBUS-FMT-UYVY8-1X16"> 2197 2188 <entry>V4L2_MBUS_FMT_UYVY8_1X16</entry>
+13 -2
Documentation/cgroups/memory.txt
··· 52 52 tasks # attach a task(thread) and show list of threads 53 53 cgroup.procs # show list of processes 54 54 cgroup.event_control # an interface for event_fd() 55 - memory.usage_in_bytes # show current memory(RSS+Cache) usage. 56 - memory.memsw.usage_in_bytes # show current memory+Swap usage 55 + memory.usage_in_bytes # show current res_counter usage for memory 56 + (See 5.5 for details) 57 + memory.memsw.usage_in_bytes # show current res_counter usage for memory+Swap 58 + (See 5.5 for details) 57 59 memory.limit_in_bytes # set/show limit of memory usage 58 60 memory.memsw.limit_in_bytes # set/show limit of memory+Swap usage 59 61 memory.failcnt # show the number of memory usage hits limits ··· 454 452 455 453 You can reset failcnt by writing 0 to failcnt file. 456 454 # echo 0 > .../memory.failcnt 455 + 456 + 5.5 usage_in_bytes 457 + 458 + For efficiency, as other kernel components, memory cgroup uses some optimization 459 + to avoid unnecessary cacheline false sharing. usage_in_bytes is affected by the 460 + method and doesn't show 'exact' value of memory(and swap) usage, it's an fuzz 461 + value for efficient access. (Of course, when necessary, it's synchronized.) 462 + If you want to know more exact memory usage, you should use RSS+CACHE(+SWAP) 463 + value in memory.stat(see 5.2). 457 464 458 465 6. Hierarchy support 459 466
+2 -2
Documentation/flexible-arrays.txt
··· 66 66 entering atomic context, using: 67 67 68 68 int flex_array_prealloc(struct flex_array *array, unsigned int start, 69 - unsigned int end, gfp_t flags); 69 + unsigned int nr_elements, gfp_t flags); 70 70 71 71 This function will ensure that memory for the elements indexed in the range 72 - defined by start and end has been allocated. Thereafter, a 72 + defined by start and nr_elements has been allocated. Thereafter, a 73 73 flex_array_put() call on an element in that range is guaranteed not to 74 74 block. 75 75
+19 -17
Documentation/hwmon/adm1021
··· 14 14 Prefix: 'gl523sm' 15 15 Addresses scanned: I2C 0x18 - 0x1a, 0x29 - 0x2b, 0x4c - 0x4e 16 16 Datasheet: 17 - * Intel Xeon Processor 18 - Prefix: - any other - may require 'force_adm1021' parameter 19 - Addresses scanned: none 20 - Datasheet: Publicly available at Intel website 21 17 * Maxim MAX1617 22 18 Prefix: 'max1617' 23 19 Addresses scanned: I2C 0x18 - 0x1a, 0x29 - 0x2b, 0x4c - 0x4e ··· 87 91 ADM1021-clones do faster measurements, but there is really no good reason 88 92 for that. 89 93 90 - Xeon support 91 - ------------ 92 94 93 - Some Xeon processors have real max1617, adm1021, or compatible chips 94 - within them, with two temperature sensors. 95 + Netburst-based Xeon support 96 + --------------------------- 95 97 96 - Other Xeons have chips with only one sensor. 98 + Some Xeon processors based on the Netburst (early Pentium 4, from 2001 to 99 + 2003) microarchitecture had real MAX1617, ADM1021, or compatible chips 100 + within them, with two temperature sensors. Other Xeon processors of this 101 + era (with 400 MHz FSB) had chips with only one temperature sensor. 97 102 98 - If you have a Xeon, and the adm1021 module loads, and both temperatures 99 - appear valid, then things are good. 103 + If you have such an old Xeon, and you get two valid temperatures when 104 + loading the adm1021 module, then things are good. 100 105 101 - If the adm1021 module doesn't load, you should try this: 102 - modprobe adm1021 force_adm1021=BUS,ADDRESS 103 - ADDRESS can only be 0x18, 0x1a, 0x29, 0x2b, 0x4c, or 0x4e. 106 + If nothing happens when loading the adm1021 module, and you are certain 107 + that your specific Xeon processor model includes compatible sensors, you 108 + will have to explicitly instantiate the sensor chips from user-space. See 109 + method 4 in Documentation/i2c/instantiating-devices. Possible slave 110 + addresses are 0x18, 0x1a, 0x29, 0x2b, 0x4c, or 0x4e. It is likely that 111 + only temp2 will be correct and temp1 will have to be ignored. 104 112 105 - If you have dual Xeons you may have appear to have two separate 106 - adm1021-compatible chips, or two single-temperature sensors, at distinct 107 - addresses. 113 + Previous generations of the Xeon processor (based on Pentium II/III) 114 + didn't have these sensors. Next generations of Xeon processors (533 MHz 115 + FSB and faster) lost them, until the Core-based generation which 116 + introduced integrated digital thermal sensors. These are supported by 117 + the coretemp driver.
+20 -9
Documentation/hwmon/lm90
··· 32 32 Addresses scanned: I2C 0x4c and 0x4d 33 33 Datasheet: Publicly available at the ON Semiconductor website 34 34 http://www.onsemi.com/PowerSolutions/product.do?id=ADT7461 35 + * Analog Devices ADT7461A 36 + Prefix: 'adt7461a' 37 + Addresses scanned: I2C 0x4c and 0x4d 38 + Datasheet: Publicly available at the ON Semiconductor website 39 + http://www.onsemi.com/PowerSolutions/product.do?id=ADT7461A 40 + * ON Semiconductor NCT1008 41 + Prefix: 'nct1008' 42 + Addresses scanned: I2C 0x4c and 0x4d 43 + Datasheet: Publicly available at the ON Semiconductor website 44 + http://www.onsemi.com/PowerSolutions/product.do?id=NCT1008 35 45 * Maxim MAX6646 36 46 Prefix: 'max6646' 37 47 Addresses scanned: I2C 0x4d ··· 159 149 * ALERT is triggered by open remote sensor. 160 150 * SMBus PEC support for Write Byte and Receive Byte transactions. 161 151 162 - ADT7461: 152 + ADT7461, ADT7461A, NCT1008: 163 153 * Extended temperature range (breaks compatibility) 164 154 * Lower resolution for remote temperature 165 155 ··· 205 195 Only the local hysteresis can be set from user-space, and the same delta 206 196 applies to the remote hysteresis. 207 197 208 - The lm90 driver will not update its values more frequently than every 209 - other second; reading them more often will do no harm, but will return 210 - 'old' values. 198 + The lm90 driver will not update its values more frequently than configured with 199 + the update_interval attribute; reading them more often will do no harm, but will 200 + return 'old' values. 211 201 212 202 SMBus Alert Support 213 203 ------------------- ··· 215 205 This driver has basic support for SMBus alert. When an alert is received, 216 206 the status register is read and the faulty temperature channel is logged. 217 207 218 - The Analog Devices chips (ADM1032 and ADT7461) do not implement the SMBus 219 - alert protocol properly so additional care is needed: the ALERT output is 220 - disabled when an alert is received, and is re-enabled only when the alarm 221 - is gone. Otherwise the chip would block alerts from other chips in the bus 222 - as long as the alarm is active. 208 + The Analog Devices chips (ADM1032, ADT7461 and ADT7461A) and ON 209 + Semiconductor chips (NCT1008) do not implement the SMBus alert protocol 210 + properly so additional care is needed: the ALERT output is disabled when 211 + an alert is received, and is re-enabled only when the alarm is gone. 212 + Otherwise the chip would block alerts from other chips in the bus as long 213 + as the alarm is active. 223 214 224 215 PEC Support 225 216 -----------
+3 -3
Documentation/video4linux/sh_mobile_ceu_camera.txt
··· 37 37 -1'- 38 38 39 39 In the above chart minuses and slashes represent "real" data amounts, points and 40 - accents represent "useful" data, basically, CEU scaled amd cropped output, 40 + accents represent "useful" data, basically, CEU scaled and cropped output, 41 41 mapped back onto the client's source plane. 42 42 43 43 Such a configuration can be produced by user requests: ··· 65 65 66 66 1. Calculate current sensor scales: 67 67 68 - scale_s = ((3') - (3)) / ((2') - (2)) 68 + scale_s = ((2') - (2)) / ((3') - (3)) 69 69 70 70 2. Calculate "effective" input crop (sensor subwindow) - CEU crop scaled back at 71 71 current sensor scales onto input window - this is user S_CROP: ··· 80 80 4. Calculate sensor output window by applying combined scales to real input 81 81 window: 82 82 83 - width_s_out = ((2') - (2)) / scale_comb 83 + width_s_out = ((7') - (7)) = ((2') - (2)) / scale_comb 84 84 85 85 5. Apply iterative sensor S_FMT for sensor output window. 86 86
+40
Documentation/workqueue.txt
··· 12 12 4. Application Programming Interface (API) 13 13 5. Example Execution Scenarios 14 14 6. Guidelines 15 + 7. Debugging 15 16 16 17 17 18 1. Introduction ··· 380 379 * Unless work items are expected to consume a huge amount of CPU 381 380 cycles, using a bound wq is usually beneficial due to the increased 382 381 level of locality in wq operations and work item execution. 382 + 383 + 384 + 7. Debugging 385 + 386 + Because the work functions are executed by generic worker threads 387 + there are a few tricks needed to shed some light on misbehaving 388 + workqueue users. 389 + 390 + Worker threads show up in the process list as: 391 + 392 + root 5671 0.0 0.0 0 0 ? S 12:07 0:00 [kworker/0:1] 393 + root 5672 0.0 0.0 0 0 ? S 12:07 0:00 [kworker/1:2] 394 + root 5673 0.0 0.0 0 0 ? S 12:12 0:00 [kworker/0:0] 395 + root 5674 0.0 0.0 0 0 ? S 12:13 0:00 [kworker/1:0] 396 + 397 + If kworkers are going crazy (using too much cpu), there are two types 398 + of possible problems: 399 + 400 + 1. Something beeing scheduled in rapid succession 401 + 2. A single work item that consumes lots of cpu cycles 402 + 403 + The first one can be tracked using tracing: 404 + 405 + $ echo workqueue:workqueue_queue_work > /sys/kernel/debug/tracing/set_event 406 + $ cat /sys/kernel/debug/tracing/trace_pipe > out.txt 407 + (wait a few secs) 408 + ^C 409 + 410 + If something is busy looping on work queueing, it would be dominating 411 + the output and the offender can be determined with the work item 412 + function. 413 + 414 + For the second type of problems it should be possible to just check 415 + the stack trace of the offending worker thread. 416 + 417 + $ cat /proc/THE_OFFENDING_KWORKER/stack 418 + 419 + The work item's function should be trivially visible in the stack 420 + trace.
+16 -15
MAINTAINERS
··· 1032 1032 S: Maintained 1033 1033 F: arch/arm/mach-s3c64xx/ 1034 1034 1035 - ARM/S5P ARM ARCHITECTURES 1035 + ARM/S5P EXYNOS ARM ARCHITECTURES 1036 1036 M: Kukjin Kim <kgene.kim@samsung.com> 1037 1037 L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) 1038 1038 L: linux-samsung-soc@vger.kernel.org (moderated for non-subscribers) 1039 1039 S: Maintained 1040 1040 F: arch/arm/mach-s5p*/ 1041 + F: arch/arm/mach-exynos*/ 1041 1042 1042 1043 ARM/SAMSUNG MOBILE MACHINE SUPPORT 1043 1044 M: Kyungmin Park <kyungmin.park@samsung.com> ··· 2809 2808 M: Grant Likely <grant.likely@secretlab.ca> 2810 2809 S: Maintained 2811 2810 T: git git://git.secretlab.ca/git/linux-2.6.git 2812 - F: Documentation/gpio/gpio.txt 2811 + F: Documentation/gpio.txt 2813 2812 F: drivers/gpio/ 2814 2813 F: include/linux/gpio* 2815 2814 ··· 6556 6555 F: drivers/usb/host/uhci* 6557 6556 6558 6557 USB "USBNET" DRIVER FRAMEWORK 6559 - M: David Brownell <dbrownell@users.sourceforge.net> 6558 + M: Oliver Neukum <oneukum@suse.de> 6560 6559 L: netdev@vger.kernel.org 6561 6560 W: http://www.linux-usb.org/usbnet 6562 6561 S: Maintained ··· 6922 6921 S: Maintained 6923 6922 F: drivers/platform/x86 6924 6923 6924 + XEN HYPERVISOR INTERFACE 6925 + M: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com> 6926 + M: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> 6927 + L: xen-devel@lists.xensource.com (moderated for non-subscribers) 6928 + L: virtualization@lists.linux-foundation.org 6929 + S: Supported 6930 + F: arch/x86/xen/ 6931 + F: drivers/*/xen-*front.c 6932 + F: drivers/xen/ 6933 + F: arch/x86/include/asm/xen/ 6934 + F: include/xen/ 6935 + 6925 6936 XEN NETWORK BACKEND DRIVER 6926 6937 M: Ian Campbell <ian.campbell@citrix.com> 6927 6938 L: xen-devel@lists.xensource.com (moderated for non-subscribers) ··· 6954 6941 S: Supported 6955 6942 F: arch/x86/xen/*swiotlb* 6956 6943 F: drivers/xen/*swiotlb* 6957 - 6958 - XEN HYPERVISOR INTERFACE 6959 - M: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com> 6960 - M: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> 6961 - L: xen-devel@lists.xensource.com (moderated for non-subscribers) 6962 - L: virtualization@lists.linux-foundation.org 6963 - S: Supported 6964 - F: arch/x86/xen/ 6965 - F: drivers/*/xen-*front.c 6966 - F: drivers/xen/ 6967 - F: arch/x86/include/asm/xen/ 6968 - F: include/xen/ 6969 6944 6970 6945 XFS FILESYSTEM 6971 6946 P: Silicon Graphics Inc
+1 -1
Makefile
··· 1 1 VERSION = 2 2 2 PATCHLEVEL = 6 3 3 SUBLEVEL = 39 4 - EXTRAVERSION = -rc4 4 + EXTRAVERSION = -rc7 5 5 NAME = Flesh-Eating Bats with Fangs 6 6 7 7 # *DOCUMENTATION*
+48
arch/arm/configs/at91x40_defconfig
··· 1 + CONFIG_EXPERIMENTAL=y 2 + CONFIG_LOG_BUF_SHIFT=14 3 + CONFIG_EMBEDDED=y 4 + # CONFIG_HOTPLUG is not set 5 + # CONFIG_ELF_CORE is not set 6 + # CONFIG_FUTEX is not set 7 + # CONFIG_TIMERFD is not set 8 + # CONFIG_VM_EVENT_COUNTERS is not set 9 + # CONFIG_COMPAT_BRK is not set 10 + CONFIG_SLAB=y 11 + # CONFIG_LBDAF is not set 12 + # CONFIG_BLK_DEV_BSG is not set 13 + # CONFIG_IOSCHED_DEADLINE is not set 14 + # CONFIG_IOSCHED_CFQ is not set 15 + # CONFIG_MMU is not set 16 + CONFIG_ARCH_AT91=y 17 + CONFIG_ARCH_AT91X40=y 18 + CONFIG_MACH_AT91EB01=y 19 + CONFIG_AT91_EARLY_USART0=y 20 + CONFIG_CPU_ARM7TDMI=y 21 + CONFIG_SET_MEM_PARAM=y 22 + CONFIG_DRAM_BASE=0x01000000 23 + CONFIG_DRAM_SIZE=0x00400000 24 + CONFIG_FLASH_MEM_BASE=0x01400000 25 + CONFIG_PROCESSOR_ID=0x14000040 26 + CONFIG_ZBOOT_ROM_TEXT=0x0 27 + CONFIG_ZBOOT_ROM_BSS=0x0 28 + CONFIG_BINFMT_FLAT=y 29 + # CONFIG_SUSPEND is not set 30 + # CONFIG_FW_LOADER is not set 31 + CONFIG_MTD=y 32 + CONFIG_MTD_PARTITIONS=y 33 + CONFIG_MTD_CHAR=y 34 + CONFIG_MTD_BLOCK=y 35 + CONFIG_MTD_RAM=y 36 + CONFIG_MTD_ROM=y 37 + CONFIG_BLK_DEV_RAM=y 38 + # CONFIG_INPUT is not set 39 + # CONFIG_SERIO is not set 40 + # CONFIG_VT is not set 41 + # CONFIG_DEVKMEM is not set 42 + # CONFIG_HW_RANDOM is not set 43 + # CONFIG_HWMON is not set 44 + # CONFIG_USB_SUPPORT is not set 45 + CONFIG_EXT2_FS=y 46 + # CONFIG_DNOTIFY is not set 47 + CONFIG_ROMFS_FS=y 48 + # CONFIG_ENABLE_MUST_CHECK is not set
+3
arch/arm/include/asm/kprobes.h
··· 39 39 struct kprobe; 40 40 typedef void (kprobe_insn_handler_t)(struct kprobe *, struct pt_regs *); 41 41 42 + typedef unsigned long (kprobe_check_cc)(unsigned long); 43 + 42 44 /* Architecture specific copy of original instruction. */ 43 45 struct arch_specific_insn { 44 46 kprobe_opcode_t *insn; 45 47 kprobe_insn_handler_t *insn_handler; 48 + kprobe_check_cc *insn_check_cc; 46 49 }; 47 50 48 51 struct prev_kprobe {
+465 -328
arch/arm/kernel/kprobes-decode.c
··· 34 34 * 35 35 * *) If the PC is written to by the instruction, the 36 36 * instruction must be fully simulated in software. 37 - * If it is a conditional instruction, the handler 38 - * will use insn[0] to copy its condition code to 39 - * set r0 to 1 and insn[1] to "mov pc, lr" to return. 40 37 * 41 38 * *) Otherwise, a modified form of the instruction is 42 39 * directly executed. Its handler calls the ··· 65 68 66 69 #define branch_displacement(insn) sign_extend(((insn) & 0xffffff) << 2, 25) 67 70 71 + #define is_r15(insn, bitpos) (((insn) & (0xf << bitpos)) == (0xf << bitpos)) 72 + 73 + /* 74 + * Test if load/store instructions writeback the address register. 75 + * if P (bit 24) == 0 or W (bit 21) == 1 76 + */ 77 + #define is_writeback(insn) ((insn ^ 0x01000000) & 0x01200000) 78 + 68 79 #define PSR_fs (PSR_f|PSR_s) 69 80 70 81 #define KPROBE_RETURN_INSTRUCTION 0xe1a0f00e /* mov pc, lr */ 71 - #define SET_R0_TRUE_INSTRUCTION 0xe3a00001 /* mov r0, #1 */ 72 - 73 - #define truecc_insn(insn) (((insn) & 0xf0000000) | \ 74 - (SET_R0_TRUE_INSTRUCTION & 0x0fffffff)) 75 82 76 83 typedef long (insn_0arg_fn_t)(void); 77 84 typedef long (insn_1arg_fn_t)(long); ··· 420 419 421 420 static void __kprobes simulate_bbl(struct kprobe *p, struct pt_regs *regs) 422 421 { 423 - insn_1arg_fn_t *i_fn = (insn_1arg_fn_t *)&p->ainsn.insn[0]; 424 422 kprobe_opcode_t insn = p->opcode; 425 423 long iaddr = (long)p->addr; 426 424 int disp = branch_displacement(insn); 427 - 428 - if (!insnslot_1arg_rflags(0, regs->ARM_cpsr, i_fn)) 429 - return; 430 425 431 426 if (insn & (1 << 24)) 432 427 regs->ARM_lr = iaddr + 4; ··· 443 446 444 447 static void __kprobes simulate_blx2bx(struct kprobe *p, struct pt_regs *regs) 445 448 { 446 - insn_1arg_fn_t *i_fn = (insn_1arg_fn_t *)&p->ainsn.insn[0]; 447 449 kprobe_opcode_t insn = p->opcode; 448 450 int rm = insn & 0xf; 449 451 long rmv = regs->uregs[rm]; 450 - 451 - if (!insnslot_1arg_rflags(0, regs->ARM_cpsr, i_fn)) 452 - return; 453 452 454 453 if (insn & (1 << 5)) 455 454 regs->ARM_lr = (long)p->addr + 4; ··· 456 463 regs->ARM_cpsr |= PSR_T_BIT; 457 464 } 458 465 466 + static void __kprobes simulate_mrs(struct kprobe *p, struct pt_regs *regs) 467 + { 468 + kprobe_opcode_t insn = p->opcode; 469 + int rd = (insn >> 12) & 0xf; 470 + unsigned long mask = 0xf8ff03df; /* Mask out execution state */ 471 + regs->uregs[rd] = regs->ARM_cpsr & mask; 472 + } 473 + 459 474 static void __kprobes simulate_ldm1stm1(struct kprobe *p, struct pt_regs *regs) 460 475 { 461 - insn_1arg_fn_t *i_fn = (insn_1arg_fn_t *)&p->ainsn.insn[0]; 462 476 kprobe_opcode_t insn = p->opcode; 463 477 int rn = (insn >> 16) & 0xf; 464 478 int lbit = insn & (1 << 20); ··· 475 475 long *addr = (long *)regs->uregs[rn]; 476 476 int reg_bit_vector; 477 477 int reg_count; 478 - 479 - if (!insnslot_1arg_rflags(0, regs->ARM_cpsr, i_fn)) 480 - return; 481 478 482 479 reg_count = 0; 483 480 reg_bit_vector = insn & 0xffff; ··· 507 510 508 511 static void __kprobes simulate_stm1_pc(struct kprobe *p, struct pt_regs *regs) 509 512 { 510 - insn_1arg_fn_t *i_fn = (insn_1arg_fn_t *)&p->ainsn.insn[0]; 511 - 512 - if (!insnslot_1arg_rflags(0, regs->ARM_cpsr, i_fn)) 513 - return; 514 - 515 513 regs->ARM_pc = (long)p->addr + str_pc_offset; 516 514 simulate_ldm1stm1(p, regs); 517 515 regs->ARM_pc = (long)p->addr + 4; ··· 517 525 regs->uregs[12] = regs->uregs[13]; 518 526 } 519 527 520 - static void __kprobes emulate_ldcstc(struct kprobe *p, struct pt_regs *regs) 521 - { 522 - insn_1arg_fn_t *i_fn = (insn_1arg_fn_t *)&p->ainsn.insn[0]; 523 - kprobe_opcode_t insn = p->opcode; 524 - int rn = (insn >> 16) & 0xf; 525 - long rnv = regs->uregs[rn]; 526 - 527 - /* Save Rn in case of writeback. */ 528 - regs->uregs[rn] = insnslot_1arg_rflags(rnv, regs->ARM_cpsr, i_fn); 529 - } 530 - 531 528 static void __kprobes emulate_ldrd(struct kprobe *p, struct pt_regs *regs) 532 529 { 533 530 insn_2arg_fn_t *i_fn = (insn_2arg_fn_t *)&p->ainsn.insn[0]; 534 531 kprobe_opcode_t insn = p->opcode; 532 + long ppc = (long)p->addr + 8; 535 533 int rd = (insn >> 12) & 0xf; 536 534 int rn = (insn >> 16) & 0xf; 537 535 int rm = insn & 0xf; /* rm may be invalid, don't care. */ 536 + long rmv = (rm == 15) ? ppc : regs->uregs[rm]; 537 + long rnv = (rn == 15) ? ppc : regs->uregs[rn]; 538 538 539 539 /* Not following the C calling convention here, so need asm(). */ 540 540 __asm__ __volatile__ ( ··· 538 554 "str r0, %[rn] \n\t" /* in case of writeback */ 539 555 "str r2, %[rd0] \n\t" 540 556 "str r3, %[rd1] \n\t" 541 - : [rn] "+m" (regs->uregs[rn]), 557 + : [rn] "+m" (rnv), 542 558 [rd0] "=m" (regs->uregs[rd]), 543 559 [rd1] "=m" (regs->uregs[rd+1]) 544 - : [rm] "m" (regs->uregs[rm]), 560 + : [rm] "m" (rmv), 545 561 [cpsr] "r" (regs->ARM_cpsr), 546 562 [i_fn] "r" (i_fn) 547 563 : "r0", "r1", "r2", "r3", "lr", "cc" 548 564 ); 565 + if (is_writeback(insn)) 566 + regs->uregs[rn] = rnv; 549 567 } 550 568 551 569 static void __kprobes emulate_strd(struct kprobe *p, struct pt_regs *regs) 552 570 { 553 571 insn_4arg_fn_t *i_fn = (insn_4arg_fn_t *)&p->ainsn.insn[0]; 554 572 kprobe_opcode_t insn = p->opcode; 573 + long ppc = (long)p->addr + 8; 555 574 int rd = (insn >> 12) & 0xf; 556 575 int rn = (insn >> 16) & 0xf; 557 576 int rm = insn & 0xf; 558 - long rnv = regs->uregs[rn]; 559 - long rmv = regs->uregs[rm]; /* rm/rmv may be invalid, don't care. */ 577 + long rnv = (rn == 15) ? ppc : regs->uregs[rn]; 578 + /* rm/rmv may be invalid, don't care. */ 579 + long rmv = (rm == 15) ? ppc : regs->uregs[rm]; 580 + long rnv_wb; 560 581 561 - regs->uregs[rn] = insnslot_4arg_rflags(rnv, rmv, regs->uregs[rd], 582 + rnv_wb = insnslot_4arg_rflags(rnv, rmv, regs->uregs[rd], 562 583 regs->uregs[rd+1], 563 584 regs->ARM_cpsr, i_fn); 585 + if (is_writeback(insn)) 586 + regs->uregs[rn] = rnv_wb; 564 587 } 565 588 566 589 static void __kprobes emulate_ldr(struct kprobe *p, struct pt_regs *regs) ··· 621 630 regs->uregs[rn] = rnv_wb; /* Save Rn in case of writeback. */ 622 631 } 623 632 624 - static void __kprobes emulate_mrrc(struct kprobe *p, struct pt_regs *regs) 625 - { 626 - insn_llret_0arg_fn_t *i_fn = (insn_llret_0arg_fn_t *)&p->ainsn.insn[0]; 627 - kprobe_opcode_t insn = p->opcode; 628 - union reg_pair fnr; 629 - int rd = (insn >> 12) & 0xf; 630 - int rn = (insn >> 16) & 0xf; 631 - 632 - fnr.dr = insnslot_llret_0arg_rflags(regs->ARM_cpsr, i_fn); 633 - regs->uregs[rn] = fnr.r0; 634 - regs->uregs[rd] = fnr.r1; 635 - } 636 - 637 - static void __kprobes emulate_mcrr(struct kprobe *p, struct pt_regs *regs) 638 - { 639 - insn_2arg_fn_t *i_fn = (insn_2arg_fn_t *)&p->ainsn.insn[0]; 640 - kprobe_opcode_t insn = p->opcode; 641 - int rd = (insn >> 12) & 0xf; 642 - int rn = (insn >> 16) & 0xf; 643 - long rnv = regs->uregs[rn]; 644 - long rdv = regs->uregs[rd]; 645 - 646 - insnslot_2arg_rflags(rnv, rdv, regs->ARM_cpsr, i_fn); 647 - } 648 - 649 633 static void __kprobes emulate_sat(struct kprobe *p, struct pt_regs *regs) 650 634 { 651 635 insn_1arg_fn_t *i_fn = (insn_1arg_fn_t *)&p->ainsn.insn[0]; ··· 654 688 insnslot_0arg_rflags(regs->ARM_cpsr, i_fn); 655 689 } 656 690 657 - static void __kprobes emulate_rd12(struct kprobe *p, struct pt_regs *regs) 691 + static void __kprobes emulate_nop(struct kprobe *p, struct pt_regs *regs) 658 692 { 659 - insn_0arg_fn_t *i_fn = (insn_0arg_fn_t *)&p->ainsn.insn[0]; 693 + } 694 + 695 + static void __kprobes 696 + emulate_rd12_modify(struct kprobe *p, struct pt_regs *regs) 697 + { 698 + insn_1arg_fn_t *i_fn = (insn_1arg_fn_t *)&p->ainsn.insn[0]; 660 699 kprobe_opcode_t insn = p->opcode; 661 700 int rd = (insn >> 12) & 0xf; 701 + long rdv = regs->uregs[rd]; 662 702 663 - regs->uregs[rd] = insnslot_0arg_rflags(regs->ARM_cpsr, i_fn); 703 + regs->uregs[rd] = insnslot_1arg_rflags(rdv, regs->ARM_cpsr, i_fn); 664 704 } 665 705 666 - static void __kprobes emulate_ird12(struct kprobe *p, struct pt_regs *regs) 706 + static void __kprobes 707 + emulate_rd12rn0_modify(struct kprobe *p, struct pt_regs *regs) 667 708 { 668 - insn_1arg_fn_t *i_fn = (insn_1arg_fn_t *)&p->ainsn.insn[0]; 709 + insn_2arg_fn_t *i_fn = (insn_2arg_fn_t *)&p->ainsn.insn[0]; 669 710 kprobe_opcode_t insn = p->opcode; 670 - int ird = (insn >> 12) & 0xf; 671 - 672 - insnslot_1arg_rflags(regs->uregs[ird], regs->ARM_cpsr, i_fn); 673 - } 674 - 675 - static void __kprobes emulate_rn16(struct kprobe *p, struct pt_regs *regs) 676 - { 677 - insn_1arg_fn_t *i_fn = (insn_1arg_fn_t *)&p->ainsn.insn[0]; 678 - kprobe_opcode_t insn = p->opcode; 679 - int rn = (insn >> 16) & 0xf; 711 + int rd = (insn >> 12) & 0xf; 712 + int rn = insn & 0xf; 713 + long rdv = regs->uregs[rd]; 680 714 long rnv = regs->uregs[rn]; 681 715 682 - insnslot_1arg_rflags(rnv, regs->ARM_cpsr, i_fn); 716 + regs->uregs[rd] = insnslot_2arg_rflags(rdv, rnv, regs->ARM_cpsr, i_fn); 683 717 } 684 718 685 719 static void __kprobes emulate_rd12rm0(struct kprobe *p, struct pt_regs *regs) ··· 785 819 } 786 820 787 821 static void __kprobes 822 + emulate_alu_tests_imm(struct kprobe *p, struct pt_regs *regs) 823 + { 824 + insn_1arg_fn_t *i_fn = (insn_1arg_fn_t *)&p->ainsn.insn[0]; 825 + kprobe_opcode_t insn = p->opcode; 826 + int rn = (insn >> 16) & 0xf; 827 + long rnv = (rn == 15) ? (long)p->addr + 8 : regs->uregs[rn]; 828 + 829 + insnslot_1arg_rwflags(rnv, &regs->ARM_cpsr, i_fn); 830 + } 831 + 832 + static void __kprobes 788 833 emulate_alu_rflags(struct kprobe *p, struct pt_regs *regs) 789 834 { 790 835 insn_3arg_fn_t *i_fn = (insn_3arg_fn_t *)&p->ainsn.insn[0]; ··· 831 854 insnslot_3arg_rwflags(rnv, rmv, rsv, &regs->ARM_cpsr, i_fn); 832 855 } 833 856 857 + static void __kprobes 858 + emulate_alu_tests(struct kprobe *p, struct pt_regs *regs) 859 + { 860 + insn_3arg_fn_t *i_fn = (insn_3arg_fn_t *)&p->ainsn.insn[0]; 861 + kprobe_opcode_t insn = p->opcode; 862 + long ppc = (long)p->addr + 8; 863 + int rn = (insn >> 16) & 0xf; 864 + int rs = (insn >> 8) & 0xf; /* rs/rsv may be invalid, don't care. */ 865 + int rm = insn & 0xf; 866 + long rnv = (rn == 15) ? ppc : regs->uregs[rn]; 867 + long rmv = (rm == 15) ? ppc : regs->uregs[rm]; 868 + long rsv = regs->uregs[rs]; 869 + 870 + insnslot_3arg_rwflags(rnv, rmv, rsv, &regs->ARM_cpsr, i_fn); 871 + } 872 + 834 873 static enum kprobe_insn __kprobes 835 874 prep_emulate_ldr_str(kprobe_opcode_t insn, struct arch_specific_insn *asi) 836 875 { 837 - int ibit = (insn & (1 << 26)) ? 25 : 22; 876 + int not_imm = (insn & (1 << 26)) ? (insn & (1 << 25)) 877 + : (~insn & (1 << 22)); 878 + 879 + if (is_writeback(insn) && is_r15(insn, 16)) 880 + return INSN_REJECTED; /* Writeback to PC */ 838 881 839 882 insn &= 0xfff00fff; 840 883 insn |= 0x00001000; /* Rn = r0, Rd = r1 */ 841 - if (insn & (1 << ibit)) { 884 + if (not_imm) { 842 885 insn &= ~0xf; 843 886 insn |= 2; /* Rm = r2 */ 844 887 } ··· 868 871 } 869 872 870 873 static enum kprobe_insn __kprobes 874 + prep_emulate_rd12_modify(kprobe_opcode_t insn, struct arch_specific_insn *asi) 875 + { 876 + if (is_r15(insn, 12)) 877 + return INSN_REJECTED; /* Rd is PC */ 878 + 879 + insn &= 0xffff0fff; /* Rd = r0 */ 880 + asi->insn[0] = insn; 881 + asi->insn_handler = emulate_rd12_modify; 882 + return INSN_GOOD; 883 + } 884 + 885 + static enum kprobe_insn __kprobes 886 + prep_emulate_rd12rn0_modify(kprobe_opcode_t insn, 887 + struct arch_specific_insn *asi) 888 + { 889 + if (is_r15(insn, 12)) 890 + return INSN_REJECTED; /* Rd is PC */ 891 + 892 + insn &= 0xffff0ff0; /* Rd = r0 */ 893 + insn |= 0x00000001; /* Rn = r1 */ 894 + asi->insn[0] = insn; 895 + asi->insn_handler = emulate_rd12rn0_modify; 896 + return INSN_GOOD; 897 + } 898 + 899 + static enum kprobe_insn __kprobes 871 900 prep_emulate_rd12rm0(kprobe_opcode_t insn, struct arch_specific_insn *asi) 872 901 { 902 + if (is_r15(insn, 12)) 903 + return INSN_REJECTED; /* Rd is PC */ 904 + 873 905 insn &= 0xffff0ff0; /* Rd = r0, Rm = r0 */ 874 906 asi->insn[0] = insn; 875 907 asi->insn_handler = emulate_rd12rm0; ··· 906 880 } 907 881 908 882 static enum kprobe_insn __kprobes 909 - prep_emulate_rd12(kprobe_opcode_t insn, struct arch_specific_insn *asi) 910 - { 911 - insn &= 0xffff0fff; /* Rd = r0 */ 912 - asi->insn[0] = insn; 913 - asi->insn_handler = emulate_rd12; 914 - return INSN_GOOD; 915 - } 916 - 917 - static enum kprobe_insn __kprobes 918 883 prep_emulate_rd12rn16rm0_wflags(kprobe_opcode_t insn, 919 884 struct arch_specific_insn *asi) 920 885 { 886 + if (is_r15(insn, 12)) 887 + return INSN_REJECTED; /* Rd is PC */ 888 + 921 889 insn &= 0xfff00ff0; /* Rd = r0, Rn = r0 */ 922 890 insn |= 0x00000001; /* Rm = r1 */ 923 891 asi->insn[0] = insn; ··· 923 903 prep_emulate_rd16rs8rm0_wflags(kprobe_opcode_t insn, 924 904 struct arch_specific_insn *asi) 925 905 { 906 + if (is_r15(insn, 16)) 907 + return INSN_REJECTED; /* Rd is PC */ 908 + 926 909 insn &= 0xfff0f0f0; /* Rd = r0, Rs = r0 */ 927 910 insn |= 0x00000001; /* Rm = r1 */ 928 911 asi->insn[0] = insn; ··· 937 914 prep_emulate_rd16rn12rs8rm0_wflags(kprobe_opcode_t insn, 938 915 struct arch_specific_insn *asi) 939 916 { 917 + if (is_r15(insn, 16)) 918 + return INSN_REJECTED; /* Rd is PC */ 919 + 940 920 insn &= 0xfff000f0; /* Rd = r0, Rn = r0 */ 941 921 insn |= 0x00000102; /* Rs = r1, Rm = r2 */ 942 922 asi->insn[0] = insn; ··· 951 925 prep_emulate_rdhi16rdlo12rs8rm0_wflags(kprobe_opcode_t insn, 952 926 struct arch_specific_insn *asi) 953 927 { 928 + if (is_r15(insn, 16) || is_r15(insn, 12)) 929 + return INSN_REJECTED; /* RdHi or RdLo is PC */ 930 + 954 931 insn &= 0xfff000f0; /* RdHi = r0, RdLo = r1 */ 955 932 insn |= 0x00001203; /* Rs = r2, Rm = r3 */ 956 933 asi->insn[0] = insn; ··· 974 945 static enum kprobe_insn __kprobes 975 946 space_1111(kprobe_opcode_t insn, struct arch_specific_insn *asi) 976 947 { 977 - /* CPS mmod == 1 : 1111 0001 0000 xx10 xxxx xxxx xx0x xxxx */ 978 - /* RFE : 1111 100x x0x1 xxxx xxxx 1010 xxxx xxxx */ 979 - /* SRS : 1111 100x x1x0 1101 xxxx 0101 xxxx xxxx */ 980 - if ((insn & 0xfff30020) == 0xf1020000 || 981 - (insn & 0xfe500f00) == 0xf8100a00 || 982 - (insn & 0xfe5f0f00) == 0xf84d0500) 983 - return INSN_REJECTED; 984 - 985 - /* PLD : 1111 01x1 x101 xxxx xxxx xxxx xxxx xxxx : */ 986 - if ((insn & 0xfd700000) == 0xf4500000) { 987 - insn &= 0xfff0ffff; /* Rn = r0 */ 988 - asi->insn[0] = insn; 989 - asi->insn_handler = emulate_rn16; 990 - return INSN_GOOD; 948 + /* memory hint : 1111 0100 x001 xxxx xxxx xxxx xxxx xxxx : */ 949 + /* PLDI : 1111 0100 x101 xxxx xxxx xxxx xxxx xxxx : */ 950 + /* PLDW : 1111 0101 x001 xxxx xxxx xxxx xxxx xxxx : */ 951 + /* PLD : 1111 0101 x101 xxxx xxxx xxxx xxxx xxxx : */ 952 + if ((insn & 0xfe300000) == 0xf4100000) { 953 + asi->insn_handler = emulate_nop; 954 + return INSN_GOOD_NO_SLOT; 991 955 } 992 956 993 957 /* BLX(1) : 1111 101x xxxx xxxx xxxx xxxx xxxx xxxx : */ ··· 989 967 return INSN_GOOD_NO_SLOT; 990 968 } 991 969 992 - /* SETEND : 1111 0001 0000 0001 xxxx xxxx 0000 xxxx */ 993 - /* CDP2 : 1111 1110 xxxx xxxx xxxx xxxx xxx0 xxxx */ 994 - if ((insn & 0xffff00f0) == 0xf1010000 || 995 - (insn & 0xff000010) == 0xfe000000) { 996 - asi->insn[0] = insn; 997 - asi->insn_handler = emulate_none; 998 - return INSN_GOOD; 999 - } 970 + /* CPS : 1111 0001 0000 xxx0 xxxx xxxx xx0x xxxx */ 971 + /* SETEND: 1111 0001 0000 0001 xxxx xxxx 0000 xxxx */ 1000 972 973 + /* SRS : 1111 100x x1x0 xxxx xxxx xxxx xxxx xxxx */ 974 + /* RFE : 1111 100x x0x1 xxxx xxxx xxxx xxxx xxxx */ 975 + 976 + /* Coprocessor instructions... */ 1001 977 /* MCRR2 : 1111 1100 0100 xxxx xxxx xxxx xxxx xxxx : (Rd != Rn) */ 1002 978 /* MRRC2 : 1111 1100 0101 xxxx xxxx xxxx xxxx xxxx : (Rd != Rn) */ 1003 - if ((insn & 0xffe00000) == 0xfc400000) { 1004 - insn &= 0xfff00fff; /* Rn = r0 */ 1005 - insn |= 0x00001000; /* Rd = r1 */ 1006 - asi->insn[0] = insn; 1007 - asi->insn_handler = 1008 - (insn & (1 << 20)) ? emulate_mrrc : emulate_mcrr; 1009 - return INSN_GOOD; 1010 - } 979 + /* LDC2 : 1111 110x xxx1 xxxx xxxx xxxx xxxx xxxx */ 980 + /* STC2 : 1111 110x xxx0 xxxx xxxx xxxx xxxx xxxx */ 981 + /* CDP2 : 1111 1110 xxxx xxxx xxxx xxxx xxx0 xxxx */ 982 + /* MCR2 : 1111 1110 xxx0 xxxx xxxx xxxx xxx1 xxxx */ 983 + /* MRC2 : 1111 1110 xxx1 xxxx xxxx xxxx xxx1 xxxx */ 1011 984 1012 - /* LDC2 : 1111 110x xxx1 xxxx xxxx xxxx xxxx xxxx */ 1013 - /* STC2 : 1111 110x xxx0 xxxx xxxx xxxx xxxx xxxx */ 1014 - if ((insn & 0xfe000000) == 0xfc000000) { 1015 - insn &= 0xfff0ffff; /* Rn = r0 */ 1016 - asi->insn[0] = insn; 1017 - asi->insn_handler = emulate_ldcstc; 1018 - return INSN_GOOD; 1019 - } 1020 - 1021 - /* MCR2 : 1111 1110 xxx0 xxxx xxxx xxxx xxx1 xxxx */ 1022 - /* MRC2 : 1111 1110 xxx1 xxxx xxxx xxxx xxx1 xxxx */ 1023 - insn &= 0xffff0fff; /* Rd = r0 */ 1024 - asi->insn[0] = insn; 1025 - asi->insn_handler = (insn & (1 << 20)) ? emulate_rd12 : emulate_ird12; 1026 - return INSN_GOOD; 985 + return INSN_REJECTED; 1027 986 } 1028 987 1029 988 static enum kprobe_insn __kprobes ··· 1013 1010 /* cccc 0001 0xx0 xxxx xxxx xxxx xxxx xxx0 xxxx */ 1014 1011 if ((insn & 0x0f900010) == 0x01000000) { 1015 1012 1016 - /* BXJ : cccc 0001 0010 xxxx xxxx xxxx 0010 xxxx */ 1017 - /* MSR : cccc 0001 0x10 xxxx xxxx xxxx 0000 xxxx */ 1018 - if ((insn & 0x0ff000f0) == 0x01200020 || 1019 - (insn & 0x0fb000f0) == 0x01200000) 1020 - return INSN_REJECTED; 1021 - 1022 - /* MRS : cccc 0001 0x00 xxxx xxxx xxxx 0000 xxxx */ 1023 - if ((insn & 0x0fb00010) == 0x01000000) 1024 - return prep_emulate_rd12(insn, asi); 1013 + /* MRS cpsr : cccc 0001 0000 xxxx xxxx xxxx 0000 xxxx */ 1014 + if ((insn & 0x0ff000f0) == 0x01000000) { 1015 + if (is_r15(insn, 12)) 1016 + return INSN_REJECTED; /* Rd is PC */ 1017 + asi->insn_handler = simulate_mrs; 1018 + return INSN_GOOD_NO_SLOT; 1019 + } 1025 1020 1026 1021 /* SMLALxy : cccc 0001 0100 xxxx xxxx xxxx 1xx0 xxxx */ 1027 1022 if ((insn & 0x0ff00090) == 0x01400080) 1028 - return prep_emulate_rdhi16rdlo12rs8rm0_wflags(insn, asi); 1023 + return prep_emulate_rdhi16rdlo12rs8rm0_wflags(insn, 1024 + asi); 1029 1025 1030 1026 /* SMULWy : cccc 0001 0010 xxxx xxxx xxxx 1x10 xxxx */ 1031 1027 /* SMULxy : cccc 0001 0110 xxxx xxxx xxxx 1xx0 xxxx */ ··· 1033 1031 return prep_emulate_rd16rs8rm0_wflags(insn, asi); 1034 1032 1035 1033 /* SMLAxy : cccc 0001 0000 xxxx xxxx xxxx 1xx0 xxxx : Q */ 1036 - /* SMLAWy : cccc 0001 0010 xxxx xxxx xxxx 0x00 xxxx : Q */ 1037 - return prep_emulate_rd16rn12rs8rm0_wflags(insn, asi); 1034 + /* SMLAWy : cccc 0001 0010 xxxx xxxx xxxx 1x00 xxxx : Q */ 1035 + if ((insn & 0x0ff00090) == 0x01000080 || 1036 + (insn & 0x0ff000b0) == 0x01200080) 1037 + return prep_emulate_rd16rn12rs8rm0_wflags(insn, asi); 1038 1038 1039 + /* BXJ : cccc 0001 0010 xxxx xxxx xxxx 0010 xxxx */ 1040 + /* MSR : cccc 0001 0x10 xxxx xxxx xxxx 0000 xxxx */ 1041 + /* MRS spsr : cccc 0001 0100 xxxx xxxx xxxx 0000 xxxx */ 1042 + 1043 + /* Other instruction encodings aren't yet defined */ 1044 + return INSN_REJECTED; 1039 1045 } 1040 1046 1041 1047 /* cccc 0001 0xx0 xxxx xxxx xxxx xxxx 0xx1 xxxx */ 1042 1048 else if ((insn & 0x0f900090) == 0x01000010) { 1043 1049 1044 - /* BKPT : 1110 0001 0010 xxxx xxxx xxxx 0111 xxxx */ 1045 - if ((insn & 0xfff000f0) == 0xe1200070) 1046 - return INSN_REJECTED; 1047 - 1048 1050 /* BLX(2) : cccc 0001 0010 xxxx xxxx xxxx 0011 xxxx */ 1049 1051 /* BX : cccc 0001 0010 xxxx xxxx xxxx 0001 xxxx */ 1050 1052 if ((insn & 0x0ff000d0) == 0x01200010) { 1051 - asi->insn[0] = truecc_insn(insn); 1053 + if ((insn & 0x0ff000ff) == 0x0120003f) 1054 + return INSN_REJECTED; /* BLX pc */ 1052 1055 asi->insn_handler = simulate_blx2bx; 1053 - return INSN_GOOD; 1056 + return INSN_GOOD_NO_SLOT; 1054 1057 } 1055 1058 1056 1059 /* CLZ : cccc 0001 0110 xxxx xxxx xxxx 0001 xxxx */ ··· 1066 1059 /* QSUB : cccc 0001 0010 xxxx xxxx xxxx 0101 xxxx :Q */ 1067 1060 /* QDADD : cccc 0001 0100 xxxx xxxx xxxx 0101 xxxx :Q */ 1068 1061 /* QDSUB : cccc 0001 0110 xxxx xxxx xxxx 0101 xxxx :Q */ 1069 - return prep_emulate_rd12rn16rm0_wflags(insn, asi); 1062 + if ((insn & 0x0f9000f0) == 0x01000050) 1063 + return prep_emulate_rd12rn16rm0_wflags(insn, asi); 1064 + 1065 + /* BKPT : 1110 0001 0010 xxxx xxxx xxxx 0111 xxxx */ 1066 + /* SMC : cccc 0001 0110 xxxx xxxx xxxx 0111 xxxx */ 1067 + 1068 + /* Other instruction encodings aren't yet defined */ 1069 + return INSN_REJECTED; 1070 1070 } 1071 1071 1072 1072 /* cccc 0000 xxxx xxxx xxxx xxxx xxxx 1001 xxxx */ 1073 - else if ((insn & 0x0f000090) == 0x00000090) { 1073 + else if ((insn & 0x0f0000f0) == 0x00000090) { 1074 1074 1075 1075 /* MUL : cccc 0000 0000 xxxx xxxx xxxx 1001 xxxx : */ 1076 1076 /* MULS : cccc 0000 0001 xxxx xxxx xxxx 1001 xxxx :cc */ 1077 1077 /* MLA : cccc 0000 0010 xxxx xxxx xxxx 1001 xxxx : */ 1078 1078 /* MLAS : cccc 0000 0011 xxxx xxxx xxxx 1001 xxxx :cc */ 1079 1079 /* UMAAL : cccc 0000 0100 xxxx xxxx xxxx 1001 xxxx : */ 1080 + /* undef : cccc 0000 0101 xxxx xxxx xxxx 1001 xxxx : */ 1081 + /* MLS : cccc 0000 0110 xxxx xxxx xxxx 1001 xxxx : */ 1082 + /* undef : cccc 0000 0111 xxxx xxxx xxxx 1001 xxxx : */ 1080 1083 /* UMULL : cccc 0000 1000 xxxx xxxx xxxx 1001 xxxx : */ 1081 1084 /* UMULLS : cccc 0000 1001 xxxx xxxx xxxx 1001 xxxx :cc */ 1082 1085 /* UMLAL : cccc 0000 1010 xxxx xxxx xxxx 1001 xxxx : */ ··· 1095 1078 /* SMULLS : cccc 0000 1101 xxxx xxxx xxxx 1001 xxxx :cc */ 1096 1079 /* SMLAL : cccc 0000 1110 xxxx xxxx xxxx 1001 xxxx : */ 1097 1080 /* SMLALS : cccc 0000 1111 xxxx xxxx xxxx 1001 xxxx :cc */ 1098 - if ((insn & 0x0fe000f0) == 0x00000090) { 1099 - return prep_emulate_rd16rs8rm0_wflags(insn, asi); 1100 - } else if ((insn & 0x0fe000f0) == 0x00200090) { 1101 - return prep_emulate_rd16rn12rs8rm0_wflags(insn, asi); 1102 - } else { 1103 - return prep_emulate_rdhi16rdlo12rs8rm0_wflags(insn, asi); 1104 - } 1081 + if ((insn & 0x00d00000) == 0x00500000) 1082 + return INSN_REJECTED; 1083 + else if ((insn & 0x00e00000) == 0x00000000) 1084 + return prep_emulate_rd16rs8rm0_wflags(insn, asi); 1085 + else if ((insn & 0x00a00000) == 0x00200000) 1086 + return prep_emulate_rd16rn12rs8rm0_wflags(insn, asi); 1087 + else 1088 + return prep_emulate_rdhi16rdlo12rs8rm0_wflags(insn, 1089 + asi); 1105 1090 } 1106 1091 1107 1092 /* cccc 000x xxxx xxxx xxxx xxxx xxxx 1xx1 xxxx */ ··· 1111 1092 1112 1093 /* SWP : cccc 0001 0000 xxxx xxxx xxxx 1001 xxxx */ 1113 1094 /* SWPB : cccc 0001 0100 xxxx xxxx xxxx 1001 xxxx */ 1114 - /* LDRD : cccc 000x xxx0 xxxx xxxx xxxx 1101 xxxx */ 1115 - /* STRD : cccc 000x xxx0 xxxx xxxx xxxx 1111 xxxx */ 1095 + /* ??? : cccc 0001 0x01 xxxx xxxx xxxx 1001 xxxx */ 1096 + /* ??? : cccc 0001 0x10 xxxx xxxx xxxx 1001 xxxx */ 1097 + /* ??? : cccc 0001 0x11 xxxx xxxx xxxx 1001 xxxx */ 1116 1098 /* STREX : cccc 0001 1000 xxxx xxxx xxxx 1001 xxxx */ 1117 1099 /* LDREX : cccc 0001 1001 xxxx xxxx xxxx 1001 xxxx */ 1100 + /* STREXD: cccc 0001 1010 xxxx xxxx xxxx 1001 xxxx */ 1101 + /* LDREXD: cccc 0001 1011 xxxx xxxx xxxx 1001 xxxx */ 1102 + /* STREXB: cccc 0001 1100 xxxx xxxx xxxx 1001 xxxx */ 1103 + /* LDREXB: cccc 0001 1101 xxxx xxxx xxxx 1001 xxxx */ 1104 + /* STREXH: cccc 0001 1110 xxxx xxxx xxxx 1001 xxxx */ 1105 + /* LDREXH: cccc 0001 1111 xxxx xxxx xxxx 1001 xxxx */ 1106 + 1107 + /* LDRD : cccc 000x xxx0 xxxx xxxx xxxx 1101 xxxx */ 1108 + /* STRD : cccc 000x xxx0 xxxx xxxx xxxx 1111 xxxx */ 1118 1109 /* LDRH : cccc 000x xxx1 xxxx xxxx xxxx 1011 xxxx */ 1119 1110 /* STRH : cccc 000x xxx0 xxxx xxxx xxxx 1011 xxxx */ 1120 1111 /* LDRSB : cccc 000x xxx1 xxxx xxxx xxxx 1101 xxxx */ 1121 1112 /* LDRSH : cccc 000x xxx1 xxxx xxxx xxxx 1111 xxxx */ 1122 - if ((insn & 0x0fb000f0) == 0x01000090) { 1123 - /* SWP/SWPB */ 1124 - return prep_emulate_rd12rn16rm0_wflags(insn, asi); 1113 + if ((insn & 0x0f0000f0) == 0x01000090) { 1114 + if ((insn & 0x0fb000f0) == 0x01000090) { 1115 + /* SWP/SWPB */ 1116 + return prep_emulate_rd12rn16rm0_wflags(insn, 1117 + asi); 1118 + } else { 1119 + /* STREX/LDREX variants and unallocaed space */ 1120 + return INSN_REJECTED; 1121 + } 1122 + 1125 1123 } else if ((insn & 0x0e1000d0) == 0x00000d0) { 1126 1124 /* STRD/LDRD */ 1125 + if ((insn & 0x0000e000) == 0x0000e000) 1126 + return INSN_REJECTED; /* Rd is LR or PC */ 1127 + if (is_writeback(insn) && is_r15(insn, 16)) 1128 + return INSN_REJECTED; /* Writeback to PC */ 1129 + 1127 1130 insn &= 0xfff00fff; 1128 1131 insn |= 0x00002000; /* Rn = r0, Rd = r2 */ 1129 - if (insn & (1 << 22)) { 1130 - /* I bit */ 1132 + if (!(insn & (1 << 22))) { 1133 + /* Register index */ 1131 1134 insn &= ~0xf; 1132 1135 insn |= 1; /* Rm = r1 */ 1133 1136 } ··· 1159 1118 return INSN_GOOD; 1160 1119 } 1161 1120 1121 + /* LDRH/STRH/LDRSB/LDRSH */ 1122 + if (is_r15(insn, 12)) 1123 + return INSN_REJECTED; /* Rd is PC */ 1162 1124 return prep_emulate_ldr_str(insn, asi); 1163 1125 } 1164 1126 ··· 1169 1125 1170 1126 /* 1171 1127 * ALU op with S bit and Rd == 15 : 1172 - * cccc 000x xxx1 xxxx 1111 xxxx xxxx xxxx 1128 + * cccc 000x xxx1 xxxx 1111 xxxx xxxx xxxx 1173 1129 */ 1174 1130 if ((insn & 0x0e10f000) == 0x0010f000) 1175 1131 return INSN_REJECTED; ··· 1198 1154 insn |= 0x00000200; /* Rs = r2 */ 1199 1155 } 1200 1156 asi->insn[0] = insn; 1201 - asi->insn_handler = (insn & (1 << 20)) ? /* S-bit */ 1157 + 1158 + if ((insn & 0x0f900000) == 0x01100000) { 1159 + /* 1160 + * TST : cccc 0001 0001 xxxx xxxx xxxx xxxx xxxx 1161 + * TEQ : cccc 0001 0011 xxxx xxxx xxxx xxxx xxxx 1162 + * CMP : cccc 0001 0101 xxxx xxxx xxxx xxxx xxxx 1163 + * CMN : cccc 0001 0111 xxxx xxxx xxxx xxxx xxxx 1164 + */ 1165 + asi->insn_handler = emulate_alu_tests; 1166 + } else { 1167 + /* ALU ops which write to Rd */ 1168 + asi->insn_handler = (insn & (1 << 20)) ? /* S-bit */ 1202 1169 emulate_alu_rwflags : emulate_alu_rflags; 1170 + } 1203 1171 return INSN_GOOD; 1204 1172 } 1205 1173 1206 1174 static enum kprobe_insn __kprobes 1207 1175 space_cccc_001x(kprobe_opcode_t insn, struct arch_specific_insn *asi) 1208 1176 { 1177 + /* MOVW : cccc 0011 0000 xxxx xxxx xxxx xxxx xxxx */ 1178 + /* MOVT : cccc 0011 0100 xxxx xxxx xxxx xxxx xxxx */ 1179 + if ((insn & 0x0fb00000) == 0x03000000) 1180 + return prep_emulate_rd12_modify(insn, asi); 1181 + 1182 + /* hints : cccc 0011 0010 0000 xxxx xxxx xxxx xxxx */ 1183 + if ((insn & 0x0fff0000) == 0x03200000) { 1184 + unsigned op2 = insn & 0x000000ff; 1185 + if (op2 == 0x01 || op2 == 0x04) { 1186 + /* YIELD : cccc 0011 0010 0000 xxxx xxxx 0000 0001 */ 1187 + /* SEV : cccc 0011 0010 0000 xxxx xxxx 0000 0100 */ 1188 + asi->insn[0] = insn; 1189 + asi->insn_handler = emulate_none; 1190 + return INSN_GOOD; 1191 + } else if (op2 <= 0x03) { 1192 + /* NOP : cccc 0011 0010 0000 xxxx xxxx 0000 0000 */ 1193 + /* WFE : cccc 0011 0010 0000 xxxx xxxx 0000 0010 */ 1194 + /* WFI : cccc 0011 0010 0000 xxxx xxxx 0000 0011 */ 1195 + /* 1196 + * We make WFE and WFI true NOPs to avoid stalls due 1197 + * to missing events whilst processing the probe. 1198 + */ 1199 + asi->insn_handler = emulate_nop; 1200 + return INSN_GOOD_NO_SLOT; 1201 + } 1202 + /* For DBG and unallocated hints it's safest to reject them */ 1203 + return INSN_REJECTED; 1204 + } 1205 + 1209 1206 /* 1210 1207 * MSR : cccc 0011 0x10 xxxx xxxx xxxx xxxx xxxx 1211 - * Undef : cccc 0011 0100 xxxx xxxx xxxx xxxx xxxx 1212 1208 * ALU op with S bit and Rd == 15 : 1213 1209 * cccc 001x xxx1 xxxx 1111 xxxx xxxx xxxx 1214 1210 */ 1215 1211 if ((insn & 0x0fb00000) == 0x03200000 || /* MSR */ 1216 - (insn & 0x0ff00000) == 0x03400000 || /* Undef */ 1217 1212 (insn & 0x0e10f000) == 0x0210f000) /* ALU s-bit, R15 */ 1218 1213 return INSN_REJECTED; 1219 1214 ··· 1263 1180 * *S (bit 20) updates condition codes 1264 1181 * ADC/SBC/RSC reads the C flag 1265 1182 */ 1266 - insn &= 0xffff0fff; /* Rd = r0 */ 1183 + insn &= 0xfff00fff; /* Rn = r0 and Rd = r0 */ 1267 1184 asi->insn[0] = insn; 1268 - asi->insn_handler = (insn & (1 << 20)) ? /* S-bit */ 1185 + 1186 + if ((insn & 0x0f900000) == 0x03100000) { 1187 + /* 1188 + * TST : cccc 0011 0001 xxxx xxxx xxxx xxxx xxxx 1189 + * TEQ : cccc 0011 0011 xxxx xxxx xxxx xxxx xxxx 1190 + * CMP : cccc 0011 0101 xxxx xxxx xxxx xxxx xxxx 1191 + * CMN : cccc 0011 0111 xxxx xxxx xxxx xxxx xxxx 1192 + */ 1193 + asi->insn_handler = emulate_alu_tests_imm; 1194 + } else { 1195 + /* ALU ops which write to Rd */ 1196 + asi->insn_handler = (insn & (1 << 20)) ? /* S-bit */ 1269 1197 emulate_alu_imm_rwflags : emulate_alu_imm_rflags; 1198 + } 1270 1199 return INSN_GOOD; 1271 1200 } 1272 1201 ··· 1287 1192 { 1288 1193 /* SEL : cccc 0110 1000 xxxx xxxx xxxx 1011 xxxx GE: !!! */ 1289 1194 if ((insn & 0x0ff000f0) == 0x068000b0) { 1195 + if (is_r15(insn, 12)) 1196 + return INSN_REJECTED; /* Rd is PC */ 1290 1197 insn &= 0xfff00ff0; /* Rd = r0, Rn = r0 */ 1291 1198 insn |= 0x00000001; /* Rm = r1 */ 1292 1199 asi->insn[0] = insn; ··· 1302 1205 /* USAT16 : cccc 0110 1110 xxxx xxxx xxxx 0011 xxxx :Q */ 1303 1206 if ((insn & 0x0fa00030) == 0x06a00010 || 1304 1207 (insn & 0x0fb000f0) == 0x06a00030) { 1208 + if (is_r15(insn, 12)) 1209 + return INSN_REJECTED; /* Rd is PC */ 1305 1210 insn &= 0xffff0ff0; /* Rd = r0, Rm = r0 */ 1306 1211 asi->insn[0] = insn; 1307 1212 asi->insn_handler = emulate_sat; ··· 1312 1213 1313 1214 /* REV : cccc 0110 1011 xxxx xxxx xxxx 0011 xxxx */ 1314 1215 /* REV16 : cccc 0110 1011 xxxx xxxx xxxx 1011 xxxx */ 1216 + /* RBIT : cccc 0110 1111 xxxx xxxx xxxx 0011 xxxx */ 1315 1217 /* REVSH : cccc 0110 1111 xxxx xxxx xxxx 1011 xxxx */ 1316 1218 if ((insn & 0x0ff00070) == 0x06b00030 || 1317 - (insn & 0x0ff000f0) == 0x06f000b0) 1219 + (insn & 0x0ff00070) == 0x06f00030) 1318 1220 return prep_emulate_rd12rm0(insn, asi); 1319 1221 1222 + /* ??? : cccc 0110 0000 xxxx xxxx xxxx xxx1 xxxx : */ 1320 1223 /* SADD16 : cccc 0110 0001 xxxx xxxx xxxx 0001 xxxx :GE */ 1321 1224 /* SADDSUBX : cccc 0110 0001 xxxx xxxx xxxx 0011 xxxx :GE */ 1322 1225 /* SSUBADDX : cccc 0110 0001 xxxx xxxx xxxx 0101 xxxx :GE */ 1323 1226 /* SSUB16 : cccc 0110 0001 xxxx xxxx xxxx 0111 xxxx :GE */ 1324 1227 /* SADD8 : cccc 0110 0001 xxxx xxxx xxxx 1001 xxxx :GE */ 1228 + /* ??? : cccc 0110 0001 xxxx xxxx xxxx 1011 xxxx : */ 1229 + /* ??? : cccc 0110 0001 xxxx xxxx xxxx 1101 xxxx : */ 1325 1230 /* SSUB8 : cccc 0110 0001 xxxx xxxx xxxx 1111 xxxx :GE */ 1326 1231 /* QADD16 : cccc 0110 0010 xxxx xxxx xxxx 0001 xxxx : */ 1327 1232 /* QADDSUBX : cccc 0110 0010 xxxx xxxx xxxx 0011 xxxx : */ 1328 1233 /* QSUBADDX : cccc 0110 0010 xxxx xxxx xxxx 0101 xxxx : */ 1329 1234 /* QSUB16 : cccc 0110 0010 xxxx xxxx xxxx 0111 xxxx : */ 1330 1235 /* QADD8 : cccc 0110 0010 xxxx xxxx xxxx 1001 xxxx : */ 1236 + /* ??? : cccc 0110 0010 xxxx xxxx xxxx 1011 xxxx : */ 1237 + /* ??? : cccc 0110 0010 xxxx xxxx xxxx 1101 xxxx : */ 1331 1238 /* QSUB8 : cccc 0110 0010 xxxx xxxx xxxx 1111 xxxx : */ 1332 1239 /* SHADD16 : cccc 0110 0011 xxxx xxxx xxxx 0001 xxxx : */ 1333 1240 /* SHADDSUBX : cccc 0110 0011 xxxx xxxx xxxx 0011 xxxx : */ 1334 1241 /* SHSUBADDX : cccc 0110 0011 xxxx xxxx xxxx 0101 xxxx : */ 1335 1242 /* SHSUB16 : cccc 0110 0011 xxxx xxxx xxxx 0111 xxxx : */ 1336 1243 /* SHADD8 : cccc 0110 0011 xxxx xxxx xxxx 1001 xxxx : */ 1244 + /* ??? : cccc 0110 0011 xxxx xxxx xxxx 1011 xxxx : */ 1245 + /* ??? : cccc 0110 0011 xxxx xxxx xxxx 1101 xxxx : */ 1337 1246 /* SHSUB8 : cccc 0110 0011 xxxx xxxx xxxx 1111 xxxx : */ 1247 + /* ??? : cccc 0110 0100 xxxx xxxx xxxx xxx1 xxxx : */ 1338 1248 /* UADD16 : cccc 0110 0101 xxxx xxxx xxxx 0001 xxxx :GE */ 1339 1249 /* UADDSUBX : cccc 0110 0101 xxxx xxxx xxxx 0011 xxxx :GE */ 1340 1250 /* USUBADDX : cccc 0110 0101 xxxx xxxx xxxx 0101 xxxx :GE */ 1341 1251 /* USUB16 : cccc 0110 0101 xxxx xxxx xxxx 0111 xxxx :GE */ 1342 1252 /* UADD8 : cccc 0110 0101 xxxx xxxx xxxx 1001 xxxx :GE */ 1253 + /* ??? : cccc 0110 0101 xxxx xxxx xxxx 1011 xxxx : */ 1254 + /* ??? : cccc 0110 0101 xxxx xxxx xxxx 1101 xxxx : */ 1343 1255 /* USUB8 : cccc 0110 0101 xxxx xxxx xxxx 1111 xxxx :GE */ 1344 1256 /* UQADD16 : cccc 0110 0110 xxxx xxxx xxxx 0001 xxxx : */ 1345 1257 /* UQADDSUBX : cccc 0110 0110 xxxx xxxx xxxx 0011 xxxx : */ 1346 1258 /* UQSUBADDX : cccc 0110 0110 xxxx xxxx xxxx 0101 xxxx : */ 1347 1259 /* UQSUB16 : cccc 0110 0110 xxxx xxxx xxxx 0111 xxxx : */ 1348 1260 /* UQADD8 : cccc 0110 0110 xxxx xxxx xxxx 1001 xxxx : */ 1261 + /* ??? : cccc 0110 0110 xxxx xxxx xxxx 1011 xxxx : */ 1262 + /* ??? : cccc 0110 0110 xxxx xxxx xxxx 1101 xxxx : */ 1349 1263 /* UQSUB8 : cccc 0110 0110 xxxx xxxx xxxx 1111 xxxx : */ 1350 1264 /* UHADD16 : cccc 0110 0111 xxxx xxxx xxxx 0001 xxxx : */ 1351 1265 /* UHADDSUBX : cccc 0110 0111 xxxx xxxx xxxx 0011 xxxx : */ 1352 1266 /* UHSUBADDX : cccc 0110 0111 xxxx xxxx xxxx 0101 xxxx : */ 1353 1267 /* UHSUB16 : cccc 0110 0111 xxxx xxxx xxxx 0111 xxxx : */ 1354 1268 /* UHADD8 : cccc 0110 0111 xxxx xxxx xxxx 1001 xxxx : */ 1269 + /* ??? : cccc 0110 0111 xxxx xxxx xxxx 1011 xxxx : */ 1270 + /* ??? : cccc 0110 0111 xxxx xxxx xxxx 1101 xxxx : */ 1355 1271 /* UHSUB8 : cccc 0110 0111 xxxx xxxx xxxx 1111 xxxx : */ 1272 + if ((insn & 0x0f800010) == 0x06000010) { 1273 + if ((insn & 0x00300000) == 0x00000000 || 1274 + (insn & 0x000000e0) == 0x000000a0 || 1275 + (insn & 0x000000e0) == 0x000000c0) 1276 + return INSN_REJECTED; /* Unallocated space */ 1277 + return prep_emulate_rd12rn16rm0_wflags(insn, asi); 1278 + } 1279 + 1356 1280 /* PKHBT : cccc 0110 1000 xxxx xxxx xxxx x001 xxxx : */ 1357 1281 /* PKHTB : cccc 0110 1000 xxxx xxxx xxxx x101 xxxx : */ 1282 + if ((insn & 0x0ff00030) == 0x06800010) 1283 + return prep_emulate_rd12rn16rm0_wflags(insn, asi); 1284 + 1358 1285 /* SXTAB16 : cccc 0110 1000 xxxx xxxx xxxx 0111 xxxx : */ 1359 - /* SXTB : cccc 0110 1010 xxxx xxxx xxxx 0111 xxxx : */ 1286 + /* SXTB16 : cccc 0110 1000 1111 xxxx xxxx 0111 xxxx : */ 1287 + /* ??? : cccc 0110 1001 xxxx xxxx xxxx 0111 xxxx : */ 1360 1288 /* SXTAB : cccc 0110 1010 xxxx xxxx xxxx 0111 xxxx : */ 1289 + /* SXTB : cccc 0110 1010 1111 xxxx xxxx 0111 xxxx : */ 1361 1290 /* SXTAH : cccc 0110 1011 xxxx xxxx xxxx 0111 xxxx : */ 1291 + /* SXTH : cccc 0110 1011 1111 xxxx xxxx 0111 xxxx : */ 1362 1292 /* UXTAB16 : cccc 0110 1100 xxxx xxxx xxxx 0111 xxxx : */ 1293 + /* UXTB16 : cccc 0110 1100 1111 xxxx xxxx 0111 xxxx : */ 1294 + /* ??? : cccc 0110 1101 xxxx xxxx xxxx 0111 xxxx : */ 1363 1295 /* UXTAB : cccc 0110 1110 xxxx xxxx xxxx 0111 xxxx : */ 1296 + /* UXTB : cccc 0110 1110 1111 xxxx xxxx 0111 xxxx : */ 1364 1297 /* UXTAH : cccc 0110 1111 xxxx xxxx xxxx 0111 xxxx : */ 1365 - return prep_emulate_rd12rn16rm0_wflags(insn, asi); 1298 + /* UXTH : cccc 0110 1111 1111 xxxx xxxx 0111 xxxx : */ 1299 + if ((insn & 0x0f8000f0) == 0x06800070) { 1300 + if ((insn & 0x00300000) == 0x00100000) 1301 + return INSN_REJECTED; /* Unallocated space */ 1302 + 1303 + if ((insn & 0x000f0000) == 0x000f0000) 1304 + return prep_emulate_rd12rm0(insn, asi); 1305 + else 1306 + return prep_emulate_rd12rn16rm0_wflags(insn, asi); 1307 + } 1308 + 1309 + /* Other instruction encodings aren't yet defined */ 1310 + return INSN_REJECTED; 1366 1311 } 1367 1312 1368 1313 static enum kprobe_insn __kprobes ··· 1416 1273 if ((insn & 0x0ff000f0) == 0x03f000f0) 1417 1274 return INSN_REJECTED; 1418 1275 1419 - /* USADA8 : cccc 0111 1000 xxxx xxxx xxxx 0001 xxxx */ 1420 - /* USAD8 : cccc 0111 1000 xxxx 1111 xxxx 0001 xxxx */ 1421 - if ((insn & 0x0ff000f0) == 0x07800010) 1422 - return prep_emulate_rd16rn12rs8rm0_wflags(insn, asi); 1423 - 1424 1276 /* SMLALD : cccc 0111 0100 xxxx xxxx xxxx 00x1 xxxx */ 1425 1277 /* SMLSLD : cccc 0111 0100 xxxx xxxx xxxx 01x1 xxxx */ 1426 1278 if ((insn & 0x0ff00090) == 0x07400010) 1427 1279 return prep_emulate_rdhi16rdlo12rs8rm0_wflags(insn, asi); 1428 1280 1429 1281 /* SMLAD : cccc 0111 0000 xxxx xxxx xxxx 00x1 xxxx :Q */ 1282 + /* SMUAD : cccc 0111 0000 xxxx 1111 xxxx 00x1 xxxx :Q */ 1430 1283 /* SMLSD : cccc 0111 0000 xxxx xxxx xxxx 01x1 xxxx :Q */ 1284 + /* SMUSD : cccc 0111 0000 xxxx 1111 xxxx 01x1 xxxx : */ 1431 1285 /* SMMLA : cccc 0111 0101 xxxx xxxx xxxx 00x1 xxxx : */ 1432 - /* SMMLS : cccc 0111 0101 xxxx xxxx xxxx 11x1 xxxx : */ 1286 + /* SMMUL : cccc 0111 0101 xxxx 1111 xxxx 00x1 xxxx : */ 1287 + /* USADA8 : cccc 0111 1000 xxxx xxxx xxxx 0001 xxxx : */ 1288 + /* USAD8 : cccc 0111 1000 xxxx 1111 xxxx 0001 xxxx : */ 1433 1289 if ((insn & 0x0ff00090) == 0x07000010 || 1434 1290 (insn & 0x0ff000d0) == 0x07500010 || 1435 - (insn & 0x0ff000d0) == 0x075000d0) 1291 + (insn & 0x0ff000f0) == 0x07800010) { 1292 + 1293 + if ((insn & 0x0000f000) == 0x0000f000) 1294 + return prep_emulate_rd16rs8rm0_wflags(insn, asi); 1295 + else 1296 + return prep_emulate_rd16rn12rs8rm0_wflags(insn, asi); 1297 + } 1298 + 1299 + /* SMMLS : cccc 0111 0101 xxxx xxxx xxxx 11x1 xxxx : */ 1300 + if ((insn & 0x0ff000d0) == 0x075000d0) 1436 1301 return prep_emulate_rd16rn12rs8rm0_wflags(insn, asi); 1437 1302 1438 - /* SMUSD : cccc 0111 0000 xxxx xxxx xxxx 01x1 xxxx : */ 1439 - /* SMUAD : cccc 0111 0000 xxxx 1111 xxxx 00x1 xxxx :Q */ 1440 - /* SMMUL : cccc 0111 0101 xxxx 1111 xxxx 00x1 xxxx : */ 1441 - return prep_emulate_rd16rs8rm0_wflags(insn, asi); 1303 + /* SBFX : cccc 0111 101x xxxx xxxx xxxx x101 xxxx : */ 1304 + /* UBFX : cccc 0111 111x xxxx xxxx xxxx x101 xxxx : */ 1305 + if ((insn & 0x0fa00070) == 0x07a00050) 1306 + return prep_emulate_rd12rm0(insn, asi); 1307 + 1308 + /* BFI : cccc 0111 110x xxxx xxxx xxxx x001 xxxx : */ 1309 + /* BFC : cccc 0111 110x xxxx xxxx xxxx x001 1111 : */ 1310 + if ((insn & 0x0fe00070) == 0x07c00010) { 1311 + 1312 + if ((insn & 0x0000000f) == 0x0000000f) 1313 + return prep_emulate_rd12_modify(insn, asi); 1314 + else 1315 + return prep_emulate_rd12rn0_modify(insn, asi); 1316 + } 1317 + 1318 + return INSN_REJECTED; 1442 1319 } 1443 1320 1444 1321 static enum kprobe_insn __kprobes ··· 1472 1309 /* STRB : cccc 01xx x1x0 xxxx xxxx xxxx xxxx xxxx */ 1473 1310 /* STRBT : cccc 01x0 x110 xxxx xxxx xxxx xxxx xxxx */ 1474 1311 /* STRT : cccc 01x0 x010 xxxx xxxx xxxx xxxx xxxx */ 1312 + 1313 + if ((insn & 0x00500000) == 0x00500000 && is_r15(insn, 12)) 1314 + return INSN_REJECTED; /* LDRB into PC */ 1315 + 1475 1316 return prep_emulate_ldr_str(insn, asi); 1476 1317 } 1477 1318 ··· 1490 1323 1491 1324 /* LDM(1) : cccc 100x x0x1 xxxx xxxx xxxx xxxx xxxx */ 1492 1325 /* STM(1) : cccc 100x x0x0 xxxx xxxx xxxx xxxx xxxx */ 1493 - asi->insn[0] = truecc_insn(insn); 1494 1326 asi->insn_handler = ((insn & 0x108000) == 0x008000) ? /* STM & R15 */ 1495 1327 simulate_stm1_pc : simulate_ldm1stm1; 1496 - return INSN_GOOD; 1328 + return INSN_GOOD_NO_SLOT; 1497 1329 } 1498 1330 1499 1331 static enum kprobe_insn __kprobes ··· 1500 1334 { 1501 1335 /* B : cccc 1010 xxxx xxxx xxxx xxxx xxxx xxxx */ 1502 1336 /* BL : cccc 1011 xxxx xxxx xxxx xxxx xxxx xxxx */ 1503 - asi->insn[0] = truecc_insn(insn); 1504 1337 asi->insn_handler = simulate_bbl; 1505 - return INSN_GOOD; 1338 + return INSN_GOOD_NO_SLOT; 1506 1339 } 1507 1340 1508 1341 static enum kprobe_insn __kprobes 1509 - space_cccc_1100_010x(kprobe_opcode_t insn, struct arch_specific_insn *asi) 1342 + space_cccc_11xx(kprobe_opcode_t insn, struct arch_specific_insn *asi) 1510 1343 { 1344 + /* Coprocessor instructions... */ 1511 1345 /* MCRR : cccc 1100 0100 xxxx xxxx xxxx xxxx xxxx : (Rd!=Rn) */ 1512 1346 /* MRRC : cccc 1100 0101 xxxx xxxx xxxx xxxx xxxx : (Rd!=Rn) */ 1513 - insn &= 0xfff00fff; 1514 - insn |= 0x00001000; /* Rn = r0, Rd = r1 */ 1515 - asi->insn[0] = insn; 1516 - asi->insn_handler = (insn & (1 << 20)) ? emulate_mrrc : emulate_mcrr; 1517 - return INSN_GOOD; 1347 + /* LDC : cccc 110x xxx1 xxxx xxxx xxxx xxxx xxxx */ 1348 + /* STC : cccc 110x xxx0 xxxx xxxx xxxx xxxx xxxx */ 1349 + /* CDP : cccc 1110 xxxx xxxx xxxx xxxx xxx0 xxxx */ 1350 + /* MCR : cccc 1110 xxx0 xxxx xxxx xxxx xxx1 xxxx */ 1351 + /* MRC : cccc 1110 xxx1 xxxx xxxx xxxx xxx1 xxxx */ 1352 + 1353 + /* SVC : cccc 1111 xxxx xxxx xxxx xxxx xxxx xxxx */ 1354 + 1355 + return INSN_REJECTED; 1518 1356 } 1519 1357 1520 - static enum kprobe_insn __kprobes 1521 - space_cccc_110x(kprobe_opcode_t insn, struct arch_specific_insn *asi) 1358 + static unsigned long __kprobes __check_eq(unsigned long cpsr) 1522 1359 { 1523 - /* LDC : cccc 110x xxx1 xxxx xxxx xxxx xxxx xxxx */ 1524 - /* STC : cccc 110x xxx0 xxxx xxxx xxxx xxxx xxxx */ 1525 - insn &= 0xfff0ffff; /* Rn = r0 */ 1526 - asi->insn[0] = insn; 1527 - asi->insn_handler = emulate_ldcstc; 1528 - return INSN_GOOD; 1360 + return cpsr & PSR_Z_BIT; 1529 1361 } 1530 1362 1531 - static enum kprobe_insn __kprobes 1532 - space_cccc_111x(kprobe_opcode_t insn, struct arch_specific_insn *asi) 1363 + static unsigned long __kprobes __check_ne(unsigned long cpsr) 1533 1364 { 1534 - /* BKPT : 1110 0001 0010 xxxx xxxx xxxx 0111 xxxx */ 1535 - /* SWI : cccc 1111 xxxx xxxx xxxx xxxx xxxx xxxx */ 1536 - if ((insn & 0xfff000f0) == 0xe1200070 || 1537 - (insn & 0x0f000000) == 0x0f000000) 1538 - return INSN_REJECTED; 1539 - 1540 - /* CDP : cccc 1110 xxxx xxxx xxxx xxxx xxx0 xxxx */ 1541 - if ((insn & 0x0f000010) == 0x0e000000) { 1542 - asi->insn[0] = insn; 1543 - asi->insn_handler = emulate_none; 1544 - return INSN_GOOD; 1545 - } 1546 - 1547 - /* MCR : cccc 1110 xxx0 xxxx xxxx xxxx xxx1 xxxx */ 1548 - /* MRC : cccc 1110 xxx1 xxxx xxxx xxxx xxx1 xxxx */ 1549 - insn &= 0xffff0fff; /* Rd = r0 */ 1550 - asi->insn[0] = insn; 1551 - asi->insn_handler = (insn & (1 << 20)) ? emulate_rd12 : emulate_ird12; 1552 - return INSN_GOOD; 1365 + return (~cpsr) & PSR_Z_BIT; 1553 1366 } 1367 + 1368 + static unsigned long __kprobes __check_cs(unsigned long cpsr) 1369 + { 1370 + return cpsr & PSR_C_BIT; 1371 + } 1372 + 1373 + static unsigned long __kprobes __check_cc(unsigned long cpsr) 1374 + { 1375 + return (~cpsr) & PSR_C_BIT; 1376 + } 1377 + 1378 + static unsigned long __kprobes __check_mi(unsigned long cpsr) 1379 + { 1380 + return cpsr & PSR_N_BIT; 1381 + } 1382 + 1383 + static unsigned long __kprobes __check_pl(unsigned long cpsr) 1384 + { 1385 + return (~cpsr) & PSR_N_BIT; 1386 + } 1387 + 1388 + static unsigned long __kprobes __check_vs(unsigned long cpsr) 1389 + { 1390 + return cpsr & PSR_V_BIT; 1391 + } 1392 + 1393 + static unsigned long __kprobes __check_vc(unsigned long cpsr) 1394 + { 1395 + return (~cpsr) & PSR_V_BIT; 1396 + } 1397 + 1398 + static unsigned long __kprobes __check_hi(unsigned long cpsr) 1399 + { 1400 + cpsr &= ~(cpsr >> 1); /* PSR_C_BIT &= ~PSR_Z_BIT */ 1401 + return cpsr & PSR_C_BIT; 1402 + } 1403 + 1404 + static unsigned long __kprobes __check_ls(unsigned long cpsr) 1405 + { 1406 + cpsr &= ~(cpsr >> 1); /* PSR_C_BIT &= ~PSR_Z_BIT */ 1407 + return (~cpsr) & PSR_C_BIT; 1408 + } 1409 + 1410 + static unsigned long __kprobes __check_ge(unsigned long cpsr) 1411 + { 1412 + cpsr ^= (cpsr << 3); /* PSR_N_BIT ^= PSR_V_BIT */ 1413 + return (~cpsr) & PSR_N_BIT; 1414 + } 1415 + 1416 + static unsigned long __kprobes __check_lt(unsigned long cpsr) 1417 + { 1418 + cpsr ^= (cpsr << 3); /* PSR_N_BIT ^= PSR_V_BIT */ 1419 + return cpsr & PSR_N_BIT; 1420 + } 1421 + 1422 + static unsigned long __kprobes __check_gt(unsigned long cpsr) 1423 + { 1424 + unsigned long temp = cpsr ^ (cpsr << 3); /* PSR_N_BIT ^= PSR_V_BIT */ 1425 + temp |= (cpsr << 1); /* PSR_N_BIT |= PSR_Z_BIT */ 1426 + return (~temp) & PSR_N_BIT; 1427 + } 1428 + 1429 + static unsigned long __kprobes __check_le(unsigned long cpsr) 1430 + { 1431 + unsigned long temp = cpsr ^ (cpsr << 3); /* PSR_N_BIT ^= PSR_V_BIT */ 1432 + temp |= (cpsr << 1); /* PSR_N_BIT |= PSR_Z_BIT */ 1433 + return temp & PSR_N_BIT; 1434 + } 1435 + 1436 + static unsigned long __kprobes __check_al(unsigned long cpsr) 1437 + { 1438 + return true; 1439 + } 1440 + 1441 + static kprobe_check_cc * const condition_checks[16] = { 1442 + &__check_eq, &__check_ne, &__check_cs, &__check_cc, 1443 + &__check_mi, &__check_pl, &__check_vs, &__check_vc, 1444 + &__check_hi, &__check_ls, &__check_ge, &__check_lt, 1445 + &__check_gt, &__check_le, &__check_al, &__check_al 1446 + }; 1554 1447 1555 1448 /* Return: 1556 1449 * INSN_REJECTED If instruction is one not allowed to kprobe, ··· 1626 1401 enum kprobe_insn __kprobes 1627 1402 arm_kprobe_decode_insn(kprobe_opcode_t insn, struct arch_specific_insn *asi) 1628 1403 { 1404 + asi->insn_check_cc = condition_checks[insn>>28]; 1629 1405 asi->insn[1] = KPROBE_RETURN_INSTRUCTION; 1630 1406 1631 - if ((insn & 0xf0000000) == 0xf0000000) { 1407 + if ((insn & 0xf0000000) == 0xf0000000) 1632 1408 1633 1409 return space_1111(insn, asi); 1634 1410 1635 - } else if ((insn & 0x0e000000) == 0x00000000) { 1411 + else if ((insn & 0x0e000000) == 0x00000000) 1636 1412 1637 1413 return space_cccc_000x(insn, asi); 1638 1414 1639 - } else if ((insn & 0x0e000000) == 0x02000000) { 1415 + else if ((insn & 0x0e000000) == 0x02000000) 1640 1416 1641 1417 return space_cccc_001x(insn, asi); 1642 1418 1643 - } else if ((insn & 0x0f000010) == 0x06000010) { 1419 + else if ((insn & 0x0f000010) == 0x06000010) 1644 1420 1645 1421 return space_cccc_0110__1(insn, asi); 1646 1422 1647 - } else if ((insn & 0x0f000010) == 0x07000010) { 1423 + else if ((insn & 0x0f000010) == 0x07000010) 1648 1424 1649 1425 return space_cccc_0111__1(insn, asi); 1650 1426 1651 - } else if ((insn & 0x0c000000) == 0x04000000) { 1427 + else if ((insn & 0x0c000000) == 0x04000000) 1652 1428 1653 1429 return space_cccc_01xx(insn, asi); 1654 1430 1655 - } else if ((insn & 0x0e000000) == 0x08000000) { 1431 + else if ((insn & 0x0e000000) == 0x08000000) 1656 1432 1657 1433 return space_cccc_100x(insn, asi); 1658 1434 1659 - } else if ((insn & 0x0e000000) == 0x0a000000) { 1435 + else if ((insn & 0x0e000000) == 0x0a000000) 1660 1436 1661 1437 return space_cccc_101x(insn, asi); 1662 1438 1663 - } else if ((insn & 0x0fe00000) == 0x0c400000) { 1664 - 1665 - return space_cccc_1100_010x(insn, asi); 1666 - 1667 - } else if ((insn & 0x0e000000) == 0x0c000000) { 1668 - 1669 - return space_cccc_110x(insn, asi); 1670 - 1671 - } 1672 - 1673 - return space_cccc_111x(insn, asi); 1439 + return space_cccc_11xx(insn, asi); 1674 1440 } 1675 1441 1676 1442 void __init arm_kprobe_decode_init(void) 1677 1443 { 1678 1444 find_str_pc_offset(); 1679 1445 } 1680 - 1681 - 1682 - /* 1683 - * All ARM instructions listed below. 1684 - * 1685 - * Instructions and their general purpose registers are given. 1686 - * If a particular register may not use R15, it is prefixed with a "!". 1687 - * If marked with a "*" means the value returned by reading R15 1688 - * is implementation defined. 1689 - * 1690 - * ADC/ADD/AND/BIC/CMN/CMP/EOR/MOV/MVN/ORR/RSB/RSC/SBC/SUB/TEQ 1691 - * TST: Rd, Rn, Rm, !Rs 1692 - * BX: Rm 1693 - * BLX(2): !Rm 1694 - * BX: Rm (R15 legal, but discouraged) 1695 - * BXJ: !Rm, 1696 - * CLZ: !Rd, !Rm 1697 - * CPY: Rd, Rm 1698 - * LDC/2,STC/2 immediate offset & unindex: Rn 1699 - * LDC/2,STC/2 immediate pre/post-indexed: !Rn 1700 - * LDM(1/3): !Rn, register_list 1701 - * LDM(2): !Rn, !register_list 1702 - * LDR,STR,PLD immediate offset: Rd, Rn 1703 - * LDR,STR,PLD register offset: Rd, Rn, !Rm 1704 - * LDR,STR,PLD scaled register offset: Rd, !Rn, !Rm 1705 - * LDR,STR immediate pre/post-indexed: Rd, !Rn 1706 - * LDR,STR register pre/post-indexed: Rd, !Rn, !Rm 1707 - * LDR,STR scaled register pre/post-indexed: Rd, !Rn, !Rm 1708 - * LDRB,STRB immediate offset: !Rd, Rn 1709 - * LDRB,STRB register offset: !Rd, Rn, !Rm 1710 - * LDRB,STRB scaled register offset: !Rd, !Rn, !Rm 1711 - * LDRB,STRB immediate pre/post-indexed: !Rd, !Rn 1712 - * LDRB,STRB register pre/post-indexed: !Rd, !Rn, !Rm 1713 - * LDRB,STRB scaled register pre/post-indexed: !Rd, !Rn, !Rm 1714 - * LDRT,LDRBT,STRBT immediate pre/post-indexed: !Rd, !Rn 1715 - * LDRT,LDRBT,STRBT register pre/post-indexed: !Rd, !Rn, !Rm 1716 - * LDRT,LDRBT,STRBT scaled register pre/post-indexed: !Rd, !Rn, !Rm 1717 - * LDRH/SH/SB/D,STRH/SH/SB/D immediate offset: !Rd, Rn 1718 - * LDRH/SH/SB/D,STRH/SH/SB/D register offset: !Rd, Rn, !Rm 1719 - * LDRH/SH/SB/D,STRH/SH/SB/D immediate pre/post-indexed: !Rd, !Rn 1720 - * LDRH/SH/SB/D,STRH/SH/SB/D register pre/post-indexed: !Rd, !Rn, !Rm 1721 - * LDREX: !Rd, !Rn 1722 - * MCR/2: !Rd 1723 - * MCRR/2,MRRC/2: !Rd, !Rn 1724 - * MLA: !Rd, !Rn, !Rm, !Rs 1725 - * MOV: Rd 1726 - * MRC/2: !Rd (if Rd==15, only changes cond codes, not the register) 1727 - * MRS,MSR: !Rd 1728 - * MUL: !Rd, !Rm, !Rs 1729 - * PKH{BT,TB}: !Rd, !Rn, !Rm 1730 - * QDADD,[U]QADD/16/8/SUBX: !Rd, !Rm, !Rn 1731 - * QDSUB,[U]QSUB/16/8/ADDX: !Rd, !Rm, !Rn 1732 - * REV/16/SH: !Rd, !Rm 1733 - * RFE: !Rn 1734 - * {S,U}[H]ADD{16,8,SUBX},{S,U}[H]SUB{16,8,ADDX}: !Rd, !Rn, !Rm 1735 - * SEL: !Rd, !Rn, !Rm 1736 - * SMLA<x><y>,SMLA{D,W<y>},SMLSD,SMML{A,S}: !Rd, !Rn, !Rm, !Rs 1737 - * SMLAL<x><y>,SMLA{D,LD},SMLSLD,SMMULL,SMULW<y>: !RdHi, !RdLo, !Rm, !Rs 1738 - * SMMUL,SMUAD,SMUL<x><y>,SMUSD: !Rd, !Rm, !Rs 1739 - * SSAT/16: !Rd, !Rm 1740 - * STM(1/2): !Rn, register_list* (R15 in reg list not recommended) 1741 - * STRT immediate pre/post-indexed: Rd*, !Rn 1742 - * STRT register pre/post-indexed: Rd*, !Rn, !Rm 1743 - * STRT scaled register pre/post-indexed: Rd*, !Rn, !Rm 1744 - * STREX: !Rd, !Rn, !Rm 1745 - * SWP/B: !Rd, !Rn, !Rm 1746 - * {S,U}XTA{B,B16,H}: !Rd, !Rn, !Rm 1747 - * {S,U}XT{B,B16,H}: !Rd, !Rm 1748 - * UM{AA,LA,UL}L: !RdHi, !RdLo, !Rm, !Rs 1749 - * USA{D8,A8,T,T16}: !Rd, !Rm, !Rs 1750 - * 1751 - * May transfer control by writing R15 (possible mode changes or alternate 1752 - * mode accesses marked by "*"): 1753 - * ALU op (* with s-bit), B, BL, BKPT, BLX(1/2), BX, BXJ, CPS*, CPY, 1754 - * LDM(1), LDM(2/3)*, LDR, MOV, RFE*, SWI* 1755 - * 1756 - * Instructions that do not take general registers, nor transfer control: 1757 - * CDP/2, SETEND, SRS* 1758 - */
+2 -1
arch/arm/kernel/kprobes.c
··· 134 134 struct kprobe_ctlblk *kcb) 135 135 { 136 136 regs->ARM_pc += 4; 137 - p->ainsn.insn_handler(p, regs); 137 + if (p->ainsn.insn_check_cc(regs->ARM_cpsr)) 138 + p->ainsn.insn_handler(p, regs); 138 139 } 139 140 140 141 /*
+2 -1
arch/arm/kernel/perf_event.c
··· 746 746 747 747 tail = (struct frame_tail __user *)regs->ARM_fp - 1; 748 748 749 - while (tail && !((unsigned long)tail & 0x3)) 749 + while ((entry->nr < PERF_MAX_STACK_DEPTH) && 750 + tail && !((unsigned long)tail & 0x3)) 750 751 tail = user_backtrace(tail, entry); 751 752 } 752 753
+8
arch/arm/kernel/ptrace.c
··· 767 767 768 768 #ifdef CONFIG_HAVE_HW_BREAKPOINT 769 769 case PTRACE_GETHBPREGS: 770 + if (ptrace_get_breakpoints(child) < 0) 771 + return -ESRCH; 772 + 770 773 ret = ptrace_gethbpregs(child, addr, 771 774 (unsigned long __user *)data); 775 + ptrace_put_breakpoints(child); 772 776 break; 773 777 case PTRACE_SETHBPREGS: 778 + if (ptrace_get_breakpoints(child) < 0) 779 + return -ESRCH; 780 + 774 781 ret = ptrace_sethbpregs(child, addr, 775 782 (unsigned long __user *)data); 783 + ptrace_put_breakpoints(child); 776 784 break; 777 785 #endif 778 786
+1 -1
arch/arm/kernel/smp.c
··· 479 479 { 480 480 } 481 481 482 - static void broadcast_timer_setup(struct clock_event_device *evt) 482 + static void __cpuinit broadcast_timer_setup(struct clock_event_device *evt) 483 483 { 484 484 evt->name = "dummy_timer"; 485 485 evt->features = CLOCK_EVT_FEAT_ONESHOT |
+1 -1
arch/arm/kernel/sys_oabi-compat.c
··· 311 311 long err; 312 312 int i; 313 313 314 - if (nsops < 1) 314 + if (nsops < 1 || nsops > SEMOPM) 315 315 return -EINVAL; 316 316 sops = kmalloc(sizeof(*sops) * nsops, GFP_KERNEL); 317 317 if (!sops)
+1
arch/arm/mach-at91/Kconfig
··· 83 83 select CPU_ARM926T 84 84 select GENERIC_CLOCKEVENTS 85 85 select HAVE_FB_ATMEL 86 + select HAVE_NET_MACB 86 87 87 88 config ARCH_AT572D940HF 88 89 bool "AT572D940HF"
+6 -1
arch/arm/mach-at91/board-eb01.c
··· 30 30 #include <mach/board.h> 31 31 #include "generic.h" 32 32 33 + static void __init at91eb01_init_irq(void) 34 + { 35 + at91x40_init_interrupts(NULL); 36 + } 37 + 33 38 static void __init at91eb01_map_io(void) 34 39 { 35 40 at91x40_initialize(40000000); ··· 43 38 MACHINE_START(AT91EB01, "Atmel AT91 EB01") 44 39 /* Maintainer: Greg Ungerer <gerg@snapgear.com> */ 45 40 .timer = &at91x40_timer, 46 - .init_irq = at91x40_init_interrupts, 41 + .init_irq = at91eb01_init_irq, 47 42 .map_io = at91eb01_map_io, 48 43 MACHINE_END 49 44
+28
arch/arm/mach-at91/include/mach/cpu.h
··· 27 27 #define ARCH_ID_AT91SAM9G45 0x819b05a0 28 28 #define ARCH_ID_AT91SAM9G45MRL 0x819b05a2 /* aka 9G45-ES2 & non ES lots */ 29 29 #define ARCH_ID_AT91SAM9G45ES 0x819b05a1 /* 9G45-ES (Engineering Sample) */ 30 + #define ARCH_ID_AT91SAM9X5 0x819a05a0 30 31 #define ARCH_ID_AT91CAP9 0x039A03A0 31 32 32 33 #define ARCH_ID_AT91SAM9XE128 0x329973a0 ··· 55 54 #define ARCH_EXID_AT91SAM9M10 0x00000002 56 55 #define ARCH_EXID_AT91SAM9G46 0x00000003 57 56 #define ARCH_EXID_AT91SAM9G45 0x00000004 57 + 58 + #define ARCH_EXID_AT91SAM9G15 0x00000000 59 + #define ARCH_EXID_AT91SAM9G35 0x00000001 60 + #define ARCH_EXID_AT91SAM9X35 0x00000002 61 + #define ARCH_EXID_AT91SAM9G25 0x00000003 62 + #define ARCH_EXID_AT91SAM9X25 0x00000004 58 63 59 64 static inline unsigned long at91_exid_identify(void) 60 65 { ··· 148 141 #define cpu_is_at91sam9m10() (0) 149 142 #define cpu_is_at91sam9g46() (0) 150 143 #define cpu_is_at91sam9m11() (0) 144 + #endif 145 + 146 + #ifdef CONFIG_ARCH_AT91SAM9X5 147 + #define cpu_is_at91sam9x5() (at91_cpu_identify() == ARCH_ID_AT91SAM9X5) 148 + #define cpu_is_at91sam9g15() (cpu_is_at91sam9x5() && \ 149 + (at91_exid_identify() == ARCH_EXID_AT91SAM9G15)) 150 + #define cpu_is_at91sam9g35() (cpu_is_at91sam9x5() && \ 151 + (at91_exid_identify() == ARCH_EXID_AT91SAM9G35)) 152 + #define cpu_is_at91sam9x35() (cpu_is_at91sam9x5() && \ 153 + (at91_exid_identify() == ARCH_EXID_AT91SAM9X35)) 154 + #define cpu_is_at91sam9g25() (cpu_is_at91sam9x5() && \ 155 + (at91_exid_identify() == ARCH_EXID_AT91SAM9G25)) 156 + #define cpu_is_at91sam9x25() (cpu_is_at91sam9x5() && \ 157 + (at91_exid_identify() == ARCH_EXID_AT91SAM9X25)) 158 + #else 159 + #define cpu_is_at91sam9x5() (0) 160 + #define cpu_is_at91sam9g15() (0) 161 + #define cpu_is_at91sam9g35() (0) 162 + #define cpu_is_at91sam9x35() (0) 163 + #define cpu_is_at91sam9g25() (0) 164 + #define cpu_is_at91sam9x25() (0) 151 165 #endif 152 166 153 167 #ifdef CONFIG_ARCH_AT91CAP9
+6
arch/arm/mach-davinci/Kconfig
··· 63 63 depends on ARCH_DAVINCI_DM644x 64 64 select MISC_DEVICES 65 65 select EEPROM_AT24 66 + select I2C 66 67 help 67 68 Configure this option to specify the whether the board used 68 69 for development is a DM644x EVM ··· 73 72 depends on ARCH_DAVINCI_DM644x 74 73 select MISC_DEVICES 75 74 select EEPROM_AT24 75 + select I2C 76 76 help 77 77 Say Y here to select the Lyrtech Small Form Factor 78 78 Software Defined Radio (SFFSDR) board. ··· 107 105 select MACH_DAVINCI_DM6467TEVM 108 106 select MISC_DEVICES 109 107 select EEPROM_AT24 108 + select I2C 110 109 help 111 110 Configure this option to specify the whether the board used 112 111 for development is a DM6467 EVM ··· 121 118 depends on ARCH_DAVINCI_DM365 122 119 select MISC_DEVICES 123 120 select EEPROM_AT24 121 + select I2C 124 122 help 125 123 Configure this option to specify whether the board used 126 124 for development is a DM365 EVM ··· 133 129 select GPIO_PCF857X 134 130 select MISC_DEVICES 135 131 select EEPROM_AT24 132 + select I2C 136 133 help 137 134 Say Y here to select the TI DA830/OMAP-L137/AM17x Evaluation Module. 138 135 ··· 210 205 depends on ARCH_DAVINCI_DA850 211 206 select MISC_DEVICES 212 207 select EEPROM_AT24 208 + select I2C 213 209 help 214 210 Say Y here to select the Critical Link MityDSP-L138/MityARM-1808 215 211 System on Module. Information on this SoM may be found at
+2 -2
arch/arm/mach-davinci/board-mityomapl138.c
··· 29 29 #include <mach/mux.h> 30 30 #include <mach/spi.h> 31 31 32 - #define MITYOMAPL138_PHY_ID "0:03" 32 + #define MITYOMAPL138_PHY_ID "" 33 33 34 34 #define FACTORY_CONFIG_MAGIC 0x012C0138 35 35 #define FACTORY_CONFIG_VERSION 0x00010001 ··· 414 414 415 415 static struct platform_device mityomapl138_nandflash_device = { 416 416 .name = "davinci_nand", 417 - .id = 0, 417 + .id = 1, 418 418 .dev = { 419 419 .platform_data = &mityomapl138_nandflash_data, 420 420 },
+9 -3
arch/arm/mach-davinci/devices-da8xx.c
··· 39 39 #define DA8XX_GPIO_BASE 0x01e26000 40 40 #define DA8XX_I2C1_BASE 0x01e28000 41 41 #define DA8XX_SPI0_BASE 0x01c41000 42 - #define DA8XX_SPI1_BASE 0x01f0e000 42 + #define DA830_SPI1_BASE 0x01e12000 43 + #define DA850_SPI1_BASE 0x01f0e000 43 44 44 45 #define DA8XX_EMAC_CTRL_REG_OFFSET 0x3000 45 46 #define DA8XX_EMAC_MOD_REG_OFFSET 0x2000 ··· 763 762 764 763 static struct resource da8xx_spi1_resources[] = { 765 764 [0] = { 766 - .start = DA8XX_SPI1_BASE, 767 - .end = DA8XX_SPI1_BASE + SZ_4K - 1, 765 + .start = DA830_SPI1_BASE, 766 + .end = DA830_SPI1_BASE + SZ_4K - 1, 768 767 .flags = IORESOURCE_MEM, 769 768 }, 770 769 [1] = { ··· 832 831 " %d\n", __func__, instance, ret); 833 832 834 833 da8xx_spi_pdata[instance].num_chipselect = len; 834 + 835 + if (instance == 1 && cpu_is_davinci_da850()) { 836 + da8xx_spi1_resources[0].start = DA850_SPI1_BASE; 837 + da8xx_spi1_resources[0].end = DA850_SPI1_BASE + SZ_4K - 1; 838 + } 835 839 836 840 return platform_device_register(&da8xx_spi_device[instance]); 837 841 }
+1 -1
arch/arm/mach-davinci/dm355.c
··· 314 314 .name = "timer2", 315 315 .parent = &pll1_aux_clk, 316 316 .lpsc = DAVINCI_LPSC_TIMER2, 317 - .usecount = 1, /* REVISIT: why can't' this be disabled? */ 317 + .usecount = 1, /* REVISIT: why can't this be disabled? */ 318 318 }; 319 319 320 320 static struct clk timer3_clk = {
+1 -1
arch/arm/mach-davinci/dm644x.c
··· 274 274 .name = "timer2", 275 275 .parent = &pll1_aux_clk, 276 276 .lpsc = DAVINCI_LPSC_TIMER2, 277 - .usecount = 1, /* REVISIT: why can't' this be disabled? */ 277 + .usecount = 1, /* REVISIT: why can't this be disabled? */ 278 278 }; 279 279 280 280 static struct clk_lookup dm644x_clks[] = {
+8 -5
arch/arm/mach-davinci/include/mach/debug-macro.S
··· 24 24 25 25 #define UART_SHIFT 2 26 26 27 + #define davinci_uart_v2p(x) ((x) - PAGE_OFFSET + PLAT_PHYS_OFFSET) 28 + #define davinci_uart_p2v(x) ((x) - PLAT_PHYS_OFFSET + PAGE_OFFSET) 29 + 27 30 .pushsection .data 28 31 davinci_uart_phys: .word 0 29 32 davinci_uart_virt: .word 0 ··· 37 34 /* Use davinci_uart_phys/virt if already configured */ 38 35 10: mrc p15, 0, \rp, c1, c0 39 36 tst \rp, #1 @ MMU enabled? 40 - ldreq \rp, =__virt_to_phys(davinci_uart_phys) 37 + ldreq \rp, =davinci_uart_v2p(davinci_uart_phys) 41 38 ldrne \rp, =davinci_uart_phys 42 39 add \rv, \rp, #4 @ davinci_uart_virt 43 40 ldr \rp, [\rp, #0] ··· 51 48 tst \rp, #1 @ MMU enabled? 52 49 53 50 /* Copy uart phys address from decompressor uart info */ 54 - ldreq \rv, =__virt_to_phys(davinci_uart_phys) 51 + ldreq \rv, =davinci_uart_v2p(davinci_uart_phys) 55 52 ldrne \rv, =davinci_uart_phys 56 53 ldreq \rp, =DAVINCI_UART_INFO 57 - ldrne \rp, =__phys_to_virt(DAVINCI_UART_INFO) 54 + ldrne \rp, =davinci_uart_p2v(DAVINCI_UART_INFO) 58 55 ldr \rp, [\rp, #0] 59 56 str \rp, [\rv] 60 57 61 58 /* Copy uart virt address from decompressor uart info */ 62 - ldreq \rv, =__virt_to_phys(davinci_uart_virt) 59 + ldreq \rv, =davinci_uart_v2p(davinci_uart_virt) 63 60 ldrne \rv, =davinci_uart_virt 64 61 ldreq \rp, =DAVINCI_UART_INFO 65 - ldrne \rp, =__phys_to_virt(DAVINCI_UART_INFO) 62 + ldrne \rp, =davinci_uart_p2v(DAVINCI_UART_INFO) 66 63 ldr \rp, [\rp, #4] 67 64 str \rp, [\rv] 68 65
+1 -1
arch/arm/mach-davinci/include/mach/serial.h
··· 22 22 * 23 23 * This area sits just below the page tables (see arch/arm/kernel/head.S). 24 24 */ 25 - #define DAVINCI_UART_INFO (PHYS_OFFSET + 0x3ff8) 25 + #define DAVINCI_UART_INFO (PLAT_PHYS_OFFSET + 0x3ff8) 26 26 27 27 #define DAVINCI_UART0_BASE (IO_PHYS + 0x20000) 28 28 #define DAVINCI_UART1_BASE (IO_PHYS + 0x20400)
+8 -3
arch/arm/mach-mx3/mach-vpr200.c
··· 257 257 .workaround = FLS_USB2_WORKAROUND_ENGCM09152, 258 258 }; 259 259 260 + static int vpr200_usbh_init(struct platform_device *pdev) 261 + { 262 + return mx35_initialize_usb_hw(pdev->id, 263 + MXC_EHCI_INTERFACE_SINGLE_UNI | MXC_EHCI_INTERNAL_PHY); 264 + } 265 + 260 266 /* USB HOST config */ 261 267 static const struct mxc_usbh_platform_data usb_host_pdata __initconst = { 262 - .portsc = MXC_EHCI_MODE_SERIAL, 263 - .flags = MXC_EHCI_INTERFACE_SINGLE_UNI | 264 - MXC_EHCI_INTERNAL_PHY, 268 + .init = vpr200_usbh_init, 269 + .portsc = MXC_EHCI_MODE_SERIAL, 265 270 }; 266 271 267 272 static struct platform_device *devices[] __initdata = {
+1 -1
arch/arm/mach-mx5/board-mx53_loco.c
··· 193 193 .wakeup = wake, \ 194 194 } 195 195 196 - static const struct gpio_keys_button loco_buttons[] __initconst = { 196 + static struct gpio_keys_button loco_buttons[] = { 197 197 GPIO_BUTTON(MX53_LOCO_POWER, KEY_POWER, 1, "power", 0), 198 198 GPIO_BUTTON(MX53_LOCO_UI1, KEY_VOLUMEUP, 1, "volume-up", 0), 199 199 GPIO_BUTTON(MX53_LOCO_UI2, KEY_VOLUMEDOWN, 1, "volume-down", 0),
+6 -1
arch/arm/mach-mxs/clock-mx28.c
··· 295 295 unsigned long diff, parent_rate, calc_rate; \ 296 296 int i; \ 297 297 \ 298 - parent_rate = clk_get_rate(clk->parent); \ 299 298 div_max = BM_CLKCTRL_##dr##_DIV >> BP_CLKCTRL_##dr##_DIV; \ 300 299 bm_busy = BM_CLKCTRL_##dr##_BUSY; \ 301 300 \ 302 301 if (clk->parent == &ref_xtal_clk) { \ 302 + parent_rate = clk_get_rate(clk->parent); \ 303 303 div = DIV_ROUND_UP(parent_rate, rate); \ 304 304 if (clk == &cpu_clk) { \ 305 305 div_max = BM_CLKCTRL_CPU_DIV_XTAL >> \ ··· 309 309 if (div == 0 || div > div_max) \ 310 310 return -EINVAL; \ 311 311 } else { \ 312 + /* \ 313 + * hack alert: this block modifies clk->parent, too, \ 314 + * so the base to use it the grand parent. \ 315 + */ \ 316 + parent_rate = clk_get_rate(clk->parent->parent); \ 312 317 rate >>= PARENT_RATE_SHIFT; \ 313 318 parent_rate >>= PARENT_RATE_SHIFT; \ 314 319 diff = parent_rate; \
+1 -1
arch/arm/mach-omap2/Makefile
··· 68 68 obj-$(CONFIG_OMAP_SMARTREFLEX_CLASS3) += smartreflex-class3.o 69 69 70 70 AFLAGS_sleep24xx.o :=-Wa,-march=armv6 71 - AFLAGS_sleep34xx.o :=-Wa,-march=armv7-a 71 + AFLAGS_sleep34xx.o :=-Wa,-march=armv7-a$(plus_sec) 72 72 73 73 ifeq ($(CONFIG_PM_VERBOSE),y) 74 74 CFLAGS_pm_bus.o += -DDEBUG
+7 -2
arch/arm/mach-omap2/board-rx51.c
··· 141 141 static void __init rx51_map_io(void) 142 142 { 143 143 omap2_set_globals_3xxx(); 144 - rx51_video_mem_init(); 145 144 omap34xx_map_common_io(); 145 + } 146 + 147 + static void __init rx51_reserve(void) 148 + { 149 + rx51_video_mem_init(); 150 + omap_reserve(); 146 151 } 147 152 148 153 MACHINE_START(NOKIA_RX51, "Nokia RX-51 board") 149 154 /* Maintainer: Lauri Leukkunen <lauri.leukkunen@nokia.com> */ 150 155 .boot_params = 0x80000100, 151 - .reserve = omap_reserve, 156 + .reserve = rx51_reserve, 152 157 .map_io = rx51_map_io, 153 158 .init_early = rx51_init_early, 154 159 .init_irq = omap_init_irq,
+2 -7
arch/arm/mach-omap2/clock44xx_data.c
··· 3116 3116 CLK(NULL, "dsp_fck", &dsp_fck, CK_443X), 3117 3117 CLK("omapdss_dss", "sys_clk", &dss_sys_clk, CK_443X), 3118 3118 CLK("omapdss_dss", "tv_clk", &dss_tv_clk, CK_443X), 3119 - CLK("omapdss_dss", "dss_clk", &dss_dss_clk, CK_443X), 3120 3119 CLK("omapdss_dss", "video_clk", &dss_48mhz_clk, CK_443X), 3121 - CLK("omapdss_dss", "fck", &dss_fck, CK_443X), 3122 - /* 3123 - * On OMAP4, DSS ick is a dummy clock; this is needed for compatibility 3124 - * with OMAP2/3. 3125 - */ 3126 - CLK("omapdss_dss", "ick", &dummy_ck, CK_443X), 3120 + CLK("omapdss_dss", "fck", &dss_dss_clk, CK_443X), 3121 + CLK("omapdss_dss", "ick", &dss_fck, CK_443X), 3127 3122 CLK(NULL, "efuse_ctrl_cust_fck", &efuse_ctrl_cust_fck, CK_443X), 3128 3123 CLK(NULL, "emif1_fck", &emif1_fck, CK_443X), 3129 3124 CLK(NULL, "emif2_fck", &emif2_fck, CK_443X),
+17
arch/arm/mach-omap2/cm2xxx_3xxx.c
··· 247 247 u32 per_cm_clksel; 248 248 u32 emu_cm_clksel; 249 249 u32 emu_cm_clkstctrl; 250 + u32 pll_cm_autoidle; 250 251 u32 pll_cm_autoidle2; 251 252 u32 pll_cm_clksel4; 252 253 u32 pll_cm_clksel5; ··· 320 319 omap2_cm_read_mod_reg(OMAP3430_EMU_MOD, CM_CLKSEL1); 321 320 cm_context.emu_cm_clkstctrl = 322 321 omap2_cm_read_mod_reg(OMAP3430_EMU_MOD, OMAP2_CM_CLKSTCTRL); 322 + /* 323 + * As per erratum i671, ROM code does not respect the PER DPLL 324 + * programming scheme if CM_AUTOIDLE_PLL.AUTO_PERIPH_DPLL == 1. 325 + * In this case, even though this register has been saved in 326 + * scratchpad contents, we need to restore AUTO_PERIPH_DPLL 327 + * by ourselves. So, we need to save it anyway. 328 + */ 329 + cm_context.pll_cm_autoidle = 330 + omap2_cm_read_mod_reg(PLL_MOD, CM_AUTOIDLE); 323 331 cm_context.pll_cm_autoidle2 = 324 332 omap2_cm_read_mod_reg(PLL_MOD, CM_AUTOIDLE2); 325 333 cm_context.pll_cm_clksel4 = ··· 451 441 CM_CLKSEL1); 452 442 omap2_cm_write_mod_reg(cm_context.emu_cm_clkstctrl, OMAP3430_EMU_MOD, 453 443 OMAP2_CM_CLKSTCTRL); 444 + /* 445 + * As per erratum i671, ROM code does not respect the PER DPLL 446 + * programming scheme if CM_AUTOIDLE_PLL.AUTO_PERIPH_DPLL == 1. 447 + * In this case, we need to restore AUTO_PERIPH_DPLL by ourselves. 448 + */ 449 + omap2_cm_write_mod_reg(cm_context.pll_cm_autoidle, PLL_MOD, 450 + CM_AUTOIDLE); 454 451 omap2_cm_write_mod_reg(cm_context.pll_cm_autoidle2, PLL_MOD, 455 452 CM_AUTOIDLE2); 456 453 omap2_cm_write_mod_reg(cm_context.pll_cm_clksel4, PLL_MOD,
+7 -1
arch/arm/mach-omap2/control.c
··· 316 316 omap2_cm_read_mod_reg(WKUP_MOD, CM_CLKSEL); 317 317 prcm_block_contents.cm_clken_pll = 318 318 omap2_cm_read_mod_reg(PLL_MOD, CM_CLKEN); 319 + /* 320 + * As per erratum i671, ROM code does not respect the PER DPLL 321 + * programming scheme if CM_AUTOIDLE_PLL..AUTO_PERIPH_DPLL == 1. 322 + * Then, in anycase, clear these bits to avoid extra latencies. 323 + */ 319 324 prcm_block_contents.cm_autoidle_pll = 320 - omap2_cm_read_mod_reg(PLL_MOD, OMAP3430_CM_AUTOIDLE_PLL); 325 + omap2_cm_read_mod_reg(PLL_MOD, CM_AUTOIDLE) & 326 + ~OMAP3430_AUTO_PERIPH_DPLL_MASK; 321 327 prcm_block_contents.cm_clksel1_pll = 322 328 omap2_cm_read_mod_reg(PLL_MOD, OMAP3430_CM_CLKSEL1_PLL); 323 329 prcm_block_contents.cm_clksel2_pll =
+5 -1
arch/arm/mach-omap2/omap_hwmod_2420_data.c
··· 1639 1639 1640 1640 static struct omap_hwmod omap2420_gpio1_hwmod = { 1641 1641 .name = "gpio1", 1642 + .flags = HWMOD_CONTROL_OPT_CLKS_IN_RESET, 1642 1643 .mpu_irqs = omap242x_gpio1_irqs, 1643 1644 .mpu_irqs_cnt = ARRAY_SIZE(omap242x_gpio1_irqs), 1644 1645 .main_clk = "gpios_fck", ··· 1670 1669 1671 1670 static struct omap_hwmod omap2420_gpio2_hwmod = { 1672 1671 .name = "gpio2", 1672 + .flags = HWMOD_CONTROL_OPT_CLKS_IN_RESET, 1673 1673 .mpu_irqs = omap242x_gpio2_irqs, 1674 1674 .mpu_irqs_cnt = ARRAY_SIZE(omap242x_gpio2_irqs), 1675 1675 .main_clk = "gpios_fck", ··· 1701 1699 1702 1700 static struct omap_hwmod omap2420_gpio3_hwmod = { 1703 1701 .name = "gpio3", 1702 + .flags = HWMOD_CONTROL_OPT_CLKS_IN_RESET, 1704 1703 .mpu_irqs = omap242x_gpio3_irqs, 1705 1704 .mpu_irqs_cnt = ARRAY_SIZE(omap242x_gpio3_irqs), 1706 1705 .main_clk = "gpios_fck", ··· 1732 1729 1733 1730 static struct omap_hwmod omap2420_gpio4_hwmod = { 1734 1731 .name = "gpio4", 1732 + .flags = HWMOD_CONTROL_OPT_CLKS_IN_RESET, 1735 1733 .mpu_irqs = omap242x_gpio4_irqs, 1736 1734 .mpu_irqs_cnt = ARRAY_SIZE(omap242x_gpio4_irqs), 1737 1735 .main_clk = "gpios_fck", ··· 1786 1782 static struct omap_hwmod_addr_space omap2420_dma_system_addrs[] = { 1787 1783 { 1788 1784 .pa_start = 0x48056000, 1789 - .pa_end = 0x4a0560ff, 1785 + .pa_end = 0x48056fff, 1790 1786 .flags = ADDR_TYPE_RT 1791 1787 }, 1792 1788 };
+6 -1
arch/arm/mach-omap2/omap_hwmod_2430_data.c
··· 1742 1742 1743 1743 static struct omap_hwmod omap2430_gpio1_hwmod = { 1744 1744 .name = "gpio1", 1745 + .flags = HWMOD_CONTROL_OPT_CLKS_IN_RESET, 1745 1746 .mpu_irqs = omap243x_gpio1_irqs, 1746 1747 .mpu_irqs_cnt = ARRAY_SIZE(omap243x_gpio1_irqs), 1747 1748 .main_clk = "gpios_fck", ··· 1773 1772 1774 1773 static struct omap_hwmod omap2430_gpio2_hwmod = { 1775 1774 .name = "gpio2", 1775 + .flags = HWMOD_CONTROL_OPT_CLKS_IN_RESET, 1776 1776 .mpu_irqs = omap243x_gpio2_irqs, 1777 1777 .mpu_irqs_cnt = ARRAY_SIZE(omap243x_gpio2_irqs), 1778 1778 .main_clk = "gpios_fck", ··· 1804 1802 1805 1803 static struct omap_hwmod omap2430_gpio3_hwmod = { 1806 1804 .name = "gpio3", 1805 + .flags = HWMOD_CONTROL_OPT_CLKS_IN_RESET, 1807 1806 .mpu_irqs = omap243x_gpio3_irqs, 1808 1807 .mpu_irqs_cnt = ARRAY_SIZE(omap243x_gpio3_irqs), 1809 1808 .main_clk = "gpios_fck", ··· 1835 1832 1836 1833 static struct omap_hwmod omap2430_gpio4_hwmod = { 1837 1834 .name = "gpio4", 1835 + .flags = HWMOD_CONTROL_OPT_CLKS_IN_RESET, 1838 1836 .mpu_irqs = omap243x_gpio4_irqs, 1839 1837 .mpu_irqs_cnt = ARRAY_SIZE(omap243x_gpio4_irqs), 1840 1838 .main_clk = "gpios_fck", ··· 1866 1862 1867 1863 static struct omap_hwmod omap2430_gpio5_hwmod = { 1868 1864 .name = "gpio5", 1865 + .flags = HWMOD_CONTROL_OPT_CLKS_IN_RESET, 1869 1866 .mpu_irqs = omap243x_gpio5_irqs, 1870 1867 .mpu_irqs_cnt = ARRAY_SIZE(omap243x_gpio5_irqs), 1871 1868 .main_clk = "gpio5_fck", ··· 1920 1915 static struct omap_hwmod_addr_space omap2430_dma_system_addrs[] = { 1921 1916 { 1922 1917 .pa_start = 0x48056000, 1923 - .pa_end = 0x4a0560ff, 1918 + .pa_end = 0x48056fff, 1924 1919 .flags = ADDR_TYPE_RT 1925 1920 }, 1926 1921 };
+7 -1
arch/arm/mach-omap2/omap_hwmod_3xxx_data.c
··· 2141 2141 2142 2142 static struct omap_hwmod omap3xxx_gpio1_hwmod = { 2143 2143 .name = "gpio1", 2144 + .flags = HWMOD_CONTROL_OPT_CLKS_IN_RESET, 2144 2145 .mpu_irqs = omap3xxx_gpio1_irqs, 2145 2146 .mpu_irqs_cnt = ARRAY_SIZE(omap3xxx_gpio1_irqs), 2146 2147 .main_clk = "gpio1_ick", ··· 2178 2177 2179 2178 static struct omap_hwmod omap3xxx_gpio2_hwmod = { 2180 2179 .name = "gpio2", 2180 + .flags = HWMOD_CONTROL_OPT_CLKS_IN_RESET, 2181 2181 .mpu_irqs = omap3xxx_gpio2_irqs, 2182 2182 .mpu_irqs_cnt = ARRAY_SIZE(omap3xxx_gpio2_irqs), 2183 2183 .main_clk = "gpio2_ick", ··· 2215 2213 2216 2214 static struct omap_hwmod omap3xxx_gpio3_hwmod = { 2217 2215 .name = "gpio3", 2216 + .flags = HWMOD_CONTROL_OPT_CLKS_IN_RESET, 2218 2217 .mpu_irqs = omap3xxx_gpio3_irqs, 2219 2218 .mpu_irqs_cnt = ARRAY_SIZE(omap3xxx_gpio3_irqs), 2220 2219 .main_clk = "gpio3_ick", ··· 2252 2249 2253 2250 static struct omap_hwmod omap3xxx_gpio4_hwmod = { 2254 2251 .name = "gpio4", 2252 + .flags = HWMOD_CONTROL_OPT_CLKS_IN_RESET, 2255 2253 .mpu_irqs = omap3xxx_gpio4_irqs, 2256 2254 .mpu_irqs_cnt = ARRAY_SIZE(omap3xxx_gpio4_irqs), 2257 2255 .main_clk = "gpio4_ick", ··· 2289 2285 2290 2286 static struct omap_hwmod omap3xxx_gpio5_hwmod = { 2291 2287 .name = "gpio5", 2288 + .flags = HWMOD_CONTROL_OPT_CLKS_IN_RESET, 2292 2289 .mpu_irqs = omap3xxx_gpio5_irqs, 2293 2290 .mpu_irqs_cnt = ARRAY_SIZE(omap3xxx_gpio5_irqs), 2294 2291 .main_clk = "gpio5_ick", ··· 2326 2321 2327 2322 static struct omap_hwmod omap3xxx_gpio6_hwmod = { 2328 2323 .name = "gpio6", 2324 + .flags = HWMOD_CONTROL_OPT_CLKS_IN_RESET, 2329 2325 .mpu_irqs = omap3xxx_gpio6_irqs, 2330 2326 .mpu_irqs_cnt = ARRAY_SIZE(omap3xxx_gpio6_irqs), 2331 2327 .main_clk = "gpio6_ick", ··· 2392 2386 static struct omap_hwmod_addr_space omap3xxx_dma_system_addrs[] = { 2393 2387 { 2394 2388 .pa_start = 0x48056000, 2395 - .pa_end = 0x4a0560ff, 2389 + .pa_end = 0x48056fff, 2396 2390 .flags = ADDR_TYPE_RT 2397 2391 }, 2398 2392 };
+1 -1
arch/arm/mach-omap2/omap_hwmod_44xx_data.c
··· 885 885 static struct omap_hwmod_addr_space omap44xx_dma_system_addrs[] = { 886 886 { 887 887 .pa_start = 0x4a056000, 888 - .pa_end = 0x4a0560ff, 888 + .pa_end = 0x4a056fff, 889 889 .flags = ADDR_TYPE_RT 890 890 }, 891 891 };
+2 -2
arch/arm/mach-omap2/omap_l3_smx.c
··· 196 196 /* No timeout error for debug sources */ 197 197 } 198 198 199 - base = ((l3->rt) + (*(omap3_l3_bases[int_type] + err_source))); 200 - 201 199 /* identify the error source */ 202 200 for (err_source = 0; !(status & (1 << err_source)); err_source++) 203 201 ; 202 + 203 + base = l3->rt + *(omap3_l3_bases[int_type] + err_source); 204 204 error = omap3_l3_readll(base, L3_ERROR_LOG); 205 205 206 206 if (error) {
+1
arch/arm/mach-omap2/pm.c
··· 89 89 if (cpu_is_omap44xx()) { 90 90 _init_omap_device("l3_main_1", &l3_dev); 91 91 _init_omap_device("dsp", &dsp_dev); 92 + _init_omap_device("iva", &iva_dev); 92 93 } else { 93 94 _init_omap_device("l3_main", &l3_dev); 94 95 }
-1
arch/arm/mach-omap2/voltage.c
··· 114 114 sys_clk_speed /= 1000; 115 115 116 116 /* Generic voltage parameters */ 117 - vdd->curr_volt = 1200000; 118 117 vdd->volt_scale = vp_forceupdate_scale_voltage; 119 118 vdd->vp_enabled = false; 120 119
+1 -1
arch/arm/mach-pxa/hx4700.c
··· 711 711 static struct regulator_init_data bq24022_init_data = { 712 712 .constraints = { 713 713 .max_uA = 500000, 714 - .valid_ops_mask = REGULATOR_CHANGE_CURRENT, 714 + .valid_ops_mask = REGULATOR_CHANGE_CURRENT|REGULATOR_CHANGE_STATUS, 715 715 }, 716 716 .num_consumer_supplies = ARRAY_SIZE(bq24022_consumers), 717 717 .consumer_supplies = bq24022_consumers,
+1 -1
arch/arm/mach-pxa/magician.c
··· 599 599 static struct regulator_init_data bq24022_init_data = { 600 600 .constraints = { 601 601 .max_uA = 500000, 602 - .valid_ops_mask = REGULATOR_CHANGE_CURRENT, 602 + .valid_ops_mask = REGULATOR_CHANGE_CURRENT | REGULATOR_CHANGE_STATUS, 603 603 }, 604 604 .num_consumer_supplies = ARRAY_SIZE(bq24022_consumers), 605 605 .consumer_supplies = bq24022_consumers,
+1 -1
arch/arm/mm/proc-xscale.S
··· 395 395 teq r2, #DMA_TO_DEVICE 396 396 beq xscale_dma_clean_range 397 397 b xscale_dma_flush_range 398 - ENDPROC(xscsale_dma_a0_map_area) 398 + ENDPROC(xscale_dma_a0_map_area) 399 399 400 400 /* 401 401 * dma_unmap_area(start, size, dir)
+7
arch/arm/plat-mxc/gpio.c
··· 295 295 return 0; 296 296 } 297 297 298 + /* 299 + * This lock class tells lockdep that GPIO irqs are in a different 300 + * category than their parents, so it won't report false recursion. 301 + */ 302 + static struct lock_class_key gpio_lock_class; 303 + 298 304 int __init mxc_gpio_init(struct mxc_gpio_port *port, int cnt) 299 305 { 300 306 int i, j; ··· 317 311 __raw_writel(~0, port[i].base + GPIO_ISR); 318 312 for (j = port[i].virtual_irq_start; 319 313 j < port[i].virtual_irq_start + 32; j++) { 314 + irq_set_lockdep_class(j, &gpio_lock_class); 320 315 irq_set_chip_and_handler(j, &gpio_irq_chip, 321 316 handle_level_irq); 322 317 set_irq_flags(j, IRQF_VALID);
+2
arch/arm/plat-mxc/ssi-fiq.S
··· 124 124 1: 125 125 @ return from FIQ 126 126 subs pc, lr, #4 127 + 128 + .align 127 129 imx_ssi_fiq_base: 128 130 .word 0x0 129 131 imx_ssi_fiq_rx_buffer:
+2
arch/m68k/mm/motorola.c
··· 300 300 zones_size[ZONE_DMA] = m68k_memory[i].size >> PAGE_SHIFT; 301 301 free_area_init_node(i, zones_size, 302 302 m68k_memory[i].addr >> PAGE_SHIFT, NULL); 303 + if (node_present_pages(i)) 304 + node_set_state(i, N_NORMAL_MEMORY); 303 305 } 304 306 } 305 307
+3 -1
arch/parisc/mm/init.c
··· 266 266 } 267 267 memset(pfnnid_map, 0xff, sizeof(pfnnid_map)); 268 268 269 - for (i = 0; i < npmem_ranges; i++) 269 + for (i = 0; i < npmem_ranges; i++) { 270 + node_set_state(i, N_NORMAL_MEMORY); 270 271 node_set_online(i); 272 + } 271 273 #endif 272 274 273 275 /*
+2 -2
arch/powerpc/include/asm/8xx_immap.h
··· 393 393 uint fec_addr_low; /* lower 32 bits of station address */ 394 394 ushort fec_addr_high; /* upper 16 bits of station address */ 395 395 ushort res1; /* reserved */ 396 - uint fec_hash_table_high; /* upper 32-bits of hash table */ 397 - uint fec_hash_table_low; /* lower 32-bits of hash table */ 396 + uint fec_grp_hash_table_high; /* upper 32-bits of hash table */ 397 + uint fec_grp_hash_table_low; /* lower 32-bits of hash table */ 398 398 uint fec_r_des_start; /* beginning of Rx descriptor ring */ 399 399 uint fec_x_des_start; /* beginning of Tx descriptor ring */ 400 400 uint fec_r_buff_size; /* Rx buffer size */
+1 -1
arch/powerpc/include/asm/uninorth.h
··· 60 60 * 61 61 * Obviously, the GART is not cache coherent and so any change to it 62 62 * must be flushed to memory (or maybe just make the GART space non 63 - * cachable). AGP memory itself does't seem to be cache coherent neither. 63 + * cachable). AGP memory itself doesn't seem to be cache coherent neither. 64 64 * 65 65 * In order to invalidate the GART (which is probably necessary to inval 66 66 * the bridge internal TLBs), the following sequence has to be written,
+11 -1
arch/powerpc/kernel/ptrace.c
··· 933 933 if (data && !(data & DABR_TRANSLATION)) 934 934 return -EIO; 935 935 #ifdef CONFIG_HAVE_HW_BREAKPOINT 936 + if (ptrace_get_breakpoints(task) < 0) 937 + return -ESRCH; 938 + 936 939 bp = thread->ptrace_bps[0]; 937 940 if ((!data) || !(data & (DABR_DATA_WRITE | DABR_DATA_READ))) { 938 941 if (bp) { 939 942 unregister_hw_breakpoint(bp); 940 943 thread->ptrace_bps[0] = NULL; 941 944 } 945 + ptrace_put_breakpoints(task); 942 946 return 0; 943 947 } 944 948 if (bp) { ··· 952 948 (DABR_DATA_WRITE | DABR_DATA_READ), 953 949 &attr.bp_type); 954 950 ret = modify_user_hw_breakpoint(bp, &attr); 955 - if (ret) 951 + if (ret) { 952 + ptrace_put_breakpoints(task); 956 953 return ret; 954 + } 957 955 thread->ptrace_bps[0] = bp; 956 + ptrace_put_breakpoints(task); 958 957 thread->dabr = data; 959 958 return 0; 960 959 } ··· 972 965 ptrace_triggered, task); 973 966 if (IS_ERR(bp)) { 974 967 thread->ptrace_bps[0] = NULL; 968 + ptrace_put_breakpoints(task); 975 969 return PTR_ERR(bp); 976 970 } 971 + 972 + ptrace_put_breakpoints(task); 977 973 978 974 #endif /* CONFIG_HAVE_HW_BREAKPOINT */ 979 975
+1 -1
arch/s390/crypto/prng.c
··· 76 76 77 77 /* Add the entropy */ 78 78 while (nbytes >= 8) { 79 - *((__u64 *)parm_block) ^= *((__u64 *)buf+i*8); 79 + *((__u64 *)parm_block) ^= *((__u64 *)(buf+i)); 80 80 prng_add_entropy(); 81 81 i += 8; 82 82 nbytes -= 8;
+2 -2
arch/s390/kvm/sie64a.S
··· 48 48 tm __TI_flags+7(%r2),_TIF_EXIT_SIE 49 49 jz 0f 50 50 larl %r2,sie_exit # work pending, leave sie 51 - stg %r2,__LC_RETURN_PSW+8 51 + stg %r2,SPI_PSW+8(0,%r15) 52 52 br %r14 53 53 0: larl %r2,sie_reenter # re-enter with guest id 54 - stg %r2,__LC_RETURN_PSW+8 54 + stg %r2,SPI_PSW+8(0,%r15) 55 55 1: br %r14 56 56 57 57 /*
+3 -3
arch/s390/mm/fault.c
··· 543 543 struct task_struct *tsk; 544 544 __u16 subcode; 545 545 546 - kstat_cpu(smp_processor_id()).irqs[EXTINT_PFL]++; 547 546 /* 548 547 * Get the external interruption subcode & pfault 549 548 * initial/completion signal bit. VM stores this ··· 552 553 subcode = ext_int_code >> 16; 553 554 if ((subcode & 0xff00) != __SUBCODE_MASK) 554 555 return; 556 + kstat_cpu(smp_processor_id()).irqs[EXTINT_PFL]++; 555 557 556 558 /* 557 559 * Get the token (= address of the task structure of the affected task). 558 560 */ 559 561 #ifdef CONFIG_64BIT 560 - tsk = *(struct task_struct **) param64; 562 + tsk = (struct task_struct *) param64; 561 563 #else 562 - tsk = *(struct task_struct **) param32; 564 + tsk = (struct task_struct *) param32; 563 565 #endif 564 566 565 567 if (subcode & 0x0080) {
+3 -2
arch/s390/mm/pageattr.c
··· 24 24 WARN_ON_ONCE(1); 25 25 continue; 26 26 } 27 - ptep = pte_offset_kernel(pmdp, addr + i * PAGE_SIZE); 27 + ptep = pte_offset_kernel(pmdp, addr); 28 28 29 29 pte = *ptep; 30 30 pte = set(pte); 31 - ptep_invalidate(&init_mm, addr + i * PAGE_SIZE, ptep); 31 + ptep_invalidate(&init_mm, addr, ptep); 32 32 *ptep = pte; 33 + addr += PAGE_SIZE; 33 34 } 34 35 } 35 36
+4
arch/sh/kernel/ptrace_32.c
··· 117 117 118 118 set_tsk_thread_flag(child, TIF_SINGLESTEP); 119 119 120 + if (ptrace_get_breakpoints(child) < 0) 121 + return; 122 + 120 123 set_single_step(child, pc); 124 + ptrace_put_breakpoints(child); 121 125 } 122 126 123 127 void user_disable_single_step(struct task_struct *child)
+1 -1
arch/um/Kconfig.um
··· 47 47 48 48 config HPPFS 49 49 tristate "HoneyPot ProcFS (EXPERIMENTAL)" 50 - depends on EXPERIMENTAL 50 + depends on EXPERIMENTAL && PROC_FS 51 51 help 52 52 hppfs (HoneyPot ProcFS) is a filesystem which allows UML /proc 53 53 entries to be overridden, removed, or fabricated from the host.
+4 -1
arch/um/include/asm/thread_info.h
··· 49 49 { 50 50 struct thread_info *ti; 51 51 unsigned long mask = THREAD_SIZE - 1; 52 - ti = (struct thread_info *) (((unsigned long) &ti) & ~mask); 52 + void *p; 53 + 54 + asm volatile ("" : "=r" (p) : "0" (&ti)); 55 + ti = (struct thread_info *) (((unsigned long)p) & ~mask); 53 56 return ti; 54 57 } 55 58
+1 -1
arch/um/sys-i386/Makefile
··· 4 4 5 5 obj-y = bug.o bugs.o checksum.o delay.o fault.o ksyms.o ldt.o ptrace.o \ 6 6 ptrace_user.o setjmp.o signal.o stub.o stub_segv.o syscalls.o sysrq.o \ 7 - sys_call_table.o tls.o 7 + sys_call_table.o tls.o atomic64_cx8_32.o 8 8 9 9 obj-$(CONFIG_BINFMT_ELF) += elfcore.o 10 10
+225
arch/um/sys-i386/atomic64_cx8_32.S
··· 1 + /* 2 + * atomic64_t for 586+ 3 + * 4 + * Copied from arch/x86/lib/atomic64_cx8_32.S 5 + * 6 + * Copyright © 2010 Luca Barbieri 7 + * 8 + * This program is free software; you can redistribute it and/or modify 9 + * it under the terms of the GNU General Public License as published by 10 + * the Free Software Foundation; either version 2 of the License, or 11 + * (at your option) any later version. 12 + * 13 + */ 14 + 15 + #include <linux/linkage.h> 16 + #include <asm/alternative-asm.h> 17 + #include <asm/dwarf2.h> 18 + 19 + .macro SAVE reg 20 + pushl_cfi %\reg 21 + CFI_REL_OFFSET \reg, 0 22 + .endm 23 + 24 + .macro RESTORE reg 25 + popl_cfi %\reg 26 + CFI_RESTORE \reg 27 + .endm 28 + 29 + .macro read64 reg 30 + movl %ebx, %eax 31 + movl %ecx, %edx 32 + /* we need LOCK_PREFIX since otherwise cmpxchg8b always does the write */ 33 + LOCK_PREFIX 34 + cmpxchg8b (\reg) 35 + .endm 36 + 37 + ENTRY(atomic64_read_cx8) 38 + CFI_STARTPROC 39 + 40 + read64 %ecx 41 + ret 42 + CFI_ENDPROC 43 + ENDPROC(atomic64_read_cx8) 44 + 45 + ENTRY(atomic64_set_cx8) 46 + CFI_STARTPROC 47 + 48 + 1: 49 + /* we don't need LOCK_PREFIX since aligned 64-bit writes 50 + * are atomic on 586 and newer */ 51 + cmpxchg8b (%esi) 52 + jne 1b 53 + 54 + ret 55 + CFI_ENDPROC 56 + ENDPROC(atomic64_set_cx8) 57 + 58 + ENTRY(atomic64_xchg_cx8) 59 + CFI_STARTPROC 60 + 61 + movl %ebx, %eax 62 + movl %ecx, %edx 63 + 1: 64 + LOCK_PREFIX 65 + cmpxchg8b (%esi) 66 + jne 1b 67 + 68 + ret 69 + CFI_ENDPROC 70 + ENDPROC(atomic64_xchg_cx8) 71 + 72 + .macro addsub_return func ins insc 73 + ENTRY(atomic64_\func\()_return_cx8) 74 + CFI_STARTPROC 75 + SAVE ebp 76 + SAVE ebx 77 + SAVE esi 78 + SAVE edi 79 + 80 + movl %eax, %esi 81 + movl %edx, %edi 82 + movl %ecx, %ebp 83 + 84 + read64 %ebp 85 + 1: 86 + movl %eax, %ebx 87 + movl %edx, %ecx 88 + \ins\()l %esi, %ebx 89 + \insc\()l %edi, %ecx 90 + LOCK_PREFIX 91 + cmpxchg8b (%ebp) 92 + jne 1b 93 + 94 + 10: 95 + movl %ebx, %eax 96 + movl %ecx, %edx 97 + RESTORE edi 98 + RESTORE esi 99 + RESTORE ebx 100 + RESTORE ebp 101 + ret 102 + CFI_ENDPROC 103 + ENDPROC(atomic64_\func\()_return_cx8) 104 + .endm 105 + 106 + addsub_return add add adc 107 + addsub_return sub sub sbb 108 + 109 + .macro incdec_return func ins insc 110 + ENTRY(atomic64_\func\()_return_cx8) 111 + CFI_STARTPROC 112 + SAVE ebx 113 + 114 + read64 %esi 115 + 1: 116 + movl %eax, %ebx 117 + movl %edx, %ecx 118 + \ins\()l $1, %ebx 119 + \insc\()l $0, %ecx 120 + LOCK_PREFIX 121 + cmpxchg8b (%esi) 122 + jne 1b 123 + 124 + 10: 125 + movl %ebx, %eax 126 + movl %ecx, %edx 127 + RESTORE ebx 128 + ret 129 + CFI_ENDPROC 130 + ENDPROC(atomic64_\func\()_return_cx8) 131 + .endm 132 + 133 + incdec_return inc add adc 134 + incdec_return dec sub sbb 135 + 136 + ENTRY(atomic64_dec_if_positive_cx8) 137 + CFI_STARTPROC 138 + SAVE ebx 139 + 140 + read64 %esi 141 + 1: 142 + movl %eax, %ebx 143 + movl %edx, %ecx 144 + subl $1, %ebx 145 + sbb $0, %ecx 146 + js 2f 147 + LOCK_PREFIX 148 + cmpxchg8b (%esi) 149 + jne 1b 150 + 151 + 2: 152 + movl %ebx, %eax 153 + movl %ecx, %edx 154 + RESTORE ebx 155 + ret 156 + CFI_ENDPROC 157 + ENDPROC(atomic64_dec_if_positive_cx8) 158 + 159 + ENTRY(atomic64_add_unless_cx8) 160 + CFI_STARTPROC 161 + SAVE ebp 162 + SAVE ebx 163 + /* these just push these two parameters on the stack */ 164 + SAVE edi 165 + SAVE esi 166 + 167 + movl %ecx, %ebp 168 + movl %eax, %esi 169 + movl %edx, %edi 170 + 171 + read64 %ebp 172 + 1: 173 + cmpl %eax, 0(%esp) 174 + je 4f 175 + 2: 176 + movl %eax, %ebx 177 + movl %edx, %ecx 178 + addl %esi, %ebx 179 + adcl %edi, %ecx 180 + LOCK_PREFIX 181 + cmpxchg8b (%ebp) 182 + jne 1b 183 + 184 + movl $1, %eax 185 + 3: 186 + addl $8, %esp 187 + CFI_ADJUST_CFA_OFFSET -8 188 + RESTORE ebx 189 + RESTORE ebp 190 + ret 191 + 4: 192 + cmpl %edx, 4(%esp) 193 + jne 2b 194 + xorl %eax, %eax 195 + jmp 3b 196 + CFI_ENDPROC 197 + ENDPROC(atomic64_add_unless_cx8) 198 + 199 + ENTRY(atomic64_inc_not_zero_cx8) 200 + CFI_STARTPROC 201 + SAVE ebx 202 + 203 + read64 %esi 204 + 1: 205 + testl %eax, %eax 206 + je 4f 207 + 2: 208 + movl %eax, %ebx 209 + movl %edx, %ecx 210 + addl $1, %ebx 211 + adcl $0, %ecx 212 + LOCK_PREFIX 213 + cmpxchg8b (%esi) 214 + jne 1b 215 + 216 + movl $1, %eax 217 + 3: 218 + RESTORE ebx 219 + ret 220 + 4: 221 + testl %edx, %edx 222 + jne 2b 223 + jmp 3b 224 + CFI_ENDPROC 225 + ENDPROC(atomic64_inc_not_zero_cx8)
+1 -1
arch/x86/boot/memory.c
··· 91 91 if (oreg.ax > 15*1024) { 92 92 return -1; /* Bogus! */ 93 93 } else if (oreg.ax == 15*1024) { 94 - boot_params.alt_mem_k = (oreg.dx << 6) + oreg.ax; 94 + boot_params.alt_mem_k = (oreg.bx << 6) + oreg.ax; 95 95 } else { 96 96 /* 97 97 * This ignores memory above 16MB if we have a memory
+1 -1
arch/x86/include/asm/io_apic.h
··· 150 150 extern void ioapic_and_gsi_init(void); 151 151 extern void ioapic_insert_resources(void); 152 152 153 - int io_apic_setup_irq_pin(unsigned int irq, int node, struct io_apic_irq_attr *attr); 153 + int io_apic_setup_irq_pin_once(unsigned int irq, int node, struct io_apic_irq_attr *attr); 154 154 155 155 extern struct IO_APIC_route_entry **alloc_ioapic_entries(void); 156 156 extern void free_ioapic_entries(struct IO_APIC_route_entry **ioapic_entries);
+5 -5
arch/x86/kernel/apic/io_apic.c
··· 128 128 } 129 129 early_param("noapic", parse_noapic); 130 130 131 - static int io_apic_setup_irq_pin_once(unsigned int irq, int node, 132 - struct io_apic_irq_attr *attr); 131 + static int io_apic_setup_irq_pin(unsigned int irq, int node, 132 + struct io_apic_irq_attr *attr); 133 133 134 134 /* Will be called in mpparse/acpi/sfi codes for saving IRQ info */ 135 135 void mp_save_irq(struct mpc_intsrc *m) ··· 3570 3570 } 3571 3571 #endif /* CONFIG_HT_IRQ */ 3572 3572 3573 - int 3573 + static int 3574 3574 io_apic_setup_irq_pin(unsigned int irq, int node, struct io_apic_irq_attr *attr) 3575 3575 { 3576 3576 struct irq_cfg *cfg = alloc_irq_and_cfg_at(irq, node); ··· 3585 3585 return ret; 3586 3586 } 3587 3587 3588 - static int io_apic_setup_irq_pin_once(unsigned int irq, int node, 3589 - struct io_apic_irq_attr *attr) 3588 + int io_apic_setup_irq_pin_once(unsigned int irq, int node, 3589 + struct io_apic_irq_attr *attr) 3590 3590 { 3591 3591 unsigned int id = attr->ioapic, pin = attr->ioapic_pin; 3592 3592 int ret;
+1 -1
arch/x86/kernel/cpu/amd.c
··· 698 698 */ 699 699 700 700 const int amd_erratum_400[] = 701 - AMD_OSVW_ERRATUM(1, AMD_MODEL_RANGE(0xf, 0x41, 0x2, 0xff, 0xf), 701 + AMD_OSVW_ERRATUM(1, AMD_MODEL_RANGE(0x0f, 0x4, 0x2, 0xff, 0xf), 702 702 AMD_MODEL_RANGE(0x10, 0x2, 0x1, 0xff, 0xf)); 703 703 EXPORT_SYMBOL_GPL(amd_erratum_400); 704 704
+52 -35
arch/x86/kernel/cpu/perf_event_intel.c
··· 184 184 }, 185 185 }, 186 186 [ C(LL ) ] = { 187 - /* 188 - * TBD: Need Off-core Response Performance Monitoring support 189 - */ 190 187 [ C(OP_READ) ] = { 191 - /* OFFCORE_RESPONSE_0.ANY_DATA.LOCAL_CACHE */ 188 + /* OFFCORE_RESPONSE.ANY_DATA.LOCAL_CACHE */ 192 189 [ C(RESULT_ACCESS) ] = 0x01b7, 193 - /* OFFCORE_RESPONSE_1.ANY_DATA.ANY_LLC_MISS */ 194 - [ C(RESULT_MISS) ] = 0x01bb, 190 + /* OFFCORE_RESPONSE.ANY_DATA.ANY_LLC_MISS */ 191 + [ C(RESULT_MISS) ] = 0x01b7, 195 192 }, 196 193 [ C(OP_WRITE) ] = { 197 - /* OFFCORE_RESPONSE_0.ANY_RFO.LOCAL_CACHE */ 194 + /* OFFCORE_RESPONSE.ANY_RFO.LOCAL_CACHE */ 198 195 [ C(RESULT_ACCESS) ] = 0x01b7, 199 - /* OFFCORE_RESPONSE_1.ANY_RFO.ANY_LLC_MISS */ 200 - [ C(RESULT_MISS) ] = 0x01bb, 196 + /* OFFCORE_RESPONSE.ANY_RFO.ANY_LLC_MISS */ 197 + [ C(RESULT_MISS) ] = 0x01b7, 201 198 }, 202 199 [ C(OP_PREFETCH) ] = { 203 - /* OFFCORE_RESPONSE_0.PREFETCH.LOCAL_CACHE */ 200 + /* OFFCORE_RESPONSE.PREFETCH.LOCAL_CACHE */ 204 201 [ C(RESULT_ACCESS) ] = 0x01b7, 205 - /* OFFCORE_RESPONSE_1.PREFETCH.ANY_LLC_MISS */ 206 - [ C(RESULT_MISS) ] = 0x01bb, 202 + /* OFFCORE_RESPONSE.PREFETCH.ANY_LLC_MISS */ 203 + [ C(RESULT_MISS) ] = 0x01b7, 207 204 }, 208 205 }, 209 206 [ C(DTLB) ] = { ··· 282 285 }, 283 286 [ C(LL ) ] = { 284 287 [ C(OP_READ) ] = { 285 - /* OFFCORE_RESPONSE_0.ANY_DATA.LOCAL_CACHE */ 288 + /* OFFCORE_RESPONSE.ANY_DATA.LOCAL_CACHE */ 286 289 [ C(RESULT_ACCESS) ] = 0x01b7, 287 - /* OFFCORE_RESPONSE_1.ANY_DATA.ANY_LLC_MISS */ 288 - [ C(RESULT_MISS) ] = 0x01bb, 290 + /* OFFCORE_RESPONSE.ANY_DATA.ANY_LLC_MISS */ 291 + [ C(RESULT_MISS) ] = 0x01b7, 289 292 }, 290 293 /* 291 294 * Use RFO, not WRITEBACK, because a write miss would typically occur 292 295 * on RFO. 293 296 */ 294 297 [ C(OP_WRITE) ] = { 295 - /* OFFCORE_RESPONSE_1.ANY_RFO.LOCAL_CACHE */ 296 - [ C(RESULT_ACCESS) ] = 0x01bb, 297 - /* OFFCORE_RESPONSE_0.ANY_RFO.ANY_LLC_MISS */ 298 + /* OFFCORE_RESPONSE.ANY_RFO.LOCAL_CACHE */ 299 + [ C(RESULT_ACCESS) ] = 0x01b7, 300 + /* OFFCORE_RESPONSE.ANY_RFO.ANY_LLC_MISS */ 298 301 [ C(RESULT_MISS) ] = 0x01b7, 299 302 }, 300 303 [ C(OP_PREFETCH) ] = { 301 - /* OFFCORE_RESPONSE_0.PREFETCH.LOCAL_CACHE */ 304 + /* OFFCORE_RESPONSE.PREFETCH.LOCAL_CACHE */ 302 305 [ C(RESULT_ACCESS) ] = 0x01b7, 303 - /* OFFCORE_RESPONSE_1.PREFETCH.ANY_LLC_MISS */ 304 - [ C(RESULT_MISS) ] = 0x01bb, 306 + /* OFFCORE_RESPONSE.PREFETCH.ANY_LLC_MISS */ 307 + [ C(RESULT_MISS) ] = 0x01b7, 305 308 }, 306 309 }, 307 310 [ C(DTLB) ] = { ··· 349 352 }; 350 353 351 354 /* 352 - * OFFCORE_RESPONSE MSR bits (subset), See IA32 SDM Vol 3 30.6.1.3 355 + * Nehalem/Westmere MSR_OFFCORE_RESPONSE bits; 356 + * See IA32 SDM Vol 3B 30.6.1.3 353 357 */ 354 358 355 - #define DMND_DATA_RD (1 << 0) 356 - #define DMND_RFO (1 << 1) 357 - #define DMND_WB (1 << 3) 358 - #define PF_DATA_RD (1 << 4) 359 - #define PF_DATA_RFO (1 << 5) 360 - #define RESP_UNCORE_HIT (1 << 8) 361 - #define RESP_MISS (0xf600) /* non uncore hit */ 359 + #define NHM_DMND_DATA_RD (1 << 0) 360 + #define NHM_DMND_RFO (1 << 1) 361 + #define NHM_DMND_IFETCH (1 << 2) 362 + #define NHM_DMND_WB (1 << 3) 363 + #define NHM_PF_DATA_RD (1 << 4) 364 + #define NHM_PF_DATA_RFO (1 << 5) 365 + #define NHM_PF_IFETCH (1 << 6) 366 + #define NHM_OFFCORE_OTHER (1 << 7) 367 + #define NHM_UNCORE_HIT (1 << 8) 368 + #define NHM_OTHER_CORE_HIT_SNP (1 << 9) 369 + #define NHM_OTHER_CORE_HITM (1 << 10) 370 + /* reserved */ 371 + #define NHM_REMOTE_CACHE_FWD (1 << 12) 372 + #define NHM_REMOTE_DRAM (1 << 13) 373 + #define NHM_LOCAL_DRAM (1 << 14) 374 + #define NHM_NON_DRAM (1 << 15) 375 + 376 + #define NHM_ALL_DRAM (NHM_REMOTE_DRAM|NHM_LOCAL_DRAM) 377 + 378 + #define NHM_DMND_READ (NHM_DMND_DATA_RD) 379 + #define NHM_DMND_WRITE (NHM_DMND_RFO|NHM_DMND_WB) 380 + #define NHM_DMND_PREFETCH (NHM_PF_DATA_RD|NHM_PF_DATA_RFO) 381 + 382 + #define NHM_L3_HIT (NHM_UNCORE_HIT|NHM_OTHER_CORE_HIT_SNP|NHM_OTHER_CORE_HITM) 383 + #define NHM_L3_MISS (NHM_NON_DRAM|NHM_ALL_DRAM|NHM_REMOTE_CACHE_FWD) 384 + #define NHM_L3_ACCESS (NHM_L3_HIT|NHM_L3_MISS) 362 385 363 386 static __initconst const u64 nehalem_hw_cache_extra_regs 364 387 [PERF_COUNT_HW_CACHE_MAX] ··· 387 370 { 388 371 [ C(LL ) ] = { 389 372 [ C(OP_READ) ] = { 390 - [ C(RESULT_ACCESS) ] = DMND_DATA_RD|RESP_UNCORE_HIT, 391 - [ C(RESULT_MISS) ] = DMND_DATA_RD|RESP_MISS, 373 + [ C(RESULT_ACCESS) ] = NHM_DMND_READ|NHM_L3_ACCESS, 374 + [ C(RESULT_MISS) ] = NHM_DMND_READ|NHM_L3_MISS, 392 375 }, 393 376 [ C(OP_WRITE) ] = { 394 - [ C(RESULT_ACCESS) ] = DMND_RFO|DMND_WB|RESP_UNCORE_HIT, 395 - [ C(RESULT_MISS) ] = DMND_RFO|DMND_WB|RESP_MISS, 377 + [ C(RESULT_ACCESS) ] = NHM_DMND_WRITE|NHM_L3_ACCESS, 378 + [ C(RESULT_MISS) ] = NHM_DMND_WRITE|NHM_L3_MISS, 396 379 }, 397 380 [ C(OP_PREFETCH) ] = { 398 - [ C(RESULT_ACCESS) ] = PF_DATA_RD|PF_DATA_RFO|RESP_UNCORE_HIT, 399 - [ C(RESULT_MISS) ] = PF_DATA_RD|PF_DATA_RFO|RESP_MISS, 381 + [ C(RESULT_ACCESS) ] = NHM_DMND_PREFETCH|NHM_L3_ACCESS, 382 + [ C(RESULT_MISS) ] = NHM_DMND_PREFETCH|NHM_L3_MISS, 400 383 }, 401 384 } 402 385 };
+1 -1
arch/x86/kernel/devicetree.c
··· 391 391 392 392 set_io_apic_irq_attr(&attr, idx, line, it->trigger, it->polarity); 393 393 394 - return io_apic_setup_irq_pin(*out_hwirq, cpu_to_node(0), &attr); 394 + return io_apic_setup_irq_pin_once(*out_hwirq, cpu_to_node(0), &attr); 395 395 } 396 396 397 397 static void __init ioapic_add_ofnode(struct device_node *np)
+26 -10
arch/x86/kernel/ptrace.c
··· 608 608 unsigned len, type; 609 609 struct perf_event *bp; 610 610 611 + if (ptrace_get_breakpoints(tsk) < 0) 612 + return -ESRCH; 613 + 611 614 data &= ~DR_CONTROL_RESERVED; 612 615 old_dr7 = ptrace_get_dr7(thread->ptrace_bps); 613 616 restore: ··· 658 655 } 659 656 goto restore; 660 657 } 658 + 659 + ptrace_put_breakpoints(tsk); 660 + 661 661 return ((orig_ret < 0) ? orig_ret : rc); 662 662 } 663 663 ··· 674 668 675 669 if (n < HBP_NUM) { 676 670 struct perf_event *bp; 671 + 672 + if (ptrace_get_breakpoints(tsk) < 0) 673 + return -ESRCH; 674 + 677 675 bp = thread->ptrace_bps[n]; 678 676 if (!bp) 679 - return 0; 680 - val = bp->hw.info.address; 677 + val = 0; 678 + else 679 + val = bp->hw.info.address; 680 + 681 + ptrace_put_breakpoints(tsk); 681 682 } else if (n == 6) { 682 683 val = thread->debugreg6; 683 684 } else if (n == 7) { ··· 699 686 struct perf_event *bp; 700 687 struct thread_struct *t = &tsk->thread; 701 688 struct perf_event_attr attr; 689 + int err = 0; 690 + 691 + if (ptrace_get_breakpoints(tsk) < 0) 692 + return -ESRCH; 702 693 703 694 if (!t->ptrace_bps[nr]) { 704 695 ptrace_breakpoint_init(&attr); ··· 726 709 * writing for the user. And anyway this is the previous 727 710 * behaviour. 728 711 */ 729 - if (IS_ERR(bp)) 730 - return PTR_ERR(bp); 712 + if (IS_ERR(bp)) { 713 + err = PTR_ERR(bp); 714 + goto put; 715 + } 731 716 732 717 t->ptrace_bps[nr] = bp; 733 718 } else { 734 - int err; 735 - 736 719 bp = t->ptrace_bps[nr]; 737 720 738 721 attr = bp->attr; 739 722 attr.bp_addr = addr; 740 723 err = modify_user_hw_breakpoint(bp, &attr); 741 - if (err) 742 - return err; 743 724 } 744 725 745 - 746 - return 0; 726 + put: 727 + ptrace_put_breakpoints(tsk); 728 + return err; 747 729 } 748 730 749 731 /*
+6 -6
arch/x86/kernel/reboot_32.S
··· 21 21 /* Get our own relocated address */ 22 22 call 1f 23 23 1: popl %ebx 24 - subl $1b, %ebx 24 + subl $(1b - r_base), %ebx 25 25 26 26 /* Compute the equivalent real-mode segment */ 27 27 movl %ebx, %ecx 28 28 shrl $4, %ecx 29 29 30 30 /* Patch post-real-mode segment jump */ 31 - movw dispatch_table(%ebx,%eax,2),%ax 32 - movw %ax, 101f(%ebx) 33 - movw %cx, 102f(%ebx) 31 + movw (dispatch_table - r_base)(%ebx,%eax,2),%ax 32 + movw %ax, (101f - r_base)(%ebx) 33 + movw %cx, (102f - r_base)(%ebx) 34 34 35 35 /* Set up the IDT for real mode. */ 36 - lidtl machine_real_restart_idt(%ebx) 36 + lidtl (machine_real_restart_idt - r_base)(%ebx) 37 37 38 38 /* 39 39 * Set up a GDT from which we can load segment descriptors for real 40 40 * mode. The GDT is not used in real mode; it is just needed here to 41 41 * prepare the descriptors. 42 42 */ 43 - lgdtl machine_real_restart_gdt(%ebx) 43 + lgdtl (machine_real_restart_gdt - r_base)(%ebx) 44 44 45 45 /* 46 46 * Load the data segment registers with 16-bit compatible values
+1 -1
arch/x86/mm/numa_64.c
··· 306 306 bi->end = min(bi->end, high); 307 307 308 308 /* and there's no empty block */ 309 - if (bi->start == bi->end) { 309 + if (bi->start >= bi->end) { 310 310 numa_remove_memblk_from(i--, mi); 311 311 continue; 312 312 }
+3 -3
arch/x86/platform/ce4100/falconfalls.dts
··· 347 347 "pciclass0c03"; 348 348 349 349 reg = <0x16800 0x0 0x0 0x0 0x0>; 350 - interrupts = <22 3>; 350 + interrupts = <22 1>; 351 351 }; 352 352 353 353 usb@d,1 { ··· 357 357 "pciclass0c03"; 358 358 359 359 reg = <0x16900 0x0 0x0 0x0 0x0>; 360 - interrupts = <22 3>; 360 + interrupts = <22 1>; 361 361 }; 362 362 363 363 sata@e,0 { ··· 367 367 "pciclass0106"; 368 368 369 369 reg = <0x17000 0x0 0x0 0x0 0x0>; 370 - interrupts = <23 3>; 370 + interrupts = <23 1>; 371 371 }; 372 372 373 373 flash@f,0 {
+124 -1
arch/x86/xen/mmu.c
··· 1463 1463 return ret; 1464 1464 } 1465 1465 1466 + #ifdef CONFIG_X86_64 1467 + static __initdata u64 __last_pgt_set_rw = 0; 1468 + static __initdata u64 __pgt_buf_start = 0; 1469 + static __initdata u64 __pgt_buf_end = 0; 1470 + static __initdata u64 __pgt_buf_top = 0; 1471 + /* 1472 + * As a consequence of the commit: 1473 + * 1474 + * commit 4b239f458c229de044d6905c2b0f9fe16ed9e01e 1475 + * Author: Yinghai Lu <yinghai@kernel.org> 1476 + * Date: Fri Dec 17 16:58:28 2010 -0800 1477 + * 1478 + * x86-64, mm: Put early page table high 1479 + * 1480 + * at some point init_memory_mapping is going to reach the pagetable pages 1481 + * area and map those pages too (mapping them as normal memory that falls 1482 + * in the range of addresses passed to init_memory_mapping as argument). 1483 + * Some of those pages are already pagetable pages (they are in the range 1484 + * pgt_buf_start-pgt_buf_end) therefore they are going to be mapped RO and 1485 + * everything is fine. 1486 + * Some of these pages are not pagetable pages yet (they fall in the range 1487 + * pgt_buf_end-pgt_buf_top; for example the page at pgt_buf_end) so they 1488 + * are going to be mapped RW. When these pages become pagetable pages and 1489 + * are hooked into the pagetable, xen will find that the guest has already 1490 + * a RW mapping of them somewhere and fail the operation. 1491 + * The reason Xen requires pagetables to be RO is that the hypervisor needs 1492 + * to verify that the pagetables are valid before using them. The validation 1493 + * operations are called "pinning". 1494 + * 1495 + * In order to fix the issue we mark all the pages in the entire range 1496 + * pgt_buf_start-pgt_buf_top as RO, however when the pagetable allocation 1497 + * is completed only the range pgt_buf_start-pgt_buf_end is reserved by 1498 + * init_memory_mapping. Hence the kernel is going to crash as soon as one 1499 + * of the pages in the range pgt_buf_end-pgt_buf_top is reused (b/c those 1500 + * ranges are RO). 1501 + * 1502 + * For this reason, 'mark_rw_past_pgt' is introduced which is called _after_ 1503 + * the init_memory_mapping has completed (in a perfect world we would 1504 + * call this function from init_memory_mapping, but lets ignore that). 1505 + * 1506 + * Because we are called _after_ init_memory_mapping the pgt_buf_[start, 1507 + * end,top] have all changed to new values (b/c init_memory_mapping 1508 + * is called and setting up another new page-table). Hence, the first time 1509 + * we enter this function, we save away the pgt_buf_start value and update 1510 + * the pgt_buf_[end,top]. 1511 + * 1512 + * When we detect that the "old" pgt_buf_start through pgt_buf_end 1513 + * PFNs have been reserved (so memblock_x86_reserve_range has been called), 1514 + * we immediately set out to RW the "old" pgt_buf_end through pgt_buf_top. 1515 + * 1516 + * And then we update those "old" pgt_buf_[end|top] with the new ones 1517 + * so that we can redo this on the next pagetable. 1518 + */ 1519 + static __init void mark_rw_past_pgt(void) { 1520 + 1521 + if (pgt_buf_end > pgt_buf_start) { 1522 + u64 addr, size; 1523 + 1524 + /* Save it away. */ 1525 + if (!__pgt_buf_start) { 1526 + __pgt_buf_start = pgt_buf_start; 1527 + __pgt_buf_end = pgt_buf_end; 1528 + __pgt_buf_top = pgt_buf_top; 1529 + return; 1530 + } 1531 + /* If we get the range that starts at __pgt_buf_end that means 1532 + * the range is reserved, and that in 'init_memory_mapping' 1533 + * the 'memblock_x86_reserve_range' has been called with the 1534 + * outdated __pgt_buf_start, __pgt_buf_end (the "new" 1535 + * pgt_buf_[start|end|top] refer now to a new pagetable. 1536 + * Note: we are called _after_ the pgt_buf_[..] have been 1537 + * updated.*/ 1538 + 1539 + addr = memblock_x86_find_in_range_size(PFN_PHYS(__pgt_buf_start), 1540 + &size, PAGE_SIZE); 1541 + 1542 + /* Still not reserved, meaning 'memblock_x86_reserve_range' 1543 + * hasn't been called yet. Update the _end and _top.*/ 1544 + if (addr == PFN_PHYS(__pgt_buf_start)) { 1545 + __pgt_buf_end = pgt_buf_end; 1546 + __pgt_buf_top = pgt_buf_top; 1547 + return; 1548 + } 1549 + 1550 + /* OK, the area is reserved, meaning it is time for us to 1551 + * set RW for the old end->top PFNs. */ 1552 + 1553 + /* ..unless we had already done this. */ 1554 + if (__pgt_buf_end == __last_pgt_set_rw) 1555 + return; 1556 + 1557 + addr = PFN_PHYS(__pgt_buf_end); 1558 + 1559 + /* set as RW the rest */ 1560 + printk(KERN_DEBUG "xen: setting RW the range %llx - %llx\n", 1561 + PFN_PHYS(__pgt_buf_end), PFN_PHYS(__pgt_buf_top)); 1562 + 1563 + while (addr < PFN_PHYS(__pgt_buf_top)) { 1564 + make_lowmem_page_readwrite(__va(addr)); 1565 + addr += PAGE_SIZE; 1566 + } 1567 + /* And update everything so that we are ready for the next 1568 + * pagetable (the one created for regions past 4GB) */ 1569 + __last_pgt_set_rw = __pgt_buf_end; 1570 + __pgt_buf_start = pgt_buf_start; 1571 + __pgt_buf_end = pgt_buf_end; 1572 + __pgt_buf_top = pgt_buf_top; 1573 + } 1574 + return; 1575 + } 1576 + #else 1577 + static __init void mark_rw_past_pgt(void) { } 1578 + #endif 1466 1579 static void xen_pgd_free(struct mm_struct *mm, pgd_t *pgd) 1467 1580 { 1468 1581 #ifdef CONFIG_X86_64 ··· 1602 1489 unsigned long pfn = pte_pfn(pte); 1603 1490 1604 1491 /* 1492 + * A bit of optimization. We do not need to call the workaround 1493 + * when xen_set_pte_init is called with a PTE with 0 as PFN. 1494 + * That is b/c the pagetable at that point are just being populated 1495 + * with empty values and we can save some cycles by not calling 1496 + * the 'memblock' code.*/ 1497 + if (pfn) 1498 + mark_rw_past_pgt(); 1499 + /* 1605 1500 * If the new pfn is within the range of the newly allocated 1606 1501 * kernel pagetable, and it isn't being mapped into an 1607 1502 * early_ioremap fixmap slot as a freshly allocated page, make sure 1608 1503 * it is RO. 1609 1504 */ 1610 1505 if (((!is_early_ioremap_ptep(ptep) && 1611 - pfn >= pgt_buf_start && pfn < pgt_buf_end)) || 1506 + pfn >= pgt_buf_start && pfn < pgt_buf_top)) || 1612 1507 (is_early_ioremap_ptep(ptep) && pfn != (pgt_buf_end - 1))) 1613 1508 pte = pte_wrprotect(pte); 1614 1509 ··· 2118 1997 2119 1998 static __init void xen_post_allocator_init(void) 2120 1999 { 2000 + mark_rw_past_pgt(); 2001 + 2121 2002 #ifdef CONFIG_XEN_DEBUG 2122 2003 pv_mmu_ops.make_pte = PV_CALLEE_SAVE(xen_make_pte_debug); 2123 2004 #endif
+4
drivers/acpi/scan.c
··· 943 943 if (ACPI_SUCCESS(status)) 944 944 device->flags.lockable = 1; 945 945 946 + /* Power resources cannot be power manageable. */ 947 + if (device->device_type == ACPI_BUS_TYPE_POWER) 948 + return 0; 949 + 946 950 /* Presence of _PS0|_PR0 indicates 'power manageable' */ 947 951 status = acpi_get_handle(device->handle, "_PS0", &temp); 948 952 if (ACPI_FAILURE(status))
+1
drivers/base/power/main.c
··· 63 63 dev->power.wakeup = NULL; 64 64 spin_lock_init(&dev->power.lock); 65 65 pm_runtime_init(dev); 66 + INIT_LIST_HEAD(&dev->power.entry); 66 67 } 67 68 68 69 /**
+1 -1
drivers/base/power/wakeup.c
··· 258 258 if (!!dev->power.can_wakeup == !!capable) 259 259 return; 260 260 261 - if (device_is_registered(dev)) { 261 + if (device_is_registered(dev) && !list_empty(&dev->power.entry)) { 262 262 if (capable) { 263 263 if (wakeup_sysfs_add(dev)) 264 264 return;
+2 -2
drivers/block/rbd.c
··· 777 777 ops, 778 778 false, 779 779 GFP_NOIO, pages, bio); 780 - if (IS_ERR(req)) { 780 + if (!req) { 781 781 up_read(&header->snap_rwsem); 782 - ret = PTR_ERR(req); 782 + ret = -ENOMEM; 783 783 goto done_pages; 784 784 } 785 785
+9 -10
drivers/clk/clkdev.c
··· 32 32 * Then we take the most specific entry - with the following 33 33 * order of precedence: dev+con > dev only > con only. 34 34 */ 35 - static struct clk *clk_find(const char *dev_id, const char *con_id) 35 + static struct clk_lookup *clk_find(const char *dev_id, const char *con_id) 36 36 { 37 - struct clk_lookup *p; 38 - struct clk *clk = NULL; 37 + struct clk_lookup *p, *cl = NULL; 39 38 int match, best = 0; 40 39 41 40 list_for_each_entry(p, &clocks, node) { ··· 51 52 } 52 53 53 54 if (match > best) { 54 - clk = p->clk; 55 + cl = p; 55 56 if (match != 3) 56 57 best = match; 57 58 else 58 59 break; 59 60 } 60 61 } 61 - return clk; 62 + return cl; 62 63 } 63 64 64 65 struct clk *clk_get_sys(const char *dev_id, const char *con_id) 65 66 { 66 - struct clk *clk; 67 + struct clk_lookup *cl; 67 68 68 69 mutex_lock(&clocks_mutex); 69 - clk = clk_find(dev_id, con_id); 70 - if (clk && !__clk_get(clk)) 71 - clk = NULL; 70 + cl = clk_find(dev_id, con_id); 71 + if (cl && !__clk_get(cl->clk)) 72 + cl = NULL; 72 73 mutex_unlock(&clocks_mutex); 73 74 74 - return clk ? clk : ERR_PTR(-ENOENT); 75 + return cl ? cl->clk : ERR_PTR(-ENOENT); 75 76 } 76 77 EXPORT_SYMBOL(clk_get_sys); 77 78
+78 -10
drivers/edac/amd64_edac.c
··· 211 211 212 212 scrubval = scrubval & 0x001F; 213 213 214 - amd64_debug("pci-read, sdram scrub control value: %d\n", scrubval); 215 - 216 214 for (i = 0; i < ARRAY_SIZE(scrubrates); i++) { 217 215 if (scrubrates[i].scrubval == scrubval) { 218 216 retval = scrubrates[i].bandwidth; ··· 931 933 /* On F10h and later ErrAddr is MC4_ADDR[47:1] */ 932 934 static u64 get_error_address(struct mce *m) 933 935 { 936 + struct cpuinfo_x86 *c = &boot_cpu_data; 937 + u64 addr; 934 938 u8 start_bit = 1; 935 939 u8 end_bit = 47; 936 940 937 - if (boot_cpu_data.x86 == 0xf) { 941 + if (c->x86 == 0xf) { 938 942 start_bit = 3; 939 943 end_bit = 39; 940 944 } 941 945 942 - return m->addr & GENMASK(start_bit, end_bit); 946 + addr = m->addr & GENMASK(start_bit, end_bit); 947 + 948 + /* 949 + * Erratum 637 workaround 950 + */ 951 + if (c->x86 == 0x15) { 952 + struct amd64_pvt *pvt; 953 + u64 cc6_base, tmp_addr; 954 + u32 tmp; 955 + u8 mce_nid, intlv_en; 956 + 957 + if ((addr & GENMASK(24, 47)) >> 24 != 0x00fdf7) 958 + return addr; 959 + 960 + mce_nid = amd_get_nb_id(m->extcpu); 961 + pvt = mcis[mce_nid]->pvt_info; 962 + 963 + amd64_read_pci_cfg(pvt->F1, DRAM_LOCAL_NODE_LIM, &tmp); 964 + intlv_en = tmp >> 21 & 0x7; 965 + 966 + /* add [47:27] + 3 trailing bits */ 967 + cc6_base = (tmp & GENMASK(0, 20)) << 3; 968 + 969 + /* reverse and add DramIntlvEn */ 970 + cc6_base |= intlv_en ^ 0x7; 971 + 972 + /* pin at [47:24] */ 973 + cc6_base <<= 24; 974 + 975 + if (!intlv_en) 976 + return cc6_base | (addr & GENMASK(0, 23)); 977 + 978 + amd64_read_pci_cfg(pvt->F1, DRAM_LOCAL_NODE_BASE, &tmp); 979 + 980 + /* faster log2 */ 981 + tmp_addr = (addr & GENMASK(12, 23)) << __fls(intlv_en + 1); 982 + 983 + /* OR DramIntlvSel into bits [14:12] */ 984 + tmp_addr |= (tmp & GENMASK(21, 23)) >> 9; 985 + 986 + /* add remaining [11:0] bits from original MC4_ADDR */ 987 + tmp_addr |= addr & GENMASK(0, 11); 988 + 989 + return cc6_base | tmp_addr; 990 + } 991 + 992 + return addr; 943 993 } 944 994 945 995 static void read_dram_base_limit_regs(struct amd64_pvt *pvt, unsigned range) 946 996 { 997 + struct cpuinfo_x86 *c = &boot_cpu_data; 947 998 int off = range << 3; 948 999 949 1000 amd64_read_pci_cfg(pvt->F1, DRAM_BASE_LO + off, &pvt->ranges[range].base.lo); 950 1001 amd64_read_pci_cfg(pvt->F1, DRAM_LIMIT_LO + off, &pvt->ranges[range].lim.lo); 951 1002 952 - if (boot_cpu_data.x86 == 0xf) 1003 + if (c->x86 == 0xf) 953 1004 return; 954 1005 955 1006 if (!dram_rw(pvt, range)) ··· 1006 959 1007 960 amd64_read_pci_cfg(pvt->F1, DRAM_BASE_HI + off, &pvt->ranges[range].base.hi); 1008 961 amd64_read_pci_cfg(pvt->F1, DRAM_LIMIT_HI + off, &pvt->ranges[range].lim.hi); 962 + 963 + /* Factor in CC6 save area by reading dst node's limit reg */ 964 + if (c->x86 == 0x15) { 965 + struct pci_dev *f1 = NULL; 966 + u8 nid = dram_dst_node(pvt, range); 967 + u32 llim; 968 + 969 + f1 = pci_get_domain_bus_and_slot(0, 0, PCI_DEVFN(0x18 + nid, 1)); 970 + if (WARN_ON(!f1)) 971 + return; 972 + 973 + amd64_read_pci_cfg(f1, DRAM_LOCAL_NODE_LIM, &llim); 974 + 975 + pvt->ranges[range].lim.lo &= GENMASK(0, 15); 976 + 977 + /* {[39:27],111b} */ 978 + pvt->ranges[range].lim.lo |= ((llim & 0x1fff) << 3 | 0x7) << 16; 979 + 980 + pvt->ranges[range].lim.hi &= GENMASK(0, 7); 981 + 982 + /* [47:40] */ 983 + pvt->ranges[range].lim.hi |= llim >> 13; 984 + 985 + pci_dev_put(f1); 986 + } 1009 987 } 1010 988 1011 989 static void k8_map_sysaddr_to_csrow(struct mem_ctl_info *mci, u64 sys_addr, ··· 1475 1403 return -EINVAL; 1476 1404 } 1477 1405 1478 - if (intlv_en && 1479 - (intlv_sel != ((sys_addr >> 12) & intlv_en))) { 1480 - amd64_warn("Botched intlv bits, en: 0x%x, sel: 0x%x\n", 1481 - intlv_en, intlv_sel); 1406 + if (intlv_en && (intlv_sel != ((sys_addr >> 12) & intlv_en))) 1482 1407 return -EINVAL; 1483 - } 1484 1408 1485 1409 sys_addr = f1x_swap_interleaved_region(pvt, sys_addr); 1486 1410
+3
drivers/edac/amd64_edac.h
··· 196 196 197 197 #define DCT_CFG_SEL 0x10C 198 198 199 + #define DRAM_LOCAL_NODE_BASE 0x120 200 + #define DRAM_LOCAL_NODE_LIM 0x124 201 + 199 202 #define DRAM_BASE_HI 0x140 200 203 #define DRAM_LIMIT_HI 0x144 201 204
+5 -6
drivers/edac/edac_mc_sysfs.c
··· 458 458 return -EINVAL; 459 459 460 460 new_bw = mci->set_sdram_scrub_rate(mci, bandwidth); 461 - if (new_bw >= 0) { 462 - edac_printk(KERN_DEBUG, EDAC_MC, "Scrub rate set to %d\n", new_bw); 463 - return count; 461 + if (new_bw < 0) { 462 + edac_printk(KERN_WARNING, EDAC_MC, 463 + "Error setting scrub rate to: %lu\n", bandwidth); 464 + return -EINVAL; 464 465 } 465 466 466 - edac_printk(KERN_DEBUG, EDAC_MC, "Error setting scrub rate to: %lu\n", bandwidth); 467 - return -EINVAL; 467 + return count; 468 468 } 469 469 470 470 /* ··· 483 483 return bandwidth; 484 484 } 485 485 486 - edac_printk(KERN_DEBUG, EDAC_MC, "Read scrub rate: %d\n", bandwidth); 487 486 return sprintf(data, "%d\n", bandwidth); 488 487 } 489 488
+27 -16
drivers/firewire/ohci.c
··· 2199 2199 { 2200 2200 struct fw_ohci *ohci; 2201 2201 unsigned long flags; 2202 - int ret = -EBUSY; 2203 2202 __be32 *next_config_rom; 2204 2203 dma_addr_t uninitialized_var(next_config_rom_bus); 2205 2204 ··· 2239 2240 2240 2241 spin_lock_irqsave(&ohci->lock, flags); 2241 2242 2243 + /* 2244 + * If there is not an already pending config_rom update, 2245 + * push our new allocation into the ohci->next_config_rom 2246 + * and then mark the local variable as null so that we 2247 + * won't deallocate the new buffer. 2248 + * 2249 + * OTOH, if there is a pending config_rom update, just 2250 + * use that buffer with the new config_rom data, and 2251 + * let this routine free the unused DMA allocation. 2252 + */ 2253 + 2242 2254 if (ohci->next_config_rom == NULL) { 2243 2255 ohci->next_config_rom = next_config_rom; 2244 2256 ohci->next_config_rom_bus = next_config_rom_bus; 2245 - 2246 - copy_config_rom(ohci->next_config_rom, config_rom, length); 2247 - 2248 - ohci->next_header = config_rom[0]; 2249 - ohci->next_config_rom[0] = 0; 2250 - 2251 - reg_write(ohci, OHCI1394_ConfigROMmap, 2252 - ohci->next_config_rom_bus); 2253 - ret = 0; 2257 + next_config_rom = NULL; 2254 2258 } 2255 2259 2260 + copy_config_rom(ohci->next_config_rom, config_rom, length); 2261 + 2262 + ohci->next_header = config_rom[0]; 2263 + ohci->next_config_rom[0] = 0; 2264 + 2265 + reg_write(ohci, OHCI1394_ConfigROMmap, ohci->next_config_rom_bus); 2266 + 2256 2267 spin_unlock_irqrestore(&ohci->lock, flags); 2268 + 2269 + /* If we didn't use the DMA allocation, delete it. */ 2270 + if (next_config_rom != NULL) 2271 + dma_free_coherent(ohci->card.device, CONFIG_ROM_SIZE, 2272 + next_config_rom, next_config_rom_bus); 2257 2273 2258 2274 /* 2259 2275 * Now initiate a bus reset to have the changes take ··· 2277 2263 * controller could need to access it before the bus reset 2278 2264 * takes effect. 2279 2265 */ 2280 - if (ret == 0) 2281 - fw_schedule_bus_reset(&ohci->card, true, true); 2282 - else 2283 - dma_free_coherent(ohci->card.device, CONFIG_ROM_SIZE, 2284 - next_config_rom, next_config_rom_bus); 2285 2266 2286 - return ret; 2267 + fw_schedule_bus_reset(&ohci->card, true, true); 2268 + 2269 + return 0; 2287 2270 } 2288 2271 2289 2272 static void ohci_send_request(struct fw_card *card, struct fw_packet *packet)
+1
drivers/gpu/drm/Kconfig
··· 24 24 depends on DRM 25 25 select FB 26 26 select FRAMEBUFFER_CONSOLE if !EXPERT 27 + select FRAMEBUFFER_CONSOLE_DETECT_PRIMARY if FRAMEBUFFER_CONSOLE 27 28 help 28 29 FB and CRTC helpers for KMS drivers. 29 30
+20 -7
drivers/gpu/drm/drm_fb_helper.c
··· 342 342 } 343 343 EXPORT_SYMBOL(drm_fb_helper_debug_leave); 344 344 345 + bool drm_fb_helper_restore_fbdev_mode(struct drm_fb_helper *fb_helper) 346 + { 347 + bool error = false; 348 + int i, ret; 349 + for (i = 0; i < fb_helper->crtc_count; i++) { 350 + struct drm_mode_set *mode_set = &fb_helper->crtc_info[i].mode_set; 351 + ret = drm_crtc_helper_set_config(mode_set); 352 + if (ret) 353 + error = true; 354 + } 355 + return error; 356 + } 357 + EXPORT_SYMBOL(drm_fb_helper_restore_fbdev_mode); 358 + 345 359 bool drm_fb_helper_force_kernel_mode(void) 346 360 { 347 - int i = 0; 348 361 bool ret, error = false; 349 362 struct drm_fb_helper *helper; 350 363 ··· 365 352 return false; 366 353 367 354 list_for_each_entry(helper, &kernel_fb_helper_list, kernel_fb_list) { 368 - for (i = 0; i < helper->crtc_count; i++) { 369 - struct drm_mode_set *mode_set = &helper->crtc_info[i].mode_set; 370 - ret = drm_crtc_helper_set_config(mode_set); 371 - if (ret) 372 - error = true; 373 - } 355 + if (helper->dev->switch_power_state == DRM_SWITCH_POWER_OFF) 356 + continue; 357 + 358 + ret = drm_fb_helper_restore_fbdev_mode(helper); 359 + if (ret) 360 + error = true; 374 361 } 375 362 return error; 376 363 }
+23
drivers/gpu/drm/drm_irq.c
··· 932 932 933 933 void drm_vblank_off(struct drm_device *dev, int crtc) 934 934 { 935 + struct drm_pending_vblank_event *e, *t; 936 + struct timeval now; 935 937 unsigned long irqflags; 938 + unsigned int seq; 936 939 937 940 spin_lock_irqsave(&dev->vbl_lock, irqflags); 938 941 vblank_disable_and_save(dev, crtc); 939 942 DRM_WAKEUP(&dev->vbl_queue[crtc]); 943 + 944 + /* Send any queued vblank events, lest the natives grow disquiet */ 945 + seq = drm_vblank_count_and_time(dev, crtc, &now); 946 + list_for_each_entry_safe(e, t, &dev->vblank_event_list, base.link) { 947 + if (e->pipe != crtc) 948 + continue; 949 + DRM_DEBUG("Sending premature vblank event on disable: \ 950 + wanted %d, current %d\n", 951 + e->event.sequence, seq); 952 + 953 + e->event.sequence = seq; 954 + e->event.tv_sec = now.tv_sec; 955 + e->event.tv_usec = now.tv_usec; 956 + drm_vblank_put(dev, e->pipe); 957 + list_move_tail(&e->base.link, &e->base.file_priv->event_list); 958 + wake_up_interruptible(&e->base.file_priv->event_wait); 959 + trace_drm_vblank_event_delivered(e->base.pid, e->pipe, 960 + e->event.sequence); 961 + } 962 + 940 963 spin_unlock_irqrestore(&dev->vbl_lock, irqflags); 941 964 } 942 965 EXPORT_SYMBOL(drm_vblank_off);
+3 -3
drivers/gpu/drm/drm_mm.c
··· 431 431 void drm_mm_replace_node(struct drm_mm_node *old, struct drm_mm_node *new) 432 432 { 433 433 list_replace(&old->node_list, &new->node_list); 434 - list_replace(&old->node_list, &new->hole_stack); 434 + list_replace(&old->hole_stack, &new->hole_stack); 435 435 new->hole_follows = old->hole_follows; 436 436 new->mm = old->mm; 437 437 new->start = old->start; ··· 699 699 entry->size); 700 700 total_used += entry->size; 701 701 if (entry->hole_follows) { 702 - hole_start = drm_mm_hole_node_start(&mm->head_node); 703 - hole_end = drm_mm_hole_node_end(&mm->head_node); 702 + hole_start = drm_mm_hole_node_start(entry); 703 + hole_end = drm_mm_hole_node_end(entry); 704 704 hole_size = hole_end - hole_start; 705 705 seq_printf(m, "0x%08lx-0x%08lx: 0x%08lx: free\n", 706 706 hole_start, hole_end, hole_size);
+1 -1
drivers/gpu/drm/i915/i915_dma.c
··· 2207 2207 drm_i915_private_t *dev_priv = dev->dev_private; 2208 2208 2209 2209 if (!dev_priv || drm_core_check_feature(dev, DRIVER_MODESET)) { 2210 - drm_fb_helper_restore(); 2210 + intel_fb_restore_mode(dev); 2211 2211 vga_switcheroo_process_delayed_switch(); 2212 2212 return; 2213 2213 }
+5 -5
drivers/gpu/drm/i915/intel_display.c
··· 5154 5154 5155 5155 I915_WRITE(DSPCNTR(plane), dspcntr); 5156 5156 POSTING_READ(DSPCNTR(plane)); 5157 - if (!HAS_PCH_SPLIT(dev)) 5158 - intel_enable_plane(dev_priv, plane, pipe); 5159 5157 5160 5158 ret = intel_pipe_set_base(crtc, x, y, old_fb); 5161 5159 ··· 5603 5605 intel_clock_t clock; 5604 5606 5605 5607 if ((dpll & DISPLAY_RATE_SELECT_FPA1) == 0) 5606 - fp = FP0(pipe); 5608 + fp = I915_READ(FP0(pipe)); 5607 5609 else 5608 - fp = FP1(pipe); 5610 + fp = I915_READ(FP1(pipe)); 5609 5611 5610 5612 clock.m1 = (fp & FP_M1_DIV_MASK) >> FP_M1_DIV_SHIFT; 5611 5613 if (IS_PINEVIEW(dev)) { ··· 6577 6579 return ERR_PTR(-ENOENT); 6578 6580 6579 6581 intel_fb = kzalloc(sizeof(*intel_fb), GFP_KERNEL); 6580 - if (!intel_fb) 6582 + if (!intel_fb) { 6583 + drm_gem_object_unreference_unlocked(&obj->base); 6581 6584 return ERR_PTR(-ENOMEM); 6585 + } 6582 6586 6583 6587 ret = intel_framebuffer_init(dev, intel_fb, mode_cmd, obj); 6584 6588 if (ret) {
+15 -2
drivers/gpu/drm/i915/intel_dp.c
··· 1470 1470 1471 1471 if (!HAS_PCH_CPT(dev) && 1472 1472 I915_READ(intel_dp->output_reg) & DP_PIPEB_SELECT) { 1473 - struct intel_crtc *intel_crtc = to_intel_crtc(intel_dp->base.base.crtc); 1473 + struct drm_crtc *crtc = intel_dp->base.base.crtc; 1474 + 1474 1475 /* Hardware workaround: leaving our transcoder select 1475 1476 * set to transcoder B while it's off will prevent the 1476 1477 * corresponding HDMI output on transcoder A. ··· 1486 1485 /* Changes to enable or select take place the vblank 1487 1486 * after being written. 1488 1487 */ 1489 - intel_wait_for_vblank(dev, intel_crtc->pipe); 1488 + if (crtc == NULL) { 1489 + /* We can arrive here never having been attached 1490 + * to a CRTC, for instance, due to inheriting 1491 + * random state from the BIOS. 1492 + * 1493 + * If the pipe is not running, play safe and 1494 + * wait for the clocks to stabilise before 1495 + * continuing. 1496 + */ 1497 + POSTING_READ(intel_dp->output_reg); 1498 + msleep(50); 1499 + } else 1500 + intel_wait_for_vblank(dev, to_intel_crtc(crtc)->pipe); 1490 1501 } 1491 1502 1492 1503 I915_WRITE(intel_dp->output_reg, DP & ~DP_PORT_EN);
+1
drivers/gpu/drm/i915/intel_drv.h
··· 338 338 struct drm_file *file_priv); 339 339 340 340 extern void intel_fb_output_poll_changed(struct drm_device *dev); 341 + extern void intel_fb_restore_mode(struct drm_device *dev); 341 342 #endif /* __INTEL_DRV_H__ */
+10
drivers/gpu/drm/i915/intel_fb.c
··· 264 264 drm_i915_private_t *dev_priv = dev->dev_private; 265 265 drm_fb_helper_hotplug_event(&dev_priv->fbdev->helper); 266 266 } 267 + 268 + void intel_fb_restore_mode(struct drm_device *dev) 269 + { 270 + int ret; 271 + drm_i915_private_t *dev_priv = dev->dev_private; 272 + 273 + ret = drm_fb_helper_restore_fbdev_mode(&dev_priv->fbdev->helper); 274 + if (ret) 275 + DRM_DEBUG("failed to restore crtc mode\n"); 276 + }
+3
drivers/gpu/drm/i915/intel_lvds.c
··· 539 539 struct drm_device *dev = dev_priv->dev; 540 540 struct drm_connector *connector = dev_priv->int_lvds_connector; 541 541 542 + if (dev->switch_power_state != DRM_SWITCH_POWER_ON) 543 + return NOTIFY_OK; 544 + 542 545 /* 543 546 * check and update the status of LVDS connector after receiving 544 547 * the LID nofication event.
-2
drivers/gpu/drm/nouveau/nouveau_mem.c
··· 152 152 { 153 153 struct drm_nouveau_private *dev_priv = dev->dev_private; 154 154 155 - nouveau_bo_ref(NULL, &dev_priv->vga_ram); 156 - 157 155 ttm_bo_device_release(&dev_priv->ttm.bdev); 158 156 159 157 nouveau_ttm_global_release(dev_priv);
+5
drivers/gpu/drm/nouveau/nouveau_state.c
··· 768 768 engine->mc.takedown(dev); 769 769 engine->display.late_takedown(dev); 770 770 771 + if (dev_priv->vga_ram) { 772 + nouveau_bo_unpin(dev_priv->vga_ram); 773 + nouveau_bo_ref(NULL, &dev_priv->vga_ram); 774 + } 775 + 771 776 mutex_lock(&dev->struct_mutex); 772 777 ttm_bo_clean_mm(&dev_priv->ttm.bdev, TTM_PL_VRAM); 773 778 ttm_bo_clean_mm(&dev_priv->ttm.bdev, TTM_PL_TT);
+9 -8
drivers/gpu/drm/radeon/evergreen.c
··· 862 862 SYSTEM_ACCESS_MODE_NOT_IN_SYS | 863 863 SYSTEM_APERTURE_UNMAPPED_ACCESS_PASS_THRU | 864 864 EFFECTIVE_L1_TLB_SIZE(5) | EFFECTIVE_L1_QUEUE_SIZE(5); 865 - WREG32(MC_VM_MD_L1_TLB0_CNTL, tmp); 866 - WREG32(MC_VM_MD_L1_TLB1_CNTL, tmp); 867 - WREG32(MC_VM_MD_L1_TLB2_CNTL, tmp); 865 + if (rdev->flags & RADEON_IS_IGP) { 866 + WREG32(FUS_MC_VM_MD_L1_TLB0_CNTL, tmp); 867 + WREG32(FUS_MC_VM_MD_L1_TLB1_CNTL, tmp); 868 + WREG32(FUS_MC_VM_MD_L1_TLB2_CNTL, tmp); 869 + } else { 870 + WREG32(MC_VM_MD_L1_TLB0_CNTL, tmp); 871 + WREG32(MC_VM_MD_L1_TLB1_CNTL, tmp); 872 + WREG32(MC_VM_MD_L1_TLB2_CNTL, tmp); 873 + } 868 874 WREG32(MC_VM_MB_L1_TLB0_CNTL, tmp); 869 875 WREG32(MC_VM_MB_L1_TLB1_CNTL, tmp); 870 876 WREG32(MC_VM_MB_L1_TLB2_CNTL, tmp); ··· 2928 2922 evergreen_blit_fini(rdev); 2929 2923 rdev->asic->copy = NULL; 2930 2924 dev_warn(rdev->dev, "failed blitter (%d) falling back to memcpy\n", r); 2931 - } 2932 - /* XXX: ontario has problems blitting to gart at the moment */ 2933 - if (rdev->family == CHIP_PALM) { 2934 - rdev->asic->copy = NULL; 2935 - radeon_ttm_set_active_vram_size(rdev, rdev->mc.visible_vram_size); 2936 2925 } 2937 2926 2938 2927 /* allocate wb buffer */
+5
drivers/gpu/drm/radeon/evergreend.h
··· 221 221 #define MC_VM_MD_L1_TLB0_CNTL 0x2654 222 222 #define MC_VM_MD_L1_TLB1_CNTL 0x2658 223 223 #define MC_VM_MD_L1_TLB2_CNTL 0x265C 224 + 225 + #define FUS_MC_VM_MD_L1_TLB0_CNTL 0x265C 226 + #define FUS_MC_VM_MD_L1_TLB1_CNTL 0x2660 227 + #define FUS_MC_VM_MD_L1_TLB2_CNTL 0x2664 228 + 224 229 #define MC_VM_SYSTEM_APERTURE_DEFAULT_ADDR 0x203C 225 230 #define MC_VM_SYSTEM_APERTURE_HIGH_ADDR 0x2038 226 231 #define MC_VM_SYSTEM_APERTURE_LOW_ADDR 0x2034
+5 -4
drivers/gpu/drm/radeon/radeon_atombios.c
··· 431 431 } 432 432 } 433 433 434 - /* Acer laptop (Acer TravelMate 5730G) has an HDMI port 434 + /* Acer laptop (Acer TravelMate 5730/5730G) has an HDMI port 435 435 * on the laptop and a DVI port on the docking station and 436 436 * both share the same encoder, hpd pin, and ddc line. 437 437 * So while the bios table is technically correct, ··· 440 440 * with different crtcs which isn't possible on the hardware 441 441 * side and leaves no crtcs for LVDS or VGA. 442 442 */ 443 - if ((dev->pdev->device == 0x95c4) && 443 + if (((dev->pdev->device == 0x95c4) || (dev->pdev->device == 0x9591)) && 444 444 (dev->pdev->subsystem_vendor == 0x1025) && 445 445 (dev->pdev->subsystem_device == 0x013c)) { 446 446 if ((*connector_type == DRM_MODE_CONNECTOR_DVII) && ··· 1599 1599 memcpy((u8 *)edid, (u8 *)&fake_edid_record->ucFakeEDIDString[0], 1600 1600 fake_edid_record->ucFakeEDIDLength); 1601 1601 1602 - if (drm_edid_is_valid(edid)) 1602 + if (drm_edid_is_valid(edid)) { 1603 1603 rdev->mode_info.bios_hardcoded_edid = edid; 1604 - else 1604 + rdev->mode_info.bios_hardcoded_edid_size = edid_size; 1605 + } else 1605 1606 kfree(edid); 1606 1607 } 1607 1608 }
+27 -2
drivers/gpu/drm/radeon/radeon_atpx_handler.c
··· 15 15 #define ATPX_VERSION 0 16 16 #define ATPX_GPU_PWR 2 17 17 #define ATPX_MUX_SELECT 3 18 + #define ATPX_I2C_MUX_SELECT 4 19 + #define ATPX_SWITCH_START 5 20 + #define ATPX_SWITCH_END 6 18 21 19 22 #define ATPX_INTEGRATED 0 20 23 #define ATPX_DISCRETE 1 ··· 152 149 return radeon_atpx_execute(handle, ATPX_MUX_SELECT, mux_id); 153 150 } 154 151 152 + static int radeon_atpx_switch_i2c_mux(acpi_handle handle, int mux_id) 153 + { 154 + return radeon_atpx_execute(handle, ATPX_I2C_MUX_SELECT, mux_id); 155 + } 156 + 157 + static int radeon_atpx_switch_start(acpi_handle handle, int gpu_id) 158 + { 159 + return radeon_atpx_execute(handle, ATPX_SWITCH_START, gpu_id); 160 + } 161 + 162 + static int radeon_atpx_switch_end(acpi_handle handle, int gpu_id) 163 + { 164 + return radeon_atpx_execute(handle, ATPX_SWITCH_END, gpu_id); 165 + } 155 166 156 167 static int radeon_atpx_switchto(enum vga_switcheroo_client_id id) 157 168 { 169 + int gpu_id; 170 + 158 171 if (id == VGA_SWITCHEROO_IGD) 159 - radeon_atpx_switch_mux(radeon_atpx_priv.atpx_handle, 0); 172 + gpu_id = ATPX_INTEGRATED; 160 173 else 161 - radeon_atpx_switch_mux(radeon_atpx_priv.atpx_handle, 1); 174 + gpu_id = ATPX_DISCRETE; 175 + 176 + radeon_atpx_switch_start(radeon_atpx_priv.atpx_handle, gpu_id); 177 + radeon_atpx_switch_mux(radeon_atpx_priv.atpx_handle, gpu_id); 178 + radeon_atpx_switch_i2c_mux(radeon_atpx_priv.atpx_handle, gpu_id); 179 + radeon_atpx_switch_end(radeon_atpx_priv.atpx_handle, gpu_id); 180 + 162 181 return 0; 163 182 } 164 183
+3 -3
drivers/gpu/drm/radeon/radeon_cursor.c
··· 167 167 return -EINVAL; 168 168 } 169 169 170 - radeon_crtc->cursor_width = width; 171 - radeon_crtc->cursor_height = height; 172 - 173 170 obj = drm_gem_object_lookup(crtc->dev, file_priv, handle); 174 171 if (!obj) { 175 172 DRM_ERROR("Cannot find cursor object %x for crtc %d\n", handle, radeon_crtc->crtc_id); ··· 176 179 ret = radeon_gem_object_pin(obj, RADEON_GEM_DOMAIN_VRAM, &gpu_addr); 177 180 if (ret) 178 181 goto fail; 182 + 183 + radeon_crtc->cursor_width = width; 184 + radeon_crtc->cursor_height = height; 179 185 180 186 radeon_lock_cursor(crtc, true); 181 187 /* XXX only 27 bit offset for legacy cursor */
+16
drivers/gpu/drm/radeon/radeon_kms.c
··· 221 221 return -EINVAL; 222 222 } 223 223 break; 224 + case RADEON_INFO_NUM_TILE_PIPES: 225 + if (rdev->family >= CHIP_CAYMAN) 226 + value = rdev->config.cayman.max_tile_pipes; 227 + else if (rdev->family >= CHIP_CEDAR) 228 + value = rdev->config.evergreen.max_tile_pipes; 229 + else if (rdev->family >= CHIP_RV770) 230 + value = rdev->config.rv770.max_tile_pipes; 231 + else if (rdev->family >= CHIP_R600) 232 + value = rdev->config.r600.max_tile_pipes; 233 + else { 234 + return -EINVAL; 235 + } 236 + break; 237 + case RADEON_INFO_FUSION_GART_WORKING: 238 + value = 1; 239 + break; 224 240 default: 225 241 DRM_DEBUG_KMS("Invalid request %d\n", info->request); 226 242 return -EINVAL;
+1
drivers/gpu/drm/radeon/reg_srcs/r600
··· 708 708 0x00028D0C DB_RENDER_CONTROL 709 709 0x00028D10 DB_RENDER_OVERRIDE 710 710 0x0002880C DB_SHADER_CONTROL 711 + 0x00028D28 DB_SRESULTS_COMPARE_STATE0 711 712 0x00028D2C DB_SRESULTS_COMPARE_STATE1 712 713 0x00028430 DB_STENCILREFMASK 713 714 0x00028434 DB_STENCILREFMASK_BF
+5 -6
drivers/hwmon/Kconfig
··· 110 110 help 111 111 If you say yes here you get support for Analog Devices ADM1021 112 112 and ADM1023 sensor chips and clones: Maxim MAX1617 and MAX1617A, 113 - Genesys Logic GL523SM, National Semiconductor LM84, TI THMC10, 114 - and the XEON processor built-in sensor. 113 + Genesys Logic GL523SM, National Semiconductor LM84 and TI THMC10. 115 114 116 115 This driver can also be built as a module. If so, the module 117 116 will be called adm1021. ··· 617 618 depends on I2C 618 619 help 619 620 If you say yes here you get support for National Semiconductor LM90, 620 - LM86, LM89 and LM99, Analog Devices ADM1032 and ADT7461, Maxim 621 - MAX6646, MAX6647, MAX6648, MAX6649, MAX6657, MAX6658, MAX6659, 622 - MAX6680, MAX6681, MAX6692, MAX6695, MAX6696, and Winbond/Nuvoton 623 - W83L771W/G/AWG/ASG sensor chips. 621 + LM86, LM89 and LM99, Analog Devices ADM1032, ADT7461, and ADT7461A, 622 + Maxim MAX6646, MAX6647, MAX6648, MAX6649, MAX6657, MAX6658, MAX6659, 623 + MAX6680, MAX6681, MAX6692, MAX6695, MAX6696, ON Semiconductor NCT1008, 624 + and Winbond/Nuvoton W83L771W/G/AWG/ASG sensor chips. 624 625 625 626 This driver can also be built as a module. If so, the module 626 627 will be called lm90.
+4 -2
drivers/hwmon/lm85.c
··· 1094 1094 &sensor_dev_attr_pwm1_auto_pwm_minctl.dev_attr.attr, 1095 1095 &sensor_dev_attr_pwm2_auto_pwm_minctl.dev_attr.attr, 1096 1096 &sensor_dev_attr_pwm3_auto_pwm_minctl.dev_attr.attr, 1097 + NULL 1097 1098 }; 1098 1099 1099 1100 static const struct attribute_group lm85_group_minctl = { ··· 1105 1104 &sensor_dev_attr_temp1_auto_temp_off.dev_attr.attr, 1106 1105 &sensor_dev_attr_temp2_auto_temp_off.dev_attr.attr, 1107 1106 &sensor_dev_attr_temp3_auto_temp_off.dev_attr.attr, 1107 + NULL 1108 1108 }; 1109 1109 1110 1110 static const struct attribute_group lm85_group_temp_off = { ··· 1331 1329 if (data->type != emc6d103s) { 1332 1330 err = sysfs_create_group(&client->dev.kobj, &lm85_group_minctl); 1333 1331 if (err) 1334 - goto err_kfree; 1332 + goto err_remove_files; 1335 1333 err = sysfs_create_group(&client->dev.kobj, 1336 1334 &lm85_group_temp_off); 1337 1335 if (err) 1338 - goto err_kfree; 1336 + goto err_remove_files; 1339 1337 } 1340 1338 1341 1339 /* The ADT7463/68 have an optional VRM 10 mode where pin 21 is used
+15 -7
drivers/hwmon/lm90.c
··· 49 49 * chips, but support three temperature sensors instead of two. MAX6695 50 50 * and MAX6696 only differ in the pinout so they can be treated identically. 51 51 * 52 - * This driver also supports the ADT7461 chip from Analog Devices. 53 - * It's supported in both compatibility and extended mode. It is mostly 54 - * compatible with LM90 except for a data format difference for the 55 - * temperature value registers. 52 + * This driver also supports ADT7461 and ADT7461A from Analog Devices as well as 53 + * NCT1008 from ON Semiconductor. The chips are supported in both compatibility 54 + * and extended mode. They are mostly compatible with LM90 except for a data 55 + * format difference for the temperature value registers. 56 56 * 57 57 * Since the LM90 was the first chipset supported by this driver, most 58 58 * comments will refer to this chipset, but are actually general and ··· 88 88 * Addresses to scan 89 89 * Address is fully defined internally and cannot be changed except for 90 90 * MAX6659, MAX6680 and MAX6681. 91 - * LM86, LM89, LM90, LM99, ADM1032, ADM1032-1, ADT7461, MAX6649, MAX6657, 92 - * MAX6658 and W83L771 have address 0x4c. 93 - * ADM1032-2, ADT7461-2, LM89-1, LM99-1 and MAX6646 have address 0x4d. 91 + * LM86, LM89, LM90, LM99, ADM1032, ADM1032-1, ADT7461, ADT7461A, MAX6649, 92 + * MAX6657, MAX6658, NCT1008 and W83L771 have address 0x4c. 93 + * ADM1032-2, ADT7461-2, ADT7461A-2, LM89-1, LM99-1, MAX6646, and NCT1008D 94 + * have address 0x4d. 94 95 * MAX6647 has address 0x4e. 95 96 * MAX6659 can have address 0x4c, 0x4d or 0x4e. 96 97 * MAX6680 and MAX6681 can have address 0x18, 0x19, 0x1a, 0x29, 0x2a, 0x2b, ··· 175 174 static const struct i2c_device_id lm90_id[] = { 176 175 { "adm1032", adm1032 }, 177 176 { "adt7461", adt7461 }, 177 + { "adt7461a", adt7461 }, 178 178 { "lm90", lm90 }, 179 179 { "lm86", lm86 }, 180 180 { "lm89", lm86 }, ··· 190 188 { "max6681", max6680 }, 191 189 { "max6695", max6696 }, 192 190 { "max6696", max6696 }, 191 + { "nct1008", adt7461 }, 193 192 { "w83l771", w83l771 }, 194 193 { } 195 194 }; ··· 1156 1153 && (reg_config1 & 0x1B) == 0x00 1157 1154 && reg_convrate <= 0x0A) { 1158 1155 name = "adt7461"; 1156 + } else 1157 + if (chip_id == 0x57 /* ADT7461A, NCT1008 */ 1158 + && (reg_config1 & 0x1B) == 0x00 1159 + && reg_convrate <= 0x0A) { 1160 + name = "adt7461a"; 1159 1161 } 1160 1162 } else 1161 1163 if (man_id == 0x4D) { /* Maxim */
+1 -2
drivers/hwmon/twl4030-madc-hwmon.c
··· 98 98 static int __devinit twl4030_madc_hwmon_probe(struct platform_device *pdev) 99 99 { 100 100 int ret; 101 - int status; 102 101 struct device *hwmon; 103 102 104 103 ret = sysfs_create_group(&pdev->dev.kobj, &twl4030_madc_group); ··· 106 107 hwmon = hwmon_device_register(&pdev->dev); 107 108 if (IS_ERR(hwmon)) { 108 109 dev_err(&pdev->dev, "hwmon_device_register failed.\n"); 109 - status = PTR_ERR(hwmon); 110 + ret = PTR_ERR(hwmon); 110 111 goto err_reg; 111 112 } 112 113
+5
drivers/i2c/busses/i2c-i801.c
··· 134 134 SMBHSTSTS_BUS_ERR | SMBHSTSTS_DEV_ERR | \ 135 135 SMBHSTSTS_INTR) 136 136 137 + /* Older devices have their ID defined in <linux/pci_ids.h> */ 138 + #define PCI_DEVICE_ID_INTEL_COUGARPOINT_SMBUS 0x1c22 139 + #define PCI_DEVICE_ID_INTEL_PATSBURG_SMBUS 0x1d22 137 140 /* Patsburg also has three 'Integrated Device Function' SMBus controllers */ 138 141 #define PCI_DEVICE_ID_INTEL_PATSBURG_SMBUS_IDF0 0x1d70 139 142 #define PCI_DEVICE_ID_INTEL_PATSBURG_SMBUS_IDF1 0x1d71 140 143 #define PCI_DEVICE_ID_INTEL_PATSBURG_SMBUS_IDF2 0x1d72 144 + #define PCI_DEVICE_ID_INTEL_DH89XXCC_SMBUS 0x2330 145 + #define PCI_DEVICE_ID_INTEL_5_3400_SERIES_SMBUS 0x3b30 141 146 142 147 struct i801_priv { 143 148 struct i2c_adapter adapter;
+14 -13
drivers/i2c/busses/i2c-parport.c
··· 1 1 /* ------------------------------------------------------------------------ * 2 2 * i2c-parport.c I2C bus over parallel port * 3 3 * ------------------------------------------------------------------------ * 4 - Copyright (C) 2003-2010 Jean Delvare <khali@linux-fr.org> 4 + Copyright (C) 2003-2011 Jean Delvare <khali@linux-fr.org> 5 5 6 6 Based on older i2c-philips-par.c driver 7 7 Copyright (C) 1995-2000 Simon G. Vogl ··· 33 33 #include <linux/i2c-algo-bit.h> 34 34 #include <linux/i2c-smbus.h> 35 35 #include <linux/slab.h> 36 + #include <linux/list.h> 37 + #include <linux/mutex.h> 36 38 #include "i2c-parport.h" 37 39 38 40 /* ----- Device list ------------------------------------------------------ */ ··· 45 43 struct i2c_algo_bit_data algo_data; 46 44 struct i2c_smbus_alert_setup alert_data; 47 45 struct i2c_client *ara; 48 - struct i2c_par *next; 46 + struct list_head node; 49 47 }; 50 48 51 - static struct i2c_par *adapter_list; 49 + static LIST_HEAD(adapter_list); 50 + static DEFINE_MUTEX(adapter_list_lock); 52 51 53 52 /* ----- Low-level parallel port access ----------------------------------- */ 54 53 ··· 231 228 } 232 229 233 230 /* Add the new adapter to the list */ 234 - adapter->next = adapter_list; 235 - adapter_list = adapter; 231 + mutex_lock(&adapter_list_lock); 232 + list_add_tail(&adapter->node, &adapter_list); 233 + mutex_unlock(&adapter_list_lock); 236 234 return; 237 235 238 236 ERROR1: ··· 245 241 246 242 static void i2c_parport_detach (struct parport *port) 247 243 { 248 - struct i2c_par *adapter, *prev; 244 + struct i2c_par *adapter, *_n; 249 245 250 246 /* Walk the list */ 251 - for (prev = NULL, adapter = adapter_list; adapter; 252 - prev = adapter, adapter = adapter->next) { 247 + mutex_lock(&adapter_list_lock); 248 + list_for_each_entry_safe(adapter, _n, &adapter_list, node) { 253 249 if (adapter->pdev->port == port) { 254 250 if (adapter->ara) { 255 251 parport_disable_irq(port); ··· 263 259 264 260 parport_release(adapter->pdev); 265 261 parport_unregister_device(adapter->pdev); 266 - if (prev) 267 - prev->next = adapter->next; 268 - else 269 - adapter_list = adapter->next; 262 + list_del(&adapter->node); 270 263 kfree(adapter); 271 - return; 272 264 } 273 265 } 266 + mutex_unlock(&adapter_list_lock); 274 267 } 275 268 276 269 static struct parport_driver i2c_parport_driver = {
+1 -1
drivers/infiniband/hw/qib/qib_iba6120.c
··· 1799 1799 /* 1800 1800 * Keep chip from being accessed until we are ready. Use 1801 1801 * writeq() directly, to allow the write even though QIB_PRESENT 1802 - * isn't' set. 1802 + * isn't set. 1803 1803 */ 1804 1804 dd->flags &= ~(QIB_INITTED | QIB_PRESENT); 1805 1805 dd->int_counter = 0; /* so we check interrupts work again */
+1 -1
drivers/infiniband/hw/qib/qib_iba7220.c
··· 2111 2111 /* 2112 2112 * Keep chip from being accessed until we are ready. Use 2113 2113 * writeq() directly, to allow the write even though QIB_PRESENT 2114 - * isn't' set. 2114 + * isn't set. 2115 2115 */ 2116 2116 dd->flags &= ~(QIB_INITTED | QIB_PRESENT); 2117 2117 dd->int_counter = 0; /* so we check interrupts work again */
+1 -1
drivers/infiniband/hw/qib/qib_iba7322.c
··· 3299 3299 /* 3300 3300 * Keep chip from being accessed until we are ready. Use 3301 3301 * writeq() directly, to allow the write even though QIB_PRESENT 3302 - * isn't' set. 3302 + * isn't set. 3303 3303 */ 3304 3304 dd->flags &= ~(QIB_INITTED | QIB_PRESENT | QIB_BADINTR); 3305 3305 dd->flags |= QIB_DOING_RESET;
+64 -11
drivers/input/touchscreen/wm831x-ts.c
··· 68 68 unsigned int pd_irq; 69 69 bool pressure; 70 70 bool pen_down; 71 + struct work_struct pd_data_work; 71 72 }; 73 + 74 + static void wm831x_pd_data_work(struct work_struct *work) 75 + { 76 + struct wm831x_ts *wm831x_ts = 77 + container_of(work, struct wm831x_ts, pd_data_work); 78 + 79 + if (wm831x_ts->pen_down) { 80 + enable_irq(wm831x_ts->data_irq); 81 + dev_dbg(wm831x_ts->wm831x->dev, "IRQ PD->DATA done\n"); 82 + } else { 83 + enable_irq(wm831x_ts->pd_irq); 84 + dev_dbg(wm831x_ts->wm831x->dev, "IRQ DATA->PD done\n"); 85 + } 86 + } 72 87 73 88 static irqreturn_t wm831x_ts_data_irq(int irq, void *irq_data) 74 89 { ··· 125 110 } 126 111 127 112 if (!wm831x_ts->pen_down) { 113 + /* Switch from data to pen down */ 114 + dev_dbg(wm831x->dev, "IRQ DATA->PD\n"); 115 + 128 116 disable_irq_nosync(wm831x_ts->data_irq); 129 117 130 118 /* Don't need data any more */ ··· 146 128 ABS_PRESSURE, 0); 147 129 148 130 input_report_key(wm831x_ts->input_dev, BTN_TOUCH, 0); 131 + 132 + schedule_work(&wm831x_ts->pd_data_work); 133 + } else { 134 + input_report_key(wm831x_ts->input_dev, BTN_TOUCH, 1); 149 135 } 150 136 151 137 input_sync(wm831x_ts->input_dev); ··· 163 141 struct wm831x *wm831x = wm831x_ts->wm831x; 164 142 int ena = 0; 165 143 144 + if (wm831x_ts->pen_down) 145 + return IRQ_HANDLED; 146 + 147 + disable_irq_nosync(wm831x_ts->pd_irq); 148 + 166 149 /* Start collecting data */ 167 150 if (wm831x_ts->pressure) 168 151 ena |= WM831X_TCH_Z_ENA; ··· 176 149 WM831X_TCH_X_ENA | WM831X_TCH_Y_ENA | WM831X_TCH_Z_ENA, 177 150 WM831X_TCH_X_ENA | WM831X_TCH_Y_ENA | ena); 178 151 179 - input_report_key(wm831x_ts->input_dev, BTN_TOUCH, 1); 180 - input_sync(wm831x_ts->input_dev); 181 - 182 152 wm831x_set_bits(wm831x, WM831X_INTERRUPT_STATUS_1, 183 153 WM831X_TCHPD_EINT, WM831X_TCHPD_EINT); 184 154 185 155 wm831x_ts->pen_down = true; 186 - enable_irq(wm831x_ts->data_irq); 156 + 157 + /* Switch from pen down to data */ 158 + dev_dbg(wm831x->dev, "IRQ PD->DATA\n"); 159 + schedule_work(&wm831x_ts->pd_data_work); 187 160 188 161 return IRQ_HANDLED; 189 162 } ··· 209 182 struct wm831x_ts *wm831x_ts = input_get_drvdata(idev); 210 183 struct wm831x *wm831x = wm831x_ts->wm831x; 211 184 185 + /* Shut the controller down, disabling all other functionality too */ 212 186 wm831x_set_bits(wm831x, WM831X_TOUCH_CONTROL_1, 213 - WM831X_TCH_ENA | WM831X_TCH_CVT_ENA | 214 - WM831X_TCH_X_ENA | WM831X_TCH_Y_ENA | 215 - WM831X_TCH_Z_ENA, 0); 187 + WM831X_TCH_ENA | WM831X_TCH_X_ENA | 188 + WM831X_TCH_Y_ENA | WM831X_TCH_Z_ENA, 0); 216 189 217 - if (wm831x_ts->pen_down) 190 + /* Make sure any pending IRQs are done, the above will prevent 191 + * new ones firing. 192 + */ 193 + synchronize_irq(wm831x_ts->data_irq); 194 + synchronize_irq(wm831x_ts->pd_irq); 195 + 196 + /* Make sure the IRQ completion work is quiesced */ 197 + flush_work_sync(&wm831x_ts->pd_data_work); 198 + 199 + /* If we ended up with the pen down then make sure we revert back 200 + * to pen detection state for the next time we start up. 201 + */ 202 + if (wm831x_ts->pen_down) { 218 203 disable_irq(wm831x_ts->data_irq); 204 + enable_irq(wm831x_ts->pd_irq); 205 + wm831x_ts->pen_down = false; 206 + } 219 207 } 220 208 221 209 static __devinit int wm831x_ts_probe(struct platform_device *pdev) ··· 240 198 struct wm831x_pdata *core_pdata = dev_get_platdata(pdev->dev.parent); 241 199 struct wm831x_touch_pdata *pdata = NULL; 242 200 struct input_dev *input_dev; 243 - int error; 201 + int error, irqf; 244 202 245 203 if (core_pdata) 246 204 pdata = core_pdata->touch; ··· 254 212 255 213 wm831x_ts->wm831x = wm831x; 256 214 wm831x_ts->input_dev = input_dev; 215 + INIT_WORK(&wm831x_ts->pd_data_work, wm831x_pd_data_work); 257 216 258 217 /* 259 218 * If we have a direct IRQ use it, otherwise use the interrupt ··· 313 270 wm831x_set_bits(wm831x, WM831X_TOUCH_CONTROL_1, 314 271 WM831X_TCH_RATE_MASK, 6); 315 272 273 + if (pdata && pdata->data_irqf) 274 + irqf = pdata->data_irqf; 275 + else 276 + irqf = IRQF_TRIGGER_HIGH; 277 + 316 278 error = request_threaded_irq(wm831x_ts->data_irq, 317 279 NULL, wm831x_ts_data_irq, 318 - IRQF_ONESHOT, 280 + irqf | IRQF_ONESHOT, 319 281 "Touchscreen data", wm831x_ts); 320 282 if (error) { 321 283 dev_err(&pdev->dev, "Failed to request data IRQ %d: %d\n", ··· 329 281 } 330 282 disable_irq(wm831x_ts->data_irq); 331 283 284 + if (pdata && pdata->pd_irqf) 285 + irqf = pdata->pd_irqf; 286 + else 287 + irqf = IRQF_TRIGGER_HIGH; 288 + 332 289 error = request_threaded_irq(wm831x_ts->pd_irq, 333 290 NULL, wm831x_ts_pen_down_irq, 334 - IRQF_ONESHOT, 291 + irqf | IRQF_ONESHOT, 335 292 "Touchscreen pen down", wm831x_ts); 336 293 if (error) { 337 294 dev_err(&pdev->dev, "Failed to request pen down IRQ %d: %d\n",
+1 -10
drivers/media/common/tuners/tda18271-common.c
··· 533 533 if (tda_fail(ret)) 534 534 goto fail; 535 535 536 - regs[R_MPD] = (0x77 & pd); 537 - 538 - switch (priv->mode) { 539 - case TDA18271_ANALOG: 540 - regs[R_MPD] &= ~0x08; 541 - break; 542 - case TDA18271_DIGITAL: 543 - regs[R_MPD] |= 0x08; 544 - break; 545 - } 536 + regs[R_MPD] = (0x7f & pd); 546 537 547 538 div = ((d * (freq / 1000)) << 7) / 125; 548 539
+11 -10
drivers/media/common/tuners/tda18271-fe.c
··· 579 579 #define RF3 2 580 580 u32 rf_default[3]; 581 581 u32 rf_freq[3]; 582 - u8 prog_cal[3]; 583 - u8 prog_tab[3]; 582 + s32 prog_cal[3]; 583 + s32 prog_tab[3]; 584 584 585 585 i = tda18271_lookup_rf_band(fe, &freq, NULL); 586 586 ··· 602 602 return bcal; 603 603 604 604 tda18271_calc_rf_cal(fe, &rf_freq[rf]); 605 - prog_tab[rf] = regs[R_EB14]; 605 + prog_tab[rf] = (s32)regs[R_EB14]; 606 606 607 607 if (1 == bcal) 608 - prog_cal[rf] = tda18271_calibrate_rf(fe, rf_freq[rf]); 608 + prog_cal[rf] = 609 + (s32)tda18271_calibrate_rf(fe, rf_freq[rf]); 609 610 else 610 611 prog_cal[rf] = prog_tab[rf]; 611 612 612 613 switch (rf) { 613 614 case RF1: 614 615 map[i].rf_a1 = 0; 615 - map[i].rf_b1 = (s32)(prog_cal[RF1] - prog_tab[RF1]); 616 + map[i].rf_b1 = (prog_cal[RF1] - prog_tab[RF1]); 616 617 map[i].rf1 = rf_freq[RF1] / 1000; 617 618 break; 618 619 case RF2: 619 - dividend = (s32)(prog_cal[RF2] - prog_tab[RF2]) - 620 - (s32)(prog_cal[RF1] + prog_tab[RF1]); 620 + dividend = (prog_cal[RF2] - prog_tab[RF2] - 621 + prog_cal[RF1] + prog_tab[RF1]); 621 622 divisor = (s32)(rf_freq[RF2] - rf_freq[RF1]) / 1000; 622 623 map[i].rf_a1 = (dividend / divisor); 623 624 map[i].rf2 = rf_freq[RF2] / 1000; 624 625 break; 625 626 case RF3: 626 - dividend = (s32)(prog_cal[RF3] - prog_tab[RF3]) - 627 - (s32)(prog_cal[RF2] + prog_tab[RF2]); 627 + dividend = (prog_cal[RF3] - prog_tab[RF3] - 628 + prog_cal[RF2] + prog_tab[RF2]); 628 629 divisor = (s32)(rf_freq[RF3] - rf_freq[RF2]) / 1000; 629 630 map[i].rf_a2 = (dividend / divisor); 630 - map[i].rf_b2 = (s32)(prog_cal[RF2] - prog_tab[RF2]); 631 + map[i].rf_b2 = (prog_cal[RF2] - prog_tab[RF2]); 631 632 map[i].rf3 = rf_freq[RF3] / 1000; 632 633 break; 633 634 default:
+6 -6
drivers/media/common/tuners/tda18271-maps.c
··· 229 229 static struct tda18271_map tda18271_rf_band[] = { 230 230 { .rfmax = 47900, .val = 0x00 }, 231 231 { .rfmax = 61100, .val = 0x01 }, 232 - /* { .rfmax = 152600, .val = 0x02 }, */ 233 - { .rfmax = 121200, .val = 0x02 }, 232 + { .rfmax = 152600, .val = 0x02 }, 234 233 { .rfmax = 164700, .val = 0x03 }, 235 234 { .rfmax = 203500, .val = 0x04 }, 236 235 { .rfmax = 457800, .val = 0x05 }, ··· 447 448 { .rfmax = 150000, .val = 0xb0 }, 448 449 { .rfmax = 151000, .val = 0xb1 }, 449 450 { .rfmax = 152000, .val = 0xb7 }, 450 - { .rfmax = 153000, .val = 0xbd }, 451 + { .rfmax = 152600, .val = 0xbd }, 451 452 { .rfmax = 154000, .val = 0x20 }, 452 453 { .rfmax = 155000, .val = 0x22 }, 453 454 { .rfmax = 156000, .val = 0x24 }, ··· 458 459 { .rfmax = 161000, .val = 0x2d }, 459 460 { .rfmax = 163000, .val = 0x2e }, 460 461 { .rfmax = 164000, .val = 0x2f }, 461 - { .rfmax = 165000, .val = 0x30 }, 462 + { .rfmax = 164700, .val = 0x30 }, 462 463 { .rfmax = 166000, .val = 0x11 }, 463 464 { .rfmax = 167000, .val = 0x12 }, 464 465 { .rfmax = 168000, .val = 0x13 }, ··· 509 510 { .rfmax = 236000, .val = 0x1b }, 510 511 { .rfmax = 237000, .val = 0x1c }, 511 512 { .rfmax = 240000, .val = 0x1d }, 512 - { .rfmax = 242000, .val = 0x1f }, 513 + { .rfmax = 242000, .val = 0x1e }, 514 + { .rfmax = 244000, .val = 0x1f }, 513 515 { .rfmax = 247000, .val = 0x20 }, 514 516 { .rfmax = 249000, .val = 0x21 }, 515 517 { .rfmax = 252000, .val = 0x22 }, ··· 624 624 { .rfmax = 453000, .val = 0x93 }, 625 625 { .rfmax = 454000, .val = 0x94 }, 626 626 { .rfmax = 456000, .val = 0x96 }, 627 - { .rfmax = 457000, .val = 0x98 }, 627 + { .rfmax = 457800, .val = 0x98 }, 628 628 { .rfmax = 461000, .val = 0x11 }, 629 629 { .rfmax = 468000, .val = 0x12 }, 630 630 { .rfmax = 472000, .val = 0x13 },
+1 -1
drivers/media/dvb/b2c2/flexcop-pci.c
··· 38 38 DEBSTATUS); 39 39 40 40 #define DRIVER_VERSION "0.1" 41 - #define DRIVER_NAME "Technisat/B2C2 FlexCop II/IIb/III Digital TV PCI Driver" 41 + #define DRIVER_NAME "flexcop-pci" 42 42 #define DRIVER_AUTHOR "Patrick Boettcher <patrick.boettcher@desy.de>" 43 43 44 44 struct flexcop_pci {
+4 -2
drivers/media/dvb/dvb-usb/Kconfig
··· 356 356 select DVB_TDA826X if !DVB_FE_CUSTOMISE 357 357 select DVB_STV0288 if !DVB_FE_CUSTOMISE 358 358 select DVB_IX2505V if !DVB_FE_CUSTOMISE 359 + select DVB_STV0299 if !DVB_FE_CUSTOMISE 360 + select DVB_PLL if !DVB_FE_CUSTOMISE 359 361 help 360 362 Say Y here to support the LME DM04/QQBOX DVB-S USB2.0 . 361 363 362 364 config DVB_USB_TECHNISAT_USB2 363 365 tristate "Technisat DVB-S/S2 USB2.0 support" 364 366 depends on DVB_USB 365 - select DVB_STB0899 if !DVB_FE_CUSTOMISE 366 - select DVB_STB6100 if !DVB_FE_CUSTOMISE 367 + select DVB_STV090x if !DVB_FE_CUSTOMISE 368 + select DVB_STV6110x if !DVB_FE_CUSTOMISE 367 369 help 368 370 Say Y here to support the Technisat USB2 DVB-S/S2 device
+3 -3
drivers/media/dvb/dvb-usb/dib0700_devices.c
··· 2162 2162 .agc1_pt3 = 98, 2163 2163 .agc1_slope1 = 0, 2164 2164 .agc1_slope2 = 167, 2165 - .agc1_pt1 = 98, 2165 + .agc2_pt1 = 98, 2166 2166 .agc2_pt2 = 255, 2167 2167 .agc2_slope1 = 104, 2168 2168 .agc2_slope2 = 0, ··· 2440 2440 dib0700_set_i2c_speed(adap->dev, 340); 2441 2441 adap->fe = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap, 0x90, &tfe7090pvr_dib7000p_config[0]); 2442 2442 2443 - dib7090_slave_reset(adap->fe); 2444 - 2445 2443 if (adap->fe == NULL) 2446 2444 return -ENODEV; 2445 + 2446 + dib7090_slave_reset(adap->fe); 2447 2447 2448 2448 return 0; 2449 2449 }
+1
drivers/media/dvb/ngene/ngene-core.c
··· 1520 1520 if (dev->ci.en && (io & NGENE_IO_TSOUT)) { 1521 1521 dvb_ca_en50221_init(adapter, dev->ci.en, 0, 1); 1522 1522 set_transfer(chan, 1); 1523 + chan->dev->channel[2].DataFormatFlags = DF_SWAP32; 1523 1524 set_transfer(&chan->dev->channel[2], 1); 1524 1525 dvb_register_device(adapter, &chan->ci_dev, 1525 1526 &ngene_dvbdev_ci, (void *) chan,
+6 -2
drivers/media/media-entity.c
··· 378 378 379 379 static int __media_entity_setup_link_notify(struct media_link *link, u32 flags) 380 380 { 381 - const u32 mask = MEDIA_LNK_FL_ENABLED; 382 381 int ret; 383 382 384 383 /* Notify both entities. */ ··· 394 395 return ret; 395 396 } 396 397 397 - link->flags = (link->flags & ~mask) | (flags & mask); 398 + link->flags = flags; 398 399 link->reverse->flags = link->flags; 399 400 400 401 return 0; ··· 416 417 */ 417 418 int __media_entity_setup_link(struct media_link *link, u32 flags) 418 419 { 420 + const u32 mask = MEDIA_LNK_FL_ENABLED; 419 421 struct media_device *mdev; 420 422 struct media_entity *source, *sink; 421 423 int ret = -EBUSY; 422 424 423 425 if (link == NULL) 426 + return -EINVAL; 427 + 428 + /* The non-modifiable link flags must not be modified. */ 429 + if ((link->flags & ~mask) != (flags & ~mask)) 424 430 return -EINVAL; 425 431 426 432 if (link->flags & MEDIA_LNK_FL_IMMUTABLE)
+1 -1
drivers/media/radio/radio-sf16fmr2.c
··· 170 170 return 0; 171 171 } 172 172 173 - /* !!! not tested, in my card this does't work !!! */ 173 + /* !!! not tested, in my card this doesn't work !!! */ 174 174 static int fmr2_setvolume(struct fmr2 *dev) 175 175 { 176 176 int vol[16] = { 0x021, 0x084, 0x090, 0x104,
+1 -1
drivers/media/radio/saa7706h.c
··· 376 376 v4l_info(client, "chip found @ 0x%02x (%s)\n", 377 377 client->addr << 1, client->adapter->name); 378 378 379 - state = kmalloc(sizeof(struct saa7706h_state), GFP_KERNEL); 379 + state = kzalloc(sizeof(struct saa7706h_state), GFP_KERNEL); 380 380 if (state == NULL) 381 381 return -ENOMEM; 382 382 sd = &state->sd;
+1 -1
drivers/media/radio/tef6862.c
··· 176 176 v4l_info(client, "chip found @ 0x%02x (%s)\n", 177 177 client->addr << 1, client->adapter->name); 178 178 179 - state = kmalloc(sizeof(struct tef6862_state), GFP_KERNEL); 179 + state = kzalloc(sizeof(struct tef6862_state), GFP_KERNEL); 180 180 if (state == NULL) 181 181 return -ENOMEM; 182 182 state->freq = TEF6862_LO_FREQ;
+27 -4
drivers/media/rc/imon.c
··· 46 46 #define MOD_AUTHOR "Jarod Wilson <jarod@wilsonet.com>" 47 47 #define MOD_DESC "Driver for SoundGraph iMON MultiMedia IR/Display" 48 48 #define MOD_NAME "imon" 49 - #define MOD_VERSION "0.9.2" 49 + #define MOD_VERSION "0.9.3" 50 50 51 51 #define DISPLAY_MINOR_BASE 144 52 52 #define DEVICE_NAME "lcd%d" ··· 460 460 } 461 461 462 462 /** 463 - * Sends a packet to the device -- this function must be called 464 - * with ictx->lock held. 463 + * Sends a packet to the device -- this function must be called with 464 + * ictx->lock held, or its unlock/lock sequence while waiting for tx 465 + * to complete can/will lead to a deadlock. 465 466 */ 466 467 static int send_packet(struct imon_context *ictx) 467 468 { ··· 992 991 * the iMON remotes, and those used by the Windows MCE remotes (which is 993 992 * really just RC-6), but only one or the other at a time, as the signals 994 993 * are decoded onboard the receiver. 994 + * 995 + * This function gets called two different ways, one way is from 996 + * rc_register_device, for initial protocol selection/setup, and the other is 997 + * via a userspace-initiated protocol change request, either by direct sysfs 998 + * prodding or by something like ir-keytable. In the rc_register_device case, 999 + * the imon context lock is already held, but when initiated from userspace, 1000 + * it is not, so we must acquire it prior to calling send_packet, which 1001 + * requires that the lock is held. 995 1002 */ 996 1003 static int imon_ir_change_protocol(struct rc_dev *rc, u64 rc_type) 997 1004 { 998 1005 int retval; 999 1006 struct imon_context *ictx = rc->priv; 1000 1007 struct device *dev = ictx->dev; 1008 + bool unlock = false; 1001 1009 unsigned char ir_proto_packet[] = { 1002 1010 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86 }; 1003 1011 ··· 1039 1029 1040 1030 memcpy(ictx->usb_tx_buf, &ir_proto_packet, sizeof(ir_proto_packet)); 1041 1031 1032 + if (!mutex_is_locked(&ictx->lock)) { 1033 + unlock = true; 1034 + mutex_lock(&ictx->lock); 1035 + } 1036 + 1042 1037 retval = send_packet(ictx); 1043 1038 if (retval) 1044 1039 goto out; ··· 1052 1037 ictx->pad_mouse = false; 1053 1038 1054 1039 out: 1040 + if (unlock) 1041 + mutex_unlock(&ictx->lock); 1042 + 1055 1043 return retval; 1056 1044 } 1057 1045 ··· 2152 2134 goto rdev_setup_failed; 2153 2135 } 2154 2136 2137 + mutex_unlock(&ictx->lock); 2155 2138 return ictx; 2156 2139 2157 2140 rdev_setup_failed: ··· 2224 2205 goto urb_submit_failed; 2225 2206 } 2226 2207 2208 + mutex_unlock(&ictx->lock); 2227 2209 return ictx; 2228 2210 2229 2211 urb_submit_failed: ··· 2319 2299 usb_set_intfdata(interface, ictx); 2320 2300 2321 2301 if (ifnum == 0) { 2302 + mutex_lock(&ictx->lock); 2303 + 2322 2304 if (product == 0xffdc && ictx->rf_device) { 2323 2305 sysfs_err = sysfs_create_group(&interface->dev.kobj, 2324 2306 &imon_rf_attr_group); ··· 2331 2309 2332 2310 if (ictx->display_supported) 2333 2311 imon_init_display(ictx, interface); 2312 + 2313 + mutex_unlock(&ictx->lock); 2334 2314 } 2335 2315 2336 2316 dev_info(dev, "iMON device (%04x:%04x, intf%d) on " 2337 2317 "usb<%d:%d> initialized\n", vendor, product, ifnum, 2338 2318 usbdev->bus->busnum, usbdev->devnum); 2339 2319 2340 - mutex_unlock(&ictx->lock); 2341 2320 mutex_unlock(&driver_lock); 2342 2321 2343 2322 return 0;
+1
drivers/media/rc/ite-cir.c
··· 36 36 #include <linux/io.h> 37 37 #include <linux/interrupt.h> 38 38 #include <linux/sched.h> 39 + #include <linux/delay.h> 39 40 #include <linux/slab.h> 40 41 #include <linux/input.h> 41 42 #include <linux/bitops.h>
+2
drivers/media/rc/mceusb.c
··· 220 220 { USB_DEVICE(VENDOR_PHILIPS, 0x206c) }, 221 221 /* Philips/Spinel plus IR transceiver for ASUS */ 222 222 { USB_DEVICE(VENDOR_PHILIPS, 0x2088) }, 223 + /* Philips IR transceiver (Dell branded) */ 224 + { USB_DEVICE(VENDOR_PHILIPS, 0x2093) }, 223 225 /* Realtek MCE IR Receiver and card reader */ 224 226 { USB_DEVICE(VENDOR_REALTEK, 0x0161), 225 227 .driver_info = MULTIFUNCTION },
+3 -1
drivers/media/rc/rc-main.c
··· 707 707 { 708 708 struct rc_dev *rdev = input_get_drvdata(idev); 709 709 710 - rdev->close(rdev); 710 + if (rdev) 711 + rdev->close(rdev); 711 712 } 712 713 713 714 /* class for /sys/class/rc */ ··· 734 733 { RC_TYPE_SONY, "sony" }, 735 734 { RC_TYPE_RC5_SZ, "rc-5-sz" }, 736 735 { RC_TYPE_LIRC, "lirc" }, 736 + { RC_TYPE_OTHER, "other" }, 737 737 }; 738 738 739 739 #define PROTO_NONE "none"
+1 -1
drivers/media/video/Kconfig
··· 875 875 config VIDEO_MX3 876 876 tristate "i.MX3x Camera Sensor Interface driver" 877 877 depends on VIDEO_DEV && MX3_IPU && SOC_CAMERA 878 - select VIDEOBUF_DMA_CONTIG 878 + select VIDEOBUF2_DMA_CONTIG 879 879 select MX3_VIDEO 880 880 ---help--- 881 881 This is a v4l2 driver for the i.MX3x Camera Sensor Interface
+9 -1
drivers/media/video/cx18/cx18-streams.c
··· 350 350 351 351 /* No struct video_device, but can have buffers allocated */ 352 352 if (type == CX18_ENC_STREAM_TYPE_IDX) { 353 + /* If the module params didn't inhibit IDX ... */ 353 354 if (cx->stream_buffers[type] != 0) { 354 355 cx->stream_buffers[type] = 0; 355 - cx18_stream_free(&cx->streams[type]); 356 + /* 357 + * Before calling cx18_stream_free(), 358 + * check if the IDX stream was actually set up. 359 + * Needed, since the cx18_probe() error path 360 + * exits through here as well as normal clean up 361 + */ 362 + if (cx->streams[type].buffers != 0) 363 + cx18_stream_free(&cx->streams[type]); 356 364 } 357 365 continue; 358 366 }
+1
drivers/media/video/cx23885/Kconfig
··· 22 22 select DVB_CX24116 if !DVB_FE_CUSTOMISE 23 23 select DVB_STV0900 if !DVB_FE_CUSTOMISE 24 24 select DVB_DS3000 if !DVB_FE_CUSTOMISE 25 + select DVB_STV0367 if !DVB_FE_CUSTOMISE 25 26 select MEDIA_TUNER_MT2131 if !MEDIA_TUNER_CUSTOMISE 26 27 select MEDIA_TUNER_XC2028 if !MEDIA_TUNER_CUSTOMISE 27 28 select MEDIA_TUNER_TDA8290 if !MEDIA_TUNER_CUSTOMISE
+1 -1
drivers/media/video/imx074.c
··· 298 298 static int imx074_set_bus_param(struct soc_camera_device *icd, 299 299 unsigned long flags) 300 300 { 301 - return -1; 301 + return -EINVAL; 302 302 } 303 303 304 304 static struct soc_camera_ops imx074_ops = {
+1 -1
drivers/media/video/m52790.c
··· 174 174 v4l_info(client, "chip found @ 0x%x (%s)\n", 175 175 client->addr << 1, client->adapter->name); 176 176 177 - state = kmalloc(sizeof(struct m52790_state), GFP_KERNEL); 177 + state = kzalloc(sizeof(struct m52790_state), GFP_KERNEL); 178 178 if (state == NULL) 179 179 return -ENOMEM; 180 180
+25 -9
drivers/media/video/omap3isp/isp.c
··· 215 215 } 216 216 217 217 switch (xclksel) { 218 - case 0: 218 + case ISP_XCLK_A: 219 219 isp_reg_clr_set(isp, OMAP3_ISP_IOMEM_MAIN, ISP_TCTRL_CTRL, 220 220 ISPTCTRL_CTRL_DIVA_MASK, 221 221 divisor << ISPTCTRL_CTRL_DIVA_SHIFT); 222 222 dev_dbg(isp->dev, "isp_set_xclk(): cam_xclka set to %d Hz\n", 223 223 currentxclk); 224 224 break; 225 - case 1: 225 + case ISP_XCLK_B: 226 226 isp_reg_clr_set(isp, OMAP3_ISP_IOMEM_MAIN, ISP_TCTRL_CTRL, 227 227 ISPTCTRL_CTRL_DIVB_MASK, 228 228 divisor << ISPTCTRL_CTRL_DIVB_SHIFT); 229 229 dev_dbg(isp->dev, "isp_set_xclk(): cam_xclkb set to %d Hz\n", 230 230 currentxclk); 231 231 break; 232 + case ISP_XCLK_NONE: 232 233 default: 233 234 omap3isp_put(isp); 234 235 dev_dbg(isp->dev, "ISP_ERR: isp_set_xclk(): Invalid requested " ··· 238 237 } 239 238 240 239 /* Do we go from stable whatever to clock? */ 241 - if (divisor >= 2 && isp->xclk_divisor[xclksel] < 2) 240 + if (divisor >= 2 && isp->xclk_divisor[xclksel - 1] < 2) 242 241 omap3isp_get(isp); 243 242 /* Stopping the clock. */ 244 - else if (divisor < 2 && isp->xclk_divisor[xclksel] >= 2) 243 + else if (divisor < 2 && isp->xclk_divisor[xclksel - 1] >= 2) 245 244 omap3isp_put(isp); 246 245 247 - isp->xclk_divisor[xclksel] = divisor; 246 + isp->xclk_divisor[xclksel - 1] = divisor; 248 247 249 248 omap3isp_put(isp); 250 249 ··· 286 285 */ 287 286 void omap3isp_configure_bridge(struct isp_device *isp, 288 287 enum ccdc_input_entity input, 289 - const struct isp_parallel_platform_data *pdata) 288 + const struct isp_parallel_platform_data *pdata, 289 + unsigned int shift) 290 290 { 291 291 u32 ispctrl_val; 292 292 ··· 300 298 switch (input) { 301 299 case CCDC_INPUT_PARALLEL: 302 300 ispctrl_val |= ISPCTRL_PAR_SER_CLK_SEL_PARALLEL; 303 - ispctrl_val |= pdata->data_lane_shift << ISPCTRL_SHIFT_SHIFT; 304 301 ispctrl_val |= pdata->clk_pol << ISPCTRL_PAR_CLK_POL_SHIFT; 305 302 ispctrl_val |= pdata->bridge << ISPCTRL_PAR_BRIDGE_SHIFT; 303 + shift += pdata->data_lane_shift * 2; 306 304 break; 307 305 308 306 case CCDC_INPUT_CSI2A: ··· 320 318 default: 321 319 return; 322 320 } 321 + 322 + ispctrl_val |= ((shift/2) << ISPCTRL_SHIFT_SHIFT) & ISPCTRL_SHIFT_MASK; 323 323 324 324 ispctrl_val &= ~ISPCTRL_SYNC_DETECT_MASK; 325 325 ispctrl_val |= ISPCTRL_SYNC_DETECT_VSRISE; ··· 662 658 663 659 /* Apply power change to connected non-nodes. */ 664 660 ret = isp_pipeline_pm_power(entity, change); 661 + if (ret < 0) 662 + entity->use_count -= change; 665 663 666 664 mutex_unlock(&entity->parent->graph_mutex); 667 665 ··· 878 872 } 879 873 } 880 874 875 + if (failure < 0) 876 + isp->needs_reset = true; 877 + 881 878 return failure; 882 879 } 883 880 ··· 893 884 * single-shot or continuous mode. 894 885 * 895 886 * Return 0 if successful, or the return value of the failed video::s_stream 896 - * operation otherwise. 887 + * operation otherwise. The pipeline state is not updated when the operation 888 + * fails, except when stopping the pipeline. 897 889 */ 898 890 int omap3isp_pipeline_set_stream(struct isp_pipeline *pipe, 899 891 enum isp_pipeline_stream_state state) ··· 905 895 ret = isp_pipeline_disable(pipe); 906 896 else 907 897 ret = isp_pipeline_enable(pipe, state); 908 - pipe->stream_state = state; 898 + 899 + if (ret == 0 || state == ISP_PIPELINE_STREAM_STOPPED) 900 + pipe->stream_state = state; 909 901 910 902 return ret; 911 903 } ··· 1493 1481 if (--isp->ref_count == 0) { 1494 1482 isp_disable_interrupts(isp); 1495 1483 isp_save_ctx(isp); 1484 + if (isp->needs_reset) { 1485 + isp_reset(isp); 1486 + isp->needs_reset = false; 1487 + } 1496 1488 isp_disable_clocks(isp); 1497 1489 } 1498 1490 mutex_unlock(&isp->isp_mutex);
+6 -6
drivers/media/video/omap3isp/isp.h
··· 132 132 133 133 /** 134 134 * struct isp_parallel_platform_data - Parallel interface platform data 135 - * @width: Parallel bus width in bits (8, 10, 11 or 12) 136 135 * @data_lane_shift: Data lane shifter 137 136 * 0 - CAMEXT[13:0] -> CAM[13:0] 138 137 * 1 - CAMEXT[13:2] -> CAM[11:0] ··· 145 146 * ISPCTRL_PAR_BRIDGE_BENDIAN - Big endian 146 147 */ 147 148 struct isp_parallel_platform_data { 148 - unsigned int width; 149 149 unsigned int data_lane_shift:2; 150 150 unsigned int clk_pol:1; 151 151 unsigned int bridge:4; ··· 260 262 /* ISP Obj */ 261 263 spinlock_t stat_lock; /* common lock for statistic drivers */ 262 264 struct mutex isp_mutex; /* For handling ref_count field */ 265 + bool needs_reset; 263 266 int has_context; 264 267 int ref_count; 265 268 unsigned int autoidle; ··· 310 311 enum isp_pipeline_stream_state state); 311 312 void omap3isp_configure_bridge(struct isp_device *isp, 312 313 enum ccdc_input_entity input, 313 - const struct isp_parallel_platform_data *pdata); 314 + const struct isp_parallel_platform_data *pdata, 315 + unsigned int shift); 314 316 315 - #define ISP_XCLK_NONE -1 316 - #define ISP_XCLK_A 0 317 - #define ISP_XCLK_B 1 317 + #define ISP_XCLK_NONE 0 318 + #define ISP_XCLK_A 1 319 + #define ISP_XCLK_B 2 318 320 319 321 struct isp_device *omap3isp_get(struct isp_device *isp); 320 322 void omap3isp_put(struct isp_device *isp);
+30 -7
drivers/media/video/omap3isp/ispccdc.c
··· 43 43 44 44 static const unsigned int ccdc_fmts[] = { 45 45 V4L2_MBUS_FMT_Y8_1X8, 46 + V4L2_MBUS_FMT_Y10_1X10, 47 + V4L2_MBUS_FMT_Y12_1X12, 48 + V4L2_MBUS_FMT_SGRBG8_1X8, 49 + V4L2_MBUS_FMT_SRGGB8_1X8, 50 + V4L2_MBUS_FMT_SBGGR8_1X8, 51 + V4L2_MBUS_FMT_SGBRG8_1X8, 46 52 V4L2_MBUS_FMT_SGRBG10_1X10, 47 53 V4L2_MBUS_FMT_SRGGB10_1X10, 48 54 V4L2_MBUS_FMT_SBGGR10_1X10, ··· 1116 1110 struct isp_parallel_platform_data *pdata = NULL; 1117 1111 struct v4l2_subdev *sensor; 1118 1112 struct v4l2_mbus_framefmt *format; 1113 + const struct isp_format_info *fmt_info; 1114 + struct v4l2_subdev_format fmt_src; 1115 + unsigned int depth_out; 1116 + unsigned int depth_in = 0; 1119 1117 struct media_pad *pad; 1120 1118 unsigned long flags; 1119 + unsigned int shift; 1121 1120 u32 syn_mode; 1122 1121 u32 ccdc_pattern; 1123 1122 1124 - if (ccdc->input == CCDC_INPUT_PARALLEL) { 1125 - pad = media_entity_remote_source(&ccdc->pads[CCDC_PAD_SINK]); 1126 - sensor = media_entity_to_v4l2_subdev(pad->entity); 1123 + pad = media_entity_remote_source(&ccdc->pads[CCDC_PAD_SINK]); 1124 + sensor = media_entity_to_v4l2_subdev(pad->entity); 1125 + if (ccdc->input == CCDC_INPUT_PARALLEL) 1127 1126 pdata = &((struct isp_v4l2_subdevs_group *)sensor->host_priv) 1128 1127 ->bus.parallel; 1128 + 1129 + /* Compute shift value for lane shifter to configure the bridge. */ 1130 + fmt_src.pad = pad->index; 1131 + fmt_src.which = V4L2_SUBDEV_FORMAT_ACTIVE; 1132 + if (!v4l2_subdev_call(sensor, pad, get_fmt, NULL, &fmt_src)) { 1133 + fmt_info = omap3isp_video_format_info(fmt_src.format.code); 1134 + depth_in = fmt_info->bpp; 1129 1135 } 1130 1136 1131 - omap3isp_configure_bridge(isp, ccdc->input, pdata); 1137 + fmt_info = omap3isp_video_format_info 1138 + (isp->isp_ccdc.formats[CCDC_PAD_SINK].code); 1139 + depth_out = fmt_info->bpp; 1132 1140 1133 - ccdc->syncif.datsz = pdata ? pdata->width : 10; 1141 + shift = depth_in - depth_out; 1142 + omap3isp_configure_bridge(isp, ccdc->input, pdata, shift); 1143 + 1144 + ccdc->syncif.datsz = depth_out; 1134 1145 ccdc_config_sync_if(ccdc, &ccdc->syncif); 1135 1146 1136 1147 /* CCDC_PAD_SINK */ ··· 1361 1338 * @ccdc: Pointer to ISP CCDC device. 1362 1339 * @event: Pointing which event trigger handler 1363 1340 * 1364 - * Return 1 when the event and stopping request combination is satisfyied, 1341 + * Return 1 when the event and stopping request combination is satisfied, 1365 1342 * zero otherwise. 1366 1343 */ 1367 1344 static int __ccdc_handle_stopping(struct isp_ccdc_device *ccdc, u32 event) ··· 1641 1618 1642 1619 ccdc_set_outaddr(ccdc, buffer->isp_addr); 1643 1620 1644 - /* We now have a buffer queued on the output, restart the pipeline in 1621 + /* We now have a buffer queued on the output, restart the pipeline 1645 1622 * on the next CCDC interrupt if running in continuous mode (or when 1646 1623 * starting the stream). 1647 1624 */
+1 -1
drivers/media/video/omap3isp/isppreview.c
··· 755 755 * @configs - pointer to update config structure. 756 756 * @config - return pointer to appropriate structure field. 757 757 * @bit - for which feature to return pointers. 758 - * Return size of coresponding prev_params member 758 + * Return size of corresponding prev_params member 759 759 */ 760 760 static u32 761 761 __preview_get_ptrs(struct prev_params *params, void **param,
+3 -3
drivers/media/video/omap3isp/ispqueue.c
··· 339 339 up_read(&current->mm->mmap_sem); 340 340 341 341 if (ret != buf->npages) { 342 - buf->npages = ret; 342 + buf->npages = ret < 0 ? 0 : ret; 343 343 isp_video_buffer_cleanup(buf); 344 344 return -EFAULT; 345 345 } ··· 408 408 * isp_video_buffer_prepare_vm_flags - Get VMA flags for a userspace address 409 409 * 410 410 * This function locates the VMAs for the buffer's userspace address and checks 411 - * that their flags match. The onlflag that we need to care for at the moment is 412 - * VM_PFNMAP. 411 + * that their flags match. The only flag that we need to care for at the moment 412 + * is VM_PFNMAP. 413 413 * 414 414 * The buffer vm_flags field is set to the first VMA flags. 415 415 *
+60 -15
drivers/media/video/omap3isp/ispresizer.c
··· 714 714 * iw and ih are the input width and height after cropping. Those equations need 715 715 * to be satisfied exactly for the resizer to work correctly. 716 716 * 717 - * Reverting the equations, we can compute the resizing ratios with 717 + * The equations can't be easily reverted, as the >> 8 operation is not linear. 718 + * In addition, not all input sizes can be achieved for a given output size. To 719 + * get the highest input size lower than or equal to the requested input size, 720 + * we need to compute the highest resizing ratio that satisfies the following 721 + * inequality (taking the 4-tap mode width equation as an example) 722 + * 723 + * iw >= (32 * sph + (ow - 1) * hrsz + 16) >> 8 - 7 724 + * 725 + * (where iw is the requested input width) which can be rewritten as 726 + * 727 + * iw - 7 >= (32 * sph + (ow - 1) * hrsz + 16) >> 8 728 + * (iw - 7) << 8 >= 32 * sph + (ow - 1) * hrsz + 16 - b 729 + * ((iw - 7) << 8) + b >= 32 * sph + (ow - 1) * hrsz + 16 730 + * 731 + * where b is the value of the 8 least significant bits of the right hand side 732 + * expression of the last inequality. The highest resizing ratio value will be 733 + * achieved when b is equal to its maximum value of 255. That resizing ratio 734 + * value will still satisfy the original inequality, as b will disappear when 735 + * the expression will be shifted right by 8. 736 + * 737 + * The reverted the equations thus become 718 738 * 719 739 * - 8-phase, 4-tap mode 720 - * hrsz = ((iw - 7) * 256 - 16 - 32 * sph) / (ow - 1) 721 - * vrsz = ((ih - 4) * 256 - 16 - 32 * spv) / (oh - 1) 740 + * hrsz = ((iw - 7) * 256 + 255 - 16 - 32 * sph) / (ow - 1) 741 + * vrsz = ((ih - 4) * 256 + 255 - 16 - 32 * spv) / (oh - 1) 722 742 * - 4-phase, 7-tap mode 723 - * hrsz = ((iw - 7) * 256 - 32 - 64 * sph) / (ow - 1) 724 - * vrsz = ((ih - 7) * 256 - 32 - 64 * spv) / (oh - 1) 743 + * hrsz = ((iw - 7) * 256 + 255 - 32 - 64 * sph) / (ow - 1) 744 + * vrsz = ((ih - 7) * 256 + 255 - 32 - 64 * spv) / (oh - 1) 725 745 * 726 - * The ratios are integer values, and must be rounded down to ensure that the 727 - * cropped input size is not bigger than the uncropped input size. As the ratio 728 - * in 7-tap mode is always smaller than the ratio in 4-tap mode, we can use the 729 - * 7-tap mode equations to compute a ratio approximation. 746 + * The ratios are integer values, and are rounded down to ensure that the 747 + * cropped input size is not bigger than the uncropped input size. 748 + * 749 + * As the number of phases/taps, used to select the correct equations to compute 750 + * the ratio, depends on the ratio, we start with the 4-tap mode equations to 751 + * compute an approximation of the ratio, and switch to the 7-tap mode equations 752 + * if the approximation is higher than the ratio threshold. 753 + * 754 + * As the 7-tap mode equations will return a ratio smaller than or equal to the 755 + * 4-tap mode equations, the resulting ratio could become lower than or equal to 756 + * the ratio threshold. This 'equations loop' isn't an issue as long as the 757 + * correct equations are used to compute the final input size. Starting with the 758 + * 4-tap mode equations ensure that, in case of values resulting in a 'ratio 759 + * loop', the smallest of the ratio values will be used, never exceeding the 760 + * requested input size. 730 761 * 731 762 * We first clamp the output size according to the hardware capabilitie to avoid 732 763 * auto-cropping the input more than required to satisfy the TRM equations. The ··· 806 775 unsigned int max_width; 807 776 unsigned int max_height; 808 777 unsigned int width_alignment; 778 + unsigned int width; 779 + unsigned int height; 809 780 810 781 /* 811 782 * Clamp the output height based on the hardware capabilities and ··· 819 786 max_height = min_t(unsigned int, max_height, MAX_OUT_HEIGHT); 820 787 output->height = clamp(output->height, min_height, max_height); 821 788 822 - ratio->vert = ((input->height - 7) * 256 - 32 - 64 * spv) 789 + ratio->vert = ((input->height - 4) * 256 + 255 - 16 - 32 * spv) 823 790 / (output->height - 1); 791 + if (ratio->vert > MID_RESIZE_VALUE) 792 + ratio->vert = ((input->height - 7) * 256 + 255 - 32 - 64 * spv) 793 + / (output->height - 1); 824 794 ratio->vert = clamp_t(unsigned int, ratio->vert, 825 795 MIN_RESIZE_VALUE, MAX_RESIZE_VALUE); 826 796 827 797 if (ratio->vert <= MID_RESIZE_VALUE) { 828 798 upscaled_height = (output->height - 1) * ratio->vert 829 799 + 32 * spv + 16; 830 - input->height = (upscaled_height >> 8) + 4; 800 + height = (upscaled_height >> 8) + 4; 831 801 } else { 832 802 upscaled_height = (output->height - 1) * ratio->vert 833 803 + 64 * spv + 32; 834 - input->height = (upscaled_height >> 8) + 7; 804 + height = (upscaled_height >> 8) + 7; 835 805 } 836 806 837 807 /* ··· 890 854 max_width & ~(width_alignment - 1)); 891 855 output->width = ALIGN(output->width, width_alignment); 892 856 893 - ratio->horz = ((input->width - 7) * 256 - 32 - 64 * sph) 857 + ratio->horz = ((input->width - 7) * 256 + 255 - 16 - 32 * sph) 894 858 / (output->width - 1); 859 + if (ratio->horz > MID_RESIZE_VALUE) 860 + ratio->horz = ((input->width - 7) * 256 + 255 - 32 - 64 * sph) 861 + / (output->width - 1); 895 862 ratio->horz = clamp_t(unsigned int, ratio->horz, 896 863 MIN_RESIZE_VALUE, MAX_RESIZE_VALUE); 897 864 898 865 if (ratio->horz <= MID_RESIZE_VALUE) { 899 866 upscaled_width = (output->width - 1) * ratio->horz 900 867 + 32 * sph + 16; 901 - input->width = (upscaled_width >> 8) + 7; 868 + width = (upscaled_width >> 8) + 7; 902 869 } else { 903 870 upscaled_width = (output->width - 1) * ratio->horz 904 871 + 64 * sph + 32; 905 - input->width = (upscaled_width >> 8) + 7; 872 + width = (upscaled_width >> 8) + 7; 906 873 } 874 + 875 + /* Center the new crop rectangle. */ 876 + input->left += (input->width - width) / 2; 877 + input->top += (input->height - height) / 2; 878 + input->width = width; 879 + input->height = height; 907 880 } 908 881 909 882 /*
+3 -3
drivers/media/video/omap3isp/ispstat.h
··· 131 131 struct ispstat_generic_config { 132 132 /* 133 133 * Fields must be in the same order as in: 134 - * - isph3a_aewb_config 135 - * - isph3a_af_config 136 - * - isphist_config 134 + * - omap3isp_h3a_aewb_config 135 + * - omap3isp_h3a_af_config 136 + * - omap3isp_hist_config 137 137 */ 138 138 u32 buf_size; 139 139 u16 config_counter;
+94 -14
drivers/media/video/omap3isp/ispvideo.c
··· 47 47 48 48 static struct isp_format_info formats[] = { 49 49 { V4L2_MBUS_FMT_Y8_1X8, V4L2_MBUS_FMT_Y8_1X8, 50 - V4L2_MBUS_FMT_Y8_1X8, V4L2_PIX_FMT_GREY, 8, }, 50 + V4L2_MBUS_FMT_Y8_1X8, V4L2_MBUS_FMT_Y8_1X8, 51 + V4L2_PIX_FMT_GREY, 8, }, 52 + { V4L2_MBUS_FMT_Y10_1X10, V4L2_MBUS_FMT_Y10_1X10, 53 + V4L2_MBUS_FMT_Y10_1X10, V4L2_MBUS_FMT_Y8_1X8, 54 + V4L2_PIX_FMT_Y10, 10, }, 55 + { V4L2_MBUS_FMT_Y12_1X12, V4L2_MBUS_FMT_Y10_1X10, 56 + V4L2_MBUS_FMT_Y12_1X12, V4L2_MBUS_FMT_Y8_1X8, 57 + V4L2_PIX_FMT_Y12, 12, }, 58 + { V4L2_MBUS_FMT_SBGGR8_1X8, V4L2_MBUS_FMT_SBGGR8_1X8, 59 + V4L2_MBUS_FMT_SBGGR8_1X8, V4L2_MBUS_FMT_SBGGR8_1X8, 60 + V4L2_PIX_FMT_SBGGR8, 8, }, 61 + { V4L2_MBUS_FMT_SGBRG8_1X8, V4L2_MBUS_FMT_SGBRG8_1X8, 62 + V4L2_MBUS_FMT_SGBRG8_1X8, V4L2_MBUS_FMT_SGBRG8_1X8, 63 + V4L2_PIX_FMT_SGBRG8, 8, }, 64 + { V4L2_MBUS_FMT_SGRBG8_1X8, V4L2_MBUS_FMT_SGRBG8_1X8, 65 + V4L2_MBUS_FMT_SGRBG8_1X8, V4L2_MBUS_FMT_SGRBG8_1X8, 66 + V4L2_PIX_FMT_SGRBG8, 8, }, 67 + { V4L2_MBUS_FMT_SRGGB8_1X8, V4L2_MBUS_FMT_SRGGB8_1X8, 68 + V4L2_MBUS_FMT_SRGGB8_1X8, V4L2_MBUS_FMT_SRGGB8_1X8, 69 + V4L2_PIX_FMT_SRGGB8, 8, }, 51 70 { V4L2_MBUS_FMT_SGRBG10_DPCM8_1X8, V4L2_MBUS_FMT_SGRBG10_DPCM8_1X8, 52 - V4L2_MBUS_FMT_SGRBG10_1X10, V4L2_PIX_FMT_SGRBG10DPCM8, 8, }, 71 + V4L2_MBUS_FMT_SGRBG10_1X10, 0, 72 + V4L2_PIX_FMT_SGRBG10DPCM8, 8, }, 53 73 { V4L2_MBUS_FMT_SBGGR10_1X10, V4L2_MBUS_FMT_SBGGR10_1X10, 54 - V4L2_MBUS_FMT_SBGGR10_1X10, V4L2_PIX_FMT_SBGGR10, 10, }, 74 + V4L2_MBUS_FMT_SBGGR10_1X10, V4L2_MBUS_FMT_SBGGR8_1X8, 75 + V4L2_PIX_FMT_SBGGR10, 10, }, 55 76 { V4L2_MBUS_FMT_SGBRG10_1X10, V4L2_MBUS_FMT_SGBRG10_1X10, 56 - V4L2_MBUS_FMT_SGBRG10_1X10, V4L2_PIX_FMT_SGBRG10, 10, }, 77 + V4L2_MBUS_FMT_SGBRG10_1X10, V4L2_MBUS_FMT_SGBRG8_1X8, 78 + V4L2_PIX_FMT_SGBRG10, 10, }, 57 79 { V4L2_MBUS_FMT_SGRBG10_1X10, V4L2_MBUS_FMT_SGRBG10_1X10, 58 - V4L2_MBUS_FMT_SGRBG10_1X10, V4L2_PIX_FMT_SGRBG10, 10, }, 80 + V4L2_MBUS_FMT_SGRBG10_1X10, V4L2_MBUS_FMT_SGRBG8_1X8, 81 + V4L2_PIX_FMT_SGRBG10, 10, }, 59 82 { V4L2_MBUS_FMT_SRGGB10_1X10, V4L2_MBUS_FMT_SRGGB10_1X10, 60 - V4L2_MBUS_FMT_SRGGB10_1X10, V4L2_PIX_FMT_SRGGB10, 10, }, 83 + V4L2_MBUS_FMT_SRGGB10_1X10, V4L2_MBUS_FMT_SRGGB8_1X8, 84 + V4L2_PIX_FMT_SRGGB10, 10, }, 61 85 { V4L2_MBUS_FMT_SBGGR12_1X12, V4L2_MBUS_FMT_SBGGR10_1X10, 62 - V4L2_MBUS_FMT_SBGGR12_1X12, V4L2_PIX_FMT_SBGGR12, 12, }, 86 + V4L2_MBUS_FMT_SBGGR12_1X12, V4L2_MBUS_FMT_SBGGR8_1X8, 87 + V4L2_PIX_FMT_SBGGR12, 12, }, 63 88 { V4L2_MBUS_FMT_SGBRG12_1X12, V4L2_MBUS_FMT_SGBRG10_1X10, 64 - V4L2_MBUS_FMT_SGBRG12_1X12, V4L2_PIX_FMT_SGBRG12, 12, }, 89 + V4L2_MBUS_FMT_SGBRG12_1X12, V4L2_MBUS_FMT_SGBRG8_1X8, 90 + V4L2_PIX_FMT_SGBRG12, 12, }, 65 91 { V4L2_MBUS_FMT_SGRBG12_1X12, V4L2_MBUS_FMT_SGRBG10_1X10, 66 - V4L2_MBUS_FMT_SGRBG12_1X12, V4L2_PIX_FMT_SGRBG12, 12, }, 92 + V4L2_MBUS_FMT_SGRBG12_1X12, V4L2_MBUS_FMT_SGRBG8_1X8, 93 + V4L2_PIX_FMT_SGRBG12, 12, }, 67 94 { V4L2_MBUS_FMT_SRGGB12_1X12, V4L2_MBUS_FMT_SRGGB10_1X10, 68 - V4L2_MBUS_FMT_SRGGB12_1X12, V4L2_PIX_FMT_SRGGB12, 12, }, 95 + V4L2_MBUS_FMT_SRGGB12_1X12, V4L2_MBUS_FMT_SRGGB8_1X8, 96 + V4L2_PIX_FMT_SRGGB12, 12, }, 69 97 { V4L2_MBUS_FMT_UYVY8_1X16, V4L2_MBUS_FMT_UYVY8_1X16, 70 - V4L2_MBUS_FMT_UYVY8_1X16, V4L2_PIX_FMT_UYVY, 16, }, 98 + V4L2_MBUS_FMT_UYVY8_1X16, 0, 99 + V4L2_PIX_FMT_UYVY, 16, }, 71 100 { V4L2_MBUS_FMT_YUYV8_1X16, V4L2_MBUS_FMT_YUYV8_1X16, 72 - V4L2_MBUS_FMT_YUYV8_1X16, V4L2_PIX_FMT_YUYV, 16, }, 101 + V4L2_MBUS_FMT_YUYV8_1X16, 0, 102 + V4L2_PIX_FMT_YUYV, 16, }, 73 103 }; 74 104 75 105 const struct isp_format_info * ··· 113 83 } 114 84 115 85 return NULL; 86 + } 87 + 88 + /* 89 + * Decide whether desired output pixel code can be obtained with 90 + * the lane shifter by shifting the input pixel code. 91 + * @in: input pixelcode to shifter 92 + * @out: output pixelcode from shifter 93 + * @additional_shift: # of bits the sensor's LSB is offset from CAMEXT[0] 94 + * 95 + * return true if the combination is possible 96 + * return false otherwise 97 + */ 98 + static bool isp_video_is_shiftable(enum v4l2_mbus_pixelcode in, 99 + enum v4l2_mbus_pixelcode out, 100 + unsigned int additional_shift) 101 + { 102 + const struct isp_format_info *in_info, *out_info; 103 + 104 + if (in == out) 105 + return true; 106 + 107 + in_info = omap3isp_video_format_info(in); 108 + out_info = omap3isp_video_format_info(out); 109 + 110 + if ((in_info->flavor == 0) || (out_info->flavor == 0)) 111 + return false; 112 + 113 + if (in_info->flavor != out_info->flavor) 114 + return false; 115 + 116 + return in_info->bpp - out_info->bpp + additional_shift <= 6; 116 117 } 117 118 118 119 /* ··· 296 235 return -EPIPE; 297 236 298 237 while (1) { 238 + unsigned int shifter_link; 299 239 /* Retrieve the sink format */ 300 240 pad = &subdev->entity.pads[0]; 301 241 if (!(pad->flags & MEDIA_PAD_FL_SINK)) ··· 325 263 return -ENOSPC; 326 264 } 327 265 266 + /* If sink pad is on CCDC, the link has the lane shifter 267 + * in the middle of it. */ 268 + shifter_link = subdev == &isp->isp_ccdc.subdev; 269 + 328 270 /* Retrieve the source format */ 329 271 pad = media_entity_remote_source(pad); 330 272 if (pad == NULL || ··· 344 278 return -EPIPE; 345 279 346 280 /* Check if the two ends match */ 347 - if (fmt_source.format.code != fmt_sink.format.code || 348 - fmt_source.format.width != fmt_sink.format.width || 281 + if (fmt_source.format.width != fmt_sink.format.width || 349 282 fmt_source.format.height != fmt_sink.format.height) 283 + return -EPIPE; 284 + 285 + if (shifter_link) { 286 + unsigned int parallel_shift = 0; 287 + if (isp->isp_ccdc.input == CCDC_INPUT_PARALLEL) { 288 + struct isp_parallel_platform_data *pdata = 289 + &((struct isp_v4l2_subdevs_group *) 290 + subdev->host_priv)->bus.parallel; 291 + parallel_shift = pdata->data_lane_shift * 2; 292 + } 293 + if (!isp_video_is_shiftable(fmt_source.format.code, 294 + fmt_sink.format.code, 295 + parallel_shift)) 296 + return -EPIPE; 297 + } else if (fmt_source.format.code != fmt_sink.format.code) 350 298 return -EPIPE; 351 299 } 352 300
+3
drivers/media/video/omap3isp/ispvideo.h
··· 49 49 * bits. Identical to @code if the format is 10 bits wide or less. 50 50 * @uncompressed: V4L2 media bus format code for the corresponding uncompressed 51 51 * format. Identical to @code if the format is not DPCM compressed. 52 + * @flavor: V4L2 media bus format code for the same pixel layout but 53 + * shifted to be 8 bits per pixel. =0 if format is not shiftable. 52 54 * @pixelformat: V4L2 pixel format FCC identifier 53 55 * @bpp: Bits per pixel 54 56 */ ··· 58 56 enum v4l2_mbus_pixelcode code; 59 57 enum v4l2_mbus_pixelcode truncated; 60 58 enum v4l2_mbus_pixelcode uncompressed; 59 + enum v4l2_mbus_pixelcode flavor; 61 60 u32 pixelformat; 62 61 unsigned int bpp; 63 62 };
+5 -3
drivers/media/video/s5p-fimc/fimc-capture.c
··· 527 527 if (ret) 528 528 return ret; 529 529 530 - if (vb2_is_streaming(&fimc->vid_cap.vbq) || fimc_capture_active(fimc)) 530 + if (vb2_is_busy(&fimc->vid_cap.vbq) || fimc_capture_active(fimc)) 531 531 return -EBUSY; 532 532 533 533 frame = &ctx->d_frame; ··· 539 539 return -EINVAL; 540 540 } 541 541 542 - for (i = 0; i < frame->fmt->colplanes; i++) 543 - frame->payload[i] = pix->plane_fmt[i].bytesperline * pix->height; 542 + for (i = 0; i < frame->fmt->colplanes; i++) { 543 + frame->payload[i] = 544 + (pix->width * pix->height * frame->fmt->depth[i]) >> 3; 545 + } 544 546 545 547 /* Output DMA frame pixel size and offsets. */ 546 548 frame->f_width = pix->plane_fmt[0].bytesperline * 8
+47 -27
drivers/media/video/s5p-fimc/fimc-core.c
··· 361 361 { 362 362 struct fimc_vid_cap *cap = &fimc->vid_cap; 363 363 struct fimc_vid_buffer *v_buf; 364 + struct timeval *tv; 365 + struct timespec ts; 364 366 365 367 if (!list_empty(&cap->active_buf_q) && 366 368 test_bit(ST_CAPT_RUN, &fimc->state)) { 369 + ktime_get_real_ts(&ts); 370 + 367 371 v_buf = active_queue_pop(cap); 372 + 373 + tv = &v_buf->vb.v4l2_buf.timestamp; 374 + tv->tv_sec = ts.tv_sec; 375 + tv->tv_usec = ts.tv_nsec / NSEC_PER_USEC; 376 + v_buf->vb.v4l2_buf.sequence = cap->frame_count++; 377 + 368 378 vb2_buffer_done(&v_buf->vb, VB2_BUF_STATE_DONE); 369 379 } 370 380 ··· 768 758 mutex_unlock(&ctx->fimc_dev->lock); 769 759 } 770 760 771 - struct vb2_ops fimc_qops = { 761 + static struct vb2_ops fimc_qops = { 772 762 .queue_setup = fimc_queue_setup, 773 763 .buf_prepare = fimc_buf_prepare, 774 764 .buf_queue = fimc_buf_queue, ··· 937 927 pix->num_planes = fmt->memplanes; 938 928 pix->colorspace = V4L2_COLORSPACE_JPEG; 939 929 930 + 940 931 for (i = 0; i < pix->num_planes; ++i) { 941 - int bpl = pix->plane_fmt[i].bytesperline; 932 + u32 bpl = pix->plane_fmt[i].bytesperline; 933 + u32 *sizeimage = &pix->plane_fmt[i].sizeimage; 942 934 943 - dbg("[%d] bpl: %d, depth: %d, w: %d, h: %d", 944 - i, bpl, fmt->depth[i], pix->width, pix->height); 935 + if (fmt->colplanes > 1 && (bpl == 0 || bpl < pix->width)) 936 + bpl = pix->width; /* Planar */ 945 937 946 - if (!bpl || (bpl * 8 / fmt->depth[i]) > pix->width) 947 - bpl = (pix->width * fmt->depth[0]) >> 3; 938 + if (fmt->colplanes == 1 && /* Packed */ 939 + (bpl == 0 || ((bpl * 8) / fmt->depth[i]) < pix->width)) 940 + bpl = (pix->width * fmt->depth[0]) / 8; 948 941 949 - if (!pix->plane_fmt[i].sizeimage) 950 - pix->plane_fmt[i].sizeimage = pix->height * bpl; 942 + if (i == 0) /* Same bytesperline for each plane. */ 943 + mod_x = bpl; 951 944 952 - pix->plane_fmt[i].bytesperline = bpl; 953 - 954 - dbg("[%d]: bpl: %d, sizeimage: %d", 955 - i, pix->plane_fmt[i].bytesperline, 956 - pix->plane_fmt[i].sizeimage); 945 + pix->plane_fmt[i].bytesperline = mod_x; 946 + *sizeimage = (pix->width * pix->height * fmt->depth[i]) / 8; 957 947 } 958 948 959 949 return 0; ··· 975 965 976 966 vq = v4l2_m2m_get_vq(ctx->m2m_ctx, f->type); 977 967 978 - if (vb2_is_streaming(vq)) { 968 + if (vb2_is_busy(vq)) { 979 969 v4l2_err(&fimc->m2m.v4l2_dev, "queue (%d) busy\n", f->type); 980 970 return -EBUSY; 981 971 } ··· 995 985 if (!frame->fmt) 996 986 return -EINVAL; 997 987 998 - for (i = 0; i < frame->fmt->colplanes; i++) 999 - frame->payload[i] = pix->plane_fmt[i].bytesperline * pix->height; 988 + for (i = 0; i < frame->fmt->colplanes; i++) { 989 + frame->payload[i] = 990 + (pix->width * pix->height * frame->fmt->depth[i]) / 8; 991 + } 1000 992 1001 993 frame->f_width = pix->plane_fmt[0].bytesperline * 8 / 1002 994 frame->fmt->depth[0]; ··· 1762 1750 } 1763 1751 1764 1752 /* Image pixel limits, similar across several FIMC HW revisions. */ 1765 - static struct fimc_pix_limit s5p_pix_limit[3] = { 1753 + static struct fimc_pix_limit s5p_pix_limit[4] = { 1766 1754 [0] = { 1767 1755 .scaler_en_w = 3264, 1768 1756 .scaler_dis_w = 8192, ··· 1785 1773 .in_rot_en_h = 1280, 1786 1774 .in_rot_dis_w = 8192, 1787 1775 .out_rot_en_w = 1280, 1776 + .out_rot_dis_w = 1920, 1777 + }, 1778 + [3] = { 1779 + .scaler_en_w = 1920, 1780 + .scaler_dis_w = 8192, 1781 + .in_rot_en_h = 1366, 1782 + .in_rot_dis_w = 8192, 1783 + .out_rot_en_w = 1366, 1788 1784 .out_rot_dis_w = 1920, 1789 1785 }, 1790 1786 }; ··· 1847 1827 .pix_limit = &s5p_pix_limit[2], 1848 1828 }; 1849 1829 1850 - static struct samsung_fimc_variant fimc0_variant_s5pv310 = { 1830 + static struct samsung_fimc_variant fimc0_variant_exynos4 = { 1851 1831 .pix_hoff = 1, 1852 1832 .has_inp_rot = 1, 1853 1833 .has_out_rot = 1, ··· 1860 1840 .pix_limit = &s5p_pix_limit[1], 1861 1841 }; 1862 1842 1863 - static struct samsung_fimc_variant fimc2_variant_s5pv310 = { 1843 + static struct samsung_fimc_variant fimc2_variant_exynos4 = { 1864 1844 .pix_hoff = 1, 1865 1845 .has_cistatus2 = 1, 1866 1846 .has_mainscaler_ext = 1, ··· 1868 1848 .min_out_pixsize = 16, 1869 1849 .hor_offs_align = 1, 1870 1850 .out_buf_count = 32, 1871 - .pix_limit = &s5p_pix_limit[2], 1851 + .pix_limit = &s5p_pix_limit[3], 1872 1852 }; 1873 1853 1874 1854 /* S5PC100 */ ··· 1894 1874 }; 1895 1875 1896 1876 /* S5PV310, S5PC210 */ 1897 - static struct samsung_fimc_driverdata fimc_drvdata_s5pv310 = { 1877 + static struct samsung_fimc_driverdata fimc_drvdata_exynos4 = { 1898 1878 .variant = { 1899 - [0] = &fimc0_variant_s5pv310, 1900 - [1] = &fimc0_variant_s5pv310, 1901 - [2] = &fimc0_variant_s5pv310, 1902 - [3] = &fimc2_variant_s5pv310, 1879 + [0] = &fimc0_variant_exynos4, 1880 + [1] = &fimc0_variant_exynos4, 1881 + [2] = &fimc0_variant_exynos4, 1882 + [3] = &fimc2_variant_exynos4, 1903 1883 }, 1904 1884 .num_entities = 4, 1905 1885 .lclk_frequency = 166000000UL, ··· 1913 1893 .name = "s5pv210-fimc", 1914 1894 .driver_data = (unsigned long)&fimc_drvdata_s5pv210, 1915 1895 }, { 1916 - .name = "s5pv310-fimc", 1917 - .driver_data = (unsigned long)&fimc_drvdata_s5pv310, 1896 + .name = "exynos4-fimc", 1897 + .driver_data = (unsigned long)&fimc_drvdata_exynos4, 1918 1898 }, 1919 1899 {}, 1920 1900 };
+5 -5
drivers/media/video/sh_mobile_ceu_camera.c
··· 922 922 /* Try 2560x1920, 1280x960, 640x480, 320x240 */ 923 923 mf.width = 2560 >> shift; 924 924 mf.height = 1920 >> shift; 925 - ret = v4l2_device_call_until_err(sd->v4l2_dev, 0, video, 925 + ret = v4l2_device_call_until_err(sd->v4l2_dev, (long)icd, video, 926 926 s_mbus_fmt, &mf); 927 927 if (ret < 0) 928 928 return ret; ··· 1224 1224 struct v4l2_cropcap cap; 1225 1225 int ret; 1226 1226 1227 - ret = v4l2_device_call_until_err(sd->v4l2_dev, 0, video, 1227 + ret = v4l2_device_call_until_err(sd->v4l2_dev, (long)icd, video, 1228 1228 s_mbus_fmt, mf); 1229 1229 if (ret < 0) 1230 1230 return ret; ··· 1254 1254 tmp_h = min(2 * tmp_h, max_height); 1255 1255 mf->width = tmp_w; 1256 1256 mf->height = tmp_h; 1257 - ret = v4l2_device_call_until_err(sd->v4l2_dev, 0, video, 1257 + ret = v4l2_device_call_until_err(sd->v4l2_dev, (long)icd, video, 1258 1258 s_mbus_fmt, mf); 1259 1259 dev_geo(dev, "Camera scaled to %ux%u\n", 1260 1260 mf->width, mf->height); ··· 1658 1658 mf.code = xlate->code; 1659 1659 mf.colorspace = pix->colorspace; 1660 1660 1661 - ret = v4l2_device_call_until_err(sd->v4l2_dev, 0, video, try_mbus_fmt, &mf); 1661 + ret = v4l2_device_call_until_err(sd->v4l2_dev, (long)icd, video, try_mbus_fmt, &mf); 1662 1662 if (ret < 0) 1663 1663 return ret; 1664 1664 ··· 1682 1682 */ 1683 1683 mf.width = 2560; 1684 1684 mf.height = 1920; 1685 - ret = v4l2_device_call_until_err(sd->v4l2_dev, 0, video, 1685 + ret = v4l2_device_call_until_err(sd->v4l2_dev, (long)icd, video, 1686 1686 try_mbus_fmt, &mf); 1687 1687 if (ret < 0) { 1688 1688 /* Shouldn't actually happen... */
+9 -2
drivers/media/video/sh_mobile_csi2.c
··· 38 38 void __iomem *base; 39 39 struct platform_device *pdev; 40 40 struct sh_csi2_client_config *client; 41 + unsigned long (*query_bus_param)(struct soc_camera_device *); 42 + int (*set_bus_param)(struct soc_camera_device *, unsigned long); 41 43 }; 42 44 43 45 static int sh_csi2_try_fmt(struct v4l2_subdev *sd, ··· 210 208 case BUS_NOTIFY_BOUND_DRIVER: 211 209 snprintf(priv->subdev.name, V4L2_SUBDEV_NAME_SIZE, "%s%s", 212 210 dev_name(v4l2_dev->dev), ".mipi-csi"); 211 + priv->subdev.grp_id = (long)icd; 213 212 ret = v4l2_device_register_subdev(v4l2_dev, &priv->subdev); 214 213 dev_dbg(dev, "%s(%p): ret(register_subdev) = %d\n", __func__, priv, ret); 215 214 if (ret < 0) ··· 218 215 219 216 priv->client = pdata->clients + i; 220 217 218 + priv->set_bus_param = icd->ops->set_bus_param; 219 + priv->query_bus_param = icd->ops->query_bus_param; 221 220 icd->ops->set_bus_param = sh_csi2_set_bus_param; 222 221 icd->ops->query_bus_param = sh_csi2_query_bus_param; 223 222 ··· 231 226 priv->client = NULL; 232 227 233 228 /* Driver is about to be unbound */ 234 - icd->ops->set_bus_param = NULL; 235 - icd->ops->query_bus_param = NULL; 229 + icd->ops->set_bus_param = priv->set_bus_param; 230 + icd->ops->query_bus_param = priv->query_bus_param; 231 + priv->set_bus_param = NULL; 232 + priv->query_bus_param = NULL; 236 233 237 234 v4l2_device_unregister_subdev(&priv->subdev); 238 235
+5 -2
drivers/media/video/soc_camera.c
··· 996 996 { 997 997 struct i2c_client *client = 998 998 to_i2c_client(to_soc_camera_control(icd)); 999 + struct i2c_adapter *adap = client->adapter; 999 1000 dev_set_drvdata(&icd->dev, NULL); 1000 1001 v4l2_device_unregister_subdev(i2c_get_clientdata(client)); 1001 1002 i2c_unregister_device(client); 1002 - i2c_put_adapter(client->adapter); 1003 + i2c_put_adapter(adap); 1003 1004 } 1004 1005 #else 1005 1006 #define soc_camera_init_i2c(icd, icl) (-ENODEV) ··· 1072 1071 } 1073 1072 } 1074 1073 1074 + sd = soc_camera_to_subdev(icd); 1075 + sd->grp_id = (long)icd; 1076 + 1075 1077 /* At this point client .probe() should have run already */ 1076 1078 ret = soc_camera_init_user_formats(icd); 1077 1079 if (ret < 0) ··· 1096 1092 goto evidstart; 1097 1093 1098 1094 /* Try to improve our guess of a reasonable window format */ 1099 - sd = soc_camera_to_subdev(icd); 1100 1095 if (!v4l2_subdev_call(sd, video, g_mbus_fmt, &mf)) { 1101 1096 icd->user_width = mf.width; 1102 1097 icd->user_height = mf.height;
+1 -1
drivers/media/video/tda9840.c
··· 171 171 v4l_info(client, "chip found @ 0x%x (%s)\n", 172 172 client->addr << 1, client->adapter->name); 173 173 174 - sd = kmalloc(sizeof(struct v4l2_subdev), GFP_KERNEL); 174 + sd = kzalloc(sizeof(struct v4l2_subdev), GFP_KERNEL); 175 175 if (sd == NULL) 176 176 return -ENOMEM; 177 177 v4l2_i2c_subdev_init(sd, client, &tda9840_ops);
+1 -1
drivers/media/video/tea6415c.c
··· 152 152 153 153 v4l_info(client, "chip found @ 0x%x (%s)\n", 154 154 client->addr << 1, client->adapter->name); 155 - sd = kmalloc(sizeof(struct v4l2_subdev), GFP_KERNEL); 155 + sd = kzalloc(sizeof(struct v4l2_subdev), GFP_KERNEL); 156 156 if (sd == NULL) 157 157 return -ENOMEM; 158 158 v4l2_i2c_subdev_init(sd, client, &tea6415c_ops);
+1 -1
drivers/media/video/tea6420.c
··· 125 125 v4l_info(client, "chip found @ 0x%x (%s)\n", 126 126 client->addr << 1, client->adapter->name); 127 127 128 - sd = kmalloc(sizeof(struct v4l2_subdev), GFP_KERNEL); 128 + sd = kzalloc(sizeof(struct v4l2_subdev), GFP_KERNEL); 129 129 if (sd == NULL) 130 130 return -ENOMEM; 131 131 v4l2_i2c_subdev_init(sd, client, &tea6420_ops);
+1 -1
drivers/media/video/upd64031a.c
··· 230 230 v4l_info(client, "chip found @ 0x%x (%s)\n", 231 231 client->addr << 1, client->adapter->name); 232 232 233 - state = kmalloc(sizeof(struct upd64031a_state), GFP_KERNEL); 233 + state = kzalloc(sizeof(struct upd64031a_state), GFP_KERNEL); 234 234 if (state == NULL) 235 235 return -ENOMEM; 236 236 sd = &state->sd;
+1 -1
drivers/media/video/upd64083.c
··· 202 202 v4l_info(client, "chip found @ 0x%x (%s)\n", 203 203 client->addr << 1, client->adapter->name); 204 204 205 - state = kmalloc(sizeof(struct upd64083_state), GFP_KERNEL); 205 + state = kzalloc(sizeof(struct upd64083_state), GFP_KERNEL); 206 206 if (state == NULL) 207 207 return -ENOMEM; 208 208 sd = &state->sd;
+10 -5
drivers/media/video/v4l2-dev.c
··· 389 389 video_get(vdev); 390 390 mutex_unlock(&videodev_lock); 391 391 #if defined(CONFIG_MEDIA_CONTROLLER) 392 - if (vdev->v4l2_dev && vdev->v4l2_dev->mdev) { 392 + if (vdev->v4l2_dev && vdev->v4l2_dev->mdev && 393 + vdev->vfl_type != VFL_TYPE_SUBDEV) { 393 394 entity = media_entity_get(&vdev->entity); 394 395 if (!entity) { 395 396 ret = -EBUSY; ··· 416 415 /* decrease the refcount in case of an error */ 417 416 if (ret) { 418 417 #if defined(CONFIG_MEDIA_CONTROLLER) 419 - if (vdev->v4l2_dev && vdev->v4l2_dev->mdev) 418 + if (vdev->v4l2_dev && vdev->v4l2_dev->mdev && 419 + vdev->vfl_type != VFL_TYPE_SUBDEV) 420 420 media_entity_put(entity); 421 421 #endif 422 422 video_put(vdev); ··· 439 437 mutex_unlock(vdev->lock); 440 438 } 441 439 #if defined(CONFIG_MEDIA_CONTROLLER) 442 - if (vdev->v4l2_dev && vdev->v4l2_dev->mdev) 440 + if (vdev->v4l2_dev && vdev->v4l2_dev->mdev && 441 + vdev->vfl_type != VFL_TYPE_SUBDEV) 443 442 media_entity_put(&vdev->entity); 444 443 #endif 445 444 /* decrease the refcount unconditionally since the release() ··· 689 686 690 687 #if defined(CONFIG_MEDIA_CONTROLLER) 691 688 /* Part 5: Register the entity. */ 692 - if (vdev->v4l2_dev && vdev->v4l2_dev->mdev) { 689 + if (vdev->v4l2_dev && vdev->v4l2_dev->mdev && 690 + vdev->vfl_type != VFL_TYPE_SUBDEV) { 693 691 vdev->entity.type = MEDIA_ENT_T_DEVNODE_V4L; 694 692 vdev->entity.name = vdev->name; 695 693 vdev->entity.v4l.major = VIDEO_MAJOR; ··· 737 733 return; 738 734 739 735 #if defined(CONFIG_MEDIA_CONTROLLER) 740 - if (vdev->v4l2_dev && vdev->v4l2_dev->mdev) 736 + if (vdev->v4l2_dev && vdev->v4l2_dev->mdev && 737 + vdev->vfl_type != VFL_TYPE_SUBDEV) 741 738 media_device_unregister_entity(&vdev->entity); 742 739 #endif 743 740
+12 -5
drivers/media/video/videobuf2-core.c
··· 37 37 #define call_qop(q, op, args...) \ 38 38 (((q)->ops->op) ? ((q)->ops->op(args)) : 0) 39 39 40 + #define V4L2_BUFFER_STATE_FLAGS (V4L2_BUF_FLAG_MAPPED | V4L2_BUF_FLAG_QUEUED | \ 41 + V4L2_BUF_FLAG_DONE | V4L2_BUF_FLAG_ERROR) 42 + 40 43 /** 41 44 * __vb2_buf_mem_alloc() - allocate video memory for the given buffer 42 45 */ ··· 54 51 for (plane = 0; plane < vb->num_planes; ++plane) { 55 52 mem_priv = call_memop(q, plane, alloc, q->alloc_ctx[plane], 56 53 plane_sizes[plane]); 57 - if (!mem_priv) 54 + if (IS_ERR_OR_NULL(mem_priv)) 58 55 goto free; 59 56 60 57 /* Associate allocator private data with this plane */ ··· 287 284 struct vb2_queue *q = vb->vb2_queue; 288 285 int ret = 0; 289 286 290 - /* Copy back data such as timestamp, input, etc. */ 287 + /* Copy back data such as timestamp, flags, input, etc. */ 291 288 memcpy(b, &vb->v4l2_buf, offsetof(struct v4l2_buffer, m)); 292 289 b->input = vb->v4l2_buf.input; 293 290 b->reserved = vb->v4l2_buf.reserved; ··· 316 313 b->m.userptr = vb->v4l2_planes[0].m.userptr; 317 314 } 318 315 319 - b->flags = 0; 316 + /* 317 + * Clear any buffer state related flags. 318 + */ 319 + b->flags &= ~V4L2_BUFFER_STATE_FLAGS; 320 320 321 321 switch (vb->state) { 322 322 case VB2_BUF_STATE_QUEUED: ··· 525 519 num_buffers = min_t(unsigned int, req->count, VIDEO_MAX_FRAME); 526 520 memset(plane_sizes, 0, sizeof(plane_sizes)); 527 521 memset(q->alloc_ctx, 0, sizeof(q->alloc_ctx)); 522 + q->memory = req->memory; 528 523 529 524 /* 530 525 * Ask the driver how many buffers and planes per buffer it requires. ··· 566 559 */ 567 560 ret = num_buffers; 568 561 } 569 - 570 - q->memory = req->memory; 571 562 572 563 /* 573 564 * Return the number of successfully allocated buffers ··· 720 715 721 716 vb->v4l2_buf.field = b->field; 722 717 vb->v4l2_buf.timestamp = b->timestamp; 718 + vb->v4l2_buf.input = b->input; 719 + vb->v4l2_buf.flags = b->flags & ~V4L2_BUFFER_STATE_FLAGS; 723 720 724 721 return 0; 725 722 }
+1 -1
drivers/media/video/videobuf2-dma-contig.c
··· 46 46 GFP_KERNEL); 47 47 if (!buf->vaddr) { 48 48 dev_err(conf->dev, "dma_alloc_coherent of size %ld failed\n", 49 - buf->size); 49 + size); 50 50 kfree(buf); 51 51 return ERR_PTR(-ENOMEM); 52 52 }
+3 -6
drivers/mfd/omap-usb-host.c
··· 25 25 #include <linux/dma-mapping.h> 26 26 #include <linux/spinlock.h> 27 27 #include <linux/gpio.h> 28 - #include <linux/regulator/consumer.h> 29 28 #include <plat/usb.h> 30 29 31 30 #define USBHS_DRIVER_NAME "usbhs-omap" ··· 699 700 dev_dbg(dev, "starting TI HSUSB Controller\n"); 700 701 if (!pdata) { 701 702 dev_dbg(dev, "missing platform_data\n"); 702 - ret = -ENODEV; 703 - goto end_enable; 703 + return -ENODEV; 704 704 } 705 705 706 706 spin_lock_irqsave(&omap->lock, flags); ··· 913 915 914 916 end_count: 915 917 omap->count++; 916 - goto end_enable; 918 + spin_unlock_irqrestore(&omap->lock, flags); 919 + return 0; 917 920 918 921 err_tll: 919 922 if (pdata->ehci_data->phy_reset) { ··· 930 931 clk_disable(omap->usbhost_fs_fck); 931 932 clk_disable(omap->usbhost_hs_fck); 932 933 clk_disable(omap->usbhost_ick); 933 - 934 - end_enable: 935 934 spin_unlock_irqrestore(&omap->lock, flags); 936 935 return ret; 937 936 }
+1
drivers/mmc/core/bus.c
··· 284 284 type = "SD-combo"; 285 285 if (mmc_card_blockaddr(card)) 286 286 type = "SDHC-combo"; 287 + break; 287 288 default: 288 289 type = "?"; 289 290 break;
+4 -5
drivers/mmc/core/host.c
··· 94 94 spin_unlock_irqrestore(&host->clk_lock, flags); 95 95 return; 96 96 } 97 - mutex_lock(&host->clk_gate_mutex); 97 + mmc_claim_host(host); 98 98 spin_lock_irqsave(&host->clk_lock, flags); 99 99 if (!host->clk_requests) { 100 100 spin_unlock_irqrestore(&host->clk_lock, flags); ··· 104 104 pr_debug("%s: gated MCI clock\n", mmc_hostname(host)); 105 105 } 106 106 spin_unlock_irqrestore(&host->clk_lock, flags); 107 - mutex_unlock(&host->clk_gate_mutex); 107 + mmc_release_host(host); 108 108 } 109 109 110 110 /* ··· 130 130 { 131 131 unsigned long flags; 132 132 133 - mutex_lock(&host->clk_gate_mutex); 133 + mmc_claim_host(host); 134 134 spin_lock_irqsave(&host->clk_lock, flags); 135 135 if (host->clk_gated) { 136 136 spin_unlock_irqrestore(&host->clk_lock, flags); ··· 140 140 } 141 141 host->clk_requests++; 142 142 spin_unlock_irqrestore(&host->clk_lock, flags); 143 - mutex_unlock(&host->clk_gate_mutex); 143 + mmc_release_host(host); 144 144 } 145 145 146 146 /** ··· 215 215 host->clk_gated = false; 216 216 INIT_WORK(&host->clk_gate_work, mmc_host_clk_gate_work); 217 217 spin_lock_init(&host->clk_lock); 218 - mutex_init(&host->clk_gate_mutex); 219 218 } 220 219 221 220 /**
+1 -1
drivers/mmc/host/omap.c
··· 832 832 return IRQ_HANDLED; 833 833 } 834 834 835 - if (end_command) 835 + if (end_command && host->cmd) 836 836 mmc_omap_cmd_done(host, host->cmd); 837 837 if (host->data != NULL) { 838 838 if (transfer_error)
+1
drivers/mmc/host/sdhci-pci.c
··· 957 957 host->ioaddr = pci_ioremap_bar(pdev, bar); 958 958 if (!host->ioaddr) { 959 959 dev_err(&pdev->dev, "failed to remap registers\n"); 960 + ret = -ENOMEM; 960 961 goto release; 961 962 } 962 963
+8 -1
drivers/mmc/host/sdhci.c
··· 1334 1334 1335 1335 host = (struct sdhci_host*)param; 1336 1336 1337 + /* 1338 + * If this tasklet gets rescheduled while running, it will 1339 + * be run again afterwards but without any active request. 1340 + */ 1341 + if (!host->mrq) 1342 + return; 1343 + 1337 1344 spin_lock_irqsave(&host->lock, flags); 1338 1345 1339 1346 del_timer(&host->timer); ··· 1352 1345 * upon error conditions. 1353 1346 */ 1354 1347 if (!(host->flags & SDHCI_DEVICE_DEAD) && 1355 - (mrq->cmd->error || 1348 + ((mrq->cmd && mrq->cmd->error) || 1356 1349 (mrq->data && (mrq->data->error || 1357 1350 (mrq->data->stop && mrq->data->stop->error))) || 1358 1351 (host->quirks & SDHCI_QUIRK_RESET_AFTER_REQUEST))) {
+5 -5
drivers/mmc/host/tmio_mmc_pio.c
··· 728 728 tmio_mmc_set_clock(host, ios->clock); 729 729 730 730 /* Power sequence - OFF -> UP -> ON */ 731 - if (ios->power_mode == MMC_POWER_OFF || !ios->clock) { 731 + if (ios->power_mode == MMC_POWER_UP) { 732 + /* power up SD bus */ 733 + if (host->set_pwr) 734 + host->set_pwr(host->pdev, 1); 735 + } else if (ios->power_mode == MMC_POWER_OFF || !ios->clock) { 732 736 /* power down SD bus */ 733 737 if (ios->power_mode == MMC_POWER_OFF && host->set_pwr) 734 738 host->set_pwr(host->pdev, 0); 735 739 tmio_mmc_clk_stop(host); 736 - } else if (ios->power_mode == MMC_POWER_UP) { 737 - /* power up SD bus */ 738 - if (host->set_pwr) 739 - host->set_pwr(host->pdev, 1); 740 740 } else { 741 741 /* start bus clock */ 742 742 tmio_mmc_clk_start(host);
+1 -1
drivers/mtd/nand/diskonchip.c
··· 400 400 doc200x_hwcontrol(mtd, 0, NAND_CTRL_ALE | NAND_CTRL_CHANGE); 401 401 doc200x_hwcontrol(mtd, NAND_CMD_NONE, NAND_NCE | NAND_CTRL_CHANGE); 402 402 403 - /* We can't' use dev_ready here, but at least we wait for the 403 + /* We can't use dev_ready here, but at least we wait for the 404 404 * command to complete 405 405 */ 406 406 udelay(50);
+1 -1
drivers/net/amd8111e.c
··· 106 106 MODULE_LICENSE("GPL"); 107 107 MODULE_DEVICE_TABLE(pci, amd8111e_pci_tbl); 108 108 module_param_array(speed_duplex, int, NULL, 0); 109 - MODULE_PARM_DESC(speed_duplex, "Set device speed and duplex modes, 0: Auto Negotitate, 1: 10Mbps Half Duplex, 2: 10Mbps Full Duplex, 3: 100Mbps Half Duplex, 4: 100Mbps Full Duplex"); 109 + MODULE_PARM_DESC(speed_duplex, "Set device speed and duplex modes, 0: Auto Negotiate, 1: 10Mbps Half Duplex, 2: 10Mbps Full Duplex, 3: 100Mbps Half Duplex, 4: 100Mbps Full Duplex"); 110 110 module_param_array(coalesce, bool, NULL, 0); 111 111 MODULE_PARM_DESC(coalesce, "Enable or Disable interrupt coalescing, 1: Enable, 0: Disable"); 112 112 module_param_array(dynamic_ipg, bool, NULL, 0);
+3 -3
drivers/net/atl1c/atl1c.h
··· 566 566 #define __AT_TESTING 0x0001 567 567 #define __AT_RESETTING 0x0002 568 568 #define __AT_DOWN 0x0003 569 - u8 work_event; 570 - #define ATL1C_WORK_EVENT_RESET 0x01 571 - #define ATL1C_WORK_EVENT_LINK_CHANGE 0x02 569 + unsigned long work_event; 570 + #define ATL1C_WORK_EVENT_RESET 0 571 + #define ATL1C_WORK_EVENT_LINK_CHANGE 1 572 572 u32 msg_enable; 573 573 574 574 bool have_msi;
+5 -9
drivers/net/atl1c/atl1c_main.c
··· 325 325 } 326 326 } 327 327 328 - adapter->work_event |= ATL1C_WORK_EVENT_LINK_CHANGE; 328 + set_bit(ATL1C_WORK_EVENT_LINK_CHANGE, &adapter->work_event); 329 329 schedule_work(&adapter->common_task); 330 330 } 331 331 ··· 337 337 adapter = container_of(work, struct atl1c_adapter, common_task); 338 338 netdev = adapter->netdev; 339 339 340 - if (adapter->work_event & ATL1C_WORK_EVENT_RESET) { 341 - adapter->work_event &= ~ATL1C_WORK_EVENT_RESET; 340 + if (test_and_clear_bit(ATL1C_WORK_EVENT_RESET, &adapter->work_event)) { 342 341 netif_device_detach(netdev); 343 342 atl1c_down(adapter); 344 343 atl1c_up(adapter); 345 344 netif_device_attach(netdev); 346 - return; 347 345 } 348 346 349 - if (adapter->work_event & ATL1C_WORK_EVENT_LINK_CHANGE) { 350 - adapter->work_event &= ~ATL1C_WORK_EVENT_LINK_CHANGE; 347 + if (test_and_clear_bit(ATL1C_WORK_EVENT_LINK_CHANGE, 348 + &adapter->work_event)) 351 349 atl1c_check_link_status(adapter); 352 - } 353 - return; 354 350 } 355 351 356 352 ··· 365 369 struct atl1c_adapter *adapter = netdev_priv(netdev); 366 370 367 371 /* Do the reset outside of interrupt context */ 368 - adapter->work_event |= ATL1C_WORK_EVENT_RESET; 372 + set_bit(ATL1C_WORK_EVENT_RESET, &adapter->work_event); 369 373 schedule_work(&adapter->common_task); 370 374 } 371 375
+1
drivers/net/benet/be_main.c
··· 1873 1873 be_detect_dump_ue(adapter); 1874 1874 1875 1875 reschedule: 1876 + adapter->work_counter++; 1876 1877 schedule_delayed_work(&adapter->work, msecs_to_jiffies(1000)); 1877 1878 } 1878 1879
+2
drivers/net/bnx2.c
··· 8413 8413 8414 8414 unregister_netdev(dev); 8415 8415 8416 + del_timer_sync(&bp->timer); 8417 + 8416 8418 if (bp->mips_firmware) 8417 8419 release_firmware(bp->mips_firmware); 8418 8420 if (bp->rv2p_firmware)
+24 -10
drivers/net/bnx2x/bnx2x_cmn.c
··· 2019 2019 static inline u8 bnx2x_set_pbd_csum_e2(struct bnx2x *bp, struct sk_buff *skb, 2020 2020 u32 *parsing_data, u32 xmit_type) 2021 2021 { 2022 - *parsing_data |= ((tcp_hdrlen(skb)/4) << 2023 - ETH_TX_PARSE_BD_E2_TCP_HDR_LENGTH_DW_SHIFT) & 2024 - ETH_TX_PARSE_BD_E2_TCP_HDR_LENGTH_DW; 2022 + *parsing_data |= 2023 + ((((u8 *)skb_transport_header(skb) - skb->data) >> 1) << 2024 + ETH_TX_PARSE_BD_E2_TCP_HDR_START_OFFSET_W_SHIFT) & 2025 + ETH_TX_PARSE_BD_E2_TCP_HDR_START_OFFSET_W; 2025 2026 2026 - *parsing_data |= ((((u8 *)tcp_hdr(skb) - skb->data) / 2) << 2027 - ETH_TX_PARSE_BD_E2_TCP_HDR_START_OFFSET_W_SHIFT) & 2028 - ETH_TX_PARSE_BD_E2_TCP_HDR_START_OFFSET_W; 2027 + if (xmit_type & XMIT_CSUM_TCP) { 2028 + *parsing_data |= ((tcp_hdrlen(skb) / 4) << 2029 + ETH_TX_PARSE_BD_E2_TCP_HDR_LENGTH_DW_SHIFT) & 2030 + ETH_TX_PARSE_BD_E2_TCP_HDR_LENGTH_DW; 2029 2031 2030 - return skb_transport_header(skb) + tcp_hdrlen(skb) - skb->data; 2032 + return skb_transport_header(skb) + tcp_hdrlen(skb) - skb->data; 2033 + } else 2034 + /* We support checksum offload for TCP and UDP only. 2035 + * No need to pass the UDP header length - it's a constant. 2036 + */ 2037 + return skb_transport_header(skb) + 2038 + sizeof(struct udphdr) - skb->data; 2031 2039 } 2032 2040 2033 2041 /** ··· 2051 2043 struct eth_tx_parse_bd_e1x *pbd, 2052 2044 u32 xmit_type) 2053 2045 { 2054 - u8 hlen = (skb_network_header(skb) - skb->data) / 2; 2046 + u8 hlen = (skb_network_header(skb) - skb->data) >> 1; 2055 2047 2056 2048 /* for now NS flag is not used in Linux */ 2057 2049 pbd->global_data = ··· 2059 2051 ETH_TX_PARSE_BD_E1X_LLC_SNAP_EN_SHIFT)); 2060 2052 2061 2053 pbd->ip_hlen_w = (skb_transport_header(skb) - 2062 - skb_network_header(skb)) / 2; 2054 + skb_network_header(skb)) >> 1; 2063 2055 2064 - hlen += pbd->ip_hlen_w + tcp_hdrlen(skb) / 2; 2056 + hlen += pbd->ip_hlen_w; 2057 + 2058 + /* We support checksum offload for TCP and UDP only */ 2059 + if (xmit_type & XMIT_CSUM_TCP) 2060 + hlen += tcp_hdrlen(skb) / 2; 2061 + else 2062 + hlen += sizeof(struct udphdr) / 2; 2065 2063 2066 2064 pbd->total_hlen_w = cpu_to_le16(hlen); 2067 2065 hlen = hlen*2;
+5 -2
drivers/net/bonding/bond_3ad.c
··· 1482 1482 1483 1483 static int agg_device_up(const struct aggregator *agg) 1484 1484 { 1485 - return (netif_running(agg->slave->dev) && 1486 - netif_carrier_ok(agg->slave->dev)); 1485 + struct port *port = agg->lag_ports; 1486 + if (!port) 1487 + return 0; 1488 + return (netif_running(port->slave->dev) && 1489 + netif_carrier_ok(port->slave->dev)); 1487 1490 } 1488 1491 1489 1492 /**
+6 -3
drivers/net/ehea/ehea_main.c
··· 3040 3040 3041 3041 if (dev->flags & IFF_UP) { 3042 3042 mutex_lock(&port->port_lock); 3043 - port_napi_enable(port); 3044 3043 ret = ehea_restart_qps(dev); 3045 - check_sqs(port); 3046 - if (!ret) 3044 + if (!ret) { 3045 + check_sqs(port); 3046 + port_napi_enable(port); 3047 3047 netif_wake_queue(dev); 3048 + } else { 3049 + netdev_err(dev, "Unable to restart QPS\n"); 3050 + } 3048 3051 mutex_unlock(&port->port_lock); 3049 3052 } 3050 3053 }
+4 -4
drivers/net/fs_enet/mac-fec.c
··· 226 226 } 227 227 228 228 FC(fecp, r_cntrl, FEC_RCNTRL_PROM); 229 - FW(fecp, hash_table_high, fep->fec.hthi); 230 - FW(fecp, hash_table_low, fep->fec.htlo); 229 + FW(fecp, grp_hash_table_high, fep->fec.hthi); 230 + FW(fecp, grp_hash_table_low, fep->fec.htlo); 231 231 } 232 232 233 233 static void set_multicast_list(struct net_device *dev) ··· 273 273 /* 274 274 * Reset all multicast. 275 275 */ 276 - FW(fecp, hash_table_high, fep->fec.hthi); 277 - FW(fecp, hash_table_low, fep->fec.htlo); 276 + FW(fecp, grp_hash_table_high, fep->fec.hthi); 277 + FW(fecp, grp_hash_table_low, fep->fec.htlo); 278 278 279 279 /* 280 280 * Set maximum receive buffer size.
+4 -4
drivers/net/ftmac100.c
··· 139 139 * that hardware reset completed (what the f*ck). 140 140 * We still need to wait for a while. 141 141 */ 142 - usleep_range(500, 1000); 142 + udelay(500); 143 143 return 0; 144 144 } 145 145 146 - usleep_range(1000, 10000); 146 + udelay(1000); 147 147 } 148 148 149 149 netdev_err(netdev, "software reset failed\n"); ··· 772 772 if ((phycr & FTMAC100_PHYCR_MIIRD) == 0) 773 773 return phycr & FTMAC100_PHYCR_MIIRDATA; 774 774 775 - usleep_range(100, 1000); 775 + udelay(100); 776 776 } 777 777 778 778 netdev_err(netdev, "mdio read timed out\n"); ··· 801 801 if ((phycr & FTMAC100_PHYCR_MIIWR) == 0) 802 802 return; 803 803 804 - usleep_range(100, 1000); 804 + udelay(100); 805 805 } 806 806 807 807 netdev_err(netdev, "mdio write timed out\n");
+4
drivers/net/mii.c
··· 49 49 result |= ADVERTISED_100baseT_Half; 50 50 if (advert & ADVERTISE_100FULL) 51 51 result |= ADVERTISED_100baseT_Full; 52 + if (advert & ADVERTISE_PAUSE_CAP) 53 + result |= ADVERTISED_Pause; 54 + if (advert & ADVERTISE_PAUSE_ASYM) 55 + result |= ADVERTISED_Asym_Pause; 52 56 53 57 return result; 54 58 }
+8
drivers/net/netconsole.c
··· 671 671 goto done; 672 672 673 673 spin_lock_irqsave(&target_list_lock, flags); 674 + restart: 674 675 list_for_each_entry(nt, &target_list, list) { 675 676 netconsole_target_get(nt); 676 677 if (nt->np.dev == dev) { ··· 684 683 * rtnl_lock already held 685 684 */ 686 685 if (nt->np.dev) { 686 + spin_unlock_irqrestore( 687 + &target_list_lock, 688 + flags); 687 689 __netpoll_cleanup(&nt->np); 690 + spin_lock_irqsave(&target_list_lock, 691 + flags); 688 692 dev_put(nt->np.dev); 689 693 nt->np.dev = NULL; 694 + netconsole_target_put(nt); 695 + goto restart; 690 696 } 691 697 /* Fall through */ 692 698 case NETDEV_GOING_DOWN:
+71 -28
drivers/net/r8169.c
··· 170 170 }; 171 171 #undef _R 172 172 173 + static const struct rtl_firmware_info { 174 + int mac_version; 175 + const char *fw_name; 176 + } rtl_firmware_infos[] = { 177 + { .mac_version = RTL_GIGA_MAC_VER_25, .fw_name = FIRMWARE_8168D_1 }, 178 + { .mac_version = RTL_GIGA_MAC_VER_26, .fw_name = FIRMWARE_8168D_2 }, 179 + { .mac_version = RTL_GIGA_MAC_VER_29, .fw_name = FIRMWARE_8105E_1 }, 180 + { .mac_version = RTL_GIGA_MAC_VER_30, .fw_name = FIRMWARE_8105E_1 } 181 + }; 182 + 173 183 enum cfg_version { 174 184 RTL_CFG_0 = 0x00, 175 185 RTL_CFG_1, ··· 575 565 u32 saved_wolopts; 576 566 577 567 const struct firmware *fw; 568 + #define RTL_FIRMWARE_UNKNOWN ERR_PTR(-EAGAIN); 578 569 }; 579 570 580 571 MODULE_AUTHOR("Realtek and the Linux r8169 crew <netdev@vger.kernel.org>"); ··· 1800 1789 1801 1790 static void rtl_release_firmware(struct rtl8169_private *tp) 1802 1791 { 1803 - release_firmware(tp->fw); 1804 - tp->fw = NULL; 1792 + if (!IS_ERR_OR_NULL(tp->fw)) 1793 + release_firmware(tp->fw); 1794 + tp->fw = RTL_FIRMWARE_UNKNOWN; 1805 1795 } 1806 1796 1807 - static int rtl_apply_firmware(struct rtl8169_private *tp, const char *fw_name) 1797 + static void rtl_apply_firmware(struct rtl8169_private *tp) 1808 1798 { 1809 - const struct firmware **fw = &tp->fw; 1810 - int rc = !*fw; 1811 - 1812 - if (rc) { 1813 - rc = request_firmware(fw, fw_name, &tp->pci_dev->dev); 1814 - if (rc < 0) 1815 - goto out; 1816 - } 1799 + const struct firmware *fw = tp->fw; 1817 1800 1818 1801 /* TODO: release firmware once rtl_phy_write_fw signals failures. */ 1819 - rtl_phy_write_fw(tp, *fw); 1820 - out: 1821 - return rc; 1802 + if (!IS_ERR_OR_NULL(fw)) 1803 + rtl_phy_write_fw(tp, fw); 1804 + } 1805 + 1806 + static void rtl_apply_firmware_cond(struct rtl8169_private *tp, u8 reg, u16 val) 1807 + { 1808 + if (rtl_readphy(tp, reg) != val) 1809 + netif_warn(tp, hw, tp->dev, "chipset not ready for firmware\n"); 1810 + else 1811 + rtl_apply_firmware(tp); 1822 1812 } 1823 1813 1824 1814 static void rtl8169s_hw_phy_config(struct rtl8169_private *tp) ··· 2258 2246 2259 2247 rtl_writephy(tp, 0x1f, 0x0005); 2260 2248 rtl_writephy(tp, 0x05, 0x001b); 2261 - if ((rtl_readphy(tp, 0x06) != 0xbf00) || 2262 - (rtl_apply_firmware(tp, FIRMWARE_8168D_1) < 0)) { 2263 - netif_warn(tp, probe, tp->dev, "unable to apply firmware patch\n"); 2264 - } 2249 + 2250 + rtl_apply_firmware_cond(tp, MII_EXPANSION, 0xbf00); 2265 2251 2266 2252 rtl_writephy(tp, 0x1f, 0x0000); 2267 2253 } ··· 2361 2351 2362 2352 rtl_writephy(tp, 0x1f, 0x0005); 2363 2353 rtl_writephy(tp, 0x05, 0x001b); 2364 - if ((rtl_readphy(tp, 0x06) != 0xb300) || 2365 - (rtl_apply_firmware(tp, FIRMWARE_8168D_2) < 0)) { 2366 - netif_warn(tp, probe, tp->dev, "unable to apply firmware patch\n"); 2367 - } 2354 + 2355 + rtl_apply_firmware_cond(tp, MII_EXPANSION, 0xb300); 2368 2356 2369 2357 rtl_writephy(tp, 0x1f, 0x0000); 2370 2358 } ··· 2482 2474 rtl_writephy(tp, 0x18, 0x0310); 2483 2475 msleep(100); 2484 2476 2485 - if (rtl_apply_firmware(tp, FIRMWARE_8105E_1) < 0) 2486 - netif_warn(tp, probe, tp->dev, "unable to apply firmware patch\n"); 2477 + rtl_apply_firmware(tp); 2487 2478 2488 2479 rtl_writephy_batch(tp, phy_reg_init, ARRAY_SIZE(phy_reg_init)); 2489 2480 } ··· 3244 3237 tp->timer.data = (unsigned long) dev; 3245 3238 tp->timer.function = rtl8169_phy_timer; 3246 3239 3240 + tp->fw = RTL_FIRMWARE_UNKNOWN; 3241 + 3247 3242 rc = register_netdev(dev); 3248 3243 if (rc < 0) 3249 3244 goto err_out_msi_4; ··· 3297 3288 3298 3289 cancel_delayed_work_sync(&tp->task); 3299 3290 3300 - rtl_release_firmware(tp); 3301 - 3302 3291 unregister_netdev(dev); 3292 + 3293 + rtl_release_firmware(tp); 3303 3294 3304 3295 if (pci_dev_run_wake(pdev)) 3305 3296 pm_runtime_get_noresume(&pdev->dev); ··· 3310 3301 rtl_disable_msi(pdev, tp); 3311 3302 rtl8169_release_board(pdev, dev, tp->mmio_addr); 3312 3303 pci_set_drvdata(pdev, NULL); 3304 + } 3305 + 3306 + static void rtl_request_firmware(struct rtl8169_private *tp) 3307 + { 3308 + int i; 3309 + 3310 + /* Return early if the firmware is already loaded / cached. */ 3311 + if (!IS_ERR(tp->fw)) 3312 + goto out; 3313 + 3314 + for (i = 0; i < ARRAY_SIZE(rtl_firmware_infos); i++) { 3315 + const struct rtl_firmware_info *info = rtl_firmware_infos + i; 3316 + 3317 + if (info->mac_version == tp->mac_version) { 3318 + const char *name = info->fw_name; 3319 + int rc; 3320 + 3321 + rc = request_firmware(&tp->fw, name, &tp->pci_dev->dev); 3322 + if (rc < 0) { 3323 + netif_warn(tp, ifup, tp->dev, "unable to load " 3324 + "firmware patch %s (%d)\n", name, rc); 3325 + goto out_disable_request_firmware; 3326 + } 3327 + goto out; 3328 + } 3329 + } 3330 + 3331 + out_disable_request_firmware: 3332 + tp->fw = NULL; 3333 + out: 3334 + return; 3313 3335 } 3314 3336 3315 3337 static int rtl8169_open(struct net_device *dev) ··· 3374 3334 3375 3335 smp_mb(); 3376 3336 3337 + rtl_request_firmware(tp); 3338 + 3377 3339 retval = request_irq(dev->irq, rtl8169_interrupt, 3378 3340 (tp->features & RTL_FEATURE_MSI) ? 0 : IRQF_SHARED, 3379 3341 dev->name, dev); 3380 3342 if (retval < 0) 3381 - goto err_release_ring_2; 3343 + goto err_release_fw_2; 3382 3344 3383 3345 napi_enable(&tp->napi); 3384 3346 ··· 3401 3359 out: 3402 3360 return retval; 3403 3361 3404 - err_release_ring_2: 3362 + err_release_fw_2: 3363 + rtl_release_firmware(tp); 3405 3364 rtl8169_rx_clear(tp); 3406 3365 err_free_rx_1: 3407 3366 dma_free_coherent(&pdev->dev, R8169_RX_RING_BYTES, tp->RxDescArray,
+6 -2
drivers/net/tg3.c
··· 12327 12327 if (val & VCPU_CFGSHDW_ASPM_DBNC) 12328 12328 tp->tg3_flags |= TG3_FLAG_ASPM_WORKAROUND; 12329 12329 if ((val & VCPU_CFGSHDW_WOL_ENABLE) && 12330 - (val & VCPU_CFGSHDW_WOL_MAGPKT)) 12330 + (val & VCPU_CFGSHDW_WOL_MAGPKT)) { 12331 12331 tp->tg3_flags |= TG3_FLAG_WOL_ENABLE; 12332 + device_set_wakeup_enable(&tp->pdev->dev, true); 12333 + } 12332 12334 goto done; 12333 12335 } 12334 12336 ··· 12463 12461 tp->tg3_flags &= ~TG3_FLAG_WOL_CAP; 12464 12462 12465 12463 if ((tp->tg3_flags & TG3_FLAG_WOL_CAP) && 12466 - (nic_cfg & NIC_SRAM_DATA_CFG_WOL_ENABLE)) 12464 + (nic_cfg & NIC_SRAM_DATA_CFG_WOL_ENABLE)) { 12467 12465 tp->tg3_flags |= TG3_FLAG_WOL_ENABLE; 12466 + device_set_wakeup_enable(&tp->pdev->dev, true); 12467 + } 12468 12468 12469 12469 if (cfg2 & (1 << 17)) 12470 12470 tp->phy_flags |= TG3_PHYFLG_CAPACITIVE_COUPLING;
+12 -2
drivers/net/usb/cdc_ether.c
··· 460 460 .manage_power = cdc_manage_power, 461 461 }; 462 462 463 - static const struct driver_info mbm_info = { 463 + static const struct driver_info wwan_info = { 464 464 .description = "Mobile Broadband Network Device", 465 465 .flags = FLAG_WWAN, 466 466 .bind = usbnet_cdc_bind, ··· 471 471 472 472 /*-------------------------------------------------------------------------*/ 473 473 474 + #define HUAWEI_VENDOR_ID 0x12D1 474 475 475 476 static const struct usb_device_id products [] = { 476 477 /* ··· 588 587 }, { 589 588 USB_INTERFACE_INFO(USB_CLASS_COMM, USB_CDC_SUBCLASS_MDLM, 590 589 USB_CDC_PROTO_NONE), 591 - .driver_info = (unsigned long)&mbm_info, 590 + .driver_info = (unsigned long)&wwan_info, 592 591 592 + }, { 593 + /* Various Huawei modems with a network port like the UMG1831 */ 594 + .match_flags = USB_DEVICE_ID_MATCH_VENDOR 595 + | USB_DEVICE_ID_MATCH_INT_INFO, 596 + .idVendor = HUAWEI_VENDOR_ID, 597 + .bInterfaceClass = USB_CLASS_COMM, 598 + .bInterfaceSubClass = USB_CDC_SUBCLASS_ETHERNET, 599 + .bInterfaceProtocol = 255, 600 + .driver_info = (unsigned long)&wwan_info, 593 601 }, 594 602 { }, // END 595 603 };
+2 -2
drivers/net/usb/cdc_ncm.c
··· 54 54 #include <linux/usb/usbnet.h> 55 55 #include <linux/usb/cdc.h> 56 56 57 - #define DRIVER_VERSION "7-Feb-2011" 57 + #define DRIVER_VERSION "23-Apr-2011" 58 58 59 59 /* CDC NCM subclass 3.2.1 */ 60 60 #define USB_CDC_NCM_NDP16_LENGTH_MIN 0x10 61 61 62 62 /* Maximum NTB length */ 63 - #define CDC_NCM_NTB_MAX_SIZE_TX 16384 /* bytes */ 63 + #define CDC_NCM_NTB_MAX_SIZE_TX (16384 + 4) /* bytes, must be short terminated */ 64 64 #define CDC_NCM_NTB_MAX_SIZE_RX 16384 /* bytes */ 65 65 66 66 /* Minimum value for MaxDatagramSize, ch. 6.2.9 */
+1 -1
drivers/net/usb/smsc95xx.c
··· 730 730 msleep(10); 731 731 bmcr = smsc95xx_mdio_read(dev->net, dev->mii.phy_id, MII_BMCR); 732 732 timeout++; 733 - } while ((bmcr & MII_BMCR) && (timeout < 100)); 733 + } while ((bmcr & BMCR_RESET) && (timeout < 100)); 734 734 735 735 if (timeout >= 100) { 736 736 netdev_warn(dev->net, "timeout on PHY Reset");
+8
drivers/net/usb/usbnet.c
··· 736 736 } 737 737 } 738 738 739 + set_bit(EVENT_DEV_OPEN, &dev->flags); 739 740 netif_start_queue (net); 740 741 netif_info(dev, ifup, dev->net, 741 742 "open: enable queueing (rx %d, tx %d) mtu %d %s framing\n", ··· 1260 1259 if (dev->driver_info->unbind) 1261 1260 dev->driver_info->unbind (dev, intf); 1262 1261 1262 + usb_kill_urb(dev->interrupt); 1263 + usb_free_urb(dev->interrupt); 1264 + 1263 1265 free_netdev(net); 1264 1266 usb_put_dev (xdev); 1265 1267 } ··· 1502 1498 int retval; 1503 1499 1504 1500 if (!--dev->suspend_count) { 1501 + /* resume interrupt URBs */ 1502 + if (dev->interrupt && test_bit(EVENT_DEV_OPEN, &dev->flags)) 1503 + usb_submit_urb(dev->interrupt, GFP_NOIO); 1504 + 1505 1505 spin_lock_irq(&dev->txq.lock); 1506 1506 while ((res = usb_get_from_anchor(&dev->deferred))) { 1507 1507
+12
drivers/net/veth.c
··· 403 403 if (tb[IFLA_ADDRESS] == NULL) 404 404 random_ether_addr(dev->dev_addr); 405 405 406 + if (tb[IFLA_IFNAME]) 407 + nla_strlcpy(dev->name, tb[IFLA_IFNAME], IFNAMSIZ); 408 + else 409 + snprintf(dev->name, IFNAMSIZ, DRV_NAME "%%d"); 410 + 411 + if (strchr(dev->name, '%')) { 412 + err = dev_alloc_name(dev, dev->name); 413 + if (err < 0) 414 + goto err_alloc_name; 415 + } 416 + 406 417 err = register_netdevice(dev); 407 418 if (err < 0) 408 419 goto err_register_dev; ··· 433 422 434 423 err_register_dev: 435 424 /* nothing to do */ 425 + err_alloc_name: 436 426 err_configure_peer: 437 427 unregister_netdevice(peer); 438 428 return err;
+1 -1
drivers/net/wireless/ath/ath9k/recv.c
··· 506 506 "confusing the DMA engine when we start RX up\n"); 507 507 ATH_DBG_WARN_ON_ONCE(!stopped); 508 508 } 509 - return stopped || reset; 509 + return stopped && !reset; 510 510 } 511 511 512 512 void ath_flushrecv(struct ath_softc *sc)
+1
drivers/net/wireless/b43/main.c
··· 72 72 MODULE_FIRMWARE("b43/ucode13.fw"); 73 73 MODULE_FIRMWARE("b43/ucode14.fw"); 74 74 MODULE_FIRMWARE("b43/ucode15.fw"); 75 + MODULE_FIRMWARE("b43/ucode16_mimo.fw"); 75 76 MODULE_FIRMWARE("b43/ucode5.fw"); 76 77 MODULE_FIRMWARE("b43/ucode9.fw"); 77 78
+19 -9
drivers/net/wireless/iwlegacy/iwl-4965-tx.c
··· 316 316 317 317 hdr_len = ieee80211_hdrlen(fc); 318 318 319 - /* Find index into station table for destination station */ 320 - sta_id = iwl_legacy_sta_id_or_broadcast(priv, ctx, info->control.sta); 321 - if (sta_id == IWL_INVALID_STATION) { 322 - IWL_DEBUG_DROP(priv, "Dropping - INVALID STATION: %pM\n", 323 - hdr->addr1); 324 - goto drop_unlock; 319 + /* For management frames use broadcast id to do not break aggregation */ 320 + if (!ieee80211_is_data(fc)) 321 + sta_id = ctx->bcast_sta_id; 322 + else { 323 + /* Find index into station table for destination station */ 324 + sta_id = iwl_legacy_sta_id_or_broadcast(priv, ctx, info->control.sta); 325 + 326 + if (sta_id == IWL_INVALID_STATION) { 327 + IWL_DEBUG_DROP(priv, "Dropping - INVALID STATION: %pM\n", 328 + hdr->addr1); 329 + goto drop_unlock; 330 + } 325 331 } 326 332 327 333 IWL_DEBUG_TX(priv, "station Id %d\n", sta_id); ··· 1133 1127 q->read_ptr = iwl_legacy_queue_inc_wrap(q->read_ptr, q->n_bd)) { 1134 1128 1135 1129 tx_info = &txq->txb[txq->q.read_ptr]; 1136 - iwl4965_tx_status(priv, tx_info, 1137 - txq_id >= IWL4965_FIRST_AMPDU_QUEUE); 1130 + 1131 + if (WARN_ON_ONCE(tx_info->skb == NULL)) 1132 + continue; 1138 1133 1139 1134 hdr = (struct ieee80211_hdr *)tx_info->skb->data; 1140 - if (hdr && ieee80211_is_data_qos(hdr->frame_control)) 1135 + if (ieee80211_is_data_qos(hdr->frame_control)) 1141 1136 nfreed++; 1137 + 1138 + iwl4965_tx_status(priv, tx_info, 1139 + txq_id >= IWL4965_FIRST_AMPDU_QUEUE); 1142 1140 tx_info->skb = NULL; 1143 1141 1144 1142 priv->cfg->ops->lib->txq_free_tfd(priv, txq);
+19 -1
drivers/net/wireless/iwlegacy/iwl-led.c
··· 48 48 MODULE_PARM_DESC(led_mode, "0=system default, " 49 49 "1=On(RF On)/Off(RF Off), 2=blinking"); 50 50 51 + /* Throughput OFF time(ms) ON time (ms) 52 + * >300 25 25 53 + * >200 to 300 40 40 54 + * >100 to 200 55 55 55 + * >70 to 100 65 65 56 + * >50 to 70 75 75 57 + * >20 to 50 85 85 58 + * >10 to 20 95 95 59 + * >5 to 10 110 110 60 + * >1 to 5 130 130 61 + * >0 to 1 167 167 62 + * <=0 SOLID ON 63 + */ 51 64 static const struct ieee80211_tpt_blink iwl_blink[] = { 52 - { .throughput = 0 * 1024 - 1, .blink_time = 334 }, 65 + { .throughput = 0, .blink_time = 334 }, 53 66 { .throughput = 1 * 1024 - 1, .blink_time = 260 }, 54 67 { .throughput = 5 * 1024 - 1, .blink_time = 220 }, 55 68 { .throughput = 10 * 1024 - 1, .blink_time = 190 }, ··· 113 100 114 101 if (priv->blink_on == on && priv->blink_off == off) 115 102 return 0; 103 + 104 + if (off == 0) { 105 + /* led is SOLID_ON */ 106 + on = IWL_LED_SOLID; 107 + } 116 108 117 109 IWL_DEBUG_LED(priv, "Led blink time compensation=%u\n", 118 110 priv->cfg->base_params->led_compensation);
+4 -4
drivers/net/wireless/iwlegacy/iwl4965-base.c
··· 2984 2984 struct iwl_priv *priv = container_of(work, struct iwl_priv, 2985 2985 txpower_work); 2986 2986 2987 + mutex_lock(&priv->mutex); 2988 + 2987 2989 /* If a scan happened to start before we got here 2988 2990 * then just return; the statistics notification will 2989 2991 * kick off another scheduled work to compensate for 2990 2992 * any temperature delta we missed here. */ 2991 2993 if (test_bit(STATUS_EXIT_PENDING, &priv->status) || 2992 2994 test_bit(STATUS_SCANNING, &priv->status)) 2993 - return; 2994 - 2995 - mutex_lock(&priv->mutex); 2995 + goto out; 2996 2996 2997 2997 /* Regardless of if we are associated, we must reconfigure the 2998 2998 * TX power since frames can be sent on non-radar channels while ··· 3002 3002 /* Update last_temperature to keep is_calib_needed from running 3003 3003 * when it isn't needed... */ 3004 3004 priv->last_temperature = priv->temperature; 3005 - 3005 + out: 3006 3006 mutex_unlock(&priv->mutex); 3007 3007 } 3008 3008
+1 -6
drivers/net/wireless/iwlwifi/iwl-agn-rxon.c
··· 335 335 struct ieee80211_channel *channel = conf->channel; 336 336 const struct iwl_channel_info *ch_info; 337 337 int ret = 0; 338 - bool ht_changed[NUM_IWL_RXON_CTX] = {}; 339 338 340 339 IWL_DEBUG_MAC80211(priv, "changed %#x", changed); 341 340 ··· 382 383 383 384 for_each_context(priv, ctx) { 384 385 /* Configure HT40 channels */ 385 - if (ctx->ht.enabled != conf_is_ht(conf)) { 386 + if (ctx->ht.enabled != conf_is_ht(conf)) 386 387 ctx->ht.enabled = conf_is_ht(conf); 387 - ht_changed[ctx->ctxid] = true; 388 - } 389 388 390 389 if (ctx->ht.enabled) { 391 390 if (conf_is_ht40_minus(conf)) { ··· 452 455 if (!memcmp(&ctx->staging, &ctx->active, sizeof(ctx->staging))) 453 456 continue; 454 457 iwlagn_commit_rxon(priv, ctx); 455 - if (ht_changed[ctx->ctxid]) 456 - iwlagn_update_qos(priv, ctx); 457 458 } 458 459 out: 459 460 mutex_unlock(&priv->mutex);
+18 -9
drivers/net/wireless/iwlwifi/iwl-agn-tx.c
··· 568 568 569 569 hdr_len = ieee80211_hdrlen(fc); 570 570 571 - /* Find index into station table for destination station */ 572 - sta_id = iwl_sta_id_or_broadcast(priv, ctx, info->control.sta); 573 - if (sta_id == IWL_INVALID_STATION) { 574 - IWL_DEBUG_DROP(priv, "Dropping - INVALID STATION: %pM\n", 575 - hdr->addr1); 576 - goto drop_unlock; 571 + /* For management frames use broadcast id to do not break aggregation */ 572 + if (!ieee80211_is_data(fc)) 573 + sta_id = ctx->bcast_sta_id; 574 + else { 575 + /* Find index into station table for destination station */ 576 + sta_id = iwl_sta_id_or_broadcast(priv, ctx, info->control.sta); 577 + if (sta_id == IWL_INVALID_STATION) { 578 + IWL_DEBUG_DROP(priv, "Dropping - INVALID STATION: %pM\n", 579 + hdr->addr1); 580 + goto drop_unlock; 581 + } 577 582 } 578 583 579 584 IWL_DEBUG_TX(priv, "station Id %d\n", sta_id); ··· 1229 1224 q->read_ptr = iwl_queue_inc_wrap(q->read_ptr, q->n_bd)) { 1230 1225 1231 1226 tx_info = &txq->txb[txq->q.read_ptr]; 1232 - iwlagn_tx_status(priv, tx_info, 1233 - txq_id >= IWLAGN_FIRST_AMPDU_QUEUE); 1227 + 1228 + if (WARN_ON_ONCE(tx_info->skb == NULL)) 1229 + continue; 1234 1230 1235 1231 hdr = (struct ieee80211_hdr *)tx_info->skb->data; 1236 - if (hdr && ieee80211_is_data_qos(hdr->frame_control)) 1232 + if (ieee80211_is_data_qos(hdr->frame_control)) 1237 1233 nfreed++; 1234 + 1235 + iwlagn_tx_status(priv, tx_info, 1236 + txq_id >= IWLAGN_FIRST_AMPDU_QUEUE); 1238 1237 tx_info->skb = NULL; 1239 1238 1240 1239 if (priv->cfg->ops->lib->txq_inval_byte_cnt_tbl)
+1 -1
drivers/pcmcia/pcmcia_resource.c
··· 173 173 c = p_dev->function_config; 174 174 175 175 if (!(c->state & CONFIG_LOCKED)) { 176 - dev_dbg(&p_dev->dev, "Configuration isn't't locked\n"); 176 + dev_dbg(&p_dev->dev, "Configuration isn't locked\n"); 177 177 mutex_unlock(&s->ops_mutex); 178 178 return -EACCES; 179 179 }
+41 -16
drivers/platform/x86/eeepc-laptop.c
··· 585 585 return true; 586 586 } 587 587 588 - static void eeepc_rfkill_hotplug(struct eeepc_laptop *eeepc) 588 + static void eeepc_rfkill_hotplug(struct eeepc_laptop *eeepc, acpi_handle handle) 589 589 { 590 + struct pci_dev *port; 590 591 struct pci_dev *dev; 591 592 struct pci_bus *bus; 592 593 bool blocked = eeepc_wlan_rfkill_blocked(eeepc); ··· 600 599 mutex_lock(&eeepc->hotplug_lock); 601 600 602 601 if (eeepc->hotplug_slot) { 603 - bus = pci_find_bus(0, 1); 602 + port = acpi_get_pci_dev(handle); 603 + if (!port) { 604 + pr_warning("Unable to find port\n"); 605 + goto out_unlock; 606 + } 607 + 608 + bus = port->subordinate; 609 + 604 610 if (!bus) { 605 - pr_warning("Unable to find PCI bus 1?\n"); 611 + pr_warning("Unable to find PCI bus?\n"); 606 612 goto out_unlock; 607 613 } 608 614 ··· 617 609 pr_err("Unable to read PCI config space?\n"); 618 610 goto out_unlock; 619 611 } 612 + 620 613 absent = (l == 0xffffffff); 621 614 622 615 if (blocked != absent) { ··· 656 647 mutex_unlock(&eeepc->hotplug_lock); 657 648 } 658 649 650 + static void eeepc_rfkill_hotplug_update(struct eeepc_laptop *eeepc, char *node) 651 + { 652 + acpi_status status = AE_OK; 653 + acpi_handle handle; 654 + 655 + status = acpi_get_handle(NULL, node, &handle); 656 + 657 + if (ACPI_SUCCESS(status)) 658 + eeepc_rfkill_hotplug(eeepc, handle); 659 + } 660 + 659 661 static void eeepc_rfkill_notify(acpi_handle handle, u32 event, void *data) 660 662 { 661 663 struct eeepc_laptop *eeepc = data; ··· 674 654 if (event != ACPI_NOTIFY_BUS_CHECK) 675 655 return; 676 656 677 - eeepc_rfkill_hotplug(eeepc); 657 + eeepc_rfkill_hotplug(eeepc, handle); 678 658 } 679 659 680 660 static int eeepc_register_rfkill_notifier(struct eeepc_laptop *eeepc, ··· 692 672 eeepc); 693 673 if (ACPI_FAILURE(status)) 694 674 pr_warning("Failed to register notify on %s\n", node); 675 + /* 676 + * Refresh pci hotplug in case the rfkill state was 677 + * changed during setup. 678 + */ 679 + eeepc_rfkill_hotplug(eeepc, handle); 695 680 } else 696 681 return -ENODEV; 697 682 ··· 718 693 if (ACPI_FAILURE(status)) 719 694 pr_err("Error removing rfkill notify handler %s\n", 720 695 node); 696 + /* 697 + * Refresh pci hotplug in case the rfkill 698 + * state was changed after 699 + * eeepc_unregister_rfkill_notifier() 700 + */ 701 + eeepc_rfkill_hotplug(eeepc, handle); 721 702 } 722 703 } 723 704 ··· 847 816 rfkill_destroy(eeepc->wlan_rfkill); 848 817 eeepc->wlan_rfkill = NULL; 849 818 } 850 - /* 851 - * Refresh pci hotplug in case the rfkill state was changed after 852 - * eeepc_unregister_rfkill_notifier() 853 - */ 854 - eeepc_rfkill_hotplug(eeepc); 819 + 855 820 if (eeepc->hotplug_slot) 856 821 pci_hp_deregister(eeepc->hotplug_slot); 857 822 ··· 916 889 eeepc_register_rfkill_notifier(eeepc, "\\_SB.PCI0.P0P5"); 917 890 eeepc_register_rfkill_notifier(eeepc, "\\_SB.PCI0.P0P6"); 918 891 eeepc_register_rfkill_notifier(eeepc, "\\_SB.PCI0.P0P7"); 919 - /* 920 - * Refresh pci hotplug in case the rfkill state was changed during 921 - * setup. 922 - */ 923 - eeepc_rfkill_hotplug(eeepc); 924 892 925 893 exit: 926 894 if (result && result != -ENODEV) ··· 950 928 struct eeepc_laptop *eeepc = dev_get_drvdata(device); 951 929 952 930 /* Refresh both wlan rfkill state and pci hotplug */ 953 - if (eeepc->wlan_rfkill) 954 - eeepc_rfkill_hotplug(eeepc); 931 + if (eeepc->wlan_rfkill) { 932 + eeepc_rfkill_hotplug_update(eeepc, "\\_SB.PCI0.P0P5"); 933 + eeepc_rfkill_hotplug_update(eeepc, "\\_SB.PCI0.P0P6"); 934 + eeepc_rfkill_hotplug_update(eeepc, "\\_SB.PCI0.P0P7"); 935 + } 955 936 956 937 if (eeepc->bluetooth_rfkill) 957 938 rfkill_set_sw_state(eeepc->bluetooth_rfkill,
+105 -25
drivers/platform/x86/sony-laptop.c
··· 934 934 /* 935 935 * Backlight device 936 936 */ 937 + struct sony_backlight_props { 938 + struct backlight_device *dev; 939 + int handle; 940 + u8 offset; 941 + u8 maxlvl; 942 + }; 943 + struct sony_backlight_props sony_bl_props; 944 + 937 945 static int sony_backlight_update_status(struct backlight_device *bd) 938 946 { 939 947 return acpi_callsetfunc(sony_nc_acpi_handle, "SBRT", ··· 962 954 { 963 955 int result; 964 956 int *handle = (int *)bl_get_data(bd); 957 + struct sony_backlight_props *sdev = 958 + (struct sony_backlight_props *)bl_get_data(bd); 965 959 966 - sony_call_snc_handle(*handle, 0x0200, &result); 960 + sony_call_snc_handle(sdev->handle, 0x0200, &result); 967 961 968 - return result & 0xff; 962 + return (result & 0xff) - sdev->offset; 969 963 } 970 964 971 965 static int sony_nc_update_status_ng(struct backlight_device *bd) 972 966 { 973 967 int value, result; 974 968 int *handle = (int *)bl_get_data(bd); 969 + struct sony_backlight_props *sdev = 970 + (struct sony_backlight_props *)bl_get_data(bd); 975 971 976 - value = bd->props.brightness; 977 - sony_call_snc_handle(*handle, 0x0100 | (value << 16), &result); 972 + value = bd->props.brightness + sdev->offset; 973 + if (sony_call_snc_handle(sdev->handle, 0x0100 | (value << 16), &result)) 974 + return -EIO; 978 975 979 - return sony_nc_get_brightness_ng(bd); 976 + return value; 980 977 } 981 978 982 979 static const struct backlight_ops sony_backlight_ops = { ··· 994 981 .update_status = sony_nc_update_status_ng, 995 982 .get_brightness = sony_nc_get_brightness_ng, 996 983 }; 997 - static int backlight_ng_handle; 998 - static struct backlight_device *sony_backlight_device; 999 984 1000 985 /* 1001 986 * New SNC-only Vaios event mapping to driver known keys ··· 1560 1549 &ignore); 1561 1550 } 1562 1551 1552 + static void sony_nc_backlight_ng_read_limits(int handle, 1553 + struct sony_backlight_props *props) 1554 + { 1555 + int offset; 1556 + acpi_status status; 1557 + u8 brlvl, i; 1558 + u8 min = 0xff, max = 0x00; 1559 + struct acpi_object_list params; 1560 + union acpi_object in_obj; 1561 + union acpi_object *lvl_enum; 1562 + struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL }; 1563 + 1564 + props->handle = handle; 1565 + props->offset = 0; 1566 + props->maxlvl = 0xff; 1567 + 1568 + offset = sony_find_snc_handle(handle); 1569 + if (offset < 0) 1570 + return; 1571 + 1572 + /* try to read the boundaries from ACPI tables, if we fail the above 1573 + * defaults should be reasonable 1574 + */ 1575 + params.count = 1; 1576 + params.pointer = &in_obj; 1577 + in_obj.type = ACPI_TYPE_INTEGER; 1578 + in_obj.integer.value = offset; 1579 + status = acpi_evaluate_object(sony_nc_acpi_handle, "SN06", &params, 1580 + &buffer); 1581 + if (ACPI_FAILURE(status)) 1582 + return; 1583 + 1584 + lvl_enum = (union acpi_object *) buffer.pointer; 1585 + if (!lvl_enum) { 1586 + pr_err("No SN06 return object."); 1587 + return; 1588 + } 1589 + if (lvl_enum->type != ACPI_TYPE_BUFFER) { 1590 + pr_err("Invalid SN06 return object 0x%.2x\n", 1591 + lvl_enum->type); 1592 + goto out_invalid; 1593 + } 1594 + 1595 + /* the buffer lists brightness levels available, brightness levels are 1596 + * from 0 to 8 in the array, other values are used by ALS control. 1597 + */ 1598 + for (i = 0; i < 9 && i < lvl_enum->buffer.length; i++) { 1599 + 1600 + brlvl = *(lvl_enum->buffer.pointer + i); 1601 + dprintk("Brightness level: %d\n", brlvl); 1602 + 1603 + if (!brlvl) 1604 + break; 1605 + 1606 + if (brlvl > max) 1607 + max = brlvl; 1608 + if (brlvl < min) 1609 + min = brlvl; 1610 + } 1611 + props->offset = min; 1612 + props->maxlvl = max; 1613 + dprintk("Brightness levels: min=%d max=%d\n", props->offset, 1614 + props->maxlvl); 1615 + 1616 + out_invalid: 1617 + kfree(buffer.pointer); 1618 + return; 1619 + } 1620 + 1563 1621 static void sony_nc_backlight_setup(void) 1564 1622 { 1565 1623 acpi_handle unused; ··· 1637 1557 struct backlight_properties props; 1638 1558 1639 1559 if (sony_find_snc_handle(0x12f) != -1) { 1640 - backlight_ng_handle = 0x12f; 1641 1560 ops = &sony_backlight_ng_ops; 1642 - max_brightness = 0xff; 1561 + sony_nc_backlight_ng_read_limits(0x12f, &sony_bl_props); 1562 + max_brightness = sony_bl_props.maxlvl - sony_bl_props.offset; 1643 1563 1644 1564 } else if (sony_find_snc_handle(0x137) != -1) { 1645 - backlight_ng_handle = 0x137; 1646 1565 ops = &sony_backlight_ng_ops; 1647 - max_brightness = 0xff; 1566 + sony_nc_backlight_ng_read_limits(0x137, &sony_bl_props); 1567 + max_brightness = sony_bl_props.maxlvl - sony_bl_props.offset; 1648 1568 1649 1569 } else if (ACPI_SUCCESS(acpi_get_handle(sony_nc_acpi_handle, "GBRT", 1650 1570 &unused))) { ··· 1657 1577 memset(&props, 0, sizeof(struct backlight_properties)); 1658 1578 props.type = BACKLIGHT_PLATFORM; 1659 1579 props.max_brightness = max_brightness; 1660 - sony_backlight_device = backlight_device_register("sony", NULL, 1661 - &backlight_ng_handle, 1662 - ops, &props); 1580 + sony_bl_props.dev = backlight_device_register("sony", NULL, 1581 + &sony_bl_props, 1582 + ops, &props); 1663 1583 1664 - if (IS_ERR(sony_backlight_device)) { 1665 - pr_warning(DRV_PFX "unable to register backlight device\n"); 1666 - sony_backlight_device = NULL; 1584 + if (IS_ERR(sony_bl_props.dev)) { 1585 + pr_warn(DRV_PFX "unable to register backlight device\n"); 1586 + sony_bl_props.dev = NULL; 1667 1587 } else 1668 - sony_backlight_device->props.brightness = 1669 - ops->get_brightness(sony_backlight_device); 1588 + sony_bl_props.dev->props.brightness = 1589 + ops->get_brightness(sony_bl_props.dev); 1670 1590 } 1671 1591 1672 1592 static void sony_nc_backlight_cleanup(void) 1673 1593 { 1674 - if (sony_backlight_device) 1675 - backlight_device_unregister(sony_backlight_device); 1594 + if (sony_bl_props.dev) 1595 + backlight_device_unregister(sony_bl_props.dev); 1676 1596 } 1677 1597 1678 1598 static int sony_nc_add(struct acpi_device *device) ··· 2670 2590 mutex_lock(&spic_dev.lock); 2671 2591 switch (cmd) { 2672 2592 case SONYPI_IOCGBRT: 2673 - if (sony_backlight_device == NULL) { 2593 + if (sony_bl_props.dev == NULL) { 2674 2594 ret = -EIO; 2675 2595 break; 2676 2596 } ··· 2683 2603 ret = -EFAULT; 2684 2604 break; 2685 2605 case SONYPI_IOCSBRT: 2686 - if (sony_backlight_device == NULL) { 2606 + if (sony_bl_props.dev == NULL) { 2687 2607 ret = -EIO; 2688 2608 break; 2689 2609 } ··· 2697 2617 break; 2698 2618 } 2699 2619 /* sync the backlight device status */ 2700 - sony_backlight_device->props.brightness = 2701 - sony_backlight_get_brightness(sony_backlight_device); 2620 + sony_bl_props.dev->props.brightness = 2621 + sony_backlight_get_brightness(sony_bl_props.dev); 2702 2622 break; 2703 2623 case SONYPI_IOCGBAT1CAP: 2704 2624 if (ec_read16(SONYPI_BAT1_FULL, &val16)) {
+4 -2
drivers/platform/x86/thinkpad_acpi.c
··· 128 128 }; 129 129 130 130 /* ACPI HIDs */ 131 - #define TPACPI_ACPI_HKEY_HID "IBM0068" 131 + #define TPACPI_ACPI_IBM_HKEY_HID "IBM0068" 132 + #define TPACPI_ACPI_LENOVO_HKEY_HID "LEN0068" 132 133 #define TPACPI_ACPI_EC_HID "PNP0C09" 133 134 134 135 /* Input IDs */ ··· 3880 3879 } 3881 3880 3882 3881 static const struct acpi_device_id ibm_htk_device_ids[] = { 3883 - {TPACPI_ACPI_HKEY_HID, 0}, 3882 + {TPACPI_ACPI_IBM_HKEY_HID, 0}, 3883 + {TPACPI_ACPI_LENOVO_HKEY_HID, 0}, 3884 3884 {"", 0}, 3885 3885 }; 3886 3886
+2 -1
drivers/rtc/rtc-max8925.c
··· 257 257 goto out_irq; 258 258 } 259 259 260 + dev_set_drvdata(&pdev->dev, info); 261 + 260 262 info->rtc_dev = rtc_device_register("max8925-rtc", &pdev->dev, 261 263 &max8925_rtc_ops, THIS_MODULE); 262 264 ret = PTR_ERR(info->rtc_dev); ··· 267 265 goto out_rtc; 268 266 } 269 267 270 - dev_set_drvdata(&pdev->dev, info); 271 268 platform_set_drvdata(pdev, info); 272 269 273 270 return 0;
+22 -18
drivers/s390/block/dasd.c
··· 2314 2314 2315 2315 static int dasd_open(struct block_device *bdev, fmode_t mode) 2316 2316 { 2317 - struct dasd_block *block = bdev->bd_disk->private_data; 2318 2317 struct dasd_device *base; 2319 2318 int rc; 2320 2319 2321 - if (!block) 2320 + base = dasd_device_from_gendisk(bdev->bd_disk); 2321 + if (!base) 2322 2322 return -ENODEV; 2323 2323 2324 - base = block->base; 2325 - atomic_inc(&block->open_count); 2324 + atomic_inc(&base->block->open_count); 2326 2325 if (test_bit(DASD_FLAG_OFFLINE, &base->flags)) { 2327 2326 rc = -ENODEV; 2328 2327 goto unlock; ··· 2354 2355 goto out; 2355 2356 } 2356 2357 2358 + dasd_put_device(base); 2357 2359 return 0; 2358 2360 2359 2361 out: 2360 2362 module_put(base->discipline->owner); 2361 2363 unlock: 2362 - atomic_dec(&block->open_count); 2364 + atomic_dec(&base->block->open_count); 2365 + dasd_put_device(base); 2363 2366 return rc; 2364 2367 } 2365 2368 2366 2369 static int dasd_release(struct gendisk *disk, fmode_t mode) 2367 2370 { 2368 - struct dasd_block *block = disk->private_data; 2371 + struct dasd_device *base; 2369 2372 2370 - atomic_dec(&block->open_count); 2371 - module_put(block->base->discipline->owner); 2373 + base = dasd_device_from_gendisk(disk); 2374 + if (!base) 2375 + return -ENODEV; 2376 + 2377 + atomic_dec(&base->block->open_count); 2378 + module_put(base->discipline->owner); 2379 + dasd_put_device(base); 2372 2380 return 0; 2373 2381 } 2374 2382 ··· 2384 2378 */ 2385 2379 static int dasd_getgeo(struct block_device *bdev, struct hd_geometry *geo) 2386 2380 { 2387 - struct dasd_block *block; 2388 2381 struct dasd_device *base; 2389 2382 2390 - block = bdev->bd_disk->private_data; 2391 - if (!block) 2383 + base = dasd_device_from_gendisk(bdev->bd_disk); 2384 + if (!base) 2392 2385 return -ENODEV; 2393 - base = block->base; 2394 2386 2395 2387 if (!base->discipline || 2396 - !base->discipline->fill_geometry) 2388 + !base->discipline->fill_geometry) { 2389 + dasd_put_device(base); 2397 2390 return -EINVAL; 2398 - 2399 - base->discipline->fill_geometry(block, geo); 2400 - geo->start = get_start_sect(bdev) >> block->s2b_shift; 2391 + } 2392 + base->discipline->fill_geometry(base->block, geo); 2393 + geo->start = get_start_sect(bdev) >> base->block->s2b_shift; 2394 + dasd_put_device(base); 2401 2395 return 0; 2402 2396 } 2403 2397 ··· 2534 2528 dasd_set_target_state(device, DASD_STATE_NEW); 2535 2529 /* dasd_delete_device destroys the device reference. */ 2536 2530 block = device->block; 2537 - device->block = NULL; 2538 2531 dasd_delete_device(device); 2539 2532 /* 2540 2533 * life cycle of block is bound to device, so delete it after ··· 2655 2650 dasd_set_target_state(device, DASD_STATE_NEW); 2656 2651 /* dasd_delete_device destroys the device reference. */ 2657 2652 block = device->block; 2658 - device->block = NULL; 2659 2653 dasd_delete_device(device); 2660 2654 /* 2661 2655 * life cycle of block is bound to device, so delete it after
+30
drivers/s390/block/dasd_devmap.c
··· 674 674 return device; 675 675 } 676 676 677 + void dasd_add_link_to_gendisk(struct gendisk *gdp, struct dasd_device *device) 678 + { 679 + struct dasd_devmap *devmap; 680 + 681 + devmap = dasd_find_busid(dev_name(&device->cdev->dev)); 682 + if (IS_ERR(devmap)) 683 + return; 684 + spin_lock(&dasd_devmap_lock); 685 + gdp->private_data = devmap; 686 + spin_unlock(&dasd_devmap_lock); 687 + } 688 + 689 + struct dasd_device *dasd_device_from_gendisk(struct gendisk *gdp) 690 + { 691 + struct dasd_device *device; 692 + struct dasd_devmap *devmap; 693 + 694 + if (!gdp->private_data) 695 + return NULL; 696 + device = NULL; 697 + spin_lock(&dasd_devmap_lock); 698 + devmap = gdp->private_data; 699 + if (devmap && devmap->device) { 700 + device = devmap->device; 701 + dasd_get_device(device); 702 + } 703 + spin_unlock(&dasd_devmap_lock); 704 + return device; 705 + } 706 + 677 707 /* 678 708 * SECTION: files in sysfs 679 709 */
+1 -1
drivers/s390/block/dasd_diag.c
··· 239 239 addr_t ip; 240 240 int rc; 241 241 242 - kstat_cpu(smp_processor_id()).irqs[EXTINT_DSD]++; 243 242 switch (ext_int_code >> 24) { 244 243 case DASD_DIAG_CODE_31BIT: 245 244 ip = (addr_t) param32; ··· 249 250 default: 250 251 return; 251 252 } 253 + kstat_cpu(smp_processor_id()).irqs[EXTINT_DSD]++; 252 254 if (!ip) { /* no intparm: unsolicited interrupt */ 253 255 DBF_EVENT(DBF_NOTICE, "%s", "caught unsolicited " 254 256 "interrupt");
+3 -2
drivers/s390/block/dasd_eckd.c
··· 2037 2037 return; 2038 2038 2039 2039 /* summary unit check */ 2040 - if ((sense[7] == 0x0D) && 2040 + if ((sense[27] & DASD_SENSE_BIT_0) && (sense[7] == 0x0D) && 2041 2041 (scsw_dstat(&irb->scsw) & DEV_STAT_UNIT_CHECK)) { 2042 2042 dasd_alias_handle_summary_unit_check(device, irb); 2043 2043 return; ··· 2053 2053 /* loss of device reservation is handled via base devices only 2054 2054 * as alias devices may be used with several bases 2055 2055 */ 2056 - if (device->block && (sense[7] == 0x3F) && 2056 + if (device->block && (sense[27] & DASD_SENSE_BIT_0) && 2057 + (sense[7] == 0x3F) && 2057 2058 (scsw_dstat(&irb->scsw) & DEV_STAT_UNIT_CHECK) && 2058 2059 test_bit(DASD_FLAG_IS_RESERVED, &device->flags)) { 2059 2060 if (device->features & DASD_FEATURE_FAILONSLCK)
+1 -1
drivers/s390/block/dasd_genhd.c
··· 73 73 if (base->features & DASD_FEATURE_READONLY || 74 74 test_bit(DASD_FLAG_DEVICE_RO, &base->flags)) 75 75 set_disk_ro(gdp, 1); 76 - gdp->private_data = block; 76 + dasd_add_link_to_gendisk(gdp, base); 77 77 gdp->queue = block->request_queue; 78 78 block->gdp = gdp; 79 79 set_capacity(block->gdp, 0);
+3
drivers/s390/block/dasd_int.h
··· 686 686 struct dasd_device *dasd_device_from_cdev_locked(struct ccw_device *); 687 687 struct dasd_device *dasd_device_from_devindex(int); 688 688 689 + void dasd_add_link_to_gendisk(struct gendisk *, struct dasd_device *); 690 + struct dasd_device *dasd_device_from_gendisk(struct gendisk *); 691 + 689 692 int dasd_parse(void); 690 693 int dasd_busid_known(const char *); 691 694
+87 -41
drivers/s390/block/dasd_ioctl.c
··· 42 42 static int 43 43 dasd_ioctl_enable(struct block_device *bdev) 44 44 { 45 - struct dasd_block *block = bdev->bd_disk->private_data; 45 + struct dasd_device *base; 46 46 47 47 if (!capable(CAP_SYS_ADMIN)) 48 48 return -EACCES; 49 49 50 - dasd_enable_device(block->base); 50 + base = dasd_device_from_gendisk(bdev->bd_disk); 51 + if (!base) 52 + return -ENODEV; 53 + 54 + dasd_enable_device(base); 51 55 /* Formatting the dasd device can change the capacity. */ 52 56 mutex_lock(&bdev->bd_mutex); 53 - i_size_write(bdev->bd_inode, (loff_t)get_capacity(block->gdp) << 9); 57 + i_size_write(bdev->bd_inode, 58 + (loff_t)get_capacity(base->block->gdp) << 9); 54 59 mutex_unlock(&bdev->bd_mutex); 60 + dasd_put_device(base); 55 61 return 0; 56 62 } 57 63 ··· 68 62 static int 69 63 dasd_ioctl_disable(struct block_device *bdev) 70 64 { 71 - struct dasd_block *block = bdev->bd_disk->private_data; 65 + struct dasd_device *base; 72 66 73 67 if (!capable(CAP_SYS_ADMIN)) 74 68 return -EACCES; 75 69 70 + base = dasd_device_from_gendisk(bdev->bd_disk); 71 + if (!base) 72 + return -ENODEV; 76 73 /* 77 74 * Man this is sick. We don't do a real disable but only downgrade 78 75 * the device to DASD_STATE_BASIC. The reason is that dasdfmt uses ··· 84 75 * using the BIODASDFMT ioctl. Therefore the correct state for the 85 76 * device is DASD_STATE_BASIC that allows to do basic i/o. 86 77 */ 87 - dasd_set_target_state(block->base, DASD_STATE_BASIC); 78 + dasd_set_target_state(base, DASD_STATE_BASIC); 88 79 /* 89 80 * Set i_size to zero, since read, write, etc. check against this 90 81 * value. ··· 92 83 mutex_lock(&bdev->bd_mutex); 93 84 i_size_write(bdev->bd_inode, 0); 94 85 mutex_unlock(&bdev->bd_mutex); 86 + dasd_put_device(base); 95 87 return 0; 96 88 } 97 89 ··· 201 191 static int 202 192 dasd_ioctl_format(struct block_device *bdev, void __user *argp) 203 193 { 204 - struct dasd_block *block = bdev->bd_disk->private_data; 194 + struct dasd_device *base; 205 195 struct format_data_t fdata; 196 + int rc; 206 197 207 198 if (!capable(CAP_SYS_ADMIN)) 208 199 return -EACCES; 209 200 if (!argp) 210 201 return -EINVAL; 211 - 212 - if (block->base->features & DASD_FEATURE_READONLY || 213 - test_bit(DASD_FLAG_DEVICE_RO, &block->base->flags)) 202 + base = dasd_device_from_gendisk(bdev->bd_disk); 203 + if (!base) 204 + return -ENODEV; 205 + if (base->features & DASD_FEATURE_READONLY || 206 + test_bit(DASD_FLAG_DEVICE_RO, &base->flags)) { 207 + dasd_put_device(base); 214 208 return -EROFS; 215 - if (copy_from_user(&fdata, argp, sizeof(struct format_data_t))) 209 + } 210 + if (copy_from_user(&fdata, argp, sizeof(struct format_data_t))) { 211 + dasd_put_device(base); 216 212 return -EFAULT; 213 + } 217 214 if (bdev != bdev->bd_contains) { 218 215 pr_warning("%s: The specified DASD is a partition and cannot " 219 216 "be formatted\n", 220 - dev_name(&block->base->cdev->dev)); 217 + dev_name(&base->cdev->dev)); 218 + dasd_put_device(base); 221 219 return -EINVAL; 222 220 } 223 - return dasd_format(block, &fdata); 221 + rc = dasd_format(base->block, &fdata); 222 + dasd_put_device(base); 223 + return rc; 224 224 } 225 225 226 226 #ifdef CONFIG_DASD_PROFILE ··· 360 340 static int 361 341 dasd_ioctl_set_ro(struct block_device *bdev, void __user *argp) 362 342 { 363 - struct dasd_block *block = bdev->bd_disk->private_data; 364 - int intval; 343 + struct dasd_device *base; 344 + int intval, rc; 365 345 366 346 if (!capable(CAP_SYS_ADMIN)) 367 347 return -EACCES; ··· 370 350 return -EINVAL; 371 351 if (get_user(intval, (int __user *)argp)) 372 352 return -EFAULT; 373 - if (!intval && test_bit(DASD_FLAG_DEVICE_RO, &block->base->flags)) 353 + base = dasd_device_from_gendisk(bdev->bd_disk); 354 + if (!base) 355 + return -ENODEV; 356 + if (!intval && test_bit(DASD_FLAG_DEVICE_RO, &base->flags)) { 357 + dasd_put_device(base); 374 358 return -EROFS; 359 + } 375 360 set_disk_ro(bdev->bd_disk, intval); 376 - return dasd_set_feature(block->base->cdev, DASD_FEATURE_READONLY, intval); 361 + rc = dasd_set_feature(base->cdev, DASD_FEATURE_READONLY, intval); 362 + dasd_put_device(base); 363 + return rc; 377 364 } 378 365 379 366 static int dasd_ioctl_readall_cmb(struct dasd_block *block, unsigned int cmd, ··· 399 372 int dasd_ioctl(struct block_device *bdev, fmode_t mode, 400 373 unsigned int cmd, unsigned long arg) 401 374 { 402 - struct dasd_block *block = bdev->bd_disk->private_data; 375 + struct dasd_block *block; 376 + struct dasd_device *base; 403 377 void __user *argp; 378 + int rc; 404 379 405 380 if (is_compat_task()) 406 381 argp = compat_ptr(arg); 407 382 else 408 383 argp = (void __user *)arg; 409 384 410 - if (!block) 411 - return -ENODEV; 412 - 413 385 if ((_IOC_DIR(cmd) != _IOC_NONE) && !arg) { 414 386 PRINT_DEBUG("empty data ptr"); 415 387 return -EINVAL; 416 388 } 417 389 390 + base = dasd_device_from_gendisk(bdev->bd_disk); 391 + if (!base) 392 + return -ENODEV; 393 + block = base->block; 394 + rc = 0; 418 395 switch (cmd) { 419 396 case BIODASDDISABLE: 420 - return dasd_ioctl_disable(bdev); 397 + rc = dasd_ioctl_disable(bdev); 398 + break; 421 399 case BIODASDENABLE: 422 - return dasd_ioctl_enable(bdev); 400 + rc = dasd_ioctl_enable(bdev); 401 + break; 423 402 case BIODASDQUIESCE: 424 - return dasd_ioctl_quiesce(block); 403 + rc = dasd_ioctl_quiesce(block); 404 + break; 425 405 case BIODASDRESUME: 426 - return dasd_ioctl_resume(block); 406 + rc = dasd_ioctl_resume(block); 407 + break; 427 408 case BIODASDFMT: 428 - return dasd_ioctl_format(bdev, argp); 409 + rc = dasd_ioctl_format(bdev, argp); 410 + break; 429 411 case BIODASDINFO: 430 - return dasd_ioctl_information(block, cmd, argp); 412 + rc = dasd_ioctl_information(block, cmd, argp); 413 + break; 431 414 case BIODASDINFO2: 432 - return dasd_ioctl_information(block, cmd, argp); 415 + rc = dasd_ioctl_information(block, cmd, argp); 416 + break; 433 417 case BIODASDPRRD: 434 - return dasd_ioctl_read_profile(block, argp); 418 + rc = dasd_ioctl_read_profile(block, argp); 419 + break; 435 420 case BIODASDPRRST: 436 - return dasd_ioctl_reset_profile(block); 421 + rc = dasd_ioctl_reset_profile(block); 422 + break; 437 423 case BLKROSET: 438 - return dasd_ioctl_set_ro(bdev, argp); 424 + rc = dasd_ioctl_set_ro(bdev, argp); 425 + break; 439 426 case DASDAPIVER: 440 - return dasd_ioctl_api_version(argp); 427 + rc = dasd_ioctl_api_version(argp); 428 + break; 441 429 case BIODASDCMFENABLE: 442 - return enable_cmf(block->base->cdev); 430 + rc = enable_cmf(base->cdev); 431 + break; 443 432 case BIODASDCMFDISABLE: 444 - return disable_cmf(block->base->cdev); 433 + rc = disable_cmf(base->cdev); 434 + break; 445 435 case BIODASDREADALLCMB: 446 - return dasd_ioctl_readall_cmb(block, cmd, argp); 436 + rc = dasd_ioctl_readall_cmb(block, cmd, argp); 437 + break; 447 438 default: 448 439 /* if the discipline has an ioctl method try it. */ 449 - if (block->base->discipline->ioctl) { 450 - int rval = block->base->discipline->ioctl(block, cmd, argp); 451 - if (rval != -ENOIOCTLCMD) 452 - return rval; 453 - } 454 - 455 - return -EINVAL; 440 + if (base->discipline->ioctl) { 441 + rc = base->discipline->ioctl(block, cmd, argp); 442 + if (rc == -ENOIOCTLCMD) 443 + rc = -EINVAL; 444 + } else 445 + rc = -EINVAL; 456 446 } 447 + dasd_put_device(base); 448 + return rc; 457 449 }
+12 -5
drivers/s390/cio/qdio_main.c
··· 407 407 q->q_stats.nr_sbals[pos]++; 408 408 } 409 409 410 - static void announce_buffer_error(struct qdio_q *q, int count) 410 + static void process_buffer_error(struct qdio_q *q, int count) 411 411 { 412 + unsigned char state = (q->is_input_q) ? SLSB_P_INPUT_NOT_INIT : 413 + SLSB_P_OUTPUT_NOT_INIT; 414 + 412 415 q->qdio_error |= QDIO_ERROR_SLSB_STATE; 413 416 414 417 /* special handling for no target buffer empty */ ··· 429 426 DBF_ERROR("F14:%2x F15:%2x", 430 427 q->sbal[q->first_to_check]->element[14].flags & 0xff, 431 428 q->sbal[q->first_to_check]->element[15].flags & 0xff); 429 + 430 + /* 431 + * Interrupts may be avoided as long as the error is present 432 + * so change the buffer state immediately to avoid starvation. 433 + */ 434 + set_buf_states(q, q->first_to_check, state, count); 432 435 } 433 436 434 437 static inline void inbound_primed(struct qdio_q *q, int count) ··· 515 506 account_sbals(q, count); 516 507 break; 517 508 case SLSB_P_INPUT_ERROR: 518 - announce_buffer_error(q, count); 519 - /* process the buffer, the upper layer will take care of it */ 509 + process_buffer_error(q, count); 520 510 q->first_to_check = add_buf(q->first_to_check, count); 521 511 atomic_sub(count, &q->nr_buf_used); 522 512 if (q->irq_ptr->perf_stat_enabled) ··· 685 677 account_sbals(q, count); 686 678 break; 687 679 case SLSB_P_OUTPUT_ERROR: 688 - announce_buffer_error(q, count); 689 - /* process the buffer, the upper layer will take care of it */ 680 + process_buffer_error(q, count); 690 681 q->first_to_check = add_buf(q->first_to_check, count); 691 682 atomic_sub(count, &q->nr_buf_used); 692 683 if (q->irq_ptr->perf_stat_enabled)
+1 -1
drivers/s390/kvm/kvm_virtio.c
··· 381 381 u16 subcode; 382 382 u32 param; 383 383 384 - kstat_cpu(smp_processor_id()).irqs[EXTINT_VRT]++; 385 384 subcode = ext_int_code >> 16; 386 385 if ((subcode & 0xff00) != VIRTIO_SUBCODE_64) 387 386 return; 387 + kstat_cpu(smp_processor_id()).irqs[EXTINT_VRT]++; 388 388 389 389 /* The LSB might be overloaded, we have to mask it */ 390 390 vq = (struct virtqueue *)(param64 & ~1UL);
+6 -3
drivers/scsi/device_handler/scsi_dh.c
··· 394 394 unsigned long flags; 395 395 struct scsi_device *sdev; 396 396 struct scsi_device_handler *scsi_dh = NULL; 397 + struct device *dev = NULL; 397 398 398 399 spin_lock_irqsave(q->queue_lock, flags); 399 400 sdev = q->queuedata; 400 401 if (sdev && sdev->scsi_dh_data) 401 402 scsi_dh = sdev->scsi_dh_data->scsi_dh; 402 - if (!scsi_dh || !get_device(&sdev->sdev_gendev) || 403 + dev = get_device(&sdev->sdev_gendev); 404 + if (!scsi_dh || !dev || 403 405 sdev->sdev_state == SDEV_CANCEL || 404 406 sdev->sdev_state == SDEV_DEL) 405 407 err = SCSI_DH_NOSYS; ··· 412 410 if (err) { 413 411 if (fn) 414 412 fn(data, err); 415 - return err; 413 + goto out; 416 414 } 417 415 418 416 if (scsi_dh->activate) 419 417 err = scsi_dh->activate(sdev, fn, data); 420 - put_device(&sdev->sdev_gendev); 418 + out: 419 + put_device(dev); 421 420 return err; 422 421 } 423 422 EXPORT_SYMBOL_GPL(scsi_dh_activate);
+21 -2
drivers/scsi/mpt2sas/mpt2sas_ctl.c
··· 688 688 goto out; 689 689 } 690 690 691 + /* Check for overflow and wraparound */ 692 + if (karg.data_sge_offset * 4 > ioc->request_sz || 693 + karg.data_sge_offset > (UINT_MAX / 4)) { 694 + ret = -EINVAL; 695 + goto out; 696 + } 697 + 691 698 /* copy in request message frame from user */ 692 699 if (copy_from_user(mpi_request, mf, karg.data_sge_offset*4)) { 693 700 printk(KERN_ERR "failure at %s:%d/%s()!\n", __FILE__, __LINE__, ··· 1970 1963 Mpi2DiagBufferPostReply_t *mpi_reply; 1971 1964 int rc, i; 1972 1965 u8 buffer_type; 1973 - unsigned long timeleft; 1966 + unsigned long timeleft, request_size, copy_size; 1974 1967 u16 smid; 1975 1968 u16 ioc_status; 1976 1969 u8 issue_reset = 0; ··· 2006 1999 return -ENOMEM; 2007 2000 } 2008 2001 2002 + request_size = ioc->diag_buffer_sz[buffer_type]; 2003 + 2009 2004 if ((karg.starting_offset % 4) || (karg.bytes_to_read % 4)) { 2010 2005 printk(MPT2SAS_ERR_FMT "%s: either the starting_offset " 2011 2006 "or bytes_to_read are not 4 byte aligned\n", ioc->name, ··· 2015 2006 return -EINVAL; 2016 2007 } 2017 2008 2009 + if (karg.starting_offset > request_size) 2010 + return -EINVAL; 2011 + 2018 2012 diag_data = (void *)(request_data + karg.starting_offset); 2019 2013 dctlprintk(ioc, printk(MPT2SAS_INFO_FMT "%s: diag_buffer(%p), " 2020 2014 "offset(%d), sz(%d)\n", ioc->name, __func__, 2021 2015 diag_data, karg.starting_offset, karg.bytes_to_read)); 2022 2016 2017 + /* Truncate data on requests that are too large */ 2018 + if ((diag_data + karg.bytes_to_read < diag_data) || 2019 + (diag_data + karg.bytes_to_read > request_data + request_size)) 2020 + copy_size = request_size - karg.starting_offset; 2021 + else 2022 + copy_size = karg.bytes_to_read; 2023 + 2023 2024 if (copy_to_user((void __user *)uarg->diagnostic_data, 2024 - diag_data, karg.bytes_to_read)) { 2025 + diag_data, copy_size)) { 2025 2026 printk(MPT2SAS_ERR_FMT "%s: Unable to write " 2026 2027 "mpt_diag_read_buffer_t data @ %p\n", ioc->name, 2027 2028 __func__, diag_data);
+3
drivers/scsi/pmcraid.c
··· 3814 3814 rc = -EFAULT; 3815 3815 goto out_free_buffer; 3816 3816 } 3817 + } else if (request_size < 0) { 3818 + rc = -EINVAL; 3819 + goto out_free_buffer; 3817 3820 } 3818 3821 3819 3822 /* check if we have any additional command parameters */
+6 -1
drivers/scsi/scsi_lib.c
··· 400 400 static void scsi_run_queue(struct request_queue *q) 401 401 { 402 402 struct scsi_device *sdev = q->queuedata; 403 - struct Scsi_Host *shost = sdev->host; 403 + struct Scsi_Host *shost; 404 404 LIST_HEAD(starved_list); 405 405 unsigned long flags; 406 406 407 + /* if the device is dead, sdev will be NULL, so no queue to run */ 408 + if (!sdev) 409 + return; 410 + 411 + shost = sdev->host; 407 412 if (scsi_target(sdev)->single_lun) 408 413 scsi_single_lun_run(sdev); 409 414
+8 -8
drivers/scsi/scsi_sysfs.c
··· 322 322 kfree(evt); 323 323 } 324 324 325 - if (sdev->request_queue) { 326 - sdev->request_queue->queuedata = NULL; 327 - /* user context needed to free queue */ 328 - scsi_free_queue(sdev->request_queue); 329 - /* temporary expedient, try to catch use of queue lock 330 - * after free of sdev */ 331 - sdev->request_queue = NULL; 332 - } 325 + /* NULL queue means the device can't be used */ 326 + sdev->request_queue = NULL; 333 327 334 328 scsi_target_reap(scsi_target(sdev)); 335 329 ··· 931 937 if (sdev->host->hostt->slave_destroy) 932 938 sdev->host->hostt->slave_destroy(sdev); 933 939 transport_destroy_device(dev); 940 + 941 + /* cause the request function to reject all I/O requests */ 942 + sdev->request_queue->queuedata = NULL; 943 + 944 + /* Freeing the queue signals to block that we're done */ 945 + scsi_free_queue(sdev->request_queue); 934 946 put_device(dev); 935 947 } 936 948
-4
drivers/staging/ft1000/ft1000-pcmcia/ft1000_hw.c
··· 2288 2288 free_netdev(dev); 2289 2289 return NULL; 2290 2290 } 2291 - 2292 - EXPORT_SYMBOL(init_ft1000_card); 2293 - EXPORT_SYMBOL(stop_ft1000_card); 2294 - EXPORT_SYMBOL(flarion_ft1000_cnt);
-3
drivers/staging/ft1000/ft1000-pcmcia/ft1000_proc.c
··· 214 214 remove_proc_entry(FT1000_PROC, init_net.proc_net); 215 215 unregister_netdevice_notifier(&ft1000_netdev_notifier); 216 216 } 217 - 218 - EXPORT_SYMBOL(ft1000InitProc); 219 - EXPORT_SYMBOL(ft1000CleanupProc);
+1 -1
drivers/staging/gma500/Kconfig
··· 1 1 config DRM_PSB 2 2 tristate "Intel GMA500 KMS Framebuffer" 3 - depends on DRM && PCI 3 + depends on DRM && PCI && X86 4 4 select FB_CFB_COPYAREA 5 5 select FB_CFB_FILLRECT 6 6 select FB_CFB_IMAGEBLIT
+1
drivers/staging/intel_sst/intelmid_v1_control.c
··· 28 28 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt 29 29 30 30 #include <linux/pci.h> 31 + #include <linux/delay.h> 31 32 #include <linux/file.h> 32 33 #include <asm/mrst.h> 33 34 #include <sound/pcm.h>
+1
drivers/staging/intel_sst/intelmid_v2_control.c
··· 29 29 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt 30 30 31 31 #include <linux/pci.h> 32 + #include <linux/delay.h> 32 33 #include <linux/file.h> 33 34 #include "intel_sst.h" 34 35 #include "intelmid_snd_control.h"
+1
drivers/staging/olpc_dcon/olpc_dcon_xo_1.c
··· 12 12 */ 13 13 #include <linux/cs5535.h> 14 14 #include <linux/gpio.h> 15 + #include <linux/delay.h> 15 16 #include <asm/olpc.h> 16 17 17 18 #include "olpc_dcon.h"
+1 -1
drivers/staging/rt2860/common/cmm_data_pci.c
··· 444 444 return (NDIS_STATUS_FAILURE); 445 445 } 446 446 } 447 - /* Drop not U2M frames, can't's drop here because we will drop beacon in this case */ 447 + /* Drop not U2M frames, can't drop here because we will drop beacon in this case */ 448 448 /* I am kind of doubting the U2M bit operation */ 449 449 /* if (pRxD->U2M == 0) */ 450 450 /* return(NDIS_STATUS_FAILURE); */
+1 -1
drivers/staging/rt2860/common/cmm_data_usb.c
··· 860 860 DBGPRINT_RAW(RT_DEBUG_ERROR, ("received packet too long\n")); 861 861 return NDIS_STATUS_FAILURE; 862 862 } 863 - /* Drop not U2M frames, can't's drop here because we will drop beacon in this case */ 863 + /* Drop not U2M frames, can't drop here because we will drop beacon in this case */ 864 864 /* I am kind of doubting the U2M bit operation */ 865 865 /* if (pRxD->U2M == 0) */ 866 866 /* return(NDIS_STATUS_FAILURE); */
+1 -1
drivers/staging/rts_pstor/debug.h
··· 28 28 29 29 #define RTSX_STOR "rts_pstor: " 30 30 31 - #if CONFIG_RTS_PSTOR_DEBUG 31 + #ifdef CONFIG_RTS_PSTOR_DEBUG 32 32 #define RTSX_DEBUGP(x...) printk(KERN_DEBUG RTSX_STOR x) 33 33 #define RTSX_DEBUGPN(x...) printk(KERN_DEBUG x) 34 34 #define RTSX_DEBUGPX(x...) printk(x)
+1
drivers/staging/rts_pstor/ms.c
··· 23 23 #include <linux/blkdev.h> 24 24 #include <linux/kthread.h> 25 25 #include <linux/sched.h> 26 + #include <linux/vmalloc.h> 26 27 27 28 #include "rtsx.h" 28 29 #include "rtsx_transport.h"
+3 -2
drivers/staging/rts_pstor/rtsx_chip.c
··· 24 24 #include <linux/kthread.h> 25 25 #include <linux/sched.h> 26 26 #include <linux/workqueue.h> 27 + #include <linux/vmalloc.h> 27 28 28 29 #include "rtsx.h" 29 30 #include "rtsx_transport.h" ··· 1312 1311 1313 1312 #ifdef SUPPORT_OCP 1314 1313 if (CHECK_LUN_MODE(chip, SD_MS_2LUN)) { 1315 - #if CONFIG_RTS_PSTOR_DEBUG 1314 + #ifdef CONFIG_RTS_PSTOR_DEBUG 1316 1315 if (chip->ocp_stat & (SD_OC_NOW | SD_OC_EVER | MS_OC_NOW | MS_OC_EVER)) { 1317 1316 RTSX_DEBUGP("Over current, OCPSTAT is 0x%x\n", chip->ocp_stat); 1318 1317 } 1319 - #endif 1318 + #endif 1320 1319 1321 1320 if (chip->ocp_stat & (SD_OC_NOW | SD_OC_EVER)) { 1322 1321 if (chip->card_exist & SD_CARD) {
+1
drivers/staging/rts_pstor/rtsx_scsi.c
··· 23 23 #include <linux/blkdev.h> 24 24 #include <linux/kthread.h> 25 25 #include <linux/sched.h> 26 + #include <linux/vmalloc.h> 26 27 27 28 #include "rtsx.h" 28 29 #include "rtsx_transport.h"
+2 -2
drivers/staging/rts_pstor/sd.c
··· 909 909 RTSX_WRITE_REG(chip, SD_VPCLK0_CTL, PHASE_NOT_RESET, PHASE_NOT_RESET); 910 910 RTSX_WRITE_REG(chip, CLK_CTL, CHANGE_CLK, 0); 911 911 } else { 912 - #if CONFIG_RTS_PSTOR_DEBUG 912 + #ifdef CONFIG_RTS_PSTOR_DEBUG 913 913 rtsx_read_register(chip, SD_VP_CTL, &val); 914 914 RTSX_DEBUGP("SD_VP_CTL: 0x%x\n", val); 915 915 rtsx_read_register(chip, SD_DCMPS_CTL, &val); ··· 958 958 return STATUS_SUCCESS; 959 959 960 960 Fail: 961 - #if CONFIG_RTS_PSTOR_DEBUG 961 + #ifdef CONFIG_RTS_PSTOR_DEBUG 962 962 rtsx_read_register(chip, SD_VP_CTL, &val); 963 963 RTSX_DEBUGP("SD_VP_CTL: 0x%x\n", val); 964 964 rtsx_read_register(chip, SD_DCMPS_CTL, &val);
+1 -1
drivers/staging/rts_pstor/trace.h
··· 82 82 #define TRACE_GOTO(chip, label) goto label 83 83 #endif 84 84 85 - #if CONFIG_RTS_PSTOR_DEBUG 85 + #ifdef CONFIG_RTS_PSTOR_DEBUG 86 86 static inline void rtsx_dump(u8 *buf, int buf_len) 87 87 { 88 88 int i;
+1
drivers/staging/rts_pstor/xd.c
··· 23 23 #include <linux/blkdev.h> 24 24 #include <linux/kthread.h> 25 25 #include <linux/sched.h> 26 + #include <linux/vmalloc.h> 26 27 27 28 #include "rtsx.h" 28 29 #include "rtsx_transport.h"
+1
drivers/staging/solo6x10/Kconfig
··· 2 2 tristate "Softlogic 6x10 MPEG codec cards" 3 3 depends on PCI && VIDEO_DEV && SND && I2C 4 4 select VIDEOBUF_DMA_SG 5 + select SND_PCM 5 6 ---help--- 6 7 This driver supports the Softlogic based MPEG-4 and h.264 codec 7 8 codec cards.
+1 -1
drivers/staging/spectra/ffsport.c
··· 653 653 } 654 654 dev->queue->queuedata = dev; 655 655 656 - /* As Linux block layer does't support >4KB hardware sector, */ 656 + /* As Linux block layer doesn't support >4KB hardware sector, */ 657 657 /* Here we force report 512 byte hardware sector size to Kernel */ 658 658 blk_queue_logical_block_size(dev->queue, 512); 659 659
+1 -1
drivers/staging/tidspbridge/dynload/cload.c
··· 718 718 * as a temporary for .dllview record construction. 719 719 * Allocate storage for the whole table. Add 1 to the section count 720 720 * in case a trampoline section is auto-generated as well as the 721 - * size of the trampoline section name so DLLView does't get lost. 721 + * size of the trampoline section name so DLLView doesn't get lost. 722 722 */ 723 723 724 724 siz = sym_count * sizeof(struct local_symbol);
+1 -1
drivers/staging/tty/specialix.c
··· 978 978 spin_lock_irqsave(&bp->lock, flags); 979 979 sx_out(bp, CD186x_CAR, port_No(port)); 980 980 981 - /* The Specialix board does't implement the RTS lines. 981 + /* The Specialix board doesn't implement the RTS lines. 982 982 They are used to set the IRQ level. Don't touch them. */ 983 983 if (sx_crtscts(tty)) 984 984 port->MSVR = MSVR_DTR | (sx_in(bp, CD186x_MSVR) & MSVR_RTS);
+5 -6
drivers/staging/usbip/vhci_hcd.c
··· 876 876 } 877 877 878 878 /* kill threads related to this sdev, if v.c. exists */ 879 - kthread_stop(vdev->ud.tcp_rx); 880 - kthread_stop(vdev->ud.tcp_tx); 879 + if (vdev->ud.tcp_rx) 880 + kthread_stop(vdev->ud.tcp_rx); 881 + if (vdev->ud.tcp_tx) 882 + kthread_stop(vdev->ud.tcp_tx); 881 883 882 884 usbip_uinfo("stop threads\n"); 883 885 ··· 950 948 static void vhci_device_init(struct vhci_device *vdev) 951 949 { 952 950 memset(vdev, 0, sizeof(*vdev)); 953 - 954 - vdev->ud.tcp_rx = kthread_create(vhci_rx_loop, &vdev->ud, "vhci_rx"); 955 - vdev->ud.tcp_tx = kthread_create(vhci_tx_loop, &vdev->ud, "vhci_tx"); 956 951 957 952 vdev->ud.side = USBIP_VHCI; 958 953 vdev->ud.status = VDEV_ST_NULL; ··· 1138 1139 usbip_uerr("create hcd failed\n"); 1139 1140 return -ENOMEM; 1140 1141 } 1141 - 1142 + hcd->has_tt = 1; 1142 1143 1143 1144 /* this is private data for vhci_hcd */ 1144 1145 the_controller = hcd_to_vhci(hcd);
+4 -3
drivers/staging/usbip/vhci_sysfs.c
··· 21 21 #include "vhci.h" 22 22 23 23 #include <linux/in.h> 24 + #include <linux/kthread.h> 24 25 25 26 /* TODO: refine locking ?*/ 26 27 ··· 221 220 vdev->ud.tcp_socket = socket; 222 221 vdev->ud.status = VDEV_ST_NOTASSIGNED; 223 222 224 - wake_up_process(vdev->ud.tcp_rx); 225 - wake_up_process(vdev->ud.tcp_tx); 226 - 227 223 spin_unlock(&vdev->ud.lock); 228 224 spin_unlock(&the_controller->lock); 229 225 /* end the lock */ 226 + 227 + vdev->ud.tcp_rx = kthread_run(vhci_rx_loop, &vdev->ud, "vhci_rx"); 228 + vdev->ud.tcp_tx = kthread_run(vhci_tx_loop, &vdev->ud, "vhci_tx"); 230 229 231 230 rh_port_connect(rhport, speed); 232 231
+1 -1
drivers/staging/wlan-ng/cfg80211.c
··· 273 273 } 274 274 275 275 int prism2_set_default_key(struct wiphy *wiphy, struct net_device *dev, 276 - u8 key_index) 276 + u8 key_index, bool unicast, bool multicast) 277 277 { 278 278 wlandevice_t *wlandev = dev->ml_priv; 279 279
+20
drivers/usb/host/ehci-omap.c
··· 40 40 #include <linux/slab.h> 41 41 #include <linux/usb/ulpi.h> 42 42 #include <plat/usb.h> 43 + #include <linux/regulator/consumer.h> 43 44 44 45 /* EHCI Register Set */ 45 46 #define EHCI_INSNREG04 (0xA0) ··· 119 118 struct ehci_hcd *omap_ehci; 120 119 int ret = -ENODEV; 121 120 int irq; 121 + int i; 122 + char supply[7]; 122 123 123 124 if (usb_disabled()) 124 125 return -ENODEV; ··· 160 157 hcd->rsrc_start = res->start; 161 158 hcd->rsrc_len = resource_size(res); 162 159 hcd->regs = regs; 160 + 161 + /* get ehci regulator and enable */ 162 + for (i = 0 ; i < OMAP3_HS_USB_PORTS ; i++) { 163 + if (pdata->port_mode[i] != OMAP_EHCI_PORT_MODE_PHY) { 164 + pdata->regulator[i] = NULL; 165 + continue; 166 + } 167 + snprintf(supply, sizeof(supply), "hsusb%d", i); 168 + pdata->regulator[i] = regulator_get(dev, supply); 169 + if (IS_ERR(pdata->regulator[i])) { 170 + pdata->regulator[i] = NULL; 171 + dev_dbg(dev, 172 + "failed to get ehci port%d regulator\n", i); 173 + } else { 174 + regulator_enable(pdata->regulator[i]); 175 + } 176 + } 163 177 164 178 ret = omap_usbhs_enable(dev); 165 179 if (ret) {
+1
drivers/usb/host/isp1760-hcd.c
··· 1633 1633 ints[i].qh = NULL; 1634 1634 ints[i].qtd = NULL; 1635 1635 1636 + urb->status = status; 1636 1637 isp1760_urb_done(hcd, urb); 1637 1638 if (qtd) 1638 1639 pe(hcd, qh, qtd);
+17 -2
drivers/usb/host/xhci-hub.c
··· 777 777 if (t1 != t2) 778 778 xhci_writel(xhci, t2, port_array[port_index]); 779 779 780 - if (DEV_HIGHSPEED(t1)) { 780 + if (hcd->speed != HCD_USB3) { 781 781 /* enable remote wake up for USB 2.0 */ 782 782 u32 __iomem *addr; 783 783 u32 tmp; ··· 866 866 temp |= PORT_LINK_STROBE | XDEV_U0; 867 867 xhci_writel(xhci, temp, port_array[port_index]); 868 868 } 869 + /* wait for the port to enter U0 and report port link 870 + * state change. 871 + */ 872 + spin_unlock_irqrestore(&xhci->lock, flags); 873 + msleep(20); 874 + spin_lock_irqsave(&xhci->lock, flags); 875 + 876 + /* Clear PLC */ 877 + temp = xhci_readl(xhci, port_array[port_index]); 878 + if (temp & PORT_PLC) { 879 + temp = xhci_port_state_to_neutral(temp); 880 + temp |= PORT_PLC; 881 + xhci_writel(xhci, temp, port_array[port_index]); 882 + } 883 + 869 884 slot_id = xhci_find_slot_id_by_port(hcd, 870 885 xhci, port_index + 1); 871 886 if (slot_id) ··· 888 873 } else 889 874 xhci_writel(xhci, temp, port_array[port_index]); 890 875 891 - if (DEV_HIGHSPEED(temp)) { 876 + if (hcd->speed != HCD_USB3) { 892 877 /* disable remote wake up for USB 2.0 */ 893 878 u32 __iomem *addr; 894 879 u32 tmp;
+2 -4
drivers/usb/musb/musb_gadget.c
··· 1887 1887 otg_set_vbus(musb->xceiv, 1); 1888 1888 1889 1889 hcd->self.uses_pio_for_control = 1; 1890 - 1891 - if (musb->xceiv->last_event == USB_EVENT_NONE) 1892 - pm_runtime_put(musb->controller); 1893 - 1894 1890 } 1891 + if (musb->xceiv->last_event == USB_EVENT_NONE) 1892 + pm_runtime_put(musb->controller); 1895 1893 1896 1894 return 0; 1897 1895
+1 -1
drivers/usb/musb/omap2430.c
··· 270 270 DBG(4, "VBUS Disconnect\n"); 271 271 272 272 #ifdef CONFIG_USB_GADGET_MUSB_HDRC 273 - if (is_otg_enabled(musb)) 273 + if (is_otg_enabled(musb) || is_peripheral_enabled(musb)) 274 274 if (musb->gadget_driver) 275 275 #endif 276 276 {
+97
drivers/watchdog/iTCO_wdt.c
··· 35 35 * document number 324645-001, 324646-001: Cougar Point (CPT) 36 36 * document number TBD : Patsburg (PBG) 37 37 * document number TBD : DH89xxCC 38 + * document number TBD : Panther Point 38 39 */ 39 40 40 41 /* ··· 154 153 TCO_PBG1, /* Patsburg */ 155 154 TCO_PBG2, /* Patsburg */ 156 155 TCO_DH89XXCC, /* DH89xxCC */ 156 + TCO_PPT0, /* Panther Point */ 157 + TCO_PPT1, /* Panther Point */ 158 + TCO_PPT2, /* Panther Point */ 159 + TCO_PPT3, /* Panther Point */ 160 + TCO_PPT4, /* Panther Point */ 161 + TCO_PPT5, /* Panther Point */ 162 + TCO_PPT6, /* Panther Point */ 163 + TCO_PPT7, /* Panther Point */ 164 + TCO_PPT8, /* Panther Point */ 165 + TCO_PPT9, /* Panther Point */ 166 + TCO_PPT10, /* Panther Point */ 167 + TCO_PPT11, /* Panther Point */ 168 + TCO_PPT12, /* Panther Point */ 169 + TCO_PPT13, /* Panther Point */ 170 + TCO_PPT14, /* Panther Point */ 171 + TCO_PPT15, /* Panther Point */ 172 + TCO_PPT16, /* Panther Point */ 173 + TCO_PPT17, /* Panther Point */ 174 + TCO_PPT18, /* Panther Point */ 175 + TCO_PPT19, /* Panther Point */ 176 + TCO_PPT20, /* Panther Point */ 177 + TCO_PPT21, /* Panther Point */ 178 + TCO_PPT22, /* Panther Point */ 179 + TCO_PPT23, /* Panther Point */ 180 + TCO_PPT24, /* Panther Point */ 181 + TCO_PPT25, /* Panther Point */ 182 + TCO_PPT26, /* Panther Point */ 183 + TCO_PPT27, /* Panther Point */ 184 + TCO_PPT28, /* Panther Point */ 185 + TCO_PPT29, /* Panther Point */ 186 + TCO_PPT30, /* Panther Point */ 187 + TCO_PPT31, /* Panther Point */ 157 188 }; 158 189 159 190 static struct { ··· 277 244 {"Patsburg", 2}, 278 245 {"Patsburg", 2}, 279 246 {"DH89xxCC", 2}, 247 + {"Panther Point", 2}, 248 + {"Panther Point", 2}, 249 + {"Panther Point", 2}, 250 + {"Panther Point", 2}, 251 + {"Panther Point", 2}, 252 + {"Panther Point", 2}, 253 + {"Panther Point", 2}, 254 + {"Panther Point", 2}, 255 + {"Panther Point", 2}, 256 + {"Panther Point", 2}, 257 + {"Panther Point", 2}, 258 + {"Panther Point", 2}, 259 + {"Panther Point", 2}, 260 + {"Panther Point", 2}, 261 + {"Panther Point", 2}, 262 + {"Panther Point", 2}, 263 + {"Panther Point", 2}, 264 + {"Panther Point", 2}, 265 + {"Panther Point", 2}, 266 + {"Panther Point", 2}, 267 + {"Panther Point", 2}, 268 + {"Panther Point", 2}, 269 + {"Panther Point", 2}, 270 + {"Panther Point", 2}, 271 + {"Panther Point", 2}, 272 + {"Panther Point", 2}, 273 + {"Panther Point", 2}, 274 + {"Panther Point", 2}, 275 + {"Panther Point", 2}, 276 + {"Panther Point", 2}, 277 + {"Panther Point", 2}, 278 + {"Panther Point", 2}, 280 279 {NULL, 0} 281 280 }; 282 281 ··· 428 363 { ITCO_PCI_DEVICE(0x1d40, TCO_PBG1)}, 429 364 { ITCO_PCI_DEVICE(0x1d41, TCO_PBG2)}, 430 365 { ITCO_PCI_DEVICE(0x2310, TCO_DH89XXCC)}, 366 + { ITCO_PCI_DEVICE(0x1e40, TCO_PPT0)}, 367 + { ITCO_PCI_DEVICE(0x1e41, TCO_PPT1)}, 368 + { ITCO_PCI_DEVICE(0x1e42, TCO_PPT2)}, 369 + { ITCO_PCI_DEVICE(0x1e43, TCO_PPT3)}, 370 + { ITCO_PCI_DEVICE(0x1e44, TCO_PPT4)}, 371 + { ITCO_PCI_DEVICE(0x1e45, TCO_PPT5)}, 372 + { ITCO_PCI_DEVICE(0x1e46, TCO_PPT6)}, 373 + { ITCO_PCI_DEVICE(0x1e47, TCO_PPT7)}, 374 + { ITCO_PCI_DEVICE(0x1e48, TCO_PPT8)}, 375 + { ITCO_PCI_DEVICE(0x1e49, TCO_PPT9)}, 376 + { ITCO_PCI_DEVICE(0x1e4a, TCO_PPT10)}, 377 + { ITCO_PCI_DEVICE(0x1e4b, TCO_PPT11)}, 378 + { ITCO_PCI_DEVICE(0x1e4c, TCO_PPT12)}, 379 + { ITCO_PCI_DEVICE(0x1e4d, TCO_PPT13)}, 380 + { ITCO_PCI_DEVICE(0x1e4e, TCO_PPT14)}, 381 + { ITCO_PCI_DEVICE(0x1e4f, TCO_PPT15)}, 382 + { ITCO_PCI_DEVICE(0x1e50, TCO_PPT16)}, 383 + { ITCO_PCI_DEVICE(0x1e51, TCO_PPT17)}, 384 + { ITCO_PCI_DEVICE(0x1e52, TCO_PPT18)}, 385 + { ITCO_PCI_DEVICE(0x1e53, TCO_PPT19)}, 386 + { ITCO_PCI_DEVICE(0x1e54, TCO_PPT20)}, 387 + { ITCO_PCI_DEVICE(0x1e55, TCO_PPT21)}, 388 + { ITCO_PCI_DEVICE(0x1e56, TCO_PPT22)}, 389 + { ITCO_PCI_DEVICE(0x1e57, TCO_PPT23)}, 390 + { ITCO_PCI_DEVICE(0x1e58, TCO_PPT24)}, 391 + { ITCO_PCI_DEVICE(0x1e59, TCO_PPT25)}, 392 + { ITCO_PCI_DEVICE(0x1e5a, TCO_PPT26)}, 393 + { ITCO_PCI_DEVICE(0x1e5b, TCO_PPT27)}, 394 + { ITCO_PCI_DEVICE(0x1e5c, TCO_PPT28)}, 395 + { ITCO_PCI_DEVICE(0x1e5d, TCO_PPT29)}, 396 + { ITCO_PCI_DEVICE(0x1e5e, TCO_PPT30)}, 397 + { ITCO_PCI_DEVICE(0x1e5f, TCO_PPT31)}, 431 398 { 0, }, /* End of list */ 432 399 }; 433 400 MODULE_DEVICE_TABLE(pci, iTCO_wdt_pci_tbl);
+1 -1
fs/btrfs/ctree.h
··· 718 718 u64 total_bytes; /* total bytes in the space, 719 719 this doesn't take mirrors into account */ 720 720 u64 bytes_used; /* total bytes used, 721 - this does't take mirrors into account */ 721 + this doesn't take mirrors into account */ 722 722 u64 bytes_pinned; /* total bytes pinned, will be freed when the 723 723 transaction finishes */ 724 724 u64 bytes_reserved; /* total bytes the allocator has reserved for
+1
fs/btrfs/disk-io.c
··· 2824 2824 2825 2825 spin_lock(&delayed_refs->lock); 2826 2826 if (delayed_refs->num_entries == 0) { 2827 + spin_unlock(&delayed_refs->lock); 2827 2828 printk(KERN_INFO "delayed_refs has NO entry\n"); 2828 2829 return ret; 2829 2830 }
+4
fs/btrfs/extent-tree.c
··· 8059 8059 u64 group_start = group->key.objectid; 8060 8060 new_extents = kmalloc(sizeof(*new_extents), 8061 8061 GFP_NOFS); 8062 + if (!new_extents) { 8063 + ret = -ENOMEM; 8064 + goto out; 8065 + } 8062 8066 nr_extents = 1; 8063 8067 ret = get_new_locations(reloc_inode, 8064 8068 extent_key,
+1 -1
fs/btrfs/extent_io.c
··· 2681 2681 prefetchw(&page->flags); 2682 2682 list_del(&page->lru); 2683 2683 if (!add_to_page_cache_lru(page, mapping, 2684 - page->index, GFP_KERNEL)) { 2684 + page->index, GFP_NOFS)) { 2685 2685 __extent_read_full_page(tree, page, get_extent, 2686 2686 &bio, 0, &bio_flags); 2687 2687 }
+8 -5
fs/btrfs/free-space-cache.c
··· 1768 1768 1769 1769 while ((node = rb_last(&block_group->free_space_offset)) != NULL) { 1770 1770 info = rb_entry(node, struct btrfs_free_space, offset_index); 1771 - unlink_free_space(block_group, info); 1772 - if (info->bitmap) 1773 - kfree(info->bitmap); 1774 - kmem_cache_free(btrfs_free_space_cachep, info); 1771 + if (!info->bitmap) { 1772 + unlink_free_space(block_group, info); 1773 + kmem_cache_free(btrfs_free_space_cachep, info); 1774 + } else { 1775 + free_bitmap(block_group, info); 1776 + } 1777 + 1775 1778 if (need_resched()) { 1776 1779 spin_unlock(&block_group->tree_lock); 1777 1780 cond_resched(); ··· 2304 2301 start = entry->offset; 2305 2302 bytes = min(entry->bytes, end - start); 2306 2303 unlink_free_space(block_group, entry); 2307 - kfree(entry); 2304 + kmem_cache_free(btrfs_free_space_cachep, entry); 2308 2305 } 2309 2306 2310 2307 spin_unlock(&block_group->tree_lock);
+13 -7
fs/btrfs/inode.c
··· 954 954 1, 0, NULL, GFP_NOFS); 955 955 while (start < end) { 956 956 async_cow = kmalloc(sizeof(*async_cow), GFP_NOFS); 957 + BUG_ON(!async_cow); 957 958 async_cow->inode = inode; 958 959 async_cow->root = root; 959 960 async_cow->locked_page = locked_page; ··· 4732 4731 inode = btrfs_new_inode(trans, root, dir, dentry->d_name.name, 4733 4732 dentry->d_name.len, dir->i_ino, objectid, 4734 4733 BTRFS_I(dir)->block_group, mode, &index); 4735 - err = PTR_ERR(inode); 4736 - if (IS_ERR(inode)) 4734 + if (IS_ERR(inode)) { 4735 + err = PTR_ERR(inode); 4737 4736 goto out_unlock; 4737 + } 4738 4738 4739 4739 err = btrfs_init_inode_security(trans, inode, dir, &dentry->d_name); 4740 4740 if (err) { ··· 4794 4792 inode = btrfs_new_inode(trans, root, dir, dentry->d_name.name, 4795 4793 dentry->d_name.len, dir->i_ino, objectid, 4796 4794 BTRFS_I(dir)->block_group, mode, &index); 4797 - err = PTR_ERR(inode); 4798 - if (IS_ERR(inode)) 4795 + if (IS_ERR(inode)) { 4796 + err = PTR_ERR(inode); 4799 4797 goto out_unlock; 4798 + } 4800 4799 4801 4800 err = btrfs_init_inode_security(trans, inode, dir, &dentry->d_name); 4802 4801 if (err) { ··· 5002 4999 inline_size = btrfs_file_extent_inline_item_len(leaf, 5003 5000 btrfs_item_nr(leaf, path->slots[0])); 5004 5001 tmp = kmalloc(inline_size, GFP_NOFS); 5002 + if (!tmp) 5003 + return -ENOMEM; 5005 5004 ptr = btrfs_file_extent_inline_start(item); 5006 5005 5007 5006 read_extent_buffer(leaf, tmp, ptr, inline_size); ··· 6041 6036 ret = btrfs_map_block(map_tree, READ, start_sector << 9, 6042 6037 &map_length, NULL, 0); 6043 6038 if (ret) { 6044 - bio_put(bio); 6039 + bio_put(orig_bio); 6045 6040 return -EIO; 6046 6041 } 6047 6042 ··· 7278 7273 dentry->d_name.len, dir->i_ino, objectid, 7279 7274 BTRFS_I(dir)->block_group, S_IFLNK|S_IRWXUGO, 7280 7275 &index); 7281 - err = PTR_ERR(inode); 7282 - if (IS_ERR(inode)) 7276 + if (IS_ERR(inode)) { 7277 + err = PTR_ERR(inode); 7283 7278 goto out_unlock; 7279 + } 7284 7280 7285 7281 err = btrfs_init_inode_security(trans, inode, dir, &dentry->d_name); 7286 7282 if (err) {
+5 -2
fs/btrfs/tree-log.c
··· 2209 2209 2210 2210 log = root->log_root; 2211 2211 path = btrfs_alloc_path(); 2212 - if (!path) 2213 - return -ENOMEM; 2212 + if (!path) { 2213 + err = -ENOMEM; 2214 + goto out_unlock; 2215 + } 2214 2216 2215 2217 di = btrfs_lookup_dir_item(trans, log, path, dir->i_ino, 2216 2218 name, name_len, -1); ··· 2273 2271 } 2274 2272 fail: 2275 2273 btrfs_free_path(path); 2274 + out_unlock: 2276 2275 mutex_unlock(&BTRFS_I(dir)->log_mutex); 2277 2276 if (ret == -ENOSPC) { 2278 2277 root->fs_info->last_trans_log_full_commit = trans->transid;
+10
fs/btrfs/volumes.c
··· 155 155 unsigned long limit; 156 156 unsigned long last_waited = 0; 157 157 int force_reg = 0; 158 + struct blk_plug plug; 159 + 160 + /* 161 + * this function runs all the bios we've collected for 162 + * a particular device. We don't want to wander off to 163 + * another device without first sending all of these down. 164 + * So, setup a plug here and finish it off before we return 165 + */ 166 + blk_start_plug(&plug); 158 167 159 168 bdi = blk_get_backing_dev_info(device->bdev); 160 169 fs_info = device->dev_root->fs_info; ··· 303 294 spin_unlock(&device->io_lock); 304 295 305 296 done: 297 + blk_finish_plug(&plug); 306 298 return 0; 307 299 } 308 300
+7
fs/ceph/addr.c
··· 775 775 ci->i_truncate_seq, 776 776 ci->i_truncate_size, 777 777 &inode->i_mtime, true, 1, 0); 778 + 779 + if (!req) { 780 + rc = -ENOMEM; 781 + unlock_page(page); 782 + break; 783 + } 784 + 778 785 max_pages = req->r_num_pages; 779 786 780 787 alloc_page_vec(fsc, req);
+7 -7
fs/ceph/caps.c
··· 1331 1331 } 1332 1332 1333 1333 /* 1334 - * Mark caps dirty. If inode is newly dirty, add to the global dirty 1335 - * list. 1334 + * Mark caps dirty. If inode is newly dirty, return the dirty flags. 1335 + * Caller is then responsible for calling __mark_inode_dirty with the 1336 + * returned flags value. 1336 1337 */ 1337 - void __ceph_mark_dirty_caps(struct ceph_inode_info *ci, int mask) 1338 + int __ceph_mark_dirty_caps(struct ceph_inode_info *ci, int mask) 1338 1339 { 1339 1340 struct ceph_mds_client *mdsc = 1340 1341 ceph_sb_to_client(ci->vfs_inode.i_sb)->mdsc; ··· 1358 1357 list_add(&ci->i_dirty_item, &mdsc->cap_dirty); 1359 1358 spin_unlock(&mdsc->cap_dirty_lock); 1360 1359 if (ci->i_flushing_caps == 0) { 1361 - igrab(inode); 1360 + ihold(inode); 1362 1361 dirty |= I_DIRTY_SYNC; 1363 1362 } 1364 1363 } ··· 1366 1365 if (((was | ci->i_flushing_caps) & CEPH_CAP_FILE_BUFFER) && 1367 1366 (mask & CEPH_CAP_FILE_BUFFER)) 1368 1367 dirty |= I_DIRTY_DATASYNC; 1369 - if (dirty) 1370 - __mark_inode_dirty(inode, dirty); 1371 1368 __cap_delay_requeue(mdsc, ci); 1369 + return dirty; 1372 1370 } 1373 1371 1374 1372 /* ··· 1991 1991 ci->i_wr_ref++; 1992 1992 if (got & CEPH_CAP_FILE_BUFFER) { 1993 1993 if (ci->i_wrbuffer_ref == 0) 1994 - igrab(&ci->vfs_inode); 1994 + ihold(&ci->vfs_inode); 1995 1995 ci->i_wrbuffer_ref++; 1996 1996 dout("__take_cap_refs %p wrbuffer %d -> %d (?)\n", 1997 1997 &ci->vfs_inode, ci->i_wrbuffer_ref-1, ci->i_wrbuffer_ref);
+4 -1
fs/ceph/file.c
··· 734 734 } 735 735 } 736 736 if (ret >= 0) { 737 + int dirty; 737 738 spin_lock(&inode->i_lock); 738 - __ceph_mark_dirty_caps(ci, CEPH_CAP_FILE_WR); 739 + dirty = __ceph_mark_dirty_caps(ci, CEPH_CAP_FILE_WR); 739 740 spin_unlock(&inode->i_lock); 741 + if (dirty) 742 + __mark_inode_dirty(inode, dirty); 740 743 } 741 744 742 745 out:
+5 -1
fs/ceph/inode.c
··· 1567 1567 int release = 0, dirtied = 0; 1568 1568 int mask = 0; 1569 1569 int err = 0; 1570 + int inode_dirty_flags = 0; 1570 1571 1571 1572 if (ceph_snap(inode) != CEPH_NOSNAP) 1572 1573 return -EROFS; ··· 1726 1725 dout("setattr %p ATTR_FILE ... hrm!\n", inode); 1727 1726 1728 1727 if (dirtied) { 1729 - __ceph_mark_dirty_caps(ci, dirtied); 1728 + inode_dirty_flags = __ceph_mark_dirty_caps(ci, dirtied); 1730 1729 inode->i_ctime = CURRENT_TIME; 1731 1730 } 1732 1731 1733 1732 release &= issued; 1734 1733 spin_unlock(&inode->i_lock); 1734 + 1735 + if (inode_dirty_flags) 1736 + __mark_inode_dirty(inode, inode_dirty_flags); 1735 1737 1736 1738 if (mask) { 1737 1739 req->r_inode = igrab(inode);
+1 -1
fs/ceph/super.h
··· 506 506 { 507 507 return ci->i_dirty_caps | ci->i_flushing_caps; 508 508 } 509 - extern void __ceph_mark_dirty_caps(struct ceph_inode_info *ci, int mask); 509 + extern int __ceph_mark_dirty_caps(struct ceph_inode_info *ci, int mask); 510 510 511 511 extern int ceph_caps_revoking(struct ceph_inode_info *ci, int mask); 512 512 extern int __ceph_caps_used(struct ceph_inode_info *ci);
+8 -4
fs/ceph/xattr.c
··· 703 703 struct ceph_inode_xattr *xattr = NULL; 704 704 int issued; 705 705 int required_blob_size; 706 + int dirty; 706 707 707 708 if (ceph_snap(inode) != CEPH_NOSNAP) 708 709 return -EROFS; ··· 764 763 dout("setxattr %p issued %s\n", inode, ceph_cap_string(issued)); 765 764 err = __set_xattr(ci, newname, name_len, newval, 766 765 val_len, 1, 1, 1, &xattr); 767 - __ceph_mark_dirty_caps(ci, CEPH_CAP_XATTR_EXCL); 766 + dirty = __ceph_mark_dirty_caps(ci, CEPH_CAP_XATTR_EXCL); 768 767 ci->i_xattrs.dirty = true; 769 768 inode->i_ctime = CURRENT_TIME; 770 769 spin_unlock(&inode->i_lock); 771 - 770 + if (dirty) 771 + __mark_inode_dirty(inode, dirty); 772 772 return err; 773 773 774 774 do_sync: ··· 812 810 struct ceph_vxattr_cb *vxattrs = ceph_inode_vxattrs(inode); 813 811 int issued; 814 812 int err; 813 + int dirty; 815 814 816 815 if (ceph_snap(inode) != CEPH_NOSNAP) 817 816 return -EROFS; ··· 836 833 goto do_sync; 837 834 838 835 err = __remove_xattr_by_name(ceph_inode(inode), name); 839 - __ceph_mark_dirty_caps(ci, CEPH_CAP_XATTR_EXCL); 836 + dirty = __ceph_mark_dirty_caps(ci, CEPH_CAP_XATTR_EXCL); 840 837 ci->i_xattrs.dirty = true; 841 838 inode->i_ctime = CURRENT_TIME; 842 839 843 840 spin_unlock(&inode->i_lock); 844 - 841 + if (dirty) 842 + __mark_inode_dirty(inode, dirty); 845 843 return err; 846 844 do_sync: 847 845 spin_unlock(&inode->i_lock);
+71 -56
fs/cifs/connect.c
··· 274 274 char *data_area_of_target; 275 275 char *data_area_of_buf2; 276 276 int remaining; 277 - __u16 byte_count, total_data_size, total_in_buf, total_in_buf2; 277 + unsigned int byte_count, total_in_buf; 278 + __u16 total_data_size, total_in_buf2; 278 279 279 280 total_data_size = get_unaligned_le16(&pSMBt->t2_rsp.TotalDataCount); 280 281 ··· 288 287 remaining = total_data_size - total_in_buf; 289 288 290 289 if (remaining < 0) 291 - return -EINVAL; 290 + return -EPROTO; 292 291 293 292 if (remaining == 0) /* nothing to do, ignore */ 294 293 return 0; ··· 309 308 data_area_of_target += total_in_buf; 310 309 311 310 /* copy second buffer into end of first buffer */ 312 - memcpy(data_area_of_target, data_area_of_buf2, total_in_buf2); 313 311 total_in_buf += total_in_buf2; 312 + /* is the result too big for the field? */ 313 + if (total_in_buf > USHRT_MAX) 314 + return -EPROTO; 314 315 put_unaligned_le16(total_in_buf, &pSMBt->t2_rsp.DataCount); 316 + 317 + /* fix up the BCC */ 315 318 byte_count = get_bcc_le(pTargetSMB); 316 319 byte_count += total_in_buf2; 320 + /* is the result too big for the field? */ 321 + if (byte_count > USHRT_MAX) 322 + return -EPROTO; 317 323 put_bcc_le(byte_count, pTargetSMB); 318 324 319 325 byte_count = pTargetSMB->smb_buf_length; 320 326 byte_count += total_in_buf2; 321 - 322 - /* BB also add check that we are not beyond maximum buffer size */ 323 - 327 + /* don't allow buffer to overflow */ 328 + if (byte_count > CIFSMaxBufSize) 329 + return -ENOBUFS; 324 330 pTargetSMB->smb_buf_length = byte_count; 331 + 332 + memcpy(data_area_of_target, data_area_of_buf2, total_in_buf2); 325 333 326 334 if (remaining == total_in_buf2) { 327 335 cFYI(1, "found the last secondary response"); ··· 617 607 list_for_each_safe(tmp, tmp2, &server->pending_mid_q) { 618 608 mid_entry = list_entry(tmp, struct mid_q_entry, qhead); 619 609 620 - if ((mid_entry->mid == smb_buffer->Mid) && 621 - (mid_entry->midState == MID_REQUEST_SUBMITTED) && 622 - (mid_entry->command == smb_buffer->Command)) { 623 - if (length == 0 && 624 - check2ndT2(smb_buffer, server->maxBuf) > 0) { 625 - /* We have a multipart transact2 resp */ 626 - isMultiRsp = true; 627 - if (mid_entry->resp_buf) { 628 - /* merge response - fix up 1st*/ 629 - if (coalesce_t2(smb_buffer, 630 - mid_entry->resp_buf)) { 631 - mid_entry->multiRsp = 632 - true; 633 - break; 634 - } else { 635 - /* all parts received */ 636 - mid_entry->multiEnd = 637 - true; 638 - goto multi_t2_fnd; 639 - } 610 + if (mid_entry->mid != smb_buffer->Mid || 611 + mid_entry->midState != MID_REQUEST_SUBMITTED || 612 + mid_entry->command != smb_buffer->Command) { 613 + mid_entry = NULL; 614 + continue; 615 + } 616 + 617 + if (length == 0 && 618 + check2ndT2(smb_buffer, server->maxBuf) > 0) { 619 + /* We have a multipart transact2 resp */ 620 + isMultiRsp = true; 621 + if (mid_entry->resp_buf) { 622 + /* merge response - fix up 1st*/ 623 + length = coalesce_t2(smb_buffer, 624 + mid_entry->resp_buf); 625 + if (length > 0) { 626 + length = 0; 627 + mid_entry->multiRsp = true; 628 + break; 640 629 } else { 641 - if (!isLargeBuf) { 642 - cERROR(1, "1st trans2 resp needs bigbuf"); 643 - /* BB maybe we can fix this up, switch 644 - to already allocated large buffer? */ 645 - } else { 646 - /* Have first buffer */ 647 - mid_entry->resp_buf = 648 - smb_buffer; 649 - mid_entry->largeBuf = 650 - true; 651 - bigbuf = NULL; 652 - } 630 + /* all parts received or 631 + * packet is malformed 632 + */ 633 + mid_entry->multiEnd = true; 634 + goto multi_t2_fnd; 653 635 } 654 - break; 636 + } else { 637 + if (!isLargeBuf) { 638 + /* 639 + * FIXME: switch to already 640 + * allocated largebuf? 641 + */ 642 + cERROR(1, "1st trans2 resp " 643 + "needs bigbuf"); 644 + } else { 645 + /* Have first buffer */ 646 + mid_entry->resp_buf = 647 + smb_buffer; 648 + mid_entry->largeBuf = true; 649 + bigbuf = NULL; 650 + } 655 651 } 656 - mid_entry->resp_buf = smb_buffer; 657 - mid_entry->largeBuf = isLargeBuf; 658 - multi_t2_fnd: 659 - if (length == 0) 660 - mid_entry->midState = 661 - MID_RESPONSE_RECEIVED; 662 - else 663 - mid_entry->midState = 664 - MID_RESPONSE_MALFORMED; 665 - #ifdef CONFIG_CIFS_STATS2 666 - mid_entry->when_received = jiffies; 667 - #endif 668 - list_del_init(&mid_entry->qhead); 669 - mid_entry->callback(mid_entry); 670 652 break; 671 653 } 672 - mid_entry = NULL; 654 + mid_entry->resp_buf = smb_buffer; 655 + mid_entry->largeBuf = isLargeBuf; 656 + multi_t2_fnd: 657 + if (length == 0) 658 + mid_entry->midState = MID_RESPONSE_RECEIVED; 659 + else 660 + mid_entry->midState = MID_RESPONSE_MALFORMED; 661 + #ifdef CONFIG_CIFS_STATS2 662 + mid_entry->when_received = jiffies; 663 + #endif 664 + list_del_init(&mid_entry->qhead); 665 + mid_entry->callback(mid_entry); 666 + break; 673 667 } 674 668 spin_unlock(&GlobalMid_Lock); 675 669 ··· 821 807 cifs_parse_mount_options(char *options, const char *devname, 822 808 struct smb_vol *vol) 823 809 { 824 - char *value; 825 - char *data; 810 + char *value, *data, *end; 826 811 unsigned int temp_len, i, j; 827 812 char separator[2]; 828 813 short int override_uid = -1; ··· 864 851 if (!options) 865 852 return 1; 866 853 854 + end = options + strlen(options); 867 855 if (strncmp(options, "sep=", 4) == 0) { 868 856 if (options[4] != 0) { 869 857 separator[0] = options[4]; ··· 930 916 the only illegal character in a password is null */ 931 917 932 918 if ((value[temp_len] == 0) && 919 + (value + temp_len < end) && 933 920 (value[temp_len+1] == separator[0])) { 934 921 /* reinsert comma */ 935 922 value[temp_len] = separator[0];
+4 -15
fs/cifs/sess.c
··· 276 276 } 277 277 278 278 static void 279 - decode_unicode_ssetup(char **pbcc_area, __u16 bleft, struct cifsSesInfo *ses, 279 + decode_unicode_ssetup(char **pbcc_area, int bleft, struct cifsSesInfo *ses, 280 280 const struct nls_table *nls_cp) 281 281 { 282 282 int len; 283 283 char *data = *pbcc_area; 284 284 285 285 cFYI(1, "bleft %d", bleft); 286 - 287 - /* 288 - * Windows servers do not always double null terminate their final 289 - * Unicode string. Check to see if there are an uneven number of bytes 290 - * left. If so, then add an extra NULL pad byte to the end of the 291 - * response. 292 - * 293 - * See section 2.7.2 in "Implementing CIFS" for details 294 - */ 295 - if (bleft % 2) { 296 - data[bleft] = 0; 297 - ++bleft; 298 - } 299 286 300 287 kfree(ses->serverOS); 301 288 ses->serverOS = cifs_strndup_from_ucs(data, bleft, true, nls_cp); ··· 916 929 } 917 930 918 931 /* BB check if Unicode and decode strings */ 919 - if (smb_buf->Flags2 & SMBFLG2_UNICODE) { 932 + if (bytes_remaining == 0) { 933 + /* no string area to decode, do nothing */ 934 + } else if (smb_buf->Flags2 & SMBFLG2_UNICODE) { 920 935 /* unicode string area must be word-aligned */ 921 936 if (((unsigned long) bcc_ptr - (unsigned long) smb_buf) % 2) { 922 937 ++bcc_ptr;
+11 -7
fs/file.c
··· 9 9 #include <linux/module.h> 10 10 #include <linux/fs.h> 11 11 #include <linux/mm.h> 12 + #include <linux/mmzone.h> 12 13 #include <linux/time.h> 13 14 #include <linux/sched.h> 14 15 #include <linux/slab.h> ··· 40 39 */ 41 40 static DEFINE_PER_CPU(struct fdtable_defer, fdtable_defer_list); 42 41 43 - static inline void *alloc_fdmem(unsigned int size) 42 + static void *alloc_fdmem(unsigned int size) 44 43 { 45 - void *data; 46 - 47 - data = kmalloc(size, GFP_KERNEL|__GFP_NOWARN); 48 - if (data != NULL) 49 - return data; 50 - 44 + /* 45 + * Very large allocations can stress page reclaim, so fall back to 46 + * vmalloc() if the allocation size will be considered "large" by the VM. 47 + */ 48 + if (size <= (PAGE_SIZE << PAGE_ALLOC_COSTLY_ORDER)) { 49 + void *data = kmalloc(size, GFP_KERNEL|__GFP_NOWARN); 50 + if (data != NULL) 51 + return data; 52 + } 51 53 return vmalloc(size); 52 54 } 53 55
-1
fs/hpfs/Kconfig
··· 1 1 config HPFS_FS 2 2 tristate "OS/2 HPFS file system support" 3 3 depends on BLOCK 4 - depends on BROKEN || !PREEMPT 5 4 help 6 5 OS/2 is IBM's operating system for PC's, the same as Warp, and HPFS 7 6 is the file system used for organizing files on OS/2 hard disk
+43 -75
fs/hpfs/alloc.c
··· 8 8 9 9 #include "hpfs_fn.h" 10 10 11 - static int hpfs_alloc_if_possible_nolock(struct super_block *s, secno sec); 12 - 13 11 /* 14 12 * Check if a sector is allocated in bitmap 15 13 * This is really slow. Turned on only if chk==2 ··· 16 18 static int chk_if_allocated(struct super_block *s, secno sec, char *msg) 17 19 { 18 20 struct quad_buffer_head qbh; 19 - unsigned *bmp; 21 + u32 *bmp; 20 22 if (!(bmp = hpfs_map_bitmap(s, sec >> 14, &qbh, "chk"))) goto fail; 21 - if ((bmp[(sec & 0x3fff) >> 5] >> (sec & 0x1f)) & 1) { 23 + if ((cpu_to_le32(bmp[(sec & 0x3fff) >> 5]) >> (sec & 0x1f)) & 1) { 22 24 hpfs_error(s, "sector '%s' - %08x not allocated in bitmap", msg, sec); 23 25 goto fail1; 24 26 } ··· 26 28 if (sec >= hpfs_sb(s)->sb_dirband_start && sec < hpfs_sb(s)->sb_dirband_start + hpfs_sb(s)->sb_dirband_size) { 27 29 unsigned ssec = (sec - hpfs_sb(s)->sb_dirband_start) / 4; 28 30 if (!(bmp = hpfs_map_dnode_bitmap(s, &qbh))) goto fail; 29 - if ((bmp[ssec >> 5] >> (ssec & 0x1f)) & 1) { 31 + if ((le32_to_cpu(bmp[ssec >> 5]) >> (ssec & 0x1f)) & 1) { 30 32 hpfs_error(s, "sector '%s' - %08x not allocated in directory bitmap", msg, sec); 31 33 goto fail1; 32 34 } ··· 73 75 hpfs_error(s, "Bad allocation size: %d", n); 74 76 return 0; 75 77 } 76 - lock_super(s); 77 78 if (bs != ~0x3fff) { 78 79 if (!(bmp = hpfs_map_bitmap(s, near >> 14, &qbh, "aib"))) goto uls; 79 80 } else { ··· 82 85 ret = bs + nr; 83 86 goto rt; 84 87 } 85 - /*if (!tstbits(bmp, nr + n, n + forward)) { 86 - ret = bs + nr + n; 87 - goto rt; 88 - }*/ 89 88 q = nr + n; b = 0; 90 89 while ((a = tstbits(bmp, q, n + forward)) != 0) { 91 90 q += a; ··· 98 105 goto rt; 99 106 } 100 107 nr >>= 5; 101 - /*for (i = nr + 1; i != nr; i++, i &= 0x1ff) {*/ 108 + /*for (i = nr + 1; i != nr; i++, i &= 0x1ff) */ 102 109 i = nr; 103 110 do { 104 - if (!bmp[i]) goto cont; 105 - if (n + forward >= 0x3f && bmp[i] != -1) goto cont; 111 + if (!le32_to_cpu(bmp[i])) goto cont; 112 + if (n + forward >= 0x3f && le32_to_cpu(bmp[i]) != 0xffffffff) goto cont; 106 113 q = i<<5; 107 114 if (i > 0) { 108 - unsigned k = bmp[i-1]; 115 + unsigned k = le32_to_cpu(bmp[i-1]); 109 116 while (k & 0x80000000) { 110 117 q--; k <<= 1; 111 118 } ··· 125 132 } while (i != nr); 126 133 rt: 127 134 if (ret) { 128 - if (hpfs_sb(s)->sb_chk && ((ret >> 14) != (bs >> 14) || (bmp[(ret & 0x3fff) >> 5] | ~(((1 << n) - 1) << (ret & 0x1f))) != 0xffffffff)) { 135 + if (hpfs_sb(s)->sb_chk && ((ret >> 14) != (bs >> 14) || (le32_to_cpu(bmp[(ret & 0x3fff) >> 5]) | ~(((1 << n) - 1) << (ret & 0x1f))) != 0xffffffff)) { 129 136 hpfs_error(s, "Allocation doesn't work! Wanted %d, allocated at %08x", n, ret); 130 137 ret = 0; 131 138 goto b; 132 139 } 133 - bmp[(ret & 0x3fff) >> 5] &= ~(((1 << n) - 1) << (ret & 0x1f)); 140 + bmp[(ret & 0x3fff) >> 5] &= cpu_to_le32(~(((1 << n) - 1) << (ret & 0x1f))); 134 141 hpfs_mark_4buffers_dirty(&qbh); 135 142 } 136 143 b: 137 144 hpfs_brelse4(&qbh); 138 145 uls: 139 - unlock_super(s); 140 146 return ret; 141 147 } 142 148 ··· 147 155 * sectors 148 156 */ 149 157 150 - secno hpfs_alloc_sector(struct super_block *s, secno near, unsigned n, int forward, int lock) 158 + secno hpfs_alloc_sector(struct super_block *s, secno near, unsigned n, int forward) 151 159 { 152 160 secno sec; 153 161 int i; ··· 159 167 forward = -forward; 160 168 f_p = 1; 161 169 } 162 - if (lock) hpfs_lock_creation(s); 163 170 n_bmps = (sbi->sb_fs_size + 0x4000 - 1) >> 14; 164 171 if (near && near < sbi->sb_fs_size) { 165 172 if ((sec = alloc_in_bmp(s, near, n, f_p ? forward : forward/4))) goto ret; ··· 205 214 ret: 206 215 if (sec && f_p) { 207 216 for (i = 0; i < forward; i++) { 208 - if (!hpfs_alloc_if_possible_nolock(s, sec + i + 1)) { 217 + if (!hpfs_alloc_if_possible(s, sec + i + 1)) { 209 218 hpfs_error(s, "Prealloc doesn't work! Wanted %d, allocated at %08x, can't allocate %d", forward, sec, i); 210 219 sec = 0; 211 220 break; 212 221 } 213 222 } 214 223 } 215 - if (lock) hpfs_unlock_creation(s); 216 224 return sec; 217 225 } 218 226 219 - static secno alloc_in_dirband(struct super_block *s, secno near, int lock) 227 + static secno alloc_in_dirband(struct super_block *s, secno near) 220 228 { 221 229 unsigned nr = near; 222 230 secno sec; ··· 226 236 nr = sbi->sb_dirband_start + sbi->sb_dirband_size - 4; 227 237 nr -= sbi->sb_dirband_start; 228 238 nr >>= 2; 229 - if (lock) hpfs_lock_creation(s); 230 239 sec = alloc_in_bmp(s, (~0x3fff) | nr, 1, 0); 231 - if (lock) hpfs_unlock_creation(s); 232 240 if (!sec) return 0; 233 241 return ((sec & 0x3fff) << 2) + sbi->sb_dirband_start; 234 242 } 235 243 236 244 /* Alloc sector if it's free */ 237 245 238 - static int hpfs_alloc_if_possible_nolock(struct super_block *s, secno sec) 246 + int hpfs_alloc_if_possible(struct super_block *s, secno sec) 239 247 { 240 248 struct quad_buffer_head qbh; 241 - unsigned *bmp; 242 - lock_super(s); 249 + u32 *bmp; 243 250 if (!(bmp = hpfs_map_bitmap(s, sec >> 14, &qbh, "aip"))) goto end; 244 - if (bmp[(sec & 0x3fff) >> 5] & (1 << (sec & 0x1f))) { 245 - bmp[(sec & 0x3fff) >> 5] &= ~(1 << (sec & 0x1f)); 251 + if (le32_to_cpu(bmp[(sec & 0x3fff) >> 5]) & (1 << (sec & 0x1f))) { 252 + bmp[(sec & 0x3fff) >> 5] &= cpu_to_le32(~(1 << (sec & 0x1f))); 246 253 hpfs_mark_4buffers_dirty(&qbh); 247 254 hpfs_brelse4(&qbh); 248 - unlock_super(s); 249 255 return 1; 250 256 } 251 257 hpfs_brelse4(&qbh); 252 258 end: 253 - unlock_super(s); 254 259 return 0; 255 - } 256 - 257 - int hpfs_alloc_if_possible(struct super_block *s, secno sec) 258 - { 259 - int r; 260 - hpfs_lock_creation(s); 261 - r = hpfs_alloc_if_possible_nolock(s, sec); 262 - hpfs_unlock_creation(s); 263 - return r; 264 260 } 265 261 266 262 /* Free sectors in bitmaps */ ··· 254 278 void hpfs_free_sectors(struct super_block *s, secno sec, unsigned n) 255 279 { 256 280 struct quad_buffer_head qbh; 257 - unsigned *bmp; 281 + u32 *bmp; 258 282 struct hpfs_sb_info *sbi = hpfs_sb(s); 259 283 /*printk("2 - ");*/ 260 284 if (!n) return; ··· 262 286 hpfs_error(s, "Trying to free reserved sector %08x", sec); 263 287 return; 264 288 } 265 - lock_super(s); 266 289 sbi->sb_max_fwd_alloc += n > 0xffff ? 0xffff : n; 267 290 if (sbi->sb_max_fwd_alloc > 0xffffff) sbi->sb_max_fwd_alloc = 0xffffff; 268 291 new_map: 269 292 if (!(bmp = hpfs_map_bitmap(s, sec >> 14, &qbh, "free"))) { 270 - unlock_super(s); 271 293 return; 272 294 } 273 295 new_tst: 274 - if ((bmp[(sec & 0x3fff) >> 5] >> (sec & 0x1f) & 1)) { 296 + if ((le32_to_cpu(bmp[(sec & 0x3fff) >> 5]) >> (sec & 0x1f) & 1)) { 275 297 hpfs_error(s, "sector %08x not allocated", sec); 276 298 hpfs_brelse4(&qbh); 277 - unlock_super(s); 278 299 return; 279 300 } 280 - bmp[(sec & 0x3fff) >> 5] |= 1 << (sec & 0x1f); 301 + bmp[(sec & 0x3fff) >> 5] |= cpu_to_le32(1 << (sec & 0x1f)); 281 302 if (!--n) { 282 303 hpfs_mark_4buffers_dirty(&qbh); 283 304 hpfs_brelse4(&qbh); 284 - unlock_super(s); 285 305 return; 286 306 } 287 307 if (!(++sec & 0x3fff)) { ··· 299 327 int n_bmps = (hpfs_sb(s)->sb_fs_size + 0x4000 - 1) >> 14; 300 328 int b = hpfs_sb(s)->sb_c_bitmap & 0x0fffffff; 301 329 int i, j; 302 - unsigned *bmp; 330 + u32 *bmp; 303 331 struct quad_buffer_head qbh; 304 332 if ((bmp = hpfs_map_dnode_bitmap(s, &qbh))) { 305 333 for (j = 0; j < 512; j++) { 306 334 unsigned k; 307 - if (!bmp[j]) continue; 308 - for (k = bmp[j]; k; k >>= 1) if (k & 1) if (!--n) { 335 + if (!le32_to_cpu(bmp[j])) continue; 336 + for (k = le32_to_cpu(bmp[j]); k; k >>= 1) if (k & 1) if (!--n) { 309 337 hpfs_brelse4(&qbh); 310 338 return 0; 311 339 } ··· 324 352 chk_bmp: 325 353 if (bmp) { 326 354 for (j = 0; j < 512; j++) { 327 - unsigned k; 328 - if (!bmp[j]) continue; 355 + u32 k; 356 + if (!le32_to_cpu(bmp[j])) continue; 329 357 for (k = 0xf; k; k <<= 4) 330 - if ((bmp[j] & k) == k) { 358 + if ((le32_to_cpu(bmp[j]) & k) == k) { 331 359 if (!--n) { 332 360 hpfs_brelse4(&qbh); 333 361 return 0; ··· 351 379 hpfs_free_sectors(s, dno, 4); 352 380 } else { 353 381 struct quad_buffer_head qbh; 354 - unsigned *bmp; 382 + u32 *bmp; 355 383 unsigned ssec = (dno - hpfs_sb(s)->sb_dirband_start) / 4; 356 - lock_super(s); 357 384 if (!(bmp = hpfs_map_dnode_bitmap(s, &qbh))) { 358 - unlock_super(s); 359 385 return; 360 386 } 361 - bmp[ssec >> 5] |= 1 << (ssec & 0x1f); 387 + bmp[ssec >> 5] |= cpu_to_le32(1 << (ssec & 0x1f)); 362 388 hpfs_mark_4buffers_dirty(&qbh); 363 389 hpfs_brelse4(&qbh); 364 - unlock_super(s); 365 390 } 366 391 } 367 392 368 393 struct dnode *hpfs_alloc_dnode(struct super_block *s, secno near, 369 - dnode_secno *dno, struct quad_buffer_head *qbh, 370 - int lock) 394 + dnode_secno *dno, struct quad_buffer_head *qbh) 371 395 { 372 396 struct dnode *d; 373 397 if (hpfs_count_one_bitmap(s, hpfs_sb(s)->sb_dmap) > FREE_DNODES_ADD) { 374 - if (!(*dno = alloc_in_dirband(s, near, lock))) 375 - if (!(*dno = hpfs_alloc_sector(s, near, 4, 0, lock))) return NULL; 398 + if (!(*dno = alloc_in_dirband(s, near))) 399 + if (!(*dno = hpfs_alloc_sector(s, near, 4, 0))) return NULL; 376 400 } else { 377 - if (!(*dno = hpfs_alloc_sector(s, near, 4, 0, lock))) 378 - if (!(*dno = alloc_in_dirband(s, near, lock))) return NULL; 401 + if (!(*dno = hpfs_alloc_sector(s, near, 4, 0))) 402 + if (!(*dno = alloc_in_dirband(s, near))) return NULL; 379 403 } 380 404 if (!(d = hpfs_get_4sectors(s, *dno, qbh))) { 381 405 hpfs_free_dnode(s, *dno); 382 406 return NULL; 383 407 } 384 408 memset(d, 0, 2048); 385 - d->magic = DNODE_MAGIC; 386 - d->first_free = 52; 409 + d->magic = cpu_to_le32(DNODE_MAGIC); 410 + d->first_free = cpu_to_le32(52); 387 411 d->dirent[0] = 32; 388 412 d->dirent[2] = 8; 389 413 d->dirent[30] = 1; 390 414 d->dirent[31] = 255; 391 - d->self = *dno; 415 + d->self = cpu_to_le32(*dno); 392 416 return d; 393 417 } 394 418 ··· 392 424 struct buffer_head **bh) 393 425 { 394 426 struct fnode *f; 395 - if (!(*fno = hpfs_alloc_sector(s, near, 1, FNODE_ALLOC_FWD, 1))) return NULL; 427 + if (!(*fno = hpfs_alloc_sector(s, near, 1, FNODE_ALLOC_FWD))) return NULL; 396 428 if (!(f = hpfs_get_sector(s, *fno, bh))) { 397 429 hpfs_free_sectors(s, *fno, 1); 398 430 return NULL; 399 431 } 400 432 memset(f, 0, 512); 401 - f->magic = FNODE_MAGIC; 402 - f->ea_offs = 0xc4; 433 + f->magic = cpu_to_le32(FNODE_MAGIC); 434 + f->ea_offs = cpu_to_le16(0xc4); 403 435 f->btree.n_free_nodes = 8; 404 - f->btree.first_free = 8; 436 + f->btree.first_free = cpu_to_le16(8); 405 437 return f; 406 438 } 407 439 ··· 409 441 struct buffer_head **bh) 410 442 { 411 443 struct anode *a; 412 - if (!(*ano = hpfs_alloc_sector(s, near, 1, ANODE_ALLOC_FWD, 1))) return NULL; 444 + if (!(*ano = hpfs_alloc_sector(s, near, 1, ANODE_ALLOC_FWD))) return NULL; 413 445 if (!(a = hpfs_get_sector(s, *ano, bh))) { 414 446 hpfs_free_sectors(s, *ano, 1); 415 447 return NULL; 416 448 } 417 449 memset(a, 0, 512); 418 - a->magic = ANODE_MAGIC; 419 - a->self = *ano; 450 + a->magic = cpu_to_le32(ANODE_MAGIC); 451 + a->self = cpu_to_le32(*ano); 420 452 a->btree.n_free_nodes = 40; 421 453 a->btree.n_used_nodes = 0; 422 - a->btree.first_free = 8; 454 + a->btree.first_free = cpu_to_le16(8); 423 455 return a; 424 456 }
+69 -69
fs/hpfs/anode.c
··· 22 22 if (hpfs_sb(s)->sb_chk) if (hpfs_stop_cycles(s, a, &c1, &c2, "hpfs_bplus_lookup")) return -1; 23 23 if (btree->internal) { 24 24 for (i = 0; i < btree->n_used_nodes; i++) 25 - if (btree->u.internal[i].file_secno > sec) { 26 - a = btree->u.internal[i].down; 25 + if (le32_to_cpu(btree->u.internal[i].file_secno) > sec) { 26 + a = le32_to_cpu(btree->u.internal[i].down); 27 27 brelse(bh); 28 28 if (!(anode = hpfs_map_anode(s, a, &bh))) return -1; 29 29 btree = &anode->btree; ··· 34 34 return -1; 35 35 } 36 36 for (i = 0; i < btree->n_used_nodes; i++) 37 - if (btree->u.external[i].file_secno <= sec && 38 - btree->u.external[i].file_secno + btree->u.external[i].length > sec) { 39 - a = btree->u.external[i].disk_secno + sec - btree->u.external[i].file_secno; 37 + if (le32_to_cpu(btree->u.external[i].file_secno) <= sec && 38 + le32_to_cpu(btree->u.external[i].file_secno) + le32_to_cpu(btree->u.external[i].length) > sec) { 39 + a = le32_to_cpu(btree->u.external[i].disk_secno) + sec - le32_to_cpu(btree->u.external[i].file_secno); 40 40 if (hpfs_sb(s)->sb_chk) if (hpfs_chk_sectors(s, a, 1, "data")) { 41 41 brelse(bh); 42 42 return -1; 43 43 } 44 44 if (inode) { 45 45 struct hpfs_inode_info *hpfs_inode = hpfs_i(inode); 46 - hpfs_inode->i_file_sec = btree->u.external[i].file_secno; 47 - hpfs_inode->i_disk_sec = btree->u.external[i].disk_secno; 48 - hpfs_inode->i_n_secs = btree->u.external[i].length; 46 + hpfs_inode->i_file_sec = le32_to_cpu(btree->u.external[i].file_secno); 47 + hpfs_inode->i_disk_sec = le32_to_cpu(btree->u.external[i].disk_secno); 48 + hpfs_inode->i_n_secs = le32_to_cpu(btree->u.external[i].length); 49 49 } 50 50 brelse(bh); 51 51 return a; ··· 83 83 return -1; 84 84 } 85 85 if (btree->internal) { 86 - a = btree->u.internal[n].down; 87 - btree->u.internal[n].file_secno = -1; 86 + a = le32_to_cpu(btree->u.internal[n].down); 87 + btree->u.internal[n].file_secno = cpu_to_le32(-1); 88 88 mark_buffer_dirty(bh); 89 89 brelse(bh); 90 90 if (hpfs_sb(s)->sb_chk) ··· 94 94 goto go_down; 95 95 } 96 96 if (n >= 0) { 97 - if (btree->u.external[n].file_secno + btree->u.external[n].length != fsecno) { 97 + if (le32_to_cpu(btree->u.external[n].file_secno) + le32_to_cpu(btree->u.external[n].length) != fsecno) { 98 98 hpfs_error(s, "allocated size %08x, trying to add sector %08x, %cnode %08x", 99 - btree->u.external[n].file_secno + btree->u.external[n].length, fsecno, 99 + le32_to_cpu(btree->u.external[n].file_secno) + le32_to_cpu(btree->u.external[n].length), fsecno, 100 100 fnod?'f':'a', node); 101 101 brelse(bh); 102 102 return -1; 103 103 } 104 - if (hpfs_alloc_if_possible(s, se = btree->u.external[n].disk_secno + btree->u.external[n].length)) { 105 - btree->u.external[n].length++; 104 + if (hpfs_alloc_if_possible(s, se = le32_to_cpu(btree->u.external[n].disk_secno) + le32_to_cpu(btree->u.external[n].length))) { 105 + btree->u.external[n].length = cpu_to_le32(le32_to_cpu(btree->u.external[n].length) + 1); 106 106 mark_buffer_dirty(bh); 107 107 brelse(bh); 108 108 return se; ··· 115 115 } 116 116 se = !fnod ? node : (node + 16384) & ~16383; 117 117 } 118 - if (!(se = hpfs_alloc_sector(s, se, 1, fsecno*ALLOC_M>ALLOC_FWD_MAX ? ALLOC_FWD_MAX : fsecno*ALLOC_M<ALLOC_FWD_MIN ? ALLOC_FWD_MIN : fsecno*ALLOC_M, 1))) { 118 + if (!(se = hpfs_alloc_sector(s, se, 1, fsecno*ALLOC_M>ALLOC_FWD_MAX ? ALLOC_FWD_MAX : fsecno*ALLOC_M<ALLOC_FWD_MIN ? ALLOC_FWD_MIN : fsecno*ALLOC_M))) { 119 119 brelse(bh); 120 120 return -1; 121 121 } 122 - fs = n < 0 ? 0 : btree->u.external[n].file_secno + btree->u.external[n].length; 122 + fs = n < 0 ? 0 : le32_to_cpu(btree->u.external[n].file_secno) + le32_to_cpu(btree->u.external[n].length); 123 123 if (!btree->n_free_nodes) { 124 - up = a != node ? anode->up : -1; 124 + up = a != node ? le32_to_cpu(anode->up) : -1; 125 125 if (!(anode = hpfs_alloc_anode(s, a, &na, &bh1))) { 126 126 brelse(bh); 127 127 hpfs_free_sectors(s, se, 1); 128 128 return -1; 129 129 } 130 130 if (a == node && fnod) { 131 - anode->up = node; 131 + anode->up = cpu_to_le32(node); 132 132 anode->btree.fnode_parent = 1; 133 133 anode->btree.n_used_nodes = btree->n_used_nodes; 134 134 anode->btree.first_free = btree->first_free; ··· 137 137 btree->internal = 1; 138 138 btree->n_free_nodes = 11; 139 139 btree->n_used_nodes = 1; 140 - btree->first_free = (char *)&(btree->u.internal[1]) - (char *)btree; 141 - btree->u.internal[0].file_secno = -1; 142 - btree->u.internal[0].down = na; 140 + btree->first_free = cpu_to_le16((char *)&(btree->u.internal[1]) - (char *)btree); 141 + btree->u.internal[0].file_secno = cpu_to_le32(-1); 142 + btree->u.internal[0].down = cpu_to_le32(na); 143 143 mark_buffer_dirty(bh); 144 144 } else if (!(ranode = hpfs_alloc_anode(s, /*a*/0, &ra, &bh2))) { 145 145 brelse(bh); ··· 153 153 btree = &anode->btree; 154 154 } 155 155 btree->n_free_nodes--; n = btree->n_used_nodes++; 156 - btree->first_free += 12; 157 - btree->u.external[n].disk_secno = se; 158 - btree->u.external[n].file_secno = fs; 159 - btree->u.external[n].length = 1; 156 + btree->first_free = cpu_to_le16(le16_to_cpu(btree->first_free) + 12); 157 + btree->u.external[n].disk_secno = cpu_to_le32(se); 158 + btree->u.external[n].file_secno = cpu_to_le32(fs); 159 + btree->u.external[n].length = cpu_to_le32(1); 160 160 mark_buffer_dirty(bh); 161 161 brelse(bh); 162 162 if ((a == node && fnod) || na == -1) return se; 163 163 c2 = 0; 164 - while (up != -1) { 164 + while (up != (anode_secno)-1) { 165 165 struct anode *new_anode; 166 166 if (hpfs_sb(s)->sb_chk) 167 167 if (hpfs_stop_cycles(s, up, &c1, &c2, "hpfs_add_sector_to_btree #2")) return -1; ··· 174 174 } 175 175 if (btree->n_free_nodes) { 176 176 btree->n_free_nodes--; n = btree->n_used_nodes++; 177 - btree->first_free += 8; 178 - btree->u.internal[n].file_secno = -1; 179 - btree->u.internal[n].down = na; 180 - btree->u.internal[n-1].file_secno = fs; 177 + btree->first_free = cpu_to_le16(le16_to_cpu(btree->first_free) + 8); 178 + btree->u.internal[n].file_secno = cpu_to_le32(-1); 179 + btree->u.internal[n].down = cpu_to_le32(na); 180 + btree->u.internal[n-1].file_secno = cpu_to_le32(fs); 181 181 mark_buffer_dirty(bh); 182 182 brelse(bh); 183 183 brelse(bh2); 184 184 hpfs_free_sectors(s, ra, 1); 185 185 if ((anode = hpfs_map_anode(s, na, &bh))) { 186 - anode->up = up; 186 + anode->up = cpu_to_le32(up); 187 187 anode->btree.fnode_parent = up == node && fnod; 188 188 mark_buffer_dirty(bh); 189 189 brelse(bh); 190 190 } 191 191 return se; 192 192 } 193 - up = up != node ? anode->up : -1; 194 - btree->u.internal[btree->n_used_nodes - 1].file_secno = /*fs*/-1; 193 + up = up != node ? le32_to_cpu(anode->up) : -1; 194 + btree->u.internal[btree->n_used_nodes - 1].file_secno = cpu_to_le32(/*fs*/-1); 195 195 mark_buffer_dirty(bh); 196 196 brelse(bh); 197 197 a = na; 198 198 if ((new_anode = hpfs_alloc_anode(s, a, &na, &bh))) { 199 199 anode = new_anode; 200 - /*anode->up = up != -1 ? up : ra;*/ 200 + /*anode->up = cpu_to_le32(up != -1 ? up : ra);*/ 201 201 anode->btree.internal = 1; 202 202 anode->btree.n_used_nodes = 1; 203 203 anode->btree.n_free_nodes = 59; 204 - anode->btree.first_free = 16; 205 - anode->btree.u.internal[0].down = a; 206 - anode->btree.u.internal[0].file_secno = -1; 204 + anode->btree.first_free = cpu_to_le16(16); 205 + anode->btree.u.internal[0].down = cpu_to_le32(a); 206 + anode->btree.u.internal[0].file_secno = cpu_to_le32(-1); 207 207 mark_buffer_dirty(bh); 208 208 brelse(bh); 209 209 if ((anode = hpfs_map_anode(s, a, &bh))) { 210 - anode->up = na; 210 + anode->up = cpu_to_le32(na); 211 211 mark_buffer_dirty(bh); 212 212 brelse(bh); 213 213 } 214 214 } else na = a; 215 215 } 216 216 if ((anode = hpfs_map_anode(s, na, &bh))) { 217 - anode->up = node; 217 + anode->up = cpu_to_le32(node); 218 218 if (fnod) anode->btree.fnode_parent = 1; 219 219 mark_buffer_dirty(bh); 220 220 brelse(bh); ··· 232 232 } 233 233 btree = &fnode->btree; 234 234 } 235 - ranode->up = node; 236 - memcpy(&ranode->btree, btree, btree->first_free); 235 + ranode->up = cpu_to_le32(node); 236 + memcpy(&ranode->btree, btree, le16_to_cpu(btree->first_free)); 237 237 if (fnod) ranode->btree.fnode_parent = 1; 238 238 ranode->btree.n_free_nodes = (ranode->btree.internal ? 60 : 40) - ranode->btree.n_used_nodes; 239 239 if (ranode->btree.internal) for (n = 0; n < ranode->btree.n_used_nodes; n++) { 240 240 struct anode *unode; 241 - if ((unode = hpfs_map_anode(s, ranode->u.internal[n].down, &bh1))) { 242 - unode->up = ra; 241 + if ((unode = hpfs_map_anode(s, le32_to_cpu(ranode->u.internal[n].down), &bh1))) { 242 + unode->up = cpu_to_le32(ra); 243 243 unode->btree.fnode_parent = 0; 244 244 mark_buffer_dirty(bh1); 245 245 brelse(bh1); ··· 248 248 btree->internal = 1; 249 249 btree->n_free_nodes = fnod ? 10 : 58; 250 250 btree->n_used_nodes = 2; 251 - btree->first_free = (char *)&btree->u.internal[2] - (char *)btree; 252 - btree->u.internal[0].file_secno = fs; 253 - btree->u.internal[0].down = ra; 254 - btree->u.internal[1].file_secno = -1; 255 - btree->u.internal[1].down = na; 251 + btree->first_free = cpu_to_le16((char *)&btree->u.internal[2] - (char *)btree); 252 + btree->u.internal[0].file_secno = cpu_to_le32(fs); 253 + btree->u.internal[0].down = cpu_to_le32(ra); 254 + btree->u.internal[1].file_secno = cpu_to_le32(-1); 255 + btree->u.internal[1].down = cpu_to_le32(na); 256 256 mark_buffer_dirty(bh); 257 257 brelse(bh); 258 258 mark_buffer_dirty(bh2); ··· 279 279 go_down: 280 280 d2 = 0; 281 281 while (btree1->internal) { 282 - ano = btree1->u.internal[pos].down; 282 + ano = le32_to_cpu(btree1->u.internal[pos].down); 283 283 if (level) brelse(bh); 284 284 if (hpfs_sb(s)->sb_chk) 285 285 if (hpfs_stop_cycles(s, ano, &d1, &d2, "hpfs_remove_btree #1")) ··· 290 290 pos = 0; 291 291 } 292 292 for (i = 0; i < btree1->n_used_nodes; i++) 293 - hpfs_free_sectors(s, btree1->u.external[i].disk_secno, btree1->u.external[i].length); 293 + hpfs_free_sectors(s, le32_to_cpu(btree1->u.external[i].disk_secno), le32_to_cpu(btree1->u.external[i].length)); 294 294 go_up: 295 295 if (!level) return; 296 296 brelse(bh); ··· 298 298 if (hpfs_stop_cycles(s, ano, &c1, &c2, "hpfs_remove_btree #2")) return; 299 299 hpfs_free_sectors(s, ano, 1); 300 300 oano = ano; 301 - ano = anode->up; 301 + ano = le32_to_cpu(anode->up); 302 302 if (--level) { 303 303 if (!(anode = hpfs_map_anode(s, ano, &bh))) return; 304 304 btree1 = &anode->btree; 305 305 } else btree1 = btree; 306 306 for (i = 0; i < btree1->n_used_nodes; i++) { 307 - if (btree1->u.internal[i].down == oano) { 307 + if (le32_to_cpu(btree1->u.internal[i].down) == oano) { 308 308 if ((pos = i + 1) < btree1->n_used_nodes) 309 309 goto go_down; 310 310 else ··· 411 411 if (fno) { 412 412 btree->n_free_nodes = 8; 413 413 btree->n_used_nodes = 0; 414 - btree->first_free = 8; 414 + btree->first_free = cpu_to_le16(8); 415 415 btree->internal = 0; 416 416 mark_buffer_dirty(bh); 417 417 } else hpfs_free_sectors(s, f, 1); ··· 421 421 while (btree->internal) { 422 422 nodes = btree->n_used_nodes + btree->n_free_nodes; 423 423 for (i = 0; i < btree->n_used_nodes; i++) 424 - if (btree->u.internal[i].file_secno >= secs) goto f; 424 + if (le32_to_cpu(btree->u.internal[i].file_secno) >= secs) goto f; 425 425 brelse(bh); 426 426 hpfs_error(s, "internal btree %08x doesn't end with -1", node); 427 427 return; 428 428 f: 429 429 for (j = i + 1; j < btree->n_used_nodes; j++) 430 - hpfs_ea_remove(s, btree->u.internal[j].down, 1, 0); 430 + hpfs_ea_remove(s, le32_to_cpu(btree->u.internal[j].down), 1, 0); 431 431 btree->n_used_nodes = i + 1; 432 432 btree->n_free_nodes = nodes - btree->n_used_nodes; 433 - btree->first_free = 8 + 8 * btree->n_used_nodes; 433 + btree->first_free = cpu_to_le16(8 + 8 * btree->n_used_nodes); 434 434 mark_buffer_dirty(bh); 435 - if (btree->u.internal[i].file_secno == secs) { 435 + if (btree->u.internal[i].file_secno == cpu_to_le32(secs)) { 436 436 brelse(bh); 437 437 return; 438 438 } 439 - node = btree->u.internal[i].down; 439 + node = le32_to_cpu(btree->u.internal[i].down); 440 440 brelse(bh); 441 441 if (hpfs_sb(s)->sb_chk) 442 442 if (hpfs_stop_cycles(s, node, &c1, &c2, "hpfs_truncate_btree")) ··· 446 446 } 447 447 nodes = btree->n_used_nodes + btree->n_free_nodes; 448 448 for (i = 0; i < btree->n_used_nodes; i++) 449 - if (btree->u.external[i].file_secno + btree->u.external[i].length >= secs) goto ff; 449 + if (le32_to_cpu(btree->u.external[i].file_secno) + le32_to_cpu(btree->u.external[i].length) >= secs) goto ff; 450 450 brelse(bh); 451 451 return; 452 452 ff: 453 - if (secs <= btree->u.external[i].file_secno) { 453 + if (secs <= le32_to_cpu(btree->u.external[i].file_secno)) { 454 454 hpfs_error(s, "there is an allocation error in file %08x, sector %08x", f, secs); 455 455 if (i) i--; 456 456 } 457 - else if (btree->u.external[i].file_secno + btree->u.external[i].length > secs) { 458 - hpfs_free_sectors(s, btree->u.external[i].disk_secno + secs - 459 - btree->u.external[i].file_secno, btree->u.external[i].length 460 - - secs + btree->u.external[i].file_secno); /* I hope gcc optimizes this :-) */ 461 - btree->u.external[i].length = secs - btree->u.external[i].file_secno; 457 + else if (le32_to_cpu(btree->u.external[i].file_secno) + le32_to_cpu(btree->u.external[i].length) > secs) { 458 + hpfs_free_sectors(s, le32_to_cpu(btree->u.external[i].disk_secno) + secs - 459 + le32_to_cpu(btree->u.external[i].file_secno), le32_to_cpu(btree->u.external[i].length) 460 + - secs + le32_to_cpu(btree->u.external[i].file_secno)); /* I hope gcc optimizes this :-) */ 461 + btree->u.external[i].length = cpu_to_le32(secs - le32_to_cpu(btree->u.external[i].file_secno)); 462 462 } 463 463 for (j = i + 1; j < btree->n_used_nodes; j++) 464 - hpfs_free_sectors(s, btree->u.external[j].disk_secno, btree->u.external[j].length); 464 + hpfs_free_sectors(s, le32_to_cpu(btree->u.external[j].disk_secno), le32_to_cpu(btree->u.external[j].length)); 465 465 btree->n_used_nodes = i + 1; 466 466 btree->n_free_nodes = nodes - btree->n_used_nodes; 467 - btree->first_free = 8 + 12 * btree->n_used_nodes; 467 + btree->first_free = cpu_to_le16(8 + 12 * btree->n_used_nodes); 468 468 mark_buffer_dirty(bh); 469 469 brelse(bh); 470 470 } ··· 480 480 struct extended_attribute *ea_end; 481 481 if (!(fnode = hpfs_map_fnode(s, fno, &bh))) return; 482 482 if (!fnode->dirflag) hpfs_remove_btree(s, &fnode->btree); 483 - else hpfs_remove_dtree(s, fnode->u.external[0].disk_secno); 483 + else hpfs_remove_dtree(s, le32_to_cpu(fnode->u.external[0].disk_secno)); 484 484 ea_end = fnode_end_ea(fnode); 485 485 for (ea = fnode_ea(fnode); ea < ea_end; ea = next_ea(ea)) 486 486 if (ea->indirect) 487 487 hpfs_ea_remove(s, ea_sec(ea), ea->anode, ea_len(ea)); 488 - hpfs_ea_ext_remove(s, fnode->ea_secno, fnode->ea_anode, fnode->ea_size_l); 488 + hpfs_ea_ext_remove(s, le32_to_cpu(fnode->ea_secno), fnode->ea_anode, le32_to_cpu(fnode->ea_size_l)); 489 489 brelse(bh); 490 490 hpfs_free_sectors(s, fno, 1); 491 491 }
+8 -16
fs/hpfs/buffer.c
··· 9 9 #include <linux/slab.h> 10 10 #include "hpfs_fn.h" 11 11 12 - void hpfs_lock_creation(struct super_block *s) 13 - { 14 - #ifdef DEBUG_LOCKS 15 - printk("lock creation\n"); 16 - #endif 17 - mutex_lock(&hpfs_sb(s)->hpfs_creation_de); 18 - } 19 - 20 - void hpfs_unlock_creation(struct super_block *s) 21 - { 22 - #ifdef DEBUG_LOCKS 23 - printk("unlock creation\n"); 24 - #endif 25 - mutex_unlock(&hpfs_sb(s)->hpfs_creation_de); 26 - } 27 - 28 12 /* Map a sector into a buffer and return pointers to it and to the buffer. */ 29 13 30 14 void *hpfs_map_sector(struct super_block *s, unsigned secno, struct buffer_head **bhp, 31 15 int ahead) 32 16 { 33 17 struct buffer_head *bh; 18 + 19 + hpfs_lock_assert(s); 34 20 35 21 cond_resched(); 36 22 ··· 35 49 { 36 50 struct buffer_head *bh; 37 51 /*return hpfs_map_sector(s, secno, bhp, 0);*/ 52 + 53 + hpfs_lock_assert(s); 38 54 39 55 cond_resched(); 40 56 ··· 57 69 { 58 70 struct buffer_head *bh; 59 71 char *data; 72 + 73 + hpfs_lock_assert(s); 60 74 61 75 cond_resched(); 62 76 ··· 114 124 struct quad_buffer_head *qbh) 115 125 { 116 126 cond_resched(); 127 + 128 + hpfs_lock_assert(s); 117 129 118 130 if (secno & 3) { 119 131 printk("HPFS: hpfs_get_4sectors: unaligned read\n");
+10 -12
fs/hpfs/dir.c
··· 88 88 hpfs_error(inode->i_sb, "not a directory, fnode %08lx", 89 89 (unsigned long)inode->i_ino); 90 90 } 91 - if (hpfs_inode->i_dno != fno->u.external[0].disk_secno) { 91 + if (hpfs_inode->i_dno != le32_to_cpu(fno->u.external[0].disk_secno)) { 92 92 e = 1; 93 - hpfs_error(inode->i_sb, "corrupted inode: i_dno == %08x, fnode -> dnode == %08x", hpfs_inode->i_dno, fno->u.external[0].disk_secno); 93 + hpfs_error(inode->i_sb, "corrupted inode: i_dno == %08x, fnode -> dnode == %08x", hpfs_inode->i_dno, le32_to_cpu(fno->u.external[0].disk_secno)); 94 94 } 95 95 brelse(bh); 96 96 if (e) { ··· 156 156 goto again; 157 157 } 158 158 tempname = hpfs_translate_name(inode->i_sb, de->name, de->namelen, lc, de->not_8x3); 159 - if (filldir(dirent, tempname, de->namelen, old_pos, de->fnode, DT_UNKNOWN) < 0) { 159 + if (filldir(dirent, tempname, de->namelen, old_pos, le32_to_cpu(de->fnode), DT_UNKNOWN) < 0) { 160 160 filp->f_pos = old_pos; 161 161 if (tempname != de->name) kfree(tempname); 162 162 hpfs_brelse4(&qbh); ··· 221 221 * Get inode number, what we're after. 222 222 */ 223 223 224 - ino = de->fnode; 224 + ino = le32_to_cpu(de->fnode); 225 225 226 226 /* 227 227 * Go find or make an inode. ··· 236 236 hpfs_init_inode(result); 237 237 if (de->directory) 238 238 hpfs_read_inode(result); 239 - else if (de->ea_size && hpfs_sb(dir->i_sb)->sb_eas) 239 + else if (le32_to_cpu(de->ea_size) && hpfs_sb(dir->i_sb)->sb_eas) 240 240 hpfs_read_inode(result); 241 241 else { 242 242 result->i_mode |= S_IFREG; ··· 250 250 hpfs_result = hpfs_i(result); 251 251 if (!de->directory) hpfs_result->i_parent_dir = dir->i_ino; 252 252 253 - hpfs_decide_conv(result, name, len); 254 - 255 253 if (de->has_acl || de->has_xtd_perm) if (!(dir->i_sb->s_flags & MS_RDONLY)) { 256 254 hpfs_error(result->i_sb, "ACLs or XPERM found. This is probably HPFS386. This driver doesn't support it now. Send me some info on these structures"); 257 255 goto bail1; ··· 261 263 */ 262 264 263 265 if (!result->i_ctime.tv_sec) { 264 - if (!(result->i_ctime.tv_sec = local_to_gmt(dir->i_sb, de->creation_date))) 266 + if (!(result->i_ctime.tv_sec = local_to_gmt(dir->i_sb, le32_to_cpu(de->creation_date)))) 265 267 result->i_ctime.tv_sec = 1; 266 268 result->i_ctime.tv_nsec = 0; 267 - result->i_mtime.tv_sec = local_to_gmt(dir->i_sb, de->write_date); 269 + result->i_mtime.tv_sec = local_to_gmt(dir->i_sb, le32_to_cpu(de->write_date)); 268 270 result->i_mtime.tv_nsec = 0; 269 - result->i_atime.tv_sec = local_to_gmt(dir->i_sb, de->read_date); 271 + result->i_atime.tv_sec = local_to_gmt(dir->i_sb, le32_to_cpu(de->read_date)); 270 272 result->i_atime.tv_nsec = 0; 271 - hpfs_result->i_ea_size = de->ea_size; 273 + hpfs_result->i_ea_size = le32_to_cpu(de->ea_size); 272 274 if (!hpfs_result->i_ea_mode && de->read_only) 273 275 result->i_mode &= ~0222; 274 276 if (!de->directory) { 275 277 if (result->i_size == -1) { 276 - result->i_size = de->file_size; 278 + result->i_size = le32_to_cpu(de->file_size); 277 279 result->i_data.a_ops = &hpfs_aops; 278 280 hpfs_i(result)->mmu_private = result->i_size; 279 281 /*
+84 -90
fs/hpfs/dnode.c
··· 14 14 struct hpfs_dirent *de_end = dnode_end_de(d); 15 15 int i = 1; 16 16 for (de = dnode_first_de(d); de < de_end; de = de_next_de(de)) { 17 - if (de == fde) return ((loff_t) d->self << 4) | (loff_t)i; 17 + if (de == fde) return ((loff_t) le32_to_cpu(d->self) << 4) | (loff_t)i; 18 18 i++; 19 19 } 20 20 printk("HPFS: get_pos: not_found\n"); 21 - return ((loff_t)d->self << 4) | (loff_t)1; 21 + return ((loff_t)le32_to_cpu(d->self) << 4) | (loff_t)1; 22 22 } 23 23 24 24 void hpfs_add_pos(struct inode *inode, loff_t *pos) ··· 130 130 { 131 131 struct hpfs_dirent *de; 132 132 if (!(de = dnode_last_de(d))) { 133 - hpfs_error(s, "set_last_pointer: empty dnode %08x", d->self); 133 + hpfs_error(s, "set_last_pointer: empty dnode %08x", le32_to_cpu(d->self)); 134 134 return; 135 135 } 136 136 if (hpfs_sb(s)->sb_chk) { 137 137 if (de->down) { 138 138 hpfs_error(s, "set_last_pointer: dnode %08x has already last pointer %08x", 139 - d->self, de_down_pointer(de)); 139 + le32_to_cpu(d->self), de_down_pointer(de)); 140 140 return; 141 141 } 142 - if (de->length != 32) { 143 - hpfs_error(s, "set_last_pointer: bad last dirent in dnode %08x", d->self); 142 + if (le16_to_cpu(de->length) != 32) { 143 + hpfs_error(s, "set_last_pointer: bad last dirent in dnode %08x", le32_to_cpu(d->self)); 144 144 return; 145 145 } 146 146 } 147 147 if (ptr) { 148 - if ((d->first_free += 4) > 2048) { 149 - hpfs_error(s,"set_last_pointer: too long dnode %08x", d->self); 150 - d->first_free -= 4; 148 + d->first_free = cpu_to_le32(le32_to_cpu(d->first_free) + 4); 149 + if (le32_to_cpu(d->first_free) > 2048) { 150 + hpfs_error(s, "set_last_pointer: too long dnode %08x", le32_to_cpu(d->self)); 151 + d->first_free = cpu_to_le32(le32_to_cpu(d->first_free) - 4); 151 152 return; 152 153 } 153 - de->length = 36; 154 + de->length = cpu_to_le16(36); 154 155 de->down = 1; 155 - *(dnode_secno *)((char *)de + 32) = ptr; 156 + *(dnode_secno *)((char *)de + 32) = cpu_to_le32(ptr); 156 157 } 157 158 } 158 159 ··· 169 168 for (de = dnode_first_de(d); de < de_end; de = de_next_de(de)) { 170 169 int c = hpfs_compare_names(s, name, namelen, de->name, de->namelen, de->last); 171 170 if (!c) { 172 - hpfs_error(s, "name (%c,%d) already exists in dnode %08x", *name, namelen, d->self); 171 + hpfs_error(s, "name (%c,%d) already exists in dnode %08x", *name, namelen, le32_to_cpu(d->self)); 173 172 return NULL; 174 173 } 175 174 if (c < 0) break; ··· 177 176 memmove((char *)de + d_size, de, (char *)de_end - (char *)de); 178 177 memset(de, 0, d_size); 179 178 if (down_ptr) { 180 - *(int *)((char *)de + d_size - 4) = down_ptr; 179 + *(dnode_secno *)((char *)de + d_size - 4) = cpu_to_le32(down_ptr); 181 180 de->down = 1; 182 181 } 183 - de->length = d_size; 184 - if (down_ptr) de->down = 1; 182 + de->length = cpu_to_le16(d_size); 185 183 de->not_8x3 = hpfs_is_name_long(name, namelen); 186 184 de->namelen = namelen; 187 185 memcpy(de->name, name, namelen); 188 - d->first_free += d_size; 186 + d->first_free = cpu_to_le32(le32_to_cpu(d->first_free) + d_size); 189 187 return de; 190 188 } 191 189 ··· 194 194 struct hpfs_dirent *de) 195 195 { 196 196 if (de->last) { 197 - hpfs_error(s, "attempt to delete last dirent in dnode %08x", d->self); 197 + hpfs_error(s, "attempt to delete last dirent in dnode %08x", le32_to_cpu(d->self)); 198 198 return; 199 199 } 200 - d->first_free -= de->length; 201 - memmove(de, de_next_de(de), d->first_free + (char *)d - (char *)de); 200 + d->first_free = cpu_to_le32(le32_to_cpu(d->first_free) - le16_to_cpu(de->length)); 201 + memmove(de, de_next_de(de), le32_to_cpu(d->first_free) + (char *)d - (char *)de); 202 202 } 203 203 204 204 static void fix_up_ptrs(struct super_block *s, struct dnode *d) 205 205 { 206 206 struct hpfs_dirent *de; 207 207 struct hpfs_dirent *de_end = dnode_end_de(d); 208 - dnode_secno dno = d->self; 208 + dnode_secno dno = le32_to_cpu(d->self); 209 209 for (de = dnode_first_de(d); de < de_end; de = de_next_de(de)) 210 210 if (de->down) { 211 211 struct quad_buffer_head qbh; 212 212 struct dnode *dd; 213 213 if ((dd = hpfs_map_dnode(s, de_down_pointer(de), &qbh))) { 214 - if (dd->up != dno || dd->root_dnode) { 215 - dd->up = dno; 214 + if (le32_to_cpu(dd->up) != dno || dd->root_dnode) { 215 + dd->up = cpu_to_le32(dno); 216 216 dd->root_dnode = 0; 217 217 hpfs_mark_4buffers_dirty(&qbh); 218 218 } ··· 262 262 kfree(nname); 263 263 return 1; 264 264 } 265 - if (d->first_free + de_size(namelen, down_ptr) <= 2048) { 265 + if (le32_to_cpu(d->first_free) + de_size(namelen, down_ptr) <= 2048) { 266 266 loff_t t; 267 267 copy_de(de=hpfs_add_de(i->i_sb, d, name, namelen, down_ptr), new_de); 268 268 t = get_pos(d, de); ··· 286 286 kfree(nname); 287 287 return 1; 288 288 } 289 - memcpy(nd, d, d->first_free); 289 + memcpy(nd, d, le32_to_cpu(d->first_free)); 290 290 copy_de(de = hpfs_add_de(i->i_sb, nd, name, namelen, down_ptr), new_de); 291 291 for_all_poss(i, hpfs_pos_ins, get_pos(nd, de), 1); 292 292 h = ((char *)dnode_last_de(nd) - (char *)nd) / 2 + 10; 293 - if (!(ad = hpfs_alloc_dnode(i->i_sb, d->up, &adno, &qbh1, 0))) { 293 + if (!(ad = hpfs_alloc_dnode(i->i_sb, le32_to_cpu(d->up), &adno, &qbh1))) { 294 294 hpfs_error(i->i_sb, "unable to alloc dnode - dnode tree will be corrupted"); 295 295 hpfs_brelse4(&qbh); 296 296 kfree(nd); ··· 313 313 down_ptr = adno; 314 314 set_last_pointer(i->i_sb, ad, de->down ? de_down_pointer(de) : 0); 315 315 de = de_next_de(de); 316 - memmove((char *)nd + 20, de, nd->first_free + (char *)nd - (char *)de); 317 - nd->first_free -= (char *)de - (char *)nd - 20; 318 - memcpy(d, nd, nd->first_free); 316 + memmove((char *)nd + 20, de, le32_to_cpu(nd->first_free) + (char *)nd - (char *)de); 317 + nd->first_free = cpu_to_le32(le32_to_cpu(nd->first_free) - ((char *)de - (char *)nd - 20)); 318 + memcpy(d, nd, le32_to_cpu(nd->first_free)); 319 319 for_all_poss(i, hpfs_pos_del, (loff_t)dno << 4, pos); 320 320 fix_up_ptrs(i->i_sb, ad); 321 321 if (!d->root_dnode) { 322 - dno = ad->up = d->up; 322 + ad->up = d->up; 323 + dno = le32_to_cpu(ad->up); 323 324 hpfs_mark_4buffers_dirty(&qbh); 324 325 hpfs_brelse4(&qbh); 325 326 hpfs_mark_4buffers_dirty(&qbh1); 326 327 hpfs_brelse4(&qbh1); 327 328 goto go_up; 328 329 } 329 - if (!(rd = hpfs_alloc_dnode(i->i_sb, d->up, &rdno, &qbh2, 0))) { 330 + if (!(rd = hpfs_alloc_dnode(i->i_sb, le32_to_cpu(d->up), &rdno, &qbh2))) { 330 331 hpfs_error(i->i_sb, "unable to alloc dnode - dnode tree will be corrupted"); 331 332 hpfs_brelse4(&qbh); 332 333 hpfs_brelse4(&qbh1); ··· 339 338 i->i_blocks += 4; 340 339 rd->root_dnode = 1; 341 340 rd->up = d->up; 342 - if (!(fnode = hpfs_map_fnode(i->i_sb, d->up, &bh))) { 341 + if (!(fnode = hpfs_map_fnode(i->i_sb, le32_to_cpu(d->up), &bh))) { 343 342 hpfs_free_dnode(i->i_sb, rdno); 344 343 hpfs_brelse4(&qbh); 345 344 hpfs_brelse4(&qbh1); ··· 348 347 kfree(nname); 349 348 return 1; 350 349 } 351 - fnode->u.external[0].disk_secno = rdno; 350 + fnode->u.external[0].disk_secno = cpu_to_le32(rdno); 352 351 mark_buffer_dirty(bh); 353 352 brelse(bh); 354 - d->up = ad->up = hpfs_i(i)->i_dno = rdno; 353 + hpfs_i(i)->i_dno = rdno; 354 + d->up = ad->up = cpu_to_le32(rdno); 355 355 d->root_dnode = ad->root_dnode = 0; 356 356 hpfs_mark_4buffers_dirty(&qbh); 357 357 hpfs_brelse4(&qbh); ··· 375 373 376 374 int hpfs_add_dirent(struct inode *i, 377 375 const unsigned char *name, unsigned namelen, 378 - struct hpfs_dirent *new_de, int cdepth) 376 + struct hpfs_dirent *new_de) 379 377 { 380 378 struct hpfs_inode_info *hpfs_inode = hpfs_i(i); 381 379 struct dnode *d; ··· 405 403 } 406 404 } 407 405 hpfs_brelse4(&qbh); 408 - if (!cdepth) hpfs_lock_creation(i->i_sb); 409 406 if (hpfs_check_free_dnodes(i->i_sb, FREE_DNODES_ADD)) { 410 407 c = 1; 411 408 goto ret; ··· 412 411 i->i_version++; 413 412 c = hpfs_add_to_dnode(i, dno, name, namelen, new_de, 0); 414 413 ret: 415 - if (!cdepth) hpfs_unlock_creation(i->i_sb); 416 414 return c; 417 415 } 418 416 ··· 437 437 return 0; 438 438 if (!(dnode = hpfs_map_dnode(i->i_sb, dno, &qbh))) return 0; 439 439 if (hpfs_sb(i->i_sb)->sb_chk) { 440 - if (dnode->up != chk_up) { 440 + if (le32_to_cpu(dnode->up) != chk_up) { 441 441 hpfs_error(i->i_sb, "move_to_top: up pointer from %08x should be %08x, is %08x", 442 - dno, chk_up, dnode->up); 442 + dno, chk_up, le32_to_cpu(dnode->up)); 443 443 hpfs_brelse4(&qbh); 444 444 return 0; 445 445 } ··· 455 455 hpfs_brelse4(&qbh); 456 456 } 457 457 while (!(de = dnode_pre_last_de(dnode))) { 458 - dnode_secno up = dnode->up; 458 + dnode_secno up = le32_to_cpu(dnode->up); 459 459 hpfs_brelse4(&qbh); 460 460 hpfs_free_dnode(i->i_sb, dno); 461 461 i->i_size -= 2048; ··· 474 474 hpfs_brelse4(&qbh); 475 475 return 0; 476 476 } 477 - dnode->first_free -= 4; 478 - de->length -= 4; 477 + dnode->first_free = cpu_to_le32(le32_to_cpu(dnode->first_free) - 4); 478 + de->length = cpu_to_le16(le16_to_cpu(de->length) - 4); 479 479 de->down = 0; 480 480 hpfs_mark_4buffers_dirty(&qbh); 481 481 dno = up; ··· 483 483 t = get_pos(dnode, de); 484 484 for_all_poss(i, hpfs_pos_subst, t, 4); 485 485 for_all_poss(i, hpfs_pos_subst, t + 1, 5); 486 - if (!(nde = kmalloc(de->length, GFP_NOFS))) { 486 + if (!(nde = kmalloc(le16_to_cpu(de->length), GFP_NOFS))) { 487 487 hpfs_error(i->i_sb, "out of memory for dirent - directory will be corrupted"); 488 488 hpfs_brelse4(&qbh); 489 489 return 0; 490 490 } 491 - memcpy(nde, de, de->length); 491 + memcpy(nde, de, le16_to_cpu(de->length)); 492 492 ddno = de->down ? de_down_pointer(de) : 0; 493 493 hpfs_delete_de(i->i_sb, dnode, de); 494 494 set_last_pointer(i->i_sb, dnode, ddno); ··· 517 517 try_it_again: 518 518 if (hpfs_stop_cycles(i->i_sb, dno, &c1, &c2, "delete_empty_dnode")) return; 519 519 if (!(dnode = hpfs_map_dnode(i->i_sb, dno, &qbh))) return; 520 - if (dnode->first_free > 56) goto end; 521 - if (dnode->first_free == 52 || dnode->first_free == 56) { 520 + if (le32_to_cpu(dnode->first_free) > 56) goto end; 521 + if (le32_to_cpu(dnode->first_free) == 52 || le32_to_cpu(dnode->first_free) == 56) { 522 522 struct hpfs_dirent *de_end; 523 523 int root = dnode->root_dnode; 524 - up = dnode->up; 524 + up = le32_to_cpu(dnode->up); 525 525 de = dnode_first_de(dnode); 526 526 down = de->down ? de_down_pointer(de) : 0; 527 527 if (hpfs_sb(i->i_sb)->sb_chk) if (root && !down) { ··· 545 545 return; 546 546 } 547 547 if ((d1 = hpfs_map_dnode(i->i_sb, down, &qbh1))) { 548 - d1->up = up; 548 + d1->up = cpu_to_le32(up); 549 549 d1->root_dnode = 1; 550 550 hpfs_mark_4buffers_dirty(&qbh1); 551 551 hpfs_brelse4(&qbh1); 552 552 } 553 553 if ((fnode = hpfs_map_fnode(i->i_sb, up, &bh))) { 554 - fnode->u.external[0].disk_secno = down; 554 + fnode->u.external[0].disk_secno = cpu_to_le32(down); 555 555 mark_buffer_dirty(bh); 556 556 brelse(bh); 557 557 } ··· 570 570 for_all_poss(i, hpfs_pos_subst, ((loff_t)dno << 4) | 1, ((loff_t)up << 4) | p); 571 571 if (!down) { 572 572 de->down = 0; 573 - de->length -= 4; 574 - dnode->first_free -= 4; 573 + de->length = cpu_to_le16(le16_to_cpu(de->length) - 4); 574 + dnode->first_free = cpu_to_le32(le32_to_cpu(dnode->first_free) - 4); 575 575 memmove(de_next_de(de), (char *)de_next_de(de) + 4, 576 - (char *)dnode + dnode->first_free - (char *)de_next_de(de)); 576 + (char *)dnode + le32_to_cpu(dnode->first_free) - (char *)de_next_de(de)); 577 577 } else { 578 578 struct dnode *d1; 579 579 struct quad_buffer_head qbh1; 580 - *(dnode_secno *) ((void *) de + de->length - 4) = down; 580 + *(dnode_secno *) ((void *) de + le16_to_cpu(de->length) - 4) = down; 581 581 if ((d1 = hpfs_map_dnode(i->i_sb, down, &qbh1))) { 582 - d1->up = up; 582 + d1->up = cpu_to_le32(up); 583 583 hpfs_mark_4buffers_dirty(&qbh1); 584 584 hpfs_brelse4(&qbh1); 585 585 } 586 586 } 587 587 } else { 588 - hpfs_error(i->i_sb, "delete_empty_dnode: dnode %08x, first_free == %03x", dno, dnode->first_free); 588 + hpfs_error(i->i_sb, "delete_empty_dnode: dnode %08x, first_free == %03x", dno, le32_to_cpu(dnode->first_free)); 589 589 goto end; 590 590 } 591 591 ··· 596 596 struct quad_buffer_head qbh1; 597 597 if (!de_next->down) goto endm; 598 598 ndown = de_down_pointer(de_next); 599 - if (!(de_cp = kmalloc(de->length, GFP_NOFS))) { 599 + if (!(de_cp = kmalloc(le16_to_cpu(de->length), GFP_NOFS))) { 600 600 printk("HPFS: out of memory for dtree balancing\n"); 601 601 goto endm; 602 602 } 603 - memcpy(de_cp, de, de->length); 603 + memcpy(de_cp, de, le16_to_cpu(de->length)); 604 604 hpfs_delete_de(i->i_sb, dnode, de); 605 605 hpfs_mark_4buffers_dirty(&qbh); 606 606 hpfs_brelse4(&qbh); 607 607 for_all_poss(i, hpfs_pos_subst, ((loff_t)up << 4) | p, 4); 608 608 for_all_poss(i, hpfs_pos_del, ((loff_t)up << 4) | p, 1); 609 609 if (de_cp->down) if ((d1 = hpfs_map_dnode(i->i_sb, de_down_pointer(de_cp), &qbh1))) { 610 - d1->up = ndown; 610 + d1->up = cpu_to_le32(ndown); 611 611 hpfs_mark_4buffers_dirty(&qbh1); 612 612 hpfs_brelse4(&qbh1); 613 613 } ··· 635 635 struct hpfs_dirent *del = dnode_last_de(d1); 636 636 dlp = del->down ? de_down_pointer(del) : 0; 637 637 if (!dlp && down) { 638 - if (d1->first_free > 2044) { 638 + if (le32_to_cpu(d1->first_free) > 2044) { 639 639 if (hpfs_sb(i->i_sb)->sb_chk >= 2) { 640 640 printk("HPFS: warning: unbalanced dnode tree, see hpfs.txt 4 more info\n"); 641 641 printk("HPFS: warning: terminating balancing operation\n"); ··· 647 647 printk("HPFS: warning: unbalanced dnode tree, see hpfs.txt 4 more info\n"); 648 648 printk("HPFS: warning: goin'on\n"); 649 649 } 650 - del->length += 4; 650 + del->length = cpu_to_le16(le16_to_cpu(del->length) + 4); 651 651 del->down = 1; 652 - d1->first_free += 4; 652 + d1->first_free = cpu_to_le32(le32_to_cpu(d1->first_free) + 4); 653 653 } 654 654 if (dlp && !down) { 655 - del->length -= 4; 655 + del->length = cpu_to_le16(le16_to_cpu(del->length) - 4); 656 656 del->down = 0; 657 - d1->first_free -= 4; 657 + d1->first_free = cpu_to_le32(le32_to_cpu(d1->first_free) - 4); 658 658 } else if (down) 659 - *(dnode_secno *) ((void *) del + del->length - 4) = down; 659 + *(dnode_secno *) ((void *) del + le16_to_cpu(del->length) - 4) = cpu_to_le32(down); 660 660 } else goto endm; 661 - if (!(de_cp = kmalloc(de_prev->length, GFP_NOFS))) { 661 + if (!(de_cp = kmalloc(le16_to_cpu(de_prev->length), GFP_NOFS))) { 662 662 printk("HPFS: out of memory for dtree balancing\n"); 663 663 hpfs_brelse4(&qbh1); 664 664 goto endm; 665 665 } 666 666 hpfs_mark_4buffers_dirty(&qbh1); 667 667 hpfs_brelse4(&qbh1); 668 - memcpy(de_cp, de_prev, de_prev->length); 668 + memcpy(de_cp, de_prev, le16_to_cpu(de_prev->length)); 669 669 hpfs_delete_de(i->i_sb, dnode, de_prev); 670 670 if (!de_prev->down) { 671 - de_prev->length += 4; 671 + de_prev->length = cpu_to_le16(le16_to_cpu(de_prev->length) + 4); 672 672 de_prev->down = 1; 673 - dnode->first_free += 4; 673 + dnode->first_free = cpu_to_le32(le32_to_cpu(dnode->first_free) + 4); 674 674 } 675 - *(dnode_secno *) ((void *) de_prev + de_prev->length - 4) = ndown; 675 + *(dnode_secno *) ((void *) de_prev + le16_to_cpu(de_prev->length) - 4) = cpu_to_le32(ndown); 676 676 hpfs_mark_4buffers_dirty(&qbh); 677 677 hpfs_brelse4(&qbh); 678 678 for_all_poss(i, hpfs_pos_subst, ((loff_t)up << 4) | (p - 1), 4); 679 679 for_all_poss(i, hpfs_pos_subst, ((loff_t)up << 4) | p, ((loff_t)up << 4) | (p - 1)); 680 680 if (down) if ((d1 = hpfs_map_dnode(i->i_sb, de_down_pointer(de), &qbh1))) { 681 - d1->up = ndown; 681 + d1->up = cpu_to_le32(ndown); 682 682 hpfs_mark_4buffers_dirty(&qbh1); 683 683 hpfs_brelse4(&qbh1); 684 684 } ··· 701 701 { 702 702 struct dnode *dnode = qbh->data; 703 703 dnode_secno down = 0; 704 - int lock = 0; 705 704 loff_t t; 706 705 if (de->first || de->last) { 707 706 hpfs_error(i->i_sb, "hpfs_remove_dirent: attempt to delete first or last dirent in dnode %08x", dno); ··· 709 710 } 710 711 if (de->down) down = de_down_pointer(de); 711 712 if (depth && (de->down || (de == dnode_first_de(dnode) && de_next_de(de)->last))) { 712 - lock = 1; 713 - hpfs_lock_creation(i->i_sb); 714 713 if (hpfs_check_free_dnodes(i->i_sb, FREE_DNODES_DEL)) { 715 714 hpfs_brelse4(qbh); 716 - hpfs_unlock_creation(i->i_sb); 717 715 return 2; 718 716 } 719 717 } ··· 723 727 dnode_secno a = move_to_top(i, down, dno); 724 728 for_all_poss(i, hpfs_pos_subst, 5, t); 725 729 if (a) delete_empty_dnode(i, a); 726 - if (lock) hpfs_unlock_creation(i->i_sb); 727 730 return !a; 728 731 } 729 732 delete_empty_dnode(i, dno); 730 - if (lock) hpfs_unlock_creation(i->i_sb); 731 733 return 0; 732 734 } 733 735 ··· 745 751 ptr = 0; 746 752 go_up: 747 753 if (!(dnode = hpfs_map_dnode(s, dno, &qbh))) return; 748 - if (hpfs_sb(s)->sb_chk) if (odno && odno != -1 && dnode->up != odno) 749 - hpfs_error(s, "hpfs_count_dnodes: bad up pointer; dnode %08x, down %08x points to %08x", odno, dno, dnode->up); 754 + if (hpfs_sb(s)->sb_chk) if (odno && odno != -1 && le32_to_cpu(dnode->up) != odno) 755 + hpfs_error(s, "hpfs_count_dnodes: bad up pointer; dnode %08x, down %08x points to %08x", odno, dno, le32_to_cpu(dnode->up)); 750 756 de = dnode_first_de(dnode); 751 757 if (ptr) while(1) { 752 758 if (de->down) if (de_down_pointer(de) == ptr) goto process_de; ··· 770 776 if (!de->first && !de->last && n_items) (*n_items)++; 771 777 if ((de = de_next_de(de)) < dnode_end_de(dnode)) goto next_de; 772 778 ptr = dno; 773 - dno = dnode->up; 779 + dno = le32_to_cpu(dnode->up); 774 780 if (dnode->root_dnode) { 775 781 hpfs_brelse4(&qbh); 776 782 return; ··· 818 824 return d; 819 825 if (!(de = map_nth_dirent(s, d, 1, &qbh, NULL))) return dno; 820 826 if (hpfs_sb(s)->sb_chk) 821 - if (up && ((struct dnode *)qbh.data)->up != up) 822 - hpfs_error(s, "hpfs_de_as_down_as_possible: bad up pointer; dnode %08x, down %08x points to %08x", up, d, ((struct dnode *)qbh.data)->up); 827 + if (up && le32_to_cpu(((struct dnode *)qbh.data)->up) != up) 828 + hpfs_error(s, "hpfs_de_as_down_as_possible: bad up pointer; dnode %08x, down %08x points to %08x", up, d, le32_to_cpu(((struct dnode *)qbh.data)->up)); 823 829 if (!de->down) { 824 830 hpfs_brelse4(&qbh); 825 831 return d; ··· 868 874 /* Going up */ 869 875 if (dnode->root_dnode) goto bail; 870 876 871 - if (!(up_dnode = hpfs_map_dnode(inode->i_sb, dnode->up, &qbh0))) 877 + if (!(up_dnode = hpfs_map_dnode(inode->i_sb, le32_to_cpu(dnode->up), &qbh0))) 872 878 goto bail; 873 879 874 880 end_up_de = dnode_end_de(up_dnode); ··· 876 882 for (up_de = dnode_first_de(up_dnode); up_de < end_up_de; 877 883 up_de = de_next_de(up_de)) { 878 884 if (!(++c & 077)) hpfs_error(inode->i_sb, 879 - "map_pos_dirent: pos crossed dnode boundary; dnode = %08x", dnode->up); 885 + "map_pos_dirent: pos crossed dnode boundary; dnode = %08x", le32_to_cpu(dnode->up)); 880 886 if (up_de->down && de_down_pointer(up_de) == dno) { 881 - *posp = ((loff_t) dnode->up << 4) + c; 887 + *posp = ((loff_t) le32_to_cpu(dnode->up) << 4) + c; 882 888 hpfs_brelse4(&qbh0); 883 889 return de; 884 890 } 885 891 } 886 892 887 893 hpfs_error(inode->i_sb, "map_pos_dirent: pointer to dnode %08x not found in parent dnode %08x", 888 - dno, dnode->up); 894 + dno, le32_to_cpu(dnode->up)); 889 895 hpfs_brelse4(&qbh0); 890 896 891 897 bail: ··· 1011 1017 /*name2[15] = 0xff;*/ 1012 1018 name1len = 15; name2len = 256; 1013 1019 } 1014 - if (!(upf = hpfs_map_fnode(s, f->up, &bh))) { 1020 + if (!(upf = hpfs_map_fnode(s, le32_to_cpu(f->up), &bh))) { 1015 1021 kfree(name2); 1016 1022 return NULL; 1017 1023 } 1018 1024 if (!upf->dirflag) { 1019 1025 brelse(bh); 1020 - hpfs_error(s, "fnode %08x has non-directory parent %08x", fno, f->up); 1026 + hpfs_error(s, "fnode %08x has non-directory parent %08x", fno, le32_to_cpu(f->up)); 1021 1027 kfree(name2); 1022 1028 return NULL; 1023 1029 } 1024 - dno = upf->u.external[0].disk_secno; 1030 + dno = le32_to_cpu(upf->u.external[0].disk_secno); 1025 1031 brelse(bh); 1026 1032 go_down: 1027 1033 downd = 0; ··· 1043 1049 return NULL; 1044 1050 } 1045 1051 next_de: 1046 - if (de->fnode == fno) { 1052 + if (le32_to_cpu(de->fnode) == fno) { 1047 1053 kfree(name2); 1048 1054 return de; 1049 1055 } ··· 1059 1065 goto go_down; 1060 1066 } 1061 1067 f: 1062 - if (de->fnode == fno) { 1068 + if (le32_to_cpu(de->fnode) == fno) { 1063 1069 kfree(name2); 1064 1070 return de; 1065 1071 } ··· 1068 1074 if ((de = de_next_de(de)) < de_end) goto next_de; 1069 1075 if (d->root_dnode) goto not_found; 1070 1076 downd = dno; 1071 - dno = d->up; 1077 + dno = le32_to_cpu(d->up); 1072 1078 hpfs_brelse4(qbh); 1073 1079 if (hpfs_sb(s)->sb_chk) 1074 1080 if (hpfs_stop_cycles(s, downd, &d1, &d2, "map_fnode_dirent #2")) {
+69 -67
fs/hpfs/ea.c
··· 24 24 } 25 25 if (hpfs_ea_read(s, a, ano, pos, 4, ex)) return; 26 26 if (ea->indirect) { 27 - if (ea->valuelen != 8) { 27 + if (ea_valuelen(ea) != 8) { 28 28 hpfs_error(s, "ea->indirect set while ea->valuelen!=8, %s %08x, pos %08x", 29 29 ano ? "anode" : "sectors", a, pos); 30 30 return; ··· 33 33 return; 34 34 hpfs_ea_remove(s, ea_sec(ea), ea->anode, ea_len(ea)); 35 35 } 36 - pos += ea->namelen + ea->valuelen + 5; 36 + pos += ea->namelen + ea_valuelen(ea) + 5; 37 37 } 38 38 if (!ano) hpfs_free_sectors(s, a, (len+511) >> 9); 39 39 else { ··· 76 76 unsigned pos; 77 77 int ano, len; 78 78 secno a; 79 + char ex[4 + 255 + 1 + 8]; 79 80 struct extended_attribute *ea; 80 81 struct extended_attribute *ea_end = fnode_end_ea(fnode); 81 82 for (ea = fnode_ea(fnode); ea < ea_end; ea = next_ea(ea)) 82 83 if (!strcmp(ea->name, key)) { 83 84 if (ea->indirect) 84 85 goto indirect; 85 - if (ea->valuelen >= size) 86 + if (ea_valuelen(ea) >= size) 86 87 return -EINVAL; 87 - memcpy(buf, ea_data(ea), ea->valuelen); 88 - buf[ea->valuelen] = 0; 88 + memcpy(buf, ea_data(ea), ea_valuelen(ea)); 89 + buf[ea_valuelen(ea)] = 0; 89 90 return 0; 90 91 } 91 - a = fnode->ea_secno; 92 - len = fnode->ea_size_l; 92 + a = le32_to_cpu(fnode->ea_secno); 93 + len = le32_to_cpu(fnode->ea_size_l); 93 94 ano = fnode->ea_anode; 94 95 pos = 0; 95 96 while (pos < len) { 96 - char ex[4 + 255 + 1 + 8]; 97 97 ea = (struct extended_attribute *)ex; 98 98 if (pos + 4 > len) { 99 99 hpfs_error(s, "EAs don't end correctly, %s %08x, len %08x", ··· 106 106 if (!strcmp(ea->name, key)) { 107 107 if (ea->indirect) 108 108 goto indirect; 109 - if (ea->valuelen >= size) 109 + if (ea_valuelen(ea) >= size) 110 110 return -EINVAL; 111 - if (hpfs_ea_read(s, a, ano, pos + 4 + ea->namelen + 1, ea->valuelen, buf)) 111 + if (hpfs_ea_read(s, a, ano, pos + 4 + ea->namelen + 1, ea_valuelen(ea), buf)) 112 112 return -EIO; 113 - buf[ea->valuelen] = 0; 113 + buf[ea_valuelen(ea)] = 0; 114 114 return 0; 115 115 } 116 - pos += ea->namelen + ea->valuelen + 5; 116 + pos += ea->namelen + ea_valuelen(ea) + 5; 117 117 } 118 118 return -ENOENT; 119 119 indirect: ··· 138 138 if (!strcmp(ea->name, key)) { 139 139 if (ea->indirect) 140 140 return get_indirect_ea(s, ea->anode, ea_sec(ea), *size = ea_len(ea)); 141 - if (!(ret = kmalloc((*size = ea->valuelen) + 1, GFP_NOFS))) { 141 + if (!(ret = kmalloc((*size = ea_valuelen(ea)) + 1, GFP_NOFS))) { 142 142 printk("HPFS: out of memory for EA\n"); 143 143 return NULL; 144 144 } 145 - memcpy(ret, ea_data(ea), ea->valuelen); 146 - ret[ea->valuelen] = 0; 145 + memcpy(ret, ea_data(ea), ea_valuelen(ea)); 146 + ret[ea_valuelen(ea)] = 0; 147 147 return ret; 148 148 } 149 - a = fnode->ea_secno; 150 - len = fnode->ea_size_l; 149 + a = le32_to_cpu(fnode->ea_secno); 150 + len = le32_to_cpu(fnode->ea_size_l); 151 151 ano = fnode->ea_anode; 152 152 pos = 0; 153 153 while (pos < len) { ··· 164 164 if (!strcmp(ea->name, key)) { 165 165 if (ea->indirect) 166 166 return get_indirect_ea(s, ea->anode, ea_sec(ea), *size = ea_len(ea)); 167 - if (!(ret = kmalloc((*size = ea->valuelen) + 1, GFP_NOFS))) { 167 + if (!(ret = kmalloc((*size = ea_valuelen(ea)) + 1, GFP_NOFS))) { 168 168 printk("HPFS: out of memory for EA\n"); 169 169 return NULL; 170 170 } 171 - if (hpfs_ea_read(s, a, ano, pos + 4 + ea->namelen + 1, ea->valuelen, ret)) { 171 + if (hpfs_ea_read(s, a, ano, pos + 4 + ea->namelen + 1, ea_valuelen(ea), ret)) { 172 172 kfree(ret); 173 173 return NULL; 174 174 } 175 - ret[ea->valuelen] = 0; 175 + ret[ea_valuelen(ea)] = 0; 176 176 return ret; 177 177 } 178 - pos += ea->namelen + ea->valuelen + 5; 178 + pos += ea->namelen + ea_valuelen(ea) + 5; 179 179 } 180 180 return NULL; 181 181 } ··· 202 202 if (ea->indirect) { 203 203 if (ea_len(ea) == size) 204 204 set_indirect_ea(s, ea->anode, ea_sec(ea), data, size); 205 - } else if (ea->valuelen == size) { 205 + } else if (ea_valuelen(ea) == size) { 206 206 memcpy(ea_data(ea), data, size); 207 207 } 208 208 return; 209 209 } 210 - a = fnode->ea_secno; 211 - len = fnode->ea_size_l; 210 + a = le32_to_cpu(fnode->ea_secno); 211 + len = le32_to_cpu(fnode->ea_size_l); 212 212 ano = fnode->ea_anode; 213 213 pos = 0; 214 214 while (pos < len) { ··· 228 228 set_indirect_ea(s, ea->anode, ea_sec(ea), data, size); 229 229 } 230 230 else { 231 - if (ea->valuelen == size) 231 + if (ea_valuelen(ea) == size) 232 232 hpfs_ea_write(s, a, ano, pos + 4 + ea->namelen + 1, size, data); 233 233 } 234 234 return; 235 235 } 236 - pos += ea->namelen + ea->valuelen + 5; 236 + pos += ea->namelen + ea_valuelen(ea) + 5; 237 237 } 238 - if (!fnode->ea_offs) { 239 - /*if (fnode->ea_size_s) { 238 + if (!le16_to_cpu(fnode->ea_offs)) { 239 + /*if (le16_to_cpu(fnode->ea_size_s)) { 240 240 hpfs_error(s, "fnode %08x: ea_size_s == %03x, ea_offs == 0", 241 - inode->i_ino, fnode->ea_size_s); 241 + inode->i_ino, le16_to_cpu(fnode->ea_size_s)); 242 242 return; 243 243 }*/ 244 - fnode->ea_offs = 0xc4; 244 + fnode->ea_offs = cpu_to_le16(0xc4); 245 245 } 246 - if (fnode->ea_offs < 0xc4 || fnode->ea_offs + fnode->acl_size_s + fnode->ea_size_s > 0x200) { 246 + if (le16_to_cpu(fnode->ea_offs) < 0xc4 || le16_to_cpu(fnode->ea_offs) + le16_to_cpu(fnode->acl_size_s) + le16_to_cpu(fnode->ea_size_s) > 0x200) { 247 247 hpfs_error(s, "fnode %08lx: ea_offs == %03x, ea_size_s == %03x", 248 248 (unsigned long)inode->i_ino, 249 - fnode->ea_offs, fnode->ea_size_s); 249 + le32_to_cpu(fnode->ea_offs), le16_to_cpu(fnode->ea_size_s)); 250 250 return; 251 251 } 252 - if ((fnode->ea_size_s || !fnode->ea_size_l) && 253 - fnode->ea_offs + fnode->acl_size_s + fnode->ea_size_s + strlen(key) + size + 5 <= 0x200) { 252 + if ((le16_to_cpu(fnode->ea_size_s) || !le32_to_cpu(fnode->ea_size_l)) && 253 + le16_to_cpu(fnode->ea_offs) + le16_to_cpu(fnode->acl_size_s) + le16_to_cpu(fnode->ea_size_s) + strlen(key) + size + 5 <= 0x200) { 254 254 ea = fnode_end_ea(fnode); 255 255 *(char *)ea = 0; 256 256 ea->namelen = strlen(key); 257 - ea->valuelen = size; 257 + ea->valuelen_lo = size; 258 + ea->valuelen_hi = size >> 8; 258 259 strcpy(ea->name, key); 259 260 memcpy(ea_data(ea), data, size); 260 - fnode->ea_size_s += strlen(key) + size + 5; 261 + fnode->ea_size_s = cpu_to_le16(le16_to_cpu(fnode->ea_size_s) + strlen(key) + size + 5); 261 262 goto ret; 262 263 } 263 264 /* Most the code here is 99.9993422% unused. I hope there are no bugs. 264 265 But what .. HPFS.IFS has also bugs in ea management. */ 265 - if (fnode->ea_size_s && !fnode->ea_size_l) { 266 + if (le16_to_cpu(fnode->ea_size_s) && !le32_to_cpu(fnode->ea_size_l)) { 266 267 secno n; 267 268 struct buffer_head *bh; 268 269 char *data; 269 - if (!(n = hpfs_alloc_sector(s, fno, 1, 0, 1))) return; 270 + if (!(n = hpfs_alloc_sector(s, fno, 1, 0))) return; 270 271 if (!(data = hpfs_get_sector(s, n, &bh))) { 271 272 hpfs_free_sectors(s, n, 1); 272 273 return; 273 274 } 274 - memcpy(data, fnode_ea(fnode), fnode->ea_size_s); 275 - fnode->ea_size_l = fnode->ea_size_s; 276 - fnode->ea_size_s = 0; 277 - fnode->ea_secno = n; 278 - fnode->ea_anode = 0; 275 + memcpy(data, fnode_ea(fnode), le16_to_cpu(fnode->ea_size_s)); 276 + fnode->ea_size_l = cpu_to_le32(le16_to_cpu(fnode->ea_size_s)); 277 + fnode->ea_size_s = cpu_to_le16(0); 278 + fnode->ea_secno = cpu_to_le32(n); 279 + fnode->ea_anode = cpu_to_le32(0); 279 280 mark_buffer_dirty(bh); 280 281 brelse(bh); 281 282 } 282 - pos = fnode->ea_size_l + 5 + strlen(key) + size; 283 - len = (fnode->ea_size_l + 511) >> 9; 283 + pos = le32_to_cpu(fnode->ea_size_l) + 5 + strlen(key) + size; 284 + len = (le32_to_cpu(fnode->ea_size_l) + 511) >> 9; 284 285 if (pos >= 30000) goto bail; 285 286 while (((pos + 511) >> 9) > len) { 286 287 if (!len) { 287 - if (!(fnode->ea_secno = hpfs_alloc_sector(s, fno, 1, 0, 1))) 288 - goto bail; 288 + secno q = hpfs_alloc_sector(s, fno, 1, 0); 289 + if (!q) goto bail; 290 + fnode->ea_secno = cpu_to_le32(q); 289 291 fnode->ea_anode = 0; 290 292 len++; 291 293 } else if (!fnode->ea_anode) { 292 - if (hpfs_alloc_if_possible(s, fnode->ea_secno + len)) { 294 + if (hpfs_alloc_if_possible(s, le32_to_cpu(fnode->ea_secno) + len)) { 293 295 len++; 294 296 } else { 295 297 /* Aargh... don't know how to create ea anodes :-( */ ··· 300 298 anode_secno a_s; 301 299 if (!(anode = hpfs_alloc_anode(s, fno, &a_s, &bh))) 302 300 goto bail; 303 - anode->up = fno; 301 + anode->up = cpu_to_le32(fno); 304 302 anode->btree.fnode_parent = 1; 305 303 anode->btree.n_free_nodes--; 306 304 anode->btree.n_used_nodes++; 307 - anode->btree.first_free += 12; 308 - anode->u.external[0].disk_secno = fnode->ea_secno; 309 - anode->u.external[0].file_secno = 0; 310 - anode->u.external[0].length = len; 305 + anode->btree.first_free = cpu_to_le16(le16_to_cpu(anode->btree.first_free) + 12); 306 + anode->u.external[0].disk_secno = cpu_to_le32(le32_to_cpu(fnode->ea_secno)); 307 + anode->u.external[0].file_secno = cpu_to_le32(0); 308 + anode->u.external[0].length = cpu_to_le32(len); 311 309 mark_buffer_dirty(bh); 312 310 brelse(bh); 313 311 fnode->ea_anode = 1; 314 - fnode->ea_secno = a_s;*/ 312 + fnode->ea_secno = cpu_to_le32(a_s);*/ 315 313 secno new_sec; 316 314 int i; 317 - if (!(new_sec = hpfs_alloc_sector(s, fno, 1, 1 - ((pos + 511) >> 9), 1))) 315 + if (!(new_sec = hpfs_alloc_sector(s, fno, 1, 1 - ((pos + 511) >> 9)))) 318 316 goto bail; 319 317 for (i = 0; i < len; i++) { 320 318 struct buffer_head *bh1, *bh2; 321 319 void *b1, *b2; 322 - if (!(b1 = hpfs_map_sector(s, fnode->ea_secno + i, &bh1, len - i - 1))) { 320 + if (!(b1 = hpfs_map_sector(s, le32_to_cpu(fnode->ea_secno) + i, &bh1, len - i - 1))) { 323 321 hpfs_free_sectors(s, new_sec, (pos + 511) >> 9); 324 322 goto bail; 325 323 } ··· 333 331 mark_buffer_dirty(bh2); 334 332 brelse(bh2); 335 333 } 336 - hpfs_free_sectors(s, fnode->ea_secno, len); 337 - fnode->ea_secno = new_sec; 334 + hpfs_free_sectors(s, le32_to_cpu(fnode->ea_secno), len); 335 + fnode->ea_secno = cpu_to_le32(new_sec); 338 336 len = (pos + 511) >> 9; 339 337 } 340 338 } 341 339 if (fnode->ea_anode) { 342 - if (hpfs_add_sector_to_btree(s, fnode->ea_secno, 340 + if (hpfs_add_sector_to_btree(s, le32_to_cpu(fnode->ea_secno), 343 341 0, len) != -1) { 344 342 len++; 345 343 } else { ··· 351 349 h[1] = strlen(key); 352 350 h[2] = size & 0xff; 353 351 h[3] = size >> 8; 354 - if (hpfs_ea_write(s, fnode->ea_secno, fnode->ea_anode, fnode->ea_size_l, 4, h)) goto bail; 355 - if (hpfs_ea_write(s, fnode->ea_secno, fnode->ea_anode, fnode->ea_size_l + 4, h[1] + 1, key)) goto bail; 356 - if (hpfs_ea_write(s, fnode->ea_secno, fnode->ea_anode, fnode->ea_size_l + 5 + h[1], size, data)) goto bail; 357 - fnode->ea_size_l = pos; 352 + if (hpfs_ea_write(s, le32_to_cpu(fnode->ea_secno), fnode->ea_anode, le32_to_cpu(fnode->ea_size_l), 4, h)) goto bail; 353 + if (hpfs_ea_write(s, le32_to_cpu(fnode->ea_secno), fnode->ea_anode, le32_to_cpu(fnode->ea_size_l) + 4, h[1] + 1, key)) goto bail; 354 + if (hpfs_ea_write(s, le32_to_cpu(fnode->ea_secno), fnode->ea_anode, le32_to_cpu(fnode->ea_size_l) + 5 + h[1], size, data)) goto bail; 355 + fnode->ea_size_l = cpu_to_le32(pos); 358 356 ret: 359 357 hpfs_i(inode)->i_ea_size += 5 + strlen(key) + size; 360 358 return; 361 359 bail: 362 - if (fnode->ea_secno) 363 - if (fnode->ea_anode) hpfs_truncate_btree(s, fnode->ea_secno, 1, (fnode->ea_size_l + 511) >> 9); 364 - else hpfs_free_sectors(s, fnode->ea_secno + ((fnode->ea_size_l + 511) >> 9), len - ((fnode->ea_size_l + 511) >> 9)); 365 - else fnode->ea_secno = fnode->ea_size_l = 0; 360 + if (le32_to_cpu(fnode->ea_secno)) 361 + if (fnode->ea_anode) hpfs_truncate_btree(s, le32_to_cpu(fnode->ea_secno), 1, (le32_to_cpu(fnode->ea_size_l) + 511) >> 9); 362 + else hpfs_free_sectors(s, le32_to_cpu(fnode->ea_secno) + ((le32_to_cpu(fnode->ea_size_l) + 511) >> 9), len - ((le32_to_cpu(fnode->ea_size_l) + 511) >> 9)); 363 + else fnode->ea_secno = fnode->ea_size_l = cpu_to_le32(0); 366 364 } 367 365
+21 -10
fs/hpfs/file.c
··· 20 20 21 21 int hpfs_file_fsync(struct file *file, int datasync) 22 22 { 23 - /*return file_fsync(file, datasync);*/ 24 - return 0; /* Don't fsync :-) */ 23 + struct inode *inode = file->f_mapping->host; 24 + return sync_blockdev(inode->i_sb->s_bdev); 25 25 } 26 26 27 27 /* ··· 48 48 static void hpfs_truncate(struct inode *i) 49 49 { 50 50 if (IS_IMMUTABLE(i)) return /*-EPERM*/; 51 - hpfs_lock(i->i_sb); 51 + hpfs_lock_assert(i->i_sb); 52 + 52 53 hpfs_i(i)->i_n_secs = 0; 53 54 i->i_blocks = 1 + ((i->i_size + 511) >> 9); 54 55 hpfs_i(i)->mmu_private = i->i_size; 55 56 hpfs_truncate_btree(i->i_sb, i->i_ino, 1, ((i->i_size + 511) >> 9)); 56 57 hpfs_write_inode(i); 57 58 hpfs_i(i)->i_n_secs = 0; 58 - hpfs_unlock(i->i_sb); 59 59 } 60 60 61 61 static int hpfs_get_block(struct inode *inode, sector_t iblock, struct buffer_head *bh_result, int create) 62 62 { 63 + int r; 63 64 secno s; 65 + hpfs_lock(inode->i_sb); 64 66 s = hpfs_bmap(inode, iblock); 65 67 if (s) { 66 68 map_bh(bh_result, inode->i_sb, s); 67 - return 0; 69 + goto ret_0; 68 70 } 69 - if (!create) return 0; 71 + if (!create) goto ret_0; 70 72 if (iblock<<9 != hpfs_i(inode)->mmu_private) { 71 73 BUG(); 72 - return -EIO; 74 + r = -EIO; 75 + goto ret_r; 73 76 } 74 77 if ((s = hpfs_add_sector_to_btree(inode->i_sb, inode->i_ino, 1, inode->i_blocks - 1)) == -1) { 75 78 hpfs_truncate_btree(inode->i_sb, inode->i_ino, 1, inode->i_blocks - 1); 76 - return -ENOSPC; 79 + r = -ENOSPC; 80 + goto ret_r; 77 81 } 78 82 inode->i_blocks++; 79 83 hpfs_i(inode)->mmu_private += 512; 80 84 set_buffer_new(bh_result); 81 85 map_bh(bh_result, inode->i_sb, s); 82 - return 0; 86 + ret_0: 87 + r = 0; 88 + ret_r: 89 + hpfs_unlock(inode->i_sb); 90 + return r; 83 91 } 84 92 85 93 static int hpfs_writepage(struct page *page, struct writeback_control *wbc) ··· 138 130 ssize_t retval; 139 131 140 132 retval = do_sync_write(file, buf, count, ppos); 141 - if (retval > 0) 133 + if (retval > 0) { 134 + hpfs_lock(file->f_path.dentry->d_sb); 142 135 hpfs_i(file->f_path.dentry->d_inode)->i_dirty = 1; 136 + hpfs_unlock(file->f_path.dentry->d_sb); 137 + } 143 138 return retval; 144 139 } 145 140
+255 -180
fs/hpfs/hpfs.h
··· 19 19 For definitive information on HPFS, ask somebody else -- this is guesswork. 20 20 There are certain to be many mistakes. */ 21 21 22 + #if !defined(__LITTLE_ENDIAN) && !defined(__BIG_ENDIAN) 23 + #error unknown endian 24 + #endif 25 + 22 26 /* Notation */ 23 27 24 - typedef unsigned secno; /* sector number, partition relative */ 28 + typedef u32 secno; /* sector number, partition relative */ 25 29 26 30 typedef secno dnode_secno; /* sector number of a dnode */ 27 31 typedef secno fnode_secno; /* sector number of an fnode */ ··· 42 38 43 39 struct hpfs_boot_block 44 40 { 45 - unsigned char jmp[3]; 46 - unsigned char oem_id[8]; 47 - unsigned char bytes_per_sector[2]; /* 512 */ 48 - unsigned char sectors_per_cluster; 49 - unsigned char n_reserved_sectors[2]; 50 - unsigned char n_fats; 51 - unsigned char n_rootdir_entries[2]; 52 - unsigned char n_sectors_s[2]; 53 - unsigned char media_byte; 54 - unsigned short sectors_per_fat; 55 - unsigned short sectors_per_track; 56 - unsigned short heads_per_cyl; 57 - unsigned int n_hidden_sectors; 58 - unsigned int n_sectors_l; /* size of partition */ 59 - unsigned char drive_number; 60 - unsigned char mbz; 61 - unsigned char sig_28h; /* 28h */ 62 - unsigned char vol_serno[4]; 63 - unsigned char vol_label[11]; 64 - unsigned char sig_hpfs[8]; /* "HPFS " */ 65 - unsigned char pad[448]; 66 - unsigned short magic; /* aa55 */ 41 + u8 jmp[3]; 42 + u8 oem_id[8]; 43 + u8 bytes_per_sector[2]; /* 512 */ 44 + u8 sectors_per_cluster; 45 + u8 n_reserved_sectors[2]; 46 + u8 n_fats; 47 + u8 n_rootdir_entries[2]; 48 + u8 n_sectors_s[2]; 49 + u8 media_byte; 50 + u16 sectors_per_fat; 51 + u16 sectors_per_track; 52 + u16 heads_per_cyl; 53 + u32 n_hidden_sectors; 54 + u32 n_sectors_l; /* size of partition */ 55 + u8 drive_number; 56 + u8 mbz; 57 + u8 sig_28h; /* 28h */ 58 + u8 vol_serno[4]; 59 + u8 vol_label[11]; 60 + u8 sig_hpfs[8]; /* "HPFS " */ 61 + u8 pad[448]; 62 + u16 magic; /* aa55 */ 67 63 }; 68 64 69 65 ··· 75 71 76 72 struct hpfs_super_block 77 73 { 78 - unsigned magic; /* f995 e849 */ 79 - unsigned magic1; /* fa53 e9c5, more magic? */ 80 - /*unsigned huh202;*/ /* ?? 202 = N. of B. in 1.00390625 S.*/ 81 - char version; /* version of a filesystem usually 2 */ 82 - char funcversion; /* functional version - oldest version 74 + u32 magic; /* f995 e849 */ 75 + u32 magic1; /* fa53 e9c5, more magic? */ 76 + u8 version; /* version of a filesystem usually 2 */ 77 + u8 funcversion; /* functional version - oldest version 83 78 of filesystem that can understand 84 79 this disk */ 85 - unsigned short int zero; /* 0 */ 80 + u16 zero; /* 0 */ 86 81 fnode_secno root; /* fnode of root directory */ 87 82 secno n_sectors; /* size of filesystem */ 88 - unsigned n_badblocks; /* number of bad blocks */ 83 + u32 n_badblocks; /* number of bad blocks */ 89 84 secno bitmaps; /* pointers to free space bit maps */ 90 - unsigned zero1; /* 0 */ 85 + u32 zero1; /* 0 */ 91 86 secno badblocks; /* bad block list */ 92 - unsigned zero3; /* 0 */ 87 + u32 zero3; /* 0 */ 93 88 time32_t last_chkdsk; /* date last checked, 0 if never */ 94 - /*unsigned zero4;*/ /* 0 */ 95 - time32_t last_optimize; /* date last optimized, 0 if never */ 89 + time32_t last_optimize; /* date last optimized, 0 if never */ 96 90 secno n_dir_band; /* number of sectors in dir band */ 97 91 secno dir_band_start; /* first sector in dir band */ 98 92 secno dir_band_end; /* last sector in dir band */ 99 93 secno dir_band_bitmap; /* free space map, 1 dnode per bit */ 100 - char volume_name[32]; /* not used */ 94 + u8 volume_name[32]; /* not used */ 101 95 secno user_id_table; /* 8 preallocated sectors - user id */ 102 - unsigned zero6[103]; /* 0 */ 96 + u32 zero6[103]; /* 0 */ 103 97 }; 104 98 105 99 ··· 109 107 110 108 struct hpfs_spare_block 111 109 { 112 - unsigned magic; /* f991 1849 */ 113 - unsigned magic1; /* fa52 29c5, more magic? */ 110 + u32 magic; /* f991 1849 */ 111 + u32 magic1; /* fa52 29c5, more magic? */ 114 112 115 - unsigned dirty: 1; /* 0 clean, 1 "improperly stopped" */ 116 - /*unsigned flag1234: 4;*/ /* unknown flags */ 117 - unsigned sparedir_used: 1; /* spare dirblks used */ 118 - unsigned hotfixes_used: 1; /* hotfixes used */ 119 - unsigned bad_sector: 1; /* bad sector, corrupted disk (???) */ 120 - unsigned bad_bitmap: 1; /* bad bitmap */ 121 - unsigned fast: 1; /* partition was fast formatted */ 122 - unsigned old_wrote: 1; /* old version wrote to partion */ 123 - unsigned old_wrote_1: 1; /* old version wrote to partion (?) */ 124 - unsigned install_dasd_limits: 1; /* HPFS386 flags */ 125 - unsigned resynch_dasd_limits: 1; 126 - unsigned dasd_limits_operational: 1; 127 - unsigned multimedia_active: 1; 128 - unsigned dce_acls_active: 1; 129 - unsigned dasd_limits_dirty: 1; 130 - unsigned flag67: 2; 131 - unsigned char mm_contlgulty; 132 - unsigned char unused; 113 + #ifdef __LITTLE_ENDIAN 114 + u8 dirty: 1; /* 0 clean, 1 "improperly stopped" */ 115 + u8 sparedir_used: 1; /* spare dirblks used */ 116 + u8 hotfixes_used: 1; /* hotfixes used */ 117 + u8 bad_sector: 1; /* bad sector, corrupted disk (???) */ 118 + u8 bad_bitmap: 1; /* bad bitmap */ 119 + u8 fast: 1; /* partition was fast formatted */ 120 + u8 old_wrote: 1; /* old version wrote to partion */ 121 + u8 old_wrote_1: 1; /* old version wrote to partion (?) */ 122 + #else 123 + u8 old_wrote_1: 1; /* old version wrote to partion (?) */ 124 + u8 old_wrote: 1; /* old version wrote to partion */ 125 + u8 fast: 1; /* partition was fast formatted */ 126 + u8 bad_bitmap: 1; /* bad bitmap */ 127 + u8 bad_sector: 1; /* bad sector, corrupted disk (???) */ 128 + u8 hotfixes_used: 1; /* hotfixes used */ 129 + u8 sparedir_used: 1; /* spare dirblks used */ 130 + u8 dirty: 1; /* 0 clean, 1 "improperly stopped" */ 131 + #endif 132 + 133 + #ifdef __LITTLE_ENDIAN 134 + u8 install_dasd_limits: 1; /* HPFS386 flags */ 135 + u8 resynch_dasd_limits: 1; 136 + u8 dasd_limits_operational: 1; 137 + u8 multimedia_active: 1; 138 + u8 dce_acls_active: 1; 139 + u8 dasd_limits_dirty: 1; 140 + u8 flag67: 2; 141 + #else 142 + u8 flag67: 2; 143 + u8 dasd_limits_dirty: 1; 144 + u8 dce_acls_active: 1; 145 + u8 multimedia_active: 1; 146 + u8 dasd_limits_operational: 1; 147 + u8 resynch_dasd_limits: 1; 148 + u8 install_dasd_limits: 1; /* HPFS386 flags */ 149 + #endif 150 + 151 + u8 mm_contlgulty; 152 + u8 unused; 133 153 134 154 secno hotfix_map; /* info about remapped bad sectors */ 135 - unsigned n_spares_used; /* number of hotfixes */ 136 - unsigned n_spares; /* number of spares in hotfix map */ 137 - unsigned n_dnode_spares_free; /* spare dnodes unused */ 138 - unsigned n_dnode_spares; /* length of spare_dnodes[] list, 155 + u32 n_spares_used; /* number of hotfixes */ 156 + u32 n_spares; /* number of spares in hotfix map */ 157 + u32 n_dnode_spares_free; /* spare dnodes unused */ 158 + u32 n_dnode_spares; /* length of spare_dnodes[] list, 139 159 follows in this block*/ 140 160 secno code_page_dir; /* code page directory block */ 141 - unsigned n_code_pages; /* number of code pages */ 142 - /*unsigned large_numbers[2];*/ /* ?? */ 143 - unsigned super_crc; /* on HPFS386 and LAN Server this is 161 + u32 n_code_pages; /* number of code pages */ 162 + u32 super_crc; /* on HPFS386 and LAN Server this is 144 163 checksum of superblock, on normal 145 164 OS/2 unused */ 146 - unsigned spare_crc; /* on HPFS386 checksum of spareblock */ 147 - unsigned zero1[15]; /* unused */ 165 + u32 spare_crc; /* on HPFS386 checksum of spareblock */ 166 + u32 zero1[15]; /* unused */ 148 167 dnode_secno spare_dnodes[100]; /* emergency free dnode list */ 149 - unsigned zero2[1]; /* room for more? */ 168 + u32 zero2[1]; /* room for more? */ 150 169 }; 151 170 152 171 /* The bad block list is 4 sectors long. The first word must be zero, ··· 202 179 203 180 struct code_page_directory 204 181 { 205 - unsigned magic; /* 4945 21f7 */ 206 - unsigned n_code_pages; /* number of pointers following */ 207 - unsigned zero1[2]; 182 + u32 magic; /* 4945 21f7 */ 183 + u32 n_code_pages; /* number of pointers following */ 184 + u32 zero1[2]; 208 185 struct { 209 - unsigned short ix; /* index */ 210 - unsigned short code_page_number; /* code page number */ 211 - unsigned bounds; /* matches corresponding word 186 + u16 ix; /* index */ 187 + u16 code_page_number; /* code page number */ 188 + u32 bounds; /* matches corresponding word 212 189 in data block */ 213 190 secno code_page_data; /* sector number of a code_page_data 214 191 containing c.p. array */ 215 - unsigned short index; /* index in c.p. array in that sector*/ 216 - unsigned short unknown; /* some unknown value; usually 0; 192 + u16 index; /* index in c.p. array in that sector*/ 193 + u16 unknown; /* some unknown value; usually 0; 217 194 2 in Japanese version */ 218 195 } array[31]; /* unknown length */ 219 196 }; ··· 224 201 225 202 struct code_page_data 226 203 { 227 - unsigned magic; /* 8945 21f7 */ 228 - unsigned n_used; /* # elements used in c_p_data[] */ 229 - unsigned bounds[3]; /* looks a bit like 204 + u32 magic; /* 8945 21f7 */ 205 + u32 n_used; /* # elements used in c_p_data[] */ 206 + u32 bounds[3]; /* looks a bit like 230 207 (beg1,end1), (beg2,end2) 231 208 one byte each */ 232 - unsigned short offs[3]; /* offsets from start of sector 209 + u16 offs[3]; /* offsets from start of sector 233 210 to start of c_p_data[ix] */ 234 211 struct { 235 - unsigned short ix; /* index */ 236 - unsigned short code_page_number; /* code page number */ 237 - unsigned short unknown; /* the same as in cp directory */ 238 - unsigned char map[128]; /* upcase table for chars 80..ff */ 239 - unsigned short zero2; 212 + u16 ix; /* index */ 213 + u16 code_page_number; /* code page number */ 214 + u16 unknown; /* the same as in cp directory */ 215 + u8 map[128]; /* upcase table for chars 80..ff */ 216 + u16 zero2; 240 217 } code_page[3]; 241 - unsigned char incognita[78]; 218 + u8 incognita[78]; 242 219 }; 243 220 244 221 ··· 278 255 #define DNODE_MAGIC 0x77e40aae 279 256 280 257 struct dnode { 281 - unsigned magic; /* 77e4 0aae */ 282 - unsigned first_free; /* offset from start of dnode to 258 + u32 magic; /* 77e4 0aae */ 259 + u32 first_free; /* offset from start of dnode to 283 260 first free dir entry */ 284 - unsigned root_dnode:1; /* Is it root dnode? */ 285 - unsigned increment_me:31; /* some kind of activity counter? 286 - Neither HPFS.IFS nor CHKDSK cares 261 + #ifdef __LITTLE_ENDIAN 262 + u8 root_dnode: 1; /* Is it root dnode? */ 263 + u8 increment_me: 7; /* some kind of activity counter? */ 264 + /* Neither HPFS.IFS nor CHKDSK cares 287 265 if you change this word */ 266 + #else 267 + u8 increment_me: 7; /* some kind of activity counter? */ 268 + /* Neither HPFS.IFS nor CHKDSK cares 269 + if you change this word */ 270 + u8 root_dnode: 1; /* Is it root dnode? */ 271 + #endif 272 + u8 increment_me2[3]; 288 273 secno up; /* (root dnode) directory's fnode 289 274 (nonroot) parent dnode */ 290 275 dnode_secno self; /* pointer to this dnode */ 291 - unsigned char dirent[2028]; /* one or more dirents */ 276 + u8 dirent[2028]; /* one or more dirents */ 292 277 }; 293 278 294 279 struct hpfs_dirent { 295 - unsigned short length; /* offset to next dirent */ 296 - unsigned first: 1; /* set on phony ^A^A (".") entry */ 297 - unsigned has_acl: 1; 298 - unsigned down: 1; /* down pointer present (after name) */ 299 - unsigned last: 1; /* set on phony \377 entry */ 300 - unsigned has_ea: 1; /* entry has EA */ 301 - unsigned has_xtd_perm: 1; /* has extended perm list (???) */ 302 - unsigned has_explicit_acl: 1; 303 - unsigned has_needea: 1; /* ?? some EA has NEEDEA set 280 + u16 length; /* offset to next dirent */ 281 + 282 + #ifdef __LITTLE_ENDIAN 283 + u8 first: 1; /* set on phony ^A^A (".") entry */ 284 + u8 has_acl: 1; 285 + u8 down: 1; /* down pointer present (after name) */ 286 + u8 last: 1; /* set on phony \377 entry */ 287 + u8 has_ea: 1; /* entry has EA */ 288 + u8 has_xtd_perm: 1; /* has extended perm list (???) */ 289 + u8 has_explicit_acl: 1; 290 + u8 has_needea: 1; /* ?? some EA has NEEDEA set 304 291 I have no idea why this is 305 292 interesting in a dir entry */ 306 - unsigned read_only: 1; /* dos attrib */ 307 - unsigned hidden: 1; /* dos attrib */ 308 - unsigned system: 1; /* dos attrib */ 309 - unsigned flag11: 1; /* would be volume label dos attrib */ 310 - unsigned directory: 1; /* dos attrib */ 311 - unsigned archive: 1; /* dos attrib */ 312 - unsigned not_8x3: 1; /* name is not 8.3 */ 313 - unsigned flag15: 1; 293 + #else 294 + u8 has_needea: 1; /* ?? some EA has NEEDEA set 295 + I have no idea why this is 296 + interesting in a dir entry */ 297 + u8 has_explicit_acl: 1; 298 + u8 has_xtd_perm: 1; /* has extended perm list (???) */ 299 + u8 has_ea: 1; /* entry has EA */ 300 + u8 last: 1; /* set on phony \377 entry */ 301 + u8 down: 1; /* down pointer present (after name) */ 302 + u8 has_acl: 1; 303 + u8 first: 1; /* set on phony ^A^A (".") entry */ 304 + #endif 305 + 306 + #ifdef __LITTLE_ENDIAN 307 + u8 read_only: 1; /* dos attrib */ 308 + u8 hidden: 1; /* dos attrib */ 309 + u8 system: 1; /* dos attrib */ 310 + u8 flag11: 1; /* would be volume label dos attrib */ 311 + u8 directory: 1; /* dos attrib */ 312 + u8 archive: 1; /* dos attrib */ 313 + u8 not_8x3: 1; /* name is not 8.3 */ 314 + u8 flag15: 1; 315 + #else 316 + u8 flag15: 1; 317 + u8 not_8x3: 1; /* name is not 8.3 */ 318 + u8 archive: 1; /* dos attrib */ 319 + u8 directory: 1; /* dos attrib */ 320 + u8 flag11: 1; /* would be volume label dos attrib */ 321 + u8 system: 1; /* dos attrib */ 322 + u8 hidden: 1; /* dos attrib */ 323 + u8 read_only: 1; /* dos attrib */ 324 + #endif 325 + 314 326 fnode_secno fnode; /* fnode giving allocation info */ 315 327 time32_t write_date; /* mtime */ 316 - unsigned file_size; /* file length, bytes */ 328 + u32 file_size; /* file length, bytes */ 317 329 time32_t read_date; /* atime */ 318 330 time32_t creation_date; /* ctime */ 319 - unsigned ea_size; /* total EA length, bytes */ 320 - unsigned char no_of_acls : 3; /* number of ACL's */ 321 - unsigned char reserver : 5; 322 - unsigned char ix; /* code page index (of filename), see 331 + u32 ea_size; /* total EA length, bytes */ 332 + u8 no_of_acls; /* number of ACL's (low 3 bits) */ 333 + u8 ix; /* code page index (of filename), see 323 334 struct code_page_data */ 324 - unsigned char namelen, name[1]; /* file name */ 335 + u8 namelen, name[1]; /* file name */ 325 336 /* dnode_secno down; btree down pointer, if present, 326 337 follows name on next word boundary, or maybe it 327 338 precedes next dirent, which is on a word boundary. */ ··· 375 318 376 319 struct bplus_leaf_node 377 320 { 378 - unsigned file_secno; /* first file sector in extent */ 379 - unsigned length; /* length, sectors */ 321 + u32 file_secno; /* first file sector in extent */ 322 + u32 length; /* length, sectors */ 380 323 secno disk_secno; /* first corresponding disk sector */ 381 324 }; 382 325 383 326 struct bplus_internal_node 384 327 { 385 - unsigned file_secno; /* subtree maps sectors < this */ 328 + u32 file_secno; /* subtree maps sectors < this */ 386 329 anode_secno down; /* pointer to subtree */ 387 330 }; 388 331 389 332 struct bplus_header 390 333 { 391 - unsigned hbff: 1; /* high bit of first free entry offset */ 392 - unsigned flag1: 1; 393 - unsigned flag2: 1; 394 - unsigned flag3: 1; 395 - unsigned flag4: 1; 396 - unsigned fnode_parent: 1; /* ? we're pointed to by an fnode, 334 + #ifdef __LITTLE_ENDIAN 335 + u8 hbff: 1; /* high bit of first free entry offset */ 336 + u8 flag1234: 4; 337 + u8 fnode_parent: 1; /* ? we're pointed to by an fnode, 397 338 the data btree or some ea or the 398 339 main ea bootage pointer ea_secno */ 399 340 /* also can get set in fnodes, which 400 341 may be a chkdsk glitch or may mean 401 342 this bit is irrelevant in fnodes, 402 343 or this interpretation is all wet */ 403 - unsigned binary_search: 1; /* suggest binary search (unused) */ 404 - unsigned internal: 1; /* 1 -> (internal) tree of anodes 344 + u8 binary_search: 1; /* suggest binary search (unused) */ 345 + u8 internal: 1; /* 1 -> (internal) tree of anodes 405 346 0 -> (leaf) list of extents */ 406 - unsigned char fill[3]; 407 - unsigned char n_free_nodes; /* free nodes in following array */ 408 - unsigned char n_used_nodes; /* used nodes in following array */ 409 - unsigned short first_free; /* offset from start of header to 347 + #else 348 + u8 internal: 1; /* 1 -> (internal) tree of anodes 349 + 0 -> (leaf) list of extents */ 350 + u8 binary_search: 1; /* suggest binary search (unused) */ 351 + u8 fnode_parent: 1; /* ? we're pointed to by an fnode, 352 + the data btree or some ea or the 353 + main ea bootage pointer ea_secno */ 354 + /* also can get set in fnodes, which 355 + may be a chkdsk glitch or may mean 356 + this bit is irrelevant in fnodes, 357 + or this interpretation is all wet */ 358 + u8 flag1234: 4; 359 + u8 hbff: 1; /* high bit of first free entry offset */ 360 + #endif 361 + u8 fill[3]; 362 + u8 n_free_nodes; /* free nodes in following array */ 363 + u8 n_used_nodes; /* used nodes in following array */ 364 + u16 first_free; /* offset from start of header to 410 365 first free node in array */ 411 366 union { 412 367 struct bplus_internal_node internal[0]; /* (internal) 2-word entries giving ··· 438 369 439 370 struct fnode 440 371 { 441 - unsigned magic; /* f7e4 0aae */ 442 - unsigned zero1[2]; /* read history */ 443 - unsigned char len, name[15]; /* true length, truncated name */ 372 + u32 magic; /* f7e4 0aae */ 373 + u32 zero1[2]; /* read history */ 374 + u8 len, name[15]; /* true length, truncated name */ 444 375 fnode_secno up; /* pointer to file's directory fnode */ 445 - /*unsigned zero2[3];*/ 446 376 secno acl_size_l; 447 377 secno acl_secno; 448 - unsigned short acl_size_s; 449 - char acl_anode; 450 - char zero2; /* history bit count */ 451 - unsigned ea_size_l; /* length of disk-resident ea's */ 378 + u16 acl_size_s; 379 + u8 acl_anode; 380 + u8 zero2; /* history bit count */ 381 + u32 ea_size_l; /* length of disk-resident ea's */ 452 382 secno ea_secno; /* first sector of disk-resident ea's*/ 453 - unsigned short ea_size_s; /* length of fnode-resident ea's */ 383 + u16 ea_size_s; /* length of fnode-resident ea's */ 454 384 455 - unsigned flag0: 1; 456 - unsigned ea_anode: 1; /* 1 -> ea_secno is an anode */ 457 - unsigned flag2: 1; 458 - unsigned flag3: 1; 459 - unsigned flag4: 1; 460 - unsigned flag5: 1; 461 - unsigned flag6: 1; 462 - unsigned flag7: 1; 463 - unsigned dirflag: 1; /* 1 -> directory. first & only extent 385 + #ifdef __LITTLE_ENDIAN 386 + u8 flag0: 1; 387 + u8 ea_anode: 1; /* 1 -> ea_secno is an anode */ 388 + u8 flag234567: 6; 389 + #else 390 + u8 flag234567: 6; 391 + u8 ea_anode: 1; /* 1 -> ea_secno is an anode */ 392 + u8 flag0: 1; 393 + #endif 394 + 395 + #ifdef __LITTLE_ENDIAN 396 + u8 dirflag: 1; /* 1 -> directory. first & only extent 464 397 points to dnode. */ 465 - unsigned flag9: 1; 466 - unsigned flag10: 1; 467 - unsigned flag11: 1; 468 - unsigned flag12: 1; 469 - unsigned flag13: 1; 470 - unsigned flag14: 1; 471 - unsigned flag15: 1; 398 + u8 flag9012345: 7; 399 + #else 400 + u8 flag9012345: 7; 401 + u8 dirflag: 1; /* 1 -> directory. first & only extent 402 + points to dnode. */ 403 + #endif 472 404 473 405 struct bplus_header btree; /* b+ tree, 8 extents or 12 subtrees */ 474 406 union { ··· 477 407 struct bplus_internal_node internal[12]; 478 408 } u; 479 409 480 - unsigned file_size; /* file length, bytes */ 481 - unsigned n_needea; /* number of EA's with NEEDEA set */ 482 - char user_id[16]; /* unused */ 483 - unsigned short ea_offs; /* offset from start of fnode 410 + u32 file_size; /* file length, bytes */ 411 + u32 n_needea; /* number of EA's with NEEDEA set */ 412 + u8 user_id[16]; /* unused */ 413 + u16 ea_offs; /* offset from start of fnode 484 414 to first fnode-resident ea */ 485 - char dasd_limit_treshhold; 486 - char dasd_limit_delta; 487 - unsigned dasd_limit; 488 - unsigned dasd_usage; 489 - /*unsigned zero5[2];*/ 490 - unsigned char ea[316]; /* zero or more EA's, packed together 415 + u8 dasd_limit_treshhold; 416 + u8 dasd_limit_delta; 417 + u32 dasd_limit; 418 + u32 dasd_usage; 419 + u8 ea[316]; /* zero or more EA's, packed together 491 420 with no alignment padding. 492 421 (Do not use this name, get here 493 422 via fnode + ea_offs. I think.) */ ··· 499 430 500 431 struct anode 501 432 { 502 - unsigned magic; /* 37e4 0aae */ 433 + u32 magic; /* 37e4 0aae */ 503 434 anode_secno self; /* pointer to this anode */ 504 435 secno up; /* parent anode or fnode */ 505 436 ··· 509 440 struct bplus_internal_node internal[60]; 510 441 } u; 511 442 512 - unsigned fill[3]; /* unused */ 443 + u32 fill[3]; /* unused */ 513 444 }; 514 445 515 446 ··· 530 461 531 462 struct extended_attribute 532 463 { 533 - unsigned indirect: 1; /* 1 -> value gives sector number 464 + #ifdef __LITTLE_ENDIAN 465 + u8 indirect: 1; /* 1 -> value gives sector number 534 466 where real value starts */ 535 - unsigned anode: 1; /* 1 -> sector is an anode 467 + u8 anode: 1; /* 1 -> sector is an anode 536 468 that points to fragmented value */ 537 - unsigned flag2: 1; 538 - unsigned flag3: 1; 539 - unsigned flag4: 1; 540 - unsigned flag5: 1; 541 - unsigned flag6: 1; 542 - unsigned needea: 1; /* required ea */ 543 - unsigned char namelen; /* length of name, bytes */ 544 - unsigned short valuelen; /* length of value, bytes */ 545 - unsigned char name[0]; 469 + u8 flag23456: 5; 470 + u8 needea: 1; /* required ea */ 471 + #else 472 + u8 needea: 1; /* required ea */ 473 + u8 flag23456: 5; 474 + u8 anode: 1; /* 1 -> sector is an anode 475 + that points to fragmented value */ 476 + u8 indirect: 1; /* 1 -> value gives sector number 477 + where real value starts */ 478 + #endif 479 + u8 namelen; /* length of name, bytes */ 480 + u8 valuelen_lo; /* length of value, bytes */ 481 + u8 valuelen_hi; /* length of value, bytes */ 482 + u8 name[0]; 546 483 /* 547 - unsigned char name[namelen]; ascii attrib name 548 - unsigned char nul; terminating '\0', not counted 549 - unsigned char value[valuelen]; value, arbitrary 484 + u8 name[namelen]; ascii attrib name 485 + u8 nul; terminating '\0', not counted 486 + u8 value[valuelen]; value, arbitrary 550 487 if this.indirect, valuelen is 8 and the value is 551 - unsigned length; real length of value, bytes 488 + u32 length; real length of value, bytes 552 489 secno secno; sector address where it starts 553 490 if this.anode, the above sector number is the root of an anode tree 554 491 which points to the value.
+37 -43
fs/hpfs/hpfs_fn.h
··· 13 13 #include <linux/pagemap.h> 14 14 #include <linux/buffer_head.h> 15 15 #include <linux/slab.h> 16 + #include <asm/unaligned.h> 16 17 17 18 #include "hpfs.h" 18 19 ··· 52 51 unsigned i_disk_sec; /* (files) minimalist cache of alloc info */ 53 52 unsigned i_n_secs; /* (files) minimalist cache of alloc info */ 54 53 unsigned i_ea_size; /* size of extended attributes */ 55 - unsigned i_conv : 2; /* (files) crlf->newline hackery */ 56 54 unsigned i_ea_mode : 1; /* file's permission is stored in ea */ 57 55 unsigned i_ea_uid : 1; /* file's uid is stored in ea */ 58 56 unsigned i_ea_gid : 1; /* file's gid is stored in ea */ 59 57 unsigned i_dirty : 1; 60 - struct mutex i_mutex; 61 - struct mutex i_parent_mutex; 62 58 loff_t **i_rddir_off; 63 59 struct inode vfs_inode; 64 60 }; 65 61 66 62 struct hpfs_sb_info { 63 + struct mutex hpfs_mutex; /* global hpfs lock */ 67 64 ino_t sb_root; /* inode number of root dir */ 68 65 unsigned sb_fs_size; /* file system size, sectors */ 69 66 unsigned sb_bitmaps; /* sector number of bitmap list */ ··· 73 74 uid_t sb_uid; /* uid from mount options */ 74 75 gid_t sb_gid; /* gid from mount options */ 75 76 umode_t sb_mode; /* mode from mount options */ 76 - unsigned sb_conv : 2; /* crlf->newline hackery */ 77 77 unsigned sb_eas : 2; /* eas: 0-ignore, 1-ro, 2-rw */ 78 78 unsigned sb_err : 2; /* on errs: 0-cont, 1-ro, 2-panic */ 79 79 unsigned sb_chk : 2; /* checks: 0-no, 1-normal, 2-strict */ ··· 85 87 unsigned *sb_bmp_dir; /* main bitmap directory */ 86 88 unsigned sb_c_bitmap; /* current bitmap */ 87 89 unsigned sb_max_fwd_alloc; /* max forwad allocation */ 88 - struct mutex hpfs_creation_de; /* when creating dirents, nobody else 89 - can alloc blocks */ 90 - /*unsigned sb_mounting : 1;*/ 91 90 int sb_timeshift; 92 91 }; 93 - 94 - /* 95 - * conv= options 96 - */ 97 - 98 - #define CONV_BINARY 0 /* no conversion */ 99 - #define CONV_TEXT 1 /* crlf->newline */ 100 - #define CONV_AUTO 2 /* decide based on file contents */ 101 92 102 93 /* Four 512-byte buffers and the 2k block obtained by concatenating them */ 103 94 ··· 100 113 static inline dnode_secno de_down_pointer (struct hpfs_dirent *de) 101 114 { 102 115 CHKCOND(de->down,("HPFS: de_down_pointer: !de->down\n")); 103 - return *(dnode_secno *) ((void *) de + de->length - 4); 116 + return le32_to_cpu(*(dnode_secno *) ((void *) de + le16_to_cpu(de->length) - 4)); 104 117 } 105 118 106 119 /* The first dir entry in a dnode */ ··· 114 127 115 128 static inline struct hpfs_dirent *dnode_end_de (struct dnode *dnode) 116 129 { 117 - CHKCOND(dnode->first_free>=0x14 && dnode->first_free<=0xa00,("HPFS: dnode_end_de: dnode->first_free = %d\n",(int)dnode->first_free)); 118 - return (void *) dnode + dnode->first_free; 130 + CHKCOND(le32_to_cpu(dnode->first_free)>=0x14 && le32_to_cpu(dnode->first_free)<=0xa00,("HPFS: dnode_end_de: dnode->first_free = %x\n",(unsigned)le32_to_cpu(dnode->first_free))); 131 + return (void *) dnode + le32_to_cpu(dnode->first_free); 119 132 } 120 133 121 134 /* The dir entry after dir entry de */ 122 135 123 136 static inline struct hpfs_dirent *de_next_de (struct hpfs_dirent *de) 124 137 { 125 - CHKCOND(de->length>=0x20 && de->length<0x800,("HPFS: de_next_de: de->length = %d\n",(int)de->length)); 126 - return (void *) de + de->length; 138 + CHKCOND(le16_to_cpu(de->length)>=0x20 && le16_to_cpu(de->length)<0x800,("HPFS: de_next_de: de->length = %x\n",(unsigned)le16_to_cpu(de->length))); 139 + return (void *) de + le16_to_cpu(de->length); 127 140 } 128 141 129 142 static inline struct extended_attribute *fnode_ea(struct fnode *fnode) 130 143 { 131 - return (struct extended_attribute *)((char *)fnode + fnode->ea_offs + fnode->acl_size_s); 144 + return (struct extended_attribute *)((char *)fnode + le16_to_cpu(fnode->ea_offs) + le16_to_cpu(fnode->acl_size_s)); 132 145 } 133 146 134 147 static inline struct extended_attribute *fnode_end_ea(struct fnode *fnode) 135 148 { 136 - return (struct extended_attribute *)((char *)fnode + fnode->ea_offs + fnode->acl_size_s + fnode->ea_size_s); 149 + return (struct extended_attribute *)((char *)fnode + le16_to_cpu(fnode->ea_offs) + le16_to_cpu(fnode->acl_size_s) + le16_to_cpu(fnode->ea_size_s)); 150 + } 151 + 152 + static unsigned ea_valuelen(struct extended_attribute *ea) 153 + { 154 + return ea->valuelen_lo + 256 * ea->valuelen_hi; 137 155 } 138 156 139 157 static inline struct extended_attribute *next_ea(struct extended_attribute *ea) 140 158 { 141 - return (struct extended_attribute *)((char *)ea + 5 + ea->namelen + ea->valuelen); 159 + return (struct extended_attribute *)((char *)ea + 5 + ea->namelen + ea_valuelen(ea)); 142 160 } 143 161 144 162 static inline secno ea_sec(struct extended_attribute *ea) 145 163 { 146 - return *(secno *)((char *)ea + 9 + ea->namelen); 164 + return le32_to_cpu(get_unaligned((secno *)((char *)ea + 9 + ea->namelen))); 147 165 } 148 166 149 167 static inline secno ea_len(struct extended_attribute *ea) 150 168 { 151 - return *(secno *)((char *)ea + 5 + ea->namelen); 169 + return le32_to_cpu(get_unaligned((secno *)((char *)ea + 5 + ea->namelen))); 152 170 } 153 171 154 172 static inline char *ea_data(struct extended_attribute *ea) ··· 178 186 dst->not_8x3 = n; 179 187 } 180 188 181 - static inline unsigned tstbits(unsigned *bmp, unsigned b, unsigned n) 189 + static inline unsigned tstbits(u32 *bmp, unsigned b, unsigned n) 182 190 { 183 191 int i; 184 192 if ((b >= 0x4000) || (b + n - 1 >= 0x4000)) return n; 185 - if (!((bmp[(b & 0x3fff) >> 5] >> (b & 0x1f)) & 1)) return 1; 193 + if (!((le32_to_cpu(bmp[(b & 0x3fff) >> 5]) >> (b & 0x1f)) & 1)) return 1; 186 194 for (i = 1; i < n; i++) 187 - if (/*b+i < 0x4000 &&*/ !((bmp[((b+i) & 0x3fff) >> 5] >> ((b+i) & 0x1f)) & 1)) 195 + if (!((le32_to_cpu(bmp[((b+i) & 0x3fff) >> 5]) >> ((b+i) & 0x1f)) & 1)) 188 196 return i + 1; 189 197 return 0; 190 198 } ··· 192 200 /* alloc.c */ 193 201 194 202 int hpfs_chk_sectors(struct super_block *, secno, int, char *); 195 - secno hpfs_alloc_sector(struct super_block *, secno, unsigned, int, int); 203 + secno hpfs_alloc_sector(struct super_block *, secno, unsigned, int); 196 204 int hpfs_alloc_if_possible(struct super_block *, secno); 197 205 void hpfs_free_sectors(struct super_block *, secno, unsigned); 198 206 int hpfs_check_free_dnodes(struct super_block *, int); 199 207 void hpfs_free_dnode(struct super_block *, secno); 200 - struct dnode *hpfs_alloc_dnode(struct super_block *, secno, dnode_secno *, struct quad_buffer_head *, int); 208 + struct dnode *hpfs_alloc_dnode(struct super_block *, secno, dnode_secno *, struct quad_buffer_head *); 201 209 struct fnode *hpfs_alloc_fnode(struct super_block *, secno, fnode_secno *, struct buffer_head **); 202 210 struct anode *hpfs_alloc_anode(struct super_block *, secno, anode_secno *, struct buffer_head **); 203 211 ··· 214 222 215 223 /* buffer.c */ 216 224 217 - void hpfs_lock_creation(struct super_block *); 218 - void hpfs_unlock_creation(struct super_block *); 219 225 void *hpfs_map_sector(struct super_block *, unsigned, struct buffer_head **, int); 220 226 void *hpfs_get_sector(struct super_block *, unsigned, struct buffer_head **); 221 227 void *hpfs_map_4sectors(struct super_block *, unsigned, struct quad_buffer_head *, int); ··· 237 247 struct hpfs_dirent *hpfs_add_de(struct super_block *, struct dnode *, 238 248 const unsigned char *, unsigned, secno); 239 249 int hpfs_add_dirent(struct inode *, const unsigned char *, unsigned, 240 - struct hpfs_dirent *, int); 250 + struct hpfs_dirent *); 241 251 int hpfs_remove_dirent(struct inode *, dnode_secno, struct hpfs_dirent *, struct quad_buffer_head *, int); 242 252 void hpfs_count_dnodes(struct super_block *, dnode_secno, int *, int *, int *); 243 253 dnode_secno hpfs_de_as_down_as_possible(struct super_block *, dnode_secno dno); ··· 293 303 const unsigned char *, unsigned, int); 294 304 int hpfs_is_name_long(const unsigned char *, unsigned); 295 305 void hpfs_adjust_length(const unsigned char *, unsigned *); 296 - void hpfs_decide_conv(struct inode *, const unsigned char *, unsigned); 297 306 298 307 /* namei.c */ 299 308 ··· 335 346 /* 336 347 * Locking: 337 348 * 338 - * hpfs_lock() is a leftover from the big kernel lock. 339 - * Right now, these functions are empty and only left 340 - * for documentation purposes. The file system no longer 341 - * works on SMP systems, so the lock is not needed 342 - * any more. 349 + * hpfs_lock() locks the whole filesystem. It must be taken 350 + * on any method called by the VFS. 343 351 * 344 - * If someone is interested in making it work again, this 345 - * would be the place to start by adding a per-superblock 346 - * mutex and fixing all the bugs and performance issues 347 - * caused by that. 352 + * We don't do any per-file locking anymore, it is hard to 353 + * review and HPFS is not performance-sensitive anyway. 348 354 */ 349 355 static inline void hpfs_lock(struct super_block *s) 350 356 { 357 + struct hpfs_sb_info *sbi = hpfs_sb(s); 358 + mutex_lock(&sbi->hpfs_mutex); 351 359 } 352 360 353 361 static inline void hpfs_unlock(struct super_block *s) 354 362 { 363 + struct hpfs_sb_info *sbi = hpfs_sb(s); 364 + mutex_unlock(&sbi->hpfs_mutex); 365 + } 366 + 367 + static inline void hpfs_lock_assert(struct super_block *s) 368 + { 369 + struct hpfs_sb_info *sbi = hpfs_sb(s); 370 + WARN_ON(!mutex_is_locked(&sbi->hpfs_mutex)); 355 371 }
+21 -26
fs/hpfs/inode.c
··· 17 17 i->i_uid = hpfs_sb(sb)->sb_uid; 18 18 i->i_gid = hpfs_sb(sb)->sb_gid; 19 19 i->i_mode = hpfs_sb(sb)->sb_mode; 20 - hpfs_inode->i_conv = hpfs_sb(sb)->sb_conv; 21 20 i->i_size = -1; 22 21 i->i_blocks = -1; 23 22 ··· 115 116 i->i_mode |= S_IFDIR; 116 117 i->i_op = &hpfs_dir_iops; 117 118 i->i_fop = &hpfs_dir_ops; 118 - hpfs_inode->i_parent_dir = fnode->up; 119 - hpfs_inode->i_dno = fnode->u.external[0].disk_secno; 119 + hpfs_inode->i_parent_dir = le32_to_cpu(fnode->up); 120 + hpfs_inode->i_dno = le32_to_cpu(fnode->u.external[0].disk_secno); 120 121 if (hpfs_sb(sb)->sb_chk >= 2) { 121 122 struct buffer_head *bh0; 122 123 if (hpfs_map_fnode(sb, hpfs_inode->i_parent_dir, &bh0)) brelse(bh0); ··· 132 133 i->i_op = &hpfs_file_iops; 133 134 i->i_fop = &hpfs_file_ops; 134 135 i->i_nlink = 1; 135 - i->i_size = fnode->file_size; 136 + i->i_size = le32_to_cpu(fnode->file_size); 136 137 i->i_blocks = ((i->i_size + 511) >> 9) + 1; 137 138 i->i_data.a_ops = &hpfs_aops; 138 139 hpfs_i(i)->mmu_private = i->i_size; ··· 143 144 static void hpfs_write_inode_ea(struct inode *i, struct fnode *fnode) 144 145 { 145 146 struct hpfs_inode_info *hpfs_inode = hpfs_i(i); 146 - /*if (fnode->acl_size_l || fnode->acl_size_s) { 147 + /*if (le32_to_cpu(fnode->acl_size_l) || le16_to_cpu(fnode->acl_size_s)) { 147 148 Some unknown structures like ACL may be in fnode, 148 149 we'd better not overwrite them 149 150 hpfs_error(i->i_sb, "fnode %08x has some unknown HPFS386 stuctures", i->i_ino); ··· 186 187 kfree(hpfs_inode->i_rddir_off); 187 188 hpfs_inode->i_rddir_off = NULL; 188 189 } 189 - mutex_lock(&hpfs_inode->i_parent_mutex); 190 190 if (!i->i_nlink) { 191 - mutex_unlock(&hpfs_inode->i_parent_mutex); 192 191 return; 193 192 } 194 193 parent = iget_locked(i->i_sb, hpfs_inode->i_parent_dir); ··· 197 200 hpfs_read_inode(parent); 198 201 unlock_new_inode(parent); 199 202 } 200 - mutex_lock(&hpfs_inode->i_mutex); 201 203 hpfs_write_inode_nolock(i); 202 - mutex_unlock(&hpfs_inode->i_mutex); 203 204 iput(parent); 204 - } else { 205 - mark_inode_dirty(i); 206 205 } 207 - mutex_unlock(&hpfs_inode->i_parent_mutex); 208 206 } 209 207 210 208 void hpfs_write_inode_nolock(struct inode *i) ··· 218 226 } 219 227 } else de = NULL; 220 228 if (S_ISREG(i->i_mode)) { 221 - fnode->file_size = i->i_size; 222 - if (de) de->file_size = i->i_size; 229 + fnode->file_size = cpu_to_le32(i->i_size); 230 + if (de) de->file_size = cpu_to_le32(i->i_size); 223 231 } else if (S_ISDIR(i->i_mode)) { 224 - fnode->file_size = 0; 225 - if (de) de->file_size = 0; 232 + fnode->file_size = cpu_to_le32(0); 233 + if (de) de->file_size = cpu_to_le32(0); 226 234 } 227 235 hpfs_write_inode_ea(i, fnode); 228 236 if (de) { 229 - de->write_date = gmt_to_local(i->i_sb, i->i_mtime.tv_sec); 230 - de->read_date = gmt_to_local(i->i_sb, i->i_atime.tv_sec); 231 - de->creation_date = gmt_to_local(i->i_sb, i->i_ctime.tv_sec); 237 + de->write_date = cpu_to_le32(gmt_to_local(i->i_sb, i->i_mtime.tv_sec)); 238 + de->read_date = cpu_to_le32(gmt_to_local(i->i_sb, i->i_atime.tv_sec)); 239 + de->creation_date = cpu_to_le32(gmt_to_local(i->i_sb, i->i_ctime.tv_sec)); 232 240 de->read_only = !(i->i_mode & 0222); 233 - de->ea_size = hpfs_inode->i_ea_size; 241 + de->ea_size = cpu_to_le32(hpfs_inode->i_ea_size); 234 242 hpfs_mark_4buffers_dirty(&qbh); 235 243 hpfs_brelse4(&qbh); 236 244 } 237 245 if (S_ISDIR(i->i_mode)) { 238 246 if ((de = map_dirent(i, hpfs_inode->i_dno, "\001\001", 2, NULL, &qbh))) { 239 - de->write_date = gmt_to_local(i->i_sb, i->i_mtime.tv_sec); 240 - de->read_date = gmt_to_local(i->i_sb, i->i_atime.tv_sec); 241 - de->creation_date = gmt_to_local(i->i_sb, i->i_ctime.tv_sec); 247 + de->write_date = cpu_to_le32(gmt_to_local(i->i_sb, i->i_mtime.tv_sec)); 248 + de->read_date = cpu_to_le32(gmt_to_local(i->i_sb, i->i_atime.tv_sec)); 249 + de->creation_date = cpu_to_le32(gmt_to_local(i->i_sb, i->i_ctime.tv_sec)); 242 250 de->read_only = !(i->i_mode & 0222); 243 - de->ea_size = /*hpfs_inode->i_ea_size*/0; 244 - de->file_size = 0; 251 + de->ea_size = cpu_to_le32(/*hpfs_inode->i_ea_size*/0); 252 + de->file_size = cpu_to_le32(0); 245 253 hpfs_mark_4buffers_dirty(&qbh); 246 254 hpfs_brelse4(&qbh); 247 255 } else ··· 261 269 hpfs_lock(inode->i_sb); 262 270 if (inode->i_ino == hpfs_sb(inode->i_sb)->sb_root) 263 271 goto out_unlock; 272 + if ((attr->ia_valid & ATTR_UID) && attr->ia_uid >= 0x10000) 273 + goto out_unlock; 274 + if ((attr->ia_valid & ATTR_GID) && attr->ia_gid >= 0x10000) 275 + goto out_unlock; 264 276 if ((attr->ia_valid & ATTR_SIZE) && attr->ia_size > inode->i_size) 265 277 goto out_unlock; 266 278 ··· 280 284 } 281 285 282 286 setattr_copy(inode, attr); 283 - mark_inode_dirty(inode); 284 287 285 288 hpfs_write_inode(inode); 286 289
+30 -26
fs/hpfs/map.c
··· 21 21 hpfs_error(s, "hpfs_map_bitmap called with bad parameter: %08x at %s", bmp_block, id); 22 22 return NULL; 23 23 } 24 - sec = hpfs_sb(s)->sb_bmp_dir[bmp_block]; 24 + sec = le32_to_cpu(hpfs_sb(s)->sb_bmp_dir[bmp_block]); 25 25 if (!sec || sec > hpfs_sb(s)->sb_fs_size-4) { 26 26 hpfs_error(s, "invalid bitmap block pointer %08x -> %08x at %s", bmp_block, sec, id); 27 27 return NULL; ··· 46 46 struct code_page_data *cpd; 47 47 struct code_page_directory *cp = hpfs_map_sector(s, cps, &bh, 0); 48 48 if (!cp) return NULL; 49 - if (cp->magic != CP_DIR_MAGIC) { 50 - printk("HPFS: Code page directory magic doesn't match (magic = %08x)\n", cp->magic); 49 + if (le32_to_cpu(cp->magic) != CP_DIR_MAGIC) { 50 + printk("HPFS: Code page directory magic doesn't match (magic = %08x)\n", le32_to_cpu(cp->magic)); 51 51 brelse(bh); 52 52 return NULL; 53 53 } 54 - if (!cp->n_code_pages) { 54 + if (!le32_to_cpu(cp->n_code_pages)) { 55 55 printk("HPFS: n_code_pages == 0\n"); 56 56 brelse(bh); 57 57 return NULL; 58 58 } 59 - cpds = cp->array[0].code_page_data; 60 - cpi = cp->array[0].index; 59 + cpds = le32_to_cpu(cp->array[0].code_page_data); 60 + cpi = le16_to_cpu(cp->array[0].index); 61 61 brelse(bh); 62 62 63 63 if (cpi >= 3) { ··· 66 66 } 67 67 68 68 if (!(cpd = hpfs_map_sector(s, cpds, &bh, 0))) return NULL; 69 - if ((unsigned)cpd->offs[cpi] > 0x178) { 69 + if (le16_to_cpu(cpd->offs[cpi]) > 0x178) { 70 70 printk("HPFS: Code page index out of sector\n"); 71 71 brelse(bh); 72 72 return NULL; 73 73 } 74 - ptr = (unsigned char *)cpd + cpd->offs[cpi] + 6; 74 + ptr = (unsigned char *)cpd + le16_to_cpu(cpd->offs[cpi]) + 6; 75 75 if (!(cp_table = kmalloc(256, GFP_KERNEL))) { 76 76 printk("HPFS: out of memory for code page table\n"); 77 77 brelse(bh); ··· 125 125 if (hpfs_sb(s)->sb_chk) { 126 126 struct extended_attribute *ea; 127 127 struct extended_attribute *ea_end; 128 - if (fnode->magic != FNODE_MAGIC) { 128 + if (le32_to_cpu(fnode->magic) != FNODE_MAGIC) { 129 129 hpfs_error(s, "bad magic on fnode %08lx", 130 130 (unsigned long)ino); 131 131 goto bail; ··· 138 138 (unsigned long)ino); 139 139 goto bail; 140 140 } 141 - if (fnode->btree.first_free != 141 + if (le16_to_cpu(fnode->btree.first_free) != 142 142 8 + fnode->btree.n_used_nodes * (fnode->btree.internal ? 8 : 12)) { 143 143 hpfs_error(s, 144 144 "bad first_free pointer in fnode %08lx", ··· 146 146 goto bail; 147 147 } 148 148 } 149 - if (fnode->ea_size_s && ((signed int)fnode->ea_offs < 0xc4 || 150 - (signed int)fnode->ea_offs + fnode->acl_size_s + fnode->ea_size_s > 0x200)) { 149 + if (le16_to_cpu(fnode->ea_size_s) && (le16_to_cpu(fnode->ea_offs) < 0xc4 || 150 + le16_to_cpu(fnode->ea_offs) + le16_to_cpu(fnode->acl_size_s) + le16_to_cpu(fnode->ea_size_s) > 0x200)) { 151 151 hpfs_error(s, 152 152 "bad EA info in fnode %08lx: ea_offs == %04x ea_size_s == %04x", 153 153 (unsigned long)ino, 154 - fnode->ea_offs, fnode->ea_size_s); 154 + le16_to_cpu(fnode->ea_offs), le16_to_cpu(fnode->ea_size_s)); 155 155 goto bail; 156 156 } 157 157 ea = fnode_ea(fnode); ··· 178 178 if (hpfs_sb(s)->sb_chk) if (hpfs_chk_sectors(s, ano, 1, "anode")) return NULL; 179 179 if ((anode = hpfs_map_sector(s, ano, bhp, ANODE_RD_AHEAD))) 180 180 if (hpfs_sb(s)->sb_chk) { 181 - if (anode->magic != ANODE_MAGIC || anode->self != ano) { 181 + if (le32_to_cpu(anode->magic) != ANODE_MAGIC) { 182 182 hpfs_error(s, "bad magic on anode %08x", ano); 183 + goto bail; 184 + } 185 + if (le32_to_cpu(anode->self) != ano) { 186 + hpfs_error(s, "self pointer invalid on anode %08x", ano); 183 187 goto bail; 184 188 } 185 189 if ((unsigned)anode->btree.n_used_nodes + (unsigned)anode->btree.n_free_nodes != ··· 191 187 hpfs_error(s, "bad number of nodes in anode %08x", ano); 192 188 goto bail; 193 189 } 194 - if (anode->btree.first_free != 190 + if (le16_to_cpu(anode->btree.first_free) != 195 191 8 + anode->btree.n_used_nodes * (anode->btree.internal ? 8 : 12)) { 196 192 hpfs_error(s, "bad first_free pointer in anode %08x", ano); 197 193 goto bail; ··· 223 219 unsigned p, pp = 0; 224 220 unsigned char *d = (unsigned char *)dnode; 225 221 int b = 0; 226 - if (dnode->magic != DNODE_MAGIC) { 222 + if (le32_to_cpu(dnode->magic) != DNODE_MAGIC) { 227 223 hpfs_error(s, "bad magic on dnode %08x", secno); 228 224 goto bail; 229 225 } 230 - if (dnode->self != secno) 231 - hpfs_error(s, "bad self pointer on dnode %08x self = %08x", secno, dnode->self); 226 + if (le32_to_cpu(dnode->self) != secno) 227 + hpfs_error(s, "bad self pointer on dnode %08x self = %08x", secno, le32_to_cpu(dnode->self)); 232 228 /* Check dirents - bad dirents would cause infinite 233 229 loops or shooting to memory */ 234 - if (dnode->first_free > 2048/* || dnode->first_free < 84*/) { 235 - hpfs_error(s, "dnode %08x has first_free == %08x", secno, dnode->first_free); 230 + if (le32_to_cpu(dnode->first_free) > 2048) { 231 + hpfs_error(s, "dnode %08x has first_free == %08x", secno, le32_to_cpu(dnode->first_free)); 236 232 goto bail; 237 233 } 238 - for (p = 20; p < dnode->first_free; p += d[p] + (d[p+1] << 8)) { 234 + for (p = 20; p < le32_to_cpu(dnode->first_free); p += d[p] + (d[p+1] << 8)) { 239 235 struct hpfs_dirent *de = (struct hpfs_dirent *)((char *)dnode + p); 240 - if (de->length > 292 || (de->length < 32) || (de->length & 3) || p + de->length > 2048) { 236 + if (le16_to_cpu(de->length) > 292 || (le16_to_cpu(de->length) < 32) || (le16_to_cpu(de->length) & 3) || p + le16_to_cpu(de->length) > 2048) { 241 237 hpfs_error(s, "bad dirent size in dnode %08x, dirent %03x, last %03x", secno, p, pp); 242 238 goto bail; 243 239 } 244 - if (((31 + de->namelen + de->down*4 + 3) & ~3) != de->length) { 245 - if (((31 + de->namelen + de->down*4 + 3) & ~3) < de->length && s->s_flags & MS_RDONLY) goto ok; 240 + if (((31 + de->namelen + de->down*4 + 3) & ~3) != le16_to_cpu(de->length)) { 241 + if (((31 + de->namelen + de->down*4 + 3) & ~3) < le16_to_cpu(de->length) && s->s_flags & MS_RDONLY) goto ok; 246 242 hpfs_error(s, "namelen does not match dirent size in dnode %08x, dirent %03x, last %03x", secno, p, pp); 247 243 goto bail; 248 244 } ··· 255 251 pp = p; 256 252 257 253 } 258 - if (p != dnode->first_free) { 254 + if (p != le32_to_cpu(dnode->first_free)) { 259 255 hpfs_error(s, "size on last dirent does not match first_free; dnode %08x", secno); 260 256 goto bail; 261 257 } ··· 281 277 if (!fnode) 282 278 return 0; 283 279 284 - dno = fnode->u.external[0].disk_secno; 280 + dno = le32_to_cpu(fnode->u.external[0].disk_secno); 285 281 brelse(bh); 286 282 return dno; 287 283 }
-33
fs/hpfs/name.c
··· 8 8 9 9 #include "hpfs_fn.h" 10 10 11 - static const char *text_postfix[]={ 12 - ".ASM", ".BAS", ".BAT", ".C", ".CC", ".CFG", ".CMD", ".CON", ".CPP", ".DEF", 13 - ".DOC", ".DPR", ".ERX", ".H", ".HPP", ".HTM", ".HTML", ".JAVA", ".LOG", ".PAS", 14 - ".RC", ".TEX", ".TXT", ".Y", ""}; 15 - 16 - static const char *text_prefix[]={ 17 - "AUTOEXEC.", "CHANGES", "COPYING", "CONFIG.", "CREDITS", "FAQ", "FILE_ID.DIZ", 18 - "MAKEFILE", "READ.ME", "README", "TERMCAP", ""}; 19 - 20 - void hpfs_decide_conv(struct inode *inode, const unsigned char *name, unsigned len) 21 - { 22 - struct hpfs_inode_info *hpfs_inode = hpfs_i(inode); 23 - int i; 24 - if (hpfs_inode->i_conv != CONV_AUTO) return; 25 - for (i = 0; *text_postfix[i]; i++) { 26 - int l = strlen(text_postfix[i]); 27 - if (l <= len) 28 - if (!hpfs_compare_names(inode->i_sb, text_postfix[i], l, name + len - l, l, 0)) 29 - goto text; 30 - } 31 - for (i = 0; *text_prefix[i]; i++) { 32 - int l = strlen(text_prefix[i]); 33 - if (l <= len) 34 - if (!hpfs_compare_names(inode->i_sb, text_prefix[i], l, name, l, 0)) 35 - goto text; 36 - } 37 - hpfs_inode->i_conv = CONV_BINARY; 38 - return; 39 - text: 40 - hpfs_inode->i_conv = CONV_TEXT; 41 - return; 42 - } 43 - 44 11 static inline int not_allowed_char(unsigned char c) 45 12 { 46 13 return c<' ' || c=='"' || c=='*' || c=='/' || c==':' || c=='<' ||
+30 -76
fs/hpfs/namei.c
··· 29 29 fnode = hpfs_alloc_fnode(dir->i_sb, hpfs_i(dir)->i_dno, &fno, &bh); 30 30 if (!fnode) 31 31 goto bail; 32 - dnode = hpfs_alloc_dnode(dir->i_sb, fno, &dno, &qbh0, 1); 32 + dnode = hpfs_alloc_dnode(dir->i_sb, fno, &dno, &qbh0); 33 33 if (!dnode) 34 34 goto bail1; 35 35 memset(&dee, 0, sizeof dee); ··· 37 37 if (!(mode & 0222)) dee.read_only = 1; 38 38 /*dee.archive = 0;*/ 39 39 dee.hidden = name[0] == '.'; 40 - dee.fnode = fno; 41 - dee.creation_date = dee.write_date = dee.read_date = gmt_to_local(dir->i_sb, get_seconds()); 40 + dee.fnode = cpu_to_le32(fno); 41 + dee.creation_date = dee.write_date = dee.read_date = cpu_to_le32(gmt_to_local(dir->i_sb, get_seconds())); 42 42 result = new_inode(dir->i_sb); 43 43 if (!result) 44 44 goto bail2; ··· 46 46 result->i_ino = fno; 47 47 hpfs_i(result)->i_parent_dir = dir->i_ino; 48 48 hpfs_i(result)->i_dno = dno; 49 - result->i_ctime.tv_sec = result->i_mtime.tv_sec = result->i_atime.tv_sec = local_to_gmt(dir->i_sb, dee.creation_date); 49 + result->i_ctime.tv_sec = result->i_mtime.tv_sec = result->i_atime.tv_sec = local_to_gmt(dir->i_sb, le32_to_cpu(dee.creation_date)); 50 50 result->i_ctime.tv_nsec = 0; 51 51 result->i_mtime.tv_nsec = 0; 52 52 result->i_atime.tv_nsec = 0; ··· 60 60 if (dee.read_only) 61 61 result->i_mode &= ~0222; 62 62 63 - mutex_lock(&hpfs_i(dir)->i_mutex); 64 - r = hpfs_add_dirent(dir, name, len, &dee, 0); 63 + r = hpfs_add_dirent(dir, name, len, &dee); 65 64 if (r == 1) 66 65 goto bail3; 67 66 if (r == -1) { ··· 69 70 } 70 71 fnode->len = len; 71 72 memcpy(fnode->name, name, len > 15 ? 15 : len); 72 - fnode->up = dir->i_ino; 73 + fnode->up = cpu_to_le32(dir->i_ino); 73 74 fnode->dirflag = 1; 74 75 fnode->btree.n_free_nodes = 7; 75 76 fnode->btree.n_used_nodes = 1; 76 - fnode->btree.first_free = 0x14; 77 - fnode->u.external[0].disk_secno = dno; 78 - fnode->u.external[0].file_secno = -1; 77 + fnode->btree.first_free = cpu_to_le16(0x14); 78 + fnode->u.external[0].disk_secno = cpu_to_le32(dno); 79 + fnode->u.external[0].file_secno = cpu_to_le32(-1); 79 80 dnode->root_dnode = 1; 80 - dnode->up = fno; 81 + dnode->up = cpu_to_le32(fno); 81 82 de = hpfs_add_de(dir->i_sb, dnode, "\001\001", 2, 0); 82 - de->creation_date = de->write_date = de->read_date = gmt_to_local(dir->i_sb, get_seconds()); 83 + de->creation_date = de->write_date = de->read_date = cpu_to_le32(gmt_to_local(dir->i_sb, get_seconds())); 83 84 if (!(mode & 0222)) de->read_only = 1; 84 85 de->first = de->directory = 1; 85 86 /*de->hidden = de->system = 0;*/ 86 - de->fnode = fno; 87 + de->fnode = cpu_to_le32(fno); 87 88 mark_buffer_dirty(bh); 88 89 brelse(bh); 89 90 hpfs_mark_4buffers_dirty(&qbh0); ··· 100 101 hpfs_write_inode_nolock(result); 101 102 } 102 103 d_instantiate(dentry, result); 103 - mutex_unlock(&hpfs_i(dir)->i_mutex); 104 104 hpfs_unlock(dir->i_sb); 105 105 return 0; 106 106 bail3: 107 - mutex_unlock(&hpfs_i(dir)->i_mutex); 108 107 iput(result); 109 108 bail2: 110 109 hpfs_brelse4(&qbh0); ··· 137 140 if (!(mode & 0222)) dee.read_only = 1; 138 141 dee.archive = 1; 139 142 dee.hidden = name[0] == '.'; 140 - dee.fnode = fno; 141 - dee.creation_date = dee.write_date = dee.read_date = gmt_to_local(dir->i_sb, get_seconds()); 143 + dee.fnode = cpu_to_le32(fno); 144 + dee.creation_date = dee.write_date = dee.read_date = cpu_to_le32(gmt_to_local(dir->i_sb, get_seconds())); 142 145 143 146 result = new_inode(dir->i_sb); 144 147 if (!result) ··· 151 154 result->i_op = &hpfs_file_iops; 152 155 result->i_fop = &hpfs_file_ops; 153 156 result->i_nlink = 1; 154 - hpfs_decide_conv(result, name, len); 155 157 hpfs_i(result)->i_parent_dir = dir->i_ino; 156 - result->i_ctime.tv_sec = result->i_mtime.tv_sec = result->i_atime.tv_sec = local_to_gmt(dir->i_sb, dee.creation_date); 158 + result->i_ctime.tv_sec = result->i_mtime.tv_sec = result->i_atime.tv_sec = local_to_gmt(dir->i_sb, le32_to_cpu(dee.creation_date)); 157 159 result->i_ctime.tv_nsec = 0; 158 160 result->i_mtime.tv_nsec = 0; 159 161 result->i_atime.tv_nsec = 0; ··· 164 168 result->i_data.a_ops = &hpfs_aops; 165 169 hpfs_i(result)->mmu_private = 0; 166 170 167 - mutex_lock(&hpfs_i(dir)->i_mutex); 168 - r = hpfs_add_dirent(dir, name, len, &dee, 0); 171 + r = hpfs_add_dirent(dir, name, len, &dee); 169 172 if (r == 1) 170 173 goto bail2; 171 174 if (r == -1) { ··· 173 178 } 174 179 fnode->len = len; 175 180 memcpy(fnode->name, name, len > 15 ? 15 : len); 176 - fnode->up = dir->i_ino; 181 + fnode->up = cpu_to_le32(dir->i_ino); 177 182 mark_buffer_dirty(bh); 178 183 brelse(bh); 179 184 ··· 188 193 hpfs_write_inode_nolock(result); 189 194 } 190 195 d_instantiate(dentry, result); 191 - mutex_unlock(&hpfs_i(dir)->i_mutex); 192 196 hpfs_unlock(dir->i_sb); 193 197 return 0; 194 198 195 199 bail2: 196 - mutex_unlock(&hpfs_i(dir)->i_mutex); 197 200 iput(result); 198 201 bail1: 199 202 brelse(bh); ··· 225 232 if (!(mode & 0222)) dee.read_only = 1; 226 233 dee.archive = 1; 227 234 dee.hidden = name[0] == '.'; 228 - dee.fnode = fno; 229 - dee.creation_date = dee.write_date = dee.read_date = gmt_to_local(dir->i_sb, get_seconds()); 235 + dee.fnode = cpu_to_le32(fno); 236 + dee.creation_date = dee.write_date = dee.read_date = cpu_to_le32(gmt_to_local(dir->i_sb, get_seconds())); 230 237 231 238 result = new_inode(dir->i_sb); 232 239 if (!result) ··· 235 242 hpfs_init_inode(result); 236 243 result->i_ino = fno; 237 244 hpfs_i(result)->i_parent_dir = dir->i_ino; 238 - result->i_ctime.tv_sec = result->i_mtime.tv_sec = result->i_atime.tv_sec = local_to_gmt(dir->i_sb, dee.creation_date); 245 + result->i_ctime.tv_sec = result->i_mtime.tv_sec = result->i_atime.tv_sec = local_to_gmt(dir->i_sb, le32_to_cpu(dee.creation_date)); 239 246 result->i_ctime.tv_nsec = 0; 240 247 result->i_mtime.tv_nsec = 0; 241 248 result->i_atime.tv_nsec = 0; ··· 247 254 result->i_blocks = 1; 248 255 init_special_inode(result, mode, rdev); 249 256 250 - mutex_lock(&hpfs_i(dir)->i_mutex); 251 - r = hpfs_add_dirent(dir, name, len, &dee, 0); 257 + r = hpfs_add_dirent(dir, name, len, &dee); 252 258 if (r == 1) 253 259 goto bail2; 254 260 if (r == -1) { ··· 256 264 } 257 265 fnode->len = len; 258 266 memcpy(fnode->name, name, len > 15 ? 15 : len); 259 - fnode->up = dir->i_ino; 267 + fnode->up = cpu_to_le32(dir->i_ino); 260 268 mark_buffer_dirty(bh); 261 269 262 270 insert_inode_hash(result); 263 271 264 272 hpfs_write_inode_nolock(result); 265 273 d_instantiate(dentry, result); 266 - mutex_unlock(&hpfs_i(dir)->i_mutex); 267 274 brelse(bh); 268 275 hpfs_unlock(dir->i_sb); 269 276 return 0; 270 277 bail2: 271 - mutex_unlock(&hpfs_i(dir)->i_mutex); 272 278 iput(result); 273 279 bail1: 274 280 brelse(bh); ··· 300 310 memset(&dee, 0, sizeof dee); 301 311 dee.archive = 1; 302 312 dee.hidden = name[0] == '.'; 303 - dee.fnode = fno; 304 - dee.creation_date = dee.write_date = dee.read_date = gmt_to_local(dir->i_sb, get_seconds()); 313 + dee.fnode = cpu_to_le32(fno); 314 + dee.creation_date = dee.write_date = dee.read_date = cpu_to_le32(gmt_to_local(dir->i_sb, get_seconds())); 305 315 306 316 result = new_inode(dir->i_sb); 307 317 if (!result) ··· 309 319 result->i_ino = fno; 310 320 hpfs_init_inode(result); 311 321 hpfs_i(result)->i_parent_dir = dir->i_ino; 312 - result->i_ctime.tv_sec = result->i_mtime.tv_sec = result->i_atime.tv_sec = local_to_gmt(dir->i_sb, dee.creation_date); 322 + result->i_ctime.tv_sec = result->i_mtime.tv_sec = result->i_atime.tv_sec = local_to_gmt(dir->i_sb, le32_to_cpu(dee.creation_date)); 313 323 result->i_ctime.tv_nsec = 0; 314 324 result->i_mtime.tv_nsec = 0; 315 325 result->i_atime.tv_nsec = 0; ··· 323 333 result->i_op = &page_symlink_inode_operations; 324 334 result->i_data.a_ops = &hpfs_symlink_aops; 325 335 326 - mutex_lock(&hpfs_i(dir)->i_mutex); 327 - r = hpfs_add_dirent(dir, name, len, &dee, 0); 336 + r = hpfs_add_dirent(dir, name, len, &dee); 328 337 if (r == 1) 329 338 goto bail2; 330 339 if (r == -1) { ··· 332 343 } 333 344 fnode->len = len; 334 345 memcpy(fnode->name, name, len > 15 ? 15 : len); 335 - fnode->up = dir->i_ino; 346 + fnode->up = cpu_to_le32(dir->i_ino); 336 347 hpfs_set_ea(result, fnode, "SYMLINK", symlink, strlen(symlink)); 337 348 mark_buffer_dirty(bh); 338 349 brelse(bh); ··· 341 352 342 353 hpfs_write_inode_nolock(result); 343 354 d_instantiate(dentry, result); 344 - mutex_unlock(&hpfs_i(dir)->i_mutex); 345 355 hpfs_unlock(dir->i_sb); 346 356 return 0; 347 357 bail2: 348 - mutex_unlock(&hpfs_i(dir)->i_mutex); 349 358 iput(result); 350 359 bail1: 351 360 brelse(bh); ··· 361 374 struct hpfs_dirent *de; 362 375 struct inode *inode = dentry->d_inode; 363 376 dnode_secno dno; 364 - fnode_secno fno; 365 377 int r; 366 378 int rep = 0; 367 379 int err; ··· 368 382 hpfs_lock(dir->i_sb); 369 383 hpfs_adjust_length(name, &len); 370 384 again: 371 - mutex_lock(&hpfs_i(inode)->i_parent_mutex); 372 - mutex_lock(&hpfs_i(dir)->i_mutex); 373 385 err = -ENOENT; 374 386 de = map_dirent(dir, hpfs_i(dir)->i_dno, name, len, &dno, &qbh); 375 387 if (!de) ··· 381 397 if (de->directory) 382 398 goto out1; 383 399 384 - fno = de->fnode; 385 400 r = hpfs_remove_dirent(dir, dno, de, &qbh, 1); 386 401 switch (r) { 387 402 case 1: ··· 393 410 if (rep++) 394 411 break; 395 412 396 - mutex_unlock(&hpfs_i(dir)->i_mutex); 397 - mutex_unlock(&hpfs_i(inode)->i_parent_mutex); 398 413 dentry_unhash(dentry); 399 414 if (!d_unhashed(dentry)) { 400 415 dput(dentry); ··· 426 445 out1: 427 446 hpfs_brelse4(&qbh); 428 447 out: 429 - mutex_unlock(&hpfs_i(dir)->i_mutex); 430 - mutex_unlock(&hpfs_i(inode)->i_parent_mutex); 431 448 hpfs_unlock(dir->i_sb); 432 449 return err; 433 450 } ··· 438 459 struct hpfs_dirent *de; 439 460 struct inode *inode = dentry->d_inode; 440 461 dnode_secno dno; 441 - fnode_secno fno; 442 462 int n_items = 0; 443 463 int err; 444 464 int r; 445 465 446 466 hpfs_adjust_length(name, &len); 447 467 hpfs_lock(dir->i_sb); 448 - mutex_lock(&hpfs_i(inode)->i_parent_mutex); 449 - mutex_lock(&hpfs_i(dir)->i_mutex); 450 468 err = -ENOENT; 451 469 de = map_dirent(dir, hpfs_i(dir)->i_dno, name, len, &dno, &qbh); 452 470 if (!de) ··· 462 486 if (n_items) 463 487 goto out1; 464 488 465 - fno = de->fnode; 466 489 r = hpfs_remove_dirent(dir, dno, de, &qbh, 1); 467 490 switch (r) { 468 491 case 1: ··· 480 505 out1: 481 506 hpfs_brelse4(&qbh); 482 507 out: 483 - mutex_unlock(&hpfs_i(dir)->i_mutex); 484 - mutex_unlock(&hpfs_i(inode)->i_parent_mutex); 485 508 hpfs_unlock(dir->i_sb); 486 509 return err; 487 510 } ··· 541 568 542 569 hpfs_lock(i->i_sb); 543 570 /* order doesn't matter, due to VFS exclusion */ 544 - mutex_lock(&hpfs_i(i)->i_parent_mutex); 545 - if (new_inode) 546 - mutex_lock(&hpfs_i(new_inode)->i_parent_mutex); 547 - mutex_lock(&hpfs_i(old_dir)->i_mutex); 548 - if (new_dir != old_dir) 549 - mutex_lock(&hpfs_i(new_dir)->i_mutex); 550 571 551 572 /* Erm? Moving over the empty non-busy directory is perfectly legal */ 552 573 if (new_inode && S_ISDIR(new_inode->i_mode)) { ··· 577 610 578 611 if (new_dir == old_dir) hpfs_brelse4(&qbh); 579 612 580 - hpfs_lock_creation(i->i_sb); 581 - if ((r = hpfs_add_dirent(new_dir, new_name, new_len, &de, 1))) { 582 - hpfs_unlock_creation(i->i_sb); 613 + if ((r = hpfs_add_dirent(new_dir, new_name, new_len, &de))) { 583 614 if (r == -1) hpfs_error(new_dir->i_sb, "hpfs_rename: dirent already exists!"); 584 615 err = r == 1 ? -ENOSPC : -EFSERROR; 585 616 if (new_dir != old_dir) hpfs_brelse4(&qbh); ··· 586 621 587 622 if (new_dir == old_dir) 588 623 if (!(dep = map_dirent(old_dir, hpfs_i(old_dir)->i_dno, old_name, old_len, &dno, &qbh))) { 589 - hpfs_unlock_creation(i->i_sb); 590 624 hpfs_error(i->i_sb, "lookup succeeded but map dirent failed at #2"); 591 625 err = -ENOENT; 592 626 goto end1; 593 627 } 594 628 595 629 if ((r = hpfs_remove_dirent(old_dir, dno, dep, &qbh, 0))) { 596 - hpfs_unlock_creation(i->i_sb); 597 630 hpfs_error(i->i_sb, "hpfs_rename: could not remove dirent"); 598 631 err = r == 2 ? -ENOSPC : -EFSERROR; 599 632 goto end1; 600 633 } 601 - hpfs_unlock_creation(i->i_sb); 602 - 634 + 603 635 end: 604 636 hpfs_i(i)->i_parent_dir = new_dir->i_ino; 605 637 if (S_ISDIR(i->i_mode)) { ··· 604 642 drop_nlink(old_dir); 605 643 } 606 644 if ((fnode = hpfs_map_fnode(i->i_sb, i->i_ino, &bh))) { 607 - fnode->up = new_dir->i_ino; 645 + fnode->up = cpu_to_le32(new_dir->i_ino); 608 646 fnode->len = new_len; 609 647 memcpy(fnode->name, new_name, new_len>15?15:new_len); 610 648 if (new_len < 15) memset(&fnode->name[new_len], 0, 15 - new_len); 611 649 mark_buffer_dirty(bh); 612 650 brelse(bh); 613 651 } 614 - hpfs_i(i)->i_conv = hpfs_sb(i->i_sb)->sb_conv; 615 - hpfs_decide_conv(i, new_name, new_len); 616 652 end1: 617 - if (old_dir != new_dir) 618 - mutex_unlock(&hpfs_i(new_dir)->i_mutex); 619 - mutex_unlock(&hpfs_i(old_dir)->i_mutex); 620 - mutex_unlock(&hpfs_i(i)->i_parent_mutex); 621 - if (new_inode) 622 - mutex_unlock(&hpfs_i(new_inode)->i_parent_mutex); 623 653 hpfs_unlock(i->i_sb); 624 654 return err; 625 655 }
+51 -67
fs/hpfs/super.c
··· 18 18 19 19 /* Mark the filesystem dirty, so that chkdsk checks it when os/2 booted */ 20 20 21 - static void mark_dirty(struct super_block *s) 21 + static void mark_dirty(struct super_block *s, int remount) 22 22 { 23 - if (hpfs_sb(s)->sb_chkdsk && !(s->s_flags & MS_RDONLY)) { 23 + if (hpfs_sb(s)->sb_chkdsk && (remount || !(s->s_flags & MS_RDONLY))) { 24 24 struct buffer_head *bh; 25 25 struct hpfs_spare_block *sb; 26 26 if ((sb = hpfs_map_sector(s, 17, &bh, 0))) { 27 27 sb->dirty = 1; 28 28 sb->old_wrote = 0; 29 29 mark_buffer_dirty(bh); 30 + sync_dirty_buffer(bh); 30 31 brelse(bh); 31 32 } 32 33 } ··· 41 40 struct buffer_head *bh; 42 41 struct hpfs_spare_block *sb; 43 42 if (s->s_flags & MS_RDONLY) return; 43 + sync_blockdev(s->s_bdev); 44 44 if ((sb = hpfs_map_sector(s, 17, &bh, 0))) { 45 45 sb->dirty = hpfs_sb(s)->sb_chkdsk > 1 - hpfs_sb(s)->sb_was_error; 46 46 sb->old_wrote = hpfs_sb(s)->sb_chkdsk >= 2 && !hpfs_sb(s)->sb_was_error; 47 47 mark_buffer_dirty(bh); 48 + sync_dirty_buffer(bh); 48 49 brelse(bh); 49 50 } 50 51 } ··· 66 63 if (!hpfs_sb(s)->sb_was_error) { 67 64 if (hpfs_sb(s)->sb_err == 2) { 68 65 printk("; crashing the system because you wanted it\n"); 69 - mark_dirty(s); 66 + mark_dirty(s, 0); 70 67 panic("HPFS panic"); 71 68 } else if (hpfs_sb(s)->sb_err == 1) { 72 69 if (s->s_flags & MS_RDONLY) printk("; already mounted read-only\n"); 73 70 else { 74 71 printk("; remounting read-only\n"); 75 - mark_dirty(s); 72 + mark_dirty(s, 0); 76 73 s->s_flags |= MS_RDONLY; 77 74 } 78 75 } else if (s->s_flags & MS_RDONLY) printk("; going on - but anything won't be destroyed because it's read-only\n"); ··· 105 102 { 106 103 struct hpfs_sb_info *sbi = hpfs_sb(s); 107 104 105 + hpfs_lock(s); 106 + unmark_dirty(s); 107 + hpfs_unlock(s); 108 + 108 109 kfree(sbi->sb_cp_table); 109 110 kfree(sbi->sb_bmp_dir); 110 - unmark_dirty(s); 111 111 s->s_fs_info = NULL; 112 112 kfree(sbi); 113 113 } ··· 135 129 n_bands = (hpfs_sb(s)->sb_fs_size + 0x3fff) >> 14; 136 130 count = 0; 137 131 for (n = 0; n < n_bands; n++) 138 - count += hpfs_count_one_bitmap(s, hpfs_sb(s)->sb_bmp_dir[n]); 132 + count += hpfs_count_one_bitmap(s, le32_to_cpu(hpfs_sb(s)->sb_bmp_dir[n])); 139 133 return count; 140 134 } 141 135 ··· 194 188 { 195 189 struct hpfs_inode_info *ei = (struct hpfs_inode_info *) foo; 196 190 197 - mutex_init(&ei->i_mutex); 198 - mutex_init(&ei->i_parent_mutex); 199 191 inode_init_once(&ei->vfs_inode); 200 192 } 201 193 ··· 222 218 223 219 enum { 224 220 Opt_help, Opt_uid, Opt_gid, Opt_umask, Opt_case_lower, Opt_case_asis, 225 - Opt_conv_binary, Opt_conv_text, Opt_conv_auto, 226 221 Opt_check_none, Opt_check_normal, Opt_check_strict, 227 222 Opt_err_cont, Opt_err_ro, Opt_err_panic, 228 223 Opt_eas_no, Opt_eas_ro, Opt_eas_rw, ··· 236 233 {Opt_umask, "umask=%o"}, 237 234 {Opt_case_lower, "case=lower"}, 238 235 {Opt_case_asis, "case=asis"}, 239 - {Opt_conv_binary, "conv=binary"}, 240 - {Opt_conv_text, "conv=text"}, 241 - {Opt_conv_auto, "conv=auto"}, 242 236 {Opt_check_none, "check=none"}, 243 237 {Opt_check_normal, "check=normal"}, 244 238 {Opt_check_strict, "check=strict"}, ··· 253 253 }; 254 254 255 255 static int parse_opts(char *opts, uid_t *uid, gid_t *gid, umode_t *umask, 256 - int *lowercase, int *conv, int *eas, int *chk, int *errs, 256 + int *lowercase, int *eas, int *chk, int *errs, 257 257 int *chkdsk, int *timeshift) 258 258 { 259 259 char *p; ··· 294 294 break; 295 295 case Opt_case_asis: 296 296 *lowercase = 0; 297 - break; 298 - case Opt_conv_binary: 299 - *conv = CONV_BINARY; 300 - break; 301 - case Opt_conv_text: 302 - *conv = CONV_TEXT; 303 - break; 304 - case Opt_conv_auto: 305 - *conv = CONV_AUTO; 306 297 break; 307 298 case Opt_check_none: 308 299 *chk = 0; ··· 361 370 umask=xxx set mode of files that don't have mode specified in eas\n\ 362 371 case=lower lowercase all files\n\ 363 372 case=asis do not lowercase files (default)\n\ 364 - conv=binary do not convert CR/LF -> LF (default)\n\ 365 - conv=auto convert only files with known text extensions\n\ 366 - conv=text convert all files\n\ 367 373 check=none no fs checks - kernel may crash on corrupted filesystem\n\ 368 374 check=normal do some checks - it should not crash (default)\n\ 369 375 check=strict do extra time-consuming checks, used for debugging\n\ ··· 382 394 uid_t uid; 383 395 gid_t gid; 384 396 umode_t umask; 385 - int lowercase, conv, eas, chk, errs, chkdsk, timeshift; 397 + int lowercase, eas, chk, errs, chkdsk, timeshift; 386 398 int o; 387 399 struct hpfs_sb_info *sbi = hpfs_sb(s); 388 400 char *new_opts = kstrdup(data, GFP_KERNEL); ··· 393 405 lock_super(s); 394 406 uid = sbi->sb_uid; gid = sbi->sb_gid; 395 407 umask = 0777 & ~sbi->sb_mode; 396 - lowercase = sbi->sb_lowercase; conv = sbi->sb_conv; 408 + lowercase = sbi->sb_lowercase; 397 409 eas = sbi->sb_eas; chk = sbi->sb_chk; chkdsk = sbi->sb_chkdsk; 398 410 errs = sbi->sb_err; timeshift = sbi->sb_timeshift; 399 411 400 - if (!(o = parse_opts(data, &uid, &gid, &umask, &lowercase, &conv, 412 + if (!(o = parse_opts(data, &uid, &gid, &umask, &lowercase, 401 413 &eas, &chk, &errs, &chkdsk, &timeshift))) { 402 414 printk("HPFS: bad mount options.\n"); 403 415 goto out_err; ··· 415 427 416 428 sbi->sb_uid = uid; sbi->sb_gid = gid; 417 429 sbi->sb_mode = 0777 & ~umask; 418 - sbi->sb_lowercase = lowercase; sbi->sb_conv = conv; 430 + sbi->sb_lowercase = lowercase; 419 431 sbi->sb_eas = eas; sbi->sb_chk = chk; sbi->sb_chkdsk = chkdsk; 420 432 sbi->sb_err = errs; sbi->sb_timeshift = timeshift; 421 433 422 - if (!(*flags & MS_RDONLY)) mark_dirty(s); 434 + if (!(*flags & MS_RDONLY)) mark_dirty(s, 1); 423 435 424 436 replace_mount_options(s, new_opts); 425 437 ··· 459 471 uid_t uid; 460 472 gid_t gid; 461 473 umode_t umask; 462 - int lowercase, conv, eas, chk, errs, chkdsk, timeshift; 474 + int lowercase, eas, chk, errs, chkdsk, timeshift; 463 475 464 476 dnode_secno root_dno; 465 477 struct hpfs_dirent *de = NULL; 466 478 struct quad_buffer_head qbh; 467 479 468 480 int o; 469 - 470 - if (num_possible_cpus() > 1) { 471 - printk(KERN_ERR "HPFS is not SMP safe\n"); 472 - return -EINVAL; 473 - } 474 481 475 482 save_mount_options(s, options); 476 483 ··· 478 495 sbi->sb_bmp_dir = NULL; 479 496 sbi->sb_cp_table = NULL; 480 497 481 - mutex_init(&sbi->hpfs_creation_de); 498 + mutex_init(&sbi->hpfs_mutex); 499 + hpfs_lock(s); 482 500 483 501 uid = current_uid(); 484 502 gid = current_gid(); 485 503 umask = current_umask(); 486 504 lowercase = 0; 487 - conv = CONV_BINARY; 488 505 eas = 2; 489 506 chk = 1; 490 507 errs = 1; 491 508 chkdsk = 1; 492 509 timeshift = 0; 493 510 494 - if (!(o = parse_opts(options, &uid, &gid, &umask, &lowercase, &conv, 511 + if (!(o = parse_opts(options, &uid, &gid, &umask, &lowercase, 495 512 &eas, &chk, &errs, &chkdsk, &timeshift))) { 496 513 printk("HPFS: bad mount options.\n"); 497 514 goto bail0; ··· 509 526 if (!(spareblock = hpfs_map_sector(s, 17, &bh2, 0))) goto bail3; 510 527 511 528 /* Check magics */ 512 - if (/*bootblock->magic != BB_MAGIC 513 - ||*/ superblock->magic != SB_MAGIC 514 - || spareblock->magic != SP_MAGIC) { 529 + if (/*le16_to_cpu(bootblock->magic) != BB_MAGIC 530 + ||*/ le32_to_cpu(superblock->magic) != SB_MAGIC 531 + || le32_to_cpu(spareblock->magic) != SP_MAGIC) { 515 532 if (!silent) printk("HPFS: Bad magic ... probably not HPFS\n"); 516 533 goto bail4; 517 534 } ··· 532 549 s->s_op = &hpfs_sops; 533 550 s->s_d_op = &hpfs_dentry_operations; 534 551 535 - sbi->sb_root = superblock->root; 536 - sbi->sb_fs_size = superblock->n_sectors; 537 - sbi->sb_bitmaps = superblock->bitmaps; 538 - sbi->sb_dirband_start = superblock->dir_band_start; 539 - sbi->sb_dirband_size = superblock->n_dir_band; 540 - sbi->sb_dmap = superblock->dir_band_bitmap; 552 + sbi->sb_root = le32_to_cpu(superblock->root); 553 + sbi->sb_fs_size = le32_to_cpu(superblock->n_sectors); 554 + sbi->sb_bitmaps = le32_to_cpu(superblock->bitmaps); 555 + sbi->sb_dirband_start = le32_to_cpu(superblock->dir_band_start); 556 + sbi->sb_dirband_size = le32_to_cpu(superblock->n_dir_band); 557 + sbi->sb_dmap = le32_to_cpu(superblock->dir_band_bitmap); 541 558 sbi->sb_uid = uid; 542 559 sbi->sb_gid = gid; 543 560 sbi->sb_mode = 0777 & ~umask; 544 561 sbi->sb_n_free = -1; 545 562 sbi->sb_n_free_dnodes = -1; 546 563 sbi->sb_lowercase = lowercase; 547 - sbi->sb_conv = conv; 548 564 sbi->sb_eas = eas; 549 565 sbi->sb_chk = chk; 550 566 sbi->sb_chkdsk = chkdsk; ··· 555 573 sbi->sb_max_fwd_alloc = 0xffffff; 556 574 557 575 /* Load bitmap directory */ 558 - if (!(sbi->sb_bmp_dir = hpfs_load_bitmap_directory(s, superblock->bitmaps))) 576 + if (!(sbi->sb_bmp_dir = hpfs_load_bitmap_directory(s, le32_to_cpu(superblock->bitmaps)))) 559 577 goto bail4; 560 578 561 579 /* Check for general fs errors*/ ··· 573 591 mark_buffer_dirty(bh2); 574 592 } 575 593 576 - if (spareblock->hotfixes_used || spareblock->n_spares_used) { 594 + if (le32_to_cpu(spareblock->hotfixes_used) || le32_to_cpu(spareblock->n_spares_used)) { 577 595 if (errs >= 2) { 578 596 printk("HPFS: Hotfixes not supported here, try chkdsk\n"); 579 - mark_dirty(s); 597 + mark_dirty(s, 0); 580 598 goto bail4; 581 599 } 582 600 hpfs_error(s, "hotfixes not supported here, try chkdsk"); 583 601 if (errs == 0) printk("HPFS: Proceeding, but your filesystem will be probably corrupted by this driver...\n"); 584 602 else printk("HPFS: This driver may read bad files or crash when operating on disk with hotfixes.\n"); 585 603 } 586 - if (spareblock->n_dnode_spares != spareblock->n_dnode_spares_free) { 604 + if (le32_to_cpu(spareblock->n_dnode_spares) != le32_to_cpu(spareblock->n_dnode_spares_free)) { 587 605 if (errs >= 2) { 588 606 printk("HPFS: Spare dnodes used, try chkdsk\n"); 589 - mark_dirty(s); 607 + mark_dirty(s, 0); 590 608 goto bail4; 591 609 } 592 610 hpfs_error(s, "warning: spare dnodes used, try chkdsk"); ··· 594 612 } 595 613 if (chk) { 596 614 unsigned a; 597 - if (superblock->dir_band_end - superblock->dir_band_start + 1 != superblock->n_dir_band || 598 - superblock->dir_band_end < superblock->dir_band_start || superblock->n_dir_band > 0x4000) { 615 + if (le32_to_cpu(superblock->dir_band_end) - le32_to_cpu(superblock->dir_band_start) + 1 != le32_to_cpu(superblock->n_dir_band) || 616 + le32_to_cpu(superblock->dir_band_end) < le32_to_cpu(superblock->dir_band_start) || le32_to_cpu(superblock->n_dir_band) > 0x4000) { 599 617 hpfs_error(s, "dir band size mismatch: dir_band_start==%08x, dir_band_end==%08x, n_dir_band==%08x", 600 - superblock->dir_band_start, superblock->dir_band_end, superblock->n_dir_band); 618 + le32_to_cpu(superblock->dir_band_start), le32_to_cpu(superblock->dir_band_end), le32_to_cpu(superblock->n_dir_band)); 601 619 goto bail4; 602 620 } 603 621 a = sbi->sb_dirband_size; 604 622 sbi->sb_dirband_size = 0; 605 - if (hpfs_chk_sectors(s, superblock->dir_band_start, superblock->n_dir_band, "dir_band") || 606 - hpfs_chk_sectors(s, superblock->dir_band_bitmap, 4, "dir_band_bitmap") || 607 - hpfs_chk_sectors(s, superblock->bitmaps, 4, "bitmaps")) { 608 - mark_dirty(s); 623 + if (hpfs_chk_sectors(s, le32_to_cpu(superblock->dir_band_start), le32_to_cpu(superblock->n_dir_band), "dir_band") || 624 + hpfs_chk_sectors(s, le32_to_cpu(superblock->dir_band_bitmap), 4, "dir_band_bitmap") || 625 + hpfs_chk_sectors(s, le32_to_cpu(superblock->bitmaps), 4, "bitmaps")) { 626 + mark_dirty(s, 0); 609 627 goto bail4; 610 628 } 611 629 sbi->sb_dirband_size = a; 612 630 } else printk("HPFS: You really don't want any checks? You are crazy...\n"); 613 631 614 632 /* Load code page table */ 615 - if (spareblock->n_code_pages) 616 - if (!(sbi->sb_cp_table = hpfs_load_code_page(s, spareblock->code_page_dir))) 633 + if (le32_to_cpu(spareblock->n_code_pages)) 634 + if (!(sbi->sb_cp_table = hpfs_load_code_page(s, le32_to_cpu(spareblock->code_page_dir)))) 617 635 printk("HPFS: Warning: code page support is disabled\n"); 618 636 619 637 brelse(bh2); ··· 642 660 if (!de) 643 661 hpfs_error(s, "unable to find root dir"); 644 662 else { 645 - root->i_atime.tv_sec = local_to_gmt(s, de->read_date); 663 + root->i_atime.tv_sec = local_to_gmt(s, le32_to_cpu(de->read_date)); 646 664 root->i_atime.tv_nsec = 0; 647 - root->i_mtime.tv_sec = local_to_gmt(s, de->write_date); 665 + root->i_mtime.tv_sec = local_to_gmt(s, le32_to_cpu(de->write_date)); 648 666 root->i_mtime.tv_nsec = 0; 649 - root->i_ctime.tv_sec = local_to_gmt(s, de->creation_date); 667 + root->i_ctime.tv_sec = local_to_gmt(s, le32_to_cpu(de->creation_date)); 650 668 root->i_ctime.tv_nsec = 0; 651 - hpfs_i(root)->i_ea_size = de->ea_size; 669 + hpfs_i(root)->i_ea_size = le16_to_cpu(de->ea_size); 652 670 hpfs_i(root)->i_parent_dir = root->i_ino; 653 671 if (root->i_size == -1) 654 672 root->i_size = 2048; ··· 656 674 root->i_blocks = 5; 657 675 hpfs_brelse4(&qbh); 658 676 } 677 + hpfs_unlock(s); 659 678 return 0; 660 679 661 680 bail4: brelse(bh2); ··· 664 681 bail2: brelse(bh0); 665 682 bail1: 666 683 bail0: 684 + hpfs_unlock(s); 667 685 kfree(sbi->sb_bmp_dir); 668 686 kfree(sbi->sb_cp_table); 669 687 s->s_fs_info = NULL;
+4 -4
fs/logfs/super.c
··· 480 480 !read_only) 481 481 return -EIO; 482 482 483 - mutex_init(&super->s_dirop_mutex); 484 - mutex_init(&super->s_object_alias_mutex); 485 - INIT_LIST_HEAD(&super->s_freeing_list); 486 - 487 483 ret = logfs_init_rw(sb); 488 484 if (ret) 489 485 return ret; ··· 596 600 super = kzalloc(sizeof(*super), GFP_KERNEL); 597 601 if (!super) 598 602 return ERR_PTR(-ENOMEM); 603 + 604 + mutex_init(&super->s_dirop_mutex); 605 + mutex_init(&super->s_object_alias_mutex); 606 + INIT_LIST_HEAD(&super->s_freeing_list); 599 607 600 608 if (!devname) 601 609 err = logfs_get_sb_bdev(super, type, devname);
+2 -2
fs/nfs/namespace.c
··· 119 119 } 120 120 121 121 #ifdef CONFIG_NFS_V4 122 - static rpc_authflavor_t nfs_find_best_sec(struct nfs4_secinfo_flavors *flavors, struct inode *inode) 122 + static rpc_authflavor_t nfs_find_best_sec(struct nfs4_secinfo_flavors *flavors) 123 123 { 124 124 struct gss_api_mech *mech; 125 125 struct xdr_netobj oid; ··· 166 166 } 167 167 flavors = page_address(page); 168 168 ret = secinfo(parent->d_inode, &dentry->d_name, flavors); 169 - *flavor = nfs_find_best_sec(flavors, dentry->d_inode); 169 + *flavor = nfs_find_best_sec(flavors); 170 170 put_page(page); 171 171 } 172 172
+1
fs/nfs/nfs4_fs.h
··· 47 47 NFS4CLNT_LAYOUTRECALL, 48 48 NFS4CLNT_SESSION_RESET, 49 49 NFS4CLNT_RECALL_SLOT, 50 + NFS4CLNT_LEASE_CONFIRM, 50 51 }; 51 52 52 53 enum nfs4_session_state {
+60 -62
fs/nfs/nfs4proc.c
··· 46 46 #include <linux/nfs4.h> 47 47 #include <linux/nfs_fs.h> 48 48 #include <linux/nfs_page.h> 49 + #include <linux/nfs_mount.h> 49 50 #include <linux/namei.h> 50 51 #include <linux/mount.h> 51 52 #include <linux/module.h> ··· 444 443 if (res->sr_status == 1) 445 444 res->sr_status = NFS_OK; 446 445 447 - /* -ERESTARTSYS can result in skipping nfs41_sequence_setup */ 448 - if (!res->sr_slot) 446 + /* don't increment the sequence number if the task wasn't sent */ 447 + if (!RPC_WAS_SENT(task)) 449 448 goto out; 450 449 451 450 /* Check the SEQUENCE operation status */ ··· 2186 2185 struct nfs4_exception exception = { }; 2187 2186 int err; 2188 2187 do { 2189 - err = nfs4_handle_exception(server, 2190 - _nfs4_lookup_root(server, fhandle, info), 2191 - &exception); 2188 + err = _nfs4_lookup_root(server, fhandle, info); 2189 + switch (err) { 2190 + case 0: 2191 + case -NFS4ERR_WRONGSEC: 2192 + break; 2193 + default: 2194 + err = nfs4_handle_exception(server, err, &exception); 2195 + } 2192 2196 } while (exception.retry); 2193 2197 return err; 2194 2198 } ··· 2214 2208 return ret; 2215 2209 } 2216 2210 2211 + static int nfs4_find_root_sec(struct nfs_server *server, struct nfs_fh *fhandle, 2212 + struct nfs_fsinfo *info) 2213 + { 2214 + int i, len, status = 0; 2215 + rpc_authflavor_t flav_array[NFS_MAX_SECFLAVORS]; 2216 + 2217 + len = gss_mech_list_pseudoflavors(&flav_array[0]); 2218 + flav_array[len] = RPC_AUTH_NULL; 2219 + len += 1; 2220 + 2221 + for (i = 0; i < len; i++) { 2222 + status = nfs4_lookup_root_sec(server, fhandle, info, flav_array[i]); 2223 + if (status == -NFS4ERR_WRONGSEC || status == -EACCES) 2224 + continue; 2225 + break; 2226 + } 2227 + /* 2228 + * -EACCESS could mean that the user doesn't have correct permissions 2229 + * to access the mount. It could also mean that we tried to mount 2230 + * with a gss auth flavor, but rpc.gssd isn't running. Either way, 2231 + * existing mount programs don't handle -EACCES very well so it should 2232 + * be mapped to -EPERM instead. 2233 + */ 2234 + if (status == -EACCES) 2235 + status = -EPERM; 2236 + return status; 2237 + } 2238 + 2217 2239 /* 2218 2240 * get the file handle for the "/" directory on the server 2219 2241 */ 2220 2242 static int nfs4_proc_get_root(struct nfs_server *server, struct nfs_fh *fhandle, 2221 2243 struct nfs_fsinfo *info) 2222 2244 { 2223 - int i, len, status = 0; 2224 - rpc_authflavor_t flav_array[NFS_MAX_SECFLAVORS + 2]; 2225 - 2226 - flav_array[0] = RPC_AUTH_UNIX; 2227 - len = gss_mech_list_pseudoflavors(&flav_array[1]); 2228 - flav_array[1+len] = RPC_AUTH_NULL; 2229 - len += 2; 2230 - 2231 - for (i = 0; i < len; i++) { 2232 - status = nfs4_lookup_root_sec(server, fhandle, info, flav_array[i]); 2233 - if (status != -EPERM) 2234 - break; 2235 - } 2245 + int status = nfs4_lookup_root(server, fhandle, info); 2246 + if ((status == -NFS4ERR_WRONGSEC) && !(server->flags & NFS_MOUNT_SECFLAVOUR)) 2247 + /* 2248 + * A status of -NFS4ERR_WRONGSEC will be mapped to -EPERM 2249 + * by nfs4_map_errors() as this function exits. 2250 + */ 2251 + status = nfs4_find_root_sec(server, fhandle, info); 2236 2252 if (status == 0) 2237 2253 status = nfs4_server_capabilities(server, fhandle); 2238 2254 if (status == 0) ··· 3751 3723 sizeof(setclientid.sc_uaddr), "%s.%u.%u", 3752 3724 clp->cl_ipaddr, port >> 8, port & 255); 3753 3725 3754 - status = rpc_call_sync(clp->cl_rpcclient, &msg, 0); 3726 + status = rpc_call_sync(clp->cl_rpcclient, &msg, RPC_TASK_TIMEOUT); 3755 3727 if (status != -NFS4ERR_CLID_INUSE) 3756 3728 break; 3757 - if (signalled()) 3729 + if (loop != 0) { 3730 + ++clp->cl_id_uniquifier; 3758 3731 break; 3759 - if (loop++ & 1) 3760 - ssleep(clp->cl_lease_time / HZ + 1); 3761 - else 3762 - if (++clp->cl_id_uniquifier == 0) 3763 - break; 3732 + } 3733 + ++loop; 3734 + ssleep(clp->cl_lease_time / HZ + 1); 3764 3735 } 3765 3736 return status; 3766 3737 } 3767 3738 3768 - static int _nfs4_proc_setclientid_confirm(struct nfs_client *clp, 3739 + int nfs4_proc_setclientid_confirm(struct nfs_client *clp, 3769 3740 struct nfs4_setclientid_res *arg, 3770 3741 struct rpc_cred *cred) 3771 3742 { ··· 3779 3752 int status; 3780 3753 3781 3754 now = jiffies; 3782 - status = rpc_call_sync(clp->cl_rpcclient, &msg, 0); 3755 + status = rpc_call_sync(clp->cl_rpcclient, &msg, RPC_TASK_TIMEOUT); 3783 3756 if (status == 0) { 3784 3757 spin_lock(&clp->cl_lock); 3785 3758 clp->cl_lease_time = fsinfo.lease_time * HZ; ··· 3787 3760 spin_unlock(&clp->cl_lock); 3788 3761 } 3789 3762 return status; 3790 - } 3791 - 3792 - int nfs4_proc_setclientid_confirm(struct nfs_client *clp, 3793 - struct nfs4_setclientid_res *arg, 3794 - struct rpc_cred *cred) 3795 - { 3796 - long timeout = 0; 3797 - int err; 3798 - do { 3799 - err = _nfs4_proc_setclientid_confirm(clp, arg, cred); 3800 - switch (err) { 3801 - case 0: 3802 - return err; 3803 - case -NFS4ERR_RESOURCE: 3804 - /* The IBM lawyers misread another document! */ 3805 - case -NFS4ERR_DELAY: 3806 - err = nfs4_delay(clp->cl_rpcclient, &timeout); 3807 - } 3808 - } while (err == 0); 3809 - return err; 3810 3763 } 3811 3764 3812 3765 struct nfs4_delegreturndata { ··· 4793 4786 init_utsname()->domainname, 4794 4787 clp->cl_rpcclient->cl_auth->au_flavor); 4795 4788 4796 - status = rpc_call_sync(clp->cl_rpcclient, &msg, 0); 4789 + status = rpc_call_sync(clp->cl_rpcclient, &msg, RPC_TASK_TIMEOUT); 4797 4790 if (!status) 4798 4791 status = nfs4_check_cl_exchange_flags(clp->cl_exchange_flags); 4799 4792 dprintk("<-- %s status= %d\n", __func__, status); ··· 4876 4869 .rpc_client = clp->cl_rpcclient, 4877 4870 .rpc_message = &msg, 4878 4871 .callback_ops = &nfs4_get_lease_time_ops, 4879 - .callback_data = &data 4872 + .callback_data = &data, 4873 + .flags = RPC_TASK_TIMEOUT, 4880 4874 }; 4881 4875 int status; 4882 4876 ··· 5179 5171 nfs4_init_channel_attrs(&args); 5180 5172 args.flags = (SESSION4_PERSIST | SESSION4_BACK_CHAN); 5181 5173 5182 - status = rpc_call_sync(session->clp->cl_rpcclient, &msg, 0); 5174 + status = rpc_call_sync(session->clp->cl_rpcclient, &msg, RPC_TASK_TIMEOUT); 5183 5175 5184 5176 if (!status) 5185 5177 /* Verify the session's negotiated channel_attrs values */ ··· 5202 5194 int status; 5203 5195 unsigned *ptr; 5204 5196 struct nfs4_session *session = clp->cl_session; 5205 - long timeout = 0; 5206 - int err; 5207 5197 5208 5198 dprintk("--> %s clp=%p session=%p\n", __func__, clp, session); 5209 5199 5210 - do { 5211 - status = _nfs4_proc_create_session(clp); 5212 - if (status == -NFS4ERR_DELAY) { 5213 - err = nfs4_delay(clp->cl_rpcclient, &timeout); 5214 - if (err) 5215 - status = err; 5216 - } 5217 - } while (status == -NFS4ERR_DELAY); 5218 - 5200 + status = _nfs4_proc_create_session(clp); 5219 5201 if (status) 5220 5202 goto out; 5221 5203 ··· 5246 5248 msg.rpc_argp = session; 5247 5249 msg.rpc_resp = NULL; 5248 5250 msg.rpc_cred = NULL; 5249 - status = rpc_call_sync(session->clp->cl_rpcclient, &msg, 0); 5251 + status = rpc_call_sync(session->clp->cl_rpcclient, &msg, RPC_TASK_TIMEOUT); 5250 5252 5251 5253 if (status) 5252 5254 printk(KERN_WARNING
+34 -17
fs/nfs/nfs4state.c
··· 64 64 65 65 int nfs4_init_clientid(struct nfs_client *clp, struct rpc_cred *cred) 66 66 { 67 - struct nfs4_setclientid_res clid; 67 + struct nfs4_setclientid_res clid = { 68 + .clientid = clp->cl_clientid, 69 + .confirm = clp->cl_confirm, 70 + }; 68 71 unsigned short port; 69 72 int status; 70 73 74 + if (test_bit(NFS4CLNT_LEASE_CONFIRM, &clp->cl_state)) 75 + goto do_confirm; 71 76 port = nfs_callback_tcpport; 72 77 if (clp->cl_addr.ss_family == AF_INET6) 73 78 port = nfs_callback_tcpport6; ··· 80 75 status = nfs4_proc_setclientid(clp, NFS4_CALLBACK, port, cred, &clid); 81 76 if (status != 0) 82 77 goto out; 78 + clp->cl_clientid = clid.clientid; 79 + clp->cl_confirm = clid.confirm; 80 + set_bit(NFS4CLNT_LEASE_CONFIRM, &clp->cl_state); 81 + do_confirm: 83 82 status = nfs4_proc_setclientid_confirm(clp, &clid, cred); 84 83 if (status != 0) 85 84 goto out; 86 - clp->cl_clientid = clid.clientid; 85 + clear_bit(NFS4CLNT_LEASE_CONFIRM, &clp->cl_state); 87 86 nfs4_schedule_state_renewal(clp); 88 87 out: 89 88 return status; ··· 239 230 { 240 231 int status; 241 232 233 + if (test_bit(NFS4CLNT_LEASE_CONFIRM, &clp->cl_state)) 234 + goto do_confirm; 242 235 nfs4_begin_drain_session(clp); 243 236 status = nfs4_proc_exchange_id(clp, cred); 244 237 if (status != 0) 245 238 goto out; 239 + set_bit(NFS4CLNT_LEASE_CONFIRM, &clp->cl_state); 240 + do_confirm: 246 241 status = nfs4_proc_create_session(clp); 247 242 if (status != 0) 248 243 goto out; 244 + clear_bit(NFS4CLNT_LEASE_CONFIRM, &clp->cl_state); 249 245 nfs41_setup_state_renewal(clp); 250 246 nfs_mark_client_ready(clp, NFS_CS_READY); 251 247 out: ··· 1598 1584 */ 1599 1585 static void nfs4_set_lease_expired(struct nfs_client *clp, int status) 1600 1586 { 1601 - if (nfs4_has_session(clp)) { 1602 - switch (status) { 1603 - case -NFS4ERR_DELAY: 1604 - case -NFS4ERR_CLID_INUSE: 1605 - case -EAGAIN: 1606 - break; 1587 + switch (status) { 1588 + case -NFS4ERR_CLID_INUSE: 1589 + case -NFS4ERR_STALE_CLIENTID: 1590 + clear_bit(NFS4CLNT_LEASE_CONFIRM, &clp->cl_state); 1591 + break; 1592 + case -NFS4ERR_DELAY: 1593 + case -ETIMEDOUT: 1594 + case -EAGAIN: 1595 + ssleep(1); 1596 + break; 1607 1597 1608 - case -EKEYEXPIRED: 1609 - nfs4_warn_keyexpired(clp->cl_hostname); 1610 - case -NFS4ERR_NOT_SAME: /* FixMe: implement recovery 1611 - * in nfs4_exchange_id */ 1612 - default: 1613 - return; 1614 - } 1598 + case -EKEYEXPIRED: 1599 + nfs4_warn_keyexpired(clp->cl_hostname); 1600 + case -NFS4ERR_NOT_SAME: /* FixMe: implement recovery 1601 + * in nfs4_exchange_id */ 1602 + default: 1603 + return; 1615 1604 } 1616 1605 set_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state); 1617 1606 } ··· 1624 1607 int status = 0; 1625 1608 1626 1609 /* Ensure exclusive access to NFSv4 state */ 1627 - for(;;) { 1610 + do { 1628 1611 if (test_and_clear_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state)) { 1629 1612 /* We're going to have to re-establish a clientid */ 1630 1613 status = nfs4_reclaim_lease(clp); ··· 1708 1691 break; 1709 1692 if (test_and_set_bit(NFS4CLNT_MANAGER_RUNNING, &clp->cl_state) != 0) 1710 1693 break; 1711 - } 1694 + } while (atomic_read(&clp->cl_count) > 1); 1712 1695 return; 1713 1696 out_error: 1714 1697 printk(KERN_WARNING "Error: state manager failed on NFSv4 server %s"
+28 -25
fs/nfs/nfs4xdr.c
··· 1452 1452 1453 1453 static void encode_readdir(struct xdr_stream *xdr, const struct nfs4_readdir_arg *readdir, struct rpc_rqst *req, struct compound_hdr *hdr) 1454 1454 { 1455 - uint32_t attrs[2] = {0, 0}; 1455 + uint32_t attrs[2] = { 1456 + FATTR4_WORD0_RDATTR_ERROR, 1457 + FATTR4_WORD1_MOUNTED_ON_FILEID, 1458 + }; 1456 1459 uint32_t dircount = readdir->count >> 1; 1457 1460 __be32 *p; 1458 1461 1459 1462 if (readdir->plus) { 1460 1463 attrs[0] |= FATTR4_WORD0_TYPE|FATTR4_WORD0_CHANGE|FATTR4_WORD0_SIZE| 1461 - FATTR4_WORD0_FSID|FATTR4_WORD0_FILEHANDLE; 1464 + FATTR4_WORD0_FSID|FATTR4_WORD0_FILEHANDLE|FATTR4_WORD0_FILEID; 1462 1465 attrs[1] |= FATTR4_WORD1_MODE|FATTR4_WORD1_NUMLINKS|FATTR4_WORD1_OWNER| 1463 1466 FATTR4_WORD1_OWNER_GROUP|FATTR4_WORD1_RAWDEV| 1464 1467 FATTR4_WORD1_SPACE_USED|FATTR4_WORD1_TIME_ACCESS| 1465 1468 FATTR4_WORD1_TIME_METADATA|FATTR4_WORD1_TIME_MODIFY; 1466 1469 dircount >>= 1; 1467 1470 } 1468 - attrs[0] |= FATTR4_WORD0_RDATTR_ERROR|FATTR4_WORD0_FILEID; 1469 - attrs[1] |= FATTR4_WORD1_MOUNTED_ON_FILEID; 1470 - /* Switch to mounted_on_fileid if the server supports it */ 1471 - if (readdir->bitmask[1] & FATTR4_WORD1_MOUNTED_ON_FILEID) 1472 - attrs[0] &= ~FATTR4_WORD0_FILEID; 1473 - else 1474 - attrs[1] &= ~FATTR4_WORD1_MOUNTED_ON_FILEID; 1471 + /* Use mounted_on_fileid only if the server supports it */ 1472 + if (!(readdir->bitmask[1] & FATTR4_WORD1_MOUNTED_ON_FILEID)) 1473 + attrs[0] |= FATTR4_WORD0_FILEID; 1475 1474 1476 1475 p = reserve_space(xdr, 12+NFS4_VERIFIER_SIZE+20); 1477 1476 *p++ = cpu_to_be32(OP_READDIR); ··· 3139 3140 goto out_overflow; 3140 3141 xdr_decode_hyper(p, fileid); 3141 3142 bitmap[1] &= ~FATTR4_WORD1_MOUNTED_ON_FILEID; 3142 - ret = NFS_ATTR_FATTR_FILEID; 3143 + ret = NFS_ATTR_FATTR_MOUNTED_ON_FILEID; 3143 3144 } 3144 3145 dprintk("%s: fileid=%Lu\n", __func__, (unsigned long long)*fileid); 3145 3146 return ret; ··· 4001 4002 { 4002 4003 int status; 4003 4004 umode_t fmode = 0; 4004 - uint64_t fileid; 4005 4005 uint32_t type; 4006 4006 4007 4007 status = decode_attr_type(xdr, bitmap, &type); ··· 4099 4101 goto xdr_error; 4100 4102 fattr->valid |= status; 4101 4103 4102 - status = decode_attr_mounted_on_fileid(xdr, bitmap, &fileid); 4104 + status = decode_attr_mounted_on_fileid(xdr, bitmap, &fattr->mounted_on_fileid); 4103 4105 if (status < 0) 4104 4106 goto xdr_error; 4105 - if (status != 0 && !(fattr->valid & status)) { 4106 - fattr->fileid = fileid; 4107 - fattr->valid |= status; 4108 - } 4107 + fattr->valid |= status; 4109 4108 4110 4109 xdr_error: 4111 4110 dprintk("%s: xdr returned %d\n", __func__, -status); ··· 4833 4838 struct nfs4_secinfo_flavor *sec_flavor; 4834 4839 int status; 4835 4840 __be32 *p; 4836 - int i; 4841 + int i, num_flavors; 4837 4842 4838 4843 status = decode_op_hdr(xdr, OP_SECINFO); 4844 + if (status) 4845 + goto out; 4839 4846 p = xdr_inline_decode(xdr, 4); 4840 4847 if (unlikely(!p)) 4841 4848 goto out_overflow; 4842 - res->flavors->num_flavors = be32_to_cpup(p); 4843 4849 4844 - for (i = 0; i < res->flavors->num_flavors; i++) { 4850 + res->flavors->num_flavors = 0; 4851 + num_flavors = be32_to_cpup(p); 4852 + 4853 + for (i = 0; i < num_flavors; i++) { 4845 4854 sec_flavor = &res->flavors->flavors[i]; 4846 - if ((char *)&sec_flavor[1] - (char *)res > PAGE_SIZE) 4855 + if ((char *)&sec_flavor[1] - (char *)res->flavors > PAGE_SIZE) 4847 4856 break; 4848 4857 4849 4858 p = xdr_inline_decode(xdr, 4); ··· 4856 4857 sec_flavor->flavor = be32_to_cpup(p); 4857 4858 4858 4859 if (sec_flavor->flavor == RPC_AUTH_GSS) { 4859 - if (decode_secinfo_gss(xdr, sec_flavor)) 4860 - break; 4860 + status = decode_secinfo_gss(xdr, sec_flavor); 4861 + if (status) 4862 + goto out; 4861 4863 } 4864 + res->flavors->num_flavors++; 4862 4865 } 4863 4866 4864 - return 0; 4865 - 4867 + out: 4868 + return status; 4866 4869 out_overflow: 4867 4870 print_overflow_msg(__func__, xdr); 4868 4871 return -EIO; ··· 6409 6408 if (decode_getfattr_attrs(xdr, bitmap, entry->fattr, entry->fh, 6410 6409 entry->server, 1) < 0) 6411 6410 goto out_overflow; 6412 - if (entry->fattr->valid & NFS_ATTR_FATTR_FILEID) 6411 + if (entry->fattr->valid & NFS_ATTR_FATTR_MOUNTED_ON_FILEID) 6412 + entry->ino = entry->fattr->mounted_on_fileid; 6413 + else if (entry->fattr->valid & NFS_ATTR_FATTR_FILEID) 6413 6414 entry->ino = entry->fattr->fileid; 6414 6415 6415 6416 entry->d_type = DT_UNKNOWN;
+7 -1
fs/nfs/pnfs.c
··· 1004 1004 { 1005 1005 struct nfs_inode *nfsi = NFS_I(wdata->inode); 1006 1006 loff_t end_pos = wdata->args.offset + wdata->res.count; 1007 + bool mark_as_dirty = false; 1007 1008 1008 1009 spin_lock(&nfsi->vfs_inode.i_lock); 1009 1010 if (!test_and_set_bit(NFS_INO_LAYOUTCOMMIT, &nfsi->flags)) { ··· 1012 1011 get_lseg(wdata->lseg); 1013 1012 wdata->lseg->pls_lc_cred = 1014 1013 get_rpccred(wdata->args.context->state->owner->so_cred); 1015 - mark_inode_dirty_sync(wdata->inode); 1014 + mark_as_dirty = true; 1016 1015 dprintk("%s: Set layoutcommit for inode %lu ", 1017 1016 __func__, wdata->inode->i_ino); 1018 1017 } 1019 1018 if (end_pos > wdata->lseg->pls_end_pos) 1020 1019 wdata->lseg->pls_end_pos = end_pos; 1021 1020 spin_unlock(&nfsi->vfs_inode.i_lock); 1021 + 1022 + /* if pnfs_layoutcommit_inode() runs between inode locks, the next one 1023 + * will be a noop because NFS_INO_LAYOUTCOMMIT will not be set */ 1024 + if (mark_as_dirty) 1025 + mark_inode_dirty_sync(wdata->inode); 1022 1026 } 1023 1027 EXPORT_SYMBOL_GPL(pnfs_set_layoutcommit); 1024 1028
+11 -2
fs/nfs/super.c
··· 1004 1004 return 0; 1005 1005 } 1006 1006 1007 + mnt->flags |= NFS_MOUNT_SECFLAVOUR; 1007 1008 mnt->auth_flavor_len = 1; 1008 1009 return 1; 1009 1010 } ··· 1977 1976 if (error < 0) 1978 1977 goto out; 1979 1978 1979 + /* 1980 + * noac is a special case. It implies -o sync, but that's not 1981 + * necessarily reflected in the mtab options. do_remount_sb 1982 + * will clear MS_SYNCHRONOUS if -o sync wasn't specified in the 1983 + * remount options, so we have to explicitly reset it. 1984 + */ 1985 + if (data->flags & NFS_MOUNT_NOAC) 1986 + *flags |= MS_SYNCHRONOUS; 1987 + 1980 1988 /* compare new mount options with old ones */ 1981 1989 error = nfs_compare_remount_data(nfss, data); 1982 1990 out: ··· 2245 2235 if (!s->s_root) { 2246 2236 /* initial superblock/root creation */ 2247 2237 nfs_fill_super(s, data); 2248 - nfs_fscache_get_super_cookie( 2249 - s, data ? data->fscache_uniq : NULL, NULL); 2238 + nfs_fscache_get_super_cookie(s, data->fscache_uniq, NULL); 2250 2239 } 2251 2240 2252 2241 mntroot = nfs_get_root(s, mntfh, dev_name);
+1 -3
fs/nfs/write.c
··· 680 680 req = nfs_setup_write_request(ctx, page, offset, count); 681 681 if (IS_ERR(req)) 682 682 return PTR_ERR(req); 683 - nfs_mark_request_dirty(req); 684 683 /* Update file length */ 685 684 nfs_grow_file(page, offset, count); 686 685 nfs_mark_uptodate(page, req->wb_pgbase, req->wb_bytes); ··· 1417 1418 task->tk_pid, task->tk_status); 1418 1419 1419 1420 /* Call the NFS version-specific code */ 1420 - if (NFS_PROTO(data->inode)->commit_done(task, data) != 0) 1421 - return; 1421 + NFS_PROTO(data->inode)->commit_done(task, data); 1422 1422 } 1423 1423 1424 1424 void nfs_commit_release_pages(struct nfs_write_data *data)
+1 -1
fs/ocfs2/ocfs2_fs.h
··· 1019 1019 __le16 xe_name_offset; /* byte offset from the 1st entry in the 1020 1020 local xattr storage(inode, xattr block or 1021 1021 xattr bucket). */ 1022 - __u8 xe_name_len; /* xattr name len, does't include prefix. */ 1022 + __u8 xe_name_len; /* xattr name len, doesn't include prefix. */ 1023 1023 __u8 xe_type; /* the low 7 bits indicate the name prefix 1024 1024 * type and the highest bit indicates whether 1025 1025 * the EA is stored in the local storage. */
+6
fs/partitions/efi.c
··· 348 348 goto fail; 349 349 } 350 350 351 + /* Check that sizeof_partition_entry has the correct value */ 352 + if (le32_to_cpu((*gpt)->sizeof_partition_entry) != sizeof(gpt_entry)) { 353 + pr_debug("GUID Partitition Entry Size check failed.\n"); 354 + goto fail; 355 + } 356 + 351 357 if (!(*ptes = alloc_read_gpt_entries(state, *gpt))) 352 358 goto fail; 353 359
+7 -5
fs/proc/task_mmu.c
··· 214 214 int flags = vma->vm_flags; 215 215 unsigned long ino = 0; 216 216 unsigned long long pgoff = 0; 217 - unsigned long start; 217 + unsigned long start, end; 218 218 dev_t dev = 0; 219 219 int len; 220 220 ··· 227 227 228 228 /* We don't show the stack guard page in /proc/maps */ 229 229 start = vma->vm_start; 230 - if (vma->vm_flags & VM_GROWSDOWN) 231 - if (!vma_stack_continue(vma->vm_prev, vma->vm_start)) 232 - start += PAGE_SIZE; 230 + if (stack_guard_page_start(vma, start)) 231 + start += PAGE_SIZE; 232 + end = vma->vm_end; 233 + if (stack_guard_page_end(vma, end)) 234 + end -= PAGE_SIZE; 233 235 234 236 seq_printf(m, "%08lx-%08lx %c%c%c%c %08llx %02x:%02x %lu %n", 235 237 start, 236 - vma->vm_end, 238 + end, 237 239 flags & VM_READ ? 'r' : '-', 238 240 flags & VM_WRITE ? 'w' : '-', 239 241 flags & VM_EXEC ? 'x' : '-',
-20
fs/ubifs/log.c
··· 175 175 } 176 176 177 177 /** 178 - * ubifs_create_buds_lists - create journal head buds lists for remount rw. 179 - * @c: UBIFS file-system description object 180 - */ 181 - void ubifs_create_buds_lists(struct ubifs_info *c) 182 - { 183 - struct rb_node *p; 184 - 185 - spin_lock(&c->buds_lock); 186 - p = rb_first(&c->buds); 187 - while (p) { 188 - struct ubifs_bud *bud = rb_entry(p, struct ubifs_bud, rb); 189 - struct ubifs_jhead *jhead = &c->jheads[bud->jhead]; 190 - 191 - list_add_tail(&bud->list, &jhead->buds_list); 192 - p = rb_next(p); 193 - } 194 - spin_unlock(&c->buds_lock); 195 - } 196 - 197 - /** 198 178 * ubifs_add_bud_to_log - add a new bud to the log. 199 179 * @c: UBIFS file-system description object 200 180 * @jhead: journal head the bud belongs to
+12 -6
fs/ubifs/replay.c
··· 59 59 * @new_size: truncation new size 60 60 * @free: amount of free space in a bud 61 61 * @dirty: amount of dirty space in a bud from padding and deletion nodes 62 + * @jhead: journal head number of the bud 62 63 * 63 64 * UBIFS journal replay must compare node sequence numbers, which means it must 64 65 * build a tree of node information to insert into the TNC. ··· 81 80 struct { 82 81 int free; 83 82 int dirty; 83 + int jhead; 84 84 }; 85 85 }; 86 86 }; ··· 161 159 err = PTR_ERR(lp); 162 160 goto out; 163 161 } 162 + 163 + /* Make sure the journal head points to the latest bud */ 164 + err = ubifs_wbuf_seek_nolock(&c->jheads[r->jhead].wbuf, r->lnum, 165 + c->leb_size - r->free, UBI_SHORTTERM); 166 + 164 167 out: 165 168 ubifs_release_lprops(c); 166 169 return err; ··· 634 627 ubifs_assert(sleb->endpt - offs >= used); 635 628 ubifs_assert(sleb->endpt % c->min_io_size == 0); 636 629 637 - if (sleb->endpt + c->min_io_size <= c->leb_size && !c->ro_mount) 638 - err = ubifs_wbuf_seek_nolock(&c->jheads[jhead].wbuf, lnum, 639 - sleb->endpt, UBI_SHORTTERM); 640 - 641 630 *dirty = sleb->endpt - offs - used; 642 631 *free = c->leb_size - sleb->endpt; 643 632 ··· 656 653 * @sqnum: sequence number 657 654 * @free: amount of free space in bud 658 655 * @dirty: amount of dirty space from padding and deletion nodes 656 + * @jhead: journal head number for the bud 659 657 * 660 658 * This function inserts a reference node to the replay tree and returns zero 661 659 * in case of success or a negative error code in case of failure. 662 660 */ 663 661 static int insert_ref_node(struct ubifs_info *c, int lnum, int offs, 664 - unsigned long long sqnum, int free, int dirty) 662 + unsigned long long sqnum, int free, int dirty, 663 + int jhead) 665 664 { 666 665 struct rb_node **p = &c->replay_tree.rb_node, *parent = NULL; 667 666 struct replay_entry *r; ··· 693 688 r->flags = REPLAY_REF; 694 689 r->free = free; 695 690 r->dirty = dirty; 691 + r->jhead = jhead; 696 692 697 693 rb_link_node(&r->rb, parent, p); 698 694 rb_insert_color(&r->rb, &c->replay_tree); ··· 718 712 if (err) 719 713 return err; 720 714 err = insert_ref_node(c, b->bud->lnum, b->bud->start, b->sqnum, 721 - free, dirty); 715 + free, dirty, b->bud->jhead); 722 716 if (err) 723 717 return err; 724 718 }
+4 -11
fs/ubifs/super.c
··· 1257 1257 goto out_free; 1258 1258 } 1259 1259 1260 + err = alloc_wbufs(c); 1261 + if (err) 1262 + goto out_cbuf; 1263 + 1260 1264 sprintf(c->bgt_name, BGT_NAME_PATTERN, c->vi.ubi_num, c->vi.vol_id); 1261 1265 if (!c->ro_mount) { 1262 - err = alloc_wbufs(c); 1263 - if (err) 1264 - goto out_cbuf; 1265 - 1266 1266 /* Create background thread */ 1267 1267 c->bgt = kthread_create(ubifs_bg_thread, c, "%s", c->bgt_name); 1268 1268 if (IS_ERR(c->bgt)) { ··· 1631 1631 if (err) 1632 1632 goto out; 1633 1633 1634 - err = alloc_wbufs(c); 1635 - if (err) 1636 - goto out; 1637 - 1638 - ubifs_create_buds_lists(c); 1639 - 1640 1634 /* Create background thread */ 1641 1635 c->bgt = kthread_create(ubifs_bg_thread, c, "%s", c->bgt_name); 1642 1636 if (IS_ERR(c->bgt)) { ··· 1738 1744 if (err) 1739 1745 ubifs_ro_mode(c, err); 1740 1746 1741 - free_wbufs(c); 1742 1747 vfree(c->orph_buf); 1743 1748 c->orph_buf = NULL; 1744 1749 kfree(c->write_reserve_buf);
+1
include/drm/drm_fb_helper.h
··· 118 118 unsigned transp, 119 119 struct fb_info *info); 120 120 121 + bool drm_fb_helper_restore_fbdev_mode(struct drm_fb_helper *fb_helper); 121 122 void drm_fb_helper_restore(void); 122 123 void drm_fb_helper_fill_var(struct fb_info *info, struct drm_fb_helper *fb_helper, 123 124 uint32_t fb_width, uint32_t fb_height);
+1 -1
include/drm/drm_mm.h
··· 86 86 } 87 87 #define drm_mm_for_each_node(entry, mm) list_for_each_entry(entry, \ 88 88 &(mm)->head_node.node_list, \ 89 - node_list); 89 + node_list) 90 90 #define drm_mm_for_each_scanned_node_reverse(entry, n, mm) \ 91 91 for (entry = (mm)->prev_scanned_node, \ 92 92 next = entry ? list_entry(entry->node_list.next, \
+5
include/drm/drm_pciids.h
··· 155 155 {0x1002, 0x6719, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CAYMAN|RADEON_NEW_MEMMAP}, \ 156 156 {0x1002, 0x671c, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CAYMAN|RADEON_NEW_MEMMAP}, \ 157 157 {0x1002, 0x671d, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CAYMAN|RADEON_NEW_MEMMAP}, \ 158 + {0x1002, 0x671f, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CAYMAN|RADEON_NEW_MEMMAP}, \ 158 159 {0x1002, 0x6720, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_BARTS|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ 159 160 {0x1002, 0x6721, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_BARTS|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ 160 161 {0x1002, 0x6722, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_BARTS|RADEON_NEW_MEMMAP}, \ ··· 168 167 {0x1002, 0x6729, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_BARTS|RADEON_NEW_MEMMAP}, \ 169 168 {0x1002, 0x6738, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_BARTS|RADEON_NEW_MEMMAP}, \ 170 169 {0x1002, 0x6739, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_BARTS|RADEON_NEW_MEMMAP}, \ 170 + {0x1002, 0x673e, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_BARTS|RADEON_NEW_MEMMAP}, \ 171 171 {0x1002, 0x6740, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TURKS|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ 172 172 {0x1002, 0x6741, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TURKS|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ 173 173 {0x1002, 0x6742, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TURKS|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ ··· 201 199 {0x1002, 0x688D, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CYPRESS|RADEON_NEW_MEMMAP}, \ 202 200 {0x1002, 0x6898, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CYPRESS|RADEON_NEW_MEMMAP}, \ 203 201 {0x1002, 0x6899, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CYPRESS|RADEON_NEW_MEMMAP}, \ 202 + {0x1002, 0x689b, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CYPRESS|RADEON_NEW_MEMMAP}, \ 204 203 {0x1002, 0x689c, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_HEMLOCK|RADEON_NEW_MEMMAP}, \ 205 204 {0x1002, 0x689d, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_HEMLOCK|RADEON_NEW_MEMMAP}, \ 206 205 {0x1002, 0x689e, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CYPRESS|RADEON_NEW_MEMMAP}, \ ··· 212 209 {0x1002, 0x68b0, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_JUNIPER|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ 213 210 {0x1002, 0x68b8, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_JUNIPER|RADEON_NEW_MEMMAP}, \ 214 211 {0x1002, 0x68b9, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_JUNIPER|RADEON_NEW_MEMMAP}, \ 212 + {0x1002, 0x68ba, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_JUNIPER|RADEON_NEW_MEMMAP}, \ 215 213 {0x1002, 0x68be, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_JUNIPER|RADEON_NEW_MEMMAP}, \ 214 + {0x1002, 0x68bf, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_JUNIPER|RADEON_NEW_MEMMAP}, \ 216 215 {0x1002, 0x68c0, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_REDWOOD|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ 217 216 {0x1002, 0x68c1, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_REDWOOD|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ 218 217 {0x1002, 0x68c7, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_REDWOOD|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \
+2
include/drm/radeon_drm.h
··· 909 909 #define RADEON_INFO_WANT_CMASK 0x08 /* get access to CMASK on r300 */ 910 910 #define RADEON_INFO_CLOCK_CRYSTAL_FREQ 0x09 /* clock crystal frequency */ 911 911 #define RADEON_INFO_NUM_BACKENDS 0x0a /* DB/backends for r600+ - need for OQ */ 912 + #define RADEON_INFO_NUM_TILE_PIPES 0x0b /* tile pipes for r600+ */ 913 + #define RADEON_INFO_FUSION_GART_WORKING 0x0c /* fusion writes to GTT were broken before this */ 912 914 913 915 struct drm_radeon_info { 914 916 uint32_t request;
+1 -1
include/linux/flex_array.h
··· 61 61 struct flex_array *flex_array_alloc(int element_size, unsigned int total, 62 62 gfp_t flags); 63 63 int flex_array_prealloc(struct flex_array *fa, unsigned int start, 64 - unsigned int end, gfp_t flags); 64 + unsigned int nr_elements, gfp_t flags); 65 65 void flex_array_free(struct flex_array *fa); 66 66 void flex_array_free_parts(struct flex_array *fa); 67 67 int flex_array_put(struct flex_array *fa, unsigned int element_nr, void *src,
+1
include/linux/ftrace_event.h
··· 37 37 unsigned char flags; 38 38 unsigned char preempt_count; 39 39 int pid; 40 + int padding; 40 41 }; 41 42 42 43 #define FTRACE_MAX_EVENT \
+1 -1
include/linux/huge_mm.h
··· 117 117 unsigned long end, 118 118 long adjust_next) 119 119 { 120 - if (!vma->anon_vma || vma->vm_ops || vma->vm_file) 120 + if (!vma->anon_vma || vma->vm_ops) 121 121 return; 122 122 __vma_adjust_trans_huge(vma, start, end, adjust_next); 123 123 }
+2
include/linux/mfd/wm831x/pdata.h
··· 81 81 int rpu; /** Pen down sensitivity resistor divider */ 82 82 int pressure; /** Report pressure (boolean) */ 83 83 unsigned int data_irq; /** Touch data ready IRQ */ 84 + int data_irqf; /** IRQ flags for data ready IRQ */ 84 85 unsigned int pd_irq; /** Touch pendown detect IRQ */ 86 + int pd_irqf; /** IRQ flags for pen down IRQ */ 85 87 }; 86 88 87 89 enum wm831x_watchdog_action {
+25 -2
include/linux/mm.h
··· 137 137 #define VM_RandomReadHint(v) ((v)->vm_flags & VM_RAND_READ) 138 138 139 139 /* 140 - * special vmas that are non-mergable, non-mlock()able 140 + * Special vmas that are non-mergable, non-mlock()able. 141 + * Note: mm/huge_memory.c VM_NO_THP depends on this definition. 141 142 */ 142 143 #define VM_SPECIAL (VM_IO | VM_DONTEXPAND | VM_RESERVED | VM_PFNMAP) 143 144 ··· 1011 1010 int clear_page_dirty_for_io(struct page *page); 1012 1011 1013 1012 /* Is the vma a continuation of the stack vma above it? */ 1014 - static inline int vma_stack_continue(struct vm_area_struct *vma, unsigned long addr) 1013 + static inline int vma_growsdown(struct vm_area_struct *vma, unsigned long addr) 1015 1014 { 1016 1015 return vma && (vma->vm_end == addr) && (vma->vm_flags & VM_GROWSDOWN); 1016 + } 1017 + 1018 + static inline int stack_guard_page_start(struct vm_area_struct *vma, 1019 + unsigned long addr) 1020 + { 1021 + return (vma->vm_flags & VM_GROWSDOWN) && 1022 + (vma->vm_start == addr) && 1023 + !vma_growsdown(vma->vm_prev, addr); 1024 + } 1025 + 1026 + /* Is the vma a continuation of the stack vma below it? */ 1027 + static inline int vma_growsup(struct vm_area_struct *vma, unsigned long addr) 1028 + { 1029 + return vma && (vma->vm_start == addr) && (vma->vm_flags & VM_GROWSUP); 1030 + } 1031 + 1032 + static inline int stack_guard_page_end(struct vm_area_struct *vma, 1033 + unsigned long addr) 1034 + { 1035 + return (vma->vm_flags & VM_GROWSUP) && 1036 + (vma->vm_end == addr) && 1037 + !vma_growsup(vma->vm_next, addr); 1017 1038 } 1018 1039 1019 1040 extern unsigned long move_page_tables(struct vm_area_struct *vma,
-1
include/linux/mmc/host.h
··· 183 183 struct work_struct clk_gate_work; /* delayed clock gate */ 184 184 unsigned int clk_old; /* old clock value cache */ 185 185 spinlock_t clk_lock; /* lock for clk fields */ 186 - struct mutex clk_gate_mutex; /* mutex for clock gating */ 187 186 #endif 188 187 189 188 /* host specific block data */
+1
include/linux/nfs_fs_sb.h
··· 47 47 48 48 #ifdef CONFIG_NFS_V4 49 49 u64 cl_clientid; /* constant */ 50 + nfs4_verifier cl_confirm; /* Clientid verifier */ 50 51 unsigned long cl_state; 51 52 52 53 spinlock_t cl_lock;
+2
include/linux/nfs_xdr.h
··· 50 50 } du; 51 51 struct nfs_fsid fsid; 52 52 __u64 fileid; 53 + __u64 mounted_on_fileid; 53 54 struct timespec atime; 54 55 struct timespec mtime; 55 56 struct timespec ctime; ··· 84 83 #define NFS_ATTR_FATTR_PRECHANGE (1U << 18) 85 84 #define NFS_ATTR_FATTR_V4_REFERRAL (1U << 19) /* NFSv4 referral */ 86 85 #define NFS_ATTR_FATTR_MOUNTPOINT (1U << 20) /* Treat as mountpoint */ 86 + #define NFS_ATTR_FATTR_MOUNTED_ON_FILEID (1U << 21) 87 87 88 88 #define NFS_ATTR_FATTR (NFS_ATTR_FATTR_TYPE \ 89 89 | NFS_ATTR_FATTR_MODE \
-4
include/linux/pci_ids.h
··· 2477 2477 #define PCI_DEVICE_ID_INTEL_82840_HB 0x1a21 2478 2478 #define PCI_DEVICE_ID_INTEL_82845_HB 0x1a30 2479 2479 #define PCI_DEVICE_ID_INTEL_IOAT 0x1a38 2480 - #define PCI_DEVICE_ID_INTEL_COUGARPOINT_SMBUS 0x1c22 2481 2480 #define PCI_DEVICE_ID_INTEL_COUGARPOINT_LPC_MIN 0x1c41 2482 2481 #define PCI_DEVICE_ID_INTEL_COUGARPOINT_LPC_MAX 0x1c5f 2483 - #define PCI_DEVICE_ID_INTEL_PATSBURG_SMBUS 0x1d22 2484 2482 #define PCI_DEVICE_ID_INTEL_PATSBURG_LPC_0 0x1d40 2485 2483 #define PCI_DEVICE_ID_INTEL_PATSBURG_LPC_1 0x1d41 2486 2484 #define PCI_DEVICE_ID_INTEL_DH89XXCC_LPC_MIN 0x2310 2487 2485 #define PCI_DEVICE_ID_INTEL_DH89XXCC_LPC_MAX 0x231f 2488 - #define PCI_DEVICE_ID_INTEL_DH89XXCC_SMBUS 0x2330 2489 2486 #define PCI_DEVICE_ID_INTEL_82801AA_0 0x2410 2490 2487 #define PCI_DEVICE_ID_INTEL_82801AA_1 0x2411 2491 2488 #define PCI_DEVICE_ID_INTEL_82801AA_3 0x2413 ··· 2693 2696 #define PCI_DEVICE_ID_INTEL_ICH10_5 0x3a60 2694 2697 #define PCI_DEVICE_ID_INTEL_5_3400_SERIES_LPC_MIN 0x3b00 2695 2698 #define PCI_DEVICE_ID_INTEL_5_3400_SERIES_LPC_MAX 0x3b1f 2696 - #define PCI_DEVICE_ID_INTEL_5_3400_SERIES_SMBUS 0x3b30 2697 2699 #define PCI_DEVICE_ID_INTEL_IOAT_SNB 0x402f 2698 2700 #define PCI_DEVICE_ID_INTEL_5100_16 0x65f0 2699 2701 #define PCI_DEVICE_ID_INTEL_5100_21 0x65f5
+1 -1
include/linux/percpu.h
··· 948 948 irqsafe_generic_cpu_cmpxchg_double(pcp1, pcp2, oval1, oval2, nval1, nval2) 949 949 # endif 950 950 # define irqsafe_cpu_cmpxchg_double(pcp1, pcp2, oval1, oval2, nval1, nval2) \ 951 - __pcpu_double_call_return_int(irqsafe_cpu_cmpxchg_double_, (pcp1), (pcp2), (oval1), (oval2), (nval1), (nval2)) 951 + __pcpu_double_call_return_bool(irqsafe_cpu_cmpxchg_double_, (pcp1), (pcp2), (oval1), (oval2), (nval1), (nval2)) 952 952 #endif 953 953 954 954 #endif /* __LINUX_PERCPU_H */
+12 -1
include/linux/ptrace.h
··· 189 189 child->ptrace = current->ptrace; 190 190 __ptrace_link(child, current->parent); 191 191 } 192 + 193 + #ifdef CONFIG_HAVE_HW_BREAKPOINT 194 + atomic_set(&child->ptrace_bp_refcnt, 1); 195 + #endif 192 196 } 193 197 194 198 /** ··· 354 350 unsigned long args[6], unsigned int maxargs, 355 351 unsigned long *sp, unsigned long *pc); 356 352 357 - #endif 353 + #ifdef CONFIG_HAVE_HW_BREAKPOINT 354 + extern int ptrace_get_breakpoints(struct task_struct *tsk); 355 + extern void ptrace_put_breakpoints(struct task_struct *tsk); 356 + #else 357 + static inline void ptrace_put_breakpoints(struct task_struct *tsk) { } 358 + #endif /* CONFIG_HAVE_HW_BREAKPOINT */ 359 + 360 + #endif /* __KERNEL */ 358 361 359 362 #endif
+3
include/linux/sched.h
··· 1537 1537 unsigned long memsw_nr_pages; /* uncharged mem+swap usage */ 1538 1538 } memcg_batch; 1539 1539 #endif 1540 + #ifdef CONFIG_HAVE_HW_BREAKPOINT 1541 + atomic_t ptrace_bp_refcnt; 1542 + #endif 1540 1543 }; 1541 1544 1542 1545 /* Future-safe accessor for struct task_struct's cpus_allowed. */
+4 -1
include/linux/sunrpc/sched.h
··· 127 127 #define RPC_TASK_KILLED 0x0100 /* task was killed */ 128 128 #define RPC_TASK_SOFT 0x0200 /* Use soft timeouts */ 129 129 #define RPC_TASK_SOFTCONN 0x0400 /* Fail if can't connect */ 130 + #define RPC_TASK_SENT 0x0800 /* message was sent */ 131 + #define RPC_TASK_TIMEOUT 0x1000 /* fail with ETIMEDOUT on timeout */ 130 132 131 133 #define RPC_IS_ASYNC(t) ((t)->tk_flags & RPC_TASK_ASYNC) 132 134 #define RPC_IS_SWAPPER(t) ((t)->tk_flags & RPC_TASK_SWAPPER) 133 135 #define RPC_DO_ROOTOVERRIDE(t) ((t)->tk_flags & RPC_TASK_ROOTCREDS) 134 136 #define RPC_ASSASSINATED(t) ((t)->tk_flags & RPC_TASK_KILLED) 135 - #define RPC_IS_SOFT(t) ((t)->tk_flags & RPC_TASK_SOFT) 137 + #define RPC_IS_SOFT(t) ((t)->tk_flags & (RPC_TASK_SOFT|RPC_TASK_TIMEOUT)) 136 138 #define RPC_IS_SOFTCONN(t) ((t)->tk_flags & RPC_TASK_SOFTCONN) 139 + #define RPC_WAS_SENT(t) ((t)->tk_flags & RPC_TASK_SENT) 137 140 138 141 #define RPC_TASK_RUNNING 0 139 142 #define RPC_TASK_QUEUED 1
+1
include/linux/usb/usbnet.h
··· 68 68 # define EVENT_RX_PAUSED 5 69 69 # define EVENT_DEV_WAKING 6 70 70 # define EVENT_DEV_ASLEEP 7 71 + # define EVENT_DEV_OPEN 8 71 72 }; 72 73 73 74 static inline struct usb_driver *driver_of(struct usb_interface *intf)
+5 -2
include/linux/v4l2-mediabus.h
··· 47 47 V4L2_MBUS_FMT_RGB565_2X8_BE = 0x1007, 48 48 V4L2_MBUS_FMT_RGB565_2X8_LE = 0x1008, 49 49 50 - /* YUV (including grey) - next is 0x2013 */ 50 + /* YUV (including grey) - next is 0x2014 */ 51 51 V4L2_MBUS_FMT_Y8_1X8 = 0x2001, 52 52 V4L2_MBUS_FMT_UYVY8_1_5X8 = 0x2002, 53 53 V4L2_MBUS_FMT_VYUY8_1_5X8 = 0x2003, ··· 60 60 V4L2_MBUS_FMT_Y10_1X10 = 0x200a, 61 61 V4L2_MBUS_FMT_YUYV10_2X10 = 0x200b, 62 62 V4L2_MBUS_FMT_YVYU10_2X10 = 0x200c, 63 + V4L2_MBUS_FMT_Y12_1X12 = 0x2013, 63 64 V4L2_MBUS_FMT_UYVY8_1X16 = 0x200f, 64 65 V4L2_MBUS_FMT_VYUY8_1X16 = 0x2010, 65 66 V4L2_MBUS_FMT_YUYV8_1X16 = 0x2011, ··· 68 67 V4L2_MBUS_FMT_YUYV10_1X20 = 0x200d, 69 68 V4L2_MBUS_FMT_YVYU10_1X20 = 0x200e, 70 69 71 - /* Bayer - next is 0x3013 */ 70 + /* Bayer - next is 0x3015 */ 72 71 V4L2_MBUS_FMT_SBGGR8_1X8 = 0x3001, 72 + V4L2_MBUS_FMT_SGBRG8_1X8 = 0x3013, 73 73 V4L2_MBUS_FMT_SGRBG8_1X8 = 0x3002, 74 + V4L2_MBUS_FMT_SRGGB8_1X8 = 0x3014, 74 75 V4L2_MBUS_FMT_SBGGR10_DPCM8_1X8 = 0x300b, 75 76 V4L2_MBUS_FMT_SGBRG10_DPCM8_1X8 = 0x300c, 76 77 V4L2_MBUS_FMT_SGRBG10_DPCM8_1X8 = 0x3009,
+1
include/linux/videodev2.h
··· 308 308 #define V4L2_PIX_FMT_Y4 v4l2_fourcc('Y', '0', '4', ' ') /* 4 Greyscale */ 309 309 #define V4L2_PIX_FMT_Y6 v4l2_fourcc('Y', '0', '6', ' ') /* 6 Greyscale */ 310 310 #define V4L2_PIX_FMT_Y10 v4l2_fourcc('Y', '1', '0', ' ') /* 10 Greyscale */ 311 + #define V4L2_PIX_FMT_Y12 v4l2_fourcc('Y', '1', '2', ' ') /* 12 Greyscale */ 311 312 #define V4L2_PIX_FMT_Y16 v4l2_fourcc('Y', '1', '6', ' ') /* 16 Greyscale */ 312 313 313 314 /* Palette formats */
+1 -1
include/media/v4l2-device.h
··· 163 163 ({ \ 164 164 struct v4l2_subdev *__sd; \ 165 165 __v4l2_device_call_subdevs_until_err_p(v4l2_dev, __sd, cond, o, \ 166 - f, args...); \ 166 + f , ##args); \ 167 167 }) 168 168 169 169 /* Call the specified callback for all subdevs matching grp_id (if 0, then
+9 -8
init/Kconfig
··· 924 924 environments which can tolerate a "non-standard" kernel. 925 925 Only use this if you really know what you are doing. 926 926 927 - config EMBEDDED 928 - bool "Embedded system" 929 - select EXPERT 930 - help 931 - This option should be enabled if compiling the kernel for 932 - an embedded system so certain expert options are available 933 - for configuration. 934 - 935 927 config UID16 936 928 bool "Enable 16-bit UID system calls" if EXPERT 937 929 depends on ARM || BLACKFIN || CRIS || FRV || H8300 || X86_32 || M68K || (S390 && !64BIT) || SUPERH || SPARC32 || (SPARC64 && COMPAT) || UML || (X86_64 && IA32_EMULATION) ··· 1096 1104 by some high performance threaded applications. Disabling 1097 1105 this option saves about 7k. 1098 1106 1107 + config EMBEDDED 1108 + bool "Embedded system" 1109 + select EXPERT 1110 + help 1111 + This option should be enabled if compiling the kernel for 1112 + an embedded system so certain expert options are available 1113 + for configuration. 1114 + 1099 1115 config HAVE_PERF_EVENTS 1100 1116 bool 1101 1117 help ··· 1226 1226 per cpu and per node queues. 1227 1227 1228 1228 config SLUB 1229 + depends on BROKEN || NUMA || !DISCONTIGMEM 1229 1230 bool "SLUB (Unqueued Allocator)" 1230 1231 help 1231 1232 SLUB is a slab allocator that minimizes cache line usage
+1 -1
kernel/exit.c
··· 1016 1016 /* 1017 1017 * FIXME: do that only when needed, using sched_exit tracepoint 1018 1018 */ 1019 - flush_ptrace_hw_breakpoint(tsk); 1019 + ptrace_put_breakpoints(tsk); 1020 1020 1021 1021 exit_notify(tsk, group_dead); 1022 1022 #ifdef CONFIG_NUMA
+5 -5
kernel/hrtimer.c
··· 81 81 } 82 82 }; 83 83 84 - static int hrtimer_clock_to_base_table[MAX_CLOCKS]; 84 + static int hrtimer_clock_to_base_table[MAX_CLOCKS] = { 85 + [CLOCK_REALTIME] = HRTIMER_BASE_REALTIME, 86 + [CLOCK_MONOTONIC] = HRTIMER_BASE_MONOTONIC, 87 + [CLOCK_BOOTTIME] = HRTIMER_BASE_BOOTTIME, 88 + }; 85 89 86 90 static inline int hrtimer_clockid_to_base(clockid_t clock_id) 87 91 { ··· 1726 1722 1727 1723 void __init hrtimers_init(void) 1728 1724 { 1729 - hrtimer_clock_to_base_table[CLOCK_REALTIME] = HRTIMER_BASE_REALTIME; 1730 - hrtimer_clock_to_base_table[CLOCK_MONOTONIC] = HRTIMER_BASE_MONOTONIC; 1731 - hrtimer_clock_to_base_table[CLOCK_BOOTTIME] = HRTIMER_BASE_BOOTTIME; 1732 - 1733 1725 hrtimer_cpu_notify(&hrtimers_nb, (unsigned long)CPU_UP_PREPARE, 1734 1726 (void *)(long)smp_processor_id()); 1735 1727 register_cpu_notifier(&hrtimers_nb);
+1 -1
kernel/irq/proc.c
··· 419 419 } else { 420 420 seq_printf(p, " %8s", "None"); 421 421 } 422 - #ifdef CONFIG_GENIRC_IRQ_SHOW_LEVEL 422 + #ifdef CONFIG_GENERIC_IRQ_SHOW_LEVEL 423 423 seq_printf(p, " %-8s", irqd_is_level_type(&desc->irq_data) ? "Level" : "Edge"); 424 424 #endif 425 425 if (desc->name)
+17
kernel/ptrace.c
··· 22 22 #include <linux/syscalls.h> 23 23 #include <linux/uaccess.h> 24 24 #include <linux/regset.h> 25 + #include <linux/hw_breakpoint.h> 25 26 26 27 27 28 /* ··· 880 879 return ret; 881 880 } 882 881 #endif /* CONFIG_COMPAT */ 882 + 883 + #ifdef CONFIG_HAVE_HW_BREAKPOINT 884 + int ptrace_get_breakpoints(struct task_struct *tsk) 885 + { 886 + if (atomic_inc_not_zero(&tsk->ptrace_bp_refcnt)) 887 + return 0; 888 + 889 + return -1; 890 + } 891 + 892 + void ptrace_put_breakpoints(struct task_struct *tsk) 893 + { 894 + if (atomic_dec_and_test(&tsk->ptrace_bp_refcnt)) 895 + flush_ptrace_hw_breakpoint(tsk); 896 + } 897 + #endif /* CONFIG_HAVE_HW_BREAKPOINT */
+1
kernel/trace/trace.c
··· 1110 1110 1111 1111 entry->preempt_count = pc & 0xff; 1112 1112 entry->pid = (tsk) ? tsk->pid : 0; 1113 + entry->padding = 0; 1113 1114 entry->flags = 1114 1115 #ifdef CONFIG_TRACE_IRQFLAGS_SUPPORT 1115 1116 (irqs_disabled_flags(flags) ? TRACE_FLAG_IRQS_OFF : 0) |
+1
kernel/trace/trace_events.c
··· 116 116 __common_field(unsigned char, flags); 117 117 __common_field(unsigned char, preempt_count); 118 118 __common_field(int, pid); 119 + __common_field(int, padding); 119 120 120 121 return ret; 121 122 }
+4 -1
kernel/watchdog.c
··· 430 430 p = kthread_create(watchdog, (void *)(unsigned long)cpu, "watchdog/%d", cpu); 431 431 if (IS_ERR(p)) { 432 432 printk(KERN_ERR "softlockup watchdog for %i failed\n", cpu); 433 - if (!err) 433 + if (!err) { 434 434 /* if hardlockup hasn't already set this */ 435 435 err = PTR_ERR(p); 436 + /* and disable the perf event */ 437 + watchdog_nmi_disable(cpu); 438 + } 436 439 goto out; 437 440 } 438 441 kthread_bind(p, cpu);
+7 -1
kernel/workqueue.c
··· 1291 1291 return true; 1292 1292 spin_unlock_irq(&gcwq->lock); 1293 1293 1294 - /* CPU has come up in between, retry migration */ 1294 + /* 1295 + * We've raced with CPU hot[un]plug. Give it a breather 1296 + * and retry migration. cond_resched() is required here; 1297 + * otherwise, we might deadlock against cpu_stop trying to 1298 + * bring down the CPU on non-preemptive kernel. 1299 + */ 1295 1300 cpu_relax(); 1301 + cond_resched(); 1296 1302 } 1297 1303 } 1298 1304
+18 -6
lib/flex_array.c
··· 232 232 233 233 /** 234 234 * flex_array_prealloc - guarantee that array space exists 235 - * @fa: the flex array for which to preallocate parts 236 - * @start: index of first array element for which space is allocated 237 - * @end: index of last (inclusive) element for which space is allocated 238 - * @flags: page allocation flags 235 + * @fa: the flex array for which to preallocate parts 236 + * @start: index of first array element for which space is allocated 237 + * @nr_elements: number of elements for which space is allocated 238 + * @flags: page allocation flags 239 239 * 240 240 * This will guarantee that no future calls to flex_array_put() 241 241 * will allocate memory. It can be used if you are expecting to ··· 245 245 * Locking must be provided by the caller. 246 246 */ 247 247 int flex_array_prealloc(struct flex_array *fa, unsigned int start, 248 - unsigned int end, gfp_t flags) 248 + unsigned int nr_elements, gfp_t flags) 249 249 { 250 250 int start_part; 251 251 int end_part; 252 252 int part_nr; 253 + unsigned int end; 253 254 struct flex_array_part *part; 254 255 255 - if (start >= fa->total_nr_elements || end >= fa->total_nr_elements) 256 + if (!start && !nr_elements) 257 + return 0; 258 + if (start >= fa->total_nr_elements) 259 + return -ENOSPC; 260 + if (!nr_elements) 261 + return 0; 262 + 263 + end = start + nr_elements - 1; 264 + 265 + if (end >= fa->total_nr_elements) 256 266 return -ENOSPC; 257 267 if (elements_fit_in_base(fa)) 258 268 return 0; ··· 353 343 int part_nr; 354 344 int ret = 0; 355 345 346 + if (!fa->total_nr_elements) 347 + return 0; 356 348 if (elements_fit_in_base(fa)) 357 349 return ret; 358 350 for (part_nr = 0; part_nr < FLEX_ARRAY_NR_BASE_PTRS; part_nr++) {
+3 -3
lib/xz/xz_dec_lzma2.c
··· 969 969 */ 970 970 tmp = b->in[b->in_pos++]; 971 971 972 + if (tmp == 0x00) 973 + return XZ_STREAM_END; 974 + 972 975 if (tmp >= 0xE0 || tmp == 0x01) { 973 976 s->lzma2.need_props = true; 974 977 s->lzma2.need_dict_reset = false; ··· 1004 1001 lzma_reset(s); 1005 1002 } 1006 1003 } else { 1007 - if (tmp == 0x00) 1008 - return XZ_STREAM_END; 1009 - 1010 1004 if (tmp > 0x02) 1011 1005 return XZ_DATA_ERROR; 1012 1006
+24 -19
mm/huge_memory.c
··· 1408 1408 return ret; 1409 1409 } 1410 1410 1411 + #define VM_NO_THP (VM_SPECIAL|VM_INSERTPAGE|VM_MIXEDMAP|VM_SAO| \ 1412 + VM_HUGETLB|VM_SHARED|VM_MAYSHARE) 1413 + 1411 1414 int hugepage_madvise(struct vm_area_struct *vma, 1412 1415 unsigned long *vm_flags, int advice) 1413 1416 { ··· 1419 1416 /* 1420 1417 * Be somewhat over-protective like KSM for now! 1421 1418 */ 1422 - if (*vm_flags & (VM_HUGEPAGE | 1423 - VM_SHARED | VM_MAYSHARE | 1424 - VM_PFNMAP | VM_IO | VM_DONTEXPAND | 1425 - VM_RESERVED | VM_HUGETLB | VM_INSERTPAGE | 1426 - VM_MIXEDMAP | VM_SAO)) 1419 + if (*vm_flags & (VM_HUGEPAGE | VM_NO_THP)) 1427 1420 return -EINVAL; 1428 1421 *vm_flags &= ~VM_NOHUGEPAGE; 1429 1422 *vm_flags |= VM_HUGEPAGE; ··· 1435 1436 /* 1436 1437 * Be somewhat over-protective like KSM for now! 1437 1438 */ 1438 - if (*vm_flags & (VM_NOHUGEPAGE | 1439 - VM_SHARED | VM_MAYSHARE | 1440 - VM_PFNMAP | VM_IO | VM_DONTEXPAND | 1441 - VM_RESERVED | VM_HUGETLB | VM_INSERTPAGE | 1442 - VM_MIXEDMAP | VM_SAO)) 1439 + if (*vm_flags & (VM_NOHUGEPAGE | VM_NO_THP)) 1443 1440 return -EINVAL; 1444 1441 *vm_flags &= ~VM_HUGEPAGE; 1445 1442 *vm_flags |= VM_NOHUGEPAGE; ··· 1569 1574 * page fault if needed. 1570 1575 */ 1571 1576 return 0; 1572 - if (vma->vm_file || vma->vm_ops) 1577 + if (vma->vm_ops) 1573 1578 /* khugepaged not yet working on file or special mappings */ 1574 1579 return 0; 1575 - VM_BUG_ON(is_linear_pfn_mapping(vma) || is_pfn_mapping(vma)); 1580 + /* 1581 + * If is_pfn_mapping() is true is_learn_pfn_mapping() must be 1582 + * true too, verify it here. 1583 + */ 1584 + VM_BUG_ON(is_linear_pfn_mapping(vma) || vma->vm_flags & VM_NO_THP); 1576 1585 hstart = (vma->vm_start + ~HPAGE_PMD_MASK) & HPAGE_PMD_MASK; 1577 1586 hend = vma->vm_end & HPAGE_PMD_MASK; 1578 1587 if (hstart < hend) ··· 1827 1828 (vma->vm_flags & VM_NOHUGEPAGE)) 1828 1829 goto out; 1829 1830 1830 - /* VM_PFNMAP vmas may have vm_ops null but vm_file set */ 1831 - if (!vma->anon_vma || vma->vm_ops || vma->vm_file) 1831 + if (!vma->anon_vma || vma->vm_ops) 1832 1832 goto out; 1833 1833 if (is_vma_temporary_stack(vma)) 1834 1834 goto out; 1835 - VM_BUG_ON(is_linear_pfn_mapping(vma) || is_pfn_mapping(vma)); 1835 + /* 1836 + * If is_pfn_mapping() is true is_learn_pfn_mapping() must be 1837 + * true too, verify it here. 1838 + */ 1839 + VM_BUG_ON(is_linear_pfn_mapping(vma) || vma->vm_flags & VM_NO_THP); 1836 1840 1837 1841 pgd = pgd_offset(mm, address); 1838 1842 if (!pgd_present(*pgd)) ··· 2068 2066 progress++; 2069 2067 continue; 2070 2068 } 2071 - /* VM_PFNMAP vmas may have vm_ops null but vm_file set */ 2072 - if (!vma->anon_vma || vma->vm_ops || vma->vm_file) 2069 + if (!vma->anon_vma || vma->vm_ops) 2073 2070 goto skip; 2074 2071 if (is_vma_temporary_stack(vma)) 2075 2072 goto skip; 2076 - 2077 - VM_BUG_ON(is_linear_pfn_mapping(vma) || is_pfn_mapping(vma)); 2073 + /* 2074 + * If is_pfn_mapping() is true is_learn_pfn_mapping() 2075 + * must be true too, verify it here. 2076 + */ 2077 + VM_BUG_ON(is_linear_pfn_mapping(vma) || 2078 + vma->vm_flags & VM_NO_THP); 2078 2079 2079 2080 hstart = (vma->vm_start + ~HPAGE_PMD_MASK) & HPAGE_PMD_MASK; 2080 2081 hend = vma->vm_end & HPAGE_PMD_MASK;
+9 -12
mm/memory.c
··· 1359 1359 */ 1360 1360 mark_page_accessed(page); 1361 1361 } 1362 - if (flags & FOLL_MLOCK) { 1362 + if ((flags & FOLL_MLOCK) && (vma->vm_flags & VM_LOCKED)) { 1363 1363 /* 1364 1364 * The preliminary mapping check is mainly to avoid the 1365 1365 * pointless overhead of lock_page on the ZERO_PAGE ··· 1412 1412 1413 1413 static inline int stack_guard_page(struct vm_area_struct *vma, unsigned long addr) 1414 1414 { 1415 - return (vma->vm_flags & VM_GROWSDOWN) && 1416 - (vma->vm_start == addr) && 1417 - !vma_stack_continue(vma->vm_prev, addr); 1415 + return stack_guard_page_start(vma, addr) || 1416 + stack_guard_page_end(vma, addr+PAGE_SIZE); 1418 1417 } 1419 1418 1420 1419 /** ··· 1550 1551 continue; 1551 1552 } 1552 1553 1553 - /* 1554 - * If we don't actually want the page itself, 1555 - * and it's the stack guard page, just skip it. 1556 - */ 1557 - if (!pages && stack_guard_page(vma, start)) 1558 - goto next_page; 1559 - 1560 1554 do { 1561 1555 struct page *page; 1562 1556 unsigned int foll_flags = gup_flags; ··· 1566 1574 int ret; 1567 1575 unsigned int fault_flags = 0; 1568 1576 1577 + /* For mlock, just skip the stack guard page. */ 1578 + if (foll_flags & FOLL_MLOCK) { 1579 + if (stack_guard_page(vma, start)) 1580 + goto next_page; 1581 + } 1569 1582 if (foll_flags & FOLL_WRITE) 1570 1583 fault_flags |= FAULT_FLAG_WRITE; 1571 1584 if (nonblocking) ··· 3393 3396 * run pte_offset_map on the pmd, if an huge pmd could 3394 3397 * materialize from under us from a different thread. 3395 3398 */ 3396 - if (unlikely(__pte_alloc(mm, vma, pmd, address))) 3399 + if (unlikely(pmd_none(*pmd)) && __pte_alloc(mm, vma, pmd, address)) 3397 3400 return VM_FAULT_OOM; 3398 3401 /* if an huge pmd materialized from under us just retry later */ 3399 3402 if (unlikely(pmd_trans_huge(*pmd)))
+1 -4
mm/mlock.c
··· 162 162 VM_BUG_ON(end > vma->vm_end); 163 163 VM_BUG_ON(!rwsem_is_locked(&mm->mmap_sem)); 164 164 165 - gup_flags = FOLL_TOUCH; 165 + gup_flags = FOLL_TOUCH | FOLL_MLOCK; 166 166 /* 167 167 * We want to touch writable mappings with a write fault in order 168 168 * to break COW, except for shared mappings because these don't COW ··· 177 177 */ 178 178 if (vma->vm_flags & (VM_READ | VM_WRITE | VM_EXEC)) 179 179 gup_flags |= FOLL_FORCE; 180 - 181 - if (vma->vm_flags & VM_LOCKED) 182 - gup_flags |= FOLL_MLOCK; 183 180 184 181 return __get_user_pages(current, mm, addr, nr_pages, gup_flags, 185 182 NULL, NULL, nonblocking);
+7 -4
mm/mmap.c
··· 1767 1767 size = address - vma->vm_start; 1768 1768 grow = (address - vma->vm_end) >> PAGE_SHIFT; 1769 1769 1770 - error = acct_stack_growth(vma, size, grow); 1771 - if (!error) { 1772 - vma->vm_end = address; 1773 - perf_event_mmap(vma); 1770 + error = -ENOMEM; 1771 + if (vma->vm_pgoff + (size >> PAGE_SHIFT) >= vma->vm_pgoff) { 1772 + error = acct_stack_growth(vma, size, grow); 1773 + if (!error) { 1774 + vma->vm_end = address; 1775 + perf_event_mmap(vma); 1776 + } 1774 1777 } 1775 1778 } 1776 1779 vma_unlock_anon_vma(vma);
+6 -3
mm/oom_kill.c
··· 172 172 173 173 /* 174 174 * The baseline for the badness score is the proportion of RAM that each 175 - * task's rss and swap space use. 175 + * task's rss, pagetable and swap space use. 176 176 */ 177 - points = (get_mm_rss(p->mm) + get_mm_counter(p->mm, MM_SWAPENTS)) * 1000 / 178 - totalpages; 177 + points = get_mm_rss(p->mm) + p->mm->nr_ptes; 178 + points += get_mm_counter(p->mm, MM_SWAPENTS); 179 + 180 + points *= 1000; 181 + points /= totalpages; 179 182 task_unlock(p); 180 183 181 184 /*
+2 -2
mm/slub.c
··· 1940 1940 * Since this is without lock semantics the protection is only against 1941 1941 * code executing on this cpu *not* from access by other cpus. 1942 1942 */ 1943 - if (unlikely(!this_cpu_cmpxchg_double( 1943 + if (unlikely(!irqsafe_cpu_cmpxchg_double( 1944 1944 s->cpu_slab->freelist, s->cpu_slab->tid, 1945 1945 object, tid, 1946 1946 get_freepointer(s, object), next_tid(tid)))) { ··· 2145 2145 set_freepointer(s, object, c->freelist); 2146 2146 2147 2147 #ifdef CONFIG_CMPXCHG_LOCAL 2148 - if (unlikely(!this_cpu_cmpxchg_double( 2148 + if (unlikely(!irqsafe_cpu_cmpxchg_double( 2149 2149 s->cpu_slab->freelist, s->cpu_slab->tid, 2150 2150 c->freelist, tid, 2151 2151 object, next_tid(tid)))) {
+2 -3
net/bluetooth/hci_core.c
··· 587 587 hci_req_cancel(hdev, ENODEV); 588 588 hci_req_lock(hdev); 589 589 590 - /* Stop timer, it might be running */ 591 - del_timer_sync(&hdev->cmd_timer); 592 - 593 590 if (!test_and_clear_bit(HCI_UP, &hdev->flags)) { 591 + del_timer_sync(&hdev->cmd_timer); 594 592 hci_req_unlock(hdev); 595 593 return 0; 596 594 } ··· 627 629 628 630 /* Drop last sent command */ 629 631 if (hdev->sent_cmd) { 632 + del_timer_sync(&hdev->cmd_timer); 630 633 kfree_skb(hdev->sent_cmd); 631 634 hdev->sent_cmd = NULL; 632 635 }
-2
net/bluetooth/hci_event.c
··· 2387 2387 if (!conn) 2388 2388 goto unlock; 2389 2389 2390 - hci_conn_hold(conn); 2391 - 2392 2390 conn->remote_cap = ev->capability; 2393 2391 conn->remote_oob = ev->oob_data; 2394 2392 conn->remote_auth = ev->authentication;
+1
net/bluetooth/l2cap_core.c
··· 1051 1051 tx_skb = skb_clone(skb, GFP_ATOMIC); 1052 1052 bt_cb(skb)->retries++; 1053 1053 control = get_unaligned_le16(tx_skb->data + L2CAP_HDR_SIZE); 1054 + control &= L2CAP_CTRL_SAR; 1054 1055 1055 1056 if (pi->conn_state & L2CAP_CONN_SEND_FBIT) { 1056 1057 control |= L2CAP_CTRL_FINAL;
+9
net/bluetooth/sco.c
··· 369 369 370 370 case BT_CONNECTED: 371 371 case BT_CONFIG: 372 + if (sco_pi(sk)->conn) { 373 + sk->sk_state = BT_DISCONN; 374 + sco_sock_set_timer(sk, SCO_DISCONN_TIMEOUT); 375 + hci_conn_put(sco_pi(sk)->conn->hcon); 376 + sco_pi(sk)->conn = NULL; 377 + } else 378 + sco_chan_del(sk, ECONNRESET); 379 + break; 380 + 372 381 case BT_CONNECT: 373 382 case BT_DISCONN: 374 383 sco_chan_del(sk, ECONNRESET);
+1 -1
net/bridge/br_input.c
··· 164 164 goto drop; 165 165 166 166 /* If STP is turned off, then forward */ 167 - if (p->br->stp_enabled == BR_NO_STP) 167 + if (p->br->stp_enabled == BR_NO_STP && dest[5] == 0) 168 168 goto forward; 169 169 170 170 if (NF_HOOK(NFPROTO_BRIDGE, NF_BR_LOCAL_IN, skb, skb->dev,
+6 -1
net/can/bcm.c
··· 1427 1427 static int bcm_release(struct socket *sock) 1428 1428 { 1429 1429 struct sock *sk = sock->sk; 1430 - struct bcm_sock *bo = bcm_sk(sk); 1430 + struct bcm_sock *bo; 1431 1431 struct bcm_op *op, *next; 1432 + 1433 + if (sk == NULL) 1434 + return 0; 1435 + 1436 + bo = bcm_sk(sk); 1432 1437 1433 1438 /* remove bcm_ops, timer, rx_unregister(), etc. */ 1434 1439
+6 -1
net/can/raw.c
··· 305 305 static int raw_release(struct socket *sock) 306 306 { 307 307 struct sock *sk = sock->sk; 308 - struct raw_sock *ro = raw_sk(sk); 308 + struct raw_sock *ro; 309 + 310 + if (!sk) 311 + return 0; 312 + 313 + ro = raw_sk(sk); 309 314 310 315 unregister_netdevice_notifier(&ro->notifier); 311 316
+13 -13
net/ceph/messenger.c
··· 2267 2267 m->more_to_follow = false; 2268 2268 m->pool = NULL; 2269 2269 2270 + /* middle */ 2271 + m->middle = NULL; 2272 + 2273 + /* data */ 2274 + m->nr_pages = 0; 2275 + m->page_alignment = 0; 2276 + m->pages = NULL; 2277 + m->pagelist = NULL; 2278 + m->bio = NULL; 2279 + m->bio_iter = NULL; 2280 + m->bio_seg = 0; 2281 + m->trail = NULL; 2282 + 2270 2283 /* front */ 2271 2284 if (front_len) { 2272 2285 if (front_len > PAGE_CACHE_SIZE) { ··· 2298 2285 m->front.iov_base = NULL; 2299 2286 } 2300 2287 m->front.iov_len = front_len; 2301 - 2302 - /* middle */ 2303 - m->middle = NULL; 2304 - 2305 - /* data */ 2306 - m->nr_pages = 0; 2307 - m->page_alignment = 0; 2308 - m->pages = NULL; 2309 - m->pagelist = NULL; 2310 - m->bio = NULL; 2311 - m->bio_iter = NULL; 2312 - m->bio_seg = 0; 2313 - m->trail = NULL; 2314 2288 2315 2289 dout("ceph_msg_new %p front %d\n", m, front_len); 2316 2290 return m;
+2 -2
net/ceph/osd_client.c
··· 470 470 snapc, ops, 471 471 use_mempool, 472 472 GFP_NOFS, NULL, NULL); 473 - if (IS_ERR(req)) 474 - return req; 473 + if (!req) 474 + return NULL; 475 475 476 476 /* calculate max write size */ 477 477 calc_layout(osdc, vino, layout, off, plen, req, ops);
+3 -3
net/core/dev.c
··· 4773 4773 * is never reached 4774 4774 */ 4775 4775 WARN_ON(1); 4776 - err = -EINVAL; 4776 + err = -ENOTTY; 4777 4777 break; 4778 4778 4779 4779 } ··· 5041 5041 /* Set the per device memory buffer space. 5042 5042 * Not applicable in our case */ 5043 5043 case SIOCSIFLINK: 5044 - return -EINVAL; 5044 + return -ENOTTY; 5045 5045 5046 5046 /* 5047 5047 * Unknown or private ioctl. ··· 5062 5062 /* Take care of Wireless Extensions */ 5063 5063 if (cmd >= SIOCIWFIRST && cmd <= SIOCIWLAST) 5064 5064 return wext_handle_ioctl(net, &ifr, cmd, arg); 5065 - return -EINVAL; 5065 + return -ENOTTY; 5066 5066 } 5067 5067 } 5068 5068
+2 -2
net/dsa/Kconfig
··· 41 41 default n 42 42 43 43 config NET_DSA_MV88E6131 44 - bool "Marvell 88E6095/6095F/6131 ethernet switch chip support" 44 + bool "Marvell 88E6085/6095/6095F/6131 ethernet switch chip support" 45 45 select NET_DSA_MV88E6XXX 46 46 select NET_DSA_MV88E6XXX_NEED_PPU 47 47 select NET_DSA_TAG_DSA 48 48 ---help--- 49 - This enables support for the Marvell 88E6095/6095F/6131 49 + This enables support for the Marvell 88E6085/6095/6095F/6131 50 50 ethernet switch chips. 51 51 52 52 config NET_DSA_MV88E6123_61_65
+21 -5
net/dsa/mv88e6131.c
··· 207 207 * mode, but do not enable forwarding of unknown unicasts. 208 208 */ 209 209 val = 0x0433; 210 - if (p == dsa_upstream_port(ds)) 210 + if (p == dsa_upstream_port(ds)) { 211 211 val |= 0x0104; 212 + /* 213 + * On 6085, unknown multicast forward is controlled 214 + * here rather than in Port Control 2 register. 215 + */ 216 + if (ps->id == ID_6085) 217 + val |= 0x0008; 218 + } 212 219 if (ds->dsa_port_mask & (1 << p)) 213 220 val |= 0x0100; 214 221 REG_WRITE(addr, 0x04, val); ··· 258 251 * If this is the upstream port for this switch, enable 259 252 * forwarding of unknown multicast addresses. 260 253 */ 261 - val = 0x0080 | dsa_upstream_port(ds); 262 - if (p == dsa_upstream_port(ds)) 263 - val |= 0x0040; 264 - REG_WRITE(addr, 0x08, val); 254 + if (ps->id == ID_6085) 255 + /* 256 + * on 6085, bits 3:0 are reserved, bit 6 control ARP 257 + * mirroring, and multicast forward is handled in 258 + * Port Control register. 259 + */ 260 + REG_WRITE(addr, 0x08, 0x0080); 261 + else { 262 + val = 0x0080 | dsa_upstream_port(ds); 263 + if (p == dsa_upstream_port(ds)) 264 + val |= 0x0040; 265 + REG_WRITE(addr, 0x08, val); 266 + } 265 267 266 268 /* 267 269 * Rate Control: disable ingress rate limiting.
+1 -1
net/ipv4/devinet.c
··· 1680 1680 return; 1681 1681 1682 1682 cnf->sysctl = NULL; 1683 - unregister_sysctl_table(t->sysctl_header); 1683 + unregister_net_sysctl_table(t->sysctl_header); 1684 1684 kfree(t->dev_name); 1685 1685 kfree(t); 1686 1686 }
-3
net/ipv4/fib_trie.c
··· 1978 1978 t = (struct trie *) tb->tb_data; 1979 1979 memset(t, 0, sizeof(*t)); 1980 1980 1981 - if (id == RT_TABLE_LOCAL) 1982 - pr_info("IPv4 FIB: Using LC-trie version %s\n", VERSION); 1983 - 1984 1981 return tb; 1985 1982 } 1986 1983
+7
net/ipv4/route.c
··· 2690 2690 { 2691 2691 } 2692 2692 2693 + static u32 *ipv4_rt_blackhole_cow_metrics(struct dst_entry *dst, 2694 + unsigned long old) 2695 + { 2696 + return NULL; 2697 + } 2698 + 2693 2699 static struct dst_ops ipv4_dst_blackhole_ops = { 2694 2700 .family = AF_INET, 2695 2701 .protocol = cpu_to_be16(ETH_P_IP), ··· 2704 2698 .default_mtu = ipv4_blackhole_default_mtu, 2705 2699 .default_advmss = ipv4_default_advmss, 2706 2700 .update_pmtu = ipv4_rt_blackhole_update_pmtu, 2701 + .cow_metrics = ipv4_rt_blackhole_cow_metrics, 2707 2702 }; 2708 2703 2709 2704 struct dst_entry *ipv4_blackhole_route(struct net *net, struct dst_entry *dst_orig)
+1 -1
net/ipv6/addrconf.c
··· 4537 4537 4538 4538 t = p->sysctl; 4539 4539 p->sysctl = NULL; 4540 - unregister_sysctl_table(t->sysctl_header); 4540 + unregister_net_sysctl_table(t->sysctl_header); 4541 4541 kfree(t->dev_name); 4542 4542 kfree(t); 4543 4543 }
+1 -1
net/ipv6/esp6.c
··· 371 371 iv = esp_tmp_iv(aead, tmp, seqhilen); 372 372 req = esp_tmp_req(aead, iv); 373 373 asg = esp_req_sg(aead, req); 374 - sg = asg + 1; 374 + sg = asg + sglists; 375 375 376 376 skb->ip_summed = CHECKSUM_NONE; 377 377
+7 -1
net/ipv6/route.c
··· 153 153 { 154 154 } 155 155 156 + static u32 *ip6_rt_blackhole_cow_metrics(struct dst_entry *dst, 157 + unsigned long old) 158 + { 159 + return NULL; 160 + } 161 + 156 162 static struct dst_ops ip6_dst_blackhole_ops = { 157 163 .family = AF_INET6, 158 164 .protocol = cpu_to_be16(ETH_P_IPV6), ··· 167 161 .default_mtu = ip6_blackhole_default_mtu, 168 162 .default_advmss = ip6_default_advmss, 169 163 .update_pmtu = ip6_rt_blackhole_update_pmtu, 164 + .cow_metrics = ip6_rt_blackhole_cow_metrics, 170 165 }; 171 166 172 167 static const u32 ip6_template_metrics[RTAX_MAX] = { ··· 2019 2012 rt->dst.output = ip6_output; 2020 2013 rt->rt6i_dev = net->loopback_dev; 2021 2014 rt->rt6i_idev = idev; 2022 - dst_metric_set(&rt->dst, RTAX_HOPLIMIT, -1); 2023 2015 rt->dst.obsolete = -1; 2024 2016 2025 2017 rt->rt6i_flags = RTF_UP | RTF_NONEXTHOP;
+1 -1
net/ipv6/udp.c
··· 1335 1335 skb->ip_summed = CHECKSUM_NONE; 1336 1336 1337 1337 /* Check if there is enough headroom to insert fragment header. */ 1338 - if ((skb_headroom(skb) < frag_hdr_sz) && 1338 + if ((skb_mac_header(skb) < skb->head + frag_hdr_sz) && 1339 1339 pskb_expand_head(skb, frag_hdr_sz, 0, GFP_ATOMIC)) 1340 1340 goto out; 1341 1341
+1 -1
net/l2tp/l2tp_ip.c
··· 667 667 MODULE_DESCRIPTION("L2TP over IP"); 668 668 MODULE_VERSION("1.0"); 669 669 670 - /* Use the value of SOCK_DGRAM (2) directory, because __stringify does't like 670 + /* Use the value of SOCK_DGRAM (2) directory, because __stringify doesn't like 671 671 * enums 672 672 */ 673 673 MODULE_ALIAS_NET_PF_PROTO_TYPE(PF_INET, 2, IPPROTO_L2TP);
+2
net/mac80211/cfg.c
··· 1504 1504 enum ieee80211_smps_mode old_req; 1505 1505 int err; 1506 1506 1507 + lockdep_assert_held(&sdata->u.mgd.mtx); 1508 + 1507 1509 old_req = sdata->u.mgd.req_smps; 1508 1510 sdata->u.mgd.req_smps = smps_mode; 1509 1511
+2 -2
net/mac80211/debugfs_netdev.c
··· 177 177 if (sdata->vif.type != NL80211_IFTYPE_STATION) 178 178 return -EOPNOTSUPP; 179 179 180 - mutex_lock(&local->iflist_mtx); 180 + mutex_lock(&sdata->u.mgd.mtx); 181 181 err = __ieee80211_request_smps(sdata, smps_mode); 182 - mutex_unlock(&local->iflist_mtx); 182 + mutex_unlock(&sdata->u.mgd.mtx); 183 183 184 184 return err; 185 185 }
+1 -1
net/sctp/ulpevent.c
··· 554 554 memcpy(&ssf->ssf_info, &chunk->sinfo, sizeof(struct sctp_sndrcvinfo)); 555 555 556 556 /* Per TSVWG discussion with Randy. Allow the application to 557 - * resemble a fragmented message. 557 + * reassemble a fragmented message. 558 558 */ 559 559 ssf->ssf_info.sinfo_flags = chunk->chunk_hdr->flags; 560 560
+4 -5
net/sunrpc/Kconfig
··· 18 18 If unsure, say N. 19 19 20 20 config RPCSEC_GSS_KRB5 21 - tristate 21 + tristate "Secure RPC: Kerberos V mechanism" 22 22 depends on SUNRPC && CRYPTO 23 - prompt "Secure RPC: Kerberos V mechanism" if !(NFS_V4 || NFSD_V4) 23 + depends on CRYPTO_MD5 && CRYPTO_DES && CRYPTO_CBC && CRYPTO_CTS 24 + depends on CRYPTO_ECB && CRYPTO_HMAC && CRYPTO_SHA1 && CRYPTO_AES 25 + depends on CRYPTO_ARC4 24 26 default y 25 27 select SUNRPC_GSS 26 - select CRYPTO_MD5 27 - select CRYPTO_DES 28 - select CRYPTO_CBC 29 28 help 30 29 Choose Y here to enable Secure RPC using the Kerberos version 5 31 30 GSS-API mechanism (RFC 1964).
+5 -3
net/sunrpc/auth_gss/auth_gss.c
··· 520 520 warn_gssd(); 521 521 task->tk_timeout = 15*HZ; 522 522 rpc_sleep_on(&pipe_version_rpc_waitqueue, task, NULL); 523 - return 0; 523 + return -EAGAIN; 524 524 } 525 525 if (IS_ERR(gss_msg)) { 526 526 err = PTR_ERR(gss_msg); ··· 563 563 if (PTR_ERR(gss_msg) == -EAGAIN) { 564 564 err = wait_event_interruptible_timeout(pipe_version_waitqueue, 565 565 pipe_version >= 0, 15*HZ); 566 + if (pipe_version < 0) { 567 + warn_gssd(); 568 + err = -EACCES; 569 + } 566 570 if (err) 567 571 goto out; 568 - if (pipe_version < 0) 569 - warn_gssd(); 570 572 goto retry; 571 573 } 572 574 if (IS_ERR(gss_msg)) {
+4 -1
net/sunrpc/clnt.c
··· 1508 1508 if (clnt->cl_chatty) 1509 1509 printk(KERN_NOTICE "%s: server %s not responding, timed out\n", 1510 1510 clnt->cl_protname, clnt->cl_server); 1511 - rpc_exit(task, -EIO); 1511 + if (task->tk_flags & RPC_TASK_TIMEOUT) 1512 + rpc_exit(task, -ETIMEDOUT); 1513 + else 1514 + rpc_exit(task, -EIO); 1512 1515 return; 1513 1516 } 1514 1517
+1
net/sunrpc/xprt.c
··· 906 906 } 907 907 908 908 dprintk("RPC: %5u xmit complete\n", task->tk_pid); 909 + task->tk_flags |= RPC_TASK_SENT; 909 910 spin_lock_bh(&xprt->transport_lock); 910 911 911 912 xprt->ops->set_retrans_timeout(task);
+15 -1
net/unix/af_unix.c
··· 524 524 int, int); 525 525 static int unix_seqpacket_sendmsg(struct kiocb *, struct socket *, 526 526 struct msghdr *, size_t); 527 + static int unix_seqpacket_recvmsg(struct kiocb *, struct socket *, 528 + struct msghdr *, size_t, int); 527 529 528 530 static const struct proto_ops unix_stream_ops = { 529 531 .family = PF_UNIX, ··· 585 583 .setsockopt = sock_no_setsockopt, 586 584 .getsockopt = sock_no_getsockopt, 587 585 .sendmsg = unix_seqpacket_sendmsg, 588 - .recvmsg = unix_dgram_recvmsg, 586 + .recvmsg = unix_seqpacket_recvmsg, 589 587 .mmap = sock_no_mmap, 590 588 .sendpage = sock_no_sendpage, 591 589 }; ··· 1699 1697 msg->msg_namelen = 0; 1700 1698 1701 1699 return unix_dgram_sendmsg(kiocb, sock, msg, len); 1700 + } 1701 + 1702 + static int unix_seqpacket_recvmsg(struct kiocb *iocb, struct socket *sock, 1703 + struct msghdr *msg, size_t size, 1704 + int flags) 1705 + { 1706 + struct sock *sk = sock->sk; 1707 + 1708 + if (sk->sk_state != TCP_ESTABLISHED) 1709 + return -ENOTCONN; 1710 + 1711 + return unix_dgram_recvmsg(iocb, sock, msg, size, flags); 1702 1712 } 1703 1713 1704 1714 static void unix_copy_addr(struct msghdr *msg, struct sock *sk)
+1 -1
net/xfrm/xfrm_replay.c
··· 532 532 533 533 if (replay_esn) { 534 534 if (replay_esn->replay_window > 535 - replay_esn->bmp_len * sizeof(__u32)) 535 + replay_esn->bmp_len * sizeof(__u32) * 8) 536 536 return -EINVAL; 537 537 538 538 if ((x->props.flags & XFRM_STATE_ESN) && x->replay_esn)
+3
net/xfrm/xfrm_user.c
··· 124 124 { 125 125 struct nlattr *rt = attrs[XFRMA_REPLAY_ESN_VAL]; 126 126 127 + if ((p->flags & XFRM_STATE_ESN) && !rt) 128 + return -EINVAL; 129 + 127 130 if (!rt) 128 131 return 0; 129 132
+2 -1
security/selinux/hooks.c
··· 1578 1578 return rc; 1579 1579 1580 1580 if (!newsid || !(sbsec->flags & SE_SBLABELSUPP)) { 1581 - rc = security_transition_sid(sid, dsec->sid, tclass, NULL, &newsid); 1581 + rc = security_transition_sid(sid, dsec->sid, tclass, 1582 + &dentry->d_name, &newsid); 1582 1583 if (rc) 1583 1584 return rc; 1584 1585 }
+3 -3
security/selinux/ss/policydb.c
··· 502 502 goto out; 503 503 504 504 rc = flex_array_prealloc(p->type_val_to_struct_array, 0, 505 - p->p_types.nprim - 1, GFP_KERNEL | __GFP_ZERO); 505 + p->p_types.nprim, GFP_KERNEL | __GFP_ZERO); 506 506 if (rc) 507 507 goto out; 508 508 ··· 519 519 goto out; 520 520 521 521 rc = flex_array_prealloc(p->sym_val_to_name[i], 522 - 0, p->symtab[i].nprim - 1, 522 + 0, p->symtab[i].nprim, 523 523 GFP_KERNEL | __GFP_ZERO); 524 524 if (rc) 525 525 goto out; ··· 2375 2375 goto bad; 2376 2376 2377 2377 /* preallocate so we don't have to worry about the put ever failing */ 2378 - rc = flex_array_prealloc(p->type_attr_map_array, 0, p->p_types.nprim - 1, 2378 + rc = flex_array_prealloc(p->type_attr_map_array, 0, p->p_types.nprim, 2379 2379 GFP_KERNEL | __GFP_ZERO); 2380 2380 if (rc) 2381 2381 goto bad;
+1 -1
sound/aoa/codecs/tas.c
··· 170 170 /* analysing the volume and mixer tables shows 171 171 * that they are similar enough when we shift 172 172 * the mixer table down by 4 bits. The error 173 - * is minuscule, in just one item the error 173 + * is miniscule, in just one item the error 174 174 * is 1, at a value of 0x07f17b (mixer table 175 175 * value is 0x07f17a) */ 176 176 tmp = tas_gaintable[left];
+5 -2
sound/pci/au88x0/au88x0_pcm.c
··· 44 44 .channels_min = 1, 45 45 .channels_max = 2, 46 46 .buffer_bytes_max = 0x10000, 47 - .period_bytes_min = 0x1, 47 + .period_bytes_min = 0x20, 48 48 .period_bytes_max = 0x1000, 49 49 .periods_min = 2, 50 - .periods_max = 32, 50 + .periods_max = 1024, 51 51 }; 52 52 53 53 #ifndef CHIP_AU8820 ··· 139 139 snd_pcm_hw_constraint_pow2(runtime, 0, 140 140 SNDRV_PCM_HW_PARAM_PERIOD_BYTES)) < 0) 141 141 return err; 142 + 143 + snd_pcm_hw_constraint_step(runtime, 0, 144 + SNDRV_PCM_HW_PARAM_BUFFER_BYTES, 64); 142 145 143 146 if (VORTEX_PCM_TYPE(substream->pcm) != VORTEX_PCM_WT) { 144 147 #ifndef CHIP_AU8820
+11 -19
sound/pci/hda/patch_realtek.c
··· 1704 1704 codec->chip_name, fix->type); 1705 1705 break; 1706 1706 } 1707 - if (!fix[id].chained) 1707 + if (!fix->chained) 1708 1708 break; 1709 1709 if (++depth > 10) 1710 1710 break; 1711 - id = fix[id].chain_id; 1711 + id = fix->chain_id; 1712 1712 } 1713 1713 } 1714 1714 ··· 5645 5645 static struct snd_pci_quirk beep_white_list[] = { 5646 5646 SND_PCI_QUIRK(0x1043, 0x829f, "ASUS", 1), 5647 5647 SND_PCI_QUIRK(0x1043, 0x83ce, "EeePC", 1), 5648 + SND_PCI_QUIRK(0x1043, 0x831a, "EeePC", 1), 5648 5649 SND_PCI_QUIRK(0x8086, 0xd613, "Intel", 1), 5649 5650 {} 5650 5651 }; ··· 9864 9863 SND_PCI_QUIRK(0x1071, 0x8258, "Evesham Voyaeger", ALC883_LAPTOP_EAPD), 9865 9864 SND_PCI_QUIRK(0x10f1, 0x2350, "TYAN-S2350", ALC888_6ST_DELL), 9866 9865 SND_PCI_QUIRK(0x108e, 0x534d, NULL, ALC883_3ST_6ch), 9866 + SND_PCI_QUIRK(0x1458, 0xa002, "Gigabyte P35 DS3R", ALC882_6ST_DIG), 9867 9867 9868 9868 SND_PCI_QUIRK(0x1462, 0x0349, "MSI", ALC883_TARGA_2ch_DIG), 9869 9869 SND_PCI_QUIRK(0x1462, 0x040d, "MSI", ALC883_TARGA_2ch_DIG), ··· 10701 10699 PINFIX_LENOVO_Y530, 10702 10700 PINFIX_PB_M5210, 10703 10701 PINFIX_ACER_ASPIRE_7736, 10704 - PINFIX_GIGABYTE_880GM, 10705 10702 }; 10706 10703 10707 10704 static const struct alc_fixup alc882_fixups[] = { ··· 10732 10731 .type = ALC_FIXUP_SKU, 10733 10732 .v.sku = ALC_FIXUP_SKU_IGNORE, 10734 10733 }, 10735 - [PINFIX_GIGABYTE_880GM] = { 10736 - .type = ALC_FIXUP_PINS, 10737 - .v.pins = (const struct alc_pincfg[]) { 10738 - { 0x14, 0x1114410 }, /* set as speaker */ 10739 - { } 10740 - } 10741 - }, 10742 10734 }; 10743 10735 10744 10736 static struct snd_pci_quirk alc882_fixup_tbl[] = { ··· 10739 10745 SND_PCI_QUIRK(0x17aa, 0x3a0d, "Lenovo Y530", PINFIX_LENOVO_Y530), 10740 10746 SND_PCI_QUIRK(0x147b, 0x107a, "Abit AW9D-MAX", PINFIX_ABIT_AW9D_MAX), 10741 10747 SND_PCI_QUIRK(0x1025, 0x0296, "Acer Aspire 7736z", PINFIX_ACER_ASPIRE_7736), 10742 - SND_PCI_QUIRK(0x1458, 0xa002, "Gigabyte", PINFIX_GIGABYTE_880GM), 10743 10748 {} 10744 10749 }; 10745 10750 ··· 18798 18805 ALC662_3ST_6ch_DIG), 18799 18806 SND_PCI_QUIRK(0x1179, 0xff6e, "Toshiba NB20x", ALC662_AUTO), 18800 18807 SND_PCI_QUIRK(0x144d, 0xca00, "Samsung NC10", ALC272_SAMSUNG_NC10), 18808 + SND_PCI_QUIRK(0x1458, 0xa002, "Gigabyte 945GCM-S2L", 18809 + ALC662_3ST_6ch_DIG), 18801 18810 SND_PCI_QUIRK(0x152d, 0x2304, "Quanta WH1", ALC663_ASUS_H13), 18802 18811 SND_PCI_QUIRK(0x1565, 0x820f, "Biostar TA780G M2+", ALC662_3ST_6ch_DIG), 18803 18812 SND_PCI_QUIRK(0x1631, 0xc10c, "PB RS65", ALC663_ASUS_M51VA), ··· 19473 19478 ALC662_FIXUP_IDEAPAD, 19474 19479 ALC272_FIXUP_MARIO, 19475 19480 ALC662_FIXUP_CZC_P10T, 19476 - ALC662_FIXUP_GIGABYTE, 19481 + ALC662_FIXUP_SKU_IGNORE, 19477 19482 }; 19478 19483 19479 19484 static const struct alc_fixup alc662_fixups[] = { ··· 19502 19507 {} 19503 19508 } 19504 19509 }, 19505 - [ALC662_FIXUP_GIGABYTE] = { 19506 - .type = ALC_FIXUP_PINS, 19507 - .v.pins = (const struct alc_pincfg[]) { 19508 - { 0x14, 0x1114410 }, /* set as speaker */ 19509 - { } 19510 - } 19510 + [ALC662_FIXUP_SKU_IGNORE] = { 19511 + .type = ALC_FIXUP_SKU, 19512 + .v.sku = ALC_FIXUP_SKU_IGNORE, 19511 19513 }, 19512 19514 }; 19513 19515 19514 19516 static struct snd_pci_quirk alc662_fixup_tbl[] = { 19515 19517 SND_PCI_QUIRK(0x1025, 0x0308, "Acer Aspire 8942G", ALC662_FIXUP_ASPIRE), 19518 + SND_PCI_QUIRK(0x1025, 0x031c, "Gateway NV79", ALC662_FIXUP_SKU_IGNORE), 19516 19519 SND_PCI_QUIRK(0x1025, 0x038b, "Acer Aspire 8943G", ALC662_FIXUP_ASPIRE), 19517 19520 SND_PCI_QUIRK(0x144d, 0xc051, "Samsung R720", ALC662_FIXUP_IDEAPAD), 19518 - SND_PCI_QUIRK(0x1458, 0xa002, "Gigabyte", ALC662_FIXUP_GIGABYTE), 19519 19521 SND_PCI_QUIRK(0x17aa, 0x38af, "Lenovo Ideapad Y550P", ALC662_FIXUP_IDEAPAD), 19520 19522 SND_PCI_QUIRK(0x17aa, 0x3a0d, "Lenovo Ideapad Y550", ALC662_FIXUP_IDEAPAD), 19521 19523 SND_PCI_QUIRK(0x1b35, 0x2206, "CZC P10T", ALC662_FIXUP_CZC_P10T),
+7 -3
sound/pci/hda/patch_via.c
··· 1292 1292 { 1293 1293 int i; 1294 1294 struct snd_ctl_elem_id id; 1295 - const char *labels[] = {"Mic", "Front Mic", "Line"}; 1295 + const char *labels[] = {"Mic", "Front Mic", "Line", "Rear Mic"}; 1296 + struct snd_kcontrol *ctl; 1296 1297 1297 1298 memset(&id, 0, sizeof(id)); 1298 1299 id.iface = SNDRV_CTL_ELEM_IFACE_MIXER; 1299 1300 for (i = 0; i < ARRAY_SIZE(labels); i++) { 1300 1301 sprintf(id.name, "%s Playback Volume", labels[i]); 1301 - snd_ctl_notify(codec->bus->card, SNDRV_CTL_EVENT_MASK_VALUE, 1302 - &id); 1302 + ctl = snd_hda_find_mixer_ctl(codec, id.name); 1303 + if (ctl) 1304 + snd_ctl_notify(codec->bus->card, 1305 + SNDRV_CTL_EVENT_MASK_VALUE, 1306 + &ctl->id); 1303 1307 } 1304 1308 } 1305 1309
+12 -7
sound/soc/davinci/davinci-mcasp.c
··· 434 434 mcasp_set_bits(base + DAVINCI_MCASP_ACLKRCTL_REG, ACLKRE); 435 435 mcasp_set_bits(base + DAVINCI_MCASP_RXFMCTL_REG, AFSRE); 436 436 437 - mcasp_set_bits(base + DAVINCI_MCASP_PDIR_REG, (0x7 << 26)); 437 + mcasp_set_bits(base + DAVINCI_MCASP_PDIR_REG, 438 + ACLKX | AHCLKX | AFSX); 438 439 break; 439 440 case SND_SOC_DAIFMT_CBM_CFS: 440 441 /* codec is clock master and frame slave */ 441 - mcasp_set_bits(base + DAVINCI_MCASP_ACLKXCTL_REG, ACLKXE); 442 + mcasp_clr_bits(base + DAVINCI_MCASP_ACLKXCTL_REG, ACLKXE); 442 443 mcasp_set_bits(base + DAVINCI_MCASP_TXFMCTL_REG, AFSXE); 443 444 444 - mcasp_set_bits(base + DAVINCI_MCASP_ACLKRCTL_REG, ACLKRE); 445 + mcasp_clr_bits(base + DAVINCI_MCASP_ACLKRCTL_REG, ACLKRE); 445 446 mcasp_set_bits(base + DAVINCI_MCASP_RXFMCTL_REG, AFSRE); 446 447 447 - mcasp_set_bits(base + DAVINCI_MCASP_PDIR_REG, (0x2d << 26)); 448 + mcasp_clr_bits(base + DAVINCI_MCASP_PDIR_REG, 449 + ACLKX | ACLKR); 450 + mcasp_set_bits(base + DAVINCI_MCASP_PDIR_REG, 451 + AFSX | AFSR); 448 452 break; 449 453 case SND_SOC_DAIFMT_CBM_CFM: 450 454 /* codec is clock and frame master */ ··· 458 454 mcasp_clr_bits(base + DAVINCI_MCASP_ACLKRCTL_REG, ACLKRE); 459 455 mcasp_clr_bits(base + DAVINCI_MCASP_RXFMCTL_REG, AFSRE); 460 456 461 - mcasp_clr_bits(base + DAVINCI_MCASP_PDIR_REG, (0x3f << 26)); 457 + mcasp_clr_bits(base + DAVINCI_MCASP_PDIR_REG, 458 + ACLKX | AHCLKX | AFSX | ACLKR | AHCLKR | AFSR); 462 459 break; 463 460 464 461 default: ··· 649 644 mcasp_set_reg(dev->base + DAVINCI_MCASP_TXTDM_REG, mask); 650 645 mcasp_set_bits(dev->base + DAVINCI_MCASP_TXFMT_REG, TXORD); 651 646 652 - if ((dev->tdm_slots >= 2) || (dev->tdm_slots <= 32)) 647 + if ((dev->tdm_slots >= 2) && (dev->tdm_slots <= 32)) 653 648 mcasp_mod_bits(dev->base + DAVINCI_MCASP_TXFMCTL_REG, 654 649 FSXMOD(dev->tdm_slots), FSXMOD(0x1FF)); 655 650 else ··· 665 660 AHCLKRE); 666 661 mcasp_set_reg(dev->base + DAVINCI_MCASP_RXTDM_REG, mask); 667 662 668 - if ((dev->tdm_slots >= 2) || (dev->tdm_slots <= 32)) 663 + if ((dev->tdm_slots >= 2) && (dev->tdm_slots <= 32)) 669 664 mcasp_mod_bits(dev->base + DAVINCI_MCASP_RXFMCTL_REG, 670 665 FSRMOD(dev->tdm_slots), FSRMOD(0x1FF)); 671 666 else
+4 -4
sound/soc/samsung/goni_wm8994.c
··· 236 236 .name = "WM8994", 237 237 .stream_name = "WM8994 HiFi", 238 238 .cpu_dai_name = "samsung-i2s.0", 239 - .codec_dai_name = "wm8994-hifi", 239 + .codec_dai_name = "wm8994-aif1", 240 240 .platform_name = "samsung-audio", 241 - .codec_name = "wm8994-codec.0-0x1a", 241 + .codec_name = "wm8994-codec.0-001a", 242 242 .init = goni_wm8994_init, 243 243 .ops = &goni_hifi_ops, 244 244 }, { 245 245 .name = "WM8994 Voice", 246 246 .stream_name = "Voice", 247 247 .cpu_dai_name = "goni-voice-dai", 248 - .codec_dai_name = "wm8994-voice", 248 + .codec_dai_name = "wm8994-aif2", 249 249 .platform_name = "samsung-audio", 250 - .codec_name = "wm8994-codec.0-0x1a", 250 + .codec_name = "wm8994-codec.0-001a", 251 251 .ops = &goni_voice_ops, 252 252 }, 253 253 };
+3 -1
sound/usb/format.c
··· 176 176 if (!rate) 177 177 continue; 178 178 /* C-Media CM6501 mislabels its 96 kHz altsetting */ 179 + /* Terratec Aureon 7.1 USB C-Media 6206, too */ 179 180 if (rate == 48000 && nr_rates == 1 && 180 181 (chip->usb_id == USB_ID(0x0d8c, 0x0201) || 181 - chip->usb_id == USB_ID(0x0d8c, 0x0102)) && 182 + chip->usb_id == USB_ID(0x0d8c, 0x0102) || 183 + chip->usb_id == USB_ID(0x0ccd, 0x00b1)) && 182 184 fp->altsetting == 5 && fp->maxpacksize == 392) 183 185 rate = 96000; 184 186 /* Creative VF0470 Live Cam reports 16 kHz instead of 8kHz */
+1
sound/usb/quirks.c
··· 533 533 534 534 case USB_ID(0x0d8c, 0x0102): 535 535 /* C-Media CM6206 / CM106-Like Sound Device */ 536 + case USB_ID(0x0ccd, 0x00b1): /* Terratec Aureon 7.1 USB */ 536 537 return snd_usb_cm6206_boot_quirk(dev); 537 538 538 539 case USB_ID(0x133e, 0x0815):
+10 -6
tools/perf/Makefile
··· 43 43 -e s/ppc.*/powerpc/ -e s/mips.*/mips/ \ 44 44 -e s/sh[234].*/sh/ ) 45 45 46 + CC = $(CROSS_COMPILE)gcc 47 + AR = $(CROSS_COMPILE)ar 48 + 46 49 # Additional ARCH settings for x86 47 50 ifeq ($(ARCH),i386) 48 51 ARCH := x86 49 52 endif 50 53 ifeq ($(ARCH),x86_64) 51 - RAW_ARCH := x86_64 52 - ARCH := x86 53 - ARCH_CFLAGS := -DARCH_X86_64 54 - ARCH_INCLUDE = ../../arch/x86/lib/memcpy_64.S 54 + ARCH := x86 55 + IS_X86_64 := $(shell echo __x86_64__ | ${CC} -E -xc - | tail -n 1) 56 + ifeq (${IS_X86_64}, 1) 57 + RAW_ARCH := x86_64 58 + ARCH_CFLAGS := -DARCH_X86_64 59 + ARCH_INCLUDE = ../../arch/x86/lib/memcpy_64.S 60 + endif 55 61 endif 56 62 57 63 # ··· 133 127 134 128 export prefix bindir sharedir sysconfdir 135 129 136 - CC = $(CROSS_COMPILE)gcc 137 - AR = $(CROSS_COMPILE)ar 138 130 RM = rm -f 139 131 MKDIR = mkdir 140 132 FIND = find