Linux 2.6.33.12
Subsystems (13)
I'm announcing the release of the 2.6.33.12 kernel.
This is primarily for the use of those people who are stuck using the .33-rt kernel. Anyone else who really wants to use the .33 kernel tree is welcome to use this one as well.
I'll be maintaining it for a while longer as it looks like the -rt tree isn't moving forward to any newer kernel any time soon.
The updated 2.6.33.y git tree can be found at:
git://git.kernel.org/pub/scm/linux/kernel/git/longterm/linux-2.6.33.y.git
and can be browsed at the normal kernel.org git web browser:
http://git.kernel.org/?p=linux/kernel/git/longterm/linux-2.6.33.y.git;a=summarythanks,
greg k-h
------------
MAINTAINERS | 1 Makefile | 2 arch/ia64/kernel/mca.c | 3 arch/ia64/sn/pci/tioca_provider.c | 2 arch/x86/include/asm/msr-index.h | 4 + arch/x86/include/asm/processor.h | 19 ++++++ arch/x86/kernel/cpu/amd.c | 88 +++++++++++++++++++++++++++++ arch/x86/kernel/process.c | 39 ------------ arch/x86/lib/semaphore_32.S | 2 drivers/media/video/sn9c102/sn9c102_core.c | 6 - drivers/net/usb/cdc-phonet.c | 9 -- drivers/usb/core/devices.c | 10 +-- drivers/usb/host/ehci-q.c | 15 ++-- drivers/usb/host/xhci-mem.c | 85 ++++++++++++++++++++-------- drivers/usb/host/xhci.h | 6 - drivers/usb/serial/ftdi_sio.c | 5 + drivers/usb/serial/ftdi_sio_ids.h | 12 +++ fs/cifs/connect.c | 2 fs/proc/base.c | 9 ++ fs/ramfs/file-nommu.c | 1 fs/ubifs/debug.c | 6 - fs/ubifs/file.c | 3 include/linux/pid.h | 2 kernel/pid.c | 5 + net/ax25/af_ax25.c | 2 net/rds/rdma.c | 11 +++ 26 files changed, 253 insertions(+), 96 deletions(-)
Alan Stern (1):
USB: EHCI: unlink unused QHs when the controller is stopped
Artem Bityutskiy (1):
UBIFS: fix oops when R/O file-system is fsync'ed
Bob Liu (1):
ramfs: fix memleak on no-mmu arch
Boris Ostrovsky (1):
x86, AMD: Set ARAT feature on AMD processors
Christian Simon (1):
USB: ftdi_sio: Added IDs for CTI USB Serial Devices
Dmitry Torokhov (3):
USB: fix formatting of SuperSpeed endpoints in /proc/bus/usb/devices
USB: xhci - fix unsafe macro definitions
USB: xhci - fix math in xhci_get_endpoint_interval()
Greg Kroah-Hartman (1):
Linux 2.6.33.12
Hans Rosenfeld (3):
x86, cpu: AMD errata checking framework x86, cpu: Clean up AMD erratum 400 workaround x86, cpu: Fix regression in AMD errata checking code
Jan Beulich (1):
x86: Fix a bogus unwind annotation in lib/semaphore_32.S
Jeff Layton (1):
cifs: always do is_path_accessible check in cifs_mount
Jeff Mahoney (2):
tioca: Fix assignment from incompatible pointer warnings mca.c: Fix cast from integer to pointer warning
Jiri Slaby (1):
NET: cdc-phonet, handle empty phonet header
Joerg Roedel (1):
x86, amd: Disable GartTlbWlkErr when BIOS forgets it
Johan Hovold (1):
USB: ftdi_sio: add PID for OCT DK201 docking station
Kees Cook (1):
net: ax25: fix information leak to userland harder
Linus Torvalds (3):
next_pidmap: fix overflow condition
proc: do proper range check on readdir offset
net: fix rds_iovec page count overflow
Paul Friedrich (1):
USB: ftdi_sio: add ids for Hameg HO720 and HO730
Randy Dunlap (1):
MAINTAINERS: update STABLE BRANCH info
Vasiliy Kulikov (2):
video: sn9c102: world-wirtable sysfs files
UBIFS: restrict world-writable debugfs files
MAINTAINERS +0 -1
@@ -5131,7 +5131,6 @@ F: arch/alpha/kernel/srm_env.c STABLE BRANCH M: Greg Kroah-Hartman <[email protected]> -M: Chris Wright <[email protected]> L: [email protected] S: Maintained
Makefile +1 -1
@@ -1,7 +1,7 @@ VERSION = 2 PATCHLEVEL = 6 SUBLEVEL = 33 -EXTRAVERSION = .11 +EXTRAVERSION = .12 NAME = Man-Eating Seals of Antiquity # *DOCUMENTATION*
arch/ia64/kernel/mca.c +2 -1
@@ -1858,7 +1858,8 @@ ia64_mca_cpu_init(void *cpu_data) data =mca_bootmem (); first_time =0 ; }else - data =__get_free_pages (GFP_KERNEL ,get_order (sz)); + data = (void *)__get_free_pages (GFP_KERNEL , +get_order (sz));if (!data)panic ("Could not allocate MCA memory for cpu %d\n" , cpu);
arch/ia64/sn/pci/tioca_provider.c +1 -1
@@ -508,7 +508,7 @@ tioca_dma_unmap(struct pci_dev *pdev, dma_addr_t bus_addr, int dir)* use the GART mapped mode. */ static u64 -tioca_dma_map (struct pci_dev *pdev,u64 paddr,size_t byte_count,int dma_flags) +tioca_dma_map (struct pci_dev *pdev,unsigned long paddr,size_t byte_count,int dma_flags) {u64 mapaddr;
arch/x86/include/asm/msr-index.h +4 -0
@@ -82,11 +82,15 @@#define MSR_IA32_MC0_ADDR 0x00000402#define MSR_IA32_MC0_MISC 0x00000403 +#define MSR_AMD64_MC0_MASK 0xc0010044 +#define MSR_IA32_MCx_CTL (x) (MSR_IA32_MC0_CTL + 4*(x))#define MSR_IA32_MCx_STATUS (x) (MSR_IA32_MC0_STATUS + 4*(x))#define MSR_IA32_MCx_ADDR (x) (MSR_IA32_MC0_ADDR + 4*(x))#define MSR_IA32_MCx_MISC (x) (MSR_IA32_MC0_MISC + 4*(x)) +#define MSR_AMD64_MCx_MASK (x) (MSR_AMD64_MC0_MASK + (x)) +/* These are consecutive and not in the normal 4er MCE bank block */ #define MSR_IA32_MC0_CTL2 0x00000280#define MSR_IA32_MCx_CTL2 (x) (MSR_IA32_MC0_CTL2 + (x))
arch/x86/include/asm/processor.h +19 -0
@@ -1031,4 +1031,23 @@ unsigned long calc_aperfmperf_ratio(struct aperfmperf *old, return ratio; } +/* +* AMD errata checking +*/ +#ifdef CONFIG_CPU_SUP_AMD +extern const int amd_erratum_400[]; +extern bool cpu_has_amd_erratum (const int *); + +#define AMD_LEGACY_ERRATUM (...) { -1, __VA_ARGS__, 0 } +#define AMD_OSVW_ERRATUM (osvw_id, ...) { osvw_id, __VA_ARGS__, 0 } +#define AMD_MODEL_RANGE (f, m_start, s_start, m_end, s_end) \ + ((f << 24) | (m_start << 16) | (s_start << 12) | (m_end << 4) | (s_end)) +#define AMD_MODEL_RANGE_FAMILY (range) (((range) >> 24) & 0xff) +#define AMD_MODEL_RANGE_START (range) (((range) >> 12) & 0xfff) +#define AMD_MODEL_RANGE_END (range) ((range) & 0xfff) + +#else +#define cpu_has_amd_erratum (x) (false) +#endif /* CONFIG_CPU_SUP_AMD */ +#endif /* _ASM_X86_PROCESSOR_H */
arch/x86/kernel/cpu/amd.c +88 -0
97 lines not on this page · raw message
arch/x86/kernel/process.c +2 -37
@@ -518,42 +518,6 @@ static int __cpuinit mwait_usable(const struct cpuinfo_x86 *c)return (edx &MWAIT_EDX_C1 ); } -/* -* Check for AMD CPUs, where APIC timer interrupt does not wake up CPU from C1e. -* For more information see -* - Erratum #400 for NPT family 0xf and family 0x10 CPUs -* - Erratum #365 for family 0x11 (not affected because C1e not in use) -*/ -static int __cpuinit check_c1e_idle (const struct cpuinfo_x86 *c) -{ -u64 val; -if (c->x86_vendor !=X86_VENDOR_AMD ) - goto no_c1e_idle; - -/* Family 0x0f models < rev F do not have C1E */ -if (c->x86 ==0x0F && c->x86_model >=0x40 ) -return 1 ; - -if (c->x86 ==0x10 ) { -/* -* check OSVW bit for CPUs that are not affected -* by erratum #400 -*/ -if (cpu_has (c,X86_FEATURE_OSVW )) { -rdmsrl (MSR_AMD64_OSVW_ID_LENGTH , val); -if (val >=2 ) { -rdmsrl (MSR_AMD64_OSVW_STATUS , val); -if (!(val &BIT (1 ))) - goto no_c1e_idle; - } - } -return 1 ; - } - -no_c1e_idle: -return 0 ; -} -static cpumask_var_t c1e_mask;static int c1e_detected;
@@ -631,7 +595,8 @@ void __cpuinit select_idle_routine(const struct cpuinfo_x86 *c)*/ printk (KERN_INFO "using mwait in idle threads.\n" ); pm_idle = mwait_idle; - }else if (check_c1e_idle (c)) { + }else if (cpu_has_amd_erratum (amd_erratum_400)) { +/* E400: APIC timer interrupt does not wake up CPU from C1e */ printk (KERN_INFO "using C1E aware idle routine\n" ); pm_idle = c1e_idle; }else
arch/x86/lib/semaphore_32.S +1 -1
@@ -36,7 +36,7 @@ */ #ifdef CONFIG_SMP ENTRY(__write_lock_failed) - CFI_STARTPROC simple + CFI_STARTPROC FRAME 2: LOCK_PREFIX addl $ RW_LOCK_BIAS,(%eax)
drivers/media/video/sn9c102/sn9c102_core.c +3 -3
@@ -1430,9 +1430,9 @@ static DEVICE_ATTR(i2c_reg, S_IRUGO | S_IWUSR, sn9c102_show_i2c_reg, sn9c102_store_i2c_reg); static DEVICE_ATTR(i2c_val, S_IRUGO | S_IWUSR, sn9c102_show_i2c_val, sn9c102_store_i2c_val); -static DEVICE_ATTR(green, S_IWUGO, NULL, sn9c102_store_green); -static DEVICE_ATTR(blue, S_IWUGO, NULL, sn9c102_store_blue); -static DEVICE_ATTR(red, S_IWUGO, NULL, sn9c102_store_red); +static DEVICE_ATTR(green, S_IWUSR, NULL, sn9c102_store_green); +static DEVICE_ATTR(blue, S_IWUSR, NULL, sn9c102_store_blue); +static DEVICE_ATTR(red, S_IWUSR, NULL, sn9c102_store_red); static DEVICE_ATTR(frame_header, S_IRUGO, sn9c102_show_frame_header, NULL);
drivers/net/usb/cdc-phonet.c +3 -6
@@ -325,13 +325,13 @@ int usbpn_probe(struct usb_interface *intf, const struct usb_device_id *id) {static const char ifname[] ="usbpn%d" ;const struct usb_cdc_union_desc *union_header =NULL ; -const struct usb_cdc_header_desc *phonet_header =NULL ;const struct usb_host_interface *data_desc;struct usb_interface *data_intf;struct usb_device *usbdev =interface_to_usbdev (intf);struct net_device *dev;struct usbpn_dev *pnd;u8 *data; +int phonet =0 ;int len, err; data = intf->altsetting->extra;
@@ -352,10 +352,7 @@ int usbpn_probe(struct usb_interface *intf, const struct usb_device_id *id) (struct usb_cdc_union_desc *)data;break ;case 0xAB : -if (phonet_header || dlen <5 ) -break ; - phonet_header = - (struct usb_cdc_header_desc *)data; + phonet =1 ;break ; } }
@@ -363,7 +360,7 @@ int usbpn_probe(struct usb_interface *intf, const struct usb_device_id *id) len -= dlen; } -if (!union_header || !phonet_header) +if (!union_header || !phonet)return -EINVAL ; data_intf =usb_ifnum_to_if (usbdev, union_header->bSlaveInterface0);
drivers/usb/core/devices.c +6 -4
@@ -211,7 +211,7 @@ static char *usb_dump_endpoint_descriptor(int speed, char *start, char *end,break ;case USB_ENDPOINT_XFER_INT : type ="Int." ; -if (speed ==USB_SPEED_HIGH ) +if (speed ==USB_SPEED_HIGH || speed ==USB_SPEED_SUPER ) interval =1 << (desc->bInterval -1 );else interval = desc->bInterval;
@@ -219,7 +219,8 @@ static char *usb_dump_endpoint_descriptor(int speed, char *start, char *end,default :/* "can't happen" */ return start; } - interval *= (speed ==USB_SPEED_HIGH ) ?125 :1000 ; + interval *= (speed ==USB_SPEED_HIGH || + speed ==USB_SPEED_SUPER ) ?125 :1000 ;if (interval %1000 ) unit ='u' ;else {
@@ -529,8 +530,9 @@ static ssize_t usb_device_dump(char __user **buffer, size_t *nbytes,if (level ==0 ) {int max; -/* high speed reserves 80%, full/low reserves 90% */ -if (usbdev->speed ==USB_SPEED_HIGH ) +/* super/high speed reserves 80%, full/low reserves 90% */ +if (usbdev->speed ==USB_SPEED_HIGH || + usbdev->speed ==USB_SPEED_SUPER ) max =800 ;else max =FRAME_TIME_MAX_USECS_ALLOC ;
drivers/usb/host/ehci-q.c +9 -6
@@ -1246,24 +1246,27 @@ static void start_unlink_async (struct ehci_hcd *ehci, struct ehci_qh *qh)static void scan_async (struct ehci_hcd *ehci) { +bool stopped;struct ehci_qh *qh;enum ehci_timer_action action =TIMER_IO_WATCHDOG ; ehci->stamp =ehci_readl (ehci, &ehci->regs->frame_index);timer_action_done (ehci,TIMER_ASYNC_SHRINK ); rescan: + stopped = !HC_IS_RUNNING (ehci_to_hcd (ehci)->state); qh = ehci->async->qh_next.qh;if (likely (qh !=NULL )) { do { /* clean any finished work for this qh */ - if (!list_empty (&qh->qtd_list) - && qh->stamp != ehci->stamp) { + if (!list_empty(&qh->qtd_list) && (stopped || + qh->stamp != ehci->stamp)) { int temp; /* unlinks could happen here; completion * reporting drops the lock. rescan using * the latest schedule, but don't rescan - * qhs we already finished (no looping). + * qhs we already finished (no looping) + * unless the controller is stopped. */ qh = qh_get (qh); qh->stamp = ehci->stamp;
@@ -1284,9 +1287,9 @@ rescan:*/ if (list_empty (&qh->qtd_list) && qh->qh_state ==QH_STATE_LINKED ) { -if (!ehci->reclaim - && ((ehci->stamp - qh->stamp) &0x1fff ) - >= (EHCI_SHRINK_FRAMES *8 )) +if (!ehci->reclaim && (stopped || + ((ehci->stamp - qh->stamp) &0x1fff ) + >=EHCI_SHRINK_FRAMES *8 ))start_unlink_async (ehci, qh);else action =TIMER_ASYNC_SHRINK ;
drivers/usb/host/xhci-mem.c +62 -23
108 lines not on this page · raw message
drivers/usb/host/xhci.h +3 -3
@@ -232,7 +232,7 @@ struct xhci_op_regs {* notification type that matches a bit set in this bit field. */ #define DEV_NOTE_MASK (0xffff) -#define ENABLE_DEV_NOTE (x) (1 << x) +#define ENABLE_DEV_NOTE (x) (1 << (x))/* Most of the device notification types should only be used for debug. * SW does need to pay attention to function wake notifications. */
@@ -579,11 +579,11 @@ struct xhci_ep_ctx {#define EP_STATE_STOPPED 3#define EP_STATE_ERROR 4/* Mult - Max number of burtst within an interval, in EP companion desc. */ -#define EP_MULT (p) ((p & 0x3) << 8) +#define EP_MULT (p) (((p) & 0x3) << 8)/* bits 10:14 are Max Primary Streams */ /* bit 15 is Linear Stream Array */ /* Interval - period between requests to an endpoint - 125u increments. */ -#define EP_INTERVAL (p) ((p & 0xff) << 16) +#define EP_INTERVAL (p) (((p) & 0xff) << 16)#define EP_INTERVAL_TO_UFRAMES (p) (1 << (((p) >> 16) & 0xff))/* ep_info2 bitmasks */
drivers/usb/serial/ftdi_sio.c +5 -0
@@ -155,6 +155,8 @@ static struct ftdi_sio_quirk ftdi_stmclite_quirk = {* /sys/bus/usb/ftdi_sio/new_id, then send patch/report! */ static struct usb_device_id id_table_combined [] = { + {USB_DEVICE (FTDI_VID ,FTDI_CTI_MINI_PID ) }, + {USB_DEVICE (FTDI_VID ,FTDI_CTI_NANO_PID ) }, {USB_DEVICE (FTDI_VID ,FTDI_AMC232_PID ) }, {USB_DEVICE (FTDI_VID ,FTDI_CANUSB_PID ) }, {USB_DEVICE (FTDI_VID ,FTDI_CANDAPTER_PID ) },
@@ -525,6 +527,7 @@ static struct usb_device_id id_table_combined [] = { { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2803_8_PID) }, { USB_DEVICE(IDTECH_VID, IDTECH_IDT1221U_PID) }, { USB_DEVICE(OCT_VID, OCT_US101_PID) }, + { USB_DEVICE(OCT_VID, OCT_DK201_PID) }, { USB_DEVICE(FTDI_VID, FTDI_HE_TIRA1_PID), .driver_info = (kernel_ulong_t)&ftdi_HE_TIRA1_quirk }, { USB_DEVICE(FTDI_VID, FTDI_USB_UIRT_PID),
@@ -786,6 +789,8 @@ static struct usb_device_id id_table_combined [] = { { USB_DEVICE(FTDI_VID, MARVELL_OPENRD_PID), .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk }, { USB_DEVICE(FTDI_VID, HAMEG_HO820_PID) }, + { USB_DEVICE(FTDI_VID, HAMEG_HO720_PID) }, + { USB_DEVICE(FTDI_VID, HAMEG_HO730_PID) }, { USB_DEVICE(FTDI_VID, HAMEG_HO870_PID) }, { USB_DEVICE(FTDI_VID, MJSG_GENERIC_PID) }, { USB_DEVICE(FTDI_VID, MJSG_SR_RADIO_PID) },
drivers/usb/serial/ftdi_sio_ids.h +12 -0
@@ -280,6 +280,8 @@* Hameg HO820 and HO870 interface (using VID 0x0403) */ #define HAMEG_HO820_PID 0xed74 +#define HAMEG_HO730_PID 0xed73 +#define HAMEG_HO720_PID 0xed72#define HAMEG_HO870_PID 0xed71/*
@@ -559,6 +561,7 @@/* Note: OCT US101 is also rebadged as Dick Smith Electronics (NZ) XH6381 */ /* Also rebadged as Dick Smith Electronics (Aus) XH6451 */ /* Also rebadged as SIIG Inc. model US2308 hardware version 1 */ +#define OCT_DK201_PID 0x0103/* OCT DK201 USB docking station */ #define OCT_US101_PID 0x0421/* OCT US101 USB to RS-232 */ /*
@@ -1093,3 +1096,12 @@#define XVERVE_SIGNALYZER_SH2_PID 0xBCA2#define XVERVE_SIGNALYZER_SH4_PID 0xBCA4 +/* +* CTI GmbH RS485 Converter http://www.cti-lean.com/ +*/ +/* USB-485-Mini*/ +#define FTDI_CTI_MINI_PID 0xF608 +/* USB-Nano-485*/ +#define FTDI_CTI_NANO_PID 0xF60B + +
fs/cifs/connect.c +1 -1
@@ -2554,7 +2554,7 @@ try_mount_again: remote_path_check:/* check if a whole path (including prepath) is not remote */ -if (!rc && cifs_sb->prepathlen && tcon) { +if (!rc && tcon) {/* build_path_to_root works only when we have a valid tcon */ full_path =cifs_build_path_to_root (cifs_sb);if (full_path ==NULL ) {
fs/proc/base.c +7 -2
@@ -2872,11 +2872,16 @@ static int proc_pid_fill_cache(struct file *filp, void *dirent, filldir_t filldi/* for the /proc/ directory itself, after non-process stuff has been done */ int proc_pid_readdir (struct file * filp,void * dirent,filldir_t filldir) { -unsigned int nr = filp->f_pos -FIRST_PROCESS_ENTRY ; -struct task_struct *reaper =get_proc_task (filp->f_path.dentry->d_inode); +unsigned int nr; +struct task_struct *reaper;struct tgid_iter iter;struct pid_namespace *ns; +if (filp->f_pos >=PID_MAX_LIMIT +TGID_OFFSET ) + goto out_no_task; + nr = filp->f_pos -FIRST_PROCESS_ENTRY ; + + reaper =get_proc_task (filp->f_path.dentry->d_inode);if (!reaper) goto out_no_task;
fs/ramfs/file-nommu.c +1 -0
@@ -111,6 +111,7 @@ int ramfs_nommu_expand_for_mapping(struct inode *inode, size_t newsize)SetPageDirty (page);unlock_page (page); +put_page (page); }return 0 ;
fs/ubifs/debug.c +3 -3
@@ -2686,19 +2686,19 @@ int dbg_debugfs_init_fs(struct ubifs_info *c) } fname ="dump_lprops" ; - dent =debugfs_create_file (fname,S_IWUGO , d->dfs_dir, c, &dfs_fops); + dent =debugfs_create_file (fname,S_IWUSR , d->dfs_dir, c, &dfs_fops);if (IS_ERR (dent)) goto out_remove; d->dfs_dump_lprops = dent; fname ="dump_budg" ; - dent =debugfs_create_file (fname,S_IWUGO , d->dfs_dir, c, &dfs_fops); + dent =debugfs_create_file (fname,S_IWUSR , d->dfs_dir, c, &dfs_fops);if (IS_ERR (dent)) goto out_remove; d->dfs_dump_budg = dent; fname ="dump_tnc" ; - dent =debugfs_create_file (fname,S_IWUGO , d->dfs_dir, c, &dfs_fops); + dent =debugfs_create_file (fname,S_IWUSR , d->dfs_dir, c, &dfs_fops);if (IS_ERR (dent)) goto out_remove; d->dfs_dump_tnc = dent;
fs/ubifs/file.c +3 -0
@@ -1311,6 +1311,9 @@ int ubifs_fsync(struct file *file, struct dentry *dentry, int datasync)dbg_gen ("syncing inode %lu" , inode->i_ino); +if (inode->i_sb->s_flags &MS_RDONLY ) +return 0 ; +/* * VFS has already synchronized dirty pages for this inode. Synchronize * the inode unless this is a 'datasync()' call.
include/linux/pid.h +1 -1
@@ -117,7 +117,7 @@ extern struct pid *find_vpid(int nr);*/ extern struct pid *find_get_pid (int nr);extern struct pid *find_ge_pid (int nr,struct pid_namespace *); -int next_pidmap (struct pid_namespace *pid_ns,int last); +int next_pidmap (struct pid_namespace *pid_ns,unsigned int last);extern struct pid *alloc_pid (struct pid_namespace *ns);extern void free_pid (struct pid *pid);
kernel/pid.c +4 -1
@@ -183,11 +183,14 @@ static int alloc_pidmap(struct pid_namespace *pid_ns)return -1 ; } -int next_pidmap (struct pid_namespace *pid_ns,int last) +int next_pidmap (struct pid_namespace *pid_ns,unsigned int last) {int offset;struct pidmap *map, *end; +if (last >=PID_MAX_LIMIT ) +return -1 ; + offset = (last +1 ) &BITS_PER_PAGE_MASK ; map = &pid_ns->pidmap[(last +1 )/BITS_PER_PAGE ]; end = &pid_ns->pidmap[PIDMAP_ENTRIES ];
net/ax25/af_ax25.c +1 -1
@@ -1391,7 +1391,7 @@ static int ax25_getname(struct socket *sock, struct sockaddr *uaddr,ax25_cb *ax25;int err =0 ; -memset (fsa,0 ,sizeof (fsa)); +memset (fsa,0 ,sizeof (*fsa));lock_sock (sk); ax25 =ax25_sk (sk);
net/rds/rdma.c +11 -0
@@ -497,6 +497,17 @@ static struct rds_rdma_op *rds_rdma_prepare(struct rds_sock *rs, max_pages =max (nr, max_pages); nr_pages += nr; + +/* +* nr for one entry in limited to (UINT_MAX>>PAGE_SHIFT)+1 +* so nr_pages cannot overflow without becoming bigger than +* INT_MAX first. If nr cannot overflow then max_pages should +* be ok. +*/ +if (nr_pages >INT_MAX ) { + ret = -EINVAL ; + goto out; + } } pages =kcalloc (max_pages,sizeof (struct page *),GFP_KERNEL );