17 Nov, 2008

1 commit

  • Impact: fix DMA buffer allocation coherency bug in certain configs

    This patch fixes swiotlb to use dev->coherent_dma_mask in
    swiotlb_alloc_coherent().

    coherent_dma_mask is a subset of dma_mask (equal to it most of
    the time), enumerating the address range that a given device
    is able to DMA to/from in a cache-coherent way.

    But currently, swiotlb uses dev->dma_mask in alloc_coherent()
    implicitly via address_needs_mapping(), but alloc_coherent is really
    supposed to use coherent_dma_mask.

    This bug could break drivers that uses smaller coherent_dma_mask than
    dma_mask (though the current code works for the majority that use the
    same mask for coherent_dma_mask and dma_mask).

    Signed-off-by: FUJITA Tomonori
    Cc: tony.luck@intel.com
    Signed-off-by: Ingo Molnar

    FUJITA Tomonori
     

16 Nov, 2008

18 commits

  • Neil has been the maintainer of the RAID/MD code for a long time,
    remove me as a co-maintainer.

    Signed-off-by: Ingo Molnar

    Ingo Molnar
     
  • Linus Torvalds
     
  • Inotify watch removals suck violently.

    To kick the watch out we need (in this order) inode->inotify_mutex and
    ih->mutex. That's fine if we have a hold on inode; however, for all
    other cases we need to make damn sure we don't race with umount. We can
    *NOT* just grab a reference to a watch - inotify_unmount_inodes() will
    happily sail past it and we'll end with reference to inode potentially
    outliving its superblock.

    Ideally we just want to grab an active reference to superblock if we
    can; that will make sure we won't go into inotify_umount_inodes() until
    we are done. Cleanup is just deactivate_super().

    However, that leaves a messy case - what if we *are* racing with
    umount() and active references to superblock can't be acquired anymore?
    We can bump ->s_count, grab ->s_umount, which will almost certainly wait
    until the superblock is shut down and the watch in question is pining
    for fjords. That's fine, but there is a problem - we might have hit the
    window between ->s_active getting to 0 / ->s_count - below S_BIAS (i.e.
    the moment when superblock is past the point of no return and is heading
    for shutdown) and the moment when deactivate_super() acquires
    ->s_umount.

    We could just do drop_super() yield() and retry, but that's rather
    antisocial and this stuff is luser-triggerable. OTOH, having grabbed
    ->s_umount and having found that we'd got there first (i.e. that
    ->s_root is non-NULL) we know that we won't race with
    inotify_umount_inodes().

    So we could grab a reference to watch and do the rest as above, just
    with drop_super() instead of deactivate_super(), right? Wrong. We had
    to drop ih->mutex before we could grab ->s_umount. So the watch
    could've been gone already.

    That still can be dealt with - we need to save watch->wd, do idr_find()
    and compare its result with our pointer. If they match, we either have
    the damn thing still alive or we'd lost not one but two races at once,
    the watch had been killed and a new one got created with the same ->wd
    at the same address. That couldn't have happened in inotify_destroy(),
    but inotify_rm_wd() could run into that. Still, "new one got created"
    is not a problem - we have every right to kill it or leave it alone,
    whatever's more convenient.

    So we can use idr_find(...) == watch && watch->inode->i_sb == sb as
    "grab it and kill it" check. If it's been our original watch, we are
    fine, if it's a newcomer - nevermind, just pretend that we'd won the
    race and kill the fscker anyway; we are safe since we know that its
    superblock won't be going away.

    And yes, this is far beyond mere "not very pretty"; so's the entire
    concept of inotify to start with.

    Signed-off-by: Al Viro
    Acked-by: Greg KH
    Signed-off-by: Linus Torvalds

    Al Viro
     
  • The file(s) below do not use LINUX_VERSION_CODE nor KERNEL_VERSION.
    drivers/hwmon/lis3lv02d.c

    This patch removes the said #include .

    Signed-off-by: Huang Weiyi
    Signed-off-by: Linus Torvalds

    Huang Weiyi
     
  • * 'sh/for-2.6.28' of git://git.kernel.org/pub/scm/linux/kernel/git/lethal/sh-2.6:
    serial: sh-sci: Reorder the SCxTDR write after the TDxE clear.
    sh: __copy_user function can corrupt the stack in case of exception
    sh: Fixed the TMU0 reload value on resume
    sh: Don't factor in PAGE_OFFSET for valid_phys_addr_range() check.
    sh: early printk port type fix
    i2c: fix i2c-sh_mobile rx underrun
    sh: Provide a sane valid_phys_addr_range() to prevent TLB reset with PMB.
    usb: r8a66597-hcd: fix wrong data access in SuperH on-chip USB
    fix sci type for SH7723
    serial: sh-sci: fix cannot work SH7723 SCIFA
    sh: Handle fixmap TLB eviction more coherently.

    Linus Torvalds
     
  • * 'doc-subdirs' of git://git.kernel.org/pub/scm/linux/kernel/git/rdunlap/linux-docs:
    Create/use more directory structure in the Documentation/ tree.

    Linus Torvalds
     
  • A common reason for device drivers to implement their own printk macros
    is the lack of a printk prefix with the standard pr_xyz macros.
    Introduce a pr_fmt() macro that is applied for every pr_xyz macro to the
    format string.

    The most common use of the pr_fmt macro would be to add the name of the
    device driver to all pr_xyz messages in a source file.

    Signed-off-by: Martin Schwidefsky
    Signed-off-by: Linus Torvalds

    Martin Schwidefsky
     
  • * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/ericvh/v9fs:
    9p: restrict RDMA usage

    Linus Torvalds
     
  • * 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6:
    V4L/DVB (9624): CVE-2008-5033: fix OOPS on tvaudio when controlling bass/treble
    V4L/DVB (9623): tvaudio: Improve debug msg by printing something more human
    V4L/DVB (9622): tvaudio: Improve comments and remove a unneeded prototype
    V4L/DVB (9621): Avoid writing outside shadow.bytes[] array
    V4L/DVB (9620): tvaudio: use a direct reference for chip description
    V4L/DVB (9619): tvaudio: update initial comments
    V4L/DVB (9618): tvaudio: add additional logic to avoid OOPS
    V4L/DVB (9617): tvtime: remove generic_checkmode callback
    V4L/DVB (9616): tvaudio: cleanup - group all callbacks together
    V4L/DVB (9615): tvaudio: instead of using a magic number, use ARRAY_SIZE
    V4L/DVB (9613): tvaudio: fix a memory leak

    Linus Torvalds
     
  • * 'for-linus' of git://git390.osdl.marist.edu/pub/scm/linux-2.6:
    [S390] fix s390x_newuname
    [S390] dasd: log sense for fatal errors
    [S390] cpu topology: fix locking
    [S390] cio: Fix refcount after moving devices.
    [S390] ftrace: fix kernel stack backchain walking
    [S390] ftrace: disable tracing on idle psw
    [S390] lockdep: fix compile bug
    [S390] kvm_s390: Fix oops in virtio device detection with "mem="
    [S390] sclp: emit error message if assign storage fails
    [S390] Fix range for add_active_range() in setup_memory()

    Linus Torvalds
     
  • * git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi-rc-fixes-2.6:
    [SCSI] dpt_i2o: fix transferred data length for scsi_set_resid()
    [SCSI] scsi_error regression: Fix idempotent command handling
    [SCSI] zfcp: Fix hexdump data in s390dbf traces
    [SCSI] zfcp: fix erp timeout cleanup for port open requests
    [SCSI] zfcp: Wait for port scan to complete when setting adapter online
    [SCSI] zfcp: Fix cast warning
    [SCSI] zfcp: Fix request list handling in error path
    [SCSI] zfcp: fix mempool usage for status_read requests
    [SCSI] zfcp: fix req_list_locking.
    [SCSI] zfcp: Dont clear reference from SCSI device to unit
    [SCSI] qla2xxx: Update version number to 8.02.01-k9.
    [SCSI] qla2xxx: Return a FAILED status when abort mailbox-command fails.
    [SCSI] qla2xxx: Do not honour max_vports from firmware for 2G ISPs and below.
    [SCSI] qla2xxx: Use pci_disable_rom() to manipulate PCI config space.
    [SCSI] qla2xxx: Correct Atmel flash-part handling.
    [SCSI] megaraid: fix mega_internal_command oops

    Linus Torvalds
     
  • This reverts commit e51af6630848406fc97adbd71443818cdcda297b, which was
    wrongly hoovered up and submitted about a month after a better fix had
    already been merged.

    The better fix is commit cbda1ba898647aeb4ee770b803c922f595e97731
    ("PCI/iommu: blacklist DMAR on Intel G31/G33 chipsets"), where we do
    this blacklisting based on the DMI identification for the offending
    motherboard, since sometimes this chipset (or at least a chipset with
    the same PCI ID) apparently _does_ actually have an IOMMU.

    Signed-off-by: David Woodhouse
    Signed-off-by: Linus Torvalds

    David Woodhouse
     
  • Hugh Dickins reported show_page_path() is buggy and unsafe because

    - lack dput() against d_find_alias()
    - don't concern vma->vm_mm->owner == NULL
    - lack lock_page()

    it was only for debugging, so rather than trying to fix it, just remove
    it now.

    Reported-by: Hugh Dickins
    Signed-off-by: Hugh Dickins
    Signed-off-by: KOSAKI Motohiro
    CC: Lee Schermerhorn
    CC: Rik van Riel
    Signed-off-by: Linus Torvalds

    KOSAKI Motohiro
     
  • m68k allmodconfig:

    | drivers/misc/c2port/core.c: In function 'c2port_reset':
    | drivers/misc/c2port/core.c:73: error: dereferencing pointer to incomplete type
    | drivers/misc/c2port/core.c: In function 'c2port_strobe_ck':
    | drivers/misc/c2port/core.c:91: error: dereferencing pointer to incomplete type

    Include to fix it, as m68k's local_irq_enable() needs to know
    about struct task_struct.

    Signed-off-by: Geert Uytterhoeven
    Signed-off-by: Linus Torvalds

    Geert Uytterhoeven
     
  • commit 69961c375288bdab7604e0bb1c8d22999bb8a347 ("[PATCH] m68k/Atari:
    Interrupt updates") added a BUG_ON() with an incorrect upper bound
    comparison, which causes an early crash on VME boards, where IRQ_USER is
    8, cnt is 192 and NR_IRQS is 200.

    Reported-by: Stephen N Chivers
    Tested-by: Kars de Jong
    Signed-off-by: Geert Uytterhoeven
    Cc: stable@kernel.org
    Signed-off-by: Linus Torvalds

    Geert Uytterhoeven
     
  • * 'upstream-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jgarzik/libata-dev:
    libata: improve phantom device detection

    Linus Torvalds
     
  • We don't want to get rid of the futexes just at exit() time, we want to
    drop them when doing an execve() too, since that gets rid of the
    previous VM image too.

    Doing it at mm_release() time means that we automatically always do it
    when we disassociate a VM map from the task.

    Reported-by: pageexec@freemail.hu
    Cc: Andrew Morton
    Cc: Nick Piggin
    Cc: Hugh Dickins
    Cc: Ingo Molnar
    Cc: Thomas Gleixner
    Cc: Brad Spengler
    Cc: Alex Efros
    Cc: Peter Zijlstra
    Cc: Oleg Nesterov
    Signed-off-by: Linus Torvalds

    Linus Torvalds
     
  • dpt_i2o.c::adpt_i2o_to_scsi() reads the value at (reply+5) which
    should contain the length in bytes of the transferred data. This
    would be correct if reply was a u32 *. However it is a void * here,
    so we need to read the value at (reply+20) instead.

    The value at (reply+5) is usually 0xff0000, which is apparently
    'large enough' and didn't cause any trouble until 2.6.27 where

    commit 427e59f09fdba387547106de7bab980b7fff77be
    Author: James Bottomley
    Date: Sat Mar 8 18:24:17 2008 -0600

    [SCSI] make use of the residue value

    caused this to become visible through e.g. iostat -x .

    Signed-off-by: Miquel van Smoorenburg
    Cc: Stable Tree
    Signed-off-by: James Bottomley

    Miquel van Smoorenburg
     

15 Nov, 2008

21 commits

  • Currently libata uses four methods to detect device presence.

    1. PHY status if available.
    2. TF register R/W test (only promotes presence, never demotes)
    3. device signature after reset
    4. IDENTIFY failure detection in SFF state machine

    Combination of the above works well in most cases but recently there
    have been a few reports where a phantom device causes unnecessary
    delay during probe. In both cases, PHY status wasn't available. In
    one case, it passed #2 and #3 and failed IDENTIFY with ATA_ERR which
    didn't qualify as #4. The other failed #2 but as it passed #3 and #4,
    it still caused failure.

    In both cases, phantom device reported diagnostic failure, so these
    cases can be safely worked around by considering any !ATA_DRQ IDENTIFY
    failure as NODEV_HINT if diagnostic failure is set.

    Signed-off-by: Tejun Heo
    Signed-off-by: Jeff Garzik

    Tejun Heo
     
  • linux-next:

    Make 9p's RDMA option depend on INET since it uses Infiniband rdma_*
    functions and that code depends on INET. Otherwise 9p can try to
    use symbols which don't exist.

    ERROR: "rdma_destroy_id" [net/9p/9pnet_rdma.ko] undefined!
    ERROR: "rdma_connect" [net/9p/9pnet_rdma.ko] undefined!
    ERROR: "rdma_create_id" [net/9p/9pnet_rdma.ko] undefined!
    ERROR: "rdma_create_qp" [net/9p/9pnet_rdma.ko] undefined!
    ERROR: "rdma_resolve_route" [net/9p/9pnet_rdma.ko] undefined!
    ERROR: "rdma_disconnect" [net/9p/9pnet_rdma.ko] undefined!
    ERROR: "rdma_resolve_addr" [net/9p/9pnet_rdma.ko] undefined!

    I used an if/endif block so that the menu items would remain
    presented together.

    Also correct an article adjective.

    Signed-off-by: Randy Dunlap
    Signed-off-by: Eric Van Hensbergen

    Randy Dunlap
     
  • Create Documentation/blockdev/ sub-directory and populate it.
    Populate the Documentation/serial/ sub-directory.
    Move MSI-HOWTO.txt to Documentation/PCI/.
    Move ioctl-number.txt to Documentation/ioctl/.
    Update all relevant 00-INDEX files.
    Update all relevant Kconfig files and source files.

    Signed-off-by: Randy Dunlap

    Randy Dunlap
     
  • The uname system call for 64 bit compares current->personality without
    masking the upper 16 bits. If e.g. READ_IMPLIES_EXEC is set the result
    of a uname system call will always be s390x even if the process uses
    the s390 personality.

    Signed-off-by: Martin Schwidefsky

    Martin Schwidefsky
     
  • The logging of sense data for fatal errors was accidentally removed
    during Hyper PAV implementation.

    Signed-off-by: Stefan Haberland
    Signed-off-by: Martin Schwidefsky

    Stefan Haberland
     
  • cpu_coregroup_map used to grab a mutex on s390 since it was only
    called from process context.
    Since c7c22e4d5c1fdebfac4dba76de7d0338c2b0d832 "block: add support
    for IO CPU affinity" this is not true anymore.
    It now also gets called from softirq context.

    To prevent possible deadlocks change this in architecture code and
    use a spinlock instead of a mutex.

    Cc: stable@kernel.org
    Cc: Jens Axboe
    Signed-off-by: Heiko Carstens
    Signed-off-by: Martin Schwidefsky

    Heiko Carstens
     
  • In ccw_device_move_to_orphanage(), a replacing ccw_device
    is searched via get_{disc,orphaned}_ccwdev_by_dev_id()
    which obtain a reference on the returned ccw_device.
    This reference must be given up again after the device
    has been moved to its new parent.

    Signed-off-by: Cornelia Huck
    Signed-off-by: Martin Schwidefsky

    Cornelia Huck
     
  • With CONFIG_IRQSOFF_TRACER the trace_hardirqs_off() function includes
    a call to __builtin_return_address(1). But we calltrace_hardirqs_off()
    from early entry code. There we have just a single stack frame.
    So this results in a kernel stack backchain walk that would walk beyond
    the kernel stack. Following the NULL terminated backchain this results
    in a lowcore read access.

    To fix this we simply call trace_hardirqs_off_caller() and pass the
    current instruction pointer.

    Signed-off-by: Heiko Carstens
    Signed-off-by: Martin Schwidefsky

    Heiko Carstens
     
  • Disable tracing on idle psw. Otherwise it would give us huge
    preempt off times for idle. Which is rather pointless.

    Signed-off-by: Heiko Carstens
    Signed-off-by: Martin Schwidefsky

    Heiko Carstens
     
  • arch/s390/kernel/built-in.o: In function `cleanup_io_leave_insn':
    mem_detect.c:(.text+0x10592): undefined reference to `lockdep_sys_exit'

    Signed-off-by: Heiko Carstens
    Signed-off-by: Martin Schwidefsky

    Heiko Carstens
     
  • The current virtio model on s390 has the descriptor page above the main
    memory. The guest virtio detection will oops if the mem= parameter is
    used to reduce/change the memory size.
    We have to use real_memory_size instead of max_pfn to detect the virtio
    descriptor pages.

    Signed-off-by: Christian Borntraeger

    Christian Borntraeger
     
  • Signed-off-by: Heiko Carstens
    Signed-off-by: Martin Schwidefsky

    Heiko Carstens
     
  • add_active_range() expects start_pfn + size as end_pfn value, i.e. not
    the pfn of the last page frame but the one behind that.
    We used the pfn of the last page frame so far, which can lead to a
    BUG_ON in move_freepages(), when the kernelcore parameter is specified
    (page_zone(start_page) != page_zone(end_page)).

    Signed-off-by: Gerald Schaefer
    Signed-off-by: Martin Schwidefsky

    Gerald Schaefer
     
  • This bug were supposed to be fixed by 5ba2f67afb02c5302b2898949ed6fc3b3d37dcf1,
    where a call to NULL happens.

    Not all tvaudio chips allow controlling bass/treble. So, the driver
    has a table with a flag to indicate if the chip does support it.

    Unfortunately, the handling of this logic were broken for a very long
    time (probably since the first module version). Due to that, an OOPS
    were generated for devices that don't support bass/treble.

    This were the resulting OOPS message before the patch, with debug messages
    enabled:

    tvaudio' 1-005b: VIDIOC_S_CTRL
    BUG: unable to handle kernel NULL pointer dereference at 00000000
    IP: []
    *pde = 22fda067 *pte = 00000000
    Oops: 0000 [#1] SMP
    Modules linked in: snd_hda_intel snd_seq_dummy snd_seq_oss snd_seq_midi_event snd_seq snd_seq_device
    snd_pcm_oss snd_mixer_oss snd_pcm snd_timer snd_hwdep snd soundcore tuner_simple tuner_types tea5767 tuner
    tvaudio bttv bridgebnep rfcomm l2cap bluetooth it87 hwmon_vid hwmon fuse sunrpc ipt_REJECT
    nf_conntrack_ipv4 iptable_filter ip_tables ip6t_REJECT xt_tcpudp nf_conntrack_ipv6 xt_state nf_conntrack
    ip6table_filter ip6_tables x_tables ipv6 dm_mirrordm_multipath dm_mod configfs videodev v4l1_compat
    ir_common 8139cp compat_ioctl32 v4l2_common 8139too videobuf_dma_sg videobuf_core mii btcx_risc tveeprom
    i915 button snd_page_alloc serio_raw drm pcspkr i2c_algo_bit i2c_i801 i2c_core iTCO_wdt
    iTCO_vendor_support sr_mod cdrom sg ata_generic pata_acpi ata_piix libata sd_mod scsi_mod ext3 jbdmbcache
    uhci_hcd ohci_hcd ehci_hcd [last unloaded: soundcore]

    Pid: 15413, comm: qv4l2 Not tainted (2.6.25.14-108.fc9.i686 #1)
    EIP: 0060:[] EFLAGS: 00210246 CPU: 0
    EIP is at 0x0
    EAX: 00008000 EBX: ebd21600 ECX: e2fd9ec4 EDX: 00200046
    ESI: f8c0f0c4 EDI: f8c0f0c4 EBP: e2fd9d50 ESP: e2fd9d2c
    DS: 007b ES: 007b FS: 00d8 GS: 0033 SS: 0068
    Process qv4l2 (pid: 15413, ti=e2fd9000 task=ebe44000 task.ti=e2fd9000)
    Stack: f8c0c6ae e2ff2a00 00000d00 e2fd9ec4 ebc4e000 e2fd9d5c f8c0c448 00000000
    f899c12a e2fd9d5c f899c154 e2fd9d68 e2fd9d80 c0560185 e2fd9d88 f8f3e1d8
    f8f3e1dc ebc4e034 f8f3e18c e2fd9ec4 00000000 e2fd9d90 f899c286 c008561c
    Call Trace:
    [] ? chip_command+0x266/0x4b6 [tvaudio]
    [] ? chip_command+0x0/0x4b6 [tvaudio]
    [] ? i2c_cmd+0x0/0x2f [i2c_core]
    [] ? i2c_cmd+0x2a/0x2f [i2c_core]
    [] ? device_for_each_child+0x21/0x49
    [] ? i2c_clients_command+0x1c/0x1e [i2c_core]
    [] ? bttv_call_i2c_clients+0x14/0x16 [bttv]
    [] ? bttv_s_ctrl+0x1bc/0x313 [bttv]
    [] ? bttv_s_ctrl+0x0/0x313 [bttv]
    [] ? __video_do_ioctl+0x1f84/0x3726 [videodev]
    [] ? sock_aio_write+0x100/0x10d
    [] ? kmap_atomic_prot+0x1dd/0x1df
    [] ? enqueue_hrtimer+0xc2/0xcd
    [] ? copy_from_user+0x39/0x121
    [] ? __video_ioctl2+0x1aa/0x24a [videodev]
    [] ? do_notify_resume+0x768/0x795
    [] ? getnstimeofday+0x34/0xd1
    [] ? autoremove_wake_function+0x0/0x33
    [] ? video_ioctl2+0xf/0x13 [videodev]
    [] ? vfs_ioctl+0x50/0x69
    [] ? do_vfs_ioctl+0x239/0x24c
    [] ? sys_ioctl+0x40/0x5b
    [] ? syscall_call+0x7/0xb
    [] ? cpuid4_cache_sysfs_exit+0x3d/0x69
    =======================
    Code: Bad EIP value.
    EIP: [] 0x0 SS:ESP 0068:e2fd9d2c

    Signed-off-by: Mauro Carvalho Chehab

    Mauro Carvalho Chehab
     
  • Before the patch, the used ioctl were printed as an hexadecimal code,
    hard to be understand without consulting the way _IO macros work.
    Instead, use the V4L default handler for printing such errors into a way
    that would be easier to understand.

    Signed-off-by: Mauro Carvalho Chehab

    Mauro Carvalho Chehab
     
  • Some comments are not clear enough. Improve it to allow a better
    understanding of the driver behavior.

    While there, remove an unneeded struct prototype.

    Signed-off-by: Mauro Carvalho Chehab

    Mauro Carvalho Chehab
     
  • There were no check about the limits of shadow.bytes array. This offers
    a risk of writing values outside the limits, overriding other data
    areas.

    Signed-off-by: Mauro Carvalho Chehab

    Mauro Carvalho Chehab
     
  • Instead of storing the pointer for the proper entry at chip description
    table, the driver were storing an indirect reference, by using an index.
    Better to reference directly the data.

    Signed-off-by: Mauro Carvalho Chehab

    Mauro Carvalho Chehab
     
  • A driver used on several bttv boards since 2000 is not experimental
    anymore ;) Remove it from the comments.

    While there, update copyrights addind a quick note about the "recent"
    updates since 2005.

    Signed-off-by: Mauro Carvalho Chehab

    Mauro Carvalho Chehab
     
  • This patch checks for volume, bass, treble, set mode and get mode
    callbacks before actually enabling the code that would use them.

    Instead of aborting the driver for load, this patch will allow it to
    load with a reduced number of functionatities.

    This prevents OOPS if some board entry is missing a needed callback.

    Signed-off-by: Mauro Carvalho Chehab

    Mauro Carvalho Chehab
     
  • generic_checkmode() were called, via a callback, for some tvaudio chips.
    There's just one callback code used on all those boards. So, it makes no
    sense on keeping this as a callback.

    Since there were some OOPS reported on tvaudio on kerneloops.org, this
    patch removes this callback, adding the code at the only place were it
    is called: inside chip_tread. A flag were added to indicate the need for
    a kernel thread to set stereo mode on cards that needs it.

    Using this more direct approach simplifies the code, making it more
    robust against human errors.

    Signed-off-by: Mauro Carvalho Chehab

    Mauro Carvalho Chehab