Merge 4.19.165 into android-4.19-stable
Changes in 4.19.165
md/raid10: initialize r10_bio->read_slot before use.
fscrypt: add fscrypt_is_nokey_name()
ext4: prevent creating duplicate encrypted filenames
f2fs: prevent creating duplicate encrypted filenames
ubifs: prevent creating duplicate encrypted filenames
vfio/pci: Move dummy_resources_list init in vfio_pci_probe()
ext4: don't remount read-only with errors=continue on reboot
uapi: move constants from <linux/kernel.h> to <linux/const.h>
KVM: SVM: relax conditions for allowing MSR_IA32_SPEC_CTRL accesses
KVM: x86: reinstate vendor-agnostic check on SPEC_CTRL cpuid bits
powerpc/bitops: Fix possible undefined behaviour with fls() and fls64()
xen/gntdev.c: Mark pages as dirty
null_blk: Fix zone size initialization
of: fix linker-section match-table corruption
Bluetooth: hci_h5: close serdev device and free hu in h5_close
reiserfs: add check for an invalid ih_entry_count
misc: vmw_vmci: fix kernel info-leak by initializing dbells in vmci_ctx_get_chkpt_doorbells()
media: gp8psk: initialize stats at power control logic
ALSA: seq: Use bool for snd_seq_queue internal flags
ALSA: rawmidi: Access runtime->avail always in spinlock
fcntl: Fix potential deadlock in send_sig{io, urg}()
rtc: sun6i: Fix memleak in sun6i_rtc_clk_init
module: set MODULE_STATE_GOING state when a module fails to load
quota: Don't overflow quota file offsets
powerpc: sysdev: add missing iounmap() on error in mpic_msgr_probe()
NFSv4: Fix a pNFS layout related use-after-free race when freeing the inode
module: delay kobject uevent until after module init call
ALSA: pcm: Clear the full allocated memory at hw_params
dm verity: skip verity work if I/O error when system is shutting down
Linux 4.19.165
Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
Change-Id: I211fed33aec407a84504c9031ad723890263d943
This commit is contained in:
2
Makefile
2
Makefile
@@ -1,7 +1,7 @@
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
VERSION = 4
|
||||
PATCHLEVEL = 19
|
||||
SUBLEVEL = 164
|
||||
SUBLEVEL = 165
|
||||
EXTRAVERSION =
|
||||
NAME = "People's Front"
|
||||
|
||||
|
||||
@@ -221,15 +221,34 @@ static __inline__ void __clear_bit_unlock(int nr, volatile unsigned long *addr)
|
||||
*/
|
||||
static __inline__ int fls(unsigned int x)
|
||||
{
|
||||
return 32 - __builtin_clz(x);
|
||||
int lz;
|
||||
|
||||
if (__builtin_constant_p(x))
|
||||
return x ? 32 - __builtin_clz(x) : 0;
|
||||
asm("cntlzw %0,%1" : "=r" (lz) : "r" (x));
|
||||
return 32 - lz;
|
||||
}
|
||||
|
||||
#include <asm-generic/bitops/builtin-__fls.h>
|
||||
|
||||
/*
|
||||
* 64-bit can do this using one cntlzd (count leading zeroes doubleword)
|
||||
* instruction; for 32-bit we use the generic version, which does two
|
||||
* 32-bit fls calls.
|
||||
*/
|
||||
#ifdef CONFIG_PPC64
|
||||
static __inline__ int fls64(__u64 x)
|
||||
{
|
||||
return 64 - __builtin_clzll(x);
|
||||
int lz;
|
||||
|
||||
if (__builtin_constant_p(x))
|
||||
return x ? 64 - __builtin_clzll(x) : 0;
|
||||
asm("cntlzd %0,%1" : "=r" (lz) : "r" (x));
|
||||
return 64 - lz;
|
||||
}
|
||||
#else
|
||||
#include <asm-generic/bitops/fls64.h>
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_PPC64
|
||||
unsigned int __arch_hweight8(unsigned int w);
|
||||
|
||||
@@ -196,7 +196,7 @@ static int mpic_msgr_probe(struct platform_device *dev)
|
||||
|
||||
/* IO map the message register block. */
|
||||
of_address_to_resource(np, 0, &rsrc);
|
||||
msgr_block_addr = ioremap(rsrc.start, resource_size(&rsrc));
|
||||
msgr_block_addr = devm_ioremap(&dev->dev, rsrc.start, resource_size(&rsrc));
|
||||
if (!msgr_block_addr) {
|
||||
dev_err(&dev->dev, "Failed to iomap MPIC message registers");
|
||||
return -EFAULT;
|
||||
|
||||
@@ -154,6 +154,20 @@ static inline int guest_cpuid_stepping(struct kvm_vcpu *vcpu)
|
||||
return x86_stepping(best->eax);
|
||||
}
|
||||
|
||||
static inline bool guest_has_spec_ctrl_msr(struct kvm_vcpu *vcpu)
|
||||
{
|
||||
return (guest_cpuid_has(vcpu, X86_FEATURE_SPEC_CTRL) ||
|
||||
guest_cpuid_has(vcpu, X86_FEATURE_AMD_STIBP) ||
|
||||
guest_cpuid_has(vcpu, X86_FEATURE_AMD_IBRS) ||
|
||||
guest_cpuid_has(vcpu, X86_FEATURE_AMD_SSBD));
|
||||
}
|
||||
|
||||
static inline bool guest_has_pred_cmd_msr(struct kvm_vcpu *vcpu)
|
||||
{
|
||||
return (guest_cpuid_has(vcpu, X86_FEATURE_SPEC_CTRL) ||
|
||||
guest_cpuid_has(vcpu, X86_FEATURE_AMD_IBPB));
|
||||
}
|
||||
|
||||
static inline bool supports_cpuid_fault(struct kvm_vcpu *vcpu)
|
||||
{
|
||||
return vcpu->arch.msr_platform_info & MSR_PLATFORM_INFO_CPUID_FAULT;
|
||||
|
||||
@@ -4209,8 +4209,7 @@ static int svm_get_msr(struct kvm_vcpu *vcpu, struct msr_data *msr_info)
|
||||
break;
|
||||
case MSR_IA32_SPEC_CTRL:
|
||||
if (!msr_info->host_initiated &&
|
||||
!guest_cpuid_has(vcpu, X86_FEATURE_AMD_IBRS) &&
|
||||
!guest_cpuid_has(vcpu, X86_FEATURE_AMD_SSBD))
|
||||
!guest_has_spec_ctrl_msr(vcpu))
|
||||
return 1;
|
||||
|
||||
msr_info->data = svm->spec_ctrl;
|
||||
@@ -4312,8 +4311,7 @@ static int svm_set_msr(struct kvm_vcpu *vcpu, struct msr_data *msr)
|
||||
break;
|
||||
case MSR_IA32_SPEC_CTRL:
|
||||
if (!msr->host_initiated &&
|
||||
!guest_cpuid_has(vcpu, X86_FEATURE_AMD_IBRS) &&
|
||||
!guest_cpuid_has(vcpu, X86_FEATURE_AMD_SSBD))
|
||||
!guest_has_spec_ctrl_msr(vcpu))
|
||||
return 1;
|
||||
|
||||
/* The STIBP bit doesn't fault even if it's not advertised */
|
||||
@@ -4340,12 +4338,11 @@ static int svm_set_msr(struct kvm_vcpu *vcpu, struct msr_data *msr)
|
||||
break;
|
||||
case MSR_IA32_PRED_CMD:
|
||||
if (!msr->host_initiated &&
|
||||
!guest_cpuid_has(vcpu, X86_FEATURE_AMD_IBPB))
|
||||
!guest_has_pred_cmd_msr(vcpu))
|
||||
return 1;
|
||||
|
||||
if (data & ~PRED_CMD_IBPB)
|
||||
return 1;
|
||||
|
||||
if (!data)
|
||||
break;
|
||||
|
||||
|
||||
@@ -4066,7 +4066,7 @@ static int vmx_get_msr(struct kvm_vcpu *vcpu, struct msr_data *msr_info)
|
||||
return kvm_get_msr_common(vcpu, msr_info);
|
||||
case MSR_IA32_SPEC_CTRL:
|
||||
if (!msr_info->host_initiated &&
|
||||
!guest_cpuid_has(vcpu, X86_FEATURE_SPEC_CTRL))
|
||||
!guest_has_spec_ctrl_msr(vcpu))
|
||||
return 1;
|
||||
|
||||
msr_info->data = to_vmx(vcpu)->spec_ctrl;
|
||||
@@ -4180,7 +4180,7 @@ static int vmx_set_msr(struct kvm_vcpu *vcpu, struct msr_data *msr_info)
|
||||
break;
|
||||
case MSR_IA32_SPEC_CTRL:
|
||||
if (!msr_info->host_initiated &&
|
||||
!guest_cpuid_has(vcpu, X86_FEATURE_SPEC_CTRL))
|
||||
!guest_has_spec_ctrl_msr(vcpu))
|
||||
return 1;
|
||||
|
||||
/* The STIBP bit doesn't fault even if it's not advertised */
|
||||
@@ -4210,7 +4210,7 @@ static int vmx_set_msr(struct kvm_vcpu *vcpu, struct msr_data *msr_info)
|
||||
break;
|
||||
case MSR_IA32_PRED_CMD:
|
||||
if (!msr_info->host_initiated &&
|
||||
!guest_cpuid_has(vcpu, X86_FEATURE_SPEC_CTRL))
|
||||
!guest_has_pred_cmd_msr(vcpu))
|
||||
return 1;
|
||||
|
||||
if (data & ~PRED_CMD_IBPB)
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
#include <linux/vmalloc.h>
|
||||
#include <linux/sizes.h>
|
||||
#include "null_blk.h"
|
||||
|
||||
/* zone_size in MBs to sectors. */
|
||||
#define ZONE_SIZE_SHIFT 11
|
||||
#define MB_TO_SECTS(mb) (((sector_t)mb * SZ_1M) >> SECTOR_SHIFT)
|
||||
|
||||
static inline unsigned int null_zone_no(struct nullb_device *dev, sector_t sect)
|
||||
{
|
||||
@@ -12,7 +12,7 @@ static inline unsigned int null_zone_no(struct nullb_device *dev, sector_t sect)
|
||||
|
||||
int null_zone_init(struct nullb_device *dev)
|
||||
{
|
||||
sector_t dev_size = (sector_t)dev->size * 1024 * 1024;
|
||||
sector_t dev_capacity_sects;
|
||||
sector_t sector = 0;
|
||||
unsigned int i;
|
||||
|
||||
@@ -25,9 +25,12 @@ int null_zone_init(struct nullb_device *dev)
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
dev->zone_size_sects = dev->zone_size << ZONE_SIZE_SHIFT;
|
||||
dev->nr_zones = dev_size >>
|
||||
(SECTOR_SHIFT + ilog2(dev->zone_size_sects));
|
||||
dev_capacity_sects = MB_TO_SECTS(dev->size);
|
||||
dev->zone_size_sects = MB_TO_SECTS(dev->zone_size);
|
||||
dev->nr_zones = dev_capacity_sects >> ilog2(dev->zone_size_sects);
|
||||
if (dev_capacity_sects & (dev->zone_size_sects - 1))
|
||||
dev->nr_zones++;
|
||||
|
||||
dev->zones = kvmalloc_array(dev->nr_zones, sizeof(struct blk_zone),
|
||||
GFP_KERNEL | __GFP_ZERO);
|
||||
if (!dev->zones)
|
||||
@@ -37,7 +40,10 @@ int null_zone_init(struct nullb_device *dev)
|
||||
struct blk_zone *zone = &dev->zones[i];
|
||||
|
||||
zone->start = zone->wp = sector;
|
||||
zone->len = dev->zone_size_sects;
|
||||
if (zone->start + dev->zone_size_sects > dev_capacity_sects)
|
||||
zone->len = dev_capacity_sects - zone->start;
|
||||
else
|
||||
zone->len = dev->zone_size_sects;
|
||||
zone->type = BLK_ZONE_TYPE_SEQWRITE_REQ;
|
||||
zone->cond = BLK_ZONE_COND_EMPTY;
|
||||
|
||||
|
||||
@@ -263,8 +263,12 @@ static int h5_close(struct hci_uart *hu)
|
||||
if (h5->vnd && h5->vnd->close)
|
||||
h5->vnd->close(h5);
|
||||
|
||||
if (!hu->serdev)
|
||||
kfree(h5);
|
||||
if (hu->serdev)
|
||||
serdev_device_close(hu->serdev);
|
||||
|
||||
kfree_skb(h5->rx_skb);
|
||||
kfree(h5);
|
||||
h5 = NULL;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -537,6 +537,15 @@ static int verity_verify_io(struct dm_verity_io *io)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Skip verity work in response to I/O error when system is shutting down.
|
||||
*/
|
||||
static inline bool verity_is_system_shutting_down(void)
|
||||
{
|
||||
return system_state == SYSTEM_HALT || system_state == SYSTEM_POWER_OFF
|
||||
|| system_state == SYSTEM_RESTART;
|
||||
}
|
||||
|
||||
/*
|
||||
* End one "io" structure with a given error.
|
||||
*/
|
||||
@@ -564,7 +573,8 @@ static void verity_end_io(struct bio *bio)
|
||||
{
|
||||
struct dm_verity_io *io = bio->bi_private;
|
||||
|
||||
if (bio->bi_status && !verity_fec_is_enabled(io->v)) {
|
||||
if (bio->bi_status &&
|
||||
(!verity_fec_is_enabled(io->v) || verity_is_system_shutting_down())) {
|
||||
verity_finish_io(io, bio->bi_status);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -1138,7 +1138,7 @@ static void raid10_read_request(struct mddev *mddev, struct bio *bio,
|
||||
struct md_rdev *err_rdev = NULL;
|
||||
gfp_t gfp = GFP_NOIO;
|
||||
|
||||
if (r10_bio->devs[slot].rdev) {
|
||||
if (slot >= 0 && r10_bio->devs[slot].rdev) {
|
||||
/*
|
||||
* This is an error retry, but we cannot
|
||||
* safely dereference the rdev in the r10_bio,
|
||||
@@ -1547,6 +1547,7 @@ static void __make_request(struct mddev *mddev, struct bio *bio, int sectors)
|
||||
r10_bio->mddev = mddev;
|
||||
r10_bio->sector = bio->bi_iter.bi_sector;
|
||||
r10_bio->state = 0;
|
||||
r10_bio->read_slot = -1;
|
||||
memset(r10_bio->devs, 0, sizeof(r10_bio->devs[0]) * conf->copies);
|
||||
|
||||
if (bio_data_dir(bio) == READ)
|
||||
|
||||
@@ -185,7 +185,7 @@ static int gp8psk_load_bcm4500fw(struct dvb_usb_device *d)
|
||||
|
||||
static int gp8psk_power_ctrl(struct dvb_usb_device *d, int onoff)
|
||||
{
|
||||
u8 status, buf;
|
||||
u8 status = 0, buf;
|
||||
int gp_product_id = le16_to_cpu(d->udev->descriptor.idProduct);
|
||||
|
||||
if (onoff) {
|
||||
|
||||
@@ -751,7 +751,7 @@ static int vmci_ctx_get_chkpt_doorbells(struct vmci_ctx *context,
|
||||
return VMCI_ERROR_MORE_DATA;
|
||||
}
|
||||
|
||||
dbells = kmalloc(data_size, GFP_ATOMIC);
|
||||
dbells = kzalloc(data_size, GFP_ATOMIC);
|
||||
if (!dbells)
|
||||
return VMCI_ERROR_NO_MEM;
|
||||
|
||||
|
||||
@@ -232,7 +232,7 @@ static void __init sun6i_rtc_clk_init(struct device_node *node)
|
||||
300000000);
|
||||
if (IS_ERR(rtc->int_osc)) {
|
||||
pr_crit("Couldn't register the internal oscillator\n");
|
||||
return;
|
||||
goto err;
|
||||
}
|
||||
|
||||
parents[0] = clk_hw_get_name(rtc->int_osc);
|
||||
@@ -248,7 +248,7 @@ static void __init sun6i_rtc_clk_init(struct device_node *node)
|
||||
rtc->losc = clk_register(NULL, &rtc->hw);
|
||||
if (IS_ERR(rtc->losc)) {
|
||||
pr_crit("Couldn't register the LOSC clock\n");
|
||||
return;
|
||||
goto err_register;
|
||||
}
|
||||
|
||||
of_property_read_string_index(node, "clock-output-names", 1,
|
||||
@@ -259,7 +259,7 @@ static void __init sun6i_rtc_clk_init(struct device_node *node)
|
||||
&rtc->lock);
|
||||
if (IS_ERR(rtc->ext_losc)) {
|
||||
pr_crit("Couldn't register the LOSC external gate\n");
|
||||
return;
|
||||
goto err_register;
|
||||
}
|
||||
|
||||
clk_data->num = 2;
|
||||
@@ -268,6 +268,8 @@ static void __init sun6i_rtc_clk_init(struct device_node *node)
|
||||
of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
|
||||
return;
|
||||
|
||||
err_register:
|
||||
clk_hw_unregister_fixed_rate(rtc->int_osc);
|
||||
err:
|
||||
kfree(clk_data);
|
||||
}
|
||||
|
||||
@@ -118,8 +118,6 @@ static void vfio_pci_probe_mmaps(struct vfio_pci_device *vdev)
|
||||
int bar;
|
||||
struct vfio_pci_dummy_resource *dummy_res;
|
||||
|
||||
INIT_LIST_HEAD(&vdev->dummy_resources_list);
|
||||
|
||||
for (bar = PCI_STD_RESOURCES; bar <= PCI_STD_RESOURCE_END; bar++) {
|
||||
res = vdev->pdev->resource + bar;
|
||||
|
||||
@@ -1522,6 +1520,7 @@ static int vfio_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)
|
||||
mutex_init(&vdev->igate);
|
||||
spin_lock_init(&vdev->irqlock);
|
||||
mutex_init(&vdev->ioeventfds_lock);
|
||||
INIT_LIST_HEAD(&vdev->dummy_resources_list);
|
||||
INIT_LIST_HEAD(&vdev->ioeventfds_list);
|
||||
mutex_init(&vdev->vma_lock);
|
||||
INIT_LIST_HEAD(&vdev->vma_list);
|
||||
|
||||
@@ -842,17 +842,18 @@ struct gntdev_copy_batch {
|
||||
s16 __user *status[GNTDEV_COPY_BATCH];
|
||||
unsigned int nr_ops;
|
||||
unsigned int nr_pages;
|
||||
bool writeable;
|
||||
};
|
||||
|
||||
static int gntdev_get_page(struct gntdev_copy_batch *batch, void __user *virt,
|
||||
bool writeable, unsigned long *gfn)
|
||||
unsigned long *gfn)
|
||||
{
|
||||
unsigned long addr = (unsigned long)virt;
|
||||
struct page *page;
|
||||
unsigned long xen_pfn;
|
||||
int ret;
|
||||
|
||||
ret = get_user_pages_fast(addr, 1, writeable, &page);
|
||||
ret = get_user_pages_fast(addr, 1, batch->writeable, &page);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
@@ -868,9 +869,13 @@ static void gntdev_put_pages(struct gntdev_copy_batch *batch)
|
||||
{
|
||||
unsigned int i;
|
||||
|
||||
for (i = 0; i < batch->nr_pages; i++)
|
||||
for (i = 0; i < batch->nr_pages; i++) {
|
||||
if (batch->writeable && !PageDirty(batch->pages[i]))
|
||||
set_page_dirty_lock(batch->pages[i]);
|
||||
put_page(batch->pages[i]);
|
||||
}
|
||||
batch->nr_pages = 0;
|
||||
batch->writeable = false;
|
||||
}
|
||||
|
||||
static int gntdev_copy(struct gntdev_copy_batch *batch)
|
||||
@@ -959,8 +964,9 @@ static int gntdev_grant_copy_seg(struct gntdev_copy_batch *batch,
|
||||
virt = seg->source.virt + copied;
|
||||
off = (unsigned long)virt & ~XEN_PAGE_MASK;
|
||||
len = min(len, (size_t)XEN_PAGE_SIZE - off);
|
||||
batch->writeable = false;
|
||||
|
||||
ret = gntdev_get_page(batch, virt, false, &gfn);
|
||||
ret = gntdev_get_page(batch, virt, &gfn);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
@@ -978,8 +984,9 @@ static int gntdev_grant_copy_seg(struct gntdev_copy_batch *batch,
|
||||
virt = seg->dest.virt + copied;
|
||||
off = (unsigned long)virt & ~XEN_PAGE_MASK;
|
||||
len = min(len, (size_t)XEN_PAGE_SIZE - off);
|
||||
batch->writeable = true;
|
||||
|
||||
ret = gntdev_get_page(batch, virt, true, &gfn);
|
||||
ret = gntdev_get_page(batch, virt, &gfn);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
|
||||
@@ -59,8 +59,8 @@ int __fscrypt_prepare_link(struct inode *inode, struct inode *dir,
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
/* ... in case we looked up ciphertext name before key was added */
|
||||
if (dentry->d_flags & DCACHE_ENCRYPTED_NAME)
|
||||
/* ... in case we looked up no-key name before key was added */
|
||||
if (fscrypt_is_nokey_name(dentry))
|
||||
return -ENOKEY;
|
||||
|
||||
if (!fscrypt_has_permitted_context(dir, inode))
|
||||
@@ -84,9 +84,9 @@ int __fscrypt_prepare_rename(struct inode *old_dir, struct dentry *old_dentry,
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
/* ... in case we looked up ciphertext name(s) before key was added */
|
||||
if ((old_dentry->d_flags | new_dentry->d_flags) &
|
||||
DCACHE_ENCRYPTED_NAME)
|
||||
/* ... in case we looked up no-key name(s) before key was added */
|
||||
if (fscrypt_is_nokey_name(old_dentry) ||
|
||||
fscrypt_is_nokey_name(new_dentry))
|
||||
return -ENOKEY;
|
||||
|
||||
if (old_dir != new_dir) {
|
||||
|
||||
@@ -2310,6 +2310,9 @@ static int ext4_add_entry(handle_t *handle, struct dentry *dentry,
|
||||
return -EINVAL;
|
||||
#endif
|
||||
|
||||
if (fscrypt_is_nokey_name(dentry))
|
||||
return -ENOKEY;
|
||||
|
||||
retval = ext4_fname_setup_filename(dir, &dentry->d_name, 0, &fname);
|
||||
if (retval)
|
||||
return retval;
|
||||
|
||||
@@ -455,19 +455,17 @@ static bool system_going_down(void)
|
||||
|
||||
static void ext4_handle_error(struct super_block *sb)
|
||||
{
|
||||
journal_t *journal = EXT4_SB(sb)->s_journal;
|
||||
|
||||
if (test_opt(sb, WARN_ON_ERROR))
|
||||
WARN_ON_ONCE(1);
|
||||
|
||||
if (sb_rdonly(sb))
|
||||
if (sb_rdonly(sb) || test_opt(sb, ERRORS_CONT))
|
||||
return;
|
||||
|
||||
if (!test_opt(sb, ERRORS_CONT)) {
|
||||
journal_t *journal = EXT4_SB(sb)->s_journal;
|
||||
|
||||
EXT4_SB(sb)->s_mount_flags |= EXT4_MF_FS_ABORTED;
|
||||
if (journal)
|
||||
jbd2_journal_abort(journal, -EIO);
|
||||
}
|
||||
EXT4_SB(sb)->s_mount_flags |= EXT4_MF_FS_ABORTED;
|
||||
if (journal)
|
||||
jbd2_journal_abort(journal, -EIO);
|
||||
/*
|
||||
* We force ERRORS_RO behavior when system is rebooting. Otherwise we
|
||||
* could panic during 'reboot -f' as the underlying device got already
|
||||
|
||||
@@ -3231,6 +3231,8 @@ bool f2fs_empty_dir(struct inode *dir);
|
||||
|
||||
static inline int f2fs_add_link(struct dentry *dentry, struct inode *inode)
|
||||
{
|
||||
if (fscrypt_is_nokey_name(dentry))
|
||||
return -ENOKEY;
|
||||
return f2fs_do_add_link(d_inode(dentry->d_parent), &dentry->d_name,
|
||||
inode, inode->i_ino, inode->i_mode);
|
||||
}
|
||||
|
||||
10
fs/fcntl.c
10
fs/fcntl.c
@@ -779,9 +779,10 @@ void send_sigio(struct fown_struct *fown, int fd, int band)
|
||||
{
|
||||
struct task_struct *p;
|
||||
enum pid_type type;
|
||||
unsigned long flags;
|
||||
struct pid *pid;
|
||||
|
||||
read_lock(&fown->lock);
|
||||
read_lock_irqsave(&fown->lock, flags);
|
||||
|
||||
type = fown->pid_type;
|
||||
pid = fown->pid;
|
||||
@@ -802,7 +803,7 @@ void send_sigio(struct fown_struct *fown, int fd, int band)
|
||||
read_unlock(&tasklist_lock);
|
||||
}
|
||||
out_unlock_fown:
|
||||
read_unlock(&fown->lock);
|
||||
read_unlock_irqrestore(&fown->lock, flags);
|
||||
}
|
||||
|
||||
static void send_sigurg_to_task(struct task_struct *p,
|
||||
@@ -817,9 +818,10 @@ int send_sigurg(struct fown_struct *fown)
|
||||
struct task_struct *p;
|
||||
enum pid_type type;
|
||||
struct pid *pid;
|
||||
unsigned long flags;
|
||||
int ret = 0;
|
||||
|
||||
read_lock(&fown->lock);
|
||||
read_lock_irqsave(&fown->lock, flags);
|
||||
|
||||
type = fown->pid_type;
|
||||
pid = fown->pid;
|
||||
@@ -842,7 +844,7 @@ int send_sigurg(struct fown_struct *fown)
|
||||
read_unlock(&tasklist_lock);
|
||||
}
|
||||
out_unlock_fown:
|
||||
read_unlock(&fown->lock);
|
||||
read_unlock_irqrestore(&fown->lock, flags);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
@@ -95,7 +95,7 @@ static void nfs4_evict_inode(struct inode *inode)
|
||||
nfs_inode_return_delegation_noreclaim(inode);
|
||||
/* Note that above delegreturn would trigger pnfs return-on-close */
|
||||
pnfs_return_layout(inode);
|
||||
pnfs_destroy_layout(NFS_I(inode));
|
||||
pnfs_destroy_layout_final(NFS_I(inode));
|
||||
/* First call standard NFS clear_inode() code */
|
||||
nfs_clear_inode(inode);
|
||||
}
|
||||
|
||||
@@ -294,6 +294,7 @@ void
|
||||
pnfs_put_layout_hdr(struct pnfs_layout_hdr *lo)
|
||||
{
|
||||
struct inode *inode;
|
||||
unsigned long i_state;
|
||||
|
||||
if (!lo)
|
||||
return;
|
||||
@@ -304,8 +305,12 @@ pnfs_put_layout_hdr(struct pnfs_layout_hdr *lo)
|
||||
if (!list_empty(&lo->plh_segs))
|
||||
WARN_ONCE(1, "NFS: BUG unfreed layout segments.\n");
|
||||
pnfs_detach_layout_hdr(lo);
|
||||
i_state = inode->i_state;
|
||||
spin_unlock(&inode->i_lock);
|
||||
pnfs_free_layout_hdr(lo);
|
||||
/* Notify pnfs_destroy_layout_final() that we're done */
|
||||
if (i_state & (I_FREEING | I_CLEAR))
|
||||
wake_up_var(lo);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -713,8 +718,7 @@ pnfs_free_lseg_list(struct list_head *free_me)
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
pnfs_destroy_layout(struct nfs_inode *nfsi)
|
||||
static struct pnfs_layout_hdr *__pnfs_destroy_layout(struct nfs_inode *nfsi)
|
||||
{
|
||||
struct pnfs_layout_hdr *lo;
|
||||
LIST_HEAD(tmp_list);
|
||||
@@ -732,9 +736,34 @@ pnfs_destroy_layout(struct nfs_inode *nfsi)
|
||||
pnfs_put_layout_hdr(lo);
|
||||
} else
|
||||
spin_unlock(&nfsi->vfs_inode.i_lock);
|
||||
return lo;
|
||||
}
|
||||
|
||||
void pnfs_destroy_layout(struct nfs_inode *nfsi)
|
||||
{
|
||||
__pnfs_destroy_layout(nfsi);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(pnfs_destroy_layout);
|
||||
|
||||
static bool pnfs_layout_removed(struct nfs_inode *nfsi,
|
||||
struct pnfs_layout_hdr *lo)
|
||||
{
|
||||
bool ret;
|
||||
|
||||
spin_lock(&nfsi->vfs_inode.i_lock);
|
||||
ret = nfsi->layout != lo;
|
||||
spin_unlock(&nfsi->vfs_inode.i_lock);
|
||||
return ret;
|
||||
}
|
||||
|
||||
void pnfs_destroy_layout_final(struct nfs_inode *nfsi)
|
||||
{
|
||||
struct pnfs_layout_hdr *lo = __pnfs_destroy_layout(nfsi);
|
||||
|
||||
if (lo)
|
||||
wait_var_event(lo, pnfs_layout_removed(nfsi, lo));
|
||||
}
|
||||
|
||||
static bool
|
||||
pnfs_layout_add_bulk_destroy_list(struct inode *inode,
|
||||
struct list_head *layout_list)
|
||||
|
||||
@@ -254,6 +254,7 @@ struct pnfs_layout_segment *pnfs_layout_process(struct nfs4_layoutget *lgp);
|
||||
void pnfs_layoutget_free(struct nfs4_layoutget *lgp);
|
||||
void pnfs_free_lseg_list(struct list_head *tmp_list);
|
||||
void pnfs_destroy_layout(struct nfs_inode *);
|
||||
void pnfs_destroy_layout_final(struct nfs_inode *);
|
||||
void pnfs_destroy_all_layouts(struct nfs_client *);
|
||||
int pnfs_destroy_layouts_byfsid(struct nfs_client *clp,
|
||||
struct nfs_fsid *fsid,
|
||||
@@ -645,6 +646,10 @@ static inline void pnfs_destroy_layout(struct nfs_inode *nfsi)
|
||||
{
|
||||
}
|
||||
|
||||
static inline void pnfs_destroy_layout_final(struct nfs_inode *nfsi)
|
||||
{
|
||||
}
|
||||
|
||||
static inline struct pnfs_layout_segment *
|
||||
pnfs_get_lseg(struct pnfs_layout_segment *lseg)
|
||||
{
|
||||
|
||||
@@ -61,7 +61,7 @@ static ssize_t read_blk(struct qtree_mem_dqinfo *info, uint blk, char *buf)
|
||||
|
||||
memset(buf, 0, info->dqi_usable_bs);
|
||||
return sb->s_op->quota_read(sb, info->dqi_type, buf,
|
||||
info->dqi_usable_bs, blk << info->dqi_blocksize_bits);
|
||||
info->dqi_usable_bs, (loff_t)blk << info->dqi_blocksize_bits);
|
||||
}
|
||||
|
||||
static ssize_t write_blk(struct qtree_mem_dqinfo *info, uint blk, char *buf)
|
||||
@@ -70,7 +70,7 @@ static ssize_t write_blk(struct qtree_mem_dqinfo *info, uint blk, char *buf)
|
||||
ssize_t ret;
|
||||
|
||||
ret = sb->s_op->quota_write(sb, info->dqi_type, buf,
|
||||
info->dqi_usable_bs, blk << info->dqi_blocksize_bits);
|
||||
info->dqi_usable_bs, (loff_t)blk << info->dqi_blocksize_bits);
|
||||
if (ret != info->dqi_usable_bs) {
|
||||
quota_error(sb, "dquota write failed");
|
||||
if (ret >= 0)
|
||||
@@ -283,7 +283,7 @@ static uint find_free_dqentry(struct qtree_mem_dqinfo *info,
|
||||
blk);
|
||||
goto out_buf;
|
||||
}
|
||||
dquot->dq_off = (blk << info->dqi_blocksize_bits) +
|
||||
dquot->dq_off = ((loff_t)blk << info->dqi_blocksize_bits) +
|
||||
sizeof(struct qt_disk_dqdbheader) +
|
||||
i * info->dqi_entry_size;
|
||||
kfree(buf);
|
||||
@@ -558,7 +558,7 @@ static loff_t find_block_dqentry(struct qtree_mem_dqinfo *info,
|
||||
ret = -EIO;
|
||||
goto out_buf;
|
||||
} else {
|
||||
ret = (blk << info->dqi_blocksize_bits) + sizeof(struct
|
||||
ret = ((loff_t)blk << info->dqi_blocksize_bits) + sizeof(struct
|
||||
qt_disk_dqdbheader) + i * info->dqi_entry_size;
|
||||
}
|
||||
out_buf:
|
||||
|
||||
@@ -454,6 +454,12 @@ static int is_leaf(char *buf, int blocksize, struct buffer_head *bh)
|
||||
"(second one): %h", ih);
|
||||
return 0;
|
||||
}
|
||||
if (is_direntry_le_ih(ih) && (ih_item_len(ih) < (ih_entry_count(ih) * IH_SIZE))) {
|
||||
reiserfs_warning(NULL, "reiserfs-5093",
|
||||
"item entry count seems wrong %h",
|
||||
ih);
|
||||
return 0;
|
||||
}
|
||||
prev_location = ih_location(ih);
|
||||
}
|
||||
|
||||
|
||||
@@ -290,6 +290,15 @@ static struct dentry *ubifs_lookup(struct inode *dir, struct dentry *dentry,
|
||||
return d_splice_alias(inode, dentry);
|
||||
}
|
||||
|
||||
static int ubifs_prepare_create(struct inode *dir, struct dentry *dentry,
|
||||
struct fscrypt_name *nm)
|
||||
{
|
||||
if (fscrypt_is_nokey_name(dentry))
|
||||
return -ENOKEY;
|
||||
|
||||
return fscrypt_setup_filename(dir, &dentry->d_name, 0, nm);
|
||||
}
|
||||
|
||||
static int ubifs_create(struct inode *dir, struct dentry *dentry, umode_t mode,
|
||||
bool excl)
|
||||
{
|
||||
@@ -313,7 +322,7 @@ static int ubifs_create(struct inode *dir, struct dentry *dentry, umode_t mode,
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
err = fscrypt_setup_filename(dir, &dentry->d_name, 0, &nm);
|
||||
err = ubifs_prepare_create(dir, dentry, &nm);
|
||||
if (err)
|
||||
goto out_budg;
|
||||
|
||||
@@ -977,7 +986,7 @@ static int ubifs_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode)
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
err = fscrypt_setup_filename(dir, &dentry->d_name, 0, &nm);
|
||||
err = ubifs_prepare_create(dir, dentry, &nm);
|
||||
if (err)
|
||||
goto out_budg;
|
||||
|
||||
@@ -1062,7 +1071,7 @@ static int ubifs_mknod(struct inode *dir, struct dentry *dentry,
|
||||
return err;
|
||||
}
|
||||
|
||||
err = fscrypt_setup_filename(dir, &dentry->d_name, 0, &nm);
|
||||
err = ubifs_prepare_create(dir, dentry, &nm);
|
||||
if (err) {
|
||||
kfree(dev);
|
||||
goto out_budg;
|
||||
@@ -1146,7 +1155,7 @@ static int ubifs_symlink(struct inode *dir, struct dentry *dentry,
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
err = fscrypt_setup_filename(dir, &dentry->d_name, 0, &nm);
|
||||
err = ubifs_prepare_create(dir, dentry, &nm);
|
||||
if (err)
|
||||
goto out_budg;
|
||||
|
||||
|
||||
@@ -117,6 +117,35 @@ static inline void fscrypt_handle_d_move(struct dentry *dentry)
|
||||
dentry->d_flags &= ~DCACHE_ENCRYPTED_NAME;
|
||||
}
|
||||
|
||||
/**
|
||||
* fscrypt_is_nokey_name() - test whether a dentry is a no-key name
|
||||
* @dentry: the dentry to check
|
||||
*
|
||||
* This returns true if the dentry is a no-key dentry. A no-key dentry is a
|
||||
* dentry that was created in an encrypted directory that hasn't had its
|
||||
* encryption key added yet. Such dentries may be either positive or negative.
|
||||
*
|
||||
* When a filesystem is asked to create a new filename in an encrypted directory
|
||||
* and the new filename's dentry is a no-key dentry, it must fail the operation
|
||||
* with ENOKEY. This includes ->create(), ->mkdir(), ->mknod(), ->symlink(),
|
||||
* ->rename(), and ->link(). (However, ->rename() and ->link() are already
|
||||
* handled by fscrypt_prepare_rename() and fscrypt_prepare_link().)
|
||||
*
|
||||
* This is necessary because creating a filename requires the directory's
|
||||
* encryption key, but just checking for the key on the directory inode during
|
||||
* the final filesystem operation doesn't guarantee that the key was available
|
||||
* during the preceding dentry lookup. And the key must have already been
|
||||
* available during the dentry lookup in order for it to have been checked
|
||||
* whether the filename already exists in the directory and for the new file's
|
||||
* dentry not to be invalidated due to it incorrectly having the no-key flag.
|
||||
*
|
||||
* Return: %true if the dentry is a no-key name
|
||||
*/
|
||||
static inline bool fscrypt_is_nokey_name(const struct dentry *dentry)
|
||||
{
|
||||
return dentry->d_flags & DCACHE_ENCRYPTED_NAME;
|
||||
}
|
||||
|
||||
/* crypto.c */
|
||||
void fscrypt_enqueue_decrypt_work(struct work_struct *);
|
||||
|
||||
@@ -251,6 +280,11 @@ static inline void fscrypt_handle_d_move(struct dentry *dentry)
|
||||
{
|
||||
}
|
||||
|
||||
static inline bool fscrypt_is_nokey_name(const struct dentry *dentry)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
/* crypto.c */
|
||||
static inline void fscrypt_enqueue_decrypt_work(struct work_struct *work)
|
||||
{
|
||||
|
||||
@@ -1258,6 +1258,7 @@ static inline int of_get_available_child_count(const struct device_node *np)
|
||||
#define _OF_DECLARE(table, name, compat, fn, fn_type) \
|
||||
static const struct of_device_id __of_table_##name \
|
||||
__used __section(__##table##_of_table) \
|
||||
__aligned(__alignof__(struct of_device_id)) \
|
||||
= { .compatible = compat, \
|
||||
.data = (fn == (fn_type)NULL) ? fn : fn }
|
||||
#else
|
||||
|
||||
@@ -28,4 +28,9 @@
|
||||
#define _BITUL(x) (_UL(1) << (x))
|
||||
#define _BITULL(x) (_ULL(1) << (x))
|
||||
|
||||
#define __ALIGN_KERNEL(x, a) __ALIGN_KERNEL_MASK(x, (typeof(x))(a) - 1)
|
||||
#define __ALIGN_KERNEL_MASK(x, mask) (((x) + (mask)) & ~(mask))
|
||||
|
||||
#define __KERNEL_DIV_ROUND_UP(n, d) (((n) + (d) - 1) / (d))
|
||||
|
||||
#endif /* _UAPI_LINUX_CONST_H */
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
#ifndef _UAPI_LINUX_ETHTOOL_H
|
||||
#define _UAPI_LINUX_ETHTOOL_H
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/const.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/if_ether.h>
|
||||
|
||||
|
||||
@@ -3,13 +3,6 @@
|
||||
#define _UAPI_LINUX_KERNEL_H
|
||||
|
||||
#include <linux/sysinfo.h>
|
||||
|
||||
/*
|
||||
* 'kernel.h' contains some often-used function prototypes etc
|
||||
*/
|
||||
#define __ALIGN_KERNEL(x, a) __ALIGN_KERNEL_MASK(x, (typeof(x))(a) - 1)
|
||||
#define __ALIGN_KERNEL_MASK(x, mask) (((x) + (mask)) & ~(mask))
|
||||
|
||||
#define __KERNEL_DIV_ROUND_UP(n, d) (((n) + (d) - 1) / (d))
|
||||
#include <linux/const.h>
|
||||
|
||||
#endif /* _UAPI_LINUX_KERNEL_H */
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
#define _UAPI_LINUX_LIGHTNVM_H
|
||||
|
||||
#ifdef __KERNEL__
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/const.h>
|
||||
#include <linux/ioctl.h>
|
||||
#else /* __KERNEL__ */
|
||||
#include <stdio.h>
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
#ifndef _UAPI__LINUX_MROUTE6_H
|
||||
#define _UAPI__LINUX_MROUTE6_H
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/const.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/sockios.h>
|
||||
#include <linux/in6.h> /* For struct sockaddr_in6. */
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
|
||||
#ifndef _UAPI_X_TABLES_H
|
||||
#define _UAPI_X_TABLES_H
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/const.h>
|
||||
#include <linux/types.h>
|
||||
|
||||
#define XT_FUNCTION_MAXNAMELEN 30
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
#ifndef _UAPI__LINUX_NETLINK_H
|
||||
#define _UAPI__LINUX_NETLINK_H
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/const.h>
|
||||
#include <linux/socket.h> /* for __kernel_sa_family_t */
|
||||
#include <linux/types.h>
|
||||
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
#ifndef _UAPI_LINUX_SYSCTL_H
|
||||
#define _UAPI_LINUX_SYSCTL_H
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/const.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/compiler.h>
|
||||
|
||||
|
||||
@@ -1806,7 +1806,6 @@ static int mod_sysfs_init(struct module *mod)
|
||||
if (err)
|
||||
mod_kobject_put(mod);
|
||||
|
||||
/* delay uevent until full sysfs population */
|
||||
out:
|
||||
return err;
|
||||
}
|
||||
@@ -1843,7 +1842,6 @@ static int mod_sysfs_setup(struct module *mod,
|
||||
add_sect_attrs(mod, info);
|
||||
add_notes_attrs(mod, info);
|
||||
|
||||
kobject_uevent(&mod->mkobj.kobj, KOBJ_ADD);
|
||||
return 0;
|
||||
|
||||
out_unreg_modinfo_attrs:
|
||||
@@ -3510,6 +3508,9 @@ static noinline int do_init_module(struct module *mod)
|
||||
blocking_notifier_call_chain(&module_notify_list,
|
||||
MODULE_STATE_LIVE, mod);
|
||||
|
||||
/* Delay uevent until module has finished its init routine */
|
||||
kobject_uevent(&mod->mkobj.kobj, KOBJ_ADD);
|
||||
|
||||
/*
|
||||
* We need to finish all async code before the module init sequence
|
||||
* is done. This has potential to deadlock. For example, a newly
|
||||
@@ -3852,6 +3853,7 @@ static int load_module(struct load_info *info, const char __user *uargs,
|
||||
MODULE_STATE_GOING, mod);
|
||||
klp_module_going(mod);
|
||||
bug_cleanup:
|
||||
mod->state = MODULE_STATE_GOING;
|
||||
/* module_bug_cleanup needs module_mutex protection */
|
||||
mutex_lock(&module_mutex);
|
||||
module_bug_cleanup(mod);
|
||||
|
||||
@@ -753,8 +753,13 @@ static int snd_pcm_hw_params(struct snd_pcm_substream *substream,
|
||||
runtime->boundary *= 2;
|
||||
|
||||
/* clear the buffer for avoiding possible kernel info leaks */
|
||||
if (runtime->dma_area && !substream->ops->copy_user)
|
||||
memset(runtime->dma_area, 0, runtime->dma_bytes);
|
||||
if (runtime->dma_area && !substream->ops->copy_user) {
|
||||
size_t size = runtime->dma_bytes;
|
||||
|
||||
if (runtime->info & SNDRV_PCM_INFO_MMAP)
|
||||
size = PAGE_ALIGN(size);
|
||||
memset(runtime->dma_area, 0, size);
|
||||
}
|
||||
|
||||
snd_pcm_timer_resolution_change(substream);
|
||||
snd_pcm_set_state(substream, SNDRV_PCM_STATE_SETUP);
|
||||
|
||||
@@ -87,11 +87,21 @@ static inline unsigned short snd_rawmidi_file_flags(struct file *file)
|
||||
}
|
||||
}
|
||||
|
||||
static inline int snd_rawmidi_ready(struct snd_rawmidi_substream *substream)
|
||||
static inline bool __snd_rawmidi_ready(struct snd_rawmidi_runtime *runtime)
|
||||
{
|
||||
return runtime->avail >= runtime->avail_min;
|
||||
}
|
||||
|
||||
static bool snd_rawmidi_ready(struct snd_rawmidi_substream *substream)
|
||||
{
|
||||
struct snd_rawmidi_runtime *runtime = substream->runtime;
|
||||
unsigned long flags;
|
||||
bool ready;
|
||||
|
||||
return runtime->avail >= runtime->avail_min;
|
||||
spin_lock_irqsave(&runtime->lock, flags);
|
||||
ready = __snd_rawmidi_ready(runtime);
|
||||
spin_unlock_irqrestore(&runtime->lock, flags);
|
||||
return ready;
|
||||
}
|
||||
|
||||
static inline int snd_rawmidi_ready_append(struct snd_rawmidi_substream *substream,
|
||||
@@ -960,7 +970,7 @@ int snd_rawmidi_receive(struct snd_rawmidi_substream *substream,
|
||||
if (result > 0) {
|
||||
if (runtime->event)
|
||||
schedule_work(&runtime->event_work);
|
||||
else if (snd_rawmidi_ready(substream))
|
||||
else if (__snd_rawmidi_ready(runtime))
|
||||
wake_up(&runtime->sleep);
|
||||
}
|
||||
spin_unlock_irqrestore(&runtime->lock, flags);
|
||||
@@ -1039,7 +1049,7 @@ static ssize_t snd_rawmidi_read(struct file *file, char __user *buf, size_t coun
|
||||
result = 0;
|
||||
while (count > 0) {
|
||||
spin_lock_irq(&runtime->lock);
|
||||
while (!snd_rawmidi_ready(substream)) {
|
||||
while (!__snd_rawmidi_ready(runtime)) {
|
||||
wait_queue_entry_t wait;
|
||||
|
||||
if ((file->f_flags & O_NONBLOCK) != 0 || result > 0) {
|
||||
@@ -1056,9 +1066,11 @@ static ssize_t snd_rawmidi_read(struct file *file, char __user *buf, size_t coun
|
||||
return -ENODEV;
|
||||
if (signal_pending(current))
|
||||
return result > 0 ? result : -ERESTARTSYS;
|
||||
if (!runtime->avail)
|
||||
return result > 0 ? result : -EIO;
|
||||
spin_lock_irq(&runtime->lock);
|
||||
if (!runtime->avail) {
|
||||
spin_unlock_irq(&runtime->lock);
|
||||
return result > 0 ? result : -EIO;
|
||||
}
|
||||
}
|
||||
spin_unlock_irq(&runtime->lock);
|
||||
count1 = snd_rawmidi_kernel_read1(substream,
|
||||
@@ -1196,7 +1208,7 @@ int __snd_rawmidi_transmit_ack(struct snd_rawmidi_substream *substream, int coun
|
||||
runtime->avail += count;
|
||||
substream->bytes += count;
|
||||
if (count > 0) {
|
||||
if (runtime->drain || snd_rawmidi_ready(substream))
|
||||
if (runtime->drain || __snd_rawmidi_ready(runtime))
|
||||
wake_up(&runtime->sleep);
|
||||
}
|
||||
return count;
|
||||
@@ -1363,9 +1375,11 @@ static ssize_t snd_rawmidi_write(struct file *file, const char __user *buf,
|
||||
return -ENODEV;
|
||||
if (signal_pending(current))
|
||||
return result > 0 ? result : -ERESTARTSYS;
|
||||
if (!runtime->avail && !timeout)
|
||||
return result > 0 ? result : -EIO;
|
||||
spin_lock_irq(&runtime->lock);
|
||||
if (!runtime->avail && !timeout) {
|
||||
spin_unlock_irq(&runtime->lock);
|
||||
return result > 0 ? result : -EIO;
|
||||
}
|
||||
}
|
||||
spin_unlock_irq(&runtime->lock);
|
||||
count1 = snd_rawmidi_kernel_write1(substream, buf, NULL, count);
|
||||
@@ -1445,6 +1459,7 @@ static void snd_rawmidi_proc_info_read(struct snd_info_entry *entry,
|
||||
struct snd_rawmidi *rmidi;
|
||||
struct snd_rawmidi_substream *substream;
|
||||
struct snd_rawmidi_runtime *runtime;
|
||||
unsigned long buffer_size, avail, xruns;
|
||||
|
||||
rmidi = entry->private_data;
|
||||
snd_iprintf(buffer, "%s\n\n", rmidi->name);
|
||||
@@ -1463,13 +1478,16 @@ static void snd_rawmidi_proc_info_read(struct snd_info_entry *entry,
|
||||
" Owner PID : %d\n",
|
||||
pid_vnr(substream->pid));
|
||||
runtime = substream->runtime;
|
||||
spin_lock_irq(&runtime->lock);
|
||||
buffer_size = runtime->buffer_size;
|
||||
avail = runtime->avail;
|
||||
spin_unlock_irq(&runtime->lock);
|
||||
snd_iprintf(buffer,
|
||||
" Mode : %s\n"
|
||||
" Buffer size : %lu\n"
|
||||
" Avail : %lu\n",
|
||||
runtime->oss ? "OSS compatible" : "native",
|
||||
(unsigned long) runtime->buffer_size,
|
||||
(unsigned long) runtime->avail);
|
||||
buffer_size, avail);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1487,13 +1505,16 @@ static void snd_rawmidi_proc_info_read(struct snd_info_entry *entry,
|
||||
" Owner PID : %d\n",
|
||||
pid_vnr(substream->pid));
|
||||
runtime = substream->runtime;
|
||||
spin_lock_irq(&runtime->lock);
|
||||
buffer_size = runtime->buffer_size;
|
||||
avail = runtime->avail;
|
||||
xruns = runtime->xruns;
|
||||
spin_unlock_irq(&runtime->lock);
|
||||
snd_iprintf(buffer,
|
||||
" Buffer size : %lu\n"
|
||||
" Avail : %lu\n"
|
||||
" Overruns : %lu\n",
|
||||
(unsigned long) runtime->buffer_size,
|
||||
(unsigned long) runtime->avail,
|
||||
(unsigned long) runtime->xruns);
|
||||
buffer_size, avail, xruns);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -40,10 +40,10 @@ struct snd_seq_queue {
|
||||
|
||||
struct snd_seq_timer *timer; /* time keeper for this queue */
|
||||
int owner; /* client that 'owns' the timer */
|
||||
unsigned int locked:1, /* timer is only accesibble by owner if set */
|
||||
klocked:1, /* kernel lock (after START) */
|
||||
check_again:1,
|
||||
check_blocked:1;
|
||||
bool locked; /* timer is only accesibble by owner if set */
|
||||
bool klocked; /* kernel lock (after START) */
|
||||
bool check_again; /* concurrent access happened during check */
|
||||
bool check_blocked; /* queue being checked */
|
||||
|
||||
unsigned int flags; /* status flags */
|
||||
unsigned int info_flags; /* info for sync */
|
||||
|
||||
Reference in New Issue
Block a user