Magellan Linux

Annotation of /trunk/kernel-alx/patches-4.4/0148-4.4.49-all-fixes.patch

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2884 - (hide annotations) (download)
Mon Mar 27 13:49:22 2017 UTC (7 years, 2 months ago) by niro
File size: 17541 byte(s)
linux-4.4.49
1 niro 2884 diff --git a/Makefile b/Makefile
2     index 0793cd412656..5fab6d4068b5 100644
3     --- a/Makefile
4     +++ b/Makefile
5     @@ -1,6 +1,6 @@
6     VERSION = 4
7     PATCHLEVEL = 4
8     -SUBLEVEL = 48
9     +SUBLEVEL = 49
10     EXTRAVERSION =
11     NAME = Blurry Fish Butt
12    
13     diff --git a/arch/arc/kernel/unaligned.c b/arch/arc/kernel/unaligned.c
14     index 91ebe382147f..5f69c3bd59bb 100644
15     --- a/arch/arc/kernel/unaligned.c
16     +++ b/arch/arc/kernel/unaligned.c
17     @@ -243,7 +243,7 @@ int misaligned_fixup(unsigned long address, struct pt_regs *regs,
18    
19     /* clear any remanants of delay slot */
20     if (delay_mode(regs)) {
21     - regs->ret = regs->bta ~1U;
22     + regs->ret = regs->bta & ~1U;
23     regs->status32 &= ~STATUS_DE_MASK;
24     } else {
25     regs->ret += state.instr_len;
26     diff --git a/arch/arm/kernel/ptrace.c b/arch/arm/kernel/ptrace.c
27     index 4d9375814b53..d54c53b7ab63 100644
28     --- a/arch/arm/kernel/ptrace.c
29     +++ b/arch/arm/kernel/ptrace.c
30     @@ -600,7 +600,7 @@ static int gpr_set(struct task_struct *target,
31     const void *kbuf, const void __user *ubuf)
32     {
33     int ret;
34     - struct pt_regs newregs;
35     + struct pt_regs newregs = *task_pt_regs(target);
36    
37     ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf,
38     &newregs,
39     diff --git a/arch/arm/mm/fault.c b/arch/arm/mm/fault.c
40     index daafcf121ce0..c095455d496e 100644
41     --- a/arch/arm/mm/fault.c
42     +++ b/arch/arm/mm/fault.c
43     @@ -610,9 +610,9 @@ static int __init early_abort_handler(unsigned long addr, unsigned int fsr,
44    
45     void __init early_abt_enable(void)
46     {
47     - fsr_info[22].fn = early_abort_handler;
48     + fsr_info[FSR_FS_AEA].fn = early_abort_handler;
49     local_abt_enable();
50     - fsr_info[22].fn = do_bad;
51     + fsr_info[FSR_FS_AEA].fn = do_bad;
52     }
53    
54     #ifndef CONFIG_ARM_LPAE
55     diff --git a/arch/arm/mm/fault.h b/arch/arm/mm/fault.h
56     index 05ec5e0df32d..78830657cab3 100644
57     --- a/arch/arm/mm/fault.h
58     +++ b/arch/arm/mm/fault.h
59     @@ -11,11 +11,15 @@
60     #define FSR_FS5_0 (0x3f)
61    
62     #ifdef CONFIG_ARM_LPAE
63     +#define FSR_FS_AEA 17
64     +
65     static inline int fsr_fs(unsigned int fsr)
66     {
67     return fsr & FSR_FS5_0;
68     }
69     #else
70     +#define FSR_FS_AEA 22
71     +
72     static inline int fsr_fs(unsigned int fsr)
73     {
74     return (fsr & FSR_FS3_0) | (fsr & FSR_FS4) >> 6;
75     diff --git a/arch/x86/kernel/apic/io_apic.c b/arch/x86/kernel/apic/io_apic.c
76     index 1e5d2f07416b..8ca533b8c606 100644
77     --- a/arch/x86/kernel/apic/io_apic.c
78     +++ b/arch/x86/kernel/apic/io_apic.c
79     @@ -1875,7 +1875,6 @@ static struct irq_chip ioapic_chip __read_mostly = {
80     .irq_ack = irq_chip_ack_parent,
81     .irq_eoi = ioapic_ack_level,
82     .irq_set_affinity = ioapic_set_affinity,
83     - .irq_retrigger = irq_chip_retrigger_hierarchy,
84     .flags = IRQCHIP_SKIP_SET_WAKE,
85     };
86    
87     @@ -1887,7 +1886,6 @@ static struct irq_chip ioapic_ir_chip __read_mostly = {
88     .irq_ack = irq_chip_ack_parent,
89     .irq_eoi = ioapic_ir_ack_level,
90     .irq_set_affinity = ioapic_set_affinity,
91     - .irq_retrigger = irq_chip_retrigger_hierarchy,
92     .flags = IRQCHIP_SKIP_SET_WAKE,
93     };
94    
95     diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
96     index 909d1d71d130..4f5d07bb3511 100644
97     --- a/drivers/gpu/drm/i915/intel_display.c
98     +++ b/drivers/gpu/drm/i915/intel_display.c
99     @@ -3948,10 +3948,10 @@ static void page_flip_completed(struct intel_crtc *intel_crtc)
100     drm_crtc_vblank_put(&intel_crtc->base);
101    
102     wake_up_all(&dev_priv->pending_flip_queue);
103     - queue_work(dev_priv->wq, &work->work);
104     -
105     trace_i915_flip_complete(intel_crtc->plane,
106     work->pending_flip_obj);
107     +
108     + queue_work(dev_priv->wq, &work->work);
109     }
110    
111     void intel_crtc_wait_for_pending_flips(struct drm_crtc *crtc)
112     diff --git a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_reg.h b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_reg.h
113     index bdbd80423b17..9ff2881f933d 100644
114     --- a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_reg.h
115     +++ b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_reg.h
116     @@ -900,9 +900,7 @@
117    
118     static inline void dsaf_write_reg(void __iomem *base, u32 reg, u32 value)
119     {
120     - u8 __iomem *reg_addr = ACCESS_ONCE(base);
121     -
122     - writel(value, reg_addr + reg);
123     + writel(value, base + reg);
124     }
125    
126     #define dsaf_write_dev(a, reg, value) \
127     @@ -910,9 +908,7 @@ static inline void dsaf_write_reg(void __iomem *base, u32 reg, u32 value)
128    
129     static inline u32 dsaf_read_reg(u8 __iomem *base, u32 reg)
130     {
131     - u8 __iomem *reg_addr = ACCESS_ONCE(base);
132     -
133     - return readl(reg_addr + reg);
134     + return readl(base + reg);
135     }
136    
137     #define dsaf_read_dev(a, reg) \
138     diff --git a/drivers/net/hyperv/netvsc_drv.c b/drivers/net/hyperv/netvsc_drv.c
139     index 7a601d8c615e..e8a09ff9e724 100644
140     --- a/drivers/net/hyperv/netvsc_drv.c
141     +++ b/drivers/net/hyperv/netvsc_drv.c
142     @@ -854,7 +854,6 @@ static int netvsc_set_channels(struct net_device *net,
143     }
144     goto recover;
145     }
146     - netif_set_gso_max_size(net, NETVSC_GSO_MAX_SIZE);
147    
148     out:
149     netvsc_open(net);
150     @@ -1142,6 +1141,7 @@ static int netvsc_probe(struct hv_device *dev,
151     nvdev = hv_get_drvdata(dev);
152     netif_set_real_num_tx_queues(net, nvdev->num_chn);
153     netif_set_real_num_rx_queues(net, nvdev->num_chn);
154     + netif_set_gso_max_size(net, NETVSC_GSO_MAX_SIZE);
155    
156     ret = register_netdev(net);
157     if (ret != 0) {
158     diff --git a/drivers/net/xen-netfront.c b/drivers/net/xen-netfront.c
159     index d6abf191122a..1f445f357da1 100644
160     --- a/drivers/net/xen-netfront.c
161     +++ b/drivers/net/xen-netfront.c
162     @@ -1391,6 +1391,8 @@ static void xennet_disconnect_backend(struct netfront_info *info)
163     for (i = 0; i < num_queues && info->queues; ++i) {
164     struct netfront_queue *queue = &info->queues[i];
165    
166     + del_timer_sync(&queue->rx_refill_timer);
167     +
168     if (queue->tx_irq && (queue->tx_irq == queue->rx_irq))
169     unbind_from_irqhandler(queue->tx_irq, queue);
170     if (queue->tx_irq && (queue->tx_irq != queue->rx_irq)) {
171     @@ -1745,7 +1747,6 @@ static void xennet_destroy_queues(struct netfront_info *info)
172    
173     if (netif_running(info->netdev))
174     napi_disable(&queue->napi);
175     - del_timer_sync(&queue->rx_refill_timer);
176     netif_napi_del(&queue->napi);
177     }
178    
179     diff --git a/drivers/s390/scsi/zfcp_fsf.c b/drivers/s390/scsi/zfcp_fsf.c
180     index 75f820ca17b7..27ff38f839fc 100644
181     --- a/drivers/s390/scsi/zfcp_fsf.c
182     +++ b/drivers/s390/scsi/zfcp_fsf.c
183     @@ -1583,7 +1583,7 @@ out:
184     int zfcp_fsf_open_wka_port(struct zfcp_fc_wka_port *wka_port)
185     {
186     struct zfcp_qdio *qdio = wka_port->adapter->qdio;
187     - struct zfcp_fsf_req *req = NULL;
188     + struct zfcp_fsf_req *req;
189     int retval = -EIO;
190    
191     spin_lock_irq(&qdio->req_q_lock);
192     @@ -1612,7 +1612,7 @@ int zfcp_fsf_open_wka_port(struct zfcp_fc_wka_port *wka_port)
193     zfcp_fsf_req_free(req);
194     out:
195     spin_unlock_irq(&qdio->req_q_lock);
196     - if (req && !IS_ERR(req))
197     + if (!retval)
198     zfcp_dbf_rec_run_wka("fsowp_1", wka_port, req->req_id);
199     return retval;
200     }
201     @@ -1638,7 +1638,7 @@ static void zfcp_fsf_close_wka_port_handler(struct zfcp_fsf_req *req)
202     int zfcp_fsf_close_wka_port(struct zfcp_fc_wka_port *wka_port)
203     {
204     struct zfcp_qdio *qdio = wka_port->adapter->qdio;
205     - struct zfcp_fsf_req *req = NULL;
206     + struct zfcp_fsf_req *req;
207     int retval = -EIO;
208    
209     spin_lock_irq(&qdio->req_q_lock);
210     @@ -1667,7 +1667,7 @@ int zfcp_fsf_close_wka_port(struct zfcp_fc_wka_port *wka_port)
211     zfcp_fsf_req_free(req);
212     out:
213     spin_unlock_irq(&qdio->req_q_lock);
214     - if (req && !IS_ERR(req))
215     + if (!retval)
216     zfcp_dbf_rec_run_wka("fscwp_1", wka_port, req->req_id);
217     return retval;
218     }
219     diff --git a/drivers/scsi/aacraid/comminit.c b/drivers/scsi/aacraid/comminit.c
220     index 0d351cd3191b..26d38b1a45ab 100644
221     --- a/drivers/scsi/aacraid/comminit.c
222     +++ b/drivers/scsi/aacraid/comminit.c
223     @@ -50,9 +50,13 @@ struct aac_common aac_config = {
224    
225     static inline int aac_is_msix_mode(struct aac_dev *dev)
226     {
227     - u32 status;
228     + u32 status = 0;
229    
230     - status = src_readl(dev, MUnit.OMR);
231     + if (dev->pdev->device == PMC_DEVICE_S6 ||
232     + dev->pdev->device == PMC_DEVICE_S7 ||
233     + dev->pdev->device == PMC_DEVICE_S8) {
234     + status = src_readl(dev, MUnit.OMR);
235     + }
236     return (status & AAC_INT_MODE_MSIX);
237     }
238    
239     diff --git a/drivers/scsi/mpt3sas/mpt3sas_scsih.c b/drivers/scsi/mpt3sas/mpt3sas_scsih.c
240     index 8cead04f26d6..f6a8e9958e75 100644
241     --- a/drivers/scsi/mpt3sas/mpt3sas_scsih.c
242     +++ b/drivers/scsi/mpt3sas/mpt3sas_scsih.c
243     @@ -51,6 +51,7 @@
244     #include <linux/workqueue.h>
245     #include <linux/delay.h>
246     #include <linux/pci.h>
247     +#include <linux/pci-aspm.h>
248     #include <linux/interrupt.h>
249     #include <linux/aer.h>
250     #include <linux/raid_class.h>
251     @@ -8483,6 +8484,8 @@ _scsih_probe(struct pci_dev *pdev, const struct pci_device_id *id)
252    
253     switch (hba_mpi_version) {
254     case MPI2_VERSION:
255     + pci_disable_link_state(pdev, PCIE_LINK_STATE_L0S |
256     + PCIE_LINK_STATE_L1 | PCIE_LINK_STATE_CLKPM);
257     /* Use mpt2sas driver host template for SAS 2.0 HBA's */
258     shost = scsi_host_alloc(&mpt2sas_driver_template,
259     sizeof(struct MPT3SAS_ADAPTER));
260     diff --git a/drivers/target/target_core_device.c b/drivers/target/target_core_device.c
261     index dcd5ed26eb18..356c80fbb304 100644
262     --- a/drivers/target/target_core_device.c
263     +++ b/drivers/target/target_core_device.c
264     @@ -362,7 +362,15 @@ int core_enable_device_list_for_node(
265     kfree(new);
266     return -EINVAL;
267     }
268     - BUG_ON(orig->se_lun_acl != NULL);
269     + if (orig->se_lun_acl != NULL) {
270     + pr_warn_ratelimited("Detected existing explicit"
271     + " se_lun_acl->se_lun_group reference for %s"
272     + " mapped_lun: %llu, failing\n",
273     + nacl->initiatorname, mapped_lun);
274     + mutex_unlock(&nacl->lun_entry_mutex);
275     + kfree(new);
276     + return -EINVAL;
277     + }
278    
279     rcu_assign_pointer(new->se_lun, lun);
280     rcu_assign_pointer(new->se_lun_acl, lun_acl);
281     diff --git a/drivers/target/target_core_sbc.c b/drivers/target/target_core_sbc.c
282     index c220bb8dfa9d..2e27b1034ede 100644
283     --- a/drivers/target/target_core_sbc.c
284     +++ b/drivers/target/target_core_sbc.c
285     @@ -442,6 +442,7 @@ static sense_reason_t compare_and_write_post(struct se_cmd *cmd, bool success,
286     int *post_ret)
287     {
288     struct se_device *dev = cmd->se_dev;
289     + sense_reason_t ret = TCM_NO_SENSE;
290    
291     /*
292     * Only set SCF_COMPARE_AND_WRITE_POST to force a response fall-through
293     @@ -449,9 +450,12 @@ static sense_reason_t compare_and_write_post(struct se_cmd *cmd, bool success,
294     * sent to the backend driver.
295     */
296     spin_lock_irq(&cmd->t_state_lock);
297     - if ((cmd->transport_state & CMD_T_SENT) && !cmd->scsi_status) {
298     + if (cmd->transport_state & CMD_T_SENT) {
299     cmd->se_cmd_flags |= SCF_COMPARE_AND_WRITE_POST;
300     *post_ret = 1;
301     +
302     + if (cmd->scsi_status == SAM_STAT_CHECK_CONDITION)
303     + ret = TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;
304     }
305     spin_unlock_irq(&cmd->t_state_lock);
306    
307     @@ -461,7 +465,7 @@ static sense_reason_t compare_and_write_post(struct se_cmd *cmd, bool success,
308     */
309     up(&dev->caw_sem);
310    
311     - return TCM_NO_SENSE;
312     + return ret;
313     }
314    
315     static sense_reason_t compare_and_write_callback(struct se_cmd *cmd, bool success,
316     diff --git a/drivers/target/target_core_transport.c b/drivers/target/target_core_transport.c
317     index 2a67af4e2e13..aa517c4fadb9 100644
318     --- a/drivers/target/target_core_transport.c
319     +++ b/drivers/target/target_core_transport.c
320     @@ -3058,7 +3058,6 @@ static void target_tmr_work(struct work_struct *work)
321     spin_unlock_irqrestore(&cmd->t_state_lock, flags);
322     goto check_stop;
323     }
324     - cmd->t_state = TRANSPORT_ISTATE_PROCESSING;
325     spin_unlock_irqrestore(&cmd->t_state_lock, flags);
326    
327     cmd->se_tfo->queue_tm_rsp(cmd);
328     @@ -3071,11 +3070,25 @@ int transport_generic_handle_tmr(
329     struct se_cmd *cmd)
330     {
331     unsigned long flags;
332     + bool aborted = false;
333    
334     spin_lock_irqsave(&cmd->t_state_lock, flags);
335     - cmd->transport_state |= CMD_T_ACTIVE;
336     + if (cmd->transport_state & CMD_T_ABORTED) {
337     + aborted = true;
338     + } else {
339     + cmd->t_state = TRANSPORT_ISTATE_PROCESSING;
340     + cmd->transport_state |= CMD_T_ACTIVE;
341     + }
342     spin_unlock_irqrestore(&cmd->t_state_lock, flags);
343    
344     + if (aborted) {
345     + pr_warn_ratelimited("handle_tmr caught CMD_T_ABORTED TMR %d"
346     + "ref_tag: %llu tag: %llu\n", cmd->se_tmr_req->function,
347     + cmd->se_tmr_req->ref_task_tag, cmd->tag);
348     + transport_cmd_check_stop_to_fabric(cmd);
349     + return 0;
350     + }
351     +
352     INIT_WORK(&cmd->work, target_tmr_work);
353     queue_work(cmd->se_dev->tmr_wq, &cmd->work);
354     return 0;
355     diff --git a/drivers/target/target_core_xcopy.c b/drivers/target/target_core_xcopy.c
356     index 153a6f255b6d..6415e9b09a52 100644
357     --- a/drivers/target/target_core_xcopy.c
358     +++ b/drivers/target/target_core_xcopy.c
359     @@ -836,7 +836,7 @@ out:
360     " CHECK_CONDITION -> sending response\n", rc);
361     ec_cmd->scsi_status = SAM_STAT_CHECK_CONDITION;
362     }
363     - target_complete_cmd(ec_cmd, SAM_STAT_CHECK_CONDITION);
364     + target_complete_cmd(ec_cmd, ec_cmd->scsi_status);
365     }
366    
367     sense_reason_t target_do_xcopy(struct se_cmd *se_cmd)
368     diff --git a/include/linux/cpumask.h b/include/linux/cpumask.h
369     index 59915ea5373c..a91b3b75da0f 100644
370     --- a/include/linux/cpumask.h
371     +++ b/include/linux/cpumask.h
372     @@ -556,7 +556,7 @@ static inline void cpumask_copy(struct cpumask *dstp,
373     static inline int cpumask_parse_user(const char __user *buf, int len,
374     struct cpumask *dstp)
375     {
376     - return bitmap_parse_user(buf, len, cpumask_bits(dstp), nr_cpu_ids);
377     + return bitmap_parse_user(buf, len, cpumask_bits(dstp), nr_cpumask_bits);
378     }
379    
380     /**
381     @@ -571,7 +571,7 @@ static inline int cpumask_parselist_user(const char __user *buf, int len,
382     struct cpumask *dstp)
383     {
384     return bitmap_parselist_user(buf, len, cpumask_bits(dstp),
385     - nr_cpu_ids);
386     + nr_cpumask_bits);
387     }
388    
389     /**
390     @@ -586,7 +586,7 @@ static inline int cpumask_parse(const char *buf, struct cpumask *dstp)
391     char *nl = strchr(buf, '\n');
392     unsigned int len = nl ? (unsigned int)(nl - buf) : strlen(buf);
393    
394     - return bitmap_parse(buf, len, cpumask_bits(dstp), nr_cpu_ids);
395     + return bitmap_parse(buf, len, cpumask_bits(dstp), nr_cpumask_bits);
396     }
397    
398     /**
399     @@ -598,7 +598,7 @@ static inline int cpumask_parse(const char *buf, struct cpumask *dstp)
400     */
401     static inline int cpulist_parse(const char *buf, struct cpumask *dstp)
402     {
403     - return bitmap_parselist(buf, cpumask_bits(dstp), nr_cpu_ids);
404     + return bitmap_parselist(buf, cpumask_bits(dstp), nr_cpumask_bits);
405     }
406    
407     /**
408     diff --git a/net/mac80211/mesh.c b/net/mac80211/mesh.c
409     index f7bb6829b415..9063e8e736ad 100644
410     --- a/net/mac80211/mesh.c
411     +++ b/net/mac80211/mesh.c
412     @@ -355,7 +355,7 @@ int mesh_add_vendor_ies(struct ieee80211_sub_if_data *sdata,
413     /* fast-forward to vendor IEs */
414     offset = ieee80211_ie_split_vendor(ifmsh->ie, ifmsh->ie_len, 0);
415    
416     - if (offset) {
417     + if (offset < ifmsh->ie_len) {
418     len = ifmsh->ie_len - offset;
419     data = ifmsh->ie + offset;
420     if (skb_tailroom(skb) < len)
421     diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c
422     index d0cfaa9f19d0..4b56c3b6c25f 100644
423     --- a/security/selinux/hooks.c
424     +++ b/security/selinux/hooks.c
425     @@ -5640,7 +5640,7 @@ static int selinux_setprocattr(struct task_struct *p,
426     return error;
427    
428     /* Obtain a SID for the context, if one was specified. */
429     - if (size && str[1] && str[1] != '\n') {
430     + if (size && str[0] && str[0] != '\n') {
431     if (str[size-1] == '\n') {
432     str[size-1] = 0;
433     size--;
434     diff --git a/sound/core/seq/seq_memory.c b/sound/core/seq/seq_memory.c
435     index c850345c43b5..dfa5156f3585 100644
436     --- a/sound/core/seq/seq_memory.c
437     +++ b/sound/core/seq/seq_memory.c
438     @@ -419,7 +419,6 @@ int snd_seq_pool_done(struct snd_seq_pool *pool)
439     {
440     unsigned long flags;
441     struct snd_seq_event_cell *ptr;
442     - int max_count = 5 * HZ;
443    
444     if (snd_BUG_ON(!pool))
445     return -EINVAL;
446     @@ -432,14 +431,8 @@ int snd_seq_pool_done(struct snd_seq_pool *pool)
447     if (waitqueue_active(&pool->output_sleep))
448     wake_up(&pool->output_sleep);
449    
450     - while (atomic_read(&pool->counter) > 0) {
451     - if (max_count == 0) {
452     - pr_warn("ALSA: snd_seq_pool_done timeout: %d cells remain\n", atomic_read(&pool->counter));
453     - break;
454     - }
455     + while (atomic_read(&pool->counter) > 0)
456     schedule_timeout_uninterruptible(1);
457     - max_count--;
458     - }
459    
460     /* release all resources */
461     spin_lock_irqsave(&pool->lock, flags);
462     diff --git a/sound/core/seq/seq_queue.c b/sound/core/seq/seq_queue.c
463     index 0bec02e89d51..450c5187eecb 100644
464     --- a/sound/core/seq/seq_queue.c
465     +++ b/sound/core/seq/seq_queue.c
466     @@ -181,6 +181,8 @@ void __exit snd_seq_queues_delete(void)
467     }
468     }
469    
470     +static void queue_use(struct snd_seq_queue *queue, int client, int use);
471     +
472     /* allocate a new queue -
473     * return queue index value or negative value for error
474     */
475     @@ -192,11 +194,11 @@ int snd_seq_queue_alloc(int client, int locked, unsigned int info_flags)
476     if (q == NULL)
477     return -ENOMEM;
478     q->info_flags = info_flags;
479     + queue_use(q, client, 1);
480     if (queue_list_add(q) < 0) {
481     queue_delete(q);
482     return -ENOMEM;
483     }
484     - snd_seq_queue_use(q->queue, client, 1); /* use this queue */
485     return q->queue;
486     }
487    
488     @@ -502,19 +504,9 @@ int snd_seq_queue_timer_set_tempo(int queueid, int client,
489     return result;
490     }
491    
492     -
493     -/* use or unuse this queue -
494     - * if it is the first client, starts the timer.
495     - * if it is not longer used by any clients, stop the timer.
496     - */
497     -int snd_seq_queue_use(int queueid, int client, int use)
498     +/* use or unuse this queue */
499     +static void queue_use(struct snd_seq_queue *queue, int client, int use)
500     {
501     - struct snd_seq_queue *queue;
502     -
503     - queue = queueptr(queueid);
504     - if (queue == NULL)
505     - return -EINVAL;
506     - mutex_lock(&queue->timer_mutex);
507     if (use) {
508     if (!test_and_set_bit(client, queue->clients_bitmap))
509     queue->clients++;
510     @@ -529,6 +521,21 @@ int snd_seq_queue_use(int queueid, int client, int use)
511     } else {
512     snd_seq_timer_close(queue);
513     }
514     +}
515     +
516     +/* use or unuse this queue -
517     + * if it is the first client, starts the timer.
518     + * if it is not longer used by any clients, stop the timer.
519     + */
520     +int snd_seq_queue_use(int queueid, int client, int use)
521     +{
522     + struct snd_seq_queue *queue;
523     +
524     + queue = queueptr(queueid);
525     + if (queue == NULL)
526     + return -EINVAL;
527     + mutex_lock(&queue->timer_mutex);
528     + queue_use(queue, client, use);
529     mutex_unlock(&queue->timer_mutex);
530     queuefree(queue);
531     return 0;