06 Mar, 2008

4 commits

  • Fix the following warnings:
    WARNING: vmlinux.o(.text+0xfe6711): Section mismatch in reference from the function cpufreq_unregister_driver() to the variable .cpuinit.data:cpufreq_cpu_notifier
    WARNING: vmlinux.o(.text+0xfe68af): Section mismatch in reference from the function cpufreq_register_driver() to the variable .cpuinit.data:cpufreq_cpu_notifier
    WARNING: vmlinux.o(.exit.text+0xc4fa): Section mismatch in reference from the function cpufreq_stats_exit() to the variable .cpuinit.data:cpufreq_stat_cpu_notifier

    The warnings were casued by references to unregister_hotcpu_notifier()
    from normal functions or exit functions.
    This is flagged by modpost as a potential error because
    it does not know that for the non HOTPLUG_CPU
    scenario the unregister_hotcpu_notifier() is a nop.
    Silence the warning by replacing the __initdata
    annotation with a __refdata annotation.

    Signed-off-by: Sam Ravnborg
    Signed-off-by: Dave Jones

    Sam Ravnborg
     
  • We don't need to printk a message every time we transition.
    Leave the code there, but ifdef'd out, as it's useful when
    adding support for new processors.

    Reported-by: Petr Titěra
    Signed-off-by: Dave Jones

    Dave Jones
     
  • refactor to use gotos instead of explicit exit paths

    Signed-off-by: Dave Jones

    Dave Jones
     
  • refactor to use gotos instead of explicit exit paths

    Signed-off-by: Dave Jones

    Dave Jones
     

05 Mar, 2008

36 commits

  • Linus Torvalds
     
  • A change after 2.6.24 broke ndiswrapper by accidentally removing its
    access to GPL-only symbols. Revert that change and add comments about
    the reasons why ndiswrapper and driverloader are treated in a special
    way.

    Signed-off-by: Pavel Roskin
    Acked-by: Greg KH
    Acked-by: Ingo Molnar
    Cc: Rusty Russell
    Cc: Jon Masters
    Signed-off-by: Linus Torvalds

    Pavel Roskin
     
  • * git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6: (22 commits)
    [IPCONFIG]: The kernel gets no IP from some DHCP servers
    b43legacy: Fix module init message
    rndis_wlan: fix broken data copy
    libertas: compare the current command with response
    libertas: fix sanity check on sequence number in command response
    p54: fix eeprom parser length sanity checks
    p54: fix EEPROM structure endianness
    ssb: Add pcibios_enable_device() return value check
    rc80211-pid: fix rate adjustment
    [ESP]: Add select on AUTHENC
    [TCP]: Improve ipv4 established hash function.
    [NETPOLL]: Revert two bogus cleanups that broke netconsole.
    [PPPOL2TP]: Add missing sock_put() in pppol2tp_tunnel_closeall()
    Subject: [PPPOL2TP] add missing sock_put() in pppol2tp_recv_dequeue()
    [BLUETOOTH]: l2cap info_timer delete fix in hci_conn_del
    [NET]: Fix race in generic address resolution.
    iucv: fix build error on !SMP
    [TCP]: Must count fack_count also when skipping
    [TUN]: Fix RTNL-locking in tun/tap driver
    [SCTP]: Use proc_create to setup de->proc_fops.
    ...

    Linus Torvalds
     
  • * git://git.kernel.org/pub/scm/linux/kernel/git/davem/sparc-2.6:
    [SPARC]: Fix link errors with gcc-4.3
    sparc64: replace remaining __FUNCTION__ occurances
    sparc: replace remaining __FUNCTION__ occurances
    [SPARC]: Add reboot_command[] extern decl to asm/system.h
    [SPARC]: Mark linux_sparc_{fpu,chips} static.

    Linus Torvalds
     
  • From: Stephen Hemminger

    Based upon a patch by Marcel Wappler:

    This patch fixes a DHCP issue of the kernel: some DHCP servers
    (i.e. in the Linksys WRT54Gv5) are very strict about the contents
    of the DHCPDISCOVER packet they receive from clients.

    Table 5 in RFC2131 page 36 requests the fields 'ciaddr' and
    'siaddr' MUST be set to '0'. These DHCP servers ignore Linux
    kernel's DHCP discovery packets with these two fields set to
    '255.255.255.255' (in contrast to popular DHCP clients, such as
    'dhclient' or 'udhcpc'). This leads to a not booting system.

    Signed-off-by: David S. Miller

    Stephen Hemminger
     
  • David S. Miller
     
  • * 'release' of git://git.kernel.org/pub/scm/linux/kernel/git/aegl/linux-2.6:
    [IA64] fix ia64 kprobes compilation
    [IA64] move gcc_intrin.h from header-y to unifdef-y
    [IA64] workaround tiger ia64_sal_get_physical_id_info hang
    [IA64] move defconfig to arch/ia64/configs/
    [IA64] Fix irq migration in multiple vector domain
    [IA64] signal(ia64_ia32): add a signal stack overflow check
    [IA64] signal(ia64): add a signal stack overflow check
    [IA64] CONFIG_SGI_SN2 - auto select NUMA and ACPI_NUMA

    Linus Torvalds
     
  • * git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/driver-2.6:
    debugfs: fix sparse warnings
    Driver core: Fix cleanup when failing device_add().
    driver core: Remove dpm_sysfs_remove() from error path of device_add()
    PM: fix new mutex-locking bug in the PM core
    PM: Do not acquire device semaphores upfront during suspend
    kobject: properly initialize ksets
    sysfs: CONFIG_SYSFS_DEPRECATED fix
    driver core: fix up Kconfig text for CONFIG_SYSFS_DEPRECATED

    Linus Torvalds
     
  • * git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/pci-2.6:
    pci: hotplug: pciehp: fix error code path in hpc_power_off_slot
    PCI: Add DECLARE_PCI_DEVICE_TABLE macro
    PCI: fix up error messages for pci_bus registering
    PCI: fix section mismatch warning in pci_scan_child_bus
    PCI: consolidate duplicated MSI enable functions
    PCI: use dev_printk in quirk messages

    Linus Torvalds
     
  • * git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb-2.6:
    USB: ftdi_sio - really enable EM1010PC
    USB: remove incorrect struct class_device from the printer gadget
    USB: pxa2xx_udc: fix misuse of clock enable/disable calls
    USB: ftdi_sio: Workaround for broken Matrix Orbital serial port
    USB: Add support for AXESSTEL MV110H CDMA modem
    usb-storage: update earlier scatter-gather bug fix
    USB: isp116x: fix enumeration on boot
    USB: ehci: handle large bulk URBs correctly (again)
    USB: spruce up the device blacklist
    USB: fix comment of struct usb_interface
    USB: update Kconfig entry for USB_SUSPEND
    usb: Add support for the mos7820/7840-based B&B USB/RS485 converter to mos7840.c

    Linus Torvalds
     
  • Fix a bug in regiseter_kretprobe() which does not check rp->kp.symbol_name ==
    NULL before calling kprobe_lookup_name.

    For maintainability, this introduces kprobe_addr helper function which
    resolves addr field. It is used by register_kprobe and register_kretprobe.

    Signed-off-by: Masami Hiramatsu
    Cc: Ananth N Mavinakayanahalli
    Cc: Jim Keniston
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Masami Hiramatsu
     
  • Add to help text that the Intel I2C ICH (i801) driver is also needed
    for this kernel.

    Add LEDS_CLASS to config since the driver makes les_classdev_*() calls:
    ERROR: "led_classdev_register" [drivers/input/misc/apanel.ko] undefined!
    ERROR: "__led_classdev_unregister" [drivers/input/misc/apanel.ko]
    undefined!

    Signed-off-by: Randy Dunlap
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Randy Dunlap
     
  • The "resize" option won't be noticed as it comes after the NULL option, so if
    you try to mount (or in this case remount) with that option it won't be
    recognized.

    Signed-off-by: Josef Bacik
    Cc:
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Josef Bacik
     
  • Adam Litke noticed that currently we grow the hugepage pool independent of any
    cpuset the running process may be in, but when shrinking the pool, the cpuset
    is checked. This leads to inconsistency when shrinking the pool in a
    restricted cpuset -- an administrator may have been able to grow the pool on a
    node restricted by a containing cpuset, but they cannot shrink it there.

    There are two options: either prevent growing of the pool outside of the
    cpuset or allow shrinking outside of the cpuset. >From previous discussions
    on linux-mm, /proc/sys/vm/nr_hugepages is an administrative interface that
    should not be restricted by cpusets. So allow shrinking the pool by removing
    pages from nodes outside of current's cpuset.

    Signed-off-by: Nishanth Aravamudan
    Acked-by: Adam Litke
    Cc: William Irwin
    Cc: Lee Schermerhorn
    Cc: Christoph Lameter
    Cc: Paul Jackson
    Cc: David Gibson
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Nishanth Aravamudan
     
  • A hugetlb reservation may be inadequately backed in the event of racing
    allocations and frees when utilizing surplus huge pages. Consider the
    following series of events in processes A and B:

    A) Allocates some surplus pages to satisfy a reservation
    B) Frees some huge pages
    A) A notices the extra free pages and drops hugetlb_lock to free some of
    its surplus pages back to the buddy allocator.
    B) Allocates some huge pages
    A) Reacquires hugetlb_lock and returns from gather_surplus_huge_pages()

    Avoid this by commiting the reservation after pages have been allocated but
    before dropping the lock to free excess pages. For parity, release the
    reservation in return_unused_surplus_pages().

    This patch also corrects the cpuset_mems_nr() error path in
    hugetlb_acct_memory(). If the cpuset check fails, uncommit the
    reservation, but also be sure to return any surplus huge pages that may
    have been allocated to back the failed reservation.

    Thanks to Andy Whitcroft for discovering this.

    Signed-off-by: Adam Litke
    Cc: Mel Gorman
    Cc: Andy Whitcroft
    Cc: Dave Hansen
    Cc: William Lee Irwin III
    Cc: Andy Whitcroft
    Cc: Mel Gorman
    Cc: David Gibson
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Adam Litke
     
  • This message describes another issue about md RAID10 found by testing the
    2.6.24 md RAID10 using new scsi fault injection framework.

    Abstract:

    When a scsi error results in disabling a disk during RAID10 recovery, the
    resync threads of md RAID10 could stall.

    This case, the raid array has already been broken and it may not matter. But
    I think stall is not preferable. If it occurs, even shutdown or reboot will
    fail because of resource busy.

    The deadlock mechanism:

    The r10bio_s structure has a "remaining" member to keep track of BIOs yet to
    be handled when recovering. The "remaining" counter is incremented when
    building a BIO in sync_request() and is decremented when finish a BIO in
    end_sync_write().

    If building a BIO fails for some reasons in sync_request(), the "remaining"
    should be decremented if it has already been incremented. I found a case
    where this decrement is forgotten. This causes a md_do_sync() deadlock
    because md_do_sync() waits for md_done_sync() called by end_sync_write(), but
    end_sync_write() never calls md_done_sync() because of the "remaining" counter
    mismatch.

    For example, this problem would be reproduced in the following case:

    Personalities : [raid10]
    md0 : active raid10 sdf1[4] sde1[5](F) sdd1[2] sdc1[1] sdb1[6](F)
    3919616 blocks 64K chunks 2 near-copies [4/2] [_UU_]
    [>....................] recovery = 2.2% (45376/1959808) finish=0.7min speed=45376K/sec

    This case, sdf1 is recovering, sdb1 and sde1 are disabled.
    An additional error with detaching sdd will cause a deadlock.

    md0 : active raid10 sdf1[4] sde1[5](F) sdd1[6](F) sdc1[1] sdb1[7](F)
    3919616 blocks 64K chunks 2 near-copies [4/1] [_U__]
    [=>...................] recovery = 5.0% (99520/1959808) finish=5.9min speed=5237K/sec

    2739 ? S< 0:17 [md0_raid10]
    28608 ? D< 0:00 [md0_resync]
    28629 pts/1 Ss 0:00 bash
    28830 pts/1 R+ 0:00 ps ax
    31819 ? D< 0:00 [kjournald]

    The resync thread keeps working, but actually it is deadlocked.

    Patch:
    By this patch, the remaining counter will be decremented if needed.

    Signed-off-by: Neil Brown
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    K.Tanaka
     
  • Thanks to K.Tanaka and the scsi fault injection framework, here is a fix for
    another possible deadlock in raid1/raid10 error handing.

    If a read request returns an error while a resync is happening and a resync
    request is pending, the attempt to fix the error will block until the resync
    progresses, and the resync will block until the read request completes. Thus
    a deadlock.

    This patch fixes the problem.

    Cc: "K.Tanaka"
    Signed-off-by: Neil Brown
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    NeilBrown
     
  • This patch changes the disk to be read for layout "far > 1" to always be the
    disk with the lowest block address.

    Thus the chunks to be read will always be (for a fully functioning array) from
    the first band of stripes, and the raid will then work as a raid0 consisting
    of the first band of stripes.

    Some advantages:

    The fastest part which is the outer sectors of the disks involved will be
    used. The outer blocks of a disk may be as much as 100 % faster than the
    inner blocks.

    Average seek time will be smaller, as seeks will always be confined to the
    first part of the disks.

    Mixed disks with different performance characteristics will work better, as
    they will work as raid0, the sequential read rate will be number of disks
    involved times the IO rate of the slowest disk.

    If a disk is malfunctioning, the first disk which is working, and has the
    lowest block address for the logical block will be used.

    Signed-off-by: Keld Simonsen
    Signed-off-by: Neil Brown
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Keld Simonsen
     
  • When we access attributes of an rdev (component device on an md array) through
    sysfs, we really need to lock the array against concurrent changes. We
    currently do that when we change an attribute, but not when we read an
    attribute. We need to lock when reading as well else rdev->mddev could become
    NULL while we are accessing it.

    So add appropriate locking (mddev_lock) to rdev_attr_show.

    rdev_size_store requires some extra care as well as it needs to unlock the
    mddev while scanning other mddevs for overlapping regions. We currently
    assume that rdev->mddev will still be unchanged after the scan, but that
    cannot be certain. So take a copy of rdev->mddev for use at the end of the
    function.

    Signed-off-by: Neil Brown
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    NeilBrown
     
  • A resync/reshape/recovery thread will refuse to progress when the array is
    marked read-only. So whenever it mark it not read-only, it is important to
    wake up thread resync thread. There is one place we didn't do this.

    The problem manifests if the start_ro module parameters is set, and a raid5
    array that is in the middle of a reshape (restripe) is started. The array
    will initially be semi-read-only (meaning it acts like it is readonly until
    the first write). So the reshape will not proceed.

    On the first write, the array will become read-write, but the reshape will not
    be started, and there is no event which will ever restart that thread.

    Signed-off-by: Neil Brown
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    NeilBrown
     
  • When a raid1 array is stopped, all components currently get added to the list
    for auto-detection. However we should really only add components that were
    found by autodetection in the first place. So add a flag to record that
    information, and use it.

    Signed-off-by: Neil Brown
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    NeilBrown
     
  • Make sure the data doesn't start before the end of the superblock when the
    superblock is at the start of the device.

    Signed-off-by: Neil Brown
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    NeilBrown
     
  • On an md array with a write-intent bitmap, a thread wakes up every few seconds
    and scans the bitmap looking for work to do. If the array is idle, there will
    be no work to do, but a lot of scanning is done to discover this.

    So cache the fact that the bitmap is completely clean, and avoid scanning the
    whole bitmap when the cache is known to be clean.

    Signed-off-by: Neil Brown
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    NeilBrown
     
  • When handling a read error, we freeze the array to stop any other IO while
    attempting to over-write with correct data.

    This is done in the raid1d(raid10d) thread and must wait for all submitted IO
    to complete (except for requests that failed and are sitting in the retry
    queue - these are counted in ->nr_queue and will stay there during a freeze).

    However write requests need attention from raid1d as bitmap updates might be
    required. This can cause a deadlock as raid1 is waiting for requests to
    finish that themselves need attention from raid1d.

    So we create a new function 'flush_pending_writes' to give that attention, and
    call it in freeze_array to be sure that we aren't waiting on raid1d.

    Thanks to "K.Tanaka" for finding and reporting this
    problem.

    Cc: "K.Tanaka"
    Signed-off-by: Neil Brown
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    NeilBrown
     
  • Make PARISC's two IOMMU implementations not allocate a memory area spanning
    LLD's segment boundary.

    [akpm@linux-foundation.org: coding-style fixes]
    Signed-off-by: FUJITA Tomonori
    Cc: Kyle McMartin
    Cc: Matthew Wilcox
    Cc: Grant Grundler
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    FUJITA Tomonori
     
  • This adds struct device argument to sba_alloc_range and ccio_alloc_range, a
    preparation for modifications to fix the IOMMU segment boundary problem. This
    change enables ccio_alloc_range to access to LLD's segment boundary limits.

    [akpm@linux-foundation.org: coding-style fixes]
    Signed-off-by: FUJITA Tomonori
    Cc: Kyle McMartin
    Cc: Matthew Wilcox
    Cc: Grant Grundler
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    FUJITA Tomonori
     
  • iommu_is_span_boundary is used internally in the IOMMU helper
    (lib/iommu-helper.c), a primitive function that judges whether a memory area
    spans LLD's segment boundary or not.

    It's difficult to convert some IOMMUs to use the IOMMU helper but
    iommu_is_span_boundary is still useful for them. So this patch exports it.

    This is needed for the parisc iommu fixes.

    Signed-off-by: FUJITA Tomonori
    Cc: Kyle McMartin
    Cc: Matthew Wilcox
    Cc: Grant Grundler
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    FUJITA Tomonori
     
  • After a quick glance at the code, we're getting the DEBUG_SHIRQ spurious
    interrupt before we have the adapter template filled in. Real interrupts
    appear to be turned on by fcpci*_init(), so move request_irq until just before
    that.

    Signed-off-by: Kyle McMartin
    Cc: Karsten Keil
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Kyle McMartin
     
  • When the page is not up to date, ecryptfs_prepare_write() should be
    acting much like ecryptfs_readpage(). This includes the painfully
    obvious step of actually decrypting the page contents read from the
    lower encrypted file.

    Note that this patch resolves a bug in eCryptfs in 2.6.24 that one can
    produce with these steps:

    # mount -t ecryptfs /secret /secret
    # echo "abc" > /secret/file.txt
    # umount /secret
    # mount -t ecryptfs /secret /secret
    # echo "def" >> /secret/file.txt
    # cat /secret/file.txt

    Without this patch, the resulting data returned from cat is likely to
    be something other than "abc\ndef\n".

    (Thanks to Benedikt Driessen for reporting this.)

    Signed-off-by: Michael Halcrow
    Cc: Benedikt Driessen
    Cc:
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Michael Halcrow
     
  • Last commit for unistd was not correct, it only had a partial update of
    syscall numbers for __NR_timerfd_settime and __NR_timerfd_gettime. Also,
    NR_syscalls was not incremented for the new syscalls.

    Signed-off-by: Jesper Nilsson
    Cc: Mikael Starvik
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Jesper Nilsson
     
  • Function __copy_user_zeroing in arch/lib/usercopy.c had the wrong parameter
    set as __user, and in include/asm-cris/uaccess.h, it was not set at all for
    some of the calling functions.

    This will cut the number of warnings quite dramatically when using sparse.

    While we're here, remove useless CVS log and correct confusing typo.

    Signed-off-by: Jesper Nilsson
    Cc: Mikael Starvik
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Jesper Nilsson
     
  • I used the wrong return convention on hotkey_get_tablet_mode(), breaking a lot
    of stuff. Bad Henrique!

    Fix it to return the status in the parameter-by-reference, and IO status on
    the function return value. Duh.

    Signed-off-by: Henrique de Moraes Holschuh
    Cc: Zdenek Kabelac
    Cc: "Rafael J. Wysocki"
    Cc: Lukas Hejtmanek
    Cc: Len Brown
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Henrique de Moraes Holschuh
     
  • In commit e6bafba5b4765a5a252f1b8d31cbf6d2459da337 ("wmi: (!x & y)
    strikes again"), a bug was fixed that involved converting !x & y to !(x
    & y). The code below shows the same pattern, and thus should perhaps be
    fixed in the same way.

    This is not tested and clearly changes the semantics, so it is only
    something to consider.

    The semantic patch that makes this change is as follows:
    (http://www.emn.fr/x-info/coccinelle/)

    //
    @@ expression E1,E2; @@
    (
    !E1 & !E2
    |
    - !E1 & E2
    + !(E1 & E2)
    )
    //

    Signed-off-by: Julia Lawall
    Cc: Chris Mason
    Cc: Jeff Mahoney
    Cc: Jan Kara
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Julia Lawall
     
  • In commit e6bafba5b4765a5a252f1b8d31cbf6d2459da337 ("wmi: (!x & y)
    strikes again"), a bug was fixed that involved converting !x & y to !(x
    & y). The code below shows the same pattern, and thus should perhaps be
    fixed in the same way.

    This is not tested and clearly changes the semantics, so it is only
    something to consider.

    The semantic patch that makes this change is as follows:
    (http://www.emn.fr/x-info/coccinelle/)

    //
    @@ expression E1,E2; @@
    (
    !E1 & !E2
    |
    - !E1 & E2
    + !(E1 & E2)
    )
    //

    Signed-off-by: Julia Lawall
    Cc: Hirokazu Takata
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Julia Lawall
     
  • In commit e6bafba5b4765a5a252f1b8d31cbf6d2459da337 ("wmi: (!x & y)
    strikes again"), a bug was fixed that involved converting !x & y to !(x
    & y). The code below shows the same pattern, and thus should perhaps be
    fixed in the same way.

    This is not tested and clearly changes the semantics, so it is only
    something to consider.

    The semantic patch that makes this change is as follows:
    (http://www.emn.fr/x-info/coccinelle/)

    //
    @@ expression E1,E2; @@
    (
    !E1 & !E2
    |
    - !E1 & E2
    + !(E1 & E2)
    )
    //

    Signed-off-by: Julia Lawall
    Cc: Karsten Keil
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Julia Lawall
     
  • In commit e6bafba5b4765a5a252f1b8d31cbf6d2459da337 ("wmi: (!x & y)
    strikes again"), a bug was fixed that involved converting !x & y to !(x
    & y). The code below shows the same pattern, and thus should perhaps be
    fixed in the same way.

    This is not tested and clearly changes the semantics, so it is only
    something to consider.

    The semantic patch that makes this change is as follows:
    (http://www.emn.fr/x-info/coccinelle/)

    //
    @@ expression E1,E2; @@
    (
    !E1 & !E2
    |
    - !E1 & E2
    + !(E1 & E2)
    )
    //

    Signed-off-by: Julia Lawall
    Cc: Jiri Slaby
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Julia Lawall