This is the 4.9.166 stable release
-----BEGIN PGP SIGNATURE----- iQIzBAABCAAdFiEEZH8oZUiU471FcZm+ONu9yGCSaT4FAlybBmIACgkQONu9yGCS aT4ezBAAxtx4Yg4wQSzIrlMxtqorXqdZptiwqSmRgWrOGrwF0YrwKxCjst5bra1x plwflHn3+xcP4xIuxiyQOTsipvg5rAtr4peBa2WZqC4MaqRfeO32Uz3Hhh2TeWVJ EvB4acedWG78MB81DbA31mo8txbc8qoKEwKglvxaGraddNJBiIl3d0ySyxpKxM5I pYZYLdODWUesa+GFIkNzRbSNnZiDUXcI1Srt/TUZ9T4X8LsOXTWhNAEauKZwiDzq EJzzENbQrq1ULoaGbg/blgUDxrGiCWsltm5lirzsNaZGtdD1Ha2GCPt0XOftT6ks a0LfDj5pAYxBs6DCS1P1tyhg6qDzd7jVCH65RLiFbsYixcZPJs+3Dpsgs/QvkyAK 29aCBP/K3otS85+ZPP5t5uJwdADT4+bcYxG59BQGoTfZYsDgx8EjBi4jYp2XUbp2 vYt9ti/I7ZkFzcGur4BRlZ87OfMsIENbgyBcmzmbG0CTqVbJV8fnbhwRkWSbLEUp hcp/8T1tuhjWfHvEw4ofawRN44WsrdVelvcFKkDtfZwX9VMiuxM1xPM/MWeayY7s 3yrNkJIQn7CzIMamCKLA7QE8DzJ0ZnyQjh/CICTyTgjKfLNYYiloBkHDLGWUcQIS 9e9d2wtsPI7FoQpiirMsxgLYAIGR1bM9FoAJIc9Ntfk9MKspQ1A= =KTD5 -----END PGP SIGNATURE----- Merge 4.9.166 into android-4.9 Changes in 4.9.166 mmc: pxamci: fix enum type confusion drm/vmwgfx: Don't double-free the mode stored in par->set_mode iommu/amd: fix sg->dma_address for sg->offset bigger than PAGE_SIZE libceph: wait for latest osdmap in ceph_monc_blacklist_add() udf: Fix crash on IO error during truncate mips: loongson64: lemote-2f: Add IRQF_NO_SUSPEND to "cascade" irqaction. MIPS: Ensure ELF appended dtb is relocated MIPS: Fix kernel crash for R6 in jump label branch function futex: Ensure that futex address is aligned in handle_futex_death() objtool: Move objtool_file struct off the stack ext4: fix NULL pointer dereference while journal is aborted ext4: fix data corruption caused by unaligned direct AIO ext4: brelse all indirect buffer in ext4_ind_remove_space() media: v4l2-ctrls.c/uvc: zero v4l2_event Bluetooth: Fix decrementing reference count twice in releasing socket locking/lockdep: Add debug_locks check in __lock_downgrade() ALSA: hda - Record the current power state before suspend/resume calls ALSA: hda - Enforces runtime_resume after S3 and S4 for each codec tcp/dccp: drop SYN packets if accept queue is full serial: sprd: adjust TIMEOUT to a big value Hang/soft lockup in d_invalidate with simultaneous calls arm64: traps: disable irq in die() serial: sprd: clear timeout interrupt only rather than all interrupts lib/int_sqrt: optimize small argument USB: core: only clean up what we allocated scsi: ufs: fix wrong command type of UTRD for UFSHCI v2.1 rtc: Fix overflow when converting time64_t to rtc_time pwm-backlight: Enable/disable the PWM before/after LCD enable toggle. power: supply: charger-manager: Fix incorrect return value ath10k: avoid possible string overflow Linux 4.9.166 Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
This commit is contained in:
commit
0166b9e3ba
2
Makefile
2
Makefile
|
@ -1,6 +1,6 @@
|
|||
VERSION = 4
|
||||
PATCHLEVEL = 9
|
||||
SUBLEVEL = 165
|
||||
SUBLEVEL = 166
|
||||
EXTRAVERSION =
|
||||
NAME = Roaring Lionus
|
||||
|
||||
|
|
|
@ -272,10 +272,12 @@ static DEFINE_RAW_SPINLOCK(die_lock);
|
|||
void die(const char *str, struct pt_regs *regs, int err)
|
||||
{
|
||||
int ret;
|
||||
unsigned long flags;
|
||||
|
||||
raw_spin_lock_irqsave(&die_lock, flags);
|
||||
|
||||
oops_enter();
|
||||
|
||||
raw_spin_lock_irq(&die_lock);
|
||||
console_verbose();
|
||||
bust_spinlocks(1);
|
||||
ret = __die(str, err, regs);
|
||||
|
@ -285,13 +287,15 @@ void die(const char *str, struct pt_regs *regs, int err)
|
|||
|
||||
bust_spinlocks(0);
|
||||
add_taint(TAINT_DIE, LOCKDEP_NOW_UNRELIABLE);
|
||||
raw_spin_unlock_irq(&die_lock);
|
||||
oops_exit();
|
||||
|
||||
if (in_interrupt())
|
||||
panic("Fatal exception in interrupt");
|
||||
if (panic_on_oops)
|
||||
panic("Fatal exception");
|
||||
|
||||
raw_spin_unlock_irqrestore(&die_lock, flags);
|
||||
|
||||
if (ret != NOTIFY_STOP)
|
||||
do_exit(SIGSEGV);
|
||||
}
|
||||
|
|
|
@ -21,15 +21,15 @@
|
|||
#endif
|
||||
|
||||
#ifdef CONFIG_CPU_MICROMIPS
|
||||
#define NOP_INSN "nop32"
|
||||
#define B_INSN "b32"
|
||||
#else
|
||||
#define NOP_INSN "nop"
|
||||
#define B_INSN "b"
|
||||
#endif
|
||||
|
||||
static __always_inline bool arch_static_branch(struct static_key *key, bool branch)
|
||||
{
|
||||
asm_volatile_goto("1:\t" NOP_INSN "\n\t"
|
||||
"nop\n\t"
|
||||
asm_volatile_goto("1:\t" B_INSN " 2f\n\t"
|
||||
"2:\tnop\n\t"
|
||||
".pushsection __jump_table, \"aw\"\n\t"
|
||||
WORD_INSN " 1b, %l[l_yes], %0\n\t"
|
||||
".popsection\n\t"
|
||||
|
|
|
@ -138,6 +138,13 @@ SECTIONS
|
|||
PERCPU_SECTION(1 << CONFIG_MIPS_L1_CACHE_SHIFT)
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_MIPS_ELF_APPENDED_DTB
|
||||
.appended_dtb : AT(ADDR(.appended_dtb) - LOAD_OFFSET) {
|
||||
*(.appended_dtb)
|
||||
KEEP(*(.appended_dtb))
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_RELOCATABLE
|
||||
. = ALIGN(4);
|
||||
|
||||
|
@ -162,11 +169,6 @@ SECTIONS
|
|||
__appended_dtb = .;
|
||||
/* leave space for appended DTB */
|
||||
. += 0x100000;
|
||||
#elif defined(CONFIG_MIPS_ELF_APPENDED_DTB)
|
||||
.appended_dtb : AT(ADDR(.appended_dtb) - LOAD_OFFSET) {
|
||||
*(.appended_dtb)
|
||||
KEEP(*(.appended_dtb))
|
||||
}
|
||||
#endif
|
||||
/*
|
||||
* Align to 64K in attempt to eliminate holes before the
|
||||
|
|
|
@ -102,7 +102,7 @@ static struct irqaction ip6_irqaction = {
|
|||
static struct irqaction cascade_irqaction = {
|
||||
.handler = no_action,
|
||||
.name = "cascade",
|
||||
.flags = IRQF_NO_THREAD,
|
||||
.flags = IRQF_NO_THREAD | IRQF_NO_SUSPEND,
|
||||
};
|
||||
|
||||
void __init mach_init_irq(void)
|
||||
|
|
|
@ -531,11 +531,9 @@ static int vmw_fb_set_par(struct fb_info *info)
|
|||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC)
|
||||
};
|
||||
struct drm_display_mode *old_mode;
|
||||
struct drm_display_mode *mode;
|
||||
int ret;
|
||||
|
||||
old_mode = par->set_mode;
|
||||
mode = drm_mode_duplicate(vmw_priv->dev, &new_mode);
|
||||
if (!mode) {
|
||||
DRM_ERROR("Could not create new fb mode.\n");
|
||||
|
@ -546,11 +544,7 @@ static int vmw_fb_set_par(struct fb_info *info)
|
|||
mode->vdisplay = var->yres;
|
||||
vmw_guess_mode_timing(mode);
|
||||
|
||||
if (old_mode && drm_mode_equal(old_mode, mode)) {
|
||||
drm_mode_destroy(vmw_priv->dev, mode);
|
||||
mode = old_mode;
|
||||
old_mode = NULL;
|
||||
} else if (!vmw_kms_validate_mode_vram(vmw_priv,
|
||||
if (!vmw_kms_validate_mode_vram(vmw_priv,
|
||||
mode->hdisplay *
|
||||
DIV_ROUND_UP(var->bits_per_pixel, 8),
|
||||
mode->vdisplay)) {
|
||||
|
@ -613,8 +607,8 @@ static int vmw_fb_set_par(struct fb_info *info)
|
|||
schedule_delayed_work(&par->local_work, 0);
|
||||
|
||||
out_unlock:
|
||||
if (old_mode)
|
||||
drm_mode_destroy(vmw_priv->dev, old_mode);
|
||||
if (par->set_mode)
|
||||
drm_mode_destroy(vmw_priv->dev, par->set_mode);
|
||||
par->set_mode = mode;
|
||||
|
||||
drm_modeset_unlock_all(vmw_priv->dev);
|
||||
|
|
|
@ -2599,7 +2599,12 @@ static int map_sg(struct device *dev, struct scatterlist *sglist,
|
|||
|
||||
/* Everything is mapped - write the right values into s->dma_address */
|
||||
for_each_sg(sglist, s, nelems, i) {
|
||||
s->dma_address += address + s->offset;
|
||||
/*
|
||||
* Add in the remaining piece of the scatter-gather offset that
|
||||
* was masked out when we were determining the physical address
|
||||
* via (sg_phys(s) & PAGE_MASK) earlier.
|
||||
*/
|
||||
s->dma_address += address + (s->offset & ~PAGE_MASK);
|
||||
s->dma_length = s->length;
|
||||
}
|
||||
|
||||
|
|
|
@ -1203,7 +1203,7 @@ static void uvc_ctrl_fill_event(struct uvc_video_chain *chain,
|
|||
|
||||
__uvc_query_v4l2_ctrl(chain, ctrl, mapping, &v4l2_ctrl);
|
||||
|
||||
memset(ev->reserved, 0, sizeof(ev->reserved));
|
||||
memset(ev, 0, sizeof(*ev));
|
||||
ev->type = V4L2_EVENT_CTRL;
|
||||
ev->id = v4l2_ctrl.id;
|
||||
ev->u.ctrl.value = value;
|
||||
|
|
|
@ -1231,7 +1231,7 @@ static u32 user_flags(const struct v4l2_ctrl *ctrl)
|
|||
|
||||
static void fill_event(struct v4l2_event *ev, struct v4l2_ctrl *ctrl, u32 changes)
|
||||
{
|
||||
memset(ev->reserved, 0, sizeof(ev->reserved));
|
||||
memset(ev, 0, sizeof(*ev));
|
||||
ev->type = V4L2_EVENT_CTRL;
|
||||
ev->id = ctrl->id;
|
||||
ev->u.ctrl.changes = changes;
|
||||
|
|
|
@ -181,7 +181,7 @@ static void pxamci_dma_irq(void *param);
|
|||
static void pxamci_setup_data(struct pxamci_host *host, struct mmc_data *data)
|
||||
{
|
||||
struct dma_async_tx_descriptor *tx;
|
||||
enum dma_data_direction direction;
|
||||
enum dma_transfer_direction direction;
|
||||
struct dma_slave_config config;
|
||||
struct dma_chan *chan;
|
||||
unsigned int nob = data->blocks;
|
||||
|
|
|
@ -4277,7 +4277,7 @@ static void ath10k_tpc_config_disp_tables(struct ath10k *ar,
|
|||
rate_code[i],
|
||||
type);
|
||||
snprintf(buff, sizeof(buff), "%8d ", tpc[j]);
|
||||
strncat(tpc_value, buff, strlen(buff));
|
||||
strlcat(tpc_value, buff, sizeof(tpc_value));
|
||||
}
|
||||
tpc_stats->tpc_table[type].pream_idx[i] = pream_idx;
|
||||
tpc_stats->tpc_table[type].rate_code[i] = rate_code[i];
|
||||
|
|
|
@ -1212,7 +1212,6 @@ static int charger_extcon_init(struct charger_manager *cm,
|
|||
if (ret < 0) {
|
||||
pr_info("Cannot register extcon_dev for %s(cable: %s)\n",
|
||||
cable->extcon_name, cable->name);
|
||||
ret = -EINVAL;
|
||||
}
|
||||
|
||||
return ret;
|
||||
|
@ -1634,7 +1633,7 @@ static int charger_manager_probe(struct platform_device *pdev)
|
|||
|
||||
if (IS_ERR(desc)) {
|
||||
dev_err(&pdev->dev, "No platform data (desc) found\n");
|
||||
return -ENODEV;
|
||||
return PTR_ERR(desc);
|
||||
}
|
||||
|
||||
cm = devm_kzalloc(&pdev->dev,
|
||||
|
|
|
@ -52,13 +52,11 @@ EXPORT_SYMBOL(rtc_year_days);
|
|||
*/
|
||||
void rtc_time64_to_tm(time64_t time, struct rtc_time *tm)
|
||||
{
|
||||
unsigned int month, year;
|
||||
unsigned long secs;
|
||||
unsigned int month, year, secs;
|
||||
int days;
|
||||
|
||||
/* time must be positive */
|
||||
days = div_s64(time, 86400);
|
||||
secs = time - (unsigned int) days * 86400;
|
||||
days = div_s64_rem(time, 86400, &secs);
|
||||
|
||||
/* day of the week, 1970-01-01 was a Thursday */
|
||||
tm->tm_wday = (days + 4) % 7;
|
||||
|
|
|
@ -1349,10 +1349,11 @@ static int ufshcd_comp_devman_upiu(struct ufs_hba *hba, struct ufshcd_lrb *lrbp)
|
|||
u32 upiu_flags;
|
||||
int ret = 0;
|
||||
|
||||
if (hba->ufs_version == UFSHCI_VERSION_20)
|
||||
lrbp->command_type = UTP_CMD_TYPE_UFS_STORAGE;
|
||||
else
|
||||
if ((hba->ufs_version == UFSHCI_VERSION_10) ||
|
||||
(hba->ufs_version == UFSHCI_VERSION_11))
|
||||
lrbp->command_type = UTP_CMD_TYPE_DEV_MANAGE;
|
||||
else
|
||||
lrbp->command_type = UTP_CMD_TYPE_UFS_STORAGE;
|
||||
|
||||
ufshcd_prepare_req_desc_hdr(lrbp, &upiu_flags, DMA_NONE);
|
||||
if (hba->dev_cmd.type == DEV_CMD_TYPE_QUERY)
|
||||
|
@ -1376,10 +1377,11 @@ static int ufshcd_comp_scsi_upiu(struct ufs_hba *hba, struct ufshcd_lrb *lrbp)
|
|||
u32 upiu_flags;
|
||||
int ret = 0;
|
||||
|
||||
if (hba->ufs_version == UFSHCI_VERSION_20)
|
||||
lrbp->command_type = UTP_CMD_TYPE_UFS_STORAGE;
|
||||
else
|
||||
if ((hba->ufs_version == UFSHCI_VERSION_10) ||
|
||||
(hba->ufs_version == UFSHCI_VERSION_11))
|
||||
lrbp->command_type = UTP_CMD_TYPE_SCSI;
|
||||
else
|
||||
lrbp->command_type = UTP_CMD_TYPE_UFS_STORAGE;
|
||||
|
||||
if (likely(lrbp->cmd)) {
|
||||
ufshcd_prepare_req_desc_hdr(lrbp, &upiu_flags,
|
||||
|
|
|
@ -36,7 +36,7 @@
|
|||
#define SPRD_FIFO_SIZE 128
|
||||
#define SPRD_DEF_RATE 26000000
|
||||
#define SPRD_BAUD_IO_LIMIT 3000000
|
||||
#define SPRD_TIMEOUT 256
|
||||
#define SPRD_TIMEOUT 256000
|
||||
|
||||
/* the offset of serial registers and BITs for them */
|
||||
/* data registers */
|
||||
|
@ -63,6 +63,7 @@
|
|||
|
||||
/* interrupt clear register */
|
||||
#define SPRD_ICLR 0x0014
|
||||
#define SPRD_ICLR_TIMEOUT BIT(13)
|
||||
|
||||
/* line control register */
|
||||
#define SPRD_LCR 0x0018
|
||||
|
@ -298,7 +299,8 @@ static irqreturn_t sprd_handle_irq(int irq, void *dev_id)
|
|||
return IRQ_NONE;
|
||||
}
|
||||
|
||||
serial_out(port, SPRD_ICLR, ~0);
|
||||
if (ims & SPRD_IMSR_TIMEOUT)
|
||||
serial_out(port, SPRD_ICLR, SPRD_ICLR_TIMEOUT);
|
||||
|
||||
if (ims & (SPRD_IMSR_RX_FIFO_FULL |
|
||||
SPRD_IMSR_BREAK_DETECT | SPRD_IMSR_TIMEOUT))
|
||||
|
|
|
@ -763,18 +763,21 @@ void usb_destroy_configuration(struct usb_device *dev)
|
|||
return;
|
||||
|
||||
if (dev->rawdescriptors) {
|
||||
for (i = 0; i < dev->descriptor.bNumConfigurations; i++)
|
||||
for (i = 0; i < dev->descriptor.bNumConfigurations &&
|
||||
i < USB_MAXCONFIG; i++)
|
||||
kfree(dev->rawdescriptors[i]);
|
||||
|
||||
kfree(dev->rawdescriptors);
|
||||
dev->rawdescriptors = NULL;
|
||||
}
|
||||
|
||||
for (c = 0; c < dev->descriptor.bNumConfigurations; c++) {
|
||||
for (c = 0; c < dev->descriptor.bNumConfigurations &&
|
||||
c < USB_MAXCONFIG; c++) {
|
||||
struct usb_host_config *cf = &dev->config[c];
|
||||
|
||||
kfree(cf->string);
|
||||
for (i = 0; i < cf->desc.bNumInterfaces; i++) {
|
||||
for (i = 0; i < cf->desc.bNumInterfaces &&
|
||||
i < USB_MAXINTERFACES; i++) {
|
||||
if (cf->intf_cache[i])
|
||||
kref_put(&cf->intf_cache[i]->ref,
|
||||
usb_release_interface_cache);
|
||||
|
|
|
@ -54,10 +54,11 @@ static void pwm_backlight_power_on(struct pwm_bl_data *pb, int brightness)
|
|||
if (err < 0)
|
||||
dev_err(pb->dev, "failed to enable power supply\n");
|
||||
|
||||
pwm_enable(pb->pwm);
|
||||
|
||||
if (pb->enable_gpio)
|
||||
gpiod_set_value_cansleep(pb->enable_gpio, 1);
|
||||
|
||||
pwm_enable(pb->pwm);
|
||||
pb->enabled = true;
|
||||
}
|
||||
|
||||
|
@ -66,12 +67,12 @@ static void pwm_backlight_power_off(struct pwm_bl_data *pb)
|
|||
if (!pb->enabled)
|
||||
return;
|
||||
|
||||
pwm_config(pb->pwm, 0, pb->period);
|
||||
pwm_disable(pb->pwm);
|
||||
|
||||
if (pb->enable_gpio)
|
||||
gpiod_set_value_cansleep(pb->enable_gpio, 0);
|
||||
|
||||
pwm_config(pb->pwm, 0, pb->period);
|
||||
pwm_disable(pb->pwm);
|
||||
|
||||
regulator_disable(pb->power_supply);
|
||||
pb->enabled = false;
|
||||
}
|
||||
|
|
10
fs/dcache.c
10
fs/dcache.c
|
@ -1522,7 +1522,7 @@ static void check_and_drop(void *_data)
|
|||
{
|
||||
struct detach_data *data = _data;
|
||||
|
||||
if (!data->mountpoint && !data->select.found)
|
||||
if (!data->mountpoint && list_empty(&data->select.dispose))
|
||||
__d_drop(data->select.start);
|
||||
}
|
||||
|
||||
|
@ -1564,17 +1564,15 @@ void d_invalidate(struct dentry *dentry)
|
|||
|
||||
d_walk(dentry, &data, detach_and_collect, check_and_drop);
|
||||
|
||||
if (data.select.found)
|
||||
if (!list_empty(&data.select.dispose))
|
||||
shrink_dentry_list(&data.select.dispose);
|
||||
else if (!data.mountpoint)
|
||||
return;
|
||||
|
||||
if (data.mountpoint) {
|
||||
detach_mounts(data.mountpoint);
|
||||
dput(data.mountpoint);
|
||||
}
|
||||
|
||||
if (!data.mountpoint && !data.select.found)
|
||||
break;
|
||||
|
||||
cond_resched();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -391,7 +391,7 @@ static inline void ext4_update_inode_fsync_trans(handle_t *handle,
|
|||
{
|
||||
struct ext4_inode_info *ei = EXT4_I(inode);
|
||||
|
||||
if (ext4_handle_valid(handle)) {
|
||||
if (ext4_handle_valid(handle) && !is_handle_aborted(handle)) {
|
||||
ei->i_sync_tid = handle->h_transaction->t_tid;
|
||||
if (datasync)
|
||||
ei->i_datasync_tid = handle->h_transaction->t_tid;
|
||||
|
|
|
@ -79,7 +79,7 @@ ext4_unaligned_aio(struct inode *inode, struct iov_iter *from, loff_t pos)
|
|||
struct super_block *sb = inode->i_sb;
|
||||
int blockmask = sb->s_blocksize - 1;
|
||||
|
||||
if (pos >= i_size_read(inode))
|
||||
if (pos >= ALIGN(i_size_read(inode), sb->s_blocksize))
|
||||
return 0;
|
||||
|
||||
if ((pos | iov_iter_alignment(from)) & blockmask)
|
||||
|
|
|
@ -1385,10 +1385,14 @@ end_range:
|
|||
partial->p + 1,
|
||||
partial2->p,
|
||||
(chain+n-1) - partial);
|
||||
BUFFER_TRACE(partial->bh, "call brelse");
|
||||
brelse(partial->bh);
|
||||
BUFFER_TRACE(partial2->bh, "call brelse");
|
||||
brelse(partial2->bh);
|
||||
while (partial > chain) {
|
||||
BUFFER_TRACE(partial->bh, "call brelse");
|
||||
brelse(partial->bh);
|
||||
}
|
||||
while (partial2 > chain2) {
|
||||
BUFFER_TRACE(partial2->bh, "call brelse");
|
||||
brelse(partial2->bh);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -260,6 +260,9 @@ void udf_truncate_extents(struct inode *inode)
|
|||
epos.block = eloc;
|
||||
epos.bh = udf_tread(sb,
|
||||
udf_get_lb_pblock(sb, &eloc, 0));
|
||||
/* Error reading indirect block? */
|
||||
if (!epos.bh)
|
||||
return;
|
||||
if (elen)
|
||||
indirect_ext_len =
|
||||
(elen + sb->s_blocksize - 1) >>
|
||||
|
|
|
@ -276,6 +276,8 @@ extern void ceph_destroy_client(struct ceph_client *client);
|
|||
extern int __ceph_open_session(struct ceph_client *client,
|
||||
unsigned long started);
|
||||
extern int ceph_open_session(struct ceph_client *client);
|
||||
int ceph_wait_for_latest_osdmap(struct ceph_client *client,
|
||||
unsigned long timeout);
|
||||
|
||||
/* pagevec.c */
|
||||
extern void ceph_release_page_vector(struct page **pages, int num_pages);
|
||||
|
|
|
@ -289,11 +289,6 @@ static inline int inet_csk_reqsk_queue_len(const struct sock *sk)
|
|||
return reqsk_queue_len(&inet_csk(sk)->icsk_accept_queue);
|
||||
}
|
||||
|
||||
static inline int inet_csk_reqsk_queue_young(const struct sock *sk)
|
||||
{
|
||||
return reqsk_queue_len_young(&inet_csk(sk)->icsk_accept_queue);
|
||||
}
|
||||
|
||||
static inline int inet_csk_reqsk_queue_is_full(const struct sock *sk)
|
||||
{
|
||||
return inet_csk_reqsk_queue_len(sk) >= sk->sk_max_ack_backlog;
|
||||
|
|
|
@ -3110,6 +3110,10 @@ int handle_futex_death(u32 __user *uaddr, struct task_struct *curr, int pi)
|
|||
{
|
||||
u32 uval, uninitialized_var(nval), mval;
|
||||
|
||||
/* Futex address must be 32bit aligned */
|
||||
if ((((unsigned long)uaddr) % sizeof(*uaddr)) != 0)
|
||||
return -1;
|
||||
|
||||
retry:
|
||||
if (get_user(uval, uaddr))
|
||||
return -1;
|
||||
|
|
|
@ -3446,6 +3446,9 @@ __lock_set_class(struct lockdep_map *lock, const char *name,
|
|||
unsigned int depth;
|
||||
int i;
|
||||
|
||||
if (unlikely(!debug_locks))
|
||||
return 0;
|
||||
|
||||
depth = curr->lockdep_depth;
|
||||
/*
|
||||
* This function is about (re)setting the class of a held lock,
|
||||
|
|
|
@ -22,6 +22,9 @@ unsigned long int_sqrt(unsigned long x)
|
|||
return x;
|
||||
|
||||
m = 1UL << (BITS_PER_LONG - 2);
|
||||
while (m > x)
|
||||
m >>= 2;
|
||||
|
||||
while (m != 0) {
|
||||
b = y + m;
|
||||
y >>= 1;
|
||||
|
|
|
@ -826,8 +826,6 @@ static int hci_sock_release(struct socket *sock)
|
|||
if (!sk)
|
||||
return 0;
|
||||
|
||||
hdev = hci_pi(sk)->hdev;
|
||||
|
||||
switch (hci_pi(sk)->channel) {
|
||||
case HCI_CHANNEL_MONITOR:
|
||||
atomic_dec(&monitor_promisc);
|
||||
|
@ -849,6 +847,7 @@ static int hci_sock_release(struct socket *sock)
|
|||
|
||||
bt_sock_unlink(&hci_sk_list, sk);
|
||||
|
||||
hdev = hci_pi(sk)->hdev;
|
||||
if (hdev) {
|
||||
if (hci_pi(sk)->channel == HCI_CHANNEL_USER) {
|
||||
/* When releasing an user channel exclusive access,
|
||||
|
|
|
@ -699,7 +699,6 @@ int __ceph_open_session(struct ceph_client *client, unsigned long started)
|
|||
}
|
||||
EXPORT_SYMBOL(__ceph_open_session);
|
||||
|
||||
|
||||
int ceph_open_session(struct ceph_client *client)
|
||||
{
|
||||
int ret;
|
||||
|
@ -715,6 +714,23 @@ int ceph_open_session(struct ceph_client *client)
|
|||
}
|
||||
EXPORT_SYMBOL(ceph_open_session);
|
||||
|
||||
int ceph_wait_for_latest_osdmap(struct ceph_client *client,
|
||||
unsigned long timeout)
|
||||
{
|
||||
u64 newest_epoch;
|
||||
int ret;
|
||||
|
||||
ret = ceph_monc_get_version(&client->monc, "osdmap", &newest_epoch);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (client->osdc.osdmap->epoch >= newest_epoch)
|
||||
return 0;
|
||||
|
||||
ceph_osdc_maybe_request_map(&client->osdc);
|
||||
return ceph_monc_wait_osdmap(&client->monc, newest_epoch, timeout);
|
||||
}
|
||||
EXPORT_SYMBOL(ceph_wait_for_latest_osdmap);
|
||||
|
||||
static int __init init_ceph_lib(void)
|
||||
{
|
||||
|
|
|
@ -914,6 +914,15 @@ int ceph_monc_blacklist_add(struct ceph_mon_client *monc,
|
|||
mutex_unlock(&monc->mutex);
|
||||
|
||||
ret = wait_generic_request(req);
|
||||
if (!ret)
|
||||
/*
|
||||
* Make sure we have the osdmap that includes the blacklist
|
||||
* entry. This is needed to ensure that the OSDs pick up the
|
||||
* new blacklist before processing any future requests from
|
||||
* this client.
|
||||
*/
|
||||
ret = ceph_wait_for_latest_osdmap(monc->client, 0);
|
||||
|
||||
out:
|
||||
put_generic_request(req);
|
||||
return ret;
|
||||
|
|
|
@ -596,13 +596,7 @@ int dccp_v4_conn_request(struct sock *sk, struct sk_buff *skb)
|
|||
if (inet_csk_reqsk_queue_is_full(sk))
|
||||
goto drop;
|
||||
|
||||
/*
|
||||
* Accept backlog is full. If we have already queued enough
|
||||
* of warm entries in syn queue, drop request. It is better than
|
||||
* clogging syn queue with openreqs with exponentially increasing
|
||||
* timeout.
|
||||
*/
|
||||
if (sk_acceptq_is_full(sk) && inet_csk_reqsk_queue_young(sk) > 1)
|
||||
if (sk_acceptq_is_full(sk))
|
||||
goto drop;
|
||||
|
||||
req = inet_reqsk_alloc(&dccp_request_sock_ops, sk, true);
|
||||
|
|
|
@ -328,7 +328,7 @@ static int dccp_v6_conn_request(struct sock *sk, struct sk_buff *skb)
|
|||
if (inet_csk_reqsk_queue_is_full(sk))
|
||||
goto drop;
|
||||
|
||||
if (sk_acceptq_is_full(sk) && inet_csk_reqsk_queue_young(sk) > 1)
|
||||
if (sk_acceptq_is_full(sk))
|
||||
goto drop;
|
||||
|
||||
req = inet_reqsk_alloc(&dccp6_request_sock_ops, sk, true);
|
||||
|
|
|
@ -6375,13 +6375,7 @@ int tcp_conn_request(struct request_sock_ops *rsk_ops,
|
|||
goto drop;
|
||||
}
|
||||
|
||||
|
||||
/* Accept backlog is full. If we have already queued enough
|
||||
* of warm entries in syn queue, drop request. It is better than
|
||||
* clogging syn queue with openreqs with exponentially increasing
|
||||
* timeout.
|
||||
*/
|
||||
if (sk_acceptq_is_full(sk) && inet_csk_reqsk_queue_young(sk) > 1) {
|
||||
if (sk_acceptq_is_full(sk)) {
|
||||
NET_INC_STATS(sock_net(sk), LINUX_MIB_LISTENOVERFLOWS);
|
||||
goto drop;
|
||||
}
|
||||
|
|
|
@ -3004,6 +3004,7 @@ static void hda_call_codec_resume(struct hda_codec *codec)
|
|||
hda_jackpoll_work(&codec->jackpoll_work.work);
|
||||
else
|
||||
snd_hda_jack_report_sync(codec);
|
||||
codec->core.dev.power.power_state = PMSG_ON;
|
||||
atomic_dec(&codec->core.in_pm);
|
||||
}
|
||||
|
||||
|
@ -3036,10 +3037,62 @@ static int hda_codec_runtime_resume(struct device *dev)
|
|||
}
|
||||
#endif /* CONFIG_PM */
|
||||
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
static int hda_codec_force_resume(struct device *dev)
|
||||
{
|
||||
int ret;
|
||||
|
||||
/* The get/put pair below enforces the runtime resume even if the
|
||||
* device hasn't been used at suspend time. This trick is needed to
|
||||
* update the jack state change during the sleep.
|
||||
*/
|
||||
pm_runtime_get_noresume(dev);
|
||||
ret = pm_runtime_force_resume(dev);
|
||||
pm_runtime_put(dev);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int hda_codec_pm_suspend(struct device *dev)
|
||||
{
|
||||
dev->power.power_state = PMSG_SUSPEND;
|
||||
return pm_runtime_force_suspend(dev);
|
||||
}
|
||||
|
||||
static int hda_codec_pm_resume(struct device *dev)
|
||||
{
|
||||
dev->power.power_state = PMSG_RESUME;
|
||||
return hda_codec_force_resume(dev);
|
||||
}
|
||||
|
||||
static int hda_codec_pm_freeze(struct device *dev)
|
||||
{
|
||||
dev->power.power_state = PMSG_FREEZE;
|
||||
return pm_runtime_force_suspend(dev);
|
||||
}
|
||||
|
||||
static int hda_codec_pm_thaw(struct device *dev)
|
||||
{
|
||||
dev->power.power_state = PMSG_THAW;
|
||||
return hda_codec_force_resume(dev);
|
||||
}
|
||||
|
||||
static int hda_codec_pm_restore(struct device *dev)
|
||||
{
|
||||
dev->power.power_state = PMSG_RESTORE;
|
||||
return hda_codec_force_resume(dev);
|
||||
}
|
||||
#endif /* CONFIG_PM_SLEEP */
|
||||
|
||||
/* referred in hda_bind.c */
|
||||
const struct dev_pm_ops hda_codec_driver_pm = {
|
||||
SET_SYSTEM_SLEEP_PM_OPS(pm_runtime_force_suspend,
|
||||
pm_runtime_force_resume)
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
.suspend = hda_codec_pm_suspend,
|
||||
.resume = hda_codec_pm_resume,
|
||||
.freeze = hda_codec_pm_freeze,
|
||||
.thaw = hda_codec_pm_thaw,
|
||||
.poweroff = hda_codec_pm_suspend,
|
||||
.restore = hda_codec_pm_restore,
|
||||
#endif /* CONFIG_PM_SLEEP */
|
||||
SET_RUNTIME_PM_OPS(hda_codec_runtime_suspend, hda_codec_runtime_resume,
|
||||
NULL)
|
||||
};
|
||||
|
|
|
@ -2132,9 +2132,10 @@ static void cleanup(struct objtool_file *file)
|
|||
elf_close(file->elf);
|
||||
}
|
||||
|
||||
static struct objtool_file file;
|
||||
|
||||
int check(const char *_objname, bool orc)
|
||||
{
|
||||
struct objtool_file file;
|
||||
int ret, warnings = 0;
|
||||
|
||||
objname = _objname;
|
||||
|
|
Loading…
Reference in New Issue