24 Apr, 2008

1 commit

  • * git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6:
    iwlwifi: Fix built-in compilation of iwlcore
    net: Unexport move_addr_to_{kernel,user}
    rt2x00: Select LEDS_CLASS.
    iwlwifi: Select LEDS_CLASS.
    leds: Do not guard NEW_LEDS with HAS_IOMEM
    [IPSEC]: Fix catch-22 with algorithm IDs above 31
    time: Export set_normalized_timespec.
    tcp: Make use of before macro in tcp_input.c
    hamradio: Remove unneeded and deprecated cli()/sti() calls in dmascc.c
    [NETNS]: Remove empty ->init callback.
    [DCCP]: Convert do_gettimeofday() to getnstimeofday().
    [NETNS]: Don't initialize err variable twice.
    [NETNS]: The ip6_fib_timer can work with garbage on net namespace stop.
    [IPV4]: Convert do_gettimeofday() to getnstimeofday().
    [IPV4]: Make icmp_sk_init() static.
    [IPV6]: Make struct ip6_prohibit_entry_template static.
    tcp: Trivial fix to correct function name in a comment in net/ipv4/tcp.c
    [NET]: Expose netdevice dev_id through sysfs
    skbuff: fix missing kernel-doc notation
    [ROSE]: Fix soft lockup wrt. rose_node_list_lock

    Linus Torvalds
     

23 Apr, 2008

1 commit


22 Apr, 2008

13 commits

  • As it stands it's impossible to use any authentication algorithms
    with an ID above 31 portably. It just happens to work on x86 but
    fails miserably on ppc64.

    The reason is that we're using a bit mask to check the algorithm
    ID but the mask is only 32 bits wide.

    After looking at how this is used in the field, I have concluded
    that in the long term we should phase out state matching by IDs
    because this is made superfluous by the reqid feature. For current
    applications, the best solution IMHO is to allow all algorithms when
    the bit masks are all ~0.

    The following patch does exactly that.

    This bug was identified by IBM when testing on the ppc64 platform
    using the NULL authentication algorithm which has an ID of 251.

    Signed-off-by: Herbert Xu
    Signed-off-by: David S. Miller

    Herbert Xu
     
  • * git://git.kernel.org/pub/scm/linux/kernel/git/davem/sparc-2.6:
    [SPARC]: Remove SunOS and Solaris binary support.

    Linus Torvalds
     
  • * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/juhl/trivial: (24 commits)
    DOC: A couple corrections and clarifications in USB doc.
    Generate a slightly more informative error msg for bad HZ
    fix typo "is" -> "if" in Makefile
    ext*: spelling fix prefered -> preferred
    DOCUMENTATION: Use newer DEFINE_SPINLOCK macro in docs.
    KEYS: Fix the comment to match the file name in rxrpc-type.h.
    RAID: remove trailing space from printk line
    DMA engine: typo fixes
    Remove unused MAX_NODES_SHIFT
    MAINTAINERS: Clarify access to OCFS2 development mailing list.
    V4L: Storage class should be before const qualifier (sn9c102)
    V4L: Storage class should be before const qualifier
    sonypi: Storage class should be before const qualifier
    intel_menlow: Storage class should be before const qualifier
    DVB: Storage class should be before const qualifier
    arm: Storage class should be before const qualifier
    ALSA: Storage class should be before const qualifier
    acpi: Storage class should be before const qualifier
    firmware_sample_driver.c: fix coding style
    MAINTAINERS: Add ati_remote2 driver
    ...

    Fixed up trivial conflicts in firmware_sample_driver.c

    Linus Torvalds
     
  • * 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6:
    rose: Socket lock was not released before returning to user space
    hci_usb: remove code obfuscation
    drivers/net/appletalk: use time_before, time_before_eq, etc
    drivers/atm: use time_before, time_before_eq, etc
    hci_usb: do not initialize static variables to 0
    tg3: 5701 DMA corruption fix
    atm nicstar: Removal of debug code containing deprecated calls to cli()/sti()
    iwlwifi: Fix unconditional access to station->tidp[].agg.
    netfilter: Fix SIP conntrack build with NAT disabled.
    netfilter: Fix SCTP nat build.

    Linus Torvalds
     
  • * 'semaphore' of git://git.kernel.org/pub/scm/linux/kernel/git/willy/misc:
    Deprecate the asm/semaphore.h files in feature-removal-schedule.
    Convert asm/semaphore.h users to linux/semaphore.h
    security: Remove unnecessary inclusions of asm/semaphore.h
    lib: Remove unnecessary inclusions of asm/semaphore.h
    kernel: Remove unnecessary inclusions of asm/semaphore.h
    include: Remove unnecessary inclusions of asm/semaphore.h
    fs: Remove unnecessary inclusions of asm/semaphore.h
    drivers: Remove unnecessary inclusions of asm/semaphore.h
    net: Remove unnecessary inclusions of asm/semaphore.h
    arch: Remove unnecessary inclusions of asm/semaphore.h

    Linus Torvalds
     
  • …linux-2.6-sched-devel

    * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mingo/linux-2.6-sched-devel: (62 commits)
    sched: build fix
    sched: better rt-group documentation
    sched: features fix
    sched: /debug/sched_features
    sched: add SCHED_FEAT_DEADLINE
    sched: debug: show a weight tree
    sched: fair: weight calculations
    sched: fair-group: de-couple load-balancing from the rb-trees
    sched: fair-group scheduling vs latency
    sched: rt-group: optimize dequeue_rt_stack
    sched: debug: add some debug code to handle the full hierarchy
    sched: fair-group: SMP-nice for group scheduling
    sched, cpuset: customize sched domains, core
    sched, cpuset: customize sched domains, docs
    sched: prepatory code movement
    sched: rt: multi level group constraints
    sched: task_group hierarchy
    sched: fix the task_group hierarchy for UID grouping
    sched: allow the group scheduler to have multiple levels
    sched: mix tasks and groups
    ...

    Linus Torvalds
     
  • As you can see, there's no zero_it arg (in fact code always uses __GFP_ZERO).

    Signed-off-by: Rusty Russell
    Signed-off-by: Jesper Juhl

    Rusty Russell
     
  • As per Documentation/feature-removal-schedule.txt

    Signed-off-by: David S. Miller

    David S. Miller
     
  • Make use of tcp before macro.

    Signed-off-by: Arnd Hannemann
    Signed-off-by: David S. Miller

    Arnd Hannemann
     
  • The netns start-stop engine can happily live with any of
    init or exit callbacks set to NULL.

    Signed-off-by: Pavel Emelyanov
    Signed-off-by: David S. Miller

    Pavel Emelyanov
     
  • What do_gettimeofday() does is to call getnstimeofday() and
    to convert the result from timespec{} to timeval{}.
    We do not always need timeval{} and we can convert timespec{}
    when we really need (to print).

    Signed-off-by: YOSHIFUJI Hideaki
    Acked-by: Arnaldo Carvalho de Melo
    Signed-off-by: David S. Miller

    YOSHIFUJI Hideaki
     
  • The ip6_route_net_init() performs some unneeded actions.

    Signed-off-by: Pavel Emelyanov
    Signed-off-by: David S. Miller

    Pavel Emelyanov
     
  • The del_timer() function doesn't guarantee, that the timer callback
    is not active by the time it exits.

    Thus, the fib6_net_exit() may kfree() all the data, that is required
    by the fib6_run_gc(). The race window is tiny, but slab poisoning can
    trigger this bug.

    Using del_timer_sync() will cure this.

    Signed-off-by: Pavel Emelyanov
    Signed-off-by: David S. Miller

    Pavel Emelyanov
     

21 Apr, 2008

6 commits

  • What do_gettimeofday() does is to call getnstimeofday() and
    to convert the result from timespec{} to timeval{}.
    After that, these callers convert the result again to msec.
    Use getnstimeofday() and convert the units at once.

    Signed-off-by: YOSHIFUJI Hideaki
    Signed-off-by: David S. Miller

    YOSHIFUJI Hideaki
     
  • This patch makes the needlessly global icmp_sk_init() static.

    Signed-off-by: Adrian Bunk
    Signed-off-by: David S. Miller

    Adrian Bunk
     
  • This patch makes the needlessly global struct
    ip6_prohibit_entry_template static.

    Signed-off-by: Adrian Bunk
    Signed-off-by: David S. Miller

    Adrian Bunk
     
  • This is a trivial fix to correct function name in a comment in
    net/ipv4/tcp.c.

    Signed-off-by: Satoru SATOH
    Signed-off-by: David S. Miller

    Satoru SATOH
     
  • Expose dev_id to userspace, because it helps to disambiguate between
    interfaces where the MAC address is unique.

    This should allow us to simplify the handling of persistent naming for
    S390 network devices in udev -- because it can depend on a simple
    attribute of the device like the other match criteria, rather than
    having a special case for SUBSYSTEMS=="ccwgroup".

    Signed-off-by: David Woodhouse
    Signed-off-by: David S. Miller

    David Woodhouse
     
  • [ INFO: possible recursive locking detected ]
    2.6.25 #3
    ---------------------------------------------
    ax25ipd/3811 is trying to acquire lock:
    (rose_node_list_lock){-+..}, at: [] rose_get_neigh+0x1a/0xa0
    [rose]

    but task is already holding lock:
    (rose_node_list_lock){-+..}, at: []
    rose_route_frame+0x4d/0x620 [rose]

    other info that might help us debug this:
    6 locks held by ax25ipd/3811:
    #0: (&tty->atomic_write_lock){--..}, at: []
    tty_write_lock+0x1c/0x50
    #1: (rcu_read_lock){..--}, at: [] net_rx_action+0x96/0x230
    #2: (rcu_read_lock){..--}, at: [] netif_receive_skb+0x100/0x2f0
    #3: (rose_node_list_lock){-+..}, at: []
    rose_route_frame+0x4d/0x620 [rose]
    #4: (rose_neigh_list_lock){-+..}, at: []
    rose_route_frame+0x57/0x620 [rose]
    #5: (rose_route_list_lock){-+..}, at: []
    rose_route_frame+0x61/0x620 [rose]

    stack backtrace:
    Pid: 3811, comm: ax25ipd Not tainted 2.6.25 #3
    [] print_deadlock_bug+0xc7/0xd0
    [] check_deadlock+0x9a/0xb0
    [] validate_chain+0x1e2/0x310
    [] ? validate_chain+0xa5/0x310
    [] ? native_sched_clock+0x88/0xc0
    [] __lock_acquire+0x1a1/0x750
    [] lock_acquire+0x81/0xa0
    [] ? rose_get_neigh+0x1a/0xa0 [rose]
    [] _spin_lock_bh+0x33/0x60
    [] ? rose_get_neigh+0x1a/0xa0 [rose]
    [] rose_get_neigh+0x1a/0xa0 [rose]
    [] rose_route_frame+0x464/0x620 [rose]
    [] ? _read_unlock+0x1d/0x20
    [] ? rose_route_frame+0x0/0x620 [rose]
    [] ax25_rx_iframe+0x66/0x3b0 [ax25]
    [] ? ax25_start_t3timer+0x1f/0x40 [ax25]
    [] ax25_std_frame_in+0x7fb/0x890 [ax25]
    [] ? _spin_unlock_bh+0x25/0x30
    [] ax25_kiss_rcv+0x2c6/0x800 [ax25]
    [] ? sock_def_readable+0x59/0x80
    [] ? __lock_release+0x47/0x70
    [] ? sock_def_readable+0x59/0x80
    [] ? _read_unlock+0x1d/0x20
    [] ? sock_def_readable+0x59/0x80
    [] ? sock_queue_rcv_skb+0x13a/0x1d0
    [] ? sock_queue_rcv_skb+0x45/0x1d0
    [] ? ax25_kiss_rcv+0x0/0x800 [ax25]
    [] netif_receive_skb+0x255/0x2f0
    [] ? netif_receive_skb+0x100/0x2f0
    [] process_backlog+0x7c/0xf0
    [] net_rx_action+0x16c/0x230
    [] ? net_rx_action+0x96/0x230
    [] __do_softirq+0x93/0x120
    [] ? mkiss_receive_buf+0x33a/0x3f0 [mkiss]
    [] do_softirq+0x57/0x60
    [] local_bh_enable_ip+0xa5/0xe0
    [] _spin_unlock_bh+0x25/0x30
    [] mkiss_receive_buf+0x33a/0x3f0 [mkiss]
    [] pty_write+0x47/0x60
    [] write_chan+0x1b0/0x220
    [] ? tty_write_lock+0x1c/0x50
    [] ? default_wake_function+0x0/0x10
    [] tty_write+0x12a/0x1c0
    [] ? write_chan+0x0/0x220
    [] vfs_write+0x96/0x130
    [] ? tty_write+0x0/0x1c0
    [] sys_write+0x3d/0x70
    [] sysenter_past_esp+0x5f/0xa5
    =======================
    BUG: soft lockup - CPU#0 stuck for 61s! [ax25ipd:3811]

    Pid: 3811, comm: ax25ipd Not tainted (2.6.25 #3)
    EIP: 0060:[] EFLAGS: 00000246 CPU: 0
    EIP is at native_read_tsc+0xb/0x20
    EAX: b404aa2c EBX: b404a9c9 ECX: 017f1000 EDX: 0000076b
    ESI: 00000001 EDI: 00000000 EBP: ecc83afc ESP: ecc83afc
    DS: 007b ES: 007b FS: 00d8 GS: 0033 SS: 0068
    CR0: 8005003b CR2: b7f5f000 CR3: 2cd8e000 CR4: 000006f0
    DR0: 00000000 DR1: 00000000 DR2: 00000000 DR3: 00000000
    DR6: ffff0ff0 DR7: 00000400
    [] delay_tsc+0x17/0x30
    [] __delay+0x9/0x10
    [] __spin_lock_debug+0x76/0xf0
    [] ? spin_bug+0x18/0x100
    [] ? __lock_contended+0xa3/0x110
    [] _raw_spin_lock+0x68/0x90
    [] _spin_lock_bh+0x4f/0x60
    [] ? rose_get_neigh+0x1a/0xa0 [rose]
    [] rose_get_neigh+0x1a/0xa0 [rose]
    [] rose_route_frame+0x464/0x620 [rose]
    [] ? _read_unlock+0x1d/0x20
    [] ? rose_route_frame+0x0/0x620 [rose]
    [] ax25_rx_iframe+0x66/0x3b0 [ax25]
    [] ? ax25_start_t3timer+0x1f/0x40 [ax25]
    [] ax25_std_frame_in+0x7fb/0x890 [ax25]
    [] ? _spin_unlock_bh+0x25/0x30
    [] ax25_kiss_rcv+0x2c6/0x800 [ax25]
    [] ? sock_def_readable+0x59/0x80
    [] ? __lock_release+0x47/0x70
    [] ? sock_def_readable+0x59/0x80
    [] ? _read_unlock+0x1d/0x20
    [] ? sock_def_readable+0x59/0x80
    [] ? sock_queue_rcv_skb+0x13a/0x1d0
    [] ? sock_queue_rcv_skb+0x45/0x1d0
    [] ? ax25_kiss_rcv+0x0/0x800 [ax25]
    [] netif_receive_skb+0x255/0x2f0
    [] ? netif_receive_skb+0x100/0x2f0
    [] process_backlog+0x7c/0xf0
    [] net_rx_action+0x16c/0x230
    [] ? net_rx_action+0x96/0x230
    [] __do_softirq+0x93/0x120
    [] ? mkiss_receive_buf+0x33a/0x3f0 [mkiss]
    [] do_softirq+0x57/0x60
    [] local_bh_enable_ip+0xa5/0xe0
    [] _spin_unlock_bh+0x25/0x30
    [] mkiss_receive_buf+0x33a/0x3f0 [mkiss]
    [] pty_write+0x47/0x60
    [] write_chan+0x1b0/0x220
    [] ? tty_write_lock+0x1c/0x50
    [] ? default_wake_function+0x0/0x10
    [] tty_write+0x12a/0x1c0
    [] ? write_chan+0x0/0x220
    [] vfs_write+0x96/0x130
    [] ? tty_write+0x0/0x1c0
    [] sys_write+0x3d/0x70
    [] sysenter_past_esp+0x5f/0xa5
    =======================

    Since rose_route_frame() does not use rose_node_list we can safely
    remove rose_node_list_lock spin lock here and let it be free for
    rose_get_neigh().

    Signed-off-by: Bernard Pidoux
    Signed-off-by: David S. Miller

    Bernard Pidoux
     

20 Apr, 2008

4 commits

  • ================================================
    [ BUG: lock held when returning to user space! ]
    ------------------------------------------------
    xfbbd/3683 is leaving the kernel with locks still held!
    1 lock held by xfbbd/3683:
    #0: (sk_lock-AF_ROSE){--..}, at: [] rose_connect+0x73/0x420 [rose]

    INFO: task xfbbd:3683 blocked for more than 120 seconds.
    "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message.
    xfbbd D 00000246 0 3683 3669
    c6965ee0 00000092 c02c5c40 00000246 c0f6b5f0 c0f6b5c0 c0f6b5f0 c0f6b5c0
    c0f6b614 c6965f18 c024b74b ffffffff c06ba070 00000000 00000000 00000001
    c6ab07c0 c012d450 c0f6b634 c0f6b634 c7b5bf10 c0d6004c c7b5bf10 c6965f40
    Call Trace:
    [] lock_sock_nested+0x6b/0xd0
    [] ? autoremove_wake_function+0x0/0x40
    [] sock_fasync+0x41/0x150
    [] sock_close+0x19/0x40
    [] __fput+0xb4/0x170
    [] fput+0x18/0x20
    [] filp_close+0x3e/0x70
    [] sys_close+0x69/0xb0
    [] sysenter_past_esp+0x5f/0xa5
    =======================
    INFO: lockdep is turned off.

    Signed-off-by: Bernard Pidoux
    Signed-off-by: David S. Miller

    Bernard Pidoux
     
  • Reported by Ingo Molnar.

    The SIP helper is also useful without NAT. This patch adds an ifdef
    around the RTP call optimization for NATed clients.

    Signed-off-by: Patrick McHardy
    Signed-off-by: David S. Miller

    Patrick McHardy
     
  • We need to select LIBCRC32C.

    Signed-off-by: Patrick McHardy
    Signed-off-by: David S. Miller

    Patrick McHardy
     
  • * Use new node_to_cpumask_ptr. This creates a pointer to the
    cpumask for a given node. This definition is in mm patch:

    asm-generic-add-node_to_cpumask_ptr-macro.patch

    * Use new set_cpus_allowed_ptr function.

    Depends on:
    [mm-patch]: asm-generic-add-node_to_cpumask_ptr-macro.patch
    [sched-devel]: sched: add new set_cpus_allowed_ptr function
    [x86/latest]: x86: add cpus_scnprintf function

    Cc: Greg Kroah-Hartman
    Cc: Greg Banks
    Cc: H. Peter Anvin
    Signed-off-by: Mike Travis
    Signed-off-by: Ingo Molnar

    Mike Travis
     

19 Apr, 2008

6 commits

  • This takes care of all of the direct callers of vfs_mknod().
    Since a few of these cases also handle normal file creation
    as well, this also covers some calls to vfs_create().

    So that we don't have to make three mnt_want/drop_write()
    calls inside of the switch statement, we move some of its
    logic outside of the switch and into a helper function
    suggested by Christoph.

    This also encapsulates a fix for mknod(S_IFREG) that Miklos
    found.

    [AV: merged mkdir handling, added missing nfsd pieces]

    Acked-by: Al Viro
    Signed-off-by: Christoph Hellwig
    Signed-off-by: Dave Hansen
    Signed-off-by: Andrew Morton
    Signed-off-by: Al Viro

    Dave Hansen
     
  • None of these files use any of the functionality promised by
    asm/semaphore.h. It's possible that they rely on it dragging in some
    unrelated header file, but I can't build all these files, so we'll have
    fix any build failures as they come up.

    Signed-off-by: Matthew Wilcox

    Matthew Wilcox
     
  • …s/security-testing-2.6

    * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jmorris/security-testing-2.6:
    security: fix up documentation for security_module_enable
    Security: Introduce security= boot parameter
    Audit: Final renamings and cleanup
    SELinux: use new audit hooks, remove redundant exports
    Audit: internally use the new LSM audit hooks
    LSM/Audit: Introduce generic Audit LSM hooks
    SELinux: remove redundant exports
    Netlink: Use generic LSM hook
    Audit: use new LSM hooks instead of SELinux exports
    SELinux: setup new inode/ipc getsecid hooks
    LSM: Introduce inode_getsecid and ipc_getsecid hooks

    Linus Torvalds
     
  • * git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6.26: (1090 commits)
    [NET]: Fix and allocate less memory for ->priv'less netdevices
    [IPV6]: Fix dangling references on error in fib6_add().
    [NETLABEL]: Fix NULL deref in netlbl_unlabel_staticlist_gen() if ifindex not found
    [PKT_SCHED]: Fix datalen check in tcf_simp_init().
    [INET]: Uninline the __inet_inherit_port call.
    [INET]: Drop the inet_inherit_port() call.
    SCTP: Initialize partial_bytes_acked to 0, when all of the data is acked.
    [netdrvr] forcedeth: internal simplifications; changelog removal
    phylib: factor out get_phy_id from within get_phy_device
    PHY: add BCM5464 support to broadcom PHY driver
    cxgb3: Fix __must_check warning with dev_dbg.
    tc35815: Statistics cleanup
    natsemi: fix MMIO for PPC 44x platforms
    [TIPC]: Cleanup of TIPC reference table code
    [TIPC]: Optimized initialization of TIPC reference table
    [TIPC]: Remove inlining of reference table locking routines
    e1000: convert uint16_t style integers to u16
    ixgb: convert uint16_t style integers to u16
    sb1000.c: make const arrays static
    sb1000.c: stop inlining largish static functions
    ...

    Linus Torvalds
     
  • Don't use SELinux exported selinux_get_task_sid symbol.
    Use the generic LSM equivalent instead.

    Signed-off-by: Casey Schaufler
    Signed-off-by: Ahmed S. Darwish
    Acked-by: James Morris
    Acked-by: David S. Miller
    Reviewed-by: Paul Moore

    Ahmed S. Darwish
     
  • This patch effectively reverts commit d0498d9ae1a5cebac363e38907266d5cd2eedf89
    aka "[NET]: Do not allocate unneeded memory for dev->priv alignment."
    It was found to be buggy because of final unconditional += NETDEV_ALIGN_CONST
    removal.

    For example, for sizeof(struct net_device) being 2048 bytes, "alloc_size"
    was also 2048 bytes, but allocator with debugging options turned on started
    giving out !32-byte aligned memory resulting in redzones overwrites.

    Patch does small optimization in ->priv'less case: bumping size to next
    32-byte boundary was always done to ensure ->priv will also be aligned.
    But, no ->priv, no need to do that.

    Signed-off-by: Alexey Dobriyan
    Signed-off-by: David S. Miller

    Alexey Dobriyan
     

18 Apr, 2008

7 commits


17 Apr, 2008

2 commits

  • Add a new IB_WR_SEND_WITH_INV send opcode that can be used to mark a
    "send with invalidate" work request as defined in the iWARP verbs and
    the InfiniBand base memory management extensions. Also put "imm_data"
    and a new "invalidate_rkey" member in a new "ex" union in struct
    ib_send_wr. The invalidate_rkey member can be used to pass in an
    R_Key/STag to be invalidated. Add this new union to struct
    ib_uverbs_send_wr. Add code to copy the invalidate_rkey field in
    ib_uverbs_post_send().

    Fix up low-level drivers to deal with the change to struct ib_send_wr,
    and just remove the imm_data initialization from net/sunrpc/xprtrdma/,
    since that code never does any send with immediate operations.

    Also, move the existing IB_DEVICE_SEND_W_INV flag to a new bit, since
    the iWARP drivers currently in the tree set the bit. The amso1100
    driver at least will silently fail to honor the IB_SEND_INVALIDATE bit
    if passed in as part of userspace send requests (since it does not
    implement kernel bypass work request queueing). Remove the flag from
    all existing drivers that set it until we know which ones are OK.

    The values chosen for the new flag is not consecutive to avoid clashing
    with flags defined in the XRC patches, which are not merged yet but
    which are already in use and are likely to be merged soon.

    This resurrects a patch sent long ago by Mikkel Hagen .

    Signed-off-by: Roland Dreier

    Roland Dreier
     
  • David S. Miller