[kernel] r16983 - in dists/squeeze/linux-2.6/debian: . patches/bugfix/all patches/bugfix/all/stable patches/series
Maximilian Attems
maks at alioth.debian.org
Sat Mar 5 13:01:37 UTC 2011
Author: maks
Date: Sat Mar 5 13:01:33 2011
New Revision: 16983
Log:
add longterm 2.6.32.32-rc1
allows to nuke several patches that landed since.
while at it add proper 2.6.32.31
Added:
dists/squeeze/linux-2.6/debian/patches/bugfix/all/stable/2.6.32.31.patch
dists/squeeze/linux-2.6/debian/patches/bugfix/all/stable/2.6.32.32-rc1.patch
Deleted:
dists/squeeze/linux-2.6/debian/patches/bugfix/all/HID-add-support-for-Acan-FG-8100-barcode-reader.patch
dists/squeeze/linux-2.6/debian/patches/bugfix/all/drm-fix-unsigned-vs-signed-comparison-issue-in-modes.patch
dists/squeeze/linux-2.6/debian/patches/bugfix/all/netxen-fix-set-mac-addr.patch
dists/squeeze/linux-2.6/debian/patches/bugfix/all/sctp-Fix-oops-when-sending-queued-ASCONF-chunks.patch
dists/squeeze/linux-2.6/debian/patches/bugfix/all/stable/2.6.32.30-fix.patch
dists/squeeze/linux-2.6/debian/patches/bugfix/all/usb-iowarrior-don-t-trust-report_size-for-buffer-siz.patch
dists/squeeze/linux-2.6/debian/patches/bugfix/all/virtio-set-pci-bus-master-enable-bit.patch
Modified:
dists/squeeze/linux-2.6/debian/changelog
dists/squeeze/linux-2.6/debian/patches/series/31
Modified: dists/squeeze/linux-2.6/debian/changelog
==============================================================================
--- dists/squeeze/linux-2.6/debian/changelog Fri Mar 4 16:31:00 2011 (r16982)
+++ dists/squeeze/linux-2.6/debian/changelog Sat Mar 5 13:01:33 2011 (r16983)
@@ -74,11 +74,13 @@
- xhci: Fix errors in the running total calculations in the TRB math
- xhci: Fix an error in count_sg_trbs_needed()
- x25: Do not reference freed memory
- * netxen: fix set mac addr. (closes: #616058)
- * [xen] do not release any memory under 1M in domain 0. (closes: #613823)
- * virtio: set pci bus master enable bit. (closes: #610360)
- * sctp: Fix oops when sending queued ASCONF chunks (CVE-2010-1173).
- * drm/ttm: Fix two race conditions + fix busy codepaths (closes: #591061)
+ * Add longterm 2.6.32.31.
+ * Add longterm 2.6.32.32-rc1:
+ - netxen: fix set mac addr. (closes: #616058)
+ - [xen] do not release any memory under 1M in domain 0. (closes: #613823)
+ - virtio: set pci bus master enable bit. (closes: #610360)
+ - sctp: Fix oops when sending queued ASCONF chunks (CVE-2010-1173).
+ - drm/ttm: Fix two race conditions + fix busy codepaths (closes: #591061)
* Add Slovak translation by Slavko. (closes: #608684)
[ Aurelien Jarno ]
Added: dists/squeeze/linux-2.6/debian/patches/bugfix/all/stable/2.6.32.31.patch
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ dists/squeeze/linux-2.6/debian/patches/bugfix/all/stable/2.6.32.31.patch Sat Mar 5 13:01:33 2011 (r16983)
@@ -0,0 +1,17 @@
+diff --git a/lib/swiotlb.c b/lib/swiotlb.c
+index 7740ee8..ac25cd2 100644
+--- a/lib/swiotlb.c
++++ b/lib/swiotlb.c
+@@ -631,10 +631,8 @@ dma_addr_t swiotlb_map_page(struct device *dev, struct page *page,
+ /*
+ * Ensure that the address returned is DMA'ble
+ */
+- if (!dma_capable(dev, dev_addr, size)) {
+- swiotlb_tbl_unmap_single(dev, map, size, dir);
+- dev_addr = swiotlb_virt_to_bus(dev, io_tlb_overflow_buffer);
+- }
++ if (!dma_capable(dev, dev_addr, size))
++ panic("map_single: bounce buffer is not DMA'ble");
+
+ return dev_addr;
+ }
Added: dists/squeeze/linux-2.6/debian/patches/bugfix/all/stable/2.6.32.32-rc1.patch
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ dists/squeeze/linux-2.6/debian/patches/bugfix/all/stable/2.6.32.32-rc1.patch Sat Mar 5 13:01:33 2011 (r16983)
@@ -0,0 +1,710 @@
+diff --git a/arch/x86/include/asm/smpboot_hooks.h b/arch/x86/include/asm/smpboot_hooks.h
+index 1def601..cfdc6c8 100644
+--- a/arch/x86/include/asm/smpboot_hooks.h
++++ b/arch/x86/include/asm/smpboot_hooks.h
+@@ -34,7 +34,7 @@ static inline void smpboot_restore_warm_reset_vector(void)
+ */
+ CMOS_WRITE(0, 0xf);
+
+- *((volatile long *)phys_to_virt(apic->trampoline_phys_low)) = 0;
++ *((volatile u32 *)phys_to_virt(apic->trampoline_phys_low)) = 0;
+ }
+
+ static inline void __init smpboot_setup_io_apic(void)
+diff --git a/drivers/gpu/drm/drm_irq.c b/drivers/gpu/drm/drm_irq.c
+index 332d743..c8b5a7b 100644
+--- a/drivers/gpu/drm/drm_irq.c
++++ b/drivers/gpu/drm/drm_irq.c
+@@ -540,7 +540,8 @@ int drm_modeset_ctl(struct drm_device *dev, void *data,
+ struct drm_file *file_priv)
+ {
+ struct drm_modeset_ctl *modeset = data;
+- int crtc, ret = 0;
++ int ret = 0;
++ unsigned int crtc;
+
+ /* If drm_vblank_init() hasn't been called yet, just no-op */
+ if (!dev->num_crtcs)
+diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c
+index 1597863..5e1b522 100644
+--- a/drivers/hid/hid-core.c
++++ b/drivers/hid/hid-core.c
+@@ -1297,6 +1297,7 @@ static const struct hid_device_id hid_blacklist[] = {
+ { HID_USB_DEVICE(USB_VENDOR_ID_CHICONY, USB_DEVICE_ID_CHICONY_TACTICAL_PAD) },
+ { HID_USB_DEVICE(USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_BARCODE_1) },
+ { HID_USB_DEVICE(USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_BARCODE_2) },
++ { HID_USB_DEVICE(USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_BARCODE_3) },
+ { HID_USB_DEVICE(USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_MOUSE) },
+ { HID_USB_DEVICE(USB_VENDOR_ID_DRAGONRISE, 0x0006) },
+ { HID_USB_DEVICE(USB_VENDOR_ID_EZKEY, USB_DEVICE_ID_BTC_8193) },
+diff --git a/drivers/hid/hid-cypress.c b/drivers/hid/hid-cypress.c
+index 62e9cb1..998b6f4 100644
+--- a/drivers/hid/hid-cypress.c
++++ b/drivers/hid/hid-cypress.c
+@@ -126,6 +126,8 @@ static const struct hid_device_id cp_devices[] = {
+ .driver_data = CP_RDESC_SWAPPED_MIN_MAX },
+ { HID_USB_DEVICE(USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_BARCODE_2),
+ .driver_data = CP_RDESC_SWAPPED_MIN_MAX },
++ { HID_USB_DEVICE(USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_BARCODE_3),
++ .driver_data = CP_RDESC_SWAPPED_MIN_MAX },
+ { HID_USB_DEVICE(USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_MOUSE),
+ .driver_data = CP_2WHEEL_MOUSE_HACK },
+ { }
+diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h
+index 252853d..d993e97 100644
+--- a/drivers/hid/hid-ids.h
++++ b/drivers/hid/hid-ids.h
+@@ -148,6 +148,7 @@
+ #define USB_DEVICE_ID_CYPRESS_ULTRAMOUSE 0x7417
+ #define USB_DEVICE_ID_CYPRESS_BARCODE_1 0xde61
+ #define USB_DEVICE_ID_CYPRESS_BARCODE_2 0xde64
++#define USB_DEVICE_ID_CYPRESS_BARCODE_3 0xbca1
+
+ #define USB_VENDOR_ID_DEALEXTREAME 0x10c5
+ #define USB_DEVICE_ID_DEALEXTREAME_RADIO_SI4701 0x819a
+diff --git a/drivers/mfd/ucb1x00-ts.c b/drivers/mfd/ucb1x00-ts.c
+index 61b7d3e..d620293 100644
+--- a/drivers/mfd/ucb1x00-ts.c
++++ b/drivers/mfd/ucb1x00-ts.c
+@@ -385,12 +385,18 @@ static int ucb1x00_ts_add(struct ucb1x00_dev *dev)
+ idev->close = ucb1x00_ts_close;
+
+ __set_bit(EV_ABS, idev->evbit);
+- __set_bit(ABS_X, idev->absbit);
+- __set_bit(ABS_Y, idev->absbit);
+- __set_bit(ABS_PRESSURE, idev->absbit);
+
+ input_set_drvdata(idev, ts);
+
++ ucb1x00_adc_enable(ts->ucb);
++ ts->x_res = ucb1x00_ts_read_xres(ts);
++ ts->y_res = ucb1x00_ts_read_yres(ts);
++ ucb1x00_adc_disable(ts->ucb);
++
++ input_set_abs_params(idev, ABS_X, 0, ts->x_res, 0, 0);
++ input_set_abs_params(idev, ABS_Y, 0, ts->y_res, 0, 0);
++ input_set_abs_params(idev, ABS_PRESSURE, 0, 0, 0, 0);
++
+ err = input_register_device(idev);
+ if (err)
+ goto fail;
+diff --git a/drivers/net/e1000e/netdev.c b/drivers/net/e1000e/netdev.c
+index d177a02..4920a4e 100644
+--- a/drivers/net/e1000e/netdev.c
++++ b/drivers/net/e1000e/netdev.c
+@@ -5186,7 +5186,8 @@ static int __devinit e1000_probe(struct pci_dev *pdev,
+ /* APME bit in EEPROM is mapped to WUC.APME */
+ eeprom_data = er32(WUC);
+ eeprom_apme_mask = E1000_WUC_APME;
+- if (eeprom_data & E1000_WUC_PHY_WAKE)
++ if ((hw->mac.type > e1000_ich10lan) &&
++ (eeprom_data & E1000_WUC_PHY_WAKE))
+ adapter->flags2 |= FLAG2_HAS_PHY_WAKEUP;
+ } else if (adapter->flags & FLAG_APME_IN_CTRL3) {
+ if (adapter->flags & FLAG_APME_CHECK_PORT_B &&
+diff --git a/drivers/net/netxen/netxen_nic_hw.c b/drivers/net/netxen/netxen_nic_hw.c
+index 52a3798..7e494de 100644
+--- a/drivers/net/netxen/netxen_nic_hw.c
++++ b/drivers/net/netxen/netxen_nic_hw.c
+@@ -685,6 +685,9 @@ void netxen_p3_nic_set_multi(struct net_device *netdev)
+ struct list_head *head;
+ nx_mac_list_t *cur;
+
++ if (adapter->is_up != NETXEN_ADAPTER_UP_MAGIC)
++ return;
++
+ list_splice_tail_init(&adapter->mac_list, &del_list);
+
+ nx_p3_nic_add_mac(adapter, adapter->mac_addr, &del_list);
+diff --git a/drivers/net/r8169.c b/drivers/net/r8169.c
+index 7dd2132..7022b1b 100644
+--- a/drivers/net/r8169.c
++++ b/drivers/net/r8169.c
+@@ -23,6 +23,7 @@
+ #include <linux/init.h>
+ #include <linux/dma-mapping.h>
+ #include <linux/firmware.h>
++#include <linux/pci-aspm.h>
+
+ #include <asm/system.h>
+ #include <asm/io.h>
+@@ -3030,6 +3031,11 @@ rtl8169_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
+ mii->reg_num_mask = 0x1f;
+ mii->supports_gmii = !!(cfg->features & RTL_FEATURE_GMII);
+
++ /* disable ASPM completely as that cause random device stop working
++ * problems as well as full system hangs for some PCIe devices users */
++ pci_disable_link_state(pdev, PCIE_LINK_STATE_L0S | PCIE_LINK_STATE_L1 |
++ PCIE_LINK_STATE_CLKPM);
++
+ /* enable device (incl. PCI PM wakeup and hotplug setup) */
+ rc = pci_enable_device(pdev);
+ if (rc < 0) {
+diff --git a/drivers/net/wireless/p54/p54usb.c b/drivers/net/wireless/p54/p54usb.c
+index d89ee8f..0a2bf5c 100644
+--- a/drivers/net/wireless/p54/p54usb.c
++++ b/drivers/net/wireless/p54/p54usb.c
+@@ -95,6 +95,7 @@ static struct usb_device_id p54u_table[] __devinitdata = {
+ {USB_DEVICE(0x1413, 0x5400)}, /* Telsey 802.11g USB2.0 Adapter */
+ {USB_DEVICE(0x1435, 0x0427)}, /* Inventel UR054G */
+ {USB_DEVICE(0x1668, 0x1050)}, /* Actiontec 802UIG-1 */
++ {USB_DEVICE(0x1740, 0x1000)}, /* Senao NUB-350 */
+ {USB_DEVICE(0x2001, 0x3704)}, /* DLink DWL-G122 rev A2 */
+ {USB_DEVICE(0x2001, 0x3705)}, /* D-Link DWL-G120 rev C1 */
+ {USB_DEVICE(0x413c, 0x5513)}, /* Dell WLA3310 USB Wireless Adapter */
+diff --git a/drivers/usb/misc/iowarrior.c b/drivers/usb/misc/iowarrior.c
+index 02ff040..cfdcbb8 100644
+--- a/drivers/usb/misc/iowarrior.c
++++ b/drivers/usb/misc/iowarrior.c
+@@ -373,7 +373,7 @@ static ssize_t iowarrior_write(struct file *file,
+ case USB_DEVICE_ID_CODEMERCS_IOWPV2:
+ case USB_DEVICE_ID_CODEMERCS_IOW40:
+ /* IOW24 and IOW40 use a synchronous call */
+- buf = kmalloc(8, GFP_KERNEL); /* 8 bytes are enough for both products */
++ buf = kmalloc(count, GFP_KERNEL);
+ if (!buf) {
+ retval = -ENOMEM;
+ goto exit;
+diff --git a/drivers/virtio/virtio_pci.c b/drivers/virtio/virtio_pci.c
+index 5fed283..d10c857 100644
+--- a/drivers/virtio/virtio_pci.c
++++ b/drivers/virtio/virtio_pci.c
+@@ -647,6 +647,7 @@ static int __devinit virtio_pci_probe(struct pci_dev *pci_dev,
+ goto out_req_regions;
+
+ pci_set_drvdata(pci_dev, vp_dev);
++ pci_set_master(pci_dev);
+
+ /* we use the subsystem vendor/device id as the virtio vendor/device
+ * id. this allows us to use the same PCI vendor/device id for all
+diff --git a/fs/cifs/cifsproto.h b/fs/cifs/cifsproto.h
+index 05a9b77..76d9f64 100644
+--- a/fs/cifs/cifsproto.h
++++ b/fs/cifs/cifsproto.h
+@@ -323,7 +323,7 @@ extern int CIFSSMBLock(const int xid, struct cifsTconInfo *tcon,
+ const __u16 netfid, const __u64 len,
+ const __u64 offset, const __u32 numUnlock,
+ const __u32 numLock, const __u8 lockType,
+- const bool waitFlag);
++ const bool waitFlag, const __u8 oplock_level);
+ extern int CIFSSMBPosixLock(const int xid, struct cifsTconInfo *tcon,
+ const __u16 smb_file_id, const int get_flag,
+ const __u64 len, struct file_lock *,
+diff --git a/fs/cifs/cifssmb.c b/fs/cifs/cifssmb.c
+index 4e6dbab..04b755a 100644
+--- a/fs/cifs/cifssmb.c
++++ b/fs/cifs/cifssmb.c
+@@ -1641,7 +1641,8 @@ int
+ CIFSSMBLock(const int xid, struct cifsTconInfo *tcon,
+ const __u16 smb_file_id, const __u64 len,
+ const __u64 offset, const __u32 numUnlock,
+- const __u32 numLock, const __u8 lockType, const bool waitFlag)
++ const __u32 numLock, const __u8 lockType,
++ const bool waitFlag, const __u8 oplock_level)
+ {
+ int rc = 0;
+ LOCK_REQ *pSMB = NULL;
+@@ -1669,6 +1670,7 @@ CIFSSMBLock(const int xid, struct cifsTconInfo *tcon,
+ pSMB->NumberOfLocks = cpu_to_le16(numLock);
+ pSMB->NumberOfUnlocks = cpu_to_le16(numUnlock);
+ pSMB->LockType = lockType;
++ pSMB->OplockLevel = oplock_level;
+ pSMB->AndXCommand = 0xFF; /* none */
+ pSMB->Fid = smb_file_id; /* netfid stays le */
+
+diff --git a/fs/cifs/file.c b/fs/cifs/file.c
+index 5d1099a..a6135ab 100644
+--- a/fs/cifs/file.c
++++ b/fs/cifs/file.c
+@@ -825,12 +825,12 @@ int cifs_lock(struct file *file, int cmd, struct file_lock *pfLock)
+
+ /* BB we could chain these into one lock request BB */
+ rc = CIFSSMBLock(xid, tcon, netfid, length, pfLock->fl_start,
+- 0, 1, lockType, 0 /* wait flag */ );
++ 0, 1, lockType, 0 /* wait flag */, 0);
+ if (rc == 0) {
+ rc = CIFSSMBLock(xid, tcon, netfid, length,
+ pfLock->fl_start, 1 /* numUnlock */ ,
+ 0 /* numLock */ , lockType,
+- 0 /* wait flag */ );
++ 0 /* wait flag */, 0);
+ pfLock->fl_type = F_UNLCK;
+ if (rc != 0)
+ cERROR(1, ("Error unlocking previously locked "
+@@ -873,8 +873,8 @@ int cifs_lock(struct file *file, int cmd, struct file_lock *pfLock)
+
+ if (numLock) {
+ rc = CIFSSMBLock(xid, tcon, netfid, length,
+- pfLock->fl_start,
+- 0, numLock, lockType, wait_flag);
++ pfLock->fl_start, 0, numLock, lockType,
++ wait_flag, 0);
+
+ if (rc == 0) {
+ /* For Windows locks we must store them. */
+@@ -894,9 +894,9 @@ int cifs_lock(struct file *file, int cmd, struct file_lock *pfLock)
+ (pfLock->fl_start + length) >=
+ (li->offset + li->length)) {
+ stored_rc = CIFSSMBLock(xid, tcon,
+- netfid,
+- li->length, li->offset,
+- 1, 0, li->type, false);
++ netfid, li->length,
++ li->offset, 1, 0,
++ li->type, false, 0);
+ if (stored_rc)
+ rc = stored_rc;
+
+@@ -2314,7 +2314,8 @@ cifs_oplock_break(struct slow_work *work)
+ */
+ if (!cfile->closePend && !cfile->oplock_break_cancelled) {
+ rc = CIFSSMBLock(0, cifs_sb->tcon, cfile->netfid, 0, 0, 0, 0,
+- LOCKING_ANDX_OPLOCK_RELEASE, false);
++ LOCKING_ANDX_OPLOCK_RELEASE, false,
++ cinode->clientCanCacheRead ? 1 : 0);
+ cFYI(1, ("Oplock release rc = %d", rc));
+ }
+ }
+diff --git a/fs/ext2/namei.c b/fs/ext2/namei.c
+index dd7175c..e5618d4 100644
+--- a/fs/ext2/namei.c
++++ b/fs/ext2/namei.c
+@@ -327,7 +327,6 @@ static int ext2_rename (struct inode * old_dir, struct dentry * old_dentry,
+ new_de = ext2_find_entry (new_dir, &new_dentry->d_name, &new_page);
+ if (!new_de)
+ goto out_dir;
+- inode_inc_link_count(old_inode);
+ ext2_set_link(new_dir, new_de, new_page, old_inode, 1);
+ new_inode->i_ctime = CURRENT_TIME_SEC;
+ if (dir_de)
+@@ -339,12 +338,9 @@ static int ext2_rename (struct inode * old_dir, struct dentry * old_dentry,
+ if (new_dir->i_nlink >= EXT2_LINK_MAX)
+ goto out_dir;
+ }
+- inode_inc_link_count(old_inode);
+ err = ext2_add_link(new_dentry, old_inode);
+- if (err) {
+- inode_dec_link_count(old_inode);
++ if (err)
+ goto out_dir;
+- }
+ if (dir_de)
+ inode_inc_link_count(new_dir);
+ }
+@@ -352,12 +348,11 @@ static int ext2_rename (struct inode * old_dir, struct dentry * old_dentry,
+ /*
+ * Like most other Unix systems, set the ctime for inodes on a
+ * rename.
+- * inode_dec_link_count() will mark the inode dirty.
+ */
+ old_inode->i_ctime = CURRENT_TIME_SEC;
++ mark_inode_dirty(old_inode);
+
+ ext2_delete_entry (old_de, old_page);
+- inode_dec_link_count(old_inode);
+
+ if (dir_de) {
+ if (old_dir != new_dir)
+diff --git a/fs/fuse/file.c b/fs/fuse/file.c
+index edfce0b..f6104a95 100644
+--- a/fs/fuse/file.c
++++ b/fs/fuse/file.c
+@@ -86,18 +86,52 @@ struct fuse_file *fuse_file_get(struct fuse_file *ff)
+ return ff;
+ }
+
++static void fuse_release_async(struct work_struct *work)
++{
++ struct fuse_req *req;
++ struct fuse_conn *fc;
++ struct path path;
++
++ req = container_of(work, struct fuse_req, misc.release.work);
++ path = req->misc.release.path;
++ fc = get_fuse_conn(path.dentry->d_inode);
++
++ fuse_put_request(fc, req);
++ path_put(&path);
++}
++
+ static void fuse_release_end(struct fuse_conn *fc, struct fuse_req *req)
+ {
+- path_put(&req->misc.release.path);
++ if (fc->destroy_req) {
++ /*
++ * If this is a fuseblk mount, then it's possible that
++ * releasing the path will result in releasing the
++ * super block and sending the DESTROY request. If
++ * the server is single threaded, this would hang.
++ * For this reason do the path_put() in a separate
++ * thread.
++ */
++ atomic_inc(&req->count);
++ INIT_WORK(&req->misc.release.work, fuse_release_async);
++ schedule_work(&req->misc.release.work);
++ } else {
++ path_put(&req->misc.release.path);
++ }
+ }
+
+-static void fuse_file_put(struct fuse_file *ff)
++static void fuse_file_put(struct fuse_file *ff, bool sync)
+ {
+ if (atomic_dec_and_test(&ff->count)) {
+ struct fuse_req *req = ff->reserved_req;
+
+- req->end = fuse_release_end;
+- fuse_request_send_background(ff->fc, req);
++ if (sync) {
++ fuse_request_send(ff->fc, req);
++ path_put(&req->misc.release.path);
++ fuse_put_request(ff->fc, req);
++ } else {
++ req->end = fuse_release_end;
++ fuse_request_send_background(ff->fc, req);
++ }
+ kfree(ff);
+ }
+ }
+@@ -219,8 +253,12 @@ void fuse_release_common(struct file *file, int opcode)
+ * Normally this will send the RELEASE request, however if
+ * some asynchronous READ or WRITE requests are outstanding,
+ * the sending will be delayed.
++ *
++ * Make the release synchronous if this is a fuseblk mount,
++ * synchronous RELEASE is allowed (and desirable) in this case
++ * because the server can be trusted not to screw up.
+ */
+- fuse_file_put(ff);
++ fuse_file_put(ff, ff->fc->destroy_req != NULL);
+ }
+
+ static int fuse_open(struct inode *inode, struct file *file)
+@@ -549,7 +587,7 @@ static void fuse_readpages_end(struct fuse_conn *fc, struct fuse_req *req)
+ unlock_page(page);
+ }
+ if (req->ff)
+- fuse_file_put(req->ff);
++ fuse_file_put(req->ff, false);
+ }
+
+ static void fuse_send_readpages(struct fuse_req *req, struct file *file)
+@@ -1129,7 +1167,7 @@ static ssize_t fuse_direct_write(struct file *file, const char __user *buf,
+ static void fuse_writepage_free(struct fuse_conn *fc, struct fuse_req *req)
+ {
+ __free_page(req->pages[0]);
+- fuse_file_put(req->ff);
++ fuse_file_put(req->ff, false);
+ }
+
+ static void fuse_writepage_finish(struct fuse_conn *fc, struct fuse_req *req)
+diff --git a/fs/fuse/fuse_i.h b/fs/fuse/fuse_i.h
+index 01cc462..e6d614d 100644
+--- a/fs/fuse/fuse_i.h
++++ b/fs/fuse/fuse_i.h
+@@ -21,6 +21,7 @@
+ #include <linux/rwsem.h>
+ #include <linux/rbtree.h>
+ #include <linux/poll.h>
++#include <linux/workqueue.h>
+
+ /** Max number of pages that can be used in a single read request */
+ #define FUSE_MAX_PAGES_PER_REQ 32
+@@ -254,7 +255,10 @@ struct fuse_req {
+ union {
+ struct fuse_forget_in forget_in;
+ struct {
+- struct fuse_release_in in;
++ union {
++ struct fuse_release_in in;
++ struct work_struct work;
++ };
+ struct path path;
+ } release;
+ struct fuse_init_in init_in;
+diff --git a/fs/ocfs2/refcounttree.c b/fs/ocfs2/refcounttree.c
+index 10e9527..8371a25 100644
+--- a/fs/ocfs2/refcounttree.c
++++ b/fs/ocfs2/refcounttree.c
+@@ -3236,7 +3236,7 @@ static int ocfs2_make_clusters_writable(struct super_block *sb,
+ u32 num_clusters, unsigned int e_flags)
+ {
+ int ret, delete, index, credits = 0;
+- u32 new_bit, new_len;
++ u32 new_bit, new_len, orig_num_clusters;
+ unsigned int set_len;
+ struct ocfs2_super *osb = OCFS2_SB(sb);
+ handle_t *handle;
+@@ -3269,6 +3269,8 @@ static int ocfs2_make_clusters_writable(struct super_block *sb,
+ goto out;
+ }
+
++ orig_num_clusters = num_clusters;
++
+ while (num_clusters) {
+ ret = ocfs2_get_refcount_rec(ref_ci, context->ref_root_bh,
+ p_cluster, num_clusters,
+@@ -3356,7 +3358,8 @@ static int ocfs2_make_clusters_writable(struct super_block *sb,
+ * in write-back mode.
+ */
+ if (context->get_clusters == ocfs2_di_get_clusters) {
+- ret = ocfs2_cow_sync_writeback(sb, context, cpos, num_clusters);
++ ret = ocfs2_cow_sync_writeback(sb, context, cpos,
++ orig_num_clusters);
+ if (ret)
+ mlog_errno(ret);
+ }
+diff --git a/include/drm/drmP.h b/include/drm/drmP.h
+index 7ad3faa..66713c6 100644
+--- a/include/drm/drmP.h
++++ b/include/drm/drmP.h
+@@ -1016,7 +1016,7 @@ struct drm_device {
+ struct pci_controller *hose;
+ #endif
+ struct drm_sg_mem *sg; /**< Scatter gather memory */
+- int num_crtcs; /**< Number of CRTCs on this device */
++ unsigned int num_crtcs; /**< Number of CRTCs on this device */
+ void *dev_private; /**< device private data */
+ void *mm_private;
+ struct address_space *dev_mapping;
+diff --git a/include/net/sctp/command.h b/include/net/sctp/command.h
+index 8be5135..2c55a7e 100644
+--- a/include/net/sctp/command.h
++++ b/include/net/sctp/command.h
+@@ -107,6 +107,7 @@ typedef enum {
+ SCTP_CMD_T1_RETRAN, /* Mark for retransmission after T1 timeout */
+ SCTP_CMD_UPDATE_INITTAG, /* Update peer inittag */
+ SCTP_CMD_SEND_MSG, /* Send the whole use message */
++ SCTP_CMD_SEND_NEXT_ASCONF, /* Send the next ASCONF after ACK */
+ SCTP_CMD_LAST
+ } sctp_verb_t;
+
+diff --git a/kernel/time/tick-broadcast.c b/kernel/time/tick-broadcast.c
+index c2ec250..49446b1 100644
+--- a/kernel/time/tick-broadcast.c
++++ b/kernel/time/tick-broadcast.c
+@@ -600,4 +600,14 @@ int tick_broadcast_oneshot_active(void)
+ return tick_broadcast_device.mode == TICKDEV_MODE_ONESHOT;
+ }
+
++/*
++ * Check whether the broadcast device supports oneshot.
++ */
++bool tick_broadcast_oneshot_available(void)
++{
++ struct clock_event_device *bc = tick_broadcast_device.evtdev;
++
++ return bc ? bc->features & CLOCK_EVT_FEAT_ONESHOT : false;
++}
++
+ #endif
+diff --git a/kernel/time/tick-common.c b/kernel/time/tick-common.c
+index 83c4417..a943826 100644
+--- a/kernel/time/tick-common.c
++++ b/kernel/time/tick-common.c
+@@ -51,7 +51,11 @@ int tick_is_oneshot_available(void)
+ {
+ struct clock_event_device *dev = __get_cpu_var(tick_cpu_device).evtdev;
+
+- return dev && (dev->features & CLOCK_EVT_FEAT_ONESHOT);
++ if (!dev || !(dev->features & CLOCK_EVT_FEAT_ONESHOT))
++ return 0;
++ if (!(dev->features & CLOCK_EVT_FEAT_C3STOP))
++ return 1;
++ return tick_broadcast_oneshot_available();
+ }
+
+ /*
+diff --git a/kernel/time/tick-internal.h b/kernel/time/tick-internal.h
+index b1c05bf..32fbf20 100644
+--- a/kernel/time/tick-internal.h
++++ b/kernel/time/tick-internal.h
+@@ -37,6 +37,7 @@ extern void tick_shutdown_broadcast_oneshot(unsigned int *cpup);
+ extern int tick_resume_broadcast_oneshot(struct clock_event_device *bc);
+ extern int tick_broadcast_oneshot_active(void);
+ extern void tick_check_oneshot_broadcast(int cpu);
++bool tick_broadcast_oneshot_available(void);
+ # else /* BROADCAST */
+ static inline void tick_broadcast_setup_oneshot(struct clock_event_device *bc)
+ {
+@@ -47,6 +48,7 @@ static inline void tick_broadcast_switch_to_oneshot(void) { }
+ static inline void tick_shutdown_broadcast_oneshot(unsigned int *cpup) { }
+ static inline int tick_broadcast_oneshot_active(void) { return 0; }
+ static inline void tick_check_oneshot_broadcast(int cpu) { }
++static inline bool tick_broadcast_oneshot_available(void) { return true; }
+ # endif /* !BROADCAST */
+
+ #else /* !ONESHOT */
+@@ -77,6 +79,7 @@ static inline int tick_resume_broadcast_oneshot(struct clock_event_device *bc)
+ return 0;
+ }
+ static inline int tick_broadcast_oneshot_active(void) { return 0; }
++static inline bool tick_broadcast_oneshot_available(void) { return false; }
+ #endif /* !TICK_ONESHOT */
+
+ /*
+diff --git a/net/dccp/input.c b/net/dccp/input.c
+index 7648f31..26fa731 100644
+--- a/net/dccp/input.c
++++ b/net/dccp/input.c
+@@ -616,6 +616,9 @@ int dccp_rcv_state_process(struct sock *sk, struct sk_buff *skb,
+ /* Caller (dccp_v4_do_rcv) will send Reset */
+ dcb->dccpd_reset_code = DCCP_RESET_CODE_NO_CONNECTION;
+ return 1;
++ } else if (sk->sk_state == DCCP_CLOSED) {
++ dcb->dccpd_reset_code = DCCP_RESET_CODE_NO_CONNECTION;
++ return 1;
+ }
+
+ if (sk->sk_state != DCCP_REQUESTING && sk->sk_state != DCCP_RESPOND) {
+@@ -678,10 +681,6 @@ int dccp_rcv_state_process(struct sock *sk, struct sk_buff *skb,
+ }
+
+ switch (sk->sk_state) {
+- case DCCP_CLOSED:
+- dcb->dccpd_reset_code = DCCP_RESET_CODE_NO_CONNECTION;
+- return 1;
+-
+ case DCCP_REQUESTING:
+ queued = dccp_rcv_request_sent_state_process(sk, skb, dh, len);
+ if (queued >= 0)
+diff --git a/net/ipv4/devinet.c b/net/ipv4/devinet.c
+index f84f6dd..f1e726f 100644
+--- a/net/ipv4/devinet.c
++++ b/net/ipv4/devinet.c
+@@ -1025,6 +1025,21 @@ static inline bool inetdev_valid_mtu(unsigned mtu)
+ return mtu >= 68;
+ }
+
++static void inetdev_send_gratuitous_arp(struct net_device *dev,
++ struct in_device *in_dev)
++
++{
++ struct in_ifaddr *ifa = in_dev->ifa_list;
++
++ if (!ifa)
++ return;
++
++ arp_send(ARPOP_REQUEST, ETH_P_ARP,
++ ifa->ifa_address, dev,
++ ifa->ifa_address, NULL,
++ dev->dev_addr, NULL);
++}
++
+ /* Called only under RTNL semaphore */
+
+ static int inetdev_event(struct notifier_block *this, unsigned long event,
+@@ -1076,18 +1091,13 @@ static int inetdev_event(struct notifier_block *this, unsigned long event,
+ }
+ ip_mc_up(in_dev);
+ /* fall through */
+- case NETDEV_NOTIFY_PEERS:
+ case NETDEV_CHANGEADDR:
++ if (!IN_DEV_ARP_NOTIFY(in_dev))
++ break;
++ /* fall through */
++ case NETDEV_NOTIFY_PEERS:
+ /* Send gratuitous ARP to notify of link change */
+- if (IN_DEV_ARP_NOTIFY(in_dev)) {
+- struct in_ifaddr *ifa = in_dev->ifa_list;
+-
+- if (ifa)
+- arp_send(ARPOP_REQUEST, ETH_P_ARP,
+- ifa->ifa_address, dev,
+- ifa->ifa_address, NULL,
+- dev->dev_addr, NULL);
+- }
++ inetdev_send_gratuitous_arp(dev, in_dev);
+ break;
+ case NETDEV_DOWN:
+ ip_mc_down(in_dev);
+diff --git a/net/sctp/sm_make_chunk.c b/net/sctp/sm_make_chunk.c
+index 8579b4f..c4cf362 100644
+--- a/net/sctp/sm_make_chunk.c
++++ b/net/sctp/sm_make_chunk.c
+@@ -3361,21 +3361,6 @@ int sctp_process_asconf_ack(struct sctp_association *asoc,
+ sctp_chunk_free(asconf);
+ asoc->addip_last_asconf = NULL;
+
+- /* Send the next asconf chunk from the addip chunk queue. */
+- if (!list_empty(&asoc->addip_chunk_list)) {
+- struct list_head *entry = asoc->addip_chunk_list.next;
+- asconf = list_entry(entry, struct sctp_chunk, list);
+-
+- list_del_init(entry);
+-
+- /* Hold the chunk until an ASCONF_ACK is received. */
+- sctp_chunk_hold(asconf);
+- if (sctp_primitive_ASCONF(asoc, asconf))
+- sctp_chunk_free(asconf);
+- else
+- asoc->addip_last_asconf = asconf;
+- }
+-
+ return retval;
+ }
+
+diff --git a/net/sctp/sm_sideeffect.c b/net/sctp/sm_sideeffect.c
+index 306bb8b..ed742bf 100644
+--- a/net/sctp/sm_sideeffect.c
++++ b/net/sctp/sm_sideeffect.c
+@@ -997,6 +997,29 @@ static int sctp_cmd_send_msg(struct sctp_association *asoc,
+ }
+
+
++/* Sent the next ASCONF packet currently stored in the association.
++ * This happens after the ASCONF_ACK was succeffully processed.
++ */
++static void sctp_cmd_send_asconf(struct sctp_association *asoc)
++{
++ /* Send the next asconf chunk from the addip chunk
++ * queue.
++ */
++ if (!list_empty(&asoc->addip_chunk_list)) {
++ struct list_head *entry = asoc->addip_chunk_list.next;
++ struct sctp_chunk *asconf = list_entry(entry,
++ struct sctp_chunk, list);
++ list_del_init(entry);
++
++ /* Hold the chunk until an ASCONF_ACK is received. */
++ sctp_chunk_hold(asconf);
++ if (sctp_primitive_ASCONF(asoc, asconf))
++ sctp_chunk_free(asconf);
++ else
++ asoc->addip_last_asconf = asconf;
++ }
++}
++
+
+ /* These three macros allow us to pull the debugging code out of the
+ * main flow of sctp_do_sm() to keep attention focused on the real
+@@ -1650,6 +1673,9 @@ static int sctp_cmd_interpreter(sctp_event_t event_type,
+ }
+ error = sctp_cmd_send_msg(asoc, cmd->obj.msg);
+ break;
++ case SCTP_CMD_SEND_NEXT_ASCONF:
++ sctp_cmd_send_asconf(asoc);
++ break;
+ default:
+ printk(KERN_WARNING "Impossible command: %u, %p\n",
+ cmd->verb, cmd->obj.ptr);
+diff --git a/net/sctp/sm_statefuns.c b/net/sctp/sm_statefuns.c
+index d4df450..2f8e1c8 100644
+--- a/net/sctp/sm_statefuns.c
++++ b/net/sctp/sm_statefuns.c
+@@ -3670,8 +3670,14 @@ sctp_disposition_t sctp_sf_do_asconf_ack(const struct sctp_endpoint *ep,
+ SCTP_TO(SCTP_EVENT_TIMEOUT_T4_RTO));
+
+ if (!sctp_process_asconf_ack((struct sctp_association *)asoc,
+- asconf_ack))
++ asconf_ack)) {
++ /* Successfully processed ASCONF_ACK. We can
++ * release the next asconf if we have one.
++ */
++ sctp_add_cmd_sf(commands, SCTP_CMD_SEND_NEXT_ASCONF,
++ SCTP_NULL());
+ return SCTP_DISPOSITION_CONSUME;
++ }
+
+ abort = sctp_make_abort(asoc, asconf_ack,
+ sizeof(sctp_errhdr_t));
Modified: dists/squeeze/linux-2.6/debian/patches/series/31
==============================================================================
--- dists/squeeze/linux-2.6/debian/patches/series/31 Fri Mar 4 16:31:00 2011 (r16982)
+++ dists/squeeze/linux-2.6/debian/patches/series/31 Sat Mar 5 13:01:33 2011 (r16983)
@@ -30,11 +30,7 @@
+ bugfix/all/revert-USB-prevent-buggy-hubs-from-crashing-the-USB.patch
+ bugfix/all/af_unix-limit-recursion-level.patch
+ debian/af_unix-Avoid-ABI-change-from-introduction-of-recursion-limit.patch
-+ bugfix/all/usb-iowarrior-don-t-trust-report_size-for-buffer-siz.patch
+ features/all/hwmon-k10temp.patch
-+ bugfix/all/HID-add-support-for-Acan-FG-8100-barcode-reader.patch
-+ bugfix/all/drm-fix-unsigned-vs-signed-comparison-issue-in-modes.patch
-+ debian/drm-Avoid-ABI-change-from-fix-for-CVE-2011-1013.patch
- bugfix/all/sctp-fix-out-of-bounds-reading-in-sctp_assoc_get_hmac.patch
- bugfix/all/tcp-Make-TCP_MAXSEG-minimum-more-correct.patch
- bugfix/all/tcp-Increase-TCP_MAXSEG-socket-option-minimum.patch
@@ -42,8 +38,7 @@
- bugfix/all/fix-pktcdvd-ioctl-dev_minor-range-check.patch
- bugfix/x86/x86-pvclock-Zero-last_value-on-resume.patch
+ bugfix/all/stable/2.6.32.30.patch
-+ bugfix/all/stable/2.6.32.30-fix.patch
-+ bugfix/all/netxen-fix-set-mac-addr.patch
-+ bugfix/all/virtio-set-pci-bus-master-enable-bit.patch
-+ bugfix/all/sctp-Fix-oops-when-sending-queued-ASCONF-chunks.patch
+ bugfix/all/drm-ttm-Fix-two-race-conditions-fix-busy-codepaths.patch
++ bugfix/all/stable/2.6.32.31.patch
++ bugfix/all/stable/2.6.32.32-rc1.patch
++ debian/drm-Avoid-ABI-change-from-fix-for-CVE-2011-1013.patch
More information about the Kernel-svn-changes
mailing list