Linux 3.2.99
I'm announcing the release of the 3.2.99 kernel.
All users of the 3.2 kernel series should upgrade.
The updated 3.2.y git tree can be found at:
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git linux-3.2.y
and can be browsed at the normal kernel.org git web browser:
https://git.kernel.org/?p=linux/kernel/git/stable/linux-stable.git
The diff from 3.2.98 is attached to this message.
Ben.
------------
Documentation/kernel-parameters.txt | 3 - Makefile | 2 +- arch/s390/kernel/dis.c | 4 +- arch/x86/include/asm/alternative.h | 4 +- arch/x86/kernel/alternative.c | 129 +++------- arch/x86/kernel/smpboot.c | 20 +- arch/x86/kvm/svm.c | 7 + arch/x86/kvm/vmx.c | 4 + arch/x86/kvm/x86.c | 5 +- arch/x86/kvm/x86.h | 2 + arch/x86/lib/x86-opcode-map.txt | 2 +- arch/x86/mm/kaiser.c | 5 +- arch/x86/xen/smp.c | 6 +- block/blk-core.c | 3 + drivers/char/tpm/tpm.c | 6 + drivers/infiniband/hw/mlx4/qp.c | 2 +- drivers/infiniband/ulp/srp/ib_srp.c | 23 +- drivers/input/misc/adxl34x.c | 2 +- drivers/md/dm-bufio.c | 15 +- drivers/md/dm-table.c | 32 ++- drivers/md/dm.c | 12 +- drivers/media/rc/ir-lirc-codec.c | 9 +- drivers/media/video/cx231xx/cx231xx-cards.c | 3 +- drivers/media/video/omap/omap_vout.c | 3 +- drivers/mtd/nand/nand_base.c | 9 +- drivers/net/wireless/rt2x00/rt2x00usb.c | 6 +- drivers/pci/pcie/aer/aerdrv_core.c | 9 +- drivers/rtc/interface.c | 16 +- drivers/scsi/bfa/bfad_debugfs.c | 5 +- drivers/staging/media/as102/as102_fw.c | 28 ++- drivers/staging/usbip/stub_rx.c | 58 +++-- drivers/staging/usbip/stub_tx.c | 7 + drivers/staging/usbip/usbip_common.h | 1 + .../staging/usbip/userspace/libsrc/usbip_common.c | 2 +- .../staging/usbip/userspace/libsrc/vhci_driver.c | 8 +- drivers/staging/usbip/vhci_hcd.c | 39 --- drivers/staging/usbip/vhci_sysfs.c | 20 +- drivers/usb/core/devio.c | 14 ++ drivers/usb/core/quirks.c | 3 + drivers/usb/serial/garmin_gps.c | 22 +- drivers/video/udlfb.c | 10 +- fs/9p/vfs_inode.c | 3 + fs/9p/vfs_inode_dotl.c | 3 + fs/autofs4/waitq.c | 45 +++- fs/coda/upcall.c | 3 +- fs/ecryptfs/messaging.c | 8 +- fs/isofs/isofs.h | 2 +- fs/isofs/rock.h | 2 +- fs/isofs/util.c | 2 +- fs/nfs/nfs4proc.c | 18 +- fs/nilfs2/segment.c | 6 +- fs/ocfs2/alloc.c | 2 +- fs/ocfs2/file.c | 9 +- include/linux/blkdev.h | 1 + include/linux/usb/ch9.h | 19 ++ include/net/sctp/sctp.h | 2 + include/net/sctp/structs.h | 8 +- kernel/cpu.c | 11 - kernel/extable.c | 2 + kernel/trace/blktrace.c | 76 ++++-- net/9p/client.c | 3 +- net/9p/trans_virtio.c | 13 +- net/l2tp/l2tp_core.c | 42 ++-- net/l2tp/l2tp_core.h | 3 + net/l2tp/l2tp_eth.c | 96 +++++-- net/l2tp/l2tp_ppp.c | 276 ++++++++++++--------- net/netfilter/xt_TCPMSS.c | 43 ++-- net/netfilter/xt_TCPOPTSTRIP.c | 19 +- net/rds/rdma.c | 4 + net/sctp/ipv6.c | 160 ++++++------ net/sctp/protocol.c | 12 +- net/sctp/socket.c | 33 ++- net/sctp/transport.c | 4 +- net/sctp/ulpevent.c | 2 +- sound/core/seq/seq_clientmgr.c | 10 +- sound/core/seq/seq_clientmgr.h | 1 + sound/core/timer_compat.c | 12 +- sound/pci/hda/hda_intel.c | 3 + sound/usb/clock.c | 9 +- sound/usb/mixer.c | 15 +- 80 files changed, 906 insertions(+), 636 deletions(-)
Al Viro (2):
autofs4: autofs4_wait() vs. autofs4_catatonic_mode() race
autofs4: catatonic_mode vs. notify_daemon race
Alan (1):
usbip: Fix sscanf handling
Alan Stern (1):
USB: usbfs: compute urb->actual_length for isochronous
Alexander Potapenko (1):
sctp: fully initialize the IPv6 address in sctp_v6_to_addr()
Alexander Steffen (1):
tpm-dev-common: Reject too short writes
Alexandre Belloni (1):
rtc: set the alarm to the next expiring timer
Andreas Rohner (1):
nilfs2: fix race condition that causes file system corruption
Arnd Bergmann (2):
Input: adxl34x - do not treat FIFO_MODE() as boolean
isofs: fix timestamps beyond 2027
Bart Van Assche (1):
IB/srp: Avoid that a cable pull can trigger a kernel crash
Bart Westgeest (1):
staging: usbip: removed #if 0'd out code
Ben Hutchings (1):
Linux 3.2.99
Bernhard Rosenkraenzer (1):
USB: Add delay-init quirk for Corsair K70 LUX keyboards
Brent Taylor (1):
mtd: nand: Fix writing mtdoops to nand flash.
Chuck Lever (1):
nfs: Fix ugly referral attributes
Colin Ian King (1):
rtc: interface: ignore expired timers when enqueuing new timers
Dan Carpenter (2):
scsi: bfa: integer overflow in debugfs
eCryptfs: use after free in ecryptfs_release_messaging()
Eric Biggers (1):
dm bufio: fix integer overflow when limiting maximum cache size
Eric Dumazet (1):
netfilter: xt_TCPMSS: add more sanity tests on tcph->doff
Eric W. Biederman (1):
net/sctp: Always set scope_id in sctp_inet6_skb_msgname
Felipe Balbi (1):
usb: add helper to extract bits 12:11 of wMaxPacketSize
Gabriele Paoloni (1):
PCI/AER: Report non-fatal errors only to the affected endpoint
Guenter Roeck (1):
kaiser: Set _PAGE_NX only if supported
Guillaume Nault (5):
l2tp: ensure sessions are freed after their PPPOL2TP socket
l2tp: don't register sessions in l2tp_session_create()
l2tp: initialise l2tp_eth sessions before registering them
l2tp: protect sock pointer of struct pppol2tp_session with RCU
l2tp: initialise PPP sessions before registering them
Hou Tao (1):
dm: fix race between dm_get_from_kobject() and __dm_destroy()
Jan Harkes (1):
coda: fix 'kernel memory exposure attempt' in fsync
Jason Gunthorpe (1):
sctp: Fixup v4mapped behaviour to comply with Sock API
Jens Axboe (1):
blktrace: fix unlocked access to init/start-stop/teardown
Johan Hovold (2):
USB: serial: garmin_gps: fix I/O after failed probe and remove
USB: serial: garmin_gps: fix memory leak on probe errors
Ladi Prosek (1):
KVM: nVMX: set IDTR and GDTR limits when loading L1 host state
Ladislav Michl (1):
video: udlfb: Fix read EDID timeout
Lepton Wu (1):
kaiser: Set _PAGE_NX only if supported
Mark Bloch (1):
IB/mlx4: Increase maximal message size under UD QP
Markus Elfring (1):
media: omap_vout: Fix a possible null pointer dereference in omap_vout_open()
Masami Hiramatsu (1):
x86/decoder: Add new TEST instruction pattern
Mauro Carvalho Chehab (1):
cx231xx: Fix the max number of interfaces
Michele Baldessari (1):
media: Don't do DMA on stack for firmware upload in the AS102 driver
Mike Snitzer (1):
dm: discard support requires all targets in a table support discards
Mohamed Ghannam (2):
RDS: Heap OOB write in rds_message_alloc_sgs()
RDS: null pointer dereference in rds_atomic_free_op
Nadav Amit (1):
KVM: vmx: Inject #GP on invalid PAT CR
NeilBrown (2):
autofs: don't fail mount for transient error
autofs: fix careless error in recent commit
Pablo Neira Ayuso (3):
netfilter: xt_TCPOPTSTRIP: fix possible mangling beyond packet boundary
netfilter: xt_TCPOPTSTRIP: don't use tcp_hdr()
netfilter: xt_TCPMSS: fix handling of malformed TCP header and options
Paolo Bonzini (1):
KVM: SVM: obey guest PAT
Phil Oester (2):
netfilter: xt_TCPMSS: Fix missing fragmentation handling
netfilter: xt_TCPMSS: correct return value in tcpmss_mangle_packet
Rusty Russell (1):
x86/smp: Don't ever patch back to UP if we unplug cpus
Sean Young (1):
media: rc: check for integer overflow
Shuah Khan (4):
usbip: fix stub_rx: get_pipe() to validate endpoint number
usbip: fix stub_rx: harden CMD_SUBMIT path to handle malicious input
usbip: prevent vhci_hcd driver from leaking a socket pointer address
usbip: fix stub_send_ret_submit() vulnerability to null transfer_buffer
Stanislaw Gruszka (1):
rt2x00usb: mark device removed when get ENOENT usb error
Takashi Iwai (5):
ALSA: timer: Remove kernel warning at compat ioctl error paths
ALSA: usb-audio: Add sanity checks to FE parser
ALSA: usb-audio: Fix potential out-of-bound access at parsing SU
ALSA: usb-audio: Add sanity checks in v2 clock parsers
ALSA: seq: Make ioctls race-free
Tom Parkin (3):
l2tp: add session reorder queue purge function to core
l2tp: purge session reorder queue on delete
l2tp: push all ppp pseudowire shutdown through .release handler
Tuomas Tynkkynen (2):
fs/9p: Compare qid.path in v9fs_test_inode
net/9p: Switch to wait_event_killable()
Vasily Gorbik (1):
s390/disassembler: increase show_code buffer size
Vijendar Mukunda (1):
ALSA: hda: Add Raven PCI ID
Waiman Long (1):
blktrace: Fix potential deadlock between delete & sysfs ops
Younger Liu (1):
ocfs2: fix issue that ocfs2_setattr() does not deal with new_i_size==i_size
Zhou Chengming (1):
kprobes, x86/alternatives: Use text_mutex to protect smp_alt_modules
Documentation/kernel-parameters.txt +0 -3
@@ -2440,9 +2440,6 @@ bytes respectively. Such letter suffixes can also be entirely omitted. smart2= [HW] Format: <io1>[,<io2>[,...,<io8>]] - smp-alt-once [X86-32,SMP] On a hotplug CPU system, only - attempt to substitute SMP alternatives once at boot. - smsc-ircc2.nopnp [HW] Don't use PNP to discover SMC devices smsc-ircc2.ircc_cfg= [HW] Device configuration I/O port smsc-ircc2.ircc_sir= [HW] SIR base I/O port
Makefile +1 -1
@@ -1,6 +1,6 @@ VERSION = 3 PATCHLEVEL = 2 -SUBLEVEL = 98 +SUBLEVEL = 99 EXTRAVERSION = NAME = Saber-toothed Squirrel
arch/s390/kernel/dis.c +2 -2
@@ -1542,7 +1542,7 @@ void show_code(struct pt_regs *regs) {char *mode = (regs->psw.mask &PSW_MASK_PSTATE ) ?"User" :"Krnl" ;unsigned char code[64 ]; -char buffer[64 ], *ptr; +char buffer[128 ], *ptr;mm_segment_t old_fs;unsigned long addr;int start, end, opsize, hops, i;
@@ -1600,7 +1600,7 @@ void show_code(struct pt_regs *regs) start += opsize;printk (buffer); ptr = buffer; - ptr +=sprintf (ptr,"\n " ); + ptr +=sprintf (ptr,"\n\t " ); hops++; }printk ("\n" );
arch/x86/include/asm/alternative.h +2 -2
@@ -61,7 +61,7 @@ extern void alternatives_smp_module_add(struct module *mod, char *name, void *locks, void *locks_end, void *text, void *text_end);extern void alternatives_smp_module_del (struct module *mod); -extern void alternatives_smp_switch (int smp); +extern void alternatives_enable_smp (void );extern int alternatives_text_reserved (void *start,void *end);extern bool skip_smp_alternatives;#else
@@ -69,7 +69,7 @@ static inline void alternatives_smp_module_add(struct module *mod, char *name, void *locks, void *locks_end, void *text, void *text_end) {} static inline void alternatives_smp_module_del(struct module *mod) {} -static inline void alternatives_smp_switch(int smp) {} +static inline void alternatives_enable_smp(void) {} static inline int alternatives_text_reserved(void *start, void *end) { return 0;
arch/x86/kernel/alternative.c +37 -92
234 lines not on this page · raw message
arch/x86/kernel/smpboot.c +2 -18
@@ -689,7 +689,8 @@ static int __cpuinit do_boot_cpu(int apicid, int cpu)INIT_WORK_ONSTACK (&c_idle.work, do_fork_idle); -alternatives_smp_switch (1 ); +/* Just in case we booted with a single CPU. */ +alternatives_enable_smp (); c_idle.idle =get_idle_for_cpu (cpu);
@@ -1109,20 +1110,6 @@ void __init native_smp_prepare_cpus(unsigned int max_cpus)preempt_enable (); } -void arch_disable_nonboot_cpus_begin (void ) -{ -/* -* Avoid the smp alternatives switch during the disable_nonboot_cpus(). -* In the suspend path, we will be back in the SMP mode shortly anyways. -*/ - skip_smp_alternatives = true; -} - -void arch_disable_nonboot_cpus_end (void ) -{ - skip_smp_alternatives = false; -} -void arch_enable_nonboot_cpus_begin (void ) {set_mtrr_aps_delayed_init ();
@@ -1321,9 +1308,6 @@ void native_cpu_die(unsigned int cpu)if (per_cpu (cpu_state, cpu) ==CPU_DEAD ) {if (system_state ==SYSTEM_RUNNING )pr_info ("CPU %u is now offline\n" , cpu); - -if (1 ==num_online_cpus ()) -alternatives_smp_switch (0 );return ; }msleep (100 );
arch/x86/kvm/svm.c +7 -0
@@ -3040,6 +3040,13 @@ static int svm_set_msr(struct kvm_vcpu *vcpu, unsigned ecx, u64 data)struct vcpu_svm *svm =to_svm (vcpu);switch (ecx) { +case MSR_IA32_CR_PAT : +if (!kvm_mtrr_valid (vcpu,MSR_IA32_CR_PAT , data)) +return 1 ; + vcpu->arch.pat = data; + svm->vmcb->save.g_pat = data; +mark_dirty (svm->vmcb,VMCB_NPT ); +break ;case MSR_IA32_TSC :kvm_write_tsc (vcpu, data);break ;
arch/x86/kvm/vmx.c +4 -0
@@ -2204,6 +2204,8 @@ static int vmx_set_msr(struct kvm_vcpu *vcpu, u32 msr_index, u64 data)break ;case MSR_IA32_CR_PAT :if (vmcs_config.vmentry_ctrl &VM_ENTRY_LOAD_IA32_PAT ) { +if (!kvm_mtrr_valid (vcpu,MSR_IA32_CR_PAT , data)) +return 1 ;vmcs_write64 (GUEST_IA32_PAT , data); vcpu->arch.pat = data;break ;
@@ -7076,6 +7078,8 @@ void load_vmcs12_host_state(struct kvm_vcpu *vcpu, struct vmcs12 *vmcs12)vmcs_writel (GUEST_SYSENTER_EIP , vmcs12->host_ia32_sysenter_eip);vmcs_writel (GUEST_IDTR_BASE , vmcs12->host_idtr_base);vmcs_writel (GUEST_GDTR_BASE , vmcs12->host_gdtr_base); +vmcs_write32 (GUEST_IDTR_LIMIT ,0xFFFF ); +vmcs_write32 (GUEST_GDTR_LIMIT ,0xFFFF );vmcs_writel (GUEST_TR_BASE , vmcs12->host_tr_base);vmcs_writel (GUEST_GS_BASE , vmcs12->host_gs_base);vmcs_writel (GUEST_FS_BASE , vmcs12->host_fs_base);
arch/x86/kvm/x86.c +3 -2
@@ -1274,7 +1274,7 @@ static bool valid_mtrr_type(unsigned t)return t <8 && (1 << t) &0x73 ;/* 0, 1, 4, 5, 6 */ } -static bool mtrr_valid (struct kvm_vcpu *vcpu,u32 msr,u64 data) +bool kvm_mtrr_valid (struct kvm_vcpu *vcpu,u32 msr,u64 data) {int i;
@@ -1300,12 +1300,13 @@ static bool mtrr_valid(struct kvm_vcpu *vcpu, u32 msr, u64 data)/* variable MTRRs */ return valid_mtrr_type (data &0xff ); } +EXPORT_SYMBOL_GPL (kvm_mtrr_valid);static int set_msr_mtrr (struct kvm_vcpu *vcpu,u32 msr,u64 data) {u64 *p = (u64 *)&vcpu->arch.mtrr_state.fixed_ranges; -if (!mtrr_valid (vcpu, msr, data)) +if (!kvm_mtrr_valid (vcpu, msr, data))return 1 ;if (msr == MSR_MTRRdefType) {
arch/x86/kvm/x86.h +2 -0
@@ -135,6 +135,8 @@ int kvm_write_guest_virt_system(struct x86_emulate_ctxt *ctxt, gva_t addr, void *val, unsigned int bytes, struct x86_exception *exception); +bool kvm_mtrr_valid (struct kvm_vcpu *vcpu,u32 msr,u64 data); +extern unsigned int min_timer_period_us;#endif
arch/x86/lib/x86-opcode-map.txt +1 -1
@@ -759,7 +759,7 @@ EndTable GrpTable: Grp3_1 0: TEST Eb,Ib -1: +1: TEST Eb,Ib 2: NOT Eb 3: NEG Eb 4: MUL AL,Eb
arch/x86/mm/kaiser.c +4 -1
@@ -189,6 +189,8 @@ static int kaiser_add_user_map(const void *__start_addr, unsigned long size,* requires that not to be #defined to 0): so mask it off here. */ flags &= ~_PAGE_GLOBAL; +if (!(__supported_pte_mask & _PAGE_NX)) + flags &= ~_PAGE_NX;if (flags & _PAGE_USER)BUG_ON (address <FIXADDR_START || end_addr >=FIXADDR_TOP );
@@ -411,7 +413,8 @@ pgd_t kaiser_set_shadow_pgd(pgd_t *pgdp, pgd_t pgd)* get out to userspace running on the kernel CR3, * userspace will crash instead of running. */ - pgd.pgd |= _PAGE_NX; +if (__supported_pte_mask & _PAGE_NX) + pgd.pgd |= _PAGE_NX; } }else if (!pgd.pgd) {/*
arch/x86/xen/smp.c +2 -4
@@ -368,7 +368,8 @@ static int __cpuinit xen_cpu_up(unsigned int cpu)return rc;if (num_online_cpus () ==1 ) -alternatives_smp_switch (1 ); +/* Just in case we booted with a single CPU. */ +alternatives_enable_smp (); rc =xen_smp_intr_init (cpu);if (rc)
@@ -414,9 +415,6 @@ static void xen_cpu_die(unsigned int cpu)unbind_from_irqhandler (per_cpu (xen_callfuncsingle_irq, cpu),NULL );xen_uninit_lock_cpu (cpu);xen_teardown_timer (cpu); - -if (num_online_cpus () ==1 ) -alternatives_smp_switch (0 ); }static void __cpuinit xen_play_dead (void )/* used only with HOTPLUG_CPU */
block/blk-core.c +3 -0
@@ -499,6 +499,9 @@ struct request_queue *blk_alloc_queue_node(gfp_t gfp_mask, int node_id)kobject_init (&q->kobj, &blk_queue_ktype); +#ifdef CONFIG_BLK_DEV_IO_TRACE +mutex_init (&q->blk_trace_mutex); +#endif mutex_init (&q->sysfs_lock);spin_lock_init (&q->__queue_lock);
drivers/char/tpm/tpm.c +6 -0
@@ -1114,6 +1114,12 @@ ssize_t tpm_write(struct file *file, const char __user *buf,return -EFAULT ; } +if (in_size <6 || + in_size <be32_to_cpu (*((__be32 *) (chip->data_buffer +2 )))) { +mutex_unlock (&chip->buffer_mutex); +return -EINVAL ; + } +/* atomic tpm command send and result receive */ out_size =tpm_transmit (chip, chip->data_buffer,TPM_BUFSIZE );if (out_size <0 ) {
drivers/infiniband/hw/mlx4/qp.c +1 -1
@@ -1047,7 +1047,7 @@ static int __mlx4_ib_modify_qp(struct ib_qp *ibqp, context->mtu_msgmax = (IB_MTU_4096 <<5 ) |ilog2 (dev->dev->caps.max_gso_sz); else - context->mtu_msgmax = (IB_MTU_4096 << 5) | 12; + context->mtu_msgmax = (IB_MTU_4096 << 5) | 13; }else if (attr_mask &IB_QP_PATH_MTU ) {if (attr->path_mtu <IB_MTU_256 || attr->path_mtu >IB_MTU_4096 ) { printk(KERN_ERR "path MTU (%u) is invalid\n",
drivers/infiniband/ulp/srp/ib_srp.c +19 -4
@@ -310,10 +310,19 @@ static void srp_path_rec_completion(int status,static int srp_lookup_path (struct srp_target_port *target) { +int ret = -ENODEV ; + target->path.numb_path =1 ;init_completion (&target->done); +/* +* Avoid that the SCSI host can be removed by srp_remove_target() +* before srp_path_rec_completion() is called. +*/ +if (!scsi_host_get (target->scsi_host)) + goto out; + target->path_query_id = ib_sa_path_rec_get(&srp_sa_client, target->srp_host->srp_dev->dev, target->srp_host->port,
@@ -327,16 +336,22 @@ static int srp_lookup_path(struct srp_target_port *target)GFP_KERNEL , srp_path_rec_completion, target, &target->path_query); -if (target->path_query_id <0 ) -return target->path_query_id; + ret = target->path_query_id; +if (ret <0 ) + goto put;wait_for_completion (&target->done); -if (target->status <0 ) + ret = target->status; +if (ret <0 )shost_printk (KERN_WARNING , target->scsi_host,PFX "Path record query failed\n" ); -return target->status; +put: +scsi_host_put (target->scsi_host); + +out: +return ret; }static int srp_send_req (struct srp_target_port *target)
drivers/input/misc/adxl34x.c +1 -1
@@ -797,7 +797,7 @@ struct adxl34x *adxl34x_probe(struct device *dev, int irq,if (pdata->watermark) { ac->int_mask |=WATERMARK ; -if (!FIFO_MODE (pdata->fifo_mode)) +if (FIFO_MODE (pdata->fifo_mode) ==FIFO_BYPASS ) ac->pdata.fifo_mode |=FIFO_STREAM ; }else { ac->int_mask |=DATA_READY ;
drivers/md/dm-bufio.c +6 -9
@@ -839,7 +839,8 @@ static void __get_memory_limit(struct dm_bufio_client *c, buffers =DM_BUFIO_MIN_BUFFERS ; *limit_buffers = buffers; - *threshold_buffers = buffers *DM_BUFIO_WRITEBACK_PERCENT /100 ; + *threshold_buffers =mult_frac (buffers, +DM_BUFIO_WRITEBACK_PERCENT ,100 ); }/*
@@ -1620,19 +1621,15 @@ static int __init dm_bufio_init(void)memset (&dm_bufio_caches,0 ,sizeof dm_bufio_caches);memset (&dm_bufio_cache_names,0 ,sizeof dm_bufio_cache_names); - mem = (__u64)((totalram_pages - totalhigh_pages) * -DM_BUFIO_MEMORY_PERCENT /100 ) <<PAGE_SHIFT ; + mem = (__u64 )mult_frac (totalram_pages - totalhigh_pages, +DM_BUFIO_MEMORY_PERCENT ,100 ) <<PAGE_SHIFT ;if (mem >ULONG_MAX ) mem =ULONG_MAX ;#ifdef CONFIG_MMU -/* -* Get the size of vmalloc space the same way as VMALLOC_TOTAL -* in fs/proc/internal.h -*/ -if (mem > (VMALLOC_END -VMALLOC_START ) *DM_BUFIO_VMALLOC_PERCENT /100 ) - mem = (VMALLOC_END -VMALLOC_START ) *DM_BUFIO_VMALLOC_PERCENT /100 ; +if (mem >mult_frac (VMALLOC_END -VMALLOC_START ,DM_BUFIO_VMALLOC_PERCENT ,100 )) + mem =mult_frac (VMALLOC_END -VMALLOC_START ,DM_BUFIO_VMALLOC_PERCENT ,100 );#endif dm_bufio_default_cache_size = mem;
drivers/md/dm-table.c +14 -18
@@ -1584,12 +1584,12 @@ struct mapped_device *dm_table_get_md(struct dm_table *t) }EXPORT_SYMBOL (dm_table_get_md); -static int device_discard_capable (struct dm_target *ti,struct dm_dev *dev, -sector_t start,sector_t len,void *data) +static int device_not_discard_capable (struct dm_target *ti,struct dm_dev *dev, +sector_t start,sector_t len,void *data) {struct request_queue *q =bdev_get_queue (dev->bdev); -return q &&blk_queue_discard (q); +return q && !blk_queue_discard (q); }bool dm_table_supports_discards (struct dm_table *t)
@@ -1597,26 +1597,22 @@ bool dm_table_supports_discards(struct dm_table *t)struct dm_target *ti;unsigned i =0 ; -/* -* Unless any target used by the table set discards_supported, -* require at least one underlying device to support discards. -* t->devices includes internal dm devices such as mirror logs -* so we need to use iterate_devices here, which targets -* supporting discard selectively must provide. -*/ while (i <dm_table_get_num_targets (t)) { ti =dm_table_get_target (t, i++);if (!ti->num_discard_requests) -continue ; +return false; -if (ti->discards_supported) -return 1 ; - -if (ti->type->iterate_devices && - ti->type->iterate_devices (ti, device_discard_capable,NULL )) -return 1 ; +/* +* Either the target provides discard support (as implied by setting +* 'discards_supported') or it relies on _all_ data devices having +* discard support. +*/ +if (!ti->discards_supported && + (!ti->type->iterate_devices || + ti->type->iterate_devices (ti, device_not_discard_capable,NULL ))) +return false; } -return 0 ; +return true; }
drivers/md/dm.c +8 -4
@@ -2685,11 +2685,15 @@ struct mapped_device *dm_get_from_kobject(struct kobject *kobj) md = container_of(kobj, struct mapped_device, kobj_holder.kobj); -if (test_bit (DMF_FREEING , &md->flags) || -dm_deleting_md (md)) -return NULL ; - +spin_lock (&_minor_lock); +if (test_bit (DMF_FREEING , &md->flags) ||dm_deleting_md (md)) { + md =NULL ; + goto out; + }dm_get (md); +out: +spin_unlock (&_minor_lock); +return md; }
drivers/media/rc/ir-lirc-codec.c +6 -3
@@ -255,11 +255,14 @@ static long ir_lirc_ioctl(struct file *filep, unsigned int cmd,if (!dev->max_timeout)return -ENOSYS ; +/* Check for multiply overflow */ +if (val > (u32)(-1 ) /1000 ) +return -EINVAL ; + tmp = val *1000 ; -if (tmp < dev->min_timeout || - tmp > dev->max_timeout) -return -EINVAL ; +if (tmp < dev->min_timeout || tmp > dev->max_timeout) +return -EINVAL ; dev->timeout = tmp;break ;
drivers/media/video/cx231xx/cx231xx-cards.c +1 -2
@@ -1070,8 +1070,7 @@ static int cx231xx_usb_probe(struct usb_interface *interface, dev->vbi_or_sliced_cc_mode =0 ;/* get maximum no.of IAD interfaces */ - assoc_desc = udev->actconfig->intf_assoc[0 ]; - dev->max_iad_interface_count = assoc_desc->bInterfaceCount; + dev->max_iad_interface_count = udev->config->desc.bNumInterfaces;/* init CIR module TBD */
drivers/media/video/omap/omap_vout.c +2 -1
@@ -1003,11 +1003,12 @@ static int omap_vout_open(struct file *file)struct omap_vout_device *vout =NULL ; vout =video_drvdata (file); -v4l2_dbg (1 , debug, &vout->vid_dev->v4l2_dev,"Entering %s\n" , __func__);if (vout ==NULL )return -ENODEV ; +v4l2_dbg (1 , debug, &vout->vid_dev->v4l2_dev,"Entering %s\n" , __func__); +/* for now, we only support single open */ if (vout->opened)return -EBUSY ;
drivers/mtd/nand/nand_base.c +6 -3
@@ -2290,6 +2290,7 @@ static int panic_nand_write(struct mtd_info *mtd, loff_t to, size_t len, size_t *retlen, const uint8_t *buf) { struct nand_chip *chip = mtd->priv; +int chipnr = (int )(to >> chip->chip_shift);struct mtd_oob_ops ops;int ret;
@@ -2299,12 +2300,14 @@ static int panic_nand_write(struct mtd_info *mtd, loff_t to, size_t len,if (!len)return 0 ; -/* Wait for the device to get ready */ -panic_nand_wait (mtd, chip,400 ); -/* Grab the device */ panic_nand_get_device (chip, mtd,FL_WRITING ); + chip->select_chip (mtd, chipnr); + +/* Wait for the device to get ready */ +panic_nand_wait (mtd, chip,400 ); + ops.len = len; ops.datbuf = (uint8_t *)buf; ops.oobbuf =NULL ;
drivers/net/wireless/rt2x00/rt2x00usb.c +3 -3
@@ -64,7 +64,7 @@ int rt2x00usb_vendor_request(struct rt2x00_dev *rt2x00dev,* -ENODEV: Device has disappeared, no point continuing. * All other errors: Try again. */ - else if (status == -ENODEV) { + else if (status == -ENODEV || status == -ENOENT) {clear_bit (DEVICE_STATE_PRESENT , &rt2x00dev->flags);break ; }
@@ -311,7 +311,7 @@ static bool rt2x00usb_kick_tx_entry(struct queue_entry *entry, void* data) status =usb_submit_urb (entry_priv->urb,GFP_ATOMIC );if (status) { -if (status == -ENODEV ) +if (status == -ENODEV || status == -ENOENT )clear_bit (DEVICE_STATE_PRESENT , &rt2x00dev->flags);set_bit (ENTRY_DATA_IO_FAILED , &entry->flags);rt2x00lib_dmadone (entry);
@@ -400,7 +400,7 @@ static bool rt2x00usb_kick_rx_entry(struct queue_entry *entry, void* data) status =usb_submit_urb (entry_priv->urb,GFP_ATOMIC );if (status) { -if (status == -ENODEV ) +if (status == -ENODEV || status == -ENOENT )clear_bit (DEVICE_STATE_PRESENT , &rt2x00dev->flags);set_bit (ENTRY_DATA_IO_FAILED , &entry->flags);rt2x00lib_dmadone (entry);
drivers/pci/pcie/aer/aerdrv_core.c +8 -1
@@ -367,7 +367,14 @@ static pci_ers_result_t broadcast_error_message(struct pci_dev *dev,* If the error is reported by an end point, we think this * error is related to the upstream link of the end point. */ -pci_walk_bus (dev->bus, cb, &result_data); +if (state == pci_channel_io_normal) +/* +* the error is non fatal so the bus is ok, just invoke +* the callback for the function that logged the error. +*/ +cb (dev, &result_data); +else +pci_walk_bus (dev->bus, cb, &result_data); }return result_data.result;
drivers/rtc/interface.c +15 -1
@@ -749,9 +749,23 @@ EXPORT_SYMBOL_GPL(rtc_irq_set_freq);*/ static int rtc_timer_enqueue (struct rtc_device *rtc,struct rtc_timer *timer) { +struct timerqueue_node *next =timerqueue_getnext (&rtc->timerqueue); +struct rtc_time tm; +ktime_t now; + timer->enabled =1 ; +__rtc_read_time (rtc, &tm); + now =rtc_tm_to_ktime (tm); + +/* Skip over expired timers */ +while (next) { +if (next->expires.tv64 >= now.tv64) +break ; + next =timerqueue_iterate_next (next); + } +timerqueue_add (&rtc->timerqueue, &timer->node); -if (&timer->node ==timerqueue_getnext (&rtc->timerqueue)) { +if (!next || timer->node.expires.tv64 < next->expires.tv64) {struct rtc_wkalrm alarm;int err; alarm.time =rtc_ktime_to_tm (timer->node.expires);
drivers/scsi/bfa/bfad_debugfs.c +3 -2
@@ -276,7 +276,8 @@ bfad_debugfs_write_regrd(struct file *file, const char __user *buf,struct bfad_s *bfad = port->bfad;struct bfa_s *bfa = &bfad->bfa;struct bfa_ioc_s *ioc = &bfa->ioc; -int addr, len, rc, i; +int addr, rc, i; +u32 len;u32 *regbuf;void __iomem *rb, *reg_addr;unsigned long flags;
@@ -296,7 +297,7 @@ bfad_debugfs_write_regrd(struct file *file, const char __user *buf, } rc =sscanf (kern_buf,"%x:%x" , &addr, &len); -if (rc <2 ) { +if (rc <2 || len > (UINT_MAX >>2 )) {printk (KERN_INFO "bfad[%d]: %s failed to read user buf\n" , bfad->inst_no, __func__);
drivers/staging/media/as102/as102_fw.c +17 -11
@@ -106,20 +106,25 @@ static int as102_firmware_upload(struct as102_bus_adapter_t *bus_adap,unsigned char *cmd, const struct firmware *firmware) { - struct as10x_fw_pkt_t fw_pkt; + struct as10x_fw_pkt_t *fw_pkt;int total_read_bytes =0 , errno =0 ;unsigned char addr_has_changed =0 ;ENTER (); + fw_pkt =kmalloc (sizeof (*fw_pkt),GFP_KERNEL ); +if (!fw_pkt) +return -ENOMEM ; + +for (total_read_bytes =0 ; total_read_bytes < firmware->size; ) {int read_bytes =0 , data_len =0 ;/* parse intel hex line */ read_bytes =parse_hex_line ( (u8 *) (firmware->data + total_read_bytes), - fw_pkt.raw.address, - fw_pkt.raw.data, + fw_pkt->raw.address, + fw_pkt->raw.data, &data_len, &addr_has_changed);
@@ -129,28 +134,28 @@ static int as102_firmware_upload(struct as102_bus_adapter_t *bus_adap,/* detect the end of file */ total_read_bytes += read_bytes;if (total_read_bytes == firmware->size) { - fw_pkt.u.request[0 ] =0x00 ; - fw_pkt.u.request[1 ] =0x03 ; + fw_pkt->u.request[0 ] =0x00 ; + fw_pkt->u.request[1 ] =0x03 ;/* send EOF command */ errno = bus_adap->ops->upload_fw_pkt (bus_adap, (uint8_t *) - &fw_pkt,2 ,0 ); + fw_pkt,2 ,0 );if (errno <0 ) goto error; }else {if (!addr_has_changed) {/* prepare command to send */ - fw_pkt.u.request[0 ] =0x00 ; - fw_pkt.u.request[1 ] =0x01 ; + fw_pkt->u.request[0 ] =0x00 ; + fw_pkt->u.request[1 ] =0x01 ; - data_len +=sizeof (fw_pkt.u.request); - data_len +=sizeof (fw_pkt.raw.address); + data_len +=sizeof (fw_pkt->u.request); + data_len +=sizeof (fw_pkt->raw.address);/* send cmd to device */ errno = bus_adap->ops->upload_fw_pkt (bus_adap, (uint8_t *) - &fw_pkt, + fw_pkt, data_len,0 );if (errno <0 )
@@ -159,6 +164,7 @@ static int as102_firmware_upload(struct as102_bus_adapter_t *bus_adap, } } error: +kfree (fw_pkt);LEAVE ();return (errno ==0 ) ? total_read_bytes : errno; }
drivers/staging/usbip/stub_rx.c +40 -18
101 lines not on this page · raw message
drivers/staging/usbip/stub_tx.c +7 -0
@@ -178,6 +178,13 @@ static int stub_send_ret_submit(struct stub_device *sdev)memset (&pdu_header,0 ,sizeof (pdu_header));memset (&msg,0 ,sizeof (msg)); +if (urb->actual_length >0 && !urb->transfer_buffer) { +dev_err (&sdev->interface->dev, +"urb: actual_length %d transfer_buffer null\n" , + urb->actual_length); +return -1 ; + } +if (usb_pipetype (urb->pipe) ==PIPE_ISOCHRONOUS ) iovnum =2 + urb->number_of_packets;else
drivers/staging/usbip/usbip_common.h +1 -0
@@ -276,6 +276,7 @@ struct usbip_device {/* lock for status */ spinlock_t lock; +int sockfd;struct socket *tcp_socket;struct task_struct *tcp_rx;
drivers/staging/usbip/userspace/libsrc/usbip_common.c +1 -1
@@ -164,7 +164,7 @@ int read_attr_speed(struct sysfs_device *dev) goto err; } - ret =sscanf (attr->value,"%s\n" , speed); + ret =sscanf (attr->value,"%99s\n" , speed);if (ret <1 ) {dbg ("sscanf failed" ); goto err;
drivers/staging/usbip/userspace/libsrc/vhci_driver.c +4 -4
@@ -63,12 +63,12 @@ static int parse_status(char *value)while (*c !='\0' ) {int port, status, speed, devid; -unsigned long socket; +int sockfd;char lbusid[SYSFS_BUS_ID_SIZE ]; - ret =sscanf (c,"%d %d %d %x %lx %s\n" , + ret =sscanf (c,"%d %d %d %x %u %31s\n" , &port, &status, &speed, - &devid, &socket, lbusid); + &devid, &sockfd, lbusid);if (ret <5 ) {dbg ("sscanf failed: %d" , ret);
@@ -77,7 +77,7 @@ static int parse_status(char *value)dbg ("port %d status %d speed %d devid %x" , port, status, speed, devid); -dbg ("socket %lx lbusid %s" , socket, lbusid); +dbg ("sockfd %u lbusid %s" , sockfd, lbusid);/* if a device is connected, look at it */
drivers/staging/usbip/vhci_hcd.c +0 -39
@@ -391,29 +391,6 @@ static int vhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, dum->port_status[rhport] |=USB_PORT_STAT_ENABLE ; } -#if 0 -if (dum->driver) { - dum->port_status[rhport] |= -USB_PORT_STAT_ENABLE ; -/* give it the best speed we agree on */ - dum->gadget.speed = dum->driver->speed; - dum->gadget.ep0->maxpacket =64 ; -switch (dum->gadget.speed) { -case USB_SPEED_HIGH : - dum->port_status[rhport] |= -USB_PORT_STAT_HIGH_SPEED ; -break ; -case USB_SPEED_LOW : - dum->gadget.ep0->maxpacket =8 ; - dum->port_status[rhport] |= -USB_PORT_STAT_LOW_SPEED ; -break ; -default : - dum->gadget.speed =USB_SPEED_FULL ; -break ; - } - } -#endif } ((u16 *) buf)[0 ] =cpu_to_le16 (dum->port_status[rhport]); ((u16 *) buf)[1 ] =cpu_to_le16 (dum->port_status[rhport] >>16 );
@@ -430,15 +407,6 @@ static int vhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue,case USB_PORT_FEAT_SUSPEND :usbip_dbg_vhci_rh (" SetPortFeature: " "USB_PORT_FEAT_SUSPEND\n" ); -#if 0 - dum->port_status[rhport] |= - (1 <<USB_PORT_FEAT_SUSPEND ); -if (dum->driver->suspend) { -spin_unlock (&dum->lock); - dum->driver->suspend (&dum->gadget); -spin_lock (&dum->lock); - } -#endif break ;case USB_PORT_FEAT_RESET : usbip_dbg_vhci_rh(" SetPortFeature: "
@@ -449,13 +417,6 @@ static int vhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, ~(USB_PORT_STAT_ENABLE |USB_PORT_STAT_LOW_SPEED |USB_PORT_STAT_HIGH_SPEED ); -#if 0 -if (dum->driver) { -dev_dbg (hardware,"disconnect\n" ); -stop_activity (dum, dum->driver); - } -#endif -/* FIXME test that code path! */ }/* 50msec reset signaling */
drivers/staging/usbip/vhci_sysfs.c +13 -7
@@ -38,13 +38,18 @@ static ssize_t show_status(struct device *dev, struct device_attribute *attr,/* * output example: -* prt sta spd dev socket local_busid -* 000 004 000 000 c5a7bb80 1-2.3 -* 001 004 000 000 d8cee980 2-3.4 +* prt sta spd dev sockfd local_busid +* 000 004 000 000 3 1-2.3 +* 001 004 000 000 4 2-3.4 +* +* Output includes socket fd instead of socket pointer address to avoid +* leaking kernel memory address in: +* /sys/devices/platform/vhci_hcd.0/status and in debug output. +* The socket pointer address is not used at the moment and it was made +* visible as a convenient way to find IP address from socket pointer +* address by looking up /proc/net/{tcp,tcp6}. As this opens a security +* hole, the change is made to use sockfd instead. * -* IP address can be retrieved from a socket pointer address by looking -* up /proc/net/{tcp,tcp6}. Also, a userland program may remember a -* port number and its peer IP address. */ out +=sprintf (out,"prt sta spd bus dev socket " "local_busid\n" );
@@ -58,7 +63,7 @@ static ssize_t show_status(struct device *dev, struct device_attribute *attr,if (vdev->ud.status ==VDEV_ST_USED ) { out +=sprintf (out,"%03u %08x " , vdev->speed, vdev->devid); - out +=sprintf (out,"%16p " , vdev->ud.tcp_socket); + out +=sprintf (out,"%u" , vdev->ud.sockfd); out +=sprintf (out,"%s" ,dev_name (&vdev->udev->dev)); }else {
@@ -215,6 +220,7 @@ static ssize_t store_attach(struct device *dev, struct device_attribute *attr, vdev->devid = devid; vdev->speed = speed; + vdev->ud.sockfd = sockfd; vdev->ud.tcp_socket = socket; vdev->ud.status =VDEV_ST_NOTASSIGNED ;
drivers/usb/core/devio.c +14 -0
@@ -1402,6 +1402,18 @@ static int proc_unlinkurb(struct dev_state *ps, void __user *arg)return 0 ; } +static void compute_isochronous_actual_length (struct urb *urb) +{ +unsigned int i; + +if (urb->number_of_packets >0 ) { + urb->actual_length =0 ; +for (i =0 ; i < urb->number_of_packets; i++) + urb->actual_length += + urb->iso_frame_desc[i].actual_length; + } +} +static int processcompl (struct async *as,void __user *__user *arg) {struct urb *urb = as->urb;
@@ -1409,6 +1421,7 @@ static int processcompl(struct async *as, void __user * __user *arg)void __user *addr = as->userurb;unsigned int i; +compute_isochronous_actual_length (urb);if (as->userbuffer && urb->actual_length) {if (urb->number_of_packets >0 )/* Isochronous */ i = urb->transfer_buffer_length;
@@ -1581,6 +1594,7 @@ static int processcompl_compat(struct async *as, void __user * __user *arg)void __user *addr = as->userurb;unsigned int i; +compute_isochronous_actual_length (urb);if (as->userbuffer && urb->actual_length) {if (urb->number_of_packets >0 )/* Isochronous */ i = urb->transfer_buffer_length;
drivers/usb/core/quirks.c +3 -0
@@ -205,6 +205,9 @@ static const struct usb_device_id usb_quirk_list[] = {/* Corsair Strafe RGB */ { USB_DEVICE(0x1b1c, 0x1b20), .driver_info = USB_QUIRK_DELAY_INIT }, + /* Corsair K70 LUX */ + { USB_DEVICE(0x1b1c, 0x1b36), .driver_info = USB_QUIRK_DELAY_INIT }, + /* MIDI keyboard WORLDE MINI */ { USB_DEVICE(0x1c75, 0x0204), .driver_info = USB_QUIRK_CONFIG_INTF_STRINGS },
drivers/usb/serial/garmin_gps.c +19 -3
@@ -142,6 +142,7 @@ struct garmin_data {__u8 privpkt[4 *6 ];spinlock_t lock;struct list_head pktlist; +struct usb_anchor write_urbs; };
@@ -923,13 +924,19 @@ static int garmin_init_session(struct usb_serial_port *port) sizeof(GARMIN_START_SESSION_REQ), 0);if (status <0 ) -break ; + goto err_kill_urbs; }if (status >0 ) status =0 ; } +return status; + +err_kill_urbs: +usb_kill_anchored_urbs (&garmin_data_p->write_urbs); +usb_kill_urb (port->interrupt_in_urb); +return status; }
@@ -950,7 +957,6 @@ static int garmin_open(struct tty_struct *tty, struct usb_serial_port *port)spin_unlock_irqrestore (&garmin_data_p->lock, flags);/* shutdown any bulk reads that might be going on */ -usb_kill_urb (port->write_urb);usb_kill_urb (port->read_urb);if (garmin_data_p->state ==STATE_RESET )
@@ -977,7 +983,7 @@ static void garmin_close(struct usb_serial_port *port)/* shutdown our urbs */ usb_kill_urb (port->read_urb); -usb_kill_urb (port->write_urb); +usb_kill_anchored_urbs (&garmin_data_p->write_urbs);/* keep reset state so we know that we must start a new session */ if (garmin_data_p->state !=STATE_RESET )
@@ -1069,12 +1075,14 @@ static int garmin_write_bulk(struct usb_serial_port *port, }/* send it down the pipe */ +usb_anchor_urb (urb, &garmin_data_p->write_urbs); status =usb_submit_urb (urb,GFP_ATOMIC );if (status) {dev_err (&port->dev,"%s - usb_submit_urb(write bulk) failed with status = %d\n" , __func__, status); count = status; +usb_unanchor_urb (urb);kfree (buffer); }
@@ -1464,9 +1472,16 @@ static int garmin_attach(struct usb_serial *serial) garmin_data_p->state =0 ; garmin_data_p->flags =0 ; garmin_data_p->count =0 ; +init_usb_anchor (&garmin_data_p->write_urbs);usb_set_serial_port_data (port, garmin_data_p); status =garmin_init_session (port); +if (status) + goto err_free; + +return 0 ; +err_free: +kfree (garmin_data_p);return status; }
@@ -1479,6 +1494,7 @@ static void garmin_disconnect(struct usb_serial *serial)dbg ("%s" , __func__); +usb_kill_anchored_urbs (&garmin_data_p->write_urbs);usb_kill_urb (port->interrupt_in_urb);del_timer_sync (&garmin_data_p->timer); }
drivers/video/udlfb.c +5 -5
@@ -765,11 +765,11 @@ static int dlfb_get_edid(struct dlfb_data *dev, char *edid, int len)for (i =0 ; i < len; i++) { ret =usb_control_msg (dev->udev, -usb_rcvctrlpipe (dev->udev,0 ), (0x02 ), - (0x80 | (0x02 <<5 )), i <<8 ,0xA1 , rbuf,2 , -HZ ); -if (ret <1 ) { -pr_err ("Read EDID byte %d failed err %x\n" , i, ret); +usb_rcvctrlpipe (dev->udev,0 ),0x02 , + (0x80 | (0x02 <<5 )), i <<8 ,0xA1 , + rbuf,2 ,USB_CTRL_GET_TIMEOUT ); +if (ret <2 ) { +pr_err ("Read EDID byte %d failed: %d\n" , i, ret); i--;break ; }
fs/9p/vfs_inode.c +3 -0
@@ -469,6 +469,9 @@ static int v9fs_test_inode(struct inode *inode, void *data)if (v9inode->qid.type != st->qid.type)return 0 ; + +if (v9inode->qid.path != st->qid.path) +return 0 ;return 1 ; }
fs/9p/vfs_inode_dotl.c +3 -0
@@ -105,6 +105,9 @@ static int v9fs_test_inode_dotl(struct inode *inode, void *data)if (v9inode->qid.type != st->qid.type)return 0 ; + +if (v9inode->qid.path != st->qid.path) +return 0 ;return 1 ; }
fs/autofs4/waitq.c +33 -12
93 lines not on this page · raw message
fs/coda/upcall.c +1 -2
@@ -447,8 +447,7 @@ int venus_fsync(struct super_block *sb, struct CodaFid *fid)UPARG (CODA_FSYNC ); inp->coda_fsync.VFid = *fid; - error =coda_upcall (coda_vcp (sb),sizeof (union inputArgs ), - &outsize, inp); + error =coda_upcall (coda_vcp (sb), insize, &outsize, inp);CODA_FREE (inp, insize);return error;
fs/ecryptfs/messaging.c +4 -4
@@ -550,17 +550,17 @@ void ecryptfs_release_messaging(void)mutex_unlock (&ecryptfs_msg_ctx_lists_mux); }if (ecryptfs_daemon_hash) { -struct hlist_node *elem;struct ecryptfs_daemon *daemon; +struct hlist_node *elem, *n;int i;mutex_lock (&ecryptfs_daemon_hash_mux);for (i =0 ; i < (1 << ecryptfs_hash_bits); i++) {int rc; -hlist_for_each_entry (daemon, elem, - &ecryptfs_daemon_hash[i], - euid_chain) { +hlist_for_each_entry_safe (daemon, elem, n, + &ecryptfs_daemon_hash[i], + euid_chain) { rc =ecryptfs_exorcise_daemon (daemon);if (rc) printk(KERN_ERR "%s: Error whilst "
fs/isofs/isofs.h +1 -1
@@ -103,7 +103,7 @@ static inline unsigned int isonum_733(char *p)/* Ignore bigendian datum due to broken mastering programs */ return get_unaligned_le32 (p); } -extern int iso_date (char *,int ); +extern int iso_date (u8 *,int );struct inode ;/* To make gcc happy */
fs/isofs/rock.h +1 -1
@@ -65,7 +65,7 @@ struct RR_PL_s { };struct stamp { -char time[7 ]; +__u8 time[7 ];/* actually 6 unsigned, 1 signed */ } __attribute__ ((packed));struct RR_TF_s {
fs/isofs/util.c +1 -1
@@ -14,7 +14,7 @@* to GMT. Thus we should always be correct. */ -int iso_date (char * p,int flag) +int iso_date (u8 *p,int flag) {int year, month, day, hour, minute, second, tz;int crtime, days, i;
fs/nfs/nfs4proc.c +8 -10
@@ -151,15 +151,12 @@ const u32 nfs4_fsinfo_bitmap[3] = { FATTR4_WORD0_MAXFILESIZE };const u32 nfs4_fs_locations_bitmap[2 ] = { -FATTR4_WORD0_TYPE - |FATTR4_WORD0_CHANGE +FATTR4_WORD0_CHANGE |FATTR4_WORD0_SIZE |FATTR4_WORD0_FSID |FATTR4_WORD0_FILEID |FATTR4_WORD0_FS_LOCATIONS , -FATTR4_WORD1_MODE - |FATTR4_WORD1_NUMLINKS - |FATTR4_WORD1_OWNER +FATTR4_WORD1_OWNER |FATTR4_WORD1_OWNER_GROUP |FATTR4_WORD1_RAWDEV |FATTR4_WORD1_SPACE_USED
@@ -4805,9 +4802,7 @@ int nfs4_proc_fs_locations(struct inode *dir, const struct qstr *name, struct nfs4_fs_locations *fs_locations, struct page *page) { struct nfs_server *server = NFS_SERVER(dir); -u32 bitmask[2 ] = { - [0 ] =FATTR4_WORD0_FSID |FATTR4_WORD0_FS_LOCATIONS , - }; +u32 bitmask[2 ]; struct nfs4_fs_locations_arg args = { .dir_fh = NFS_FH(dir), .name = name,
@@ -4826,12 +4821,15 @@ int nfs4_proc_fs_locations(struct inode *dir, const struct qstr *name,dprintk ("%s: start\n" , __func__); + bitmask[0 ] = nfs4_fattr_bitmap[0 ] |FATTR4_WORD0_FS_LOCATIONS ; + bitmask[1 ] = nfs4_fattr_bitmap[1 ]; +/* Ask for the fileid of the absent filesystem if mounted_on_fileid * is not supported */ if (NFS_SERVER (dir)->attr_bitmask[1 ] &FATTR4_WORD1_MOUNTED_ON_FILEID ) - bitmask[1 ] |=FATTR4_WORD1_MOUNTED_ON_FILEID ; + bitmask[0 ] &= ~FATTR4_WORD0_FILEID ;else - bitmask[0 ] |=FATTR4_WORD0_FILEID ; + bitmask[1 ] &= ~FATTR4_WORD1_MOUNTED_ON_FILEID ;nfs_fattr_init (&fs_locations->fattr); fs_locations->server = server;
fs/nilfs2/segment.c +4 -2
@@ -1880,8 +1880,6 @@ static int nilfs_segctor_collect_dirty_files(struct nilfs_sc_info *sci, "failed to get inode block.\n");return err; } -mark_buffer_dirty (ibh); -nilfs_mdt_mark_dirty (ifile);spin_lock (&nilfs->ns_inode_lock);if (likely (!ii->i_bh)) ii->i_bh = ibh;
@@ -1890,6 +1888,10 @@ static int nilfs_segctor_collect_dirty_files(struct nilfs_sc_info *sci, goto retry; } +// Always redirty the buffer to avoid race condition +mark_buffer_dirty (ii->i_bh); +nilfs_mdt_mark_dirty (ifile); +clear_bit (NILFS_I_QUEUED , &ii->i_state);set_bit (NILFS_I_BUSY , &ii->i_state);list_move_tail (&ii->i_dirty, &sci->sc_dirty_files);
fs/ocfs2/alloc.c +1 -1
@@ -7127,7 +7127,7 @@ int ocfs2_truncate_inline(struct inode *inode, struct buffer_head *di_bh,if (end >i_size_read (inode)) end =i_size_read (inode); -BUG_ON (start >= end); +BUG_ON (start > end); if (!(OCFS2_I(inode)->ip_dyn_features & OCFS2_INLINE_DATA_FL) || !(le16_to_cpu(di->i_dyn_features) & OCFS2_INLINE_DATA_FL) ||
fs/ocfs2/file.c +2 -7
@@ -474,11 +474,6 @@ static int ocfs2_truncate_file(struct inode *inode, goto bail; } -/* lets handle the simple truncate cases before doing any more -* cluster locking. */ -if (new_i_size ==le64_to_cpu (fe->i_size)) - goto bail; -down_write (&OCFS2_I (inode)->ip_alloc_sem); ocfs2_resv_discard(&osb->osb_la_resmap,
@@ -1149,14 +1144,14 @@ int ocfs2_setattr(struct dentry *dentry, struct iattr *attr) goto bail_unlock_rw; } -if (size_change && attr->ia_size !=i_size_read (inode)) { +if (size_change) { status =inode_newsize_ok (inode, attr->ia_size);if (status) goto bail_unlock;inode_dio_wait (inode); -if (i_size_read (inode) > attr->ia_size) { +if (i_size_read (inode) >= attr->ia_size) {if (ocfs2_should_order_data (inode)) { status =ocfs2_begin_ordered_truncate (inode, attr->ia_size);
include/linux/blkdev.h +1 -0
@@ -361,6 +361,7 @@ struct request_queue {int node;#ifdef CONFIG_BLK_DEV_IO_TRACE struct blk_trace *blk_trace; +struct mutex blk_trace_mutex;#endif /* * for flush operations
include/linux/usb/ch9.h +19 -0
@@ -390,6 +390,11 @@ struct usb_endpoint_descriptor {#define USB_ENDPOINT_XFER_INT 3#define USB_ENDPOINT_MAX_ADJUSTABLE 0x80 +#define USB_EP_MAXP_MULT_SHIFT 11 +#define USB_EP_MAXP_MULT_MASK (3 << USB_EP_MAXP_MULT_SHIFT) +#define USB_EP_MAXP_MULT (m) \ + (((m) & USB_EP_MAXP_MULT_MASK) >> USB_EP_MAXP_MULT_SHIFT) +#define USB_ENDPOINT_SYNCTYPE 0x0c#define USB_ENDPOINT_SYNC_NONE (0 << 2)#define USB_ENDPOINT_SYNC_ASYNC (1 << 2)
@@ -592,6 +597,20 @@ static inline int usb_endpoint_maxp(const struct usb_endpoint_descriptor *epd)return __le16_to_cpu (epd->wMaxPacketSize); } +/** +* usb_endpoint_maxp_mult - get endpoint's transactional opportunities +* @epd: endpoint to be checked +* +* Return @epd's wMaxPacketSize[12:11] + 1 +*/ +static inline int +usb_endpoint_maxp_mult (const struct usb_endpoint_descriptor *epd) +{ +int maxp =__le16_to_cpu (epd->wMaxPacketSize); + +return USB_EP_MAXP_MULT (maxp) +1 ; +} +/*-------------------------------------------------------------------------*/ /* USB_DT_SS_ENDPOINT_COMP: SuperSpeed Endpoint Companion descriptor */
include/net/sctp/sctp.h +2 -0
@@ -705,6 +705,8 @@ static inline void sctp_v6_map_v4(union sctp_addr *addr)static inline void sctp_v4_map_v6 (union sctp_addr *addr) { addr->v6.sin6_family =AF_INET6 ; + addr->v6.sin6_flowinfo =0 ; + addr->v6.sin6_scope_id =0 ; addr->v6.sin6_port = addr->v4.sin_port; addr->v6.sin6_addr.s6_addr32[3 ] = addr->v4.sin_addr.s_addr; addr->v6.sin6_addr.s6_addr32[0 ] =0 ;
include/net/sctp/structs.h +3 -5
@@ -603,10 +603,6 @@ struct sctp_af { int saddr);void (*from_sk) (union sctp_addr *,struct sock *sk); -void (*to_sk_saddr) (union sctp_addr *, -struct sock *sk); -void (*to_sk_daddr) (union sctp_addr *, -struct sock *sk);void (*from_addr_param) (union sctp_addr *,union sctp_addr_param *,__be16 port,int iif);
@@ -647,7 +643,9 @@ struct sctp_pf {int (*supported_addrs)(const struct sctp_sock *,__be16 *);struct sock *(*create_accept_sk) (struct sock *sk,struct sctp_association *asoc); -void (*addr_v4map) (struct sctp_sock *,union sctp_addr *); +int (*addr_to_user)(struct sctp_sock *sk,union sctp_addr *addr); +void (*to_sk_saddr)(union sctp_addr *,struct sock *sk); +void (*to_sk_daddr)(union sctp_addr *,struct sock *sk);struct sctp_af *af; };
kernel/cpu.c +0 -11
@@ -406,14 +406,6 @@ int __cpuinit cpu_up(unsigned int cpu)#ifdef CONFIG_PM_SLEEP_SMP static cpumask_var_t frozen_cpus; -void __weak arch_disable_nonboot_cpus_begin (void ) -{ -} - -void __weak arch_disable_nonboot_cpus_end (void ) -{ -} -int disable_nonboot_cpus (void ) {int cpu, first_cpu, error =0 ;
@@ -425,7 +417,6 @@ int disable_nonboot_cpus(void)* with the userspace trying to use the CPU hotplug at the same time */ cpumask_clear (frozen_cpus); -arch_disable_nonboot_cpus_begin ();printk ("Disabling non-boot CPUs ...\n" );for_each_online_cpu (cpu) {
@@ -441,8 +432,6 @@ int disable_nonboot_cpus(void) } } -arch_disable_nonboot_cpus_end (); -if (!error) {BUG_ON (num_online_cpus () >1 );/* Make sure the CPUs won't be enabled by someone else */
kernel/extable.c +2 -0
@@ -28,6 +28,8 @@* mutex protecting text section modification (dynamic code patching). * some users need to sleep (allocating memory...) while they hold this lock. * +* Note: Also protects SMP-alternatives modification on x86. +* * NOT exported to modules - patching kernel text is a really delicate matter. */ DEFINE_MUTEX (text_mutex);
kernel/trace/blktrace.c +60 -16
170 lines not on this page · raw message
net/9p/client.c +1 -2
@@ -740,8 +740,7 @@ p9_client_rpc(struct p9_client *c, int8_t type, const char *fmt, ...) goto reterr; }/* Wait for the response */ - err =wait_event_interruptible (*req->wq, - req->status >=REQ_STATUS_RCVD ); + err =wait_event_killable (*req->wq, req->status >=REQ_STATUS_RCVD );if (req->status ==REQ_STATUS_ERROR ) {P9_DPRINTK (P9_DEBUG_ERROR ,"req_status error %d\n" , req->t_err);
net/9p/trans_virtio.c +6 -7
@@ -276,8 +276,8 @@ p9_virtio_request(struct p9_client *client, struct p9_req_t *req)if (err == -ENOSPC ) { chan->ring_bufs_avail =0 ;spin_unlock_irqrestore (&chan->lock, flags); - err =wait_event_interruptible (*chan->vc_wq, - chan->ring_bufs_avail); + err =wait_event_killable (*chan->vc_wq, + chan->ring_bufs_avail);if (err == -ERESTARTSYS )return err;
@@ -309,7 +309,7 @@ static int p9_get_mapped_pages(struct virtio_chan *chan,* Other zc request to finish here */ if (atomic_read (&vp_pinned) >= chan->p9_max_pages) { - err =wait_event_interruptible (vp_wq, + err =wait_event_killable (vp_wq, (atomic_read (&vp_pinned) < chan->p9_max_pages));if (err == -ERESTARTSYS )return err;
@@ -419,8 +419,8 @@ p9_virtio_zc_request(struct p9_client *client, struct p9_req_t *req,if (err == -ENOSPC ) { chan->ring_bufs_avail =0 ;spin_unlock_irqrestore (&chan->lock, flags); - err =wait_event_interruptible (*chan->vc_wq, - chan->ring_bufs_avail); + err =wait_event_killable (*chan->vc_wq, + chan->ring_bufs_avail);if (err == -ERESTARTSYS ) goto err_out;
@@ -438,8 +438,7 @@ p9_virtio_zc_request(struct p9_client *client, struct p9_req_t *req,virtqueue_kick (chan->vq);spin_unlock_irqrestore (&chan->lock, flags);P9_DPRINTK (P9_DEBUG_TRANS ,"9p debug: virtio request kicked\n" ); - err =wait_event_interruptible (*req->wq, - req->status >=REQ_STATUS_RCVD ); + err =wait_event_killable (*req->wq, req->status >=REQ_STATUS_RCVD );/* * Non kernel buffers are pinned, unpin them */
net/l2tp/l2tp_core.c +28 -14
90 lines not on this page · raw message
net/l2tp/l2tp_core.h +3 -0
@@ -246,9 +246,12 @@ extern struct l2tp_tunnel *l2tp_tunnel_find_nth(struct net *net, int nth);extern int l2tp_tunnel_create (struct net *net,int fd,int version,u32 tunnel_id,u32 peer_tunnel_id,struct l2tp_tunnel_cfg *cfg,struct l2tp_tunnel **tunnelp);extern int l2tp_tunnel_delete (struct l2tp_tunnel *tunnel);extern struct l2tp_session *l2tp_session_create (int priv_size,struct l2tp_tunnel *tunnel,u32 session_id,u32 peer_session_id,struct l2tp_session_cfg *cfg); +int l2tp_session_register (struct l2tp_session *session, +struct l2tp_tunnel *tunnel);extern int l2tp_session_delete (struct l2tp_session *session);extern void l2tp_session_free (struct l2tp_session *session);extern void l2tp_recv_common (struct l2tp_session *session,struct sk_buff *skb,unsigned char *ptr,unsigned char *optr,u16 hdrflags,int length,int (*payload_hook)(struct sk_buff *skb)); +extern int l2tp_session_queue_purge (struct l2tp_session *session);extern int l2tp_udp_encap_recv (struct sock *sk,struct sk_buff *skb);extern int l2tp_xmit_skb (struct l2tp_session *session,struct sk_buff *skb,int hdr_len);
net/l2tp/l2tp_eth.c +74 -22
175 lines not on this page · raw message
net/l2tp/l2tp_ppp.c +155 -121
465 lines not on this page · raw message
net/netfilter/xt_TCPMSS.c +28 -15
95 lines not on this page · raw message
net/netfilter/xt_TCPOPTSTRIP.c +16 -3
@@ -30,18 +30,31 @@ static inline unsigned int optlen(const u_int8_t *opt, unsigned int offset)static unsigned int tcpoptstrip_mangle_packet (struct sk_buff *skb, -const struct xt_tcpoptstrip_target_info *info, +const struct xt_action_param *par,unsigned int tcphoff,unsigned int minlen) { +const struct xt_tcpoptstrip_target_info *info = par->targinfo;unsigned int optl, i, j;struct tcphdr *tcph;u_int16_t n, o;u_int8_t *opt; +int len; + +/* This is a fragment, no TCP header is available */ +if (par->fragoff !=0 ) +return XT_CONTINUE ;if (!skb_make_writable (skb, skb->len))return NF_DROP ; + len = skb->len - tcphoff; +if (len < (int )sizeof (struct tcphdr )) +return NF_DROP ; + tcph = (struct tcphdr *)(skb_network_header (skb) + tcphoff); +if (tcph->doff *4 > len) +return NF_DROP ; + opt = (u_int8_t *)tcph;/*
@@ -76,7 +89,7 @@ tcpoptstrip_mangle_packet(struct sk_buff *skb,static unsigned int tcpoptstrip_tg4 (struct sk_buff *skb,const struct xt_action_param *par) { -return tcpoptstrip_mangle_packet (skb, par->targinfo,ip_hdrlen (skb), +return tcpoptstrip_mangle_packet (skb, par,ip_hdrlen (skb),sizeof (struct iphdr ) +sizeof (struct tcphdr )); }
@@ -93,7 +106,7 @@ tcpoptstrip_tg6(struct sk_buff *skb, const struct xt_action_param *par)if (tcphoff <0 )return NF_DROP ; -return tcpoptstrip_mangle_packet (skb, par->targinfo, tcphoff, +return tcpoptstrip_mangle_packet (skb, par, tcphoff, sizeof(*ipv6h) + sizeof(struct tcphdr)); }#endif
net/rds/rdma.c +4 -0
@@ -516,6 +516,9 @@ int rds_rdma_extra_size(struct rds_rdma_args *args) local_vec = (struct rds_iovec __user *)(unsigned long ) args->local_vec_addr; +if (args->nr_local ==0 ) +return -EINVAL ; +/* figure out the number of pages in the vector */ for (i =0 ; i < args->nr_local; i++) { if (copy_from_user(&vec, &local_vec[i],
@@ -852,6 +855,7 @@ int rds_cmsg_atomic(struct rds_sock *rs, struct rds_message *rm, err:if (page)put_page (page); + rm->atomic.op_active =0 ;kfree (rm->atomic.op_notifier);return ret;
net/sctp/ipv6.c +86 -74
253 lines not on this page · raw message
net/sctp/protocol.c +6 -6
@@ -615,10 +615,10 @@ static struct sock *sctp_v4_create_accept_sk(struct sock *sk,return newsk; } -/* Map address, empty for v4 family */ -static void sctp_v4_addr_v4map (struct sctp_sock *sp,union sctp_addr *addr) +static int sctp_v4_addr_to_user (struct sctp_sock *sp,union sctp_addr *addr) { -/* Empty */ +/* No address mapping for V4 sockets */ +return sizeof (struct sockaddr_in ); }/* Dump the v4 addr to the seq file. */
@@ -1010,7 +1010,9 @@ static struct sctp_pf sctp_pf_inet = { .send_verify = sctp_inet_send_verify, .supported_addrs = sctp_inet_supported_addrs, .create_accept_sk = sctp_v4_create_accept_sk, - .addr_v4map = sctp_v4_addr_v4map, + .addr_to_user = sctp_v4_addr_to_user, + .to_sk_saddr = sctp_v4_to_sk_saddr, + .to_sk_daddr = sctp_v4_to_sk_daddr, .af = &sctp_af_inet };
@@ -1081,8 +1083,6 @@ static struct sctp_af sctp_af_inet = { .copy_addrlist = sctp_v4_copy_addrlist, .from_skb = sctp_v4_from_skb, .from_sk = sctp_v4_from_sk, - .to_sk_saddr = sctp_v4_to_sk_saddr, - .to_sk_daddr = sctp_v4_to_sk_daddr, .from_addr_param = sctp_v4_from_addr_param, .to_addr_param = sctp_v4_to_addr_param, .cmp_addr = sctp_v4_cmp_addr,
net/sctp/socket.c +16 -17
@@ -265,7 +265,7 @@ static struct sctp_transport *sctp_addr_id2transport(struct sock *sk,if (id_asoc && (id_asoc != addr_asoc))return NULL ; -sctp_get_pf_specific (sk->sk_family)->addr_v4map (sctp_sk (sk), +sctp_get_pf_specific (sk->sk_family)->addr_to_user (sctp_sk (sk), (union sctp_addr *)addr);return transport;
@@ -410,7 +410,7 @@ SCTP_STATIC int sctp_do_bind(struct sock *sk, union sctp_addr *addr, int len)/* Copy back into socket for getsockname() use. */ if (!ret) {inet_sk (sk)->inet_sport =htons (inet_sk (sk)->inet_num); - af->to_sk_saddr (addr, sk); + sp->pf->to_sk_saddr (addr, sk); }return ret;
@@ -1061,7 +1061,6 @@ static int __sctp_connect(struct sock* sk,struct sctp_association *asoc2;struct sctp_transport *transport;union sctp_addr to; -struct sctp_af *af;sctp_scope_t scope;long timeo;int err =0 ;
@@ -1089,6 +1088,8 @@ static int __sctp_connect(struct sock* sk,/* Walk through the addrs buffer and count the number of addresses. */ addr_buf = kaddrs;while (walk_size < addrs_size) { +struct sctp_af *af; +if (walk_size +sizeof (sa_family_t) > addrs_size) {
Lines of this file are not shown. View the raw message.
The rest of this diff is not shown. View the raw message.
Part of the diff is not shown here. View the raw message.