mirror of
https://github.com/Fishwaldo/build.git
synced 2025-03-30 10:41:50 +00:00
698 lines
22 KiB
Diff
698 lines
22 KiB
Diff
diff --git a/Makefile b/Makefile
|
|
index 067433219984..6d19e37d36d5 100644
|
|
--- a/Makefile
|
|
+++ b/Makefile
|
|
@@ -1,6 +1,6 @@
|
|
VERSION = 3
|
|
PATCHLEVEL = 10
|
|
-SUBLEVEL = 80
|
|
+SUBLEVEL = 81
|
|
EXTRAVERSION =
|
|
NAME = TOSSUG Baby Fish
|
|
|
|
diff --git a/arch/mips/kernel/irq.c b/arch/mips/kernel/irq.c
|
|
index d1fea7a054be..7479d8d847a6 100644
|
|
--- a/arch/mips/kernel/irq.c
|
|
+++ b/arch/mips/kernel/irq.c
|
|
@@ -110,7 +110,7 @@ void __init init_IRQ(void)
|
|
#endif
|
|
}
|
|
|
|
-#ifdef DEBUG_STACKOVERFLOW
|
|
+#ifdef CONFIG_DEBUG_STACKOVERFLOW
|
|
static inline void check_stack_overflow(void)
|
|
{
|
|
unsigned long sp;
|
|
diff --git a/block/genhd.c b/block/genhd.c
|
|
index 7694dffe9f0e..b09f5fc94dee 100644
|
|
--- a/block/genhd.c
|
|
+++ b/block/genhd.c
|
|
@@ -422,9 +422,9 @@ int blk_alloc_devt(struct hd_struct *part, dev_t *devt)
|
|
/* allocate ext devt */
|
|
idr_preload(GFP_KERNEL);
|
|
|
|
- spin_lock(&ext_devt_lock);
|
|
+ spin_lock_bh(&ext_devt_lock);
|
|
idx = idr_alloc(&ext_devt_idr, part, 0, NR_EXT_DEVT, GFP_NOWAIT);
|
|
- spin_unlock(&ext_devt_lock);
|
|
+ spin_unlock_bh(&ext_devt_lock);
|
|
|
|
idr_preload_end();
|
|
if (idx < 0)
|
|
@@ -449,9 +449,9 @@ void blk_free_devt(dev_t devt)
|
|
return;
|
|
|
|
if (MAJOR(devt) == BLOCK_EXT_MAJOR) {
|
|
- spin_lock(&ext_devt_lock);
|
|
+ spin_lock_bh(&ext_devt_lock);
|
|
idr_remove(&ext_devt_idr, blk_mangle_minor(MINOR(devt)));
|
|
- spin_unlock(&ext_devt_lock);
|
|
+ spin_unlock_bh(&ext_devt_lock);
|
|
}
|
|
}
|
|
|
|
@@ -691,13 +691,13 @@ struct gendisk *get_gendisk(dev_t devt, int *partno)
|
|
} else {
|
|
struct hd_struct *part;
|
|
|
|
- spin_lock(&ext_devt_lock);
|
|
+ spin_lock_bh(&ext_devt_lock);
|
|
part = idr_find(&ext_devt_idr, blk_mangle_minor(MINOR(devt)));
|
|
if (part && get_disk(part_to_disk(part))) {
|
|
*partno = part->partno;
|
|
disk = part_to_disk(part);
|
|
}
|
|
- spin_unlock(&ext_devt_lock);
|
|
+ spin_unlock_bh(&ext_devt_lock);
|
|
}
|
|
|
|
return disk;
|
|
diff --git a/drivers/ata/pata_octeon_cf.c b/drivers/ata/pata_octeon_cf.c
|
|
index e73bef3093d2..5507f36a06b4 100644
|
|
--- a/drivers/ata/pata_octeon_cf.c
|
|
+++ b/drivers/ata/pata_octeon_cf.c
|
|
@@ -1068,7 +1068,7 @@ static struct of_device_id octeon_cf_match[] = {
|
|
},
|
|
{},
|
|
};
|
|
-MODULE_DEVICE_TABLE(of, octeon_i2c_match);
|
|
+MODULE_DEVICE_TABLE(of, octeon_cf_match);
|
|
|
|
static struct platform_driver octeon_cf_driver = {
|
|
.probe = octeon_cf_probe,
|
|
diff --git a/drivers/gpu/drm/i915/intel_i2c.c b/drivers/gpu/drm/i915/intel_i2c.c
|
|
index 4a21e13cc58c..d5e666fb459c 100644
|
|
--- a/drivers/gpu/drm/i915/intel_i2c.c
|
|
+++ b/drivers/gpu/drm/i915/intel_i2c.c
|
|
@@ -441,7 +441,7 @@ gmbus_xfer(struct i2c_adapter *adapter,
|
|
struct intel_gmbus,
|
|
adapter);
|
|
struct drm_i915_private *dev_priv = bus->dev_priv;
|
|
- int i, reg_offset;
|
|
+ int i = 0, inc, try = 0, reg_offset;
|
|
int ret = 0;
|
|
|
|
mutex_lock(&dev_priv->gmbus_mutex);
|
|
@@ -453,12 +453,14 @@ gmbus_xfer(struct i2c_adapter *adapter,
|
|
|
|
reg_offset = dev_priv->gpio_mmio_base;
|
|
|
|
+retry:
|
|
I915_WRITE(GMBUS0 + reg_offset, bus->reg0);
|
|
|
|
- for (i = 0; i < num; i++) {
|
|
+ for (; i < num; i += inc) {
|
|
+ inc = 1;
|
|
if (gmbus_is_index_read(msgs, i, num)) {
|
|
ret = gmbus_xfer_index_read(dev_priv, &msgs[i]);
|
|
- i += 1; /* set i to the index of the read xfer */
|
|
+ inc = 2; /* an index read is two msgs */
|
|
} else if (msgs[i].flags & I2C_M_RD) {
|
|
ret = gmbus_xfer_read(dev_priv, &msgs[i], 0);
|
|
} else {
|
|
@@ -530,6 +532,18 @@ clear_err:
|
|
adapter->name, msgs[i].addr,
|
|
(msgs[i].flags & I2C_M_RD) ? 'r' : 'w', msgs[i].len);
|
|
|
|
+ /*
|
|
+ * Passive adapters sometimes NAK the first probe. Retry the first
|
|
+ * message once on -ENXIO for GMBUS transfers; the bit banging algorithm
|
|
+ * has retries internally. See also the retry loop in
|
|
+ * drm_do_probe_ddc_edid, which bails out on the first -ENXIO.
|
|
+ */
|
|
+ if (ret == -ENXIO && i == 0 && try++ == 0) {
|
|
+ DRM_DEBUG_KMS("GMBUS [%s] NAK on first message, retry\n",
|
|
+ adapter->name);
|
|
+ goto retry;
|
|
+ }
|
|
+
|
|
goto out;
|
|
|
|
timeout:
|
|
diff --git a/drivers/iio/imu/adis16400.h b/drivers/iio/imu/adis16400.h
|
|
index 0916bf6b6c31..1e8fd2e81d45 100644
|
|
--- a/drivers/iio/imu/adis16400.h
|
|
+++ b/drivers/iio/imu/adis16400.h
|
|
@@ -165,6 +165,7 @@ struct adis16400_state {
|
|
int filt_int;
|
|
|
|
struct adis adis;
|
|
+ unsigned long avail_scan_mask[2];
|
|
};
|
|
|
|
/* At the moment triggers are only used for ring buffer
|
|
diff --git a/drivers/iio/imu/adis16400_core.c b/drivers/iio/imu/adis16400_core.c
|
|
index 7d60c85cc16d..9721c58ed847 100644
|
|
--- a/drivers/iio/imu/adis16400_core.c
|
|
+++ b/drivers/iio/imu/adis16400_core.c
|
|
@@ -438,6 +438,11 @@ static int adis16400_read_raw(struct iio_dev *indio_dev,
|
|
*val = st->variant->temp_scale_nano / 1000000;
|
|
*val2 = (st->variant->temp_scale_nano % 1000000);
|
|
return IIO_VAL_INT_PLUS_MICRO;
|
|
+ case IIO_PRESSURE:
|
|
+ /* 20 uBar = 0.002kPascal */
|
|
+ *val = 0;
|
|
+ *val2 = 2000;
|
|
+ return IIO_VAL_INT_PLUS_MICRO;
|
|
default:
|
|
return -EINVAL;
|
|
}
|
|
@@ -480,10 +485,10 @@ static int adis16400_read_raw(struct iio_dev *indio_dev,
|
|
}
|
|
}
|
|
|
|
-#define ADIS16400_VOLTAGE_CHAN(addr, bits, name, si) { \
|
|
+#define ADIS16400_VOLTAGE_CHAN(addr, bits, name, si, chn) { \
|
|
.type = IIO_VOLTAGE, \
|
|
.indexed = 1, \
|
|
- .channel = 0, \
|
|
+ .channel = chn, \
|
|
.extend_name = name, \
|
|
.info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \
|
|
BIT(IIO_CHAN_INFO_SCALE), \
|
|
@@ -499,10 +504,10 @@ static int adis16400_read_raw(struct iio_dev *indio_dev,
|
|
}
|
|
|
|
#define ADIS16400_SUPPLY_CHAN(addr, bits) \
|
|
- ADIS16400_VOLTAGE_CHAN(addr, bits, "supply", ADIS16400_SCAN_SUPPLY)
|
|
+ ADIS16400_VOLTAGE_CHAN(addr, bits, "supply", ADIS16400_SCAN_SUPPLY, 0)
|
|
|
|
#define ADIS16400_AUX_ADC_CHAN(addr, bits) \
|
|
- ADIS16400_VOLTAGE_CHAN(addr, bits, NULL, ADIS16400_SCAN_ADC)
|
|
+ ADIS16400_VOLTAGE_CHAN(addr, bits, NULL, ADIS16400_SCAN_ADC, 1)
|
|
|
|
#define ADIS16400_GYRO_CHAN(mod, addr, bits) { \
|
|
.type = IIO_ANGL_VEL, \
|
|
@@ -819,11 +824,6 @@ static const struct iio_info adis16400_info = {
|
|
.debugfs_reg_access = adis_debugfs_reg_access,
|
|
};
|
|
|
|
-static const unsigned long adis16400_burst_scan_mask[] = {
|
|
- ~0UL,
|
|
- 0,
|
|
-};
|
|
-
|
|
static const char * const adis16400_status_error_msgs[] = {
|
|
[ADIS16400_DIAG_STAT_ZACCL_FAIL] = "Z-axis accelerometer self-test failure",
|
|
[ADIS16400_DIAG_STAT_YACCL_FAIL] = "Y-axis accelerometer self-test failure",
|
|
@@ -871,6 +871,20 @@ static const struct adis_data adis16400_data = {
|
|
BIT(ADIS16400_DIAG_STAT_POWER_LOW),
|
|
};
|
|
|
|
+static void adis16400_setup_chan_mask(struct adis16400_state *st)
|
|
+{
|
|
+ const struct adis16400_chip_info *chip_info = st->variant;
|
|
+ unsigned i;
|
|
+
|
|
+ for (i = 0; i < chip_info->num_channels; i++) {
|
|
+ const struct iio_chan_spec *ch = &chip_info->channels[i];
|
|
+
|
|
+ if (ch->scan_index >= 0 &&
|
|
+ ch->scan_index != ADIS16400_SCAN_TIMESTAMP)
|
|
+ st->avail_scan_mask[0] |= BIT(ch->scan_index);
|
|
+ }
|
|
+}
|
|
+
|
|
static int adis16400_probe(struct spi_device *spi)
|
|
{
|
|
struct adis16400_state *st;
|
|
@@ -894,8 +908,10 @@ static int adis16400_probe(struct spi_device *spi)
|
|
indio_dev->info = &adis16400_info;
|
|
indio_dev->modes = INDIO_DIRECT_MODE;
|
|
|
|
- if (!(st->variant->flags & ADIS16400_NO_BURST))
|
|
- indio_dev->available_scan_masks = adis16400_burst_scan_mask;
|
|
+ if (!(st->variant->flags & ADIS16400_NO_BURST)) {
|
|
+ adis16400_setup_chan_mask(st);
|
|
+ indio_dev->available_scan_masks = st->avail_scan_mask;
|
|
+ }
|
|
|
|
ret = adis_init(&st->adis, indio_dev, spi, &adis16400_data);
|
|
if (ret)
|
|
diff --git a/drivers/input/mouse/elantech.c b/drivers/input/mouse/elantech.c
|
|
index dbd4f5ad3343..02099afb6c79 100644
|
|
--- a/drivers/input/mouse/elantech.c
|
|
+++ b/drivers/input/mouse/elantech.c
|
|
@@ -1241,10 +1241,11 @@ static bool elantech_is_signature_valid(const unsigned char *param)
|
|
return true;
|
|
|
|
/*
|
|
- * Some models have a revision higher then 20. Meaning param[2] may
|
|
- * be 10 or 20, skip the rates check for these.
|
|
+ * Some hw_version >= 4 models have a revision higher then 20. Meaning
|
|
+ * that param[2] may be 10 or 20, skip the rates check for these.
|
|
*/
|
|
- if (param[0] == 0x46 && (param[1] & 0xef) == 0x0f && param[2] < 40)
|
|
+ if ((param[0] & 0x0f) >= 0x06 && (param[1] & 0xaf) == 0x0f &&
|
|
+ param[2] < 40)
|
|
return true;
|
|
|
|
for (i = 0; i < ARRAY_SIZE(rates); i++)
|
|
diff --git a/drivers/net/phy/dp83640.c b/drivers/net/phy/dp83640.c
|
|
index 7490b6c866e6..d2907a6e3dab 100644
|
|
--- a/drivers/net/phy/dp83640.c
|
|
+++ b/drivers/net/phy/dp83640.c
|
|
@@ -45,7 +45,7 @@
|
|
#define PSF_TX 0x1000
|
|
#define EXT_EVENT 1
|
|
#define CAL_EVENT 7
|
|
-#define CAL_TRIGGER 7
|
|
+#define CAL_TRIGGER 1
|
|
#define PER_TRIGGER 6
|
|
|
|
#define MII_DP83640_MICR 0x11
|
|
diff --git a/drivers/net/phy/phy.c b/drivers/net/phy/phy.c
|
|
index 427e48a80efa..299d35552a3e 100644
|
|
--- a/drivers/net/phy/phy.c
|
|
+++ b/drivers/net/phy/phy.c
|
|
@@ -1022,12 +1022,14 @@ int phy_init_eee(struct phy_device *phydev, bool clk_stop_enable)
|
|
|
|
/* According to 802.3az,the EEE is supported only in full duplex-mode.
|
|
* Also EEE feature is active when core is operating with MII, GMII
|
|
- * or RGMII.
|
|
+ * or RGMII (all kinds). Internal PHYs are also allowed to proceed and
|
|
+ * should return an error if they do not support EEE.
|
|
*/
|
|
if ((phydev->duplex == DUPLEX_FULL) &&
|
|
((phydev->interface == PHY_INTERFACE_MODE_MII) ||
|
|
(phydev->interface == PHY_INTERFACE_MODE_GMII) ||
|
|
- (phydev->interface == PHY_INTERFACE_MODE_RGMII))) {
|
|
+ (phydev->interface >= PHY_INTERFACE_MODE_RGMII &&
|
|
+ phydev->interface <= PHY_INTERFACE_MODE_RGMII_TXID))) {
|
|
int eee_lp, eee_cap, eee_adv;
|
|
u32 lp, cap, adv;
|
|
int status;
|
|
diff --git a/drivers/net/xen-netback/xenbus.c b/drivers/net/xen-netback/xenbus.c
|
|
index 8a9e8750703f..e0cf18c6cf11 100644
|
|
--- a/drivers/net/xen-netback/xenbus.c
|
|
+++ b/drivers/net/xen-netback/xenbus.c
|
|
@@ -33,6 +33,8 @@ struct backend_info {
|
|
enum xenbus_state frontend_state;
|
|
struct xenbus_watch hotplug_status_watch;
|
|
u8 have_hotplug_status_watch:1;
|
|
+
|
|
+ const char *hotplug_script;
|
|
};
|
|
|
|
static int connect_rings(struct backend_info *);
|
|
@@ -55,6 +57,7 @@ static int netback_remove(struct xenbus_device *dev)
|
|
xenvif_free(be->vif);
|
|
be->vif = NULL;
|
|
}
|
|
+ kfree(be->hotplug_script);
|
|
kfree(be);
|
|
dev_set_drvdata(&dev->dev, NULL);
|
|
return 0;
|
|
@@ -72,6 +75,7 @@ static int netback_probe(struct xenbus_device *dev,
|
|
struct xenbus_transaction xbt;
|
|
int err;
|
|
int sg;
|
|
+ const char *script;
|
|
struct backend_info *be = kzalloc(sizeof(struct backend_info),
|
|
GFP_KERNEL);
|
|
if (!be) {
|
|
@@ -132,6 +136,15 @@ static int netback_probe(struct xenbus_device *dev,
|
|
goto fail;
|
|
}
|
|
|
|
+ script = xenbus_read(XBT_NIL, dev->nodename, "script", NULL);
|
|
+ if (IS_ERR(script)) {
|
|
+ err = PTR_ERR(script);
|
|
+ xenbus_dev_fatal(dev, err, "reading script");
|
|
+ goto fail;
|
|
+ }
|
|
+
|
|
+ be->hotplug_script = script;
|
|
+
|
|
err = xenbus_switch_state(dev, XenbusStateInitWait);
|
|
if (err)
|
|
goto fail;
|
|
@@ -162,22 +175,14 @@ static int netback_uevent(struct xenbus_device *xdev,
|
|
struct kobj_uevent_env *env)
|
|
{
|
|
struct backend_info *be = dev_get_drvdata(&xdev->dev);
|
|
- char *val;
|
|
|
|
- val = xenbus_read(XBT_NIL, xdev->nodename, "script", NULL);
|
|
- if (IS_ERR(val)) {
|
|
- int err = PTR_ERR(val);
|
|
- xenbus_dev_fatal(xdev, err, "reading script");
|
|
- return err;
|
|
- } else {
|
|
- if (add_uevent_var(env, "script=%s", val)) {
|
|
- kfree(val);
|
|
- return -ENOMEM;
|
|
- }
|
|
- kfree(val);
|
|
- }
|
|
+ if (!be)
|
|
+ return 0;
|
|
+
|
|
+ if (add_uevent_var(env, "script=%s", be->hotplug_script))
|
|
+ return -ENOMEM;
|
|
|
|
- if (!be || !be->vif)
|
|
+ if (!be->vif)
|
|
return 0;
|
|
|
|
return add_uevent_var(env, "vif=%s", be->vif->dev->name);
|
|
diff --git a/drivers/staging/ozwpan/ozusbsvc1.c b/drivers/staging/ozwpan/ozusbsvc1.c
|
|
index 4e4b650fee3f..d4f55b08ef78 100644
|
|
--- a/drivers/staging/ozwpan/ozusbsvc1.c
|
|
+++ b/drivers/staging/ozwpan/ozusbsvc1.c
|
|
@@ -314,7 +314,11 @@ static void oz_usb_handle_ep_data(struct oz_usb_ctx *usb_ctx,
|
|
struct oz_multiple_fixed *body =
|
|
(struct oz_multiple_fixed *)data_hdr;
|
|
u8 *data = body->data;
|
|
- int n = (len - sizeof(struct oz_multiple_fixed)+1)
|
|
+ unsigned int n;
|
|
+ if (!body->unit_size ||
|
|
+ len < sizeof(struct oz_multiple_fixed) - 1)
|
|
+ break;
|
|
+ n = (len - (sizeof(struct oz_multiple_fixed) - 1))
|
|
/ body->unit_size;
|
|
while (n--) {
|
|
oz_hcd_data_ind(usb_ctx->hport, body->endpoint,
|
|
@@ -376,10 +380,15 @@ void oz_usb_rx(struct oz_pd *pd, struct oz_elt *elt)
|
|
case OZ_GET_DESC_RSP: {
|
|
struct oz_get_desc_rsp *body =
|
|
(struct oz_get_desc_rsp *)usb_hdr;
|
|
- int data_len = elt->length -
|
|
- sizeof(struct oz_get_desc_rsp) + 1;
|
|
- u16 offs = le16_to_cpu(get_unaligned(&body->offset));
|
|
- u16 total_size =
|
|
+ u16 offs, total_size;
|
|
+ u8 data_len;
|
|
+
|
|
+ if (elt->length < sizeof(struct oz_get_desc_rsp) - 1)
|
|
+ break;
|
|
+ data_len = elt->length -
|
|
+ (sizeof(struct oz_get_desc_rsp) - 1);
|
|
+ offs = le16_to_cpu(get_unaligned(&body->offset));
|
|
+ total_size =
|
|
le16_to_cpu(get_unaligned(&body->total_size));
|
|
oz_trace("USB_REQ_GET_DESCRIPTOR - cnf\n");
|
|
oz_hcd_get_desc_cnf(usb_ctx->hport, body->req_id,
|
|
diff --git a/drivers/usb/serial/cp210x.c b/drivers/usb/serial/cp210x.c
|
|
index 691a82105180..ab1c5e8ac27f 100644
|
|
--- a/drivers/usb/serial/cp210x.c
|
|
+++ b/drivers/usb/serial/cp210x.c
|
|
@@ -128,6 +128,7 @@ static const struct usb_device_id id_table[] = {
|
|
{ USB_DEVICE(0x10C4, 0x8946) }, /* Ketra N1 Wireless Interface */
|
|
{ USB_DEVICE(0x10C4, 0x8977) }, /* CEL MeshWorks DevKit Device */
|
|
{ USB_DEVICE(0x10C4, 0x8998) }, /* KCF Technologies PRN */
|
|
+ { USB_DEVICE(0x10C4, 0x8A2A) }, /* HubZ dual ZigBee and Z-Wave dongle */
|
|
{ USB_DEVICE(0x10C4, 0xEA60) }, /* Silicon Labs factory default */
|
|
{ USB_DEVICE(0x10C4, 0xEA61) }, /* Silicon Labs factory default */
|
|
{ USB_DEVICE(0x10C4, 0xEA70) }, /* Silicon Labs factory default */
|
|
diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c
|
|
index 4d918d5f945a..b55e5f3a311d 100644
|
|
--- a/drivers/usb/serial/ftdi_sio.c
|
|
+++ b/drivers/usb/serial/ftdi_sio.c
|
|
@@ -715,6 +715,7 @@ static struct usb_device_id id_table_combined [] = {
|
|
{ USB_DEVICE(XSENS_VID, XSENS_AWINDA_DONGLE_PID) },
|
|
{ USB_DEVICE(XSENS_VID, XSENS_AWINDA_STATION_PID) },
|
|
{ USB_DEVICE(XSENS_VID, XSENS_CONVERTER_PID) },
|
|
+ { USB_DEVICE(XSENS_VID, XSENS_MTDEVBOARD_PID) },
|
|
{ USB_DEVICE(XSENS_VID, XSENS_MTW_PID) },
|
|
{ USB_DEVICE(FTDI_VID, FTDI_OMNI1509) },
|
|
{ USB_DEVICE(MOBILITY_VID, MOBILITY_USB_SERIAL_PID) },
|
|
diff --git a/drivers/usb/serial/ftdi_sio_ids.h b/drivers/usb/serial/ftdi_sio_ids.h
|
|
index e906b6aa2424..99316d7cfc03 100644
|
|
--- a/drivers/usb/serial/ftdi_sio_ids.h
|
|
+++ b/drivers/usb/serial/ftdi_sio_ids.h
|
|
@@ -155,6 +155,7 @@
|
|
#define XSENS_AWINDA_STATION_PID 0x0101
|
|
#define XSENS_AWINDA_DONGLE_PID 0x0102
|
|
#define XSENS_MTW_PID 0x0200 /* Xsens MTw */
|
|
+#define XSENS_MTDEVBOARD_PID 0x0300 /* Motion Tracker Development Board */
|
|
#define XSENS_CONVERTER_PID 0xD00D /* Xsens USB-serial converter */
|
|
|
|
/* Xsens devices using FTDI VID */
|
|
diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c
|
|
index 84ceff6abbc1..be7e31a933e5 100644
|
|
--- a/fs/btrfs/extent_io.c
|
|
+++ b/fs/btrfs/extent_io.c
|
|
@@ -4080,8 +4080,11 @@ int extent_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo,
|
|
}
|
|
ret = fiemap_fill_next_extent(fieinfo, em_start, disko,
|
|
em_len, flags);
|
|
- if (ret)
|
|
+ if (ret) {
|
|
+ if (ret == 1)
|
|
+ ret = 0;
|
|
goto out_free;
|
|
+ }
|
|
}
|
|
out_free:
|
|
free_extent_map(em);
|
|
diff --git a/fs/btrfs/super.c b/fs/btrfs/super.c
|
|
index f0857e092a3c..68891ff7e5d4 100644
|
|
--- a/fs/btrfs/super.c
|
|
+++ b/fs/btrfs/super.c
|
|
@@ -779,6 +779,15 @@ find_root:
|
|
if (btrfs_root_refs(&new_root->root_item) == 0)
|
|
return ERR_PTR(-ENOENT);
|
|
|
|
+ if (!(sb->s_flags & MS_RDONLY)) {
|
|
+ int ret;
|
|
+ down_read(&fs_info->cleanup_work_sem);
|
|
+ ret = btrfs_orphan_cleanup(new_root);
|
|
+ up_read(&fs_info->cleanup_work_sem);
|
|
+ if (ret)
|
|
+ return ERR_PTR(ret);
|
|
+ }
|
|
+
|
|
dir_id = btrfs_root_dirid(&new_root->root_item);
|
|
setup_root:
|
|
location.objectid = dir_id;
|
|
diff --git a/kernel/trace/ring_buffer_benchmark.c b/kernel/trace/ring_buffer_benchmark.c
|
|
index a5457d577b98..6ad2e2d320fe 100644
|
|
--- a/kernel/trace/ring_buffer_benchmark.c
|
|
+++ b/kernel/trace/ring_buffer_benchmark.c
|
|
@@ -455,7 +455,7 @@ static int __init ring_buffer_benchmark_init(void)
|
|
|
|
if (producer_fifo >= 0) {
|
|
struct sched_param param = {
|
|
- .sched_priority = consumer_fifo
|
|
+ .sched_priority = producer_fifo
|
|
};
|
|
sched_setscheduler(producer, SCHED_FIFO, ¶m);
|
|
} else
|
|
diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c
|
|
index 2298237db142..d85d3a0e06ce 100644
|
|
--- a/mm/memory_hotplug.c
|
|
+++ b/mm/memory_hotplug.c
|
|
@@ -1803,8 +1803,10 @@ void try_offline_node(int nid)
|
|
* wait_table may be allocated from boot memory,
|
|
* here only free if it's allocated by vmalloc.
|
|
*/
|
|
- if (is_vmalloc_addr(zone->wait_table))
|
|
+ if (is_vmalloc_addr(zone->wait_table)) {
|
|
vfree(zone->wait_table);
|
|
+ zone->wait_table = NULL;
|
|
+ }
|
|
}
|
|
}
|
|
EXPORT_SYMBOL(try_offline_node);
|
|
diff --git a/net/bridge/br_multicast.c b/net/bridge/br_multicast.c
|
|
index 81de0106528b..49b4a82d3f86 100644
|
|
--- a/net/bridge/br_multicast.c
|
|
+++ b/net/bridge/br_multicast.c
|
|
@@ -1007,7 +1007,7 @@ static int br_ip6_multicast_mld2_report(struct net_bridge *br,
|
|
|
|
err = br_ip6_multicast_add_group(br, port, &grec->grec_mca,
|
|
vid);
|
|
- if (!err)
|
|
+ if (err)
|
|
break;
|
|
}
|
|
|
|
diff --git a/net/caif/caif_socket.c b/net/caif/caif_socket.c
|
|
index 526bf56f4d31..afeb8e07ee41 100644
|
|
--- a/net/caif/caif_socket.c
|
|
+++ b/net/caif/caif_socket.c
|
|
@@ -332,6 +332,10 @@ static long caif_stream_data_wait(struct sock *sk, long timeo)
|
|
release_sock(sk);
|
|
timeo = schedule_timeout(timeo);
|
|
lock_sock(sk);
|
|
+
|
|
+ if (sock_flag(sk, SOCK_DEAD))
|
|
+ break;
|
|
+
|
|
clear_bit(SOCK_ASYNC_WAITDATA, &sk->sk_socket->flags);
|
|
}
|
|
|
|
@@ -376,6 +380,10 @@ static int caif_stream_recvmsg(struct kiocb *iocb, struct socket *sock,
|
|
struct sk_buff *skb;
|
|
|
|
lock_sock(sk);
|
|
+ if (sock_flag(sk, SOCK_DEAD)) {
|
|
+ err = -ECONNRESET;
|
|
+ goto unlock;
|
|
+ }
|
|
skb = skb_dequeue(&sk->sk_receive_queue);
|
|
caif_check_flow_release(sk);
|
|
|
|
diff --git a/net/ipv4/route.c b/net/ipv4/route.c
|
|
index e23c5f64286b..222e1b6141d3 100644
|
|
--- a/net/ipv4/route.c
|
|
+++ b/net/ipv4/route.c
|
|
@@ -871,6 +871,10 @@ static int ip_error(struct sk_buff *skb)
|
|
bool send;
|
|
int code;
|
|
|
|
+ /* IP on this device is disabled. */
|
|
+ if (!in_dev)
|
|
+ goto out;
|
|
+
|
|
net = dev_net(rt->dst.dev);
|
|
if (!IN_DEV_FORWARD(in_dev)) {
|
|
switch (rt->dst.error) {
|
|
diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c
|
|
index c3075b552248..63b536bbf0b0 100644
|
|
--- a/net/ipv4/udp.c
|
|
+++ b/net/ipv4/udp.c
|
|
@@ -1293,10 +1293,8 @@ csum_copy_err:
|
|
}
|
|
unlock_sock_fast(sk, slow);
|
|
|
|
- if (noblock)
|
|
- return -EAGAIN;
|
|
-
|
|
- /* starting over for a new packet */
|
|
+ /* starting over for a new packet, but check if we need to yield */
|
|
+ cond_resched();
|
|
msg->msg_flags &= ~MSG_TRUNC;
|
|
goto try_again;
|
|
}
|
|
diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c
|
|
index 6b298dc614e3..7e3901893413 100644
|
|
--- a/net/ipv6/udp.c
|
|
+++ b/net/ipv6/udp.c
|
|
@@ -494,10 +494,8 @@ csum_copy_err:
|
|
}
|
|
unlock_sock_fast(sk, slow);
|
|
|
|
- if (noblock)
|
|
- return -EAGAIN;
|
|
-
|
|
- /* starting over for a new packet */
|
|
+ /* starting over for a new packet, but check if we need to yield */
|
|
+ cond_resched();
|
|
msg->msg_flags &= ~MSG_TRUNC;
|
|
goto try_again;
|
|
}
|
|
diff --git a/net/sched/sch_api.c b/net/sched/sch_api.c
|
|
index 2d2f07945c85..e87b27c7bffd 100644
|
|
--- a/net/sched/sch_api.c
|
|
+++ b/net/sched/sch_api.c
|
|
@@ -752,10 +752,8 @@ static int qdisc_graft(struct net_device *dev, struct Qdisc *parent,
|
|
if (dev->flags & IFF_UP)
|
|
dev_deactivate(dev);
|
|
|
|
- if (new && new->ops->attach) {
|
|
- new->ops->attach(new);
|
|
- num_q = 0;
|
|
- }
|
|
+ if (new && new->ops->attach)
|
|
+ goto skip;
|
|
|
|
for (i = 0; i < num_q; i++) {
|
|
struct netdev_queue *dev_queue = dev_ingress_queue(dev);
|
|
@@ -771,12 +769,16 @@ static int qdisc_graft(struct net_device *dev, struct Qdisc *parent,
|
|
qdisc_destroy(old);
|
|
}
|
|
|
|
+skip:
|
|
if (!ingress) {
|
|
notify_and_destroy(net, skb, n, classid,
|
|
dev->qdisc, new);
|
|
if (new && !new->ops->attach)
|
|
atomic_inc(&new->refcnt);
|
|
dev->qdisc = new ? : &noop_qdisc;
|
|
+
|
|
+ if (new && new->ops->attach)
|
|
+ new->ops->attach(new);
|
|
} else {
|
|
notify_and_destroy(net, skb, n, classid, old, new);
|
|
}
|
|
diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c
|
|
index 75e198d029d2..123c16419cbe 100644
|
|
--- a/net/unix/af_unix.c
|
|
+++ b/net/unix/af_unix.c
|
|
@@ -1898,6 +1898,10 @@ static long unix_stream_data_wait(struct sock *sk, long timeo,
|
|
unix_state_unlock(sk);
|
|
timeo = schedule_timeout(timeo);
|
|
unix_state_lock(sk);
|
|
+
|
|
+ if (sock_flag(sk, SOCK_DEAD))
|
|
+ break;
|
|
+
|
|
clear_bit(SOCK_ASYNC_WAITDATA, &sk->sk_socket->flags);
|
|
}
|
|
|
|
@@ -1957,6 +1961,10 @@ static int unix_stream_recvmsg(struct kiocb *iocb, struct socket *sock,
|
|
struct sk_buff *skb, *last;
|
|
|
|
unix_state_lock(sk);
|
|
+ if (sock_flag(sk, SOCK_DEAD)) {
|
|
+ err = -ECONNRESET;
|
|
+ goto unlock;
|
|
+ }
|
|
last = skb = skb_peek(&sk->sk_receive_queue);
|
|
again:
|
|
if (skb == NULL) {
|
|
diff --git a/net/wireless/wext-compat.c b/net/wireless/wext-compat.c
|
|
index d997d0f0c54a..18a7a7b112ef 100644
|
|
--- a/net/wireless/wext-compat.c
|
|
+++ b/net/wireless/wext-compat.c
|
|
@@ -1345,6 +1345,8 @@ static struct iw_statistics *cfg80211_wireless_stats(struct net_device *dev)
|
|
memcpy(bssid, wdev->current_bss->pub.bssid, ETH_ALEN);
|
|
wdev_unlock(wdev);
|
|
|
|
+ memset(&sinfo, 0, sizeof(sinfo));
|
|
+
|
|
if (rdev_get_station(rdev, dev, bssid, &sinfo))
|
|
return NULL;
|
|
|
|
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
|
|
index 444019696f85..ca2094c914a1 100644
|
|
--- a/sound/pci/hda/patch_realtek.c
|
|
+++ b/sound/pci/hda/patch_realtek.c
|
|
@@ -2148,6 +2148,7 @@ static const struct hda_fixup alc882_fixups[] = {
|
|
static const struct snd_pci_quirk alc882_fixup_tbl[] = {
|
|
SND_PCI_QUIRK(0x1025, 0x006c, "Acer Aspire 9810", ALC883_FIXUP_ACER_EAPD),
|
|
SND_PCI_QUIRK(0x1025, 0x0090, "Acer Aspire", ALC883_FIXUP_ACER_EAPD),
|
|
+ SND_PCI_QUIRK(0x1025, 0x0107, "Acer Aspire", ALC883_FIXUP_ACER_EAPD),
|
|
SND_PCI_QUIRK(0x1025, 0x010a, "Acer Ferrari 5000", ALC883_FIXUP_ACER_EAPD),
|
|
SND_PCI_QUIRK(0x1025, 0x0110, "Acer Aspire", ALC883_FIXUP_ACER_EAPD),
|
|
SND_PCI_QUIRK(0x1025, 0x0112, "Acer Aspire 9303", ALC883_FIXUP_ACER_EAPD),
|
|
diff --git a/sound/usb/mixer.c b/sound/usb/mixer.c
|
|
index 061be0e5fa5a..5ea5a18f3f58 100644
|
|
--- a/sound/usb/mixer.c
|
|
+++ b/sound/usb/mixer.c
|
|
@@ -891,6 +891,7 @@ static void volume_control_quirks(struct usb_mixer_elem_info *cval,
|
|
case USB_ID(0x046d, 0x081d): /* HD Webcam c510 */
|
|
case USB_ID(0x046d, 0x0825): /* HD Webcam c270 */
|
|
case USB_ID(0x046d, 0x0826): /* HD Webcam c525 */
|
|
+ case USB_ID(0x046d, 0x08ca): /* Logitech Quickcam Fusion */
|
|
case USB_ID(0x046d, 0x0991):
|
|
/* Most audio usb devices lie about volume resolution.
|
|
* Most Logitech webcams have res = 384.
|
|
diff --git a/sound/usb/mixer_maps.c b/sound/usb/mixer_maps.c
|
|
index 4df31b0f94a3..d06fbd9f7cbe 100644
|
|
--- a/sound/usb/mixer_maps.c
|
|
+++ b/sound/usb/mixer_maps.c
|
|
@@ -418,6 +418,11 @@ static struct usbmix_ctl_map usbmix_ctl_maps[] = {
|
|
.map = ebox44_map,
|
|
},
|
|
{
|
|
+ /* MAYA44 USB+ */
|
|
+ .id = USB_ID(0x2573, 0x0008),
|
|
+ .map = maya44_map,
|
|
+ },
|
|
+ {
|
|
/* KEF X300A */
|
|
.id = USB_ID(0x27ac, 0x1000),
|
|
.map = scms_usb3318_map,
|