mirror of
https://github.com/armbian/build
synced 2025-09-24 19:47:06 +07:00
Orangepi Zero 2 legacy - add upstream patches (#3180)
This commit is contained in:
1285
patch/kernel/archive/sun50iw9-4.9/patch-4.9.280-281.patch
Normal file
1285
patch/kernel/archive/sun50iw9-4.9/patch-4.9.280-281.patch
Normal file
File diff suppressed because it is too large
Load Diff
357
patch/kernel/archive/sun50iw9-4.9/patch-4.9.281-282.patch
Normal file
357
patch/kernel/archive/sun50iw9-4.9/patch-4.9.281-282.patch
Normal file
@@ -0,0 +1,357 @@
|
||||
diff --git a/Makefile b/Makefile
|
||||
index 08bbebb4acbf1..ca08ef26f416b 100644
|
||||
--- a/Makefile
|
||||
+++ b/Makefile
|
||||
@@ -1,6 +1,6 @@
|
||||
VERSION = 4
|
||||
PATCHLEVEL = 9
|
||||
-SUBLEVEL = 281
|
||||
+SUBLEVEL = 282
|
||||
EXTRAVERSION =
|
||||
NAME = Roaring Lionus
|
||||
|
||||
diff --git a/arch/arc/kernel/vmlinux.lds.S b/arch/arc/kernel/vmlinux.lds.S
|
||||
index f35ed578e007e..4d823d3f65bb3 100644
|
||||
--- a/arch/arc/kernel/vmlinux.lds.S
|
||||
+++ b/arch/arc/kernel/vmlinux.lds.S
|
||||
@@ -92,6 +92,8 @@ SECTIONS
|
||||
CPUIDLE_TEXT
|
||||
LOCK_TEXT
|
||||
KPROBES_TEXT
|
||||
+ IRQENTRY_TEXT
|
||||
+ SOFTIRQENTRY_TEXT
|
||||
*(.fixup)
|
||||
*(.gnu.warning)
|
||||
}
|
||||
diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c
|
||||
index 5cbc6591fa1d3..c16d24ad83560 100644
|
||||
--- a/arch/x86/kvm/mmu.c
|
||||
+++ b/arch/x86/kvm/mmu.c
|
||||
@@ -3927,7 +3927,16 @@ static void reset_rsvds_bits_mask_ept(struct kvm_vcpu *vcpu,
|
||||
void
|
||||
reset_shadow_zero_bits_mask(struct kvm_vcpu *vcpu, struct kvm_mmu *context)
|
||||
{
|
||||
- bool uses_nx = context->nx || context->base_role.smep_andnot_wp;
|
||||
+ /*
|
||||
+ * KVM uses NX when TDP is disabled to handle a variety of scenarios,
|
||||
+ * notably for huge SPTEs if iTLB multi-hit mitigation is enabled and
|
||||
+ * to generate correct permissions for CR0.WP=0/CR4.SMEP=1/EFER.NX=0.
|
||||
+ * The iTLB multi-hit workaround can be toggled at any time, so assume
|
||||
+ * NX can be used by any non-nested shadow MMU to avoid having to reset
|
||||
+ * MMU contexts. Note, KVM forces EFER.NX=1 when TDP is disabled.
|
||||
+ */
|
||||
+ bool uses_nx = context->nx || !tdp_enabled ||
|
||||
+ context->base_role.smep_andnot_wp;
|
||||
|
||||
/*
|
||||
* Passing "true" to the last argument is okay; it adds a check
|
||||
diff --git a/drivers/block/floppy.c b/drivers/block/floppy.c
|
||||
index 64a3dae5381ef..4496e7a492352 100644
|
||||
--- a/drivers/block/floppy.c
|
||||
+++ b/drivers/block/floppy.c
|
||||
@@ -4067,22 +4067,21 @@ static int floppy_open(struct block_device *bdev, fmode_t mode)
|
||||
if (UFDCS->rawcmd == 1)
|
||||
UFDCS->rawcmd = 2;
|
||||
|
||||
- if (mode & (FMODE_READ|FMODE_WRITE)) {
|
||||
- UDRS->last_checked = 0;
|
||||
- clear_bit(FD_OPEN_SHOULD_FAIL_BIT, &UDRS->flags);
|
||||
- check_disk_change(bdev);
|
||||
- if (test_bit(FD_DISK_CHANGED_BIT, &UDRS->flags))
|
||||
- goto out;
|
||||
- if (test_bit(FD_OPEN_SHOULD_FAIL_BIT, &UDRS->flags))
|
||||
+ if (!(mode & FMODE_NDELAY)) {
|
||||
+ if (mode & (FMODE_READ|FMODE_WRITE)) {
|
||||
+ UDRS->last_checked = 0;
|
||||
+ clear_bit(FD_OPEN_SHOULD_FAIL_BIT, &UDRS->flags);
|
||||
+ check_disk_change(bdev);
|
||||
+ if (test_bit(FD_DISK_CHANGED_BIT, &UDRS->flags))
|
||||
+ goto out;
|
||||
+ if (test_bit(FD_OPEN_SHOULD_FAIL_BIT, &UDRS->flags))
|
||||
+ goto out;
|
||||
+ }
|
||||
+ res = -EROFS;
|
||||
+ if ((mode & FMODE_WRITE) &&
|
||||
+ !test_bit(FD_DISK_WRITABLE_BIT, &UDRS->flags))
|
||||
goto out;
|
||||
}
|
||||
-
|
||||
- res = -EROFS;
|
||||
-
|
||||
- if ((mode & FMODE_WRITE) &&
|
||||
- !test_bit(FD_DISK_WRITABLE_BIT, &UDRS->flags))
|
||||
- goto out;
|
||||
-
|
||||
mutex_unlock(&open_lock);
|
||||
mutex_unlock(&floppy_mutex);
|
||||
return 0;
|
||||
diff --git a/drivers/infiniband/hw/hfi1/sdma.c b/drivers/infiniband/hw/hfi1/sdma.c
|
||||
index 76e63c88a87a8..e9313e6f4b0e3 100644
|
||||
--- a/drivers/infiniband/hw/hfi1/sdma.c
|
||||
+++ b/drivers/infiniband/hw/hfi1/sdma.c
|
||||
@@ -3028,6 +3028,7 @@ static void __sdma_process_event(struct sdma_engine *sde,
|
||||
static int _extend_sdma_tx_descs(struct hfi1_devdata *dd, struct sdma_txreq *tx)
|
||||
{
|
||||
int i;
|
||||
+ struct sdma_desc *descp;
|
||||
|
||||
/* Handle last descriptor */
|
||||
if (unlikely((tx->num_desc == (MAX_DESC - 1)))) {
|
||||
@@ -3048,12 +3049,10 @@ static int _extend_sdma_tx_descs(struct hfi1_devdata *dd, struct sdma_txreq *tx)
|
||||
if (unlikely(tx->num_desc == MAX_DESC))
|
||||
goto enomem;
|
||||
|
||||
- tx->descp = kmalloc_array(
|
||||
- MAX_DESC,
|
||||
- sizeof(struct sdma_desc),
|
||||
- GFP_ATOMIC);
|
||||
- if (!tx->descp)
|
||||
+ descp = kmalloc_array(MAX_DESC, sizeof(struct sdma_desc), GFP_ATOMIC);
|
||||
+ if (!descp)
|
||||
goto enomem;
|
||||
+ tx->descp = descp;
|
||||
|
||||
/* reserve last descriptor for coalescing */
|
||||
tx->desc_limit = MAX_DESC - 1;
|
||||
diff --git a/drivers/net/can/usb/esd_usb2.c b/drivers/net/can/usb/esd_usb2.c
|
||||
index 592c6e7f3dca4..fbe1173b2651f 100644
|
||||
--- a/drivers/net/can/usb/esd_usb2.c
|
||||
+++ b/drivers/net/can/usb/esd_usb2.c
|
||||
@@ -236,8 +236,8 @@ static void esd_usb2_rx_event(struct esd_usb2_net_priv *priv,
|
||||
if (id == ESD_EV_CAN_ERROR_EXT) {
|
||||
u8 state = msg->msg.rx.data[0];
|
||||
u8 ecc = msg->msg.rx.data[1];
|
||||
- u8 txerr = msg->msg.rx.data[2];
|
||||
- u8 rxerr = msg->msg.rx.data[3];
|
||||
+ u8 rxerr = msg->msg.rx.data[2];
|
||||
+ u8 txerr = msg->msg.rx.data[3];
|
||||
|
||||
skb = alloc_can_err_skb(priv->netdev, &cf);
|
||||
if (skb == NULL) {
|
||||
diff --git a/drivers/net/ethernet/intel/e1000e/ich8lan.c b/drivers/net/ethernet/intel/e1000e/ich8lan.c
|
||||
index 625008e8cb0df..500016209ae0c 100644
|
||||
--- a/drivers/net/ethernet/intel/e1000e/ich8lan.c
|
||||
+++ b/drivers/net/ethernet/intel/e1000e/ich8lan.c
|
||||
@@ -1010,6 +1010,8 @@ static s32 e1000_platform_pm_pch_lpt(struct e1000_hw *hw, bool link)
|
||||
{
|
||||
u32 reg = link << (E1000_LTRV_REQ_SHIFT + E1000_LTRV_NOSNOOP_SHIFT) |
|
||||
link << E1000_LTRV_REQ_SHIFT | E1000_LTRV_SEND;
|
||||
+ u16 max_ltr_enc_d = 0; /* maximum LTR decoded by platform */
|
||||
+ u16 lat_enc_d = 0; /* latency decoded */
|
||||
u16 lat_enc = 0; /* latency encoded */
|
||||
|
||||
if (link) {
|
||||
@@ -1063,7 +1065,17 @@ static s32 e1000_platform_pm_pch_lpt(struct e1000_hw *hw, bool link)
|
||||
E1000_PCI_LTR_CAP_LPT + 2, &max_nosnoop);
|
||||
max_ltr_enc = max_t(u16, max_snoop, max_nosnoop);
|
||||
|
||||
- if (lat_enc > max_ltr_enc)
|
||||
+ lat_enc_d = (lat_enc & E1000_LTRV_VALUE_MASK) *
|
||||
+ (1U << (E1000_LTRV_SCALE_FACTOR *
|
||||
+ ((lat_enc & E1000_LTRV_SCALE_MASK)
|
||||
+ >> E1000_LTRV_SCALE_SHIFT)));
|
||||
+
|
||||
+ max_ltr_enc_d = (max_ltr_enc & E1000_LTRV_VALUE_MASK) *
|
||||
+ (1U << (E1000_LTRV_SCALE_FACTOR *
|
||||
+ ((max_ltr_enc & E1000_LTRV_SCALE_MASK)
|
||||
+ >> E1000_LTRV_SCALE_SHIFT)));
|
||||
+
|
||||
+ if (lat_enc_d > max_ltr_enc_d)
|
||||
lat_enc = max_ltr_enc;
|
||||
}
|
||||
|
||||
diff --git a/drivers/net/ethernet/intel/e1000e/ich8lan.h b/drivers/net/ethernet/intel/e1000e/ich8lan.h
|
||||
index 6374c8fc76a8d..9957a4ffdc6dc 100644
|
||||
--- a/drivers/net/ethernet/intel/e1000e/ich8lan.h
|
||||
+++ b/drivers/net/ethernet/intel/e1000e/ich8lan.h
|
||||
@@ -291,8 +291,11 @@
|
||||
|
||||
/* Latency Tolerance Reporting */
|
||||
#define E1000_LTRV 0x000F8
|
||||
+#define E1000_LTRV_VALUE_MASK 0x000003FF
|
||||
#define E1000_LTRV_SCALE_MAX 5
|
||||
#define E1000_LTRV_SCALE_FACTOR 5
|
||||
+#define E1000_LTRV_SCALE_SHIFT 10
|
||||
+#define E1000_LTRV_SCALE_MASK 0x00001C00
|
||||
#define E1000_LTRV_REQ_SHIFT 15
|
||||
#define E1000_LTRV_NOSNOOP_SHIFT 16
|
||||
#define E1000_LTRV_SEND (1 << 30)
|
||||
diff --git a/drivers/net/ethernet/marvell/mvneta.c b/drivers/net/ethernet/marvell/mvneta.c
|
||||
index bb6bc84995a2f..ccacdcfb59321 100644
|
||||
--- a/drivers/net/ethernet/marvell/mvneta.c
|
||||
+++ b/drivers/net/ethernet/marvell/mvneta.c
|
||||
@@ -100,7 +100,7 @@
|
||||
#define MVNETA_DESC_SWAP BIT(6)
|
||||
#define MVNETA_TX_BRST_SZ_MASK(burst) ((burst) << 22)
|
||||
#define MVNETA_PORT_STATUS 0x2444
|
||||
-#define MVNETA_TX_IN_PRGRS BIT(1)
|
||||
+#define MVNETA_TX_IN_PRGRS BIT(0)
|
||||
#define MVNETA_TX_FIFO_EMPTY BIT(8)
|
||||
#define MVNETA_RX_MIN_FRAME_SIZE 0x247c
|
||||
#define MVNETA_SERDES_CFG 0x24A0
|
||||
diff --git a/drivers/tty/vt/vt_ioctl.c b/drivers/tty/vt/vt_ioctl.c
|
||||
index 9206fd2489353..e1c1627a3356b 100644
|
||||
--- a/drivers/tty/vt/vt_ioctl.c
|
||||
+++ b/drivers/tty/vt/vt_ioctl.c
|
||||
@@ -487,16 +487,19 @@ int vt_ioctl(struct tty_struct *tty,
|
||||
ret = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
- /* FIXME: this needs the console lock extending */
|
||||
- if (vc->vc_mode == (unsigned char) arg)
|
||||
+ console_lock();
|
||||
+ if (vc->vc_mode == (unsigned char) arg) {
|
||||
+ console_unlock();
|
||||
break;
|
||||
+ }
|
||||
vc->vc_mode = (unsigned char) arg;
|
||||
- if (console != fg_console)
|
||||
+ if (console != fg_console) {
|
||||
+ console_unlock();
|
||||
break;
|
||||
+ }
|
||||
/*
|
||||
* explicitly blank/unblank the screen if switching modes
|
||||
*/
|
||||
- console_lock();
|
||||
if (arg == KD_TEXT)
|
||||
do_unblank_screen(1);
|
||||
else
|
||||
diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c
|
||||
index cca51553e0fb0..e340ef67321e5 100644
|
||||
--- a/drivers/usb/dwc3/gadget.c
|
||||
+++ b/drivers/usb/dwc3/gadget.c
|
||||
@@ -928,19 +928,19 @@ static struct dwc3_trb *dwc3_ep_prev_trb(struct dwc3_ep *dep, u8 index)
|
||||
|
||||
static u32 dwc3_calc_trbs_left(struct dwc3_ep *dep)
|
||||
{
|
||||
- struct dwc3_trb *tmp;
|
||||
u8 trbs_left;
|
||||
|
||||
/*
|
||||
- * If enqueue & dequeue are equal than it is either full or empty.
|
||||
- *
|
||||
- * One way to know for sure is if the TRB right before us has HWO bit
|
||||
- * set or not. If it has, then we're definitely full and can't fit any
|
||||
- * more transfers in our ring.
|
||||
+ * If the enqueue & dequeue are equal then the TRB ring is either full
|
||||
+ * or empty. It's considered full when there are DWC3_TRB_NUM-1 of TRBs
|
||||
+ * pending to be processed by the driver.
|
||||
*/
|
||||
if (dep->trb_enqueue == dep->trb_dequeue) {
|
||||
- tmp = dwc3_ep_prev_trb(dep, dep->trb_enqueue);
|
||||
- if (tmp->ctrl & DWC3_TRB_CTRL_HWO)
|
||||
+ /*
|
||||
+ * If there is any request remained in the started_list at
|
||||
+ * this point, that means there is no TRB available.
|
||||
+ */
|
||||
+ if (!list_empty(&dep->started_list))
|
||||
return 0;
|
||||
|
||||
return DWC3_TRB_NUM - 1;
|
||||
diff --git a/drivers/usb/serial/ch341.c b/drivers/usb/serial/ch341.c
|
||||
index 2e92c6fef683f..c6ff79360302f 100644
|
||||
--- a/drivers/usb/serial/ch341.c
|
||||
+++ b/drivers/usb/serial/ch341.c
|
||||
@@ -585,7 +585,6 @@ static struct usb_serial_driver ch341_device = {
|
||||
.owner = THIS_MODULE,
|
||||
.name = "ch341-uart",
|
||||
},
|
||||
- .bulk_in_size = 512,
|
||||
.id_table = id_table,
|
||||
.num_ports = 1,
|
||||
.open = ch341_open,
|
||||
diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c
|
||||
index b3336a7c09e0b..02ded56bcbc6b 100644
|
||||
--- a/drivers/usb/serial/option.c
|
||||
+++ b/drivers/usb/serial/option.c
|
||||
@@ -2058,6 +2058,8 @@ static const struct usb_device_id option_ids[] = {
|
||||
.driver_info = RSVD(4) | RSVD(5) },
|
||||
{ USB_DEVICE_INTERFACE_CLASS(0x2cb7, 0x0105, 0xff), /* Fibocom NL678 series */
|
||||
.driver_info = RSVD(6) },
|
||||
+ { USB_DEVICE_AND_INTERFACE_INFO(0x2cb7, 0x010b, 0xff, 0xff, 0x30) }, /* Fibocom FG150 Diag */
|
||||
+ { USB_DEVICE_AND_INTERFACE_INFO(0x2cb7, 0x010b, 0xff, 0, 0) }, /* Fibocom FG150 AT */
|
||||
{ USB_DEVICE_INTERFACE_CLASS(0x2cb7, 0x01a0, 0xff) }, /* Fibocom NL668-AM/NL652-EU (laptop MBIM) */
|
||||
{ USB_DEVICE_INTERFACE_CLASS(0x2df3, 0x9d03, 0xff) }, /* LongSung M5710 */
|
||||
{ USB_DEVICE_INTERFACE_CLASS(0x305a, 0x1404, 0xff) }, /* GosunCn GM500 RNDIS */
|
||||
diff --git a/drivers/vhost/vringh.c b/drivers/vhost/vringh.c
|
||||
index d56736655dec4..da47542496cc3 100644
|
||||
--- a/drivers/vhost/vringh.c
|
||||
+++ b/drivers/vhost/vringh.c
|
||||
@@ -329,7 +329,7 @@ __vringh_iov(struct vringh *vrh, u16 i,
|
||||
iov = wiov;
|
||||
else {
|
||||
iov = riov;
|
||||
- if (unlikely(wiov && wiov->i)) {
|
||||
+ if (unlikely(wiov && wiov->used)) {
|
||||
vringh_bad("Readable desc %p after writable",
|
||||
&descs[i]);
|
||||
err = -EINVAL;
|
||||
diff --git a/drivers/video/fbdev/core/fbmem.c b/drivers/video/fbdev/core/fbmem.c
|
||||
index ae623cd04d6ca..16f5f56332433 100644
|
||||
--- a/drivers/video/fbdev/core/fbmem.c
|
||||
+++ b/drivers/video/fbdev/core/fbmem.c
|
||||
@@ -1001,6 +1001,10 @@ fb_set_var(struct fb_info *info, struct fb_var_screeninfo *var)
|
||||
goto done;
|
||||
}
|
||||
|
||||
+ /* bitfill_aligned() assumes that it's at least 8x8 */
|
||||
+ if (var->xres < 8 || var->yres < 8)
|
||||
+ return -EINVAL;
|
||||
+
|
||||
ret = info->fbops->fb_check_var(var, info);
|
||||
|
||||
if (ret)
|
||||
diff --git a/drivers/virtio/virtio_ring.c b/drivers/virtio/virtio_ring.c
|
||||
index 5cad9f41c238b..cf7eccfe3469b 100644
|
||||
--- a/drivers/virtio/virtio_ring.c
|
||||
+++ b/drivers/virtio/virtio_ring.c
|
||||
@@ -1150,7 +1150,7 @@ bool virtqueue_is_broken(struct virtqueue *_vq)
|
||||
{
|
||||
struct vring_virtqueue *vq = to_vvq(_vq);
|
||||
|
||||
- return vq->broken;
|
||||
+ return READ_ONCE(vq->broken);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(virtqueue_is_broken);
|
||||
|
||||
@@ -1164,7 +1164,9 @@ void virtio_break_device(struct virtio_device *dev)
|
||||
|
||||
list_for_each_entry(_vq, &dev->vqs, list) {
|
||||
struct vring_virtqueue *vq = to_vvq(_vq);
|
||||
- vq->broken = true;
|
||||
+
|
||||
+ /* Pairs with READ_ONCE() in virtqueue_is_broken(). */
|
||||
+ WRITE_ONCE(vq->broken, true);
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(virtio_break_device);
|
||||
diff --git a/net/ipv4/ip_gre.c b/net/ipv4/ip_gre.c
|
||||
index 9609ad71dd260..fe1801d9f0598 100644
|
||||
--- a/net/ipv4/ip_gre.c
|
||||
+++ b/net/ipv4/ip_gre.c
|
||||
@@ -353,6 +353,8 @@ static void __gre_xmit(struct sk_buff *skb, struct net_device *dev,
|
||||
|
||||
static int gre_handle_offloads(struct sk_buff *skb, bool csum)
|
||||
{
|
||||
+ if (csum && skb_checksum_start(skb) < skb->data)
|
||||
+ return -EINVAL;
|
||||
return iptunnel_handle_offloads(skb, csum ? SKB_GSO_GRE_CSUM : SKB_GSO_GRE);
|
||||
}
|
||||
|
||||
diff --git a/net/rds/ib_frmr.c b/net/rds/ib_frmr.c
|
||||
index 3d9c4c6397c3d..20d045faf07c6 100644
|
||||
--- a/net/rds/ib_frmr.c
|
||||
+++ b/net/rds/ib_frmr.c
|
||||
@@ -112,9 +112,9 @@ static int rds_ib_post_reg_frmr(struct rds_ib_mr *ibmr)
|
||||
cpu_relax();
|
||||
}
|
||||
|
||||
- ret = ib_map_mr_sg_zbva(frmr->mr, ibmr->sg, ibmr->sg_len,
|
||||
+ ret = ib_map_mr_sg_zbva(frmr->mr, ibmr->sg, ibmr->sg_dma_len,
|
||||
&off, PAGE_SIZE);
|
||||
- if (unlikely(ret != ibmr->sg_len))
|
||||
+ if (unlikely(ret != ibmr->sg_dma_len))
|
||||
return ret < 0 ? ret : -EINVAL;
|
||||
|
||||
/* Perform a WR for the fast_reg_mr. Each individual page
|
||||
4551
patch/kernel/archive/sun50iw9-4.9/patch-4.9.282-283.patch
Normal file
4551
patch/kernel/archive/sun50iw9-4.9/patch-4.9.282-283.patch
Normal file
File diff suppressed because it is too large
Load Diff
734
patch/kernel/archive/sun50iw9-4.9/patch-4.9.283-284.patch
Normal file
734
patch/kernel/archive/sun50iw9-4.9/patch-4.9.283-284.patch
Normal file
@@ -0,0 +1,734 @@
|
||||
diff --git a/Makefile b/Makefile
|
||||
index ef029a28bb53c..9605f840f94b8 100644
|
||||
--- a/Makefile
|
||||
+++ b/Makefile
|
||||
@@ -1,6 +1,6 @@
|
||||
VERSION = 4
|
||||
PATCHLEVEL = 9
|
||||
-SUBLEVEL = 283
|
||||
+SUBLEVEL = 284
|
||||
EXTRAVERSION =
|
||||
NAME = Roaring Lionus
|
||||
|
||||
diff --git a/arch/s390/net/bpf_jit_comp.c b/arch/s390/net/bpf_jit_comp.c
|
||||
index 53bb9700cf411..3d88c56d30f91 100644
|
||||
--- a/arch/s390/net/bpf_jit_comp.c
|
||||
+++ b/arch/s390/net/bpf_jit_comp.c
|
||||
@@ -591,10 +591,10 @@ static noinline int bpf_jit_insn(struct bpf_jit *jit, struct bpf_prog *fp, int i
|
||||
EMIT4(0xb9080000, dst_reg, src_reg);
|
||||
break;
|
||||
case BPF_ALU | BPF_ADD | BPF_K: /* dst = (u32) dst + (u32) imm */
|
||||
- if (!imm)
|
||||
- break;
|
||||
- /* alfi %dst,imm */
|
||||
- EMIT6_IMM(0xc20b0000, dst_reg, imm);
|
||||
+ if (imm != 0) {
|
||||
+ /* alfi %dst,imm */
|
||||
+ EMIT6_IMM(0xc20b0000, dst_reg, imm);
|
||||
+ }
|
||||
EMIT_ZERO(dst_reg);
|
||||
break;
|
||||
case BPF_ALU64 | BPF_ADD | BPF_K: /* dst = dst + imm */
|
||||
@@ -616,10 +616,10 @@ static noinline int bpf_jit_insn(struct bpf_jit *jit, struct bpf_prog *fp, int i
|
||||
EMIT4(0xb9090000, dst_reg, src_reg);
|
||||
break;
|
||||
case BPF_ALU | BPF_SUB | BPF_K: /* dst = (u32) dst - (u32) imm */
|
||||
- if (!imm)
|
||||
- break;
|
||||
- /* alfi %dst,-imm */
|
||||
- EMIT6_IMM(0xc20b0000, dst_reg, -imm);
|
||||
+ if (imm != 0) {
|
||||
+ /* alfi %dst,-imm */
|
||||
+ EMIT6_IMM(0xc20b0000, dst_reg, -imm);
|
||||
+ }
|
||||
EMIT_ZERO(dst_reg);
|
||||
break;
|
||||
case BPF_ALU64 | BPF_SUB | BPF_K: /* dst = dst - imm */
|
||||
@@ -646,10 +646,10 @@ static noinline int bpf_jit_insn(struct bpf_jit *jit, struct bpf_prog *fp, int i
|
||||
EMIT4(0xb90c0000, dst_reg, src_reg);
|
||||
break;
|
||||
case BPF_ALU | BPF_MUL | BPF_K: /* dst = (u32) dst * (u32) imm */
|
||||
- if (imm == 1)
|
||||
- break;
|
||||
- /* msfi %r5,imm */
|
||||
- EMIT6_IMM(0xc2010000, dst_reg, imm);
|
||||
+ if (imm != 1) {
|
||||
+ /* msfi %r5,imm */
|
||||
+ EMIT6_IMM(0xc2010000, dst_reg, imm);
|
||||
+ }
|
||||
EMIT_ZERO(dst_reg);
|
||||
break;
|
||||
case BPF_ALU64 | BPF_MUL | BPF_K: /* dst = dst * imm */
|
||||
@@ -710,6 +710,8 @@ static noinline int bpf_jit_insn(struct bpf_jit *jit, struct bpf_prog *fp, int i
|
||||
if (BPF_OP(insn->code) == BPF_MOD)
|
||||
/* lhgi %dst,0 */
|
||||
EMIT4_IMM(0xa7090000, dst_reg, 0);
|
||||
+ else
|
||||
+ EMIT_ZERO(dst_reg);
|
||||
break;
|
||||
}
|
||||
/* lhi %w0,0 */
|
||||
@@ -802,10 +804,10 @@ static noinline int bpf_jit_insn(struct bpf_jit *jit, struct bpf_prog *fp, int i
|
||||
EMIT4(0xb9820000, dst_reg, src_reg);
|
||||
break;
|
||||
case BPF_ALU | BPF_XOR | BPF_K: /* dst = (u32) dst ^ (u32) imm */
|
||||
- if (!imm)
|
||||
- break;
|
||||
- /* xilf %dst,imm */
|
||||
- EMIT6_IMM(0xc0070000, dst_reg, imm);
|
||||
+ if (imm != 0) {
|
||||
+ /* xilf %dst,imm */
|
||||
+ EMIT6_IMM(0xc0070000, dst_reg, imm);
|
||||
+ }
|
||||
EMIT_ZERO(dst_reg);
|
||||
break;
|
||||
case BPF_ALU64 | BPF_XOR | BPF_K: /* dst = dst ^ imm */
|
||||
@@ -826,10 +828,10 @@ static noinline int bpf_jit_insn(struct bpf_jit *jit, struct bpf_prog *fp, int i
|
||||
EMIT6_DISP_LH(0xeb000000, 0x000d, dst_reg, dst_reg, src_reg, 0);
|
||||
break;
|
||||
case BPF_ALU | BPF_LSH | BPF_K: /* dst = (u32) dst << (u32) imm */
|
||||
- if (imm == 0)
|
||||
- break;
|
||||
- /* sll %dst,imm(%r0) */
|
||||
- EMIT4_DISP(0x89000000, dst_reg, REG_0, imm);
|
||||
+ if (imm != 0) {
|
||||
+ /* sll %dst,imm(%r0) */
|
||||
+ EMIT4_DISP(0x89000000, dst_reg, REG_0, imm);
|
||||
+ }
|
||||
EMIT_ZERO(dst_reg);
|
||||
break;
|
||||
case BPF_ALU64 | BPF_LSH | BPF_K: /* dst = dst << imm */
|
||||
@@ -851,10 +853,10 @@ static noinline int bpf_jit_insn(struct bpf_jit *jit, struct bpf_prog *fp, int i
|
||||
EMIT6_DISP_LH(0xeb000000, 0x000c, dst_reg, dst_reg, src_reg, 0);
|
||||
break;
|
||||
case BPF_ALU | BPF_RSH | BPF_K: /* dst = (u32) dst >> (u32) imm */
|
||||
- if (imm == 0)
|
||||
- break;
|
||||
- /* srl %dst,imm(%r0) */
|
||||
- EMIT4_DISP(0x88000000, dst_reg, REG_0, imm);
|
||||
+ if (imm != 0) {
|
||||
+ /* srl %dst,imm(%r0) */
|
||||
+ EMIT4_DISP(0x88000000, dst_reg, REG_0, imm);
|
||||
+ }
|
||||
EMIT_ZERO(dst_reg);
|
||||
break;
|
||||
case BPF_ALU64 | BPF_RSH | BPF_K: /* dst = dst >> imm */
|
||||
diff --git a/block/blk-throttle.c b/block/blk-throttle.c
|
||||
index 3a4c9a3c1427f..6435dc25be0aa 100644
|
||||
--- a/block/blk-throttle.c
|
||||
+++ b/block/blk-throttle.c
|
||||
@@ -1584,6 +1584,7 @@ int blk_throtl_init(struct request_queue *q)
|
||||
void blk_throtl_exit(struct request_queue *q)
|
||||
{
|
||||
BUG_ON(!q->td);
|
||||
+ del_timer_sync(&q->td->service_queue.pending_timer);
|
||||
throtl_shutdown_wq(q);
|
||||
blkcg_deactivate_policy(q, &blkcg_policy_throtl);
|
||||
kfree(q->td);
|
||||
diff --git a/drivers/base/power/wakeirq.c b/drivers/base/power/wakeirq.c
|
||||
index ee63ccaea8d57..8c05e7a5e777b 100644
|
||||
--- a/drivers/base/power/wakeirq.c
|
||||
+++ b/drivers/base/power/wakeirq.c
|
||||
@@ -320,7 +320,8 @@ void dev_pm_arm_wake_irq(struct wake_irq *wirq)
|
||||
return;
|
||||
|
||||
if (device_may_wakeup(wirq->dev)) {
|
||||
- if (wirq->status & WAKE_IRQ_DEDICATED_ALLOCATED)
|
||||
+ if (wirq->status & WAKE_IRQ_DEDICATED_ALLOCATED &&
|
||||
+ !pm_runtime_status_suspended(wirq->dev))
|
||||
enable_irq(wirq->irq);
|
||||
|
||||
enable_irq_wake(wirq->irq);
|
||||
@@ -342,7 +343,8 @@ void dev_pm_disarm_wake_irq(struct wake_irq *wirq)
|
||||
if (device_may_wakeup(wirq->dev)) {
|
||||
disable_irq_wake(wirq->irq);
|
||||
|
||||
- if (wirq->status & WAKE_IRQ_DEDICATED_ALLOCATED)
|
||||
+ if (wirq->status & WAKE_IRQ_DEDICATED_ALLOCATED &&
|
||||
+ !pm_runtime_status_suspended(wirq->dev))
|
||||
disable_irq_nosync(wirq->irq);
|
||||
}
|
||||
}
|
||||
diff --git a/drivers/crypto/talitos.c b/drivers/crypto/talitos.c
|
||||
index 15eb1501915ca..ef9515e9f213f 100644
|
||||
--- a/drivers/crypto/talitos.c
|
||||
+++ b/drivers/crypto/talitos.c
|
||||
@@ -816,7 +816,7 @@ static void talitos_unregister_rng(struct device *dev)
|
||||
* HMAC_SNOOP_NO_AFEA (HSNA) instead of type IPSEC_ESP
|
||||
*/
|
||||
#define TALITOS_CRA_PRIORITY_AEAD_HSNA (TALITOS_CRA_PRIORITY - 1)
|
||||
-#ifdef CONFIG_CRYPTO_DEV_TALITOS_SEC2
|
||||
+#ifdef CONFIG_CRYPTO_DEV_TALITOS2
|
||||
#define TALITOS_MAX_KEY_SIZE (AES_MAX_KEY_SIZE + SHA512_BLOCK_SIZE)
|
||||
#else
|
||||
#define TALITOS_MAX_KEY_SIZE (AES_MAX_KEY_SIZE + SHA256_BLOCK_SIZE)
|
||||
diff --git a/drivers/dma/Kconfig b/drivers/dma/Kconfig
|
||||
index b0f798244a897..9a6da9b2dad35 100644
|
||||
--- a/drivers/dma/Kconfig
|
||||
+++ b/drivers/dma/Kconfig
|
||||
@@ -238,7 +238,7 @@ config INTEL_IDMA64
|
||||
|
||||
config INTEL_IOATDMA
|
||||
tristate "Intel I/OAT DMA support"
|
||||
- depends on PCI && X86_64
|
||||
+ depends on PCI && X86_64 && !UML
|
||||
select DMA_ENGINE
|
||||
select DMA_ENGINE_RAID
|
||||
select DCA
|
||||
diff --git a/drivers/dma/acpi-dma.c b/drivers/dma/acpi-dma.c
|
||||
index 4a748c3435d7d..02149742b334c 100644
|
||||
--- a/drivers/dma/acpi-dma.c
|
||||
+++ b/drivers/dma/acpi-dma.c
|
||||
@@ -72,10 +72,14 @@ static int acpi_dma_parse_resource_group(const struct acpi_csrt_group *grp,
|
||||
|
||||
si = (const struct acpi_csrt_shared_info *)&grp[1];
|
||||
|
||||
- /* Match device by MMIO and IRQ */
|
||||
+ /* Match device by MMIO */
|
||||
if (si->mmio_base_low != lower_32_bits(mem) ||
|
||||
- si->mmio_base_high != upper_32_bits(mem) ||
|
||||
- si->gsi_interrupt != irq)
|
||||
+ si->mmio_base_high != upper_32_bits(mem))
|
||||
+ return 0;
|
||||
+
|
||||
+ /* Match device by Linux vIRQ */
|
||||
+ ret = acpi_register_gsi(NULL, si->gsi_interrupt, si->interrupt_mode, si->interrupt_polarity);
|
||||
+ if (ret != irq)
|
||||
return 0;
|
||||
|
||||
dev_dbg(&adev->dev, "matches with %.4s%04X (rev %u)\n",
|
||||
diff --git a/drivers/dma/xilinx/xilinx_dma.c b/drivers/dma/xilinx/xilinx_dma.c
|
||||
index f00652585ee31..d88c53ff7bb69 100644
|
||||
--- a/drivers/dma/xilinx/xilinx_dma.c
|
||||
+++ b/drivers/dma/xilinx/xilinx_dma.c
|
||||
@@ -2578,7 +2578,7 @@ static int xilinx_dma_probe(struct platform_device *pdev)
|
||||
xdev->ext_addr = false;
|
||||
|
||||
/* Set the dma mask bits */
|
||||
- dma_set_mask(xdev->dev, DMA_BIT_MASK(addr_width));
|
||||
+ dma_set_mask_and_coherent(xdev->dev, DMA_BIT_MASK(addr_width));
|
||||
|
||||
/* Initialize the DMA engine */
|
||||
xdev->common.dev = &pdev->dev;
|
||||
diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/device/ctrl.c b/drivers/gpu/drm/nouveau/nvkm/engine/device/ctrl.c
|
||||
index b0ece71aefdee..ce774579c89d1 100644
|
||||
--- a/drivers/gpu/drm/nouveau/nvkm/engine/device/ctrl.c
|
||||
+++ b/drivers/gpu/drm/nouveau/nvkm/engine/device/ctrl.c
|
||||
@@ -57,7 +57,7 @@ nvkm_control_mthd_pstate_info(struct nvkm_control *ctrl, void *data, u32 size)
|
||||
args->v0.count = 0;
|
||||
args->v0.ustate_ac = NVIF_CONTROL_PSTATE_INFO_V0_USTATE_DISABLE;
|
||||
args->v0.ustate_dc = NVIF_CONTROL_PSTATE_INFO_V0_USTATE_DISABLE;
|
||||
- args->v0.pwrsrc = -ENOSYS;
|
||||
+ args->v0.pwrsrc = -ENODEV;
|
||||
args->v0.pstate = NVIF_CONTROL_PSTATE_INFO_V0_PSTATE_UNKNOWN;
|
||||
}
|
||||
|
||||
diff --git a/drivers/parisc/dino.c b/drivers/parisc/dino.c
|
||||
index d842ae5310f71..bbcff6ae61d66 100644
|
||||
--- a/drivers/parisc/dino.c
|
||||
+++ b/drivers/parisc/dino.c
|
||||
@@ -160,15 +160,6 @@ struct dino_device
|
||||
(struct dino_device *)__pdata; })
|
||||
|
||||
|
||||
-/* Check if PCI device is behind a Card-mode Dino. */
|
||||
-static int pci_dev_is_behind_card_dino(struct pci_dev *dev)
|
||||
-{
|
||||
- struct dino_device *dino_dev;
|
||||
-
|
||||
- dino_dev = DINO_DEV(parisc_walk_tree(dev->bus->bridge));
|
||||
- return is_card_dino(&dino_dev->hba.dev->id);
|
||||
-}
|
||||
-
|
||||
/*
|
||||
* Dino Configuration Space Accessor Functions
|
||||
*/
|
||||
@@ -452,6 +443,15 @@ static void quirk_cirrus_cardbus(struct pci_dev *dev)
|
||||
DECLARE_PCI_FIXUP_ENABLE(PCI_VENDOR_ID_CIRRUS, PCI_DEVICE_ID_CIRRUS_6832, quirk_cirrus_cardbus );
|
||||
|
||||
#ifdef CONFIG_TULIP
|
||||
+/* Check if PCI device is behind a Card-mode Dino. */
|
||||
+static int pci_dev_is_behind_card_dino(struct pci_dev *dev)
|
||||
+{
|
||||
+ struct dino_device *dino_dev;
|
||||
+
|
||||
+ dino_dev = DINO_DEV(parisc_walk_tree(dev->bus->bridge));
|
||||
+ return is_card_dino(&dino_dev->hba.dev->id);
|
||||
+}
|
||||
+
|
||||
static void pci_fixup_tulip(struct pci_dev *dev)
|
||||
{
|
||||
if (!pci_dev_is_behind_card_dino(dev))
|
||||
diff --git a/drivers/pwm/pwm-lpc32xx.c b/drivers/pwm/pwm-lpc32xx.c
|
||||
index a9b3cff96aaca..ed8e9406b4af2 100644
|
||||
--- a/drivers/pwm/pwm-lpc32xx.c
|
||||
+++ b/drivers/pwm/pwm-lpc32xx.c
|
||||
@@ -124,17 +124,17 @@ static int lpc32xx_pwm_probe(struct platform_device *pdev)
|
||||
lpc32xx->chip.npwm = 1;
|
||||
lpc32xx->chip.base = -1;
|
||||
|
||||
+ /* If PWM is disabled, configure the output to the default value */
|
||||
+ val = readl(lpc32xx->base + (lpc32xx->chip.pwms[0].hwpwm << 2));
|
||||
+ val &= ~PWM_PIN_LEVEL;
|
||||
+ writel(val, lpc32xx->base + (lpc32xx->chip.pwms[0].hwpwm << 2));
|
||||
+
|
||||
ret = pwmchip_add(&lpc32xx->chip);
|
||||
if (ret < 0) {
|
||||
dev_err(&pdev->dev, "failed to add PWM chip, error %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
- /* When PWM is disable, configure the output to the default value */
|
||||
- val = readl(lpc32xx->base + (lpc32xx->chip.pwms[0].hwpwm << 2));
|
||||
- val &= ~PWM_PIN_LEVEL;
|
||||
- writel(val, lpc32xx->base + (lpc32xx->chip.pwms[0].hwpwm << 2));
|
||||
-
|
||||
platform_set_drvdata(pdev, lpc32xx);
|
||||
|
||||
return 0;
|
||||
diff --git a/drivers/staging/android/ion/ion_system_heap.c b/drivers/staging/android/ion/ion_system_heap.c
|
||||
index 22c481f2ae4f1..2a35b99cf628e 100644
|
||||
--- a/drivers/staging/android/ion/ion_system_heap.c
|
||||
+++ b/drivers/staging/android/ion/ion_system_heap.c
|
||||
@@ -75,7 +75,7 @@ static struct page *alloc_buffer_page(struct ion_system_heap *heap,
|
||||
|
||||
page = ion_page_pool_alloc(pool);
|
||||
|
||||
- if (cached)
|
||||
+ if (page && cached)
|
||||
ion_pages_sync_for_device(NULL, page, PAGE_SIZE << order,
|
||||
DMA_BIDIRECTIONAL);
|
||||
return page;
|
||||
diff --git a/drivers/thermal/samsung/exynos_tmu.c b/drivers/thermal/samsung/exynos_tmu.c
|
||||
index c974cb5fb9580..02510c191c7db 100644
|
||||
--- a/drivers/thermal/samsung/exynos_tmu.c
|
||||
+++ b/drivers/thermal/samsung/exynos_tmu.c
|
||||
@@ -1372,6 +1372,7 @@ static int exynos_tmu_probe(struct platform_device *pdev)
|
||||
data->sclk = devm_clk_get(&pdev->dev, "tmu_sclk");
|
||||
if (IS_ERR(data->sclk)) {
|
||||
dev_err(&pdev->dev, "Failed to get sclk\n");
|
||||
+ ret = PTR_ERR(data->sclk);
|
||||
goto err_clk;
|
||||
} else {
|
||||
ret = clk_prepare_enable(data->sclk);
|
||||
diff --git a/fs/ceph/caps.c b/fs/ceph/caps.c
|
||||
index 0eb2ada032c74..839bccbcc9d65 100644
|
||||
--- a/fs/ceph/caps.c
|
||||
+++ b/fs/ceph/caps.c
|
||||
@@ -1572,6 +1572,8 @@ static int __mark_caps_flushing(struct inode *inode,
|
||||
* try to invalidate mapping pages without blocking.
|
||||
*/
|
||||
static int try_nonblocking_invalidate(struct inode *inode)
|
||||
+ __releases(ci->i_ceph_lock)
|
||||
+ __acquires(ci->i_ceph_lock)
|
||||
{
|
||||
struct ceph_inode_info *ci = ceph_inode(inode);
|
||||
u32 invalidating_gen = ci->i_rdcache_gen;
|
||||
diff --git a/fs/nilfs2/sysfs.c b/fs/nilfs2/sysfs.c
|
||||
index e9903bceb2bf1..33fba75aa9f38 100644
|
||||
--- a/fs/nilfs2/sysfs.c
|
||||
+++ b/fs/nilfs2/sysfs.c
|
||||
@@ -73,11 +73,9 @@ static const struct sysfs_ops nilfs_##name##_attr_ops = { \
|
||||
#define NILFS_DEV_INT_GROUP_TYPE(name, parent_name) \
|
||||
static void nilfs_##name##_attr_release(struct kobject *kobj) \
|
||||
{ \
|
||||
- struct nilfs_sysfs_##parent_name##_subgroups *subgroups; \
|
||||
- struct the_nilfs *nilfs = container_of(kobj->parent, \
|
||||
- struct the_nilfs, \
|
||||
- ns_##parent_name##_kobj); \
|
||||
- subgroups = nilfs->ns_##parent_name##_subgroups; \
|
||||
+ struct nilfs_sysfs_##parent_name##_subgroups *subgroups = container_of(kobj, \
|
||||
+ struct nilfs_sysfs_##parent_name##_subgroups, \
|
||||
+ sg_##name##_kobj); \
|
||||
complete(&subgroups->sg_##name##_kobj_unregister); \
|
||||
} \
|
||||
static struct kobj_type nilfs_##name##_ktype = { \
|
||||
@@ -103,12 +101,12 @@ static int nilfs_sysfs_create_##name##_group(struct the_nilfs *nilfs) \
|
||||
err = kobject_init_and_add(kobj, &nilfs_##name##_ktype, parent, \
|
||||
#name); \
|
||||
if (err) \
|
||||
- return err; \
|
||||
- return 0; \
|
||||
+ kobject_put(kobj); \
|
||||
+ return err; \
|
||||
} \
|
||||
static void nilfs_sysfs_delete_##name##_group(struct the_nilfs *nilfs) \
|
||||
{ \
|
||||
- kobject_del(&nilfs->ns_##parent_name##_subgroups->sg_##name##_kobj); \
|
||||
+ kobject_put(&nilfs->ns_##parent_name##_subgroups->sg_##name##_kobj); \
|
||||
}
|
||||
|
||||
/************************************************************************
|
||||
@@ -219,14 +217,14 @@ int nilfs_sysfs_create_snapshot_group(struct nilfs_root *root)
|
||||
}
|
||||
|
||||
if (err)
|
||||
- return err;
|
||||
+ kobject_put(&root->snapshot_kobj);
|
||||
|
||||
- return 0;
|
||||
+ return err;
|
||||
}
|
||||
|
||||
void nilfs_sysfs_delete_snapshot_group(struct nilfs_root *root)
|
||||
{
|
||||
- kobject_del(&root->snapshot_kobj);
|
||||
+ kobject_put(&root->snapshot_kobj);
|
||||
}
|
||||
|
||||
/************************************************************************
|
||||
@@ -1010,7 +1008,7 @@ int nilfs_sysfs_create_device_group(struct super_block *sb)
|
||||
err = kobject_init_and_add(&nilfs->ns_dev_kobj, &nilfs_dev_ktype, NULL,
|
||||
"%s", sb->s_id);
|
||||
if (err)
|
||||
- goto free_dev_subgroups;
|
||||
+ goto cleanup_dev_kobject;
|
||||
|
||||
err = nilfs_sysfs_create_mounted_snapshots_group(nilfs);
|
||||
if (err)
|
||||
@@ -1047,9 +1045,7 @@ delete_mounted_snapshots_group:
|
||||
nilfs_sysfs_delete_mounted_snapshots_group(nilfs);
|
||||
|
||||
cleanup_dev_kobject:
|
||||
- kobject_del(&nilfs->ns_dev_kobj);
|
||||
-
|
||||
-free_dev_subgroups:
|
||||
+ kobject_put(&nilfs->ns_dev_kobj);
|
||||
kfree(nilfs->ns_dev_subgroups);
|
||||
|
||||
failed_create_device_group:
|
||||
diff --git a/include/net/sctp/structs.h b/include/net/sctp/structs.h
|
||||
index b46133a41f55e..c0707e9bd9186 100644
|
||||
--- a/include/net/sctp/structs.h
|
||||
+++ b/include/net/sctp/structs.h
|
||||
@@ -470,7 +470,7 @@ struct sctp_af {
|
||||
int saddr);
|
||||
void (*from_sk) (union sctp_addr *,
|
||||
struct sock *sk);
|
||||
- void (*from_addr_param) (union sctp_addr *,
|
||||
+ bool (*from_addr_param) (union sctp_addr *,
|
||||
union sctp_addr_param *,
|
||||
__be16 port, int iif);
|
||||
int (*to_addr_param) (const union sctp_addr *,
|
||||
diff --git a/kernel/profile.c b/kernel/profile.c
|
||||
index 2dbccf2d806c6..9c78e3ab4b420 100644
|
||||
--- a/kernel/profile.c
|
||||
+++ b/kernel/profile.c
|
||||
@@ -38,7 +38,8 @@ struct profile_hit {
|
||||
#define NR_PROFILE_GRP (NR_PROFILE_HIT/PROFILE_GRPSZ)
|
||||
|
||||
static atomic_t *prof_buffer;
|
||||
-static unsigned long prof_len, prof_shift;
|
||||
+static unsigned long prof_len;
|
||||
+static unsigned short int prof_shift;
|
||||
|
||||
int prof_on __read_mostly;
|
||||
EXPORT_SYMBOL_GPL(prof_on);
|
||||
@@ -64,8 +65,8 @@ int profile_setup(char *str)
|
||||
if (str[strlen(sleepstr)] == ',')
|
||||
str += strlen(sleepstr) + 1;
|
||||
if (get_option(&str, &par))
|
||||
- prof_shift = par;
|
||||
- pr_info("kernel sleep profiling enabled (shift: %ld)\n",
|
||||
+ prof_shift = clamp(par, 0, BITS_PER_LONG - 1);
|
||||
+ pr_info("kernel sleep profiling enabled (shift: %u)\n",
|
||||
prof_shift);
|
||||
#else
|
||||
pr_warn("kernel sleep profiling requires CONFIG_SCHEDSTATS\n");
|
||||
@@ -75,21 +76,21 @@ int profile_setup(char *str)
|
||||
if (str[strlen(schedstr)] == ',')
|
||||
str += strlen(schedstr) + 1;
|
||||
if (get_option(&str, &par))
|
||||
- prof_shift = par;
|
||||
- pr_info("kernel schedule profiling enabled (shift: %ld)\n",
|
||||
+ prof_shift = clamp(par, 0, BITS_PER_LONG - 1);
|
||||
+ pr_info("kernel schedule profiling enabled (shift: %u)\n",
|
||||
prof_shift);
|
||||
} else if (!strncmp(str, kvmstr, strlen(kvmstr))) {
|
||||
prof_on = KVM_PROFILING;
|
||||
if (str[strlen(kvmstr)] == ',')
|
||||
str += strlen(kvmstr) + 1;
|
||||
if (get_option(&str, &par))
|
||||
- prof_shift = par;
|
||||
- pr_info("kernel KVM profiling enabled (shift: %ld)\n",
|
||||
+ prof_shift = clamp(par, 0, BITS_PER_LONG - 1);
|
||||
+ pr_info("kernel KVM profiling enabled (shift: %u)\n",
|
||||
prof_shift);
|
||||
} else if (get_option(&str, &par)) {
|
||||
- prof_shift = par;
|
||||
+ prof_shift = clamp(par, 0, BITS_PER_LONG - 1);
|
||||
prof_on = CPU_PROFILING;
|
||||
- pr_info("kernel profiling enabled (shift: %ld)\n",
|
||||
+ pr_info("kernel profiling enabled (shift: %u)\n",
|
||||
prof_shift);
|
||||
}
|
||||
return 1;
|
||||
@@ -465,7 +466,7 @@ read_profile(struct file *file, char __user *buf, size_t count, loff_t *ppos)
|
||||
unsigned long p = *ppos;
|
||||
ssize_t read;
|
||||
char *pnt;
|
||||
- unsigned int sample_step = 1 << prof_shift;
|
||||
+ unsigned long sample_step = 1UL << prof_shift;
|
||||
|
||||
profile_flip_buffers();
|
||||
if (p >= (prof_len+1)*sizeof(unsigned int))
|
||||
diff --git a/kernel/sys.c b/kernel/sys.c
|
||||
index 546cdc911dad4..2e1def48ed73b 100644
|
||||
--- a/kernel/sys.c
|
||||
+++ b/kernel/sys.c
|
||||
@@ -1774,13 +1774,6 @@ static int validate_prctl_map(struct prctl_mm_map *prctl_map)
|
||||
|
||||
error = -EINVAL;
|
||||
|
||||
- /*
|
||||
- * @brk should be after @end_data in traditional maps.
|
||||
- */
|
||||
- if (prctl_map->start_brk <= prctl_map->end_data ||
|
||||
- prctl_map->brk <= prctl_map->end_data)
|
||||
- goto out;
|
||||
-
|
||||
/*
|
||||
* Neither we should allow to override limits if they set.
|
||||
*/
|
||||
diff --git a/net/9p/trans_virtio.c b/net/9p/trans_virtio.c
|
||||
index f88911cffa1ad..c6a46e8e9eda5 100644
|
||||
--- a/net/9p/trans_virtio.c
|
||||
+++ b/net/9p/trans_virtio.c
|
||||
@@ -602,7 +602,7 @@ static int p9_virtio_probe(struct virtio_device *vdev)
|
||||
chan->vc_wq = kmalloc(sizeof(wait_queue_head_t), GFP_KERNEL);
|
||||
if (!chan->vc_wq) {
|
||||
err = -ENOMEM;
|
||||
- goto out_free_tag;
|
||||
+ goto out_remove_file;
|
||||
}
|
||||
init_waitqueue_head(chan->vc_wq);
|
||||
chan->ring_bufs_avail = 1;
|
||||
@@ -620,6 +620,8 @@ static int p9_virtio_probe(struct virtio_device *vdev)
|
||||
|
||||
return 0;
|
||||
|
||||
+out_remove_file:
|
||||
+ sysfs_remove_file(&vdev->dev.kobj, &dev_attr_mount_tag.attr);
|
||||
out_free_tag:
|
||||
kfree(tag);
|
||||
out_free_vq:
|
||||
diff --git a/net/sctp/bind_addr.c b/net/sctp/bind_addr.c
|
||||
index dc4335d817d80..dd9532c5c19dd 100644
|
||||
--- a/net/sctp/bind_addr.c
|
||||
+++ b/net/sctp/bind_addr.c
|
||||
@@ -285,20 +285,16 @@ int sctp_raw_to_bind_addrs(struct sctp_bind_addr *bp, __u8 *raw_addr_list,
|
||||
rawaddr = (union sctp_addr_param *)raw_addr_list;
|
||||
|
||||
af = sctp_get_af_specific(param_type2af(param->type));
|
||||
- if (unlikely(!af)) {
|
||||
+ if (unlikely(!af) ||
|
||||
+ !af->from_addr_param(&addr, rawaddr, htons(port), 0)) {
|
||||
retval = -EINVAL;
|
||||
- sctp_bind_addr_clean(bp);
|
||||
- break;
|
||||
+ goto out_err;
|
||||
}
|
||||
|
||||
- af->from_addr_param(&addr, rawaddr, htons(port), 0);
|
||||
retval = sctp_add_bind_addr(bp, &addr, sizeof(addr),
|
||||
SCTP_ADDR_SRC, gfp);
|
||||
- if (retval) {
|
||||
- /* Can't finish building the list, clean up. */
|
||||
- sctp_bind_addr_clean(bp);
|
||||
- break;
|
||||
- }
|
||||
+ if (retval)
|
||||
+ goto out_err;
|
||||
|
||||
len = ntohs(param->length);
|
||||
addrs_len -= len;
|
||||
@@ -306,6 +302,12 @@ int sctp_raw_to_bind_addrs(struct sctp_bind_addr *bp, __u8 *raw_addr_list,
|
||||
}
|
||||
|
||||
return retval;
|
||||
+
|
||||
+out_err:
|
||||
+ if (retval)
|
||||
+ sctp_bind_addr_clean(bp);
|
||||
+
|
||||
+ return retval;
|
||||
}
|
||||
|
||||
/********************************************************************
|
||||
diff --git a/net/sctp/input.c b/net/sctp/input.c
|
||||
index 8f4574c4aa6ca..9c1670b4a687d 100644
|
||||
--- a/net/sctp/input.c
|
||||
+++ b/net/sctp/input.c
|
||||
@@ -1051,7 +1051,8 @@ static struct sctp_association *__sctp_rcv_init_lookup(struct net *net,
|
||||
if (!af)
|
||||
continue;
|
||||
|
||||
- af->from_addr_param(paddr, params.addr, sh->source, 0);
|
||||
+ if (!af->from_addr_param(paddr, params.addr, sh->source, 0))
|
||||
+ continue;
|
||||
|
||||
asoc = __sctp_lookup_association(net, laddr, paddr, transportp);
|
||||
if (asoc)
|
||||
@@ -1087,6 +1088,9 @@ static struct sctp_association *__sctp_rcv_asconf_lookup(
|
||||
union sctp_addr_param *param;
|
||||
union sctp_addr paddr;
|
||||
|
||||
+ if (ntohs(ch->length) < sizeof(*asconf) + sizeof(struct sctp_paramhdr))
|
||||
+ return NULL;
|
||||
+
|
||||
/* Skip over the ADDIP header and find the Address parameter */
|
||||
param = (union sctp_addr_param *)(asconf + 1);
|
||||
|
||||
@@ -1094,7 +1098,8 @@ static struct sctp_association *__sctp_rcv_asconf_lookup(
|
||||
if (unlikely(!af))
|
||||
return NULL;
|
||||
|
||||
- af->from_addr_param(&paddr, param, peer_port, 0);
|
||||
+ if (af->from_addr_param(&paddr, param, peer_port, 0))
|
||||
+ return NULL;
|
||||
|
||||
return __sctp_lookup_association(net, laddr, &paddr, transportp);
|
||||
}
|
||||
diff --git a/net/sctp/ipv6.c b/net/sctp/ipv6.c
|
||||
index 50bc8c4ca9068..01337204d2b6f 100644
|
||||
--- a/net/sctp/ipv6.c
|
||||
+++ b/net/sctp/ipv6.c
|
||||
@@ -490,15 +490,20 @@ static void sctp_v6_to_sk_daddr(union sctp_addr *addr, struct sock *sk)
|
||||
}
|
||||
|
||||
/* Initialize a sctp_addr from an address parameter. */
|
||||
-static void sctp_v6_from_addr_param(union sctp_addr *addr,
|
||||
+static bool sctp_v6_from_addr_param(union sctp_addr *addr,
|
||||
union sctp_addr_param *param,
|
||||
__be16 port, int iif)
|
||||
{
|
||||
+ if (ntohs(param->v6.param_hdr.length) < sizeof(struct sctp_ipv6addr_param))
|
||||
+ return false;
|
||||
+
|
||||
addr->v6.sin6_family = AF_INET6;
|
||||
addr->v6.sin6_port = port;
|
||||
addr->v6.sin6_flowinfo = 0; /* BUG */
|
||||
addr->v6.sin6_addr = param->v6.addr;
|
||||
addr->v6.sin6_scope_id = iif;
|
||||
+
|
||||
+ return true;
|
||||
}
|
||||
|
||||
/* Initialize an address parameter from a sctp_addr and return the length
|
||||
diff --git a/net/sctp/protocol.c b/net/sctp/protocol.c
|
||||
index b1932fd125dad..02afbe5710083 100644
|
||||
--- a/net/sctp/protocol.c
|
||||
+++ b/net/sctp/protocol.c
|
||||
@@ -274,14 +274,19 @@ static void sctp_v4_to_sk_daddr(union sctp_addr *addr, struct sock *sk)
|
||||
}
|
||||
|
||||
/* Initialize a sctp_addr from an address parameter. */
|
||||
-static void sctp_v4_from_addr_param(union sctp_addr *addr,
|
||||
+static bool sctp_v4_from_addr_param(union sctp_addr *addr,
|
||||
union sctp_addr_param *param,
|
||||
__be16 port, int iif)
|
||||
{
|
||||
+ if (ntohs(param->v4.param_hdr.length) < sizeof(struct sctp_ipv4addr_param))
|
||||
+ return false;
|
||||
+
|
||||
addr->v4.sin_family = AF_INET;
|
||||
addr->v4.sin_port = port;
|
||||
addr->v4.sin_addr.s_addr = param->v4.addr.s_addr;
|
||||
memset(addr->v4.sin_zero, 0, sizeof(addr->v4.sin_zero));
|
||||
+
|
||||
+ return true;
|
||||
}
|
||||
|
||||
/* Initialize an address parameter from a sctp_addr and return the length
|
||||
diff --git a/net/sctp/sm_make_chunk.c b/net/sctp/sm_make_chunk.c
|
||||
index 0c5aff3bb5391..2e2802f047005 100644
|
||||
--- a/net/sctp/sm_make_chunk.c
|
||||
+++ b/net/sctp/sm_make_chunk.c
|
||||
@@ -2155,9 +2155,16 @@ static sctp_ierror_t sctp_verify_param(struct net *net,
|
||||
break;
|
||||
|
||||
case SCTP_PARAM_SET_PRIMARY:
|
||||
- if (net->sctp.addip_enable)
|
||||
- break;
|
||||
- goto fallthrough;
|
||||
+ if (!net->sctp.addip_enable)
|
||||
+ goto fallthrough;
|
||||
+
|
||||
+ if (ntohs(param.p->length) < sizeof(struct sctp_addip_param) +
|
||||
+ sizeof(struct sctp_paramhdr)) {
|
||||
+ sctp_process_inv_paramlength(asoc, param.p,
|
||||
+ chunk, err_chunk);
|
||||
+ retval = SCTP_IERROR_ABORT;
|
||||
+ }
|
||||
+ break;
|
||||
|
||||
case SCTP_PARAM_HOST_NAME_ADDRESS:
|
||||
/* Tell the peer, we won't support this param. */
|
||||
@@ -2335,11 +2342,13 @@ int sctp_process_init(struct sctp_association *asoc, struct sctp_chunk *chunk,
|
||||
|
||||
/* Process the initialization parameters. */
|
||||
sctp_walk_params(param, peer_init, init_hdr.params) {
|
||||
- if (!src_match && (param.p->type == SCTP_PARAM_IPV4_ADDRESS ||
|
||||
- param.p->type == SCTP_PARAM_IPV6_ADDRESS)) {
|
||||
+ if (!src_match &&
|
||||
+ (param.p->type == SCTP_PARAM_IPV4_ADDRESS ||
|
||||
+ param.p->type == SCTP_PARAM_IPV6_ADDRESS)) {
|
||||
af = sctp_get_af_specific(param_type2af(param.p->type));
|
||||
- af->from_addr_param(&addr, param.addr,
|
||||
- chunk->sctp_hdr->source, 0);
|
||||
+ if (!af->from_addr_param(&addr, param.addr,
|
||||
+ chunk->sctp_hdr->source, 0))
|
||||
+ continue;
|
||||
if (sctp_cmp_addr_exact(sctp_source(chunk), &addr))
|
||||
src_match = 1;
|
||||
}
|
||||
@@ -2533,7 +2542,8 @@ static int sctp_process_param(struct sctp_association *asoc,
|
||||
break;
|
||||
do_addr_param:
|
||||
af = sctp_get_af_specific(param_type2af(param.p->type));
|
||||
- af->from_addr_param(&addr, param.addr, htons(asoc->peer.port), 0);
|
||||
+ if (!af->from_addr_param(&addr, param.addr, htons(asoc->peer.port), 0))
|
||||
+ break;
|
||||
scope = sctp_scope(peer_addr);
|
||||
if (sctp_in_scope(net, &addr, scope))
|
||||
if (!sctp_assoc_add_peer(asoc, &addr, gfp, SCTP_UNCONFIRMED))
|
||||
@@ -2626,15 +2636,13 @@ do_addr_param:
|
||||
addr_param = param.v + sizeof(sctp_addip_param_t);
|
||||
|
||||
af = sctp_get_af_specific(param_type2af(addr_param->p.type));
|
||||
- if (af == NULL)
|
||||
+ if (!af)
|
||||
break;
|
||||
|
||||
- af->from_addr_param(&addr, addr_param,
|
||||
- htons(asoc->peer.port), 0);
|
||||
+ if (!af->from_addr_param(&addr, addr_param,
|
||||
+ htons(asoc->peer.port), 0))
|
||||
+ break;
|
||||
|
||||
- /* if the address is invalid, we can't process it.
|
||||
- * XXX: see spec for what to do.
|
||||
- */
|
||||
if (!af->addr_valid(&addr, NULL, NULL))
|
||||
break;
|
||||
|
||||
@@ -3046,7 +3054,8 @@ static __be16 sctp_process_asconf_param(struct sctp_association *asoc,
|
||||
if (unlikely(!af))
|
||||
return SCTP_ERROR_DNS_FAILED;
|
||||
|
||||
- af->from_addr_param(&addr, addr_param, htons(asoc->peer.port), 0);
|
||||
+ if (!af->from_addr_param(&addr, addr_param, htons(asoc->peer.port), 0))
|
||||
+ return SCTP_ERROR_DNS_FAILED;
|
||||
|
||||
/* ADDIP 4.2.1 This parameter MUST NOT contain a broadcast
|
||||
* or multicast address.
|
||||
@@ -3311,7 +3320,8 @@ static void sctp_asconf_param_success(struct sctp_association *asoc,
|
||||
|
||||
/* We have checked the packet before, so we do not check again. */
|
||||
af = sctp_get_af_specific(param_type2af(addr_param->p.type));
|
||||
- af->from_addr_param(&addr, addr_param, htons(bp->port), 0);
|
||||
+ if (!af->from_addr_param(&addr, addr_param, htons(bp->port), 0))
|
||||
+ return;
|
||||
|
||||
switch (asconf_param->param_hdr.type) {
|
||||
case SCTP_PARAM_ADD_IP:
|
||||
1809
patch/kernel/archive/sun50iw9-4.9/patch-4.9.284-285.patch
Normal file
1809
patch/kernel/archive/sun50iw9-4.9/patch-4.9.284-285.patch
Normal file
File diff suppressed because it is too large
Load Diff
364
patch/kernel/archive/sun50iw9-4.9/patch-4.9.285-286.patch
Normal file
364
patch/kernel/archive/sun50iw9-4.9/patch-4.9.285-286.patch
Normal file
@@ -0,0 +1,364 @@
|
||||
diff --git a/Makefile b/Makefile
|
||||
index 2ed953d8e0f2a..68f2c6f3869e2 100644
|
||||
--- a/Makefile
|
||||
+++ b/Makefile
|
||||
@@ -1,6 +1,6 @@
|
||||
VERSION = 4
|
||||
PATCHLEVEL = 9
|
||||
-SUBLEVEL = 285
|
||||
+SUBLEVEL = 286
|
||||
EXTRAVERSION =
|
||||
NAME = Roaring Lionus
|
||||
|
||||
diff --git a/arch/sparc/lib/iomap.c b/arch/sparc/lib/iomap.c
|
||||
index c4d42a50ebc06..fa4abbaf27de3 100644
|
||||
--- a/arch/sparc/lib/iomap.c
|
||||
+++ b/arch/sparc/lib/iomap.c
|
||||
@@ -18,8 +18,10 @@ void ioport_unmap(void __iomem *addr)
|
||||
EXPORT_SYMBOL(ioport_map);
|
||||
EXPORT_SYMBOL(ioport_unmap);
|
||||
|
||||
+#ifdef CONFIG_PCI
|
||||
void pci_iounmap(struct pci_dev *dev, void __iomem * addr)
|
||||
{
|
||||
/* nothing to do */
|
||||
}
|
||||
EXPORT_SYMBOL(pci_iounmap);
|
||||
+#endif
|
||||
diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c
|
||||
index adbf0486422b8..d3804b215ffa6 100644
|
||||
--- a/drivers/ata/libata-core.c
|
||||
+++ b/drivers/ata/libata-core.c
|
||||
@@ -2157,6 +2157,25 @@ static void ata_dev_config_ncq_non_data(struct ata_device *dev)
|
||||
}
|
||||
}
|
||||
|
||||
+static bool ata_dev_check_adapter(struct ata_device *dev,
|
||||
+ unsigned short vendor_id)
|
||||
+{
|
||||
+ struct pci_dev *pcidev = NULL;
|
||||
+ struct device *parent_dev = NULL;
|
||||
+
|
||||
+ for (parent_dev = dev->tdev.parent; parent_dev != NULL;
|
||||
+ parent_dev = parent_dev->parent) {
|
||||
+ if (dev_is_pci(parent_dev)) {
|
||||
+ pcidev = to_pci_dev(parent_dev);
|
||||
+ if (pcidev->vendor == vendor_id)
|
||||
+ return true;
|
||||
+ break;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ return false;
|
||||
+}
|
||||
+
|
||||
static int ata_dev_config_ncq(struct ata_device *dev,
|
||||
char *desc, size_t desc_sz)
|
||||
{
|
||||
@@ -2173,6 +2192,13 @@ static int ata_dev_config_ncq(struct ata_device *dev,
|
||||
snprintf(desc, desc_sz, "NCQ (not used)");
|
||||
return 0;
|
||||
}
|
||||
+
|
||||
+ if (dev->horkage & ATA_HORKAGE_NO_NCQ_ON_ATI &&
|
||||
+ ata_dev_check_adapter(dev, PCI_VENDOR_ID_ATI)) {
|
||||
+ snprintf(desc, desc_sz, "NCQ (not used)");
|
||||
+ return 0;
|
||||
+ }
|
||||
+
|
||||
if (ap->flags & ATA_FLAG_NCQ) {
|
||||
hdepth = min(ap->scsi_host->can_queue, ATA_MAX_QUEUE - 1);
|
||||
dev->flags |= ATA_DFLAG_NCQ;
|
||||
@@ -4448,9 +4474,11 @@ static const struct ata_blacklist_entry ata_device_blacklist [] = {
|
||||
{ "Samsung SSD 850*", NULL, ATA_HORKAGE_NO_NCQ_TRIM |
|
||||
ATA_HORKAGE_ZERO_AFTER_TRIM, },
|
||||
{ "Samsung SSD 860*", NULL, ATA_HORKAGE_NO_NCQ_TRIM |
|
||||
- ATA_HORKAGE_ZERO_AFTER_TRIM, },
|
||||
+ ATA_HORKAGE_ZERO_AFTER_TRIM |
|
||||
+ ATA_HORKAGE_NO_NCQ_ON_ATI, },
|
||||
{ "Samsung SSD 870*", NULL, ATA_HORKAGE_NO_NCQ_TRIM |
|
||||
- ATA_HORKAGE_ZERO_AFTER_TRIM, },
|
||||
+ ATA_HORKAGE_ZERO_AFTER_TRIM |
|
||||
+ ATA_HORKAGE_NO_NCQ_ON_ATI, },
|
||||
{ "FCCT*M500*", NULL, ATA_HORKAGE_NO_NCQ_TRIM |
|
||||
ATA_HORKAGE_ZERO_AFTER_TRIM, },
|
||||
|
||||
@@ -6734,6 +6762,8 @@ static int __init ata_parse_force_one(char **cur,
|
||||
{ "ncq", .horkage_off = ATA_HORKAGE_NONCQ },
|
||||
{ "noncqtrim", .horkage_on = ATA_HORKAGE_NO_NCQ_TRIM },
|
||||
{ "ncqtrim", .horkage_off = ATA_HORKAGE_NO_NCQ_TRIM },
|
||||
+ { "noncqati", .horkage_on = ATA_HORKAGE_NO_NCQ_ON_ATI },
|
||||
+ { "ncqati", .horkage_off = ATA_HORKAGE_NO_NCQ_ON_ATI },
|
||||
{ "dump_id", .horkage_on = ATA_HORKAGE_DUMP_ID },
|
||||
{ "pio0", .xfer_mask = 1 << (ATA_SHIFT_PIO + 0) },
|
||||
{ "pio1", .xfer_mask = 1 << (ATA_SHIFT_PIO + 1) },
|
||||
diff --git a/drivers/net/phy/mdio_device.c b/drivers/net/phy/mdio_device.c
|
||||
index 9c88e6749b9a4..34600b0061bb7 100644
|
||||
--- a/drivers/net/phy/mdio_device.c
|
||||
+++ b/drivers/net/phy/mdio_device.c
|
||||
@@ -135,6 +135,16 @@ static int mdio_remove(struct device *dev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
+static void mdio_shutdown(struct device *dev)
|
||||
+{
|
||||
+ struct mdio_device *mdiodev = to_mdio_device(dev);
|
||||
+ struct device_driver *drv = mdiodev->dev.driver;
|
||||
+ struct mdio_driver *mdiodrv = to_mdio_driver(drv);
|
||||
+
|
||||
+ if (mdiodrv->shutdown)
|
||||
+ mdiodrv->shutdown(mdiodev);
|
||||
+}
|
||||
+
|
||||
/**
|
||||
* mdio_driver_register - register an mdio_driver with the MDIO layer
|
||||
* @new_driver: new mdio_driver to register
|
||||
@@ -149,6 +159,7 @@ int mdio_driver_register(struct mdio_driver *drv)
|
||||
mdiodrv->driver.bus = &mdio_bus_type;
|
||||
mdiodrv->driver.probe = mdio_probe;
|
||||
mdiodrv->driver.remove = mdio_remove;
|
||||
+ mdiodrv->driver.shutdown = mdio_shutdown;
|
||||
|
||||
retval = driver_register(&mdiodrv->driver);
|
||||
if (retval) {
|
||||
diff --git a/drivers/net/xen-netback/netback.c b/drivers/net/xen-netback/netback.c
|
||||
index f7fd8b5a6a8cf..3016869b4afdc 100644
|
||||
--- a/drivers/net/xen-netback/netback.c
|
||||
+++ b/drivers/net/xen-netback/netback.c
|
||||
@@ -492,7 +492,7 @@ check_frags:
|
||||
* the header's copy failed, and they are
|
||||
* sharing a slot, send an error
|
||||
*/
|
||||
- if (i == 0 && sharedslot)
|
||||
+ if (i == 0 && !first_shinfo && sharedslot)
|
||||
xenvif_idx_release(queue, pending_idx,
|
||||
XEN_NETIF_RSP_ERROR);
|
||||
else
|
||||
diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c
|
||||
index 671bf1e03ee1f..426f1b3aa15e2 100644
|
||||
--- a/drivers/scsi/sd.c
|
||||
+++ b/drivers/scsi/sd.c
|
||||
@@ -3179,15 +3179,16 @@ static int sd_probe(struct device *dev)
|
||||
}
|
||||
|
||||
device_initialize(&sdkp->dev);
|
||||
- sdkp->dev.parent = dev;
|
||||
+ sdkp->dev.parent = get_device(dev);
|
||||
sdkp->dev.class = &sd_disk_class;
|
||||
dev_set_name(&sdkp->dev, "%s", dev_name(dev));
|
||||
|
||||
error = device_add(&sdkp->dev);
|
||||
- if (error)
|
||||
- goto out_free_index;
|
||||
+ if (error) {
|
||||
+ put_device(&sdkp->dev);
|
||||
+ goto out;
|
||||
+ }
|
||||
|
||||
- get_device(dev);
|
||||
dev_set_drvdata(dev, sdkp);
|
||||
|
||||
get_device(&sdkp->dev); /* prevent release before async_schedule */
|
||||
diff --git a/fs/ext2/balloc.c b/fs/ext2/balloc.c
|
||||
index 4c40c0786e168..bd32140bdfee5 100644
|
||||
--- a/fs/ext2/balloc.c
|
||||
+++ b/fs/ext2/balloc.c
|
||||
@@ -46,10 +46,9 @@ struct ext2_group_desc * ext2_get_group_desc(struct super_block * sb,
|
||||
struct ext2_sb_info *sbi = EXT2_SB(sb);
|
||||
|
||||
if (block_group >= sbi->s_groups_count) {
|
||||
- ext2_error (sb, "ext2_get_group_desc",
|
||||
- "block_group >= groups_count - "
|
||||
- "block_group = %d, groups_count = %lu",
|
||||
- block_group, sbi->s_groups_count);
|
||||
+ WARN(1, "block_group >= groups_count - "
|
||||
+ "block_group = %d, groups_count = %lu",
|
||||
+ block_group, sbi->s_groups_count);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
@@ -57,10 +56,9 @@ struct ext2_group_desc * ext2_get_group_desc(struct super_block * sb,
|
||||
group_desc = block_group >> EXT2_DESC_PER_BLOCK_BITS(sb);
|
||||
offset = block_group & (EXT2_DESC_PER_BLOCK(sb) - 1);
|
||||
if (!sbi->s_group_desc[group_desc]) {
|
||||
- ext2_error (sb, "ext2_get_group_desc",
|
||||
- "Group descriptor not loaded - "
|
||||
- "block_group = %d, group_desc = %lu, desc = %lu",
|
||||
- block_group, group_desc, offset);
|
||||
+ WARN(1, "Group descriptor not loaded - "
|
||||
+ "block_group = %d, group_desc = %lu, desc = %lu",
|
||||
+ block_group, group_desc, offset);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
diff --git a/include/linux/libata.h b/include/linux/libata.h
|
||||
index 3fabf57fd6e0d..de770d11a5c18 100644
|
||||
--- a/include/linux/libata.h
|
||||
+++ b/include/linux/libata.h
|
||||
@@ -436,6 +436,7 @@ enum {
|
||||
ATA_HORKAGE_NOTRIM = (1 << 24), /* don't use TRIM */
|
||||
ATA_HORKAGE_MAX_SEC_1024 = (1 << 25), /* Limit max sects to 1024 */
|
||||
ATA_HORKAGE_MAX_TRIM_128M = (1 << 26), /* Limit max trim size to 128M */
|
||||
+ ATA_HORKAGE_NO_NCQ_ON_ATI = (1 << 27), /* Disable NCQ on ATI chipset */
|
||||
|
||||
/* DMA mask for user DMA control: User visible values; DO NOT
|
||||
renumber */
|
||||
diff --git a/include/linux/mdio.h b/include/linux/mdio.h
|
||||
index bf9d1d7506935..78b3cf50566f5 100644
|
||||
--- a/include/linux/mdio.h
|
||||
+++ b/include/linux/mdio.h
|
||||
@@ -61,6 +61,9 @@ struct mdio_driver {
|
||||
|
||||
/* Clears up any memory if needed */
|
||||
void (*remove)(struct mdio_device *mdiodev);
|
||||
+
|
||||
+ /* Quiesces the device on system shutdown, turns off interrupts etc */
|
||||
+ void (*shutdown)(struct mdio_device *mdiodev);
|
||||
};
|
||||
#define to_mdio_driver(d) \
|
||||
container_of(to_mdio_common_driver(d), struct mdio_driver, mdiodrv)
|
||||
diff --git a/include/net/sock.h b/include/net/sock.h
|
||||
index cf27f3688c39c..78c292f15ffc1 100644
|
||||
--- a/include/net/sock.h
|
||||
+++ b/include/net/sock.h
|
||||
@@ -420,8 +420,9 @@ struct sock {
|
||||
__u32 sk_priority;
|
||||
__u32 sk_mark;
|
||||
kuid_t sk_uid;
|
||||
+ spinlock_t sk_peer_lock;
|
||||
struct pid *sk_peer_pid;
|
||||
const struct cred *sk_peer_cred;
|
||||
long sk_rcvtimeo;
|
||||
long sk_sndtimeo;
|
||||
struct timer_list sk_timer;
|
||||
diff --git a/net/core/sock.c b/net/core/sock.c
|
||||
index d468ffb5a31c6..1845a37d9f7e1 100644
|
||||
--- a/net/core/sock.c
|
||||
+++ b/net/core/sock.c
|
||||
@@ -1011,7 +1011,6 @@ set_rcvbuf:
|
||||
}
|
||||
EXPORT_SYMBOL(sock_setsockopt);
|
||||
|
||||
-
|
||||
static void cred_to_ucred(struct pid *pid, const struct cred *cred,
|
||||
struct ucred *ucred)
|
||||
{
|
||||
@@ -1171,7 +1170,11 @@ int sock_getsockopt(struct socket *sock, int level, int optname,
|
||||
struct ucred peercred;
|
||||
if (len > sizeof(peercred))
|
||||
len = sizeof(peercred);
|
||||
+
|
||||
+ spin_lock(&sk->sk_peer_lock);
|
||||
cred_to_ucred(sk->sk_peer_pid, sk->sk_peer_cred, &peercred);
|
||||
+ spin_unlock(&sk->sk_peer_lock);
|
||||
+
|
||||
if (copy_to_user(optval, &peercred, len))
|
||||
return -EFAULT;
|
||||
goto lenout;
|
||||
@@ -1439,9 +1442,10 @@ static void __sk_destruct(struct rcu_head *head)
|
||||
sk->sk_frag.page = NULL;
|
||||
}
|
||||
|
||||
- if (sk->sk_peer_cred)
|
||||
- put_cred(sk->sk_peer_cred);
|
||||
+ /* We do not need to acquire sk->sk_peer_lock, we are the last user. */
|
||||
+ put_cred(sk->sk_peer_cred);
|
||||
put_pid(sk->sk_peer_pid);
|
||||
+
|
||||
if (likely(sk->sk_net_refcnt))
|
||||
put_net(sock_net(sk));
|
||||
sk_prot_free(sk->sk_prot_creator, sk);
|
||||
@@ -2490,6 +2494,8 @@ void sock_init_data(struct socket *sock, struct sock *sk)
|
||||
|
||||
sk->sk_peer_pid = NULL;
|
||||
sk->sk_peer_cred = NULL;
|
||||
+ spin_lock_init(&sk->sk_peer_lock);
|
||||
+
|
||||
sk->sk_write_pending = 0;
|
||||
sk->sk_rcvlowat = 1;
|
||||
sk->sk_rcvtimeo = MAX_SCHEDULE_TIMEOUT;
|
||||
diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c
|
||||
index 2c643e1919aab..e7e012933714f 100644
|
||||
--- a/net/unix/af_unix.c
|
||||
+++ b/net/unix/af_unix.c
|
||||
@@ -594,20 +594,42 @@ static void unix_release_sock(struct sock *sk, int embrion)
|
||||
|
||||
static void init_peercred(struct sock *sk)
|
||||
{
|
||||
- put_pid(sk->sk_peer_pid);
|
||||
- if (sk->sk_peer_cred)
|
||||
- put_cred(sk->sk_peer_cred);
|
||||
+ const struct cred *old_cred;
|
||||
+ struct pid *old_pid;
|
||||
+
|
||||
+ spin_lock(&sk->sk_peer_lock);
|
||||
+ old_pid = sk->sk_peer_pid;
|
||||
+ old_cred = sk->sk_peer_cred;
|
||||
sk->sk_peer_pid = get_pid(task_tgid(current));
|
||||
sk->sk_peer_cred = get_current_cred();
|
||||
+ spin_unlock(&sk->sk_peer_lock);
|
||||
+
|
||||
+ put_pid(old_pid);
|
||||
+ put_cred(old_cred);
|
||||
}
|
||||
|
||||
static void copy_peercred(struct sock *sk, struct sock *peersk)
|
||||
{
|
||||
- put_pid(sk->sk_peer_pid);
|
||||
- if (sk->sk_peer_cred)
|
||||
- put_cred(sk->sk_peer_cred);
|
||||
+ const struct cred *old_cred;
|
||||
+ struct pid *old_pid;
|
||||
+
|
||||
+ if (sk < peersk) {
|
||||
+ spin_lock(&sk->sk_peer_lock);
|
||||
+ spin_lock_nested(&peersk->sk_peer_lock, SINGLE_DEPTH_NESTING);
|
||||
+ } else {
|
||||
+ spin_lock(&peersk->sk_peer_lock);
|
||||
+ spin_lock_nested(&sk->sk_peer_lock, SINGLE_DEPTH_NESTING);
|
||||
+ }
|
||||
+ old_pid = sk->sk_peer_pid;
|
||||
+ old_cred = sk->sk_peer_cred;
|
||||
sk->sk_peer_pid = get_pid(peersk->sk_peer_pid);
|
||||
sk->sk_peer_cred = get_cred(peersk->sk_peer_cred);
|
||||
+
|
||||
+ spin_unlock(&sk->sk_peer_lock);
|
||||
+ spin_unlock(&peersk->sk_peer_lock);
|
||||
+
|
||||
+ put_pid(old_pid);
|
||||
+ put_cred(old_cred);
|
||||
}
|
||||
|
||||
static int unix_listen(struct socket *sock, int backlog)
|
||||
diff --git a/tools/usb/testusb.c b/tools/usb/testusb.c
|
||||
index 0692d99b6d8f3..18c895654e767 100644
|
||||
--- a/tools/usb/testusb.c
|
||||
+++ b/tools/usb/testusb.c
|
||||
@@ -278,12 +278,6 @@ nomem:
|
||||
}
|
||||
|
||||
entry->ifnum = ifnum;
|
||||
-
|
||||
- /* FIXME update USBDEVFS_CONNECTINFO so it tells about high speed etc */
|
||||
-
|
||||
- fprintf(stderr, "%s speed\t%s\t%u\n",
|
||||
- speed(entry->speed), entry->name, entry->ifnum);
|
||||
-
|
||||
entry->next = testdevs;
|
||||
testdevs = entry;
|
||||
return 0;
|
||||
@@ -312,6 +306,14 @@ static void *handle_testdev (void *arg)
|
||||
return 0;
|
||||
}
|
||||
|
||||
+ status = ioctl(fd, USBDEVFS_GET_SPEED, NULL);
|
||||
+ if (status < 0)
|
||||
+ fprintf(stderr, "USBDEVFS_GET_SPEED failed %d\n", status);
|
||||
+ else
|
||||
+ dev->speed = status;
|
||||
+ fprintf(stderr, "%s speed\t%s\t%u\n",
|
||||
+ speed(dev->speed), dev->name, dev->ifnum);
|
||||
+
|
||||
restart:
|
||||
for (i = 0; i < TEST_CASES; i++) {
|
||||
if (dev->test != -1 && dev->test != i)
|
||||
Reference in New Issue
Block a user