mirror of
https://github.com/hardkernel/linux.git
synced 2026-03-24 19:40:21 +09:00
Merge 5.15.133 into android14-5.15-lts
Changes in 5.15.133 autofs: fix memory leak of waitqueues in autofs_catatonic_mode btrfs: output extra debug info if we failed to find an inline backref locks: fix KASAN: use-after-free in trace_event_raw_event_filelock_lock ACPICA: Add AML_NO_OPERAND_RESOLVE flag to Timer kernel/fork: beware of __put_task_struct() calling context rcuscale: Move rcu_scale_writer() schedule_timeout_uninterruptible() to _idle() scftorture: Forgive memory-allocation failure if KASAN ACPI: video: Add backlight=native DMI quirk for Lenovo Ideapad Z470 perf/smmuv3: Enable HiSilicon Erratum 162001900 quirk for HIP08/09 perf/imx_ddr: speed up overflow frequency of cycle hw_breakpoint: fix single-stepping when using bpf_overflow_handler ACPI: x86: s2idle: Catch multiple ACPI_TYPE_PACKAGE objects devlink: remove reload failed checks in params get/set callbacks crypto: lrw,xts - Replace strlcpy with strscpy wifi: ath9k: fix fortify warnings wifi: ath9k: fix printk specifier wifi: mwifiex: fix fortify warning wifi: wil6210: fix fortify warnings crypto: lib/mpi - avoid null pointer deref in mpi_cmp_ui() tpm_tis: Resend command to recover from data transfer errors mmc: sdhci-esdhc-imx: improve ESDHC_FLAG_ERR010450 alx: fix OOB-read compiler warning wifi: mac80211: check S1G action frame size netfilter: ebtables: fix fortify warnings in size_entry_mwt() wifi: mac80211_hwsim: drop short frames drm/bridge: tc358762: Instruct DSI host to generate HSE packets arm64: dts: qcom: sm6125-pdx201: correct ramoops pmsg-size arm64: dts: qcom: sm8150-kumano: correct ramoops pmsg-size arm64: dts: qcom: sm8250-edo: correct ramoops pmsg-size samples/hw_breakpoint: Fix kernel BUG 'invalid opcode: 0000' ALSA: hda: intel-dsp-cfg: add LunarLake support drm/amd/display: Blocking invalid 420 modes on HDMI TMDS for DCN31 drm/exynos: fix a possible null-pointer dereference due to data race in exynos_drm_crtc_atomic_disable() bus: ti-sysc: Configure uart quirks for k3 SoC md: raid1: fix potential OOB in raid1_remove_disk() ext2: fix datatype of block number in ext2_xattr_set2() fs/jfs: prevent double-free in dbUnmount() after failed jfs_remount() jfs: fix invalid free of JFS_IP(ipimap)->i_imap in diUnmount ARM: 9317/1: kexec: Make smp stop calls asynchronous powerpc/pseries: fix possible memory leak in ibmebus_bus_init() PCI: fu740: Set the number of MSI vectors media: dvb-usb-v2: af9035: Fix null-ptr-deref in af9035_i2c_master_xfer media: dw2102: Fix null-ptr-deref in dw2102_i2c_transfer() media: af9005: Fix null-ptr-deref in af9005_i2c_xfer media: anysee: fix null-ptr-deref in anysee_master_xfer media: az6007: Fix null-ptr-deref in az6007_i2c_xfer() media: dvb-usb-v2: gl861: Fix null-ptr-deref in gl861_i2c_master_xfer media: tuners: qt1010: replace BUG_ON with a regular error media: pci: cx23885: replace BUG with error return usb: cdns3: Put the cdns set active part outside the spin lock usb: gadget: fsl_qe_udc: validate endpoint index for ch9 udc tools: iio: iio_generic_buffer: Fix some integer type and calculation scsi: target: iscsi: Fix buffer overflow in lio_target_nacl_info_show() serial: cpm_uart: Avoid suspicious locking usb: ehci: add workaround for chipidea PORTSC.PEC bug media: pci: ipu3-cio2: Initialise timing struct to avoid a compiler warning kobject: Add sanity check for kset->kobj.ktype in kset_register() interconnect: Fix locking for runpm vs reclaim printk: Consolidate console deferred printing jbd2: refactor wait logic for transaction updates into a common function jbd2: fix use-after-free of transaction_t race jbd2: kill t_handle_lock transaction spinlock jbd2: rename jbd_debug() to jbd2_debug() jbd2: correct the end of the journal recovery scan range mtd: rawnand: brcmnand: Allow SoC to provide I/O operations mtd: rawnand: brcmnand: Fix ECC level field setting for v7.2 controller MIPS: Use "grep -E" instead of "egrep" perf test: Remove bash construct from stat_bpf_counters.sh test perf test shell stat_bpf_counters: Fix test on Intel btrfs: move btrfs_pinned_by_swapfile prototype into volumes.h btrfs: add a helper to read the superblock metadata_uuid btrfs: compare the correct fsid/metadata_uuid in btrfs_validate_super drm: gm12u320: Fix the timeout usage for usb_bulk_msg() scsi: qla2xxx: Fix NULL vs IS_ERR() bug for debugfs_create_dir() selftests: tracing: Fix to unmount tracefs for recovering environment scsi: lpfc: Fix the NULL vs IS_ERR() bug for debugfs_create_file() x86/boot/compressed: Reserve more memory for page tables x86/purgatory: Remove LTO flags samples/hw_breakpoint: fix building without module unloading md/raid1: fix error: ISO C90 forbids mixed declarations attr: block mode changes of symlinks ovl: fix failed copyup of fileattr on a symlink ovl: fix incorrect fdput() on aio completion btrfs: fix lockdep splat and potential deadlock after failure running delayed items btrfs: release path before inode lookup during the ino lookup ioctl tracing: Have tracing_max_latency inc the trace array ref count tracing: Have current_trace inc the trace array ref count tracing: Have option files inc the trace array ref count nfsd: fix change_info in NFSv4 RENAME replies tracefs: Add missing lockdown check to tracefs_create_dir() i2c: aspeed: Reset the i2c controller when timeout occurs ata: libata: disallow dev-initiated LPM transitions to unsupported states scsi: megaraid_sas: Fix deadlock on firmware crashdump scsi: pm8001: Setup IRQs on resume ext4: fix rec_len verify error drm/amd/display: fix the white screen issue when >= 64GB DRAM drm/amdgpu: fix amdgpu_cs_p1_user_fence net/sched: Retire rsvp classifier drm/amd/display: enable cursor degamma for DCN3+ DRM legacy gamma interconnect: Teach lockdep about icc_bw_lock order Linux 5.15.133 Change-Id: I03d7854224db40c8bf307006818a069b1af22fad Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
This commit is contained in:
@@ -174,6 +174,9 @@ stable kernels.
|
||||
+----------------+-----------------+-----------------+-----------------------------+
|
||||
| Hisilicon | Hip08 SMMU PMCG | #162001800 | N/A |
|
||||
+----------------+-----------------+-----------------+-----------------------------+
|
||||
| Hisilicon | Hip08 SMMU PMCG | #162001900 | N/A |
|
||||
| | Hip09 SMMU PMCG | | |
|
||||
+----------------+-----------------+-----------------+-----------------------------+
|
||||
+----------------+-----------------+-----------------+-----------------------------+
|
||||
| Qualcomm Tech. | Kryo/Falkor v1 | E1003 | QCOM_FALKOR_ERRATUM_1003 |
|
||||
+----------------+-----------------+-----------------+-----------------------------+
|
||||
|
||||
2
Makefile
2
Makefile
@@ -1,7 +1,7 @@
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
VERSION = 5
|
||||
PATCHLEVEL = 15
|
||||
SUBLEVEL = 132
|
||||
SUBLEVEL = 133
|
||||
EXTRAVERSION =
|
||||
NAME = Trick or Treat
|
||||
|
||||
|
||||
@@ -626,7 +626,7 @@ int hw_breakpoint_arch_parse(struct perf_event *bp,
|
||||
hw->address &= ~alignment_mask;
|
||||
hw->ctrl.len <<= offset;
|
||||
|
||||
if (is_default_overflow_handler(bp)) {
|
||||
if (uses_default_overflow_handler(bp)) {
|
||||
/*
|
||||
* Mismatch breakpoints are required for single-stepping
|
||||
* breakpoints.
|
||||
@@ -798,7 +798,7 @@ static void watchpoint_handler(unsigned long addr, unsigned int fsr,
|
||||
* Otherwise, insert a temporary mismatch breakpoint so that
|
||||
* we can single-step over the watchpoint trigger.
|
||||
*/
|
||||
if (!is_default_overflow_handler(wp))
|
||||
if (!uses_default_overflow_handler(wp))
|
||||
continue;
|
||||
step:
|
||||
enable_single_step(wp, instruction_pointer(regs));
|
||||
@@ -811,7 +811,7 @@ step:
|
||||
info->trigger = addr;
|
||||
pr_debug("watchpoint fired: address = 0x%x\n", info->trigger);
|
||||
perf_bp_event(wp, regs);
|
||||
if (is_default_overflow_handler(wp))
|
||||
if (uses_default_overflow_handler(wp))
|
||||
enable_single_step(wp, instruction_pointer(regs));
|
||||
}
|
||||
|
||||
@@ -886,7 +886,7 @@ static void breakpoint_handler(unsigned long unknown, struct pt_regs *regs)
|
||||
info->trigger = addr;
|
||||
pr_debug("breakpoint fired: address = 0x%x\n", addr);
|
||||
perf_bp_event(bp, regs);
|
||||
if (is_default_overflow_handler(bp))
|
||||
if (uses_default_overflow_handler(bp))
|
||||
enable_single_step(bp, addr);
|
||||
goto unlock;
|
||||
}
|
||||
|
||||
@@ -92,16 +92,28 @@ void machine_crash_nonpanic_core(void *unused)
|
||||
}
|
||||
}
|
||||
|
||||
static DEFINE_PER_CPU(call_single_data_t, cpu_stop_csd) =
|
||||
CSD_INIT(machine_crash_nonpanic_core, NULL);
|
||||
|
||||
void crash_smp_send_stop(void)
|
||||
{
|
||||
static int cpus_stopped;
|
||||
unsigned long msecs;
|
||||
call_single_data_t *csd;
|
||||
int cpu, this_cpu = raw_smp_processor_id();
|
||||
|
||||
if (cpus_stopped)
|
||||
return;
|
||||
|
||||
atomic_set(&waiting_for_crash_ipi, num_online_cpus() - 1);
|
||||
smp_call_function(machine_crash_nonpanic_core, NULL, false);
|
||||
for_each_online_cpu(cpu) {
|
||||
if (cpu == this_cpu)
|
||||
continue;
|
||||
|
||||
csd = &per_cpu(cpu_stop_csd, cpu);
|
||||
smp_call_function_single_async(cpu, csd);
|
||||
}
|
||||
|
||||
msecs = 1000; /* Wait at most a second for the other cpus to stop */
|
||||
while ((atomic_read(&waiting_for_crash_ipi) > 0) && msecs) {
|
||||
mdelay(1);
|
||||
|
||||
@@ -74,7 +74,7 @@
|
||||
reg = <0x0 0xffc40000 0x0 0xc0000>;
|
||||
record-size = <0x1000>;
|
||||
console-size = <0x40000>;
|
||||
msg-size = <0x20000 0x20000>;
|
||||
pmsg-size = <0x20000>;
|
||||
};
|
||||
|
||||
cmdline_mem: memory@ffd00000 {
|
||||
|
||||
@@ -127,7 +127,7 @@
|
||||
reg = <0x0 0xffc00000 0x0 0x100000>;
|
||||
record-size = <0x1000>;
|
||||
console-size = <0x40000>;
|
||||
msg-size = <0x20000 0x20000>;
|
||||
pmsg-size = <0x20000>;
|
||||
ecc-size = <16>;
|
||||
no-map;
|
||||
};
|
||||
|
||||
@@ -126,7 +126,7 @@
|
||||
reg = <0x0 0xffc00000 0x0 0x100000>;
|
||||
record-size = <0x1000>;
|
||||
console-size = <0x40000>;
|
||||
msg-size = <0x20000 0x20000>;
|
||||
pmsg-size = <0x20000>;
|
||||
ecc-size = <16>;
|
||||
no-map;
|
||||
};
|
||||
|
||||
@@ -654,7 +654,7 @@ static int breakpoint_handler(unsigned long unused, unsigned long esr,
|
||||
perf_bp_event(bp, regs);
|
||||
|
||||
/* Do we need to handle the stepping? */
|
||||
if (is_default_overflow_handler(bp))
|
||||
if (uses_default_overflow_handler(bp))
|
||||
step = 1;
|
||||
unlock:
|
||||
rcu_read_unlock();
|
||||
@@ -733,7 +733,7 @@ static u64 get_distance_from_watchpoint(unsigned long addr, u64 val,
|
||||
static int watchpoint_report(struct perf_event *wp, unsigned long addr,
|
||||
struct pt_regs *regs)
|
||||
{
|
||||
int step = is_default_overflow_handler(wp);
|
||||
int step = uses_default_overflow_handler(wp);
|
||||
struct arch_hw_breakpoint *info = counter_arch_bp(wp);
|
||||
|
||||
info->trigger = addr;
|
||||
|
||||
@@ -323,7 +323,7 @@ KBUILD_LDFLAGS += -m $(ld-emul)
|
||||
|
||||
ifdef need-compiler
|
||||
CHECKFLAGS += $(shell $(CC) $(KBUILD_CFLAGS) -dM -E -x c /dev/null | \
|
||||
egrep -vw '__GNUC_(MINOR_|PATCHLEVEL_)?_' | \
|
||||
grep -E -vw '__GNUC_(MINOR_|PATCHLEVEL_)?_' | \
|
||||
sed -e "s/^\#define /-D'/" -e "s/ /'='/" -e "s/$$/'/" -e 's/\$$/&&/g')
|
||||
endif
|
||||
|
||||
|
||||
@@ -68,7 +68,7 @@ KCOV_INSTRUMENT := n
|
||||
|
||||
# Check that we don't have PIC 'jalr t9' calls left
|
||||
quiet_cmd_vdso_mips_check = VDSOCHK $@
|
||||
cmd_vdso_mips_check = if $(OBJDUMP) --disassemble $@ | egrep -h "jalr.*t9" > /dev/null; \
|
||||
cmd_vdso_mips_check = if $(OBJDUMP) --disassemble $@ | grep -E -h "jalr.*t9" > /dev/null; \
|
||||
then (echo >&2 "$@: PIC 'jalr t9' calls are not supported"; \
|
||||
rm -f $@; /bin/false); fi
|
||||
|
||||
|
||||
@@ -451,6 +451,7 @@ static int __init ibmebus_bus_init(void)
|
||||
if (err) {
|
||||
printk(KERN_WARNING "%s: device_register returned %i\n",
|
||||
__func__, err);
|
||||
put_device(&ibmebus_bus_device);
|
||||
bus_unregister(&ibmebus_bus_type);
|
||||
|
||||
return err;
|
||||
|
||||
@@ -67,6 +67,14 @@ static void *alloc_pgt_page(void *context)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Consumed more tables than expected? */
|
||||
if (pages->pgt_buf_offset == BOOT_PGT_SIZE_WARN) {
|
||||
debug_putstr("pgt_buf running low in " __FILE__ "\n");
|
||||
debug_putstr("Need to raise BOOT_PGT_SIZE?\n");
|
||||
debug_putaddr(pages->pgt_buf_offset);
|
||||
debug_putaddr(pages->pgt_buf_size);
|
||||
}
|
||||
|
||||
entry = pages->pgt_buf + pages->pgt_buf_offset;
|
||||
pages->pgt_buf_offset += PAGE_SIZE;
|
||||
|
||||
|
||||
@@ -40,23 +40,40 @@
|
||||
#ifdef CONFIG_X86_64
|
||||
# define BOOT_STACK_SIZE 0x4000
|
||||
|
||||
# define BOOT_INIT_PGT_SIZE (6*4096)
|
||||
# ifdef CONFIG_RANDOMIZE_BASE
|
||||
/*
|
||||
* Assuming all cross the 512GB boundary:
|
||||
* 1 page for level4
|
||||
* (2+2)*4 pages for kernel, param, cmd_line, and randomized kernel
|
||||
* 2 pages for first 2M (video RAM: CONFIG_X86_VERBOSE_BOOTUP).
|
||||
* Total is 19 pages.
|
||||
* Used by decompressor's startup_32() to allocate page tables for identity
|
||||
* mapping of the 4G of RAM in 4-level paging mode:
|
||||
* - 1 level4 table;
|
||||
* - 1 level3 table;
|
||||
* - 4 level2 table that maps everything with 2M pages;
|
||||
*
|
||||
* The additional level5 table needed for 5-level paging is allocated from
|
||||
* trampoline_32bit memory.
|
||||
*/
|
||||
# ifdef CONFIG_X86_VERBOSE_BOOTUP
|
||||
# define BOOT_PGT_SIZE (19*4096)
|
||||
# else /* !CONFIG_X86_VERBOSE_BOOTUP */
|
||||
# define BOOT_PGT_SIZE (17*4096)
|
||||
# endif
|
||||
# else /* !CONFIG_RANDOMIZE_BASE */
|
||||
# define BOOT_PGT_SIZE BOOT_INIT_PGT_SIZE
|
||||
# endif
|
||||
# define BOOT_INIT_PGT_SIZE (6*4096)
|
||||
|
||||
/*
|
||||
* Total number of page tables kernel_add_identity_map() can allocate,
|
||||
* including page tables consumed by startup_32().
|
||||
*
|
||||
* Worst-case scenario:
|
||||
* - 5-level paging needs 1 level5 table;
|
||||
* - KASLR needs to map kernel, boot_params, cmdline and randomized kernel,
|
||||
* assuming all of them cross 256T boundary:
|
||||
* + 4*2 level4 table;
|
||||
* + 4*2 level3 table;
|
||||
* + 4*2 level2 table;
|
||||
* - X86_VERBOSE_BOOTUP needs to map the first 2M (video RAM):
|
||||
* + 1 level4 table;
|
||||
* + 1 level3 table;
|
||||
* + 1 level2 table;
|
||||
* Total: 28 tables
|
||||
*
|
||||
* Add 4 spare table in case decompressor touches anything beyond what is
|
||||
* accounted above. Warn if it happens.
|
||||
*/
|
||||
# define BOOT_PGT_SIZE_WARN (28*4096)
|
||||
# define BOOT_PGT_SIZE (32*4096)
|
||||
|
||||
#else /* !CONFIG_X86_64 */
|
||||
# define BOOT_STACK_SIZE 0x1000
|
||||
|
||||
@@ -19,6 +19,10 @@ CFLAGS_sha256.o := -D__DISABLE_EXPORTS
|
||||
# optimization flags.
|
||||
KBUILD_CFLAGS := $(filter-out -fprofile-sample-use=% -fprofile-use=%,$(KBUILD_CFLAGS))
|
||||
|
||||
# When LTO is enabled, llvm emits many text sections, which is not supported
|
||||
# by kexec. Remove -flto=* flags.
|
||||
KBUILD_CFLAGS := $(filter-out $(CC_FLAGS_LTO),$(KBUILD_CFLAGS))
|
||||
|
||||
# When linking purgatory.ro with -r unresolved symbols are not checked,
|
||||
# also link a purgatory.chk binary without -r to check for unresolved symbols.
|
||||
PURGATORY_LDFLAGS := -e purgatory_start -nostdlib -z nodefaultlib
|
||||
|
||||
@@ -357,10 +357,10 @@ static int lrw_create(struct crypto_template *tmpl, struct rtattr **tb)
|
||||
* cipher name.
|
||||
*/
|
||||
if (!strncmp(cipher_name, "ecb(", 4)) {
|
||||
unsigned len;
|
||||
int len;
|
||||
|
||||
len = strlcpy(ecb_name, cipher_name + 4, sizeof(ecb_name));
|
||||
if (len < 2 || len >= sizeof(ecb_name))
|
||||
len = strscpy(ecb_name, cipher_name + 4, sizeof(ecb_name));
|
||||
if (len < 2)
|
||||
goto err_free_inst;
|
||||
|
||||
if (ecb_name[len - 1] != ')')
|
||||
|
||||
@@ -396,10 +396,10 @@ static int xts_create(struct crypto_template *tmpl, struct rtattr **tb)
|
||||
* cipher name.
|
||||
*/
|
||||
if (!strncmp(cipher_name, "ecb(", 4)) {
|
||||
unsigned len;
|
||||
int len;
|
||||
|
||||
len = strlcpy(ctx->name, cipher_name + 4, sizeof(ctx->name));
|
||||
if (len < 2 || len >= sizeof(ctx->name))
|
||||
len = strscpy(ctx->name, cipher_name + 4, sizeof(ctx->name));
|
||||
if (len < 2)
|
||||
goto err_free_inst;
|
||||
|
||||
if (ctx->name[len - 1] != ')')
|
||||
|
||||
@@ -603,7 +603,7 @@ const struct acpi_opcode_info acpi_gbl_aml_op_info[AML_NUM_OPCODES] = {
|
||||
|
||||
/* 7E */ ACPI_OP("Timer", ARGP_TIMER_OP, ARGI_TIMER_OP, ACPI_TYPE_ANY,
|
||||
AML_CLASS_EXECUTE, AML_TYPE_EXEC_0A_0T_1R,
|
||||
AML_FLAGS_EXEC_0A_0T_1R),
|
||||
AML_FLAGS_EXEC_0A_0T_1R | AML_NO_OPERAND_RESOLVE),
|
||||
|
||||
/* ACPI 5.0 opcodes */
|
||||
|
||||
|
||||
@@ -1381,7 +1381,10 @@ static void __init arm_smmu_v3_pmcg_init_resources(struct resource *res,
|
||||
static struct acpi_platform_list pmcg_plat_info[] __initdata = {
|
||||
/* HiSilicon Hip08 Platform */
|
||||
{"HISI ", "HIP08 ", 0, ACPI_SIG_IORT, greater_than_or_equal,
|
||||
"Erratum #162001800", IORT_SMMU_V3_PMCG_HISI_HIP08},
|
||||
"Erratum #162001800, Erratum #162001900", IORT_SMMU_V3_PMCG_HISI_HIP08},
|
||||
/* HiSilicon Hip09 Platform */
|
||||
{"HISI ", "HIP09 ", 0, ACPI_SIG_IORT, greater_than_or_equal,
|
||||
"Erratum #162001900", IORT_SMMU_V3_PMCG_HISI_HIP09},
|
||||
{ }
|
||||
};
|
||||
|
||||
|
||||
@@ -307,6 +307,15 @@ static const struct dmi_system_id video_detect_dmi_table[] = {
|
||||
DMI_MATCH(DMI_BOARD_NAME, "Lenovo IdeaPad S405"),
|
||||
},
|
||||
},
|
||||
{
|
||||
/* https://bugzilla.suse.com/show_bug.cgi?id=1208724 */
|
||||
.callback = video_detect_force_native,
|
||||
/* Lenovo Ideapad Z470 */
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
|
||||
DMI_MATCH(DMI_PRODUCT_VERSION, "IdeaPad Z470"),
|
||||
},
|
||||
},
|
||||
{
|
||||
/* https://bugzilla.redhat.com/show_bug.cgi?id=1187004 */
|
||||
.callback = video_detect_force_native,
|
||||
|
||||
@@ -111,6 +111,12 @@ static void lpi_device_get_constraints_amd(void)
|
||||
union acpi_object *package = &out_obj->package.elements[i];
|
||||
|
||||
if (package->type == ACPI_TYPE_PACKAGE) {
|
||||
if (lpi_constraints_table) {
|
||||
acpi_handle_err(lps0_device_handle,
|
||||
"Duplicate constraints list\n");
|
||||
goto free_acpi_buffer;
|
||||
}
|
||||
|
||||
lpi_constraints_table = kcalloc(package->package.count,
|
||||
sizeof(*lpi_constraints_table),
|
||||
GFP_KERNEL);
|
||||
|
||||
@@ -1886,6 +1886,15 @@ static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
|
||||
else
|
||||
dev_info(&pdev->dev, "SSS flag set, parallel bus scan disabled\n");
|
||||
|
||||
if (!(hpriv->cap & HOST_CAP_PART))
|
||||
host->flags |= ATA_HOST_NO_PART;
|
||||
|
||||
if (!(hpriv->cap & HOST_CAP_SSC))
|
||||
host->flags |= ATA_HOST_NO_SSC;
|
||||
|
||||
if (!(hpriv->cap2 & HOST_CAP2_SDS))
|
||||
host->flags |= ATA_HOST_NO_DEVSLP;
|
||||
|
||||
if (pi.flags & ATA_FLAG_EM)
|
||||
ahci_reset_em(host);
|
||||
|
||||
|
||||
@@ -394,10 +394,23 @@ int sata_link_scr_lpm(struct ata_link *link, enum ata_lpm_policy policy,
|
||||
case ATA_LPM_MED_POWER_WITH_DIPM:
|
||||
case ATA_LPM_MIN_POWER_WITH_PARTIAL:
|
||||
case ATA_LPM_MIN_POWER:
|
||||
if (ata_link_nr_enabled(link) > 0)
|
||||
/* no restrictions on LPM transitions */
|
||||
if (ata_link_nr_enabled(link) > 0) {
|
||||
/* assume no restrictions on LPM transitions */
|
||||
scontrol &= ~(0x7 << 8);
|
||||
else {
|
||||
|
||||
/*
|
||||
* If the controller does not support partial, slumber,
|
||||
* or devsleep, then disallow these transitions.
|
||||
*/
|
||||
if (link->ap->host->flags & ATA_HOST_NO_PART)
|
||||
scontrol |= (0x1 << 8);
|
||||
|
||||
if (link->ap->host->flags & ATA_HOST_NO_SSC)
|
||||
scontrol |= (0x2 << 8);
|
||||
|
||||
if (link->ap->host->flags & ATA_HOST_NO_DEVSLP)
|
||||
scontrol |= (0x4 << 8);
|
||||
} else {
|
||||
/* empty port, power off */
|
||||
scontrol &= ~0xf;
|
||||
scontrol |= (0x1 << 2);
|
||||
|
||||
@@ -1504,6 +1504,8 @@ static const struct sysc_revision_quirk sysc_revision_quirks[] = {
|
||||
SYSC_QUIRK_SWSUP_SIDLE | SYSC_QUIRK_LEGACY_IDLE),
|
||||
SYSC_QUIRK("uart", 0, 0x50, 0x54, 0x58, 0x47422e03, 0xffffffff,
|
||||
SYSC_QUIRK_SWSUP_SIDLE | SYSC_QUIRK_LEGACY_IDLE),
|
||||
SYSC_QUIRK("uart", 0, 0x50, 0x54, 0x58, 0x47424e03, 0xffffffff,
|
||||
SYSC_QUIRK_SWSUP_SIDLE | SYSC_QUIRK_LEGACY_IDLE),
|
||||
|
||||
/* Quirks that need to be set based on the module address */
|
||||
SYSC_QUIRK("mcpdm", 0x40132000, 0, 0x10, -ENODEV, 0x50000800, 0xffffffff,
|
||||
|
||||
@@ -469,10 +469,17 @@ static int tpm_tis_send_main(struct tpm_chip *chip, const u8 *buf, size_t len)
|
||||
int rc;
|
||||
u32 ordinal;
|
||||
unsigned long dur;
|
||||
unsigned int try;
|
||||
|
||||
rc = tpm_tis_send_data(chip, buf, len);
|
||||
if (rc < 0)
|
||||
return rc;
|
||||
for (try = 0; try < TPM_RETRY; try++) {
|
||||
rc = tpm_tis_send_data(chip, buf, len);
|
||||
if (rc >= 0)
|
||||
/* Data transfer done successfully */
|
||||
break;
|
||||
else if (rc != -EIO)
|
||||
/* Data transfer failed, not recoverable */
|
||||
return rc;
|
||||
}
|
||||
|
||||
/* go and do it */
|
||||
rc = tpm_tis_write8(priv, TPM_STS(priv->locality), TPM_STS_GO);
|
||||
|
||||
@@ -45,7 +45,6 @@ static int amdgpu_cs_user_fence_chunk(struct amdgpu_cs_parser *p,
|
||||
struct drm_gem_object *gobj;
|
||||
struct amdgpu_bo *bo;
|
||||
unsigned long size;
|
||||
int r;
|
||||
|
||||
gobj = drm_gem_object_lookup(p->filp, data->handle);
|
||||
if (gobj == NULL)
|
||||
@@ -60,23 +59,14 @@ static int amdgpu_cs_user_fence_chunk(struct amdgpu_cs_parser *p,
|
||||
drm_gem_object_put(gobj);
|
||||
|
||||
size = amdgpu_bo_size(bo);
|
||||
if (size != PAGE_SIZE || (data->offset + 8) > size) {
|
||||
r = -EINVAL;
|
||||
goto error_unref;
|
||||
}
|
||||
if (size != PAGE_SIZE || data->offset > (size - 8))
|
||||
return -EINVAL;
|
||||
|
||||
if (amdgpu_ttm_tt_get_usermm(bo->tbo.ttm)) {
|
||||
r = -EINVAL;
|
||||
goto error_unref;
|
||||
}
|
||||
if (amdgpu_ttm_tt_get_usermm(bo->tbo.ttm))
|
||||
return -EINVAL;
|
||||
|
||||
*offset = data->offset;
|
||||
|
||||
return 0;
|
||||
|
||||
error_unref:
|
||||
amdgpu_bo_unref(&bo);
|
||||
return r;
|
||||
}
|
||||
|
||||
static int amdgpu_cs_bo_handles_chunk(struct amdgpu_cs_parser *p,
|
||||
|
||||
@@ -1204,11 +1204,15 @@ static void mmhub_read_system_context(struct amdgpu_device *adev, struct dc_phy_
|
||||
agp_top = adev->gmc.agp_end >> 24;
|
||||
|
||||
|
||||
page_table_start.high_part = (u32)(adev->gmc.gart_start >> 44) & 0xF;
|
||||
page_table_start.low_part = (u32)(adev->gmc.gart_start >> 12);
|
||||
page_table_end.high_part = (u32)(adev->gmc.gart_end >> 44) & 0xF;
|
||||
page_table_end.low_part = (u32)(adev->gmc.gart_end >> 12);
|
||||
page_table_base.high_part = upper_32_bits(pt_base) & 0xF;
|
||||
page_table_start.high_part = upper_32_bits(adev->gmc.gart_start >>
|
||||
AMDGPU_GPU_PAGE_SHIFT);
|
||||
page_table_start.low_part = lower_32_bits(adev->gmc.gart_start >>
|
||||
AMDGPU_GPU_PAGE_SHIFT);
|
||||
page_table_end.high_part = upper_32_bits(adev->gmc.gart_end >>
|
||||
AMDGPU_GPU_PAGE_SHIFT);
|
||||
page_table_end.low_part = lower_32_bits(adev->gmc.gart_end >>
|
||||
AMDGPU_GPU_PAGE_SHIFT);
|
||||
page_table_base.high_part = upper_32_bits(pt_base);
|
||||
page_table_base.low_part = lower_32_bits(pt_base);
|
||||
|
||||
pa_config->system_aperture.start_addr = (uint64_t)logical_addr_low << 18;
|
||||
@@ -8790,6 +8794,13 @@ static void handle_cursor_update(struct drm_plane *plane,
|
||||
attributes.rotation_angle = 0;
|
||||
attributes.attribute_flags.value = 0;
|
||||
|
||||
/* Enable cursor degamma ROM on DCN3+ for implicit sRGB degamma in DRM
|
||||
* legacy gamma setup.
|
||||
*/
|
||||
if (crtc_state->cm_is_degamma_srgb &&
|
||||
adev->dm.dc->caps.color.dpp.gamma_corr)
|
||||
attributes.attribute_flags.bits.ENABLE_CURSOR_DEGAMMA = 1;
|
||||
|
||||
attributes.pitch = afb->base.pitches[0] / afb->base.format->cpp[0];
|
||||
|
||||
if (crtc_state->stream) {
|
||||
|
||||
@@ -4162,7 +4162,9 @@ void dml31_ModeSupportAndSystemConfigurationFull(struct display_mode_lib *mode_l
|
||||
}
|
||||
if (v->OutputFormat[k] == dm_420 && v->HActive[k] > DCN31_MAX_FMT_420_BUFFER_WIDTH
|
||||
&& v->ODMCombineEnablePerState[i][k] != dm_odm_combine_mode_4to1) {
|
||||
if (v->HActive[k] / 2 > DCN31_MAX_FMT_420_BUFFER_WIDTH) {
|
||||
if (v->Output[k] == dm_hdmi) {
|
||||
FMTBufferExceeded = true;
|
||||
} else if (v->HActive[k] / 2 > DCN31_MAX_FMT_420_BUFFER_WIDTH) {
|
||||
v->ODMCombineEnablePerState[i][k] = dm_odm_combine_mode_4to1;
|
||||
v->PlaneRequiredDISPCLK = v->PlaneRequiredDISPCLKWithODMCombine4To1;
|
||||
|
||||
|
||||
@@ -224,7 +224,7 @@ static int tc358762_probe(struct mipi_dsi_device *dsi)
|
||||
dsi->lanes = 1;
|
||||
dsi->format = MIPI_DSI_FMT_RGB888;
|
||||
dsi->mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_SYNC_PULSE |
|
||||
MIPI_DSI_MODE_LPM;
|
||||
MIPI_DSI_MODE_LPM | MIPI_DSI_MODE_VIDEO_HSE;
|
||||
|
||||
ret = tc358762_parse_dt(ctx);
|
||||
if (ret < 0)
|
||||
|
||||
@@ -39,13 +39,12 @@ static void exynos_drm_crtc_atomic_disable(struct drm_crtc *crtc,
|
||||
if (exynos_crtc->ops->atomic_disable)
|
||||
exynos_crtc->ops->atomic_disable(exynos_crtc);
|
||||
|
||||
spin_lock_irq(&crtc->dev->event_lock);
|
||||
if (crtc->state->event && !crtc->state->active) {
|
||||
spin_lock_irq(&crtc->dev->event_lock);
|
||||
drm_crtc_send_vblank_event(crtc, crtc->state->event);
|
||||
spin_unlock_irq(&crtc->dev->event_lock);
|
||||
|
||||
crtc->state->event = NULL;
|
||||
}
|
||||
spin_unlock_irq(&crtc->dev->event_lock);
|
||||
}
|
||||
|
||||
static int exynos_crtc_atomic_check(struct drm_crtc *crtc,
|
||||
|
||||
@@ -67,10 +67,10 @@ MODULE_PARM_DESC(eco_mode, "Turn on Eco mode (less bright, more silent)");
|
||||
#define READ_STATUS_SIZE 13
|
||||
#define MISC_VALUE_SIZE 4
|
||||
|
||||
#define CMD_TIMEOUT msecs_to_jiffies(200)
|
||||
#define DATA_TIMEOUT msecs_to_jiffies(1000)
|
||||
#define IDLE_TIMEOUT msecs_to_jiffies(2000)
|
||||
#define FIRST_FRAME_TIMEOUT msecs_to_jiffies(2000)
|
||||
#define CMD_TIMEOUT 200
|
||||
#define DATA_TIMEOUT 1000
|
||||
#define IDLE_TIMEOUT 2000
|
||||
#define FIRST_FRAME_TIMEOUT 2000
|
||||
|
||||
#define MISC_REQ_GET_SET_ECO_A 0xff
|
||||
#define MISC_REQ_GET_SET_ECO_B 0x35
|
||||
@@ -386,7 +386,7 @@ static void gm12u320_fb_update_work(struct work_struct *work)
|
||||
* switches back to showing its logo.
|
||||
*/
|
||||
queue_delayed_work(system_long_wq, &gm12u320->fb_update.work,
|
||||
IDLE_TIMEOUT);
|
||||
msecs_to_jiffies(IDLE_TIMEOUT));
|
||||
|
||||
return;
|
||||
err:
|
||||
|
||||
@@ -693,13 +693,16 @@ static int aspeed_i2c_master_xfer(struct i2c_adapter *adap,
|
||||
|
||||
if (time_left == 0) {
|
||||
/*
|
||||
* If timed out and bus is still busy in a multi master
|
||||
* environment, attempt recovery at here.
|
||||
* In a multi-master setup, if a timeout occurs, attempt
|
||||
* recovery. But if the bus is idle, we still need to reset the
|
||||
* i2c controller to clear the remaining interrupts.
|
||||
*/
|
||||
if (bus->multi_master &&
|
||||
(readl(bus->base + ASPEED_I2C_CMD_REG) &
|
||||
ASPEED_I2CD_BUS_BUSY_STS))
|
||||
aspeed_i2c_recover_bus(bus);
|
||||
else
|
||||
aspeed_i2c_reset(bus);
|
||||
|
||||
/*
|
||||
* If timed out and the state is still pending, drop the pending
|
||||
|
||||
@@ -29,6 +29,7 @@ static LIST_HEAD(icc_providers);
|
||||
static int providers_count;
|
||||
static bool synced_state;
|
||||
static DEFINE_MUTEX(icc_lock);
|
||||
static DEFINE_MUTEX(icc_bw_lock);
|
||||
static struct dentry *icc_debugfs_dir;
|
||||
|
||||
static void icc_summary_show_one(struct seq_file *s, struct icc_node *n)
|
||||
@@ -632,7 +633,7 @@ int icc_set_bw(struct icc_path *path, u32 avg_bw, u32 peak_bw)
|
||||
if (WARN_ON(IS_ERR(path) || !path->num_nodes))
|
||||
return -EINVAL;
|
||||
|
||||
mutex_lock(&icc_lock);
|
||||
mutex_lock(&icc_bw_lock);
|
||||
|
||||
old_avg = path->reqs[0].avg_bw;
|
||||
old_peak = path->reqs[0].peak_bw;
|
||||
@@ -664,7 +665,7 @@ int icc_set_bw(struct icc_path *path, u32 avg_bw, u32 peak_bw)
|
||||
apply_constraints(path);
|
||||
}
|
||||
|
||||
mutex_unlock(&icc_lock);
|
||||
mutex_unlock(&icc_bw_lock);
|
||||
|
||||
trace_icc_set_bw_end(path, ret);
|
||||
|
||||
@@ -967,6 +968,7 @@ void icc_node_add(struct icc_node *node, struct icc_provider *provider)
|
||||
return;
|
||||
|
||||
mutex_lock(&icc_lock);
|
||||
mutex_lock(&icc_bw_lock);
|
||||
|
||||
node->provider = provider;
|
||||
list_add_tail(&node->node_list, &provider->nodes);
|
||||
@@ -992,6 +994,7 @@ void icc_node_add(struct icc_node *node, struct icc_provider *provider)
|
||||
node->avg_bw = 0;
|
||||
node->peak_bw = 0;
|
||||
|
||||
mutex_unlock(&icc_bw_lock);
|
||||
mutex_unlock(&icc_lock);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(icc_node_add);
|
||||
@@ -1119,6 +1122,7 @@ void icc_sync_state(struct device *dev)
|
||||
return;
|
||||
|
||||
mutex_lock(&icc_lock);
|
||||
mutex_lock(&icc_bw_lock);
|
||||
synced_state = true;
|
||||
list_for_each_entry(p, &icc_providers, provider_list) {
|
||||
dev_dbg(p->dev, "interconnect provider is in synced state\n");
|
||||
@@ -1131,13 +1135,21 @@ void icc_sync_state(struct device *dev)
|
||||
}
|
||||
}
|
||||
}
|
||||
mutex_unlock(&icc_bw_lock);
|
||||
mutex_unlock(&icc_lock);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(icc_sync_state);
|
||||
|
||||
static int __init icc_init(void)
|
||||
{
|
||||
struct device_node *root = of_find_node_by_path("/");
|
||||
struct device_node *root;
|
||||
|
||||
/* Teach lockdep about lock ordering wrt. shrinker: */
|
||||
fs_reclaim_acquire(GFP_KERNEL);
|
||||
might_lock(&icc_bw_lock);
|
||||
fs_reclaim_release(GFP_KERNEL);
|
||||
|
||||
root = of_find_node_by_path("/");
|
||||
|
||||
providers_count = of_count_icc_providers(root);
|
||||
of_node_put(root);
|
||||
|
||||
@@ -1822,6 +1822,9 @@ static int raid1_remove_disk(struct mddev *mddev, struct md_rdev *rdev)
|
||||
int number = rdev->raid_disk;
|
||||
struct raid1_info *p = conf->mirrors + number;
|
||||
|
||||
if (unlikely(number >= conf->raid_disks))
|
||||
goto abort;
|
||||
|
||||
if (rdev != p->rdev)
|
||||
p = conf->mirrors + conf->raid_disks + number;
|
||||
|
||||
|
||||
@@ -413,7 +413,7 @@ static int buffer_prepare(struct vb2_buffer *vb)
|
||||
dev->height >> 1);
|
||||
break;
|
||||
default:
|
||||
BUG();
|
||||
return -EINVAL; /* should not happen */
|
||||
}
|
||||
dprintk(2, "[%p/%d] buffer_init - %dx%d %dbpp 0x%08x - dma=0x%08lx\n",
|
||||
buf, buf->vb.vb2_buf.index,
|
||||
|
||||
@@ -345,7 +345,7 @@ static int cio2_hw_init(struct cio2_device *cio2, struct cio2_queue *q)
|
||||
void __iomem *const base = cio2->base;
|
||||
u8 lanes, csi2bus = q->csi2.port;
|
||||
u8 sensor_vc = SENSOR_VIR_CH_DFLT;
|
||||
struct cio2_csi2_timing timing;
|
||||
struct cio2_csi2_timing timing = { 0 };
|
||||
int i, r;
|
||||
|
||||
fmt = cio2_find_format(NULL, &q->subdev_fmt.code);
|
||||
|
||||
@@ -345,11 +345,12 @@ static int qt1010_init(struct dvb_frontend *fe)
|
||||
else
|
||||
valptr = &tmpval;
|
||||
|
||||
BUG_ON(i >= ARRAY_SIZE(i2c_data) - 1);
|
||||
|
||||
err = qt1010_init_meas1(priv, i2c_data[i+1].reg,
|
||||
i2c_data[i].reg,
|
||||
i2c_data[i].val, valptr);
|
||||
if (i >= ARRAY_SIZE(i2c_data) - 1)
|
||||
err = -EIO;
|
||||
else
|
||||
err = qt1010_init_meas1(priv, i2c_data[i + 1].reg,
|
||||
i2c_data[i].reg,
|
||||
i2c_data[i].val, valptr);
|
||||
i++;
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -270,6 +270,7 @@ static int af9035_i2c_master_xfer(struct i2c_adapter *adap,
|
||||
struct dvb_usb_device *d = i2c_get_adapdata(adap);
|
||||
struct state *state = d_to_priv(d);
|
||||
int ret;
|
||||
u32 reg;
|
||||
|
||||
if (mutex_lock_interruptible(&d->i2c_mutex) < 0)
|
||||
return -EAGAIN;
|
||||
@@ -322,8 +323,10 @@ static int af9035_i2c_master_xfer(struct i2c_adapter *adap,
|
||||
ret = -EOPNOTSUPP;
|
||||
} else if ((msg[0].addr == state->af9033_i2c_addr[0]) ||
|
||||
(msg[0].addr == state->af9033_i2c_addr[1])) {
|
||||
if (msg[0].len < 3 || msg[1].len < 1)
|
||||
return -EOPNOTSUPP;
|
||||
/* demod access via firmware interface */
|
||||
u32 reg = msg[0].buf[0] << 16 | msg[0].buf[1] << 8 |
|
||||
reg = msg[0].buf[0] << 16 | msg[0].buf[1] << 8 |
|
||||
msg[0].buf[2];
|
||||
|
||||
if (msg[0].addr == state->af9033_i2c_addr[1])
|
||||
@@ -381,17 +384,16 @@ static int af9035_i2c_master_xfer(struct i2c_adapter *adap,
|
||||
ret = -EOPNOTSUPP;
|
||||
} else if ((msg[0].addr == state->af9033_i2c_addr[0]) ||
|
||||
(msg[0].addr == state->af9033_i2c_addr[1])) {
|
||||
if (msg[0].len < 3)
|
||||
return -EOPNOTSUPP;
|
||||
/* demod access via firmware interface */
|
||||
u32 reg = msg[0].buf[0] << 16 | msg[0].buf[1] << 8 |
|
||||
reg = msg[0].buf[0] << 16 | msg[0].buf[1] << 8 |
|
||||
msg[0].buf[2];
|
||||
|
||||
if (msg[0].addr == state->af9033_i2c_addr[1])
|
||||
reg |= 0x100000;
|
||||
|
||||
ret = (msg[0].len >= 3) ? af9035_wr_regs(d, reg,
|
||||
&msg[0].buf[3],
|
||||
msg[0].len - 3)
|
||||
: -EOPNOTSUPP;
|
||||
ret = af9035_wr_regs(d, reg, &msg[0].buf[3], msg[0].len - 3);
|
||||
} else {
|
||||
/* I2C write */
|
||||
u8 buf[MAX_XFER_SIZE];
|
||||
|
||||
@@ -202,7 +202,7 @@ static int anysee_master_xfer(struct i2c_adapter *adap, struct i2c_msg *msg,
|
||||
|
||||
while (i < num) {
|
||||
if (num > i + 1 && (msg[i+1].flags & I2C_M_RD)) {
|
||||
if (msg[i].len > 2 || msg[i+1].len > 60) {
|
||||
if (msg[i].len != 2 || msg[i + 1].len > 60) {
|
||||
ret = -EOPNOTSUPP;
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -788,6 +788,10 @@ static int az6007_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[],
|
||||
if (az6007_xfer_debug)
|
||||
printk(KERN_DEBUG "az6007: I2C W addr=0x%x len=%d\n",
|
||||
addr, msgs[i].len);
|
||||
if (msgs[i].len < 1) {
|
||||
ret = -EIO;
|
||||
goto err;
|
||||
}
|
||||
req = AZ6007_I2C_WR;
|
||||
index = msgs[i].buf[0];
|
||||
value = addr | (1 << 8);
|
||||
@@ -802,6 +806,10 @@ static int az6007_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[],
|
||||
if (az6007_xfer_debug)
|
||||
printk(KERN_DEBUG "az6007: I2C R addr=0x%x len=%d\n",
|
||||
addr, msgs[i].len);
|
||||
if (msgs[i].len < 1) {
|
||||
ret = -EIO;
|
||||
goto err;
|
||||
}
|
||||
req = AZ6007_I2C_RD;
|
||||
index = msgs[i].buf[0];
|
||||
value = addr;
|
||||
|
||||
@@ -120,7 +120,7 @@ static int gl861_i2c_master_xfer(struct i2c_adapter *adap, struct i2c_msg msg[],
|
||||
} else if (num == 2 && !(msg[0].flags & I2C_M_RD) &&
|
||||
(msg[1].flags & I2C_M_RD)) {
|
||||
/* I2C write + read */
|
||||
if (msg[0].len > 1 || msg[1].len > sizeof(ctx->buf)) {
|
||||
if (msg[0].len != 1 || msg[1].len > sizeof(ctx->buf)) {
|
||||
ret = -EOPNOTSUPP;
|
||||
goto err;
|
||||
}
|
||||
|
||||
@@ -422,6 +422,10 @@ static int af9005_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msg[],
|
||||
if (ret == 0)
|
||||
ret = 2;
|
||||
} else {
|
||||
if (msg[0].len < 2) {
|
||||
ret = -EOPNOTSUPP;
|
||||
goto unlock;
|
||||
}
|
||||
/* write one or more registers */
|
||||
reg = msg[0].buf[0];
|
||||
addr = msg[0].addr;
|
||||
@@ -431,6 +435,7 @@ static int af9005_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msg[],
|
||||
ret = 1;
|
||||
}
|
||||
|
||||
unlock:
|
||||
mutex_unlock(&d->i2c_mutex);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -128,6 +128,10 @@ static int dw2102_i2c_transfer(struct i2c_adapter *adap, struct i2c_msg msg[],
|
||||
|
||||
switch (num) {
|
||||
case 2:
|
||||
if (msg[0].len < 1) {
|
||||
num = -EOPNOTSUPP;
|
||||
break;
|
||||
}
|
||||
/* read stv0299 register */
|
||||
value = msg[0].buf[0];/* register */
|
||||
for (i = 0; i < msg[1].len; i++) {
|
||||
@@ -139,6 +143,10 @@ static int dw2102_i2c_transfer(struct i2c_adapter *adap, struct i2c_msg msg[],
|
||||
case 1:
|
||||
switch (msg[0].addr) {
|
||||
case 0x68:
|
||||
if (msg[0].len < 2) {
|
||||
num = -EOPNOTSUPP;
|
||||
break;
|
||||
}
|
||||
/* write to stv0299 register */
|
||||
buf6[0] = 0x2a;
|
||||
buf6[1] = msg[0].buf[0];
|
||||
@@ -148,6 +156,10 @@ static int dw2102_i2c_transfer(struct i2c_adapter *adap, struct i2c_msg msg[],
|
||||
break;
|
||||
case 0x60:
|
||||
if (msg[0].flags == 0) {
|
||||
if (msg[0].len < 4) {
|
||||
num = -EOPNOTSUPP;
|
||||
break;
|
||||
}
|
||||
/* write to tuner pll */
|
||||
buf6[0] = 0x2c;
|
||||
buf6[1] = 5;
|
||||
@@ -159,6 +171,10 @@ static int dw2102_i2c_transfer(struct i2c_adapter *adap, struct i2c_msg msg[],
|
||||
dw210x_op_rw(d->udev, 0xb2, 0, 0,
|
||||
buf6, 7, DW210X_WRITE_MSG);
|
||||
} else {
|
||||
if (msg[0].len < 1) {
|
||||
num = -EOPNOTSUPP;
|
||||
break;
|
||||
}
|
||||
/* read from tuner */
|
||||
dw210x_op_rw(d->udev, 0xb5, 0, 0,
|
||||
buf6, 1, DW210X_READ_MSG);
|
||||
@@ -166,12 +182,20 @@ static int dw2102_i2c_transfer(struct i2c_adapter *adap, struct i2c_msg msg[],
|
||||
}
|
||||
break;
|
||||
case (DW2102_RC_QUERY):
|
||||
if (msg[0].len < 2) {
|
||||
num = -EOPNOTSUPP;
|
||||
break;
|
||||
}
|
||||
dw210x_op_rw(d->udev, 0xb8, 0, 0,
|
||||
buf6, 2, DW210X_READ_MSG);
|
||||
msg[0].buf[0] = buf6[0];
|
||||
msg[0].buf[1] = buf6[1];
|
||||
break;
|
||||
case (DW2102_VOLTAGE_CTRL):
|
||||
if (msg[0].len < 1) {
|
||||
num = -EOPNOTSUPP;
|
||||
break;
|
||||
}
|
||||
buf6[0] = 0x30;
|
||||
buf6[1] = msg[0].buf[0];
|
||||
dw210x_op_rw(d->udev, 0xb2, 0, 0,
|
||||
|
||||
@@ -171,8 +171,8 @@
|
||||
#define ESDHC_FLAG_HS400 BIT(9)
|
||||
/*
|
||||
* The IP has errata ERR010450
|
||||
* uSDHC: Due to the I/O timing limit, for SDR mode, SD card clock can't
|
||||
* exceed 150MHz, for DDR mode, SD card clock can't exceed 45MHz.
|
||||
* uSDHC: At 1.8V due to the I/O timing limit, for SDR mode, SD card
|
||||
* clock can't exceed 150MHz, for DDR mode, SD card clock can't exceed 45MHz.
|
||||
*/
|
||||
#define ESDHC_FLAG_ERR010450 BIT(10)
|
||||
/* The IP supports HS400ES mode */
|
||||
@@ -917,7 +917,8 @@ static inline void esdhc_pltfm_set_clock(struct sdhci_host *host,
|
||||
| ESDHC_CLOCK_MASK);
|
||||
sdhci_writel(host, temp, ESDHC_SYSTEM_CONTROL);
|
||||
|
||||
if (imx_data->socdata->flags & ESDHC_FLAG_ERR010450) {
|
||||
if ((imx_data->socdata->flags & ESDHC_FLAG_ERR010450) &&
|
||||
(!(host->quirks2 & SDHCI_QUIRK2_NO_1_8_V))) {
|
||||
unsigned int max_clock;
|
||||
|
||||
max_clock = imx_data->is_ddr ? 45000000 : 150000000;
|
||||
|
||||
@@ -25,6 +25,7 @@
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_platform.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/static_key.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/log2.h>
|
||||
|
||||
@@ -207,6 +208,8 @@ enum {
|
||||
|
||||
struct brcmnand_host;
|
||||
|
||||
static DEFINE_STATIC_KEY_FALSE(brcmnand_soc_has_ops_key);
|
||||
|
||||
struct brcmnand_controller {
|
||||
struct device *dev;
|
||||
struct nand_controller controller;
|
||||
@@ -268,6 +271,7 @@ struct brcmnand_controller {
|
||||
const unsigned int *page_sizes;
|
||||
unsigned int page_size_shift;
|
||||
unsigned int max_oob;
|
||||
u32 ecc_level_shift;
|
||||
u32 features;
|
||||
|
||||
/* for low-power standby/resume only */
|
||||
@@ -592,15 +596,53 @@ enum {
|
||||
INTFC_CTLR_READY = BIT(31),
|
||||
};
|
||||
|
||||
/***********************************************************************
|
||||
* NAND ACC CONTROL bitfield
|
||||
*
|
||||
* Some bits have remained constant throughout hardware revision, while
|
||||
* others have shifted around.
|
||||
***********************************************************************/
|
||||
|
||||
/* Constant for all versions (where supported) */
|
||||
enum {
|
||||
/* See BRCMNAND_HAS_CACHE_MODE */
|
||||
ACC_CONTROL_CACHE_MODE = BIT(22),
|
||||
|
||||
/* See BRCMNAND_HAS_PREFETCH */
|
||||
ACC_CONTROL_PREFETCH = BIT(23),
|
||||
|
||||
ACC_CONTROL_PAGE_HIT = BIT(24),
|
||||
ACC_CONTROL_WR_PREEMPT = BIT(25),
|
||||
ACC_CONTROL_PARTIAL_PAGE = BIT(26),
|
||||
ACC_CONTROL_RD_ERASED = BIT(27),
|
||||
ACC_CONTROL_FAST_PGM_RDIN = BIT(28),
|
||||
ACC_CONTROL_WR_ECC = BIT(30),
|
||||
ACC_CONTROL_RD_ECC = BIT(31),
|
||||
};
|
||||
|
||||
#define ACC_CONTROL_ECC_SHIFT 16
|
||||
/* Only for v7.2 */
|
||||
#define ACC_CONTROL_ECC_EXT_SHIFT 13
|
||||
|
||||
static inline bool brcmnand_non_mmio_ops(struct brcmnand_controller *ctrl)
|
||||
{
|
||||
return static_branch_unlikely(&brcmnand_soc_has_ops_key);
|
||||
}
|
||||
|
||||
static inline u32 nand_readreg(struct brcmnand_controller *ctrl, u32 offs)
|
||||
{
|
||||
if (brcmnand_non_mmio_ops(ctrl))
|
||||
return brcmnand_soc_read(ctrl->soc, offs);
|
||||
return brcmnand_readl(ctrl->nand_base + offs);
|
||||
}
|
||||
|
||||
static inline void nand_writereg(struct brcmnand_controller *ctrl, u32 offs,
|
||||
u32 val)
|
||||
{
|
||||
brcmnand_writel(val, ctrl->nand_base + offs);
|
||||
if (brcmnand_non_mmio_ops(ctrl))
|
||||
brcmnand_soc_write(ctrl->soc, val, offs);
|
||||
else
|
||||
brcmnand_writel(val, ctrl->nand_base + offs);
|
||||
}
|
||||
|
||||
static int brcmnand_revision_init(struct brcmnand_controller *ctrl)
|
||||
@@ -719,6 +761,12 @@ static int brcmnand_revision_init(struct brcmnand_controller *ctrl)
|
||||
else if (of_property_read_bool(ctrl->dev->of_node, "brcm,nand-has-wp"))
|
||||
ctrl->features |= BRCMNAND_HAS_WP;
|
||||
|
||||
/* v7.2 has different ecc level shift in the acc register */
|
||||
if (ctrl->nand_version == 0x0702)
|
||||
ctrl->ecc_level_shift = ACC_CONTROL_ECC_EXT_SHIFT;
|
||||
else
|
||||
ctrl->ecc_level_shift = ACC_CONTROL_ECC_SHIFT;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -766,13 +814,18 @@ static inline void brcmnand_rmw_reg(struct brcmnand_controller *ctrl,
|
||||
|
||||
static inline u32 brcmnand_read_fc(struct brcmnand_controller *ctrl, int word)
|
||||
{
|
||||
if (brcmnand_non_mmio_ops(ctrl))
|
||||
return brcmnand_soc_read(ctrl->soc, BRCMNAND_NON_MMIO_FC_ADDR);
|
||||
return __raw_readl(ctrl->nand_fc + word * 4);
|
||||
}
|
||||
|
||||
static inline void brcmnand_write_fc(struct brcmnand_controller *ctrl,
|
||||
int word, u32 val)
|
||||
{
|
||||
__raw_writel(val, ctrl->nand_fc + word * 4);
|
||||
if (brcmnand_non_mmio_ops(ctrl))
|
||||
brcmnand_soc_write(ctrl->soc, val, BRCMNAND_NON_MMIO_FC_ADDR);
|
||||
else
|
||||
__raw_writel(val, ctrl->nand_fc + word * 4);
|
||||
}
|
||||
|
||||
static inline void edu_writel(struct brcmnand_controller *ctrl,
|
||||
@@ -902,30 +955,6 @@ static inline int brcmnand_cmd_shift(struct brcmnand_controller *ctrl)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
* NAND ACC CONTROL bitfield
|
||||
*
|
||||
* Some bits have remained constant throughout hardware revision, while
|
||||
* others have shifted around.
|
||||
***********************************************************************/
|
||||
|
||||
/* Constant for all versions (where supported) */
|
||||
enum {
|
||||
/* See BRCMNAND_HAS_CACHE_MODE */
|
||||
ACC_CONTROL_CACHE_MODE = BIT(22),
|
||||
|
||||
/* See BRCMNAND_HAS_PREFETCH */
|
||||
ACC_CONTROL_PREFETCH = BIT(23),
|
||||
|
||||
ACC_CONTROL_PAGE_HIT = BIT(24),
|
||||
ACC_CONTROL_WR_PREEMPT = BIT(25),
|
||||
ACC_CONTROL_PARTIAL_PAGE = BIT(26),
|
||||
ACC_CONTROL_RD_ERASED = BIT(27),
|
||||
ACC_CONTROL_FAST_PGM_RDIN = BIT(28),
|
||||
ACC_CONTROL_WR_ECC = BIT(30),
|
||||
ACC_CONTROL_RD_ECC = BIT(31),
|
||||
};
|
||||
|
||||
static inline u32 brcmnand_spare_area_mask(struct brcmnand_controller *ctrl)
|
||||
{
|
||||
if (ctrl->nand_version == 0x0702)
|
||||
@@ -938,18 +967,15 @@ static inline u32 brcmnand_spare_area_mask(struct brcmnand_controller *ctrl)
|
||||
return GENMASK(4, 0);
|
||||
}
|
||||
|
||||
#define NAND_ACC_CONTROL_ECC_SHIFT 16
|
||||
#define NAND_ACC_CONTROL_ECC_EXT_SHIFT 13
|
||||
|
||||
static inline u32 brcmnand_ecc_level_mask(struct brcmnand_controller *ctrl)
|
||||
{
|
||||
u32 mask = (ctrl->nand_version >= 0x0600) ? 0x1f : 0x0f;
|
||||
|
||||
mask <<= NAND_ACC_CONTROL_ECC_SHIFT;
|
||||
mask <<= ACC_CONTROL_ECC_SHIFT;
|
||||
|
||||
/* v7.2 includes additional ECC levels */
|
||||
if (ctrl->nand_version >= 0x0702)
|
||||
mask |= 0x7 << NAND_ACC_CONTROL_ECC_EXT_SHIFT;
|
||||
if (ctrl->nand_version == 0x0702)
|
||||
mask |= 0x7 << ACC_CONTROL_ECC_EXT_SHIFT;
|
||||
|
||||
return mask;
|
||||
}
|
||||
@@ -963,8 +989,8 @@ static void brcmnand_set_ecc_enabled(struct brcmnand_host *host, int en)
|
||||
|
||||
if (en) {
|
||||
acc_control |= ecc_flags; /* enable RD/WR ECC */
|
||||
acc_control |= host->hwcfg.ecc_level
|
||||
<< NAND_ACC_CONTROL_ECC_SHIFT;
|
||||
acc_control &= ~brcmnand_ecc_level_mask(ctrl);
|
||||
acc_control |= host->hwcfg.ecc_level << ctrl->ecc_level_shift;
|
||||
} else {
|
||||
acc_control &= ~ecc_flags; /* disable RD/WR ECC */
|
||||
acc_control &= ~brcmnand_ecc_level_mask(ctrl);
|
||||
@@ -2564,7 +2590,7 @@ static int brcmnand_set_cfg(struct brcmnand_host *host,
|
||||
tmp &= ~brcmnand_ecc_level_mask(ctrl);
|
||||
tmp &= ~brcmnand_spare_area_mask(ctrl);
|
||||
if (ctrl->nand_version >= 0x0302) {
|
||||
tmp |= cfg->ecc_level << NAND_ACC_CONTROL_ECC_SHIFT;
|
||||
tmp |= cfg->ecc_level << ctrl->ecc_level_shift;
|
||||
tmp |= cfg->spare_area_size;
|
||||
}
|
||||
nand_writereg(ctrl, acc_control_offs, tmp);
|
||||
@@ -3034,6 +3060,12 @@ int brcmnand_probe(struct platform_device *pdev, struct brcmnand_soc *soc)
|
||||
dev_set_drvdata(dev, ctrl);
|
||||
ctrl->dev = dev;
|
||||
|
||||
/* Enable the static key if the soc provides I/O operations indicating
|
||||
* that a non-memory mapped IO access path must be used
|
||||
*/
|
||||
if (brcmnand_soc_has_ops(ctrl->soc))
|
||||
static_branch_enable(&brcmnand_soc_has_ops_key);
|
||||
|
||||
init_completion(&ctrl->done);
|
||||
init_completion(&ctrl->dma_done);
|
||||
init_completion(&ctrl->edu_done);
|
||||
|
||||
@@ -11,12 +11,25 @@
|
||||
|
||||
struct platform_device;
|
||||
struct dev_pm_ops;
|
||||
struct brcmnand_io_ops;
|
||||
|
||||
/* Special register offset constant to intercept a non-MMIO access
|
||||
* to the flash cache register space. This is intentionally large
|
||||
* not to overlap with an existing offset.
|
||||
*/
|
||||
#define BRCMNAND_NON_MMIO_FC_ADDR 0xffffffff
|
||||
|
||||
struct brcmnand_soc {
|
||||
bool (*ctlrdy_ack)(struct brcmnand_soc *soc);
|
||||
void (*ctlrdy_set_enabled)(struct brcmnand_soc *soc, bool en);
|
||||
void (*prepare_data_bus)(struct brcmnand_soc *soc, bool prepare,
|
||||
bool is_param);
|
||||
const struct brcmnand_io_ops *ops;
|
||||
};
|
||||
|
||||
struct brcmnand_io_ops {
|
||||
u32 (*read_reg)(struct brcmnand_soc *soc, u32 offset);
|
||||
void (*write_reg)(struct brcmnand_soc *soc, u32 val, u32 offset);
|
||||
};
|
||||
|
||||
static inline void brcmnand_soc_data_bus_prepare(struct brcmnand_soc *soc,
|
||||
@@ -58,6 +71,22 @@ static inline void brcmnand_writel(u32 val, void __iomem *addr)
|
||||
writel_relaxed(val, addr);
|
||||
}
|
||||
|
||||
static inline bool brcmnand_soc_has_ops(struct brcmnand_soc *soc)
|
||||
{
|
||||
return soc && soc->ops && soc->ops->read_reg && soc->ops->write_reg;
|
||||
}
|
||||
|
||||
static inline u32 brcmnand_soc_read(struct brcmnand_soc *soc, u32 offset)
|
||||
{
|
||||
return soc->ops->read_reg(soc, offset);
|
||||
}
|
||||
|
||||
static inline void brcmnand_soc_write(struct brcmnand_soc *soc, u32 val,
|
||||
u32 offset)
|
||||
{
|
||||
soc->ops->write_reg(soc, val, offset);
|
||||
}
|
||||
|
||||
int brcmnand_probe(struct platform_device *pdev, struct brcmnand_soc *soc);
|
||||
int brcmnand_remove(struct platform_device *pdev);
|
||||
|
||||
|
||||
@@ -292,9 +292,8 @@ static void alx_get_ethtool_stats(struct net_device *netdev,
|
||||
spin_lock(&alx->stats_lock);
|
||||
|
||||
alx_update_hw_stats(hw);
|
||||
BUILD_BUG_ON(sizeof(hw->stats) - offsetof(struct alx_hw_stats, rx_ok) <
|
||||
ALX_NUM_STATS * sizeof(u64));
|
||||
memcpy(data, &hw->stats.rx_ok, ALX_NUM_STATS * sizeof(u64));
|
||||
BUILD_BUG_ON(sizeof(hw->stats) != ALX_NUM_STATS * sizeof(u64));
|
||||
memcpy(data, &hw->stats, sizeof(hw->stats));
|
||||
|
||||
spin_unlock(&alx->stats_lock);
|
||||
}
|
||||
|
||||
@@ -136,8 +136,8 @@ static int ath_ahb_probe(struct platform_device *pdev)
|
||||
|
||||
ah = sc->sc_ah;
|
||||
ath9k_hw_name(ah, hw_name, sizeof(hw_name));
|
||||
wiphy_info(hw->wiphy, "%s mem=0x%lx, irq=%d\n",
|
||||
hw_name, (unsigned long)mem, irq);
|
||||
wiphy_info(hw->wiphy, "%s mem=0x%p, irq=%d\n",
|
||||
hw_name, mem, irq);
|
||||
|
||||
return 0;
|
||||
|
||||
|
||||
@@ -113,8 +113,10 @@ struct ath_tx_status {
|
||||
u8 qid;
|
||||
u16 desc_id;
|
||||
u8 tid;
|
||||
u32 ba_low;
|
||||
u32 ba_high;
|
||||
struct_group(ba,
|
||||
u32 ba_low;
|
||||
u32 ba_high;
|
||||
);
|
||||
u32 evm0;
|
||||
u32 evm1;
|
||||
u32 evm2;
|
||||
|
||||
@@ -988,8 +988,8 @@ static int ath_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)
|
||||
sc->sc_ah->msi_reg = 0;
|
||||
|
||||
ath9k_hw_name(sc->sc_ah, hw_name, sizeof(hw_name));
|
||||
wiphy_info(hw->wiphy, "%s mem=0x%lx, irq=%d\n",
|
||||
hw_name, (unsigned long)sc->mem, pdev->irq);
|
||||
wiphy_info(hw->wiphy, "%s mem=0x%p, irq=%d\n",
|
||||
hw_name, sc->mem, pdev->irq);
|
||||
|
||||
return 0;
|
||||
|
||||
|
||||
@@ -421,7 +421,7 @@ static void ath_tx_count_frames(struct ath_softc *sc, struct ath_buf *bf,
|
||||
isaggr = bf_isaggr(bf);
|
||||
if (isaggr) {
|
||||
seq_st = ts->ts_seqnum;
|
||||
memcpy(ba, &ts->ba_low, WME_BA_BMP_SIZE >> 3);
|
||||
memcpy(ba, &ts->ba, WME_BA_BMP_SIZE >> 3);
|
||||
}
|
||||
|
||||
while (bf) {
|
||||
@@ -504,7 +504,7 @@ static void ath_tx_complete_aggr(struct ath_softc *sc, struct ath_txq *txq,
|
||||
if (isaggr && txok) {
|
||||
if (ts->ts_flags & ATH9K_TX_BA) {
|
||||
seq_st = ts->ts_seqnum;
|
||||
memcpy(ba, &ts->ba_low, WME_BA_BMP_SIZE >> 3);
|
||||
memcpy(ba, &ts->ba, WME_BA_BMP_SIZE >> 3);
|
||||
} else {
|
||||
/*
|
||||
* AR5416 can become deaf/mute when BA
|
||||
|
||||
@@ -666,7 +666,7 @@ static int wil_rx_crypto_check(struct wil6210_priv *wil, struct sk_buff *skb)
|
||||
struct wil_tid_crypto_rx *c = mc ? &s->group_crypto_rx :
|
||||
&s->tid_crypto_rx[tid];
|
||||
struct wil_tid_crypto_rx_single *cc = &c->key_id[key_id];
|
||||
const u8 *pn = (u8 *)&d->mac.pn_15_0;
|
||||
const u8 *pn = (u8 *)&d->mac.pn;
|
||||
|
||||
if (!cc->key_set) {
|
||||
wil_err_ratelimited(wil,
|
||||
|
||||
@@ -343,8 +343,10 @@ struct vring_rx_mac {
|
||||
u32 d0;
|
||||
u32 d1;
|
||||
u16 w4;
|
||||
u16 pn_15_0;
|
||||
u32 pn_47_16;
|
||||
struct_group_attr(pn, __packed,
|
||||
u16 pn_15_0;
|
||||
u32 pn_47_16;
|
||||
);
|
||||
} __packed;
|
||||
|
||||
/* Rx descriptor - DMA part
|
||||
|
||||
@@ -548,7 +548,7 @@ static int wil_rx_crypto_check_edma(struct wil6210_priv *wil,
|
||||
s = &wil->sta[cid];
|
||||
c = mc ? &s->group_crypto_rx : &s->tid_crypto_rx[tid];
|
||||
cc = &c->key_id[key_id];
|
||||
pn = (u8 *)&st->ext.pn_15_0;
|
||||
pn = (u8 *)&st->ext.pn;
|
||||
|
||||
if (!cc->key_set) {
|
||||
wil_err_ratelimited(wil,
|
||||
|
||||
@@ -330,8 +330,10 @@ struct wil_rx_status_extension {
|
||||
u32 d0;
|
||||
u32 d1;
|
||||
__le16 seq_num; /* only lower 12 bits */
|
||||
u16 pn_15_0;
|
||||
u32 pn_47_16;
|
||||
struct_group_attr(pn, __packed,
|
||||
u16 pn_15_0;
|
||||
u32 pn_47_16;
|
||||
);
|
||||
} __packed;
|
||||
|
||||
struct wil_rx_status_extended {
|
||||
|
||||
@@ -3793,14 +3793,15 @@ static int hwsim_cloned_frame_received_nl(struct sk_buff *skb_2,
|
||||
frame_data_len = nla_len(info->attrs[HWSIM_ATTR_FRAME]);
|
||||
frame_data = (void *)nla_data(info->attrs[HWSIM_ATTR_FRAME]);
|
||||
|
||||
if (frame_data_len < sizeof(struct ieee80211_hdr_3addr) ||
|
||||
frame_data_len > IEEE80211_MAX_DATA_LEN)
|
||||
goto err;
|
||||
|
||||
/* Allocate new skb here */
|
||||
skb = alloc_skb(frame_data_len, GFP_KERNEL);
|
||||
if (skb == NULL)
|
||||
goto err;
|
||||
|
||||
if (frame_data_len > IEEE80211_MAX_DATA_LEN)
|
||||
goto err;
|
||||
|
||||
/* Copy the data */
|
||||
skb_put_data(skb, frame_data, frame_data_len);
|
||||
|
||||
|
||||
@@ -735,6 +735,7 @@ mwifiex_construct_tdls_action_frame(struct mwifiex_private *priv,
|
||||
int ret;
|
||||
u16 capab;
|
||||
struct ieee80211_ht_cap *ht_cap;
|
||||
unsigned int extra;
|
||||
u8 radio, *pos;
|
||||
|
||||
capab = priv->curr_bss_params.bss_descriptor.cap_info_bitmap;
|
||||
@@ -753,7 +754,10 @@ mwifiex_construct_tdls_action_frame(struct mwifiex_private *priv,
|
||||
|
||||
switch (action_code) {
|
||||
case WLAN_PUB_ACTION_TDLS_DISCOVER_RES:
|
||||
skb_put(skb, sizeof(mgmt->u.action.u.tdls_discover_resp) + 1);
|
||||
/* See the layout of 'struct ieee80211_mgmt'. */
|
||||
extra = sizeof(mgmt->u.action.u.tdls_discover_resp) +
|
||||
sizeof(mgmt->u.action.category);
|
||||
skb_put(skb, extra);
|
||||
mgmt->u.action.category = WLAN_CATEGORY_PUBLIC;
|
||||
mgmt->u.action.u.tdls_discover_resp.action_code =
|
||||
WLAN_PUB_ACTION_TDLS_DISCOVER_RES;
|
||||
@@ -762,8 +766,7 @@ mwifiex_construct_tdls_action_frame(struct mwifiex_private *priv,
|
||||
mgmt->u.action.u.tdls_discover_resp.capability =
|
||||
cpu_to_le16(capab);
|
||||
/* move back for addr4 */
|
||||
memmove(pos + ETH_ALEN, &mgmt->u.action.category,
|
||||
sizeof(mgmt->u.action.u.tdls_discover_resp));
|
||||
memmove(pos + ETH_ALEN, &mgmt->u.action, extra);
|
||||
/* init address 4 */
|
||||
eth_broadcast_addr(pos);
|
||||
|
||||
|
||||
@@ -301,6 +301,7 @@ static int fu740_pcie_probe(struct platform_device *pdev)
|
||||
pci->dev = dev;
|
||||
pci->ops = &dw_pcie_ops;
|
||||
pci->pp.ops = &fu740_pcie_host_ops;
|
||||
pci->pp.num_vectors = MAX_MSI_IRQS;
|
||||
|
||||
/* SiFive specific region: mgmt */
|
||||
afp->mgmt_base = devm_platform_ioremap_resource_byname(pdev, "mgmt");
|
||||
|
||||
@@ -96,6 +96,7 @@
|
||||
#define SMMU_PMCG_PA_SHIFT 12
|
||||
|
||||
#define SMMU_PMCG_EVCNTR_RDONLY BIT(0)
|
||||
#define SMMU_PMCG_HARDEN_DISABLE BIT(1)
|
||||
|
||||
static int cpuhp_state_num;
|
||||
|
||||
@@ -140,6 +141,20 @@ static inline void smmu_pmu_enable(struct pmu *pmu)
|
||||
writel(SMMU_PMCG_CR_ENABLE, smmu_pmu->reg_base + SMMU_PMCG_CR);
|
||||
}
|
||||
|
||||
static int smmu_pmu_apply_event_filter(struct smmu_pmu *smmu_pmu,
|
||||
struct perf_event *event, int idx);
|
||||
|
||||
static inline void smmu_pmu_enable_quirk_hip08_09(struct pmu *pmu)
|
||||
{
|
||||
struct smmu_pmu *smmu_pmu = to_smmu_pmu(pmu);
|
||||
unsigned int idx;
|
||||
|
||||
for_each_set_bit(idx, smmu_pmu->used_counters, smmu_pmu->num_counters)
|
||||
smmu_pmu_apply_event_filter(smmu_pmu, smmu_pmu->events[idx], idx);
|
||||
|
||||
smmu_pmu_enable(pmu);
|
||||
}
|
||||
|
||||
static inline void smmu_pmu_disable(struct pmu *pmu)
|
||||
{
|
||||
struct smmu_pmu *smmu_pmu = to_smmu_pmu(pmu);
|
||||
@@ -148,6 +163,22 @@ static inline void smmu_pmu_disable(struct pmu *pmu)
|
||||
writel(0, smmu_pmu->reg_base + SMMU_PMCG_IRQ_CTRL);
|
||||
}
|
||||
|
||||
static inline void smmu_pmu_disable_quirk_hip08_09(struct pmu *pmu)
|
||||
{
|
||||
struct smmu_pmu *smmu_pmu = to_smmu_pmu(pmu);
|
||||
unsigned int idx;
|
||||
|
||||
/*
|
||||
* The global disable of PMU sometimes fail to stop the counting.
|
||||
* Harden this by writing an invalid event type to each used counter
|
||||
* to forcibly stop counting.
|
||||
*/
|
||||
for_each_set_bit(idx, smmu_pmu->used_counters, smmu_pmu->num_counters)
|
||||
writel(0xffff, smmu_pmu->reg_base + SMMU_PMCG_EVTYPER(idx));
|
||||
|
||||
smmu_pmu_disable(pmu);
|
||||
}
|
||||
|
||||
static inline void smmu_pmu_counter_set_value(struct smmu_pmu *smmu_pmu,
|
||||
u32 idx, u64 value)
|
||||
{
|
||||
@@ -747,7 +778,10 @@ static void smmu_pmu_get_acpi_options(struct smmu_pmu *smmu_pmu)
|
||||
switch (model) {
|
||||
case IORT_SMMU_V3_PMCG_HISI_HIP08:
|
||||
/* HiSilicon Erratum 162001800 */
|
||||
smmu_pmu->options |= SMMU_PMCG_EVCNTR_RDONLY;
|
||||
smmu_pmu->options |= SMMU_PMCG_EVCNTR_RDONLY | SMMU_PMCG_HARDEN_DISABLE;
|
||||
break;
|
||||
case IORT_SMMU_V3_PMCG_HISI_HIP09:
|
||||
smmu_pmu->options |= SMMU_PMCG_HARDEN_DISABLE;
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -836,6 +870,16 @@ static int smmu_pmu_probe(struct platform_device *pdev)
|
||||
|
||||
smmu_pmu_get_acpi_options(smmu_pmu);
|
||||
|
||||
/*
|
||||
* For platforms suffer this quirk, the PMU disable sometimes fails to
|
||||
* stop the counters. This will leads to inaccurate or error counting.
|
||||
* Forcibly disable the counters with these quirk handler.
|
||||
*/
|
||||
if (smmu_pmu->options & SMMU_PMCG_HARDEN_DISABLE) {
|
||||
smmu_pmu->pmu.pmu_enable = smmu_pmu_enable_quirk_hip08_09;
|
||||
smmu_pmu->pmu.pmu_disable = smmu_pmu_disable_quirk_hip08_09;
|
||||
}
|
||||
|
||||
/* Pick one CPU to be the preferred one to use */
|
||||
smmu_pmu->on_cpu = raw_smp_processor_id();
|
||||
WARN_ON(irq_set_affinity(smmu_pmu->irq, cpumask_of(smmu_pmu->on_cpu)));
|
||||
|
||||
@@ -28,6 +28,8 @@
|
||||
#define CNTL_CLEAR_MASK 0xFFFFFFFD
|
||||
#define CNTL_OVER_MASK 0xFFFFFFFE
|
||||
|
||||
#define CNTL_CP_SHIFT 16
|
||||
#define CNTL_CP_MASK (0xFF << CNTL_CP_SHIFT)
|
||||
#define CNTL_CSV_SHIFT 24
|
||||
#define CNTL_CSV_MASK (0xFFU << CNTL_CSV_SHIFT)
|
||||
|
||||
@@ -35,6 +37,8 @@
|
||||
#define EVENT_CYCLES_COUNTER 0
|
||||
#define NUM_COUNTERS 4
|
||||
|
||||
/* For removing bias if cycle counter CNTL.CP is set to 0xf0 */
|
||||
#define CYCLES_COUNTER_MASK 0x0FFFFFFF
|
||||
#define AXI_MASKING_REVERT 0xffff0000 /* AXI_MASKING(MSB 16bits) + AXI_ID(LSB 16bits) */
|
||||
|
||||
#define to_ddr_pmu(p) container_of(p, struct ddr_pmu, pmu)
|
||||
@@ -429,6 +433,17 @@ static void ddr_perf_counter_enable(struct ddr_pmu *pmu, int config,
|
||||
writel(0, pmu->base + reg);
|
||||
val = CNTL_EN | CNTL_CLEAR;
|
||||
val |= FIELD_PREP(CNTL_CSV_MASK, config);
|
||||
|
||||
/*
|
||||
* On i.MX8MP we need to bias the cycle counter to overflow more often.
|
||||
* We do this by initializing bits [23:16] of the counter value via the
|
||||
* COUNTER_CTRL Counter Parameter (CP) field.
|
||||
*/
|
||||
if (pmu->devtype_data->quirks & DDR_CAP_AXI_ID_FILTER_ENHANCED) {
|
||||
if (counter == EVENT_CYCLES_COUNTER)
|
||||
val |= FIELD_PREP(CNTL_CP_MASK, 0xf0);
|
||||
}
|
||||
|
||||
writel(val, pmu->base + reg);
|
||||
} else {
|
||||
/* Disable counter */
|
||||
@@ -468,6 +483,12 @@ static void ddr_perf_event_update(struct perf_event *event)
|
||||
int ret;
|
||||
|
||||
new_raw_count = ddr_perf_read_counter(pmu, counter);
|
||||
/* Remove the bias applied in ddr_perf_counter_enable(). */
|
||||
if (pmu->devtype_data->quirks & DDR_CAP_AXI_ID_FILTER_ENHANCED) {
|
||||
if (counter == EVENT_CYCLES_COUNTER)
|
||||
new_raw_count &= CYCLES_COUNTER_MASK;
|
||||
}
|
||||
|
||||
local64_add(new_raw_count, &event->count);
|
||||
|
||||
/*
|
||||
|
||||
@@ -6058,7 +6058,7 @@ lpfc_debugfs_initialize(struct lpfc_vport *vport)
|
||||
phba->hba_debugfs_root,
|
||||
phba,
|
||||
&lpfc_debugfs_op_multixripools);
|
||||
if (!phba->debug_multixri_pools) {
|
||||
if (IS_ERR(phba->debug_multixri_pools)) {
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_INIT,
|
||||
"0527 Cannot create debugfs multixripools\n");
|
||||
goto debug_failed;
|
||||
@@ -6070,7 +6070,7 @@ lpfc_debugfs_initialize(struct lpfc_vport *vport)
|
||||
debugfs_create_file(name, S_IFREG | 0644,
|
||||
phba->hba_debugfs_root,
|
||||
phba, &lpfc_cgn_buffer_op);
|
||||
if (!phba->debug_cgn_buffer) {
|
||||
if (IS_ERR(phba->debug_cgn_buffer)) {
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_INIT,
|
||||
"6527 Cannot create debugfs "
|
||||
"cgn_buffer\n");
|
||||
@@ -6083,7 +6083,7 @@ lpfc_debugfs_initialize(struct lpfc_vport *vport)
|
||||
debugfs_create_file(name, S_IFREG | 0644,
|
||||
phba->hba_debugfs_root,
|
||||
phba, &lpfc_rx_monitor_op);
|
||||
if (!phba->debug_rx_monitor) {
|
||||
if (IS_ERR(phba->debug_rx_monitor)) {
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_INIT,
|
||||
"6528 Cannot create debugfs "
|
||||
"rx_monitor\n");
|
||||
@@ -6096,7 +6096,7 @@ lpfc_debugfs_initialize(struct lpfc_vport *vport)
|
||||
debugfs_create_file(name, 0644,
|
||||
phba->hba_debugfs_root,
|
||||
phba, &lpfc_debugfs_ras_log);
|
||||
if (!phba->debug_ras_log) {
|
||||
if (IS_ERR(phba->debug_ras_log)) {
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_INIT,
|
||||
"6148 Cannot create debugfs"
|
||||
" ras_log\n");
|
||||
@@ -6117,7 +6117,7 @@ lpfc_debugfs_initialize(struct lpfc_vport *vport)
|
||||
debugfs_create_file(name, S_IFREG | 0644,
|
||||
phba->hba_debugfs_root,
|
||||
phba, &lpfc_debugfs_op_lockstat);
|
||||
if (!phba->debug_lockstat) {
|
||||
if (IS_ERR(phba->debug_lockstat)) {
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_INIT,
|
||||
"4610 Can't create debugfs lockstat\n");
|
||||
goto debug_failed;
|
||||
@@ -6346,7 +6346,7 @@ nvmeio_off:
|
||||
debugfs_create_file(name, 0644,
|
||||
vport->vport_debugfs_root,
|
||||
vport, &lpfc_debugfs_op_scsistat);
|
||||
if (!vport->debug_scsistat) {
|
||||
if (IS_ERR(vport->debug_scsistat)) {
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_INIT,
|
||||
"4611 Cannot create debugfs scsistat\n");
|
||||
goto debug_failed;
|
||||
@@ -6357,7 +6357,7 @@ nvmeio_off:
|
||||
debugfs_create_file(name, 0644,
|
||||
vport->vport_debugfs_root,
|
||||
vport, &lpfc_debugfs_op_ioktime);
|
||||
if (!vport->debug_ioktime) {
|
||||
if (IS_ERR(vport->debug_ioktime)) {
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_INIT,
|
||||
"0815 Cannot create debugfs ioktime\n");
|
||||
goto debug_failed;
|
||||
|
||||
@@ -2330,7 +2330,7 @@ struct megasas_instance {
|
||||
u32 support_morethan256jbod; /* FW support for more than 256 PD/JBOD */
|
||||
bool use_seqnum_jbod_fp; /* Added for PD sequence */
|
||||
bool smp_affinity_enable;
|
||||
spinlock_t crashdump_lock;
|
||||
struct mutex crashdump_lock;
|
||||
|
||||
struct megasas_register_set __iomem *reg_set;
|
||||
u32 __iomem *reply_post_host_index_addr[MR_MAX_MSIX_REG_ARRAY];
|
||||
|
||||
@@ -3274,14 +3274,13 @@ fw_crash_buffer_store(struct device *cdev,
|
||||
struct megasas_instance *instance =
|
||||
(struct megasas_instance *) shost->hostdata;
|
||||
int val = 0;
|
||||
unsigned long flags;
|
||||
|
||||
if (kstrtoint(buf, 0, &val) != 0)
|
||||
return -EINVAL;
|
||||
|
||||
spin_lock_irqsave(&instance->crashdump_lock, flags);
|
||||
mutex_lock(&instance->crashdump_lock);
|
||||
instance->fw_crash_buffer_offset = val;
|
||||
spin_unlock_irqrestore(&instance->crashdump_lock, flags);
|
||||
mutex_unlock(&instance->crashdump_lock);
|
||||
return strlen(buf);
|
||||
}
|
||||
|
||||
@@ -3296,24 +3295,23 @@ fw_crash_buffer_show(struct device *cdev,
|
||||
unsigned long dmachunk = CRASH_DMA_BUF_SIZE;
|
||||
unsigned long chunk_left_bytes;
|
||||
unsigned long src_addr;
|
||||
unsigned long flags;
|
||||
u32 buff_offset;
|
||||
|
||||
spin_lock_irqsave(&instance->crashdump_lock, flags);
|
||||
mutex_lock(&instance->crashdump_lock);
|
||||
buff_offset = instance->fw_crash_buffer_offset;
|
||||
if (!instance->crash_dump_buf ||
|
||||
!((instance->fw_crash_state == AVAILABLE) ||
|
||||
(instance->fw_crash_state == COPYING))) {
|
||||
dev_err(&instance->pdev->dev,
|
||||
"Firmware crash dump is not available\n");
|
||||
spin_unlock_irqrestore(&instance->crashdump_lock, flags);
|
||||
mutex_unlock(&instance->crashdump_lock);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (buff_offset > (instance->fw_crash_buffer_size * dmachunk)) {
|
||||
dev_err(&instance->pdev->dev,
|
||||
"Firmware crash dump offset is out of range\n");
|
||||
spin_unlock_irqrestore(&instance->crashdump_lock, flags);
|
||||
mutex_unlock(&instance->crashdump_lock);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -3325,7 +3323,7 @@ fw_crash_buffer_show(struct device *cdev,
|
||||
src_addr = (unsigned long)instance->crash_buf[buff_offset / dmachunk] +
|
||||
(buff_offset % dmachunk);
|
||||
memcpy(buf, (void *)src_addr, size);
|
||||
spin_unlock_irqrestore(&instance->crashdump_lock, flags);
|
||||
mutex_unlock(&instance->crashdump_lock);
|
||||
|
||||
return size;
|
||||
}
|
||||
@@ -3350,7 +3348,6 @@ fw_crash_state_store(struct device *cdev,
|
||||
struct megasas_instance *instance =
|
||||
(struct megasas_instance *) shost->hostdata;
|
||||
int val = 0;
|
||||
unsigned long flags;
|
||||
|
||||
if (kstrtoint(buf, 0, &val) != 0)
|
||||
return -EINVAL;
|
||||
@@ -3364,9 +3361,9 @@ fw_crash_state_store(struct device *cdev,
|
||||
instance->fw_crash_state = val;
|
||||
|
||||
if ((val == COPIED) || (val == COPY_ERROR)) {
|
||||
spin_lock_irqsave(&instance->crashdump_lock, flags);
|
||||
mutex_lock(&instance->crashdump_lock);
|
||||
megasas_free_host_crash_buffer(instance);
|
||||
spin_unlock_irqrestore(&instance->crashdump_lock, flags);
|
||||
mutex_unlock(&instance->crashdump_lock);
|
||||
if (val == COPY_ERROR)
|
||||
dev_info(&instance->pdev->dev, "application failed to "
|
||||
"copy Firmware crash dump\n");
|
||||
@@ -7431,7 +7428,7 @@ static inline void megasas_init_ctrl_params(struct megasas_instance *instance)
|
||||
init_waitqueue_head(&instance->int_cmd_wait_q);
|
||||
init_waitqueue_head(&instance->abort_cmd_wait_q);
|
||||
|
||||
spin_lock_init(&instance->crashdump_lock);
|
||||
mutex_init(&instance->crashdump_lock);
|
||||
spin_lock_init(&instance->mfi_pool_lock);
|
||||
spin_lock_init(&instance->hba_lock);
|
||||
spin_lock_init(&instance->stream_lock);
|
||||
|
||||
@@ -255,7 +255,6 @@ static irqreturn_t pm8001_interrupt_handler_intx(int irq, void *dev_id)
|
||||
return ret;
|
||||
}
|
||||
|
||||
static u32 pm8001_setup_irq(struct pm8001_hba_info *pm8001_ha);
|
||||
static u32 pm8001_request_irq(struct pm8001_hba_info *pm8001_ha);
|
||||
|
||||
/**
|
||||
@@ -276,13 +275,6 @@ static int pm8001_alloc(struct pm8001_hba_info *pm8001_ha,
|
||||
pm8001_dbg(pm8001_ha, INIT, "pm8001_alloc: PHY:%x\n",
|
||||
pm8001_ha->chip->n_phy);
|
||||
|
||||
/* Setup Interrupt */
|
||||
rc = pm8001_setup_irq(pm8001_ha);
|
||||
if (rc) {
|
||||
pm8001_dbg(pm8001_ha, FAIL,
|
||||
"pm8001_setup_irq failed [ret: %d]\n", rc);
|
||||
goto err_out;
|
||||
}
|
||||
/* Request Interrupt */
|
||||
rc = pm8001_request_irq(pm8001_ha);
|
||||
if (rc)
|
||||
@@ -1002,47 +994,38 @@ static u32 pm8001_request_msix(struct pm8001_hba_info *pm8001_ha)
|
||||
}
|
||||
#endif
|
||||
|
||||
static u32 pm8001_setup_irq(struct pm8001_hba_info *pm8001_ha)
|
||||
{
|
||||
struct pci_dev *pdev;
|
||||
|
||||
pdev = pm8001_ha->pdev;
|
||||
|
||||
#ifdef PM8001_USE_MSIX
|
||||
if (pci_find_capability(pdev, PCI_CAP_ID_MSIX))
|
||||
return pm8001_setup_msix(pm8001_ha);
|
||||
pm8001_dbg(pm8001_ha, INIT, "MSIX not supported!!!\n");
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* pm8001_request_irq - register interrupt
|
||||
* @pm8001_ha: our ha struct.
|
||||
*/
|
||||
static u32 pm8001_request_irq(struct pm8001_hba_info *pm8001_ha)
|
||||
{
|
||||
struct pci_dev *pdev;
|
||||
struct pci_dev *pdev = pm8001_ha->pdev;
|
||||
#ifdef PM8001_USE_MSIX
|
||||
int rc;
|
||||
|
||||
pdev = pm8001_ha->pdev;
|
||||
if (pci_find_capability(pdev, PCI_CAP_ID_MSIX)) {
|
||||
rc = pm8001_setup_msix(pm8001_ha);
|
||||
if (rc) {
|
||||
pm8001_dbg(pm8001_ha, FAIL,
|
||||
"pm8001_setup_irq failed [ret: %d]\n", rc);
|
||||
return rc;
|
||||
}
|
||||
|
||||
#ifdef PM8001_USE_MSIX
|
||||
if (pdev->msix_cap && pci_msi_enabled())
|
||||
return pm8001_request_msix(pm8001_ha);
|
||||
else {
|
||||
pm8001_dbg(pm8001_ha, INIT, "MSIX not supported!!!\n");
|
||||
goto intx;
|
||||
if (pdev->msix_cap && pci_msi_enabled())
|
||||
return pm8001_request_msix(pm8001_ha);
|
||||
}
|
||||
|
||||
pm8001_dbg(pm8001_ha, INIT, "MSIX not supported!!!\n");
|
||||
#endif
|
||||
|
||||
intx:
|
||||
/* initialize the INT-X interrupt */
|
||||
pm8001_ha->irq_vector[0].irq_id = 0;
|
||||
pm8001_ha->irq_vector[0].drv_inst = pm8001_ha;
|
||||
rc = request_irq(pdev->irq, pm8001_interrupt_handler_intx, IRQF_SHARED,
|
||||
pm8001_ha->name, SHOST_TO_SAS_HA(pm8001_ha->shost));
|
||||
return rc;
|
||||
|
||||
return request_irq(pdev->irq, pm8001_interrupt_handler_intx,
|
||||
IRQF_SHARED, pm8001_ha->name,
|
||||
SHOST_TO_SAS_HA(pm8001_ha->shost));
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -116,7 +116,7 @@ qla2x00_dfs_create_rport(scsi_qla_host_t *vha, struct fc_port *fp)
|
||||
|
||||
sprintf(wwn, "pn-%016llx", wwn_to_u64(fp->port_name));
|
||||
fp->dfs_rport_dir = debugfs_create_dir(wwn, vha->dfs_rport_root);
|
||||
if (!fp->dfs_rport_dir)
|
||||
if (IS_ERR(fp->dfs_rport_dir))
|
||||
return;
|
||||
if (NVME_TARGET(vha->hw, fp))
|
||||
debugfs_create_file("dev_loss_tmo", 0600, fp->dfs_rport_dir,
|
||||
@@ -615,14 +615,14 @@ create_nodes:
|
||||
if (IS_QLA27XX(ha) || IS_QLA83XX(ha) || IS_QLA28XX(ha)) {
|
||||
ha->tgt.dfs_naqp = debugfs_create_file("naqp",
|
||||
0400, ha->dfs_dir, vha, &dfs_naqp_ops);
|
||||
if (!ha->tgt.dfs_naqp) {
|
||||
if (IS_ERR(ha->tgt.dfs_naqp)) {
|
||||
ql_log(ql_log_warn, vha, 0xd011,
|
||||
"Unable to create debugFS naqp node.\n");
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
vha->dfs_rport_root = debugfs_create_dir("rports", ha->dfs_dir);
|
||||
if (!vha->dfs_rport_root) {
|
||||
if (IS_ERR(vha->dfs_rport_root)) {
|
||||
ql_log(ql_log_warn, vha, 0xd012,
|
||||
"Unable to create debugFS rports node.\n");
|
||||
goto out;
|
||||
|
||||
@@ -507,102 +507,102 @@ static ssize_t lio_target_nacl_info_show(struct config_item *item, char *page)
|
||||
spin_lock_bh(&se_nacl->nacl_sess_lock);
|
||||
se_sess = se_nacl->nacl_sess;
|
||||
if (!se_sess) {
|
||||
rb += sprintf(page+rb, "No active iSCSI Session for Initiator"
|
||||
rb += sysfs_emit_at(page, rb, "No active iSCSI Session for Initiator"
|
||||
" Endpoint: %s\n", se_nacl->initiatorname);
|
||||
} else {
|
||||
sess = se_sess->fabric_sess_ptr;
|
||||
|
||||
rb += sprintf(page+rb, "InitiatorName: %s\n",
|
||||
rb += sysfs_emit_at(page, rb, "InitiatorName: %s\n",
|
||||
sess->sess_ops->InitiatorName);
|
||||
rb += sprintf(page+rb, "InitiatorAlias: %s\n",
|
||||
rb += sysfs_emit_at(page, rb, "InitiatorAlias: %s\n",
|
||||
sess->sess_ops->InitiatorAlias);
|
||||
|
||||
rb += sprintf(page+rb,
|
||||
rb += sysfs_emit_at(page, rb,
|
||||
"LIO Session ID: %u ISID: 0x%6ph TSIH: %hu ",
|
||||
sess->sid, sess->isid, sess->tsih);
|
||||
rb += sprintf(page+rb, "SessionType: %s\n",
|
||||
rb += sysfs_emit_at(page, rb, "SessionType: %s\n",
|
||||
(sess->sess_ops->SessionType) ?
|
||||
"Discovery" : "Normal");
|
||||
rb += sprintf(page+rb, "Session State: ");
|
||||
rb += sysfs_emit_at(page, rb, "Session State: ");
|
||||
switch (sess->session_state) {
|
||||
case TARG_SESS_STATE_FREE:
|
||||
rb += sprintf(page+rb, "TARG_SESS_FREE\n");
|
||||
rb += sysfs_emit_at(page, rb, "TARG_SESS_FREE\n");
|
||||
break;
|
||||
case TARG_SESS_STATE_ACTIVE:
|
||||
rb += sprintf(page+rb, "TARG_SESS_STATE_ACTIVE\n");
|
||||
rb += sysfs_emit_at(page, rb, "TARG_SESS_STATE_ACTIVE\n");
|
||||
break;
|
||||
case TARG_SESS_STATE_LOGGED_IN:
|
||||
rb += sprintf(page+rb, "TARG_SESS_STATE_LOGGED_IN\n");
|
||||
rb += sysfs_emit_at(page, rb, "TARG_SESS_STATE_LOGGED_IN\n");
|
||||
break;
|
||||
case TARG_SESS_STATE_FAILED:
|
||||
rb += sprintf(page+rb, "TARG_SESS_STATE_FAILED\n");
|
||||
rb += sysfs_emit_at(page, rb, "TARG_SESS_STATE_FAILED\n");
|
||||
break;
|
||||
case TARG_SESS_STATE_IN_CONTINUE:
|
||||
rb += sprintf(page+rb, "TARG_SESS_STATE_IN_CONTINUE\n");
|
||||
rb += sysfs_emit_at(page, rb, "TARG_SESS_STATE_IN_CONTINUE\n");
|
||||
break;
|
||||
default:
|
||||
rb += sprintf(page+rb, "ERROR: Unknown Session"
|
||||
rb += sysfs_emit_at(page, rb, "ERROR: Unknown Session"
|
||||
" State!\n");
|
||||
break;
|
||||
}
|
||||
|
||||
rb += sprintf(page+rb, "---------------------[iSCSI Session"
|
||||
rb += sysfs_emit_at(page, rb, "---------------------[iSCSI Session"
|
||||
" Values]-----------------------\n");
|
||||
rb += sprintf(page+rb, " CmdSN/WR : CmdSN/WC : ExpCmdSN"
|
||||
rb += sysfs_emit_at(page, rb, " CmdSN/WR : CmdSN/WC : ExpCmdSN"
|
||||
" : MaxCmdSN : ITT : TTT\n");
|
||||
max_cmd_sn = (u32) atomic_read(&sess->max_cmd_sn);
|
||||
rb += sprintf(page+rb, " 0x%08x 0x%08x 0x%08x 0x%08x"
|
||||
rb += sysfs_emit_at(page, rb, " 0x%08x 0x%08x 0x%08x 0x%08x"
|
||||
" 0x%08x 0x%08x\n",
|
||||
sess->cmdsn_window,
|
||||
(max_cmd_sn - sess->exp_cmd_sn) + 1,
|
||||
sess->exp_cmd_sn, max_cmd_sn,
|
||||
sess->init_task_tag, sess->targ_xfer_tag);
|
||||
rb += sprintf(page+rb, "----------------------[iSCSI"
|
||||
rb += sysfs_emit_at(page, rb, "----------------------[iSCSI"
|
||||
" Connections]-------------------------\n");
|
||||
|
||||
spin_lock(&sess->conn_lock);
|
||||
list_for_each_entry(conn, &sess->sess_conn_list, conn_list) {
|
||||
rb += sprintf(page+rb, "CID: %hu Connection"
|
||||
rb += sysfs_emit_at(page, rb, "CID: %hu Connection"
|
||||
" State: ", conn->cid);
|
||||
switch (conn->conn_state) {
|
||||
case TARG_CONN_STATE_FREE:
|
||||
rb += sprintf(page+rb,
|
||||
rb += sysfs_emit_at(page, rb,
|
||||
"TARG_CONN_STATE_FREE\n");
|
||||
break;
|
||||
case TARG_CONN_STATE_XPT_UP:
|
||||
rb += sprintf(page+rb,
|
||||
rb += sysfs_emit_at(page, rb,
|
||||
"TARG_CONN_STATE_XPT_UP\n");
|
||||
break;
|
||||
case TARG_CONN_STATE_IN_LOGIN:
|
||||
rb += sprintf(page+rb,
|
||||
rb += sysfs_emit_at(page, rb,
|
||||
"TARG_CONN_STATE_IN_LOGIN\n");
|
||||
break;
|
||||
case TARG_CONN_STATE_LOGGED_IN:
|
||||
rb += sprintf(page+rb,
|
||||
rb += sysfs_emit_at(page, rb,
|
||||
"TARG_CONN_STATE_LOGGED_IN\n");
|
||||
break;
|
||||
case TARG_CONN_STATE_IN_LOGOUT:
|
||||
rb += sprintf(page+rb,
|
||||
rb += sysfs_emit_at(page, rb,
|
||||
"TARG_CONN_STATE_IN_LOGOUT\n");
|
||||
break;
|
||||
case TARG_CONN_STATE_LOGOUT_REQUESTED:
|
||||
rb += sprintf(page+rb,
|
||||
rb += sysfs_emit_at(page, rb,
|
||||
"TARG_CONN_STATE_LOGOUT_REQUESTED\n");
|
||||
break;
|
||||
case TARG_CONN_STATE_CLEANUP_WAIT:
|
||||
rb += sprintf(page+rb,
|
||||
rb += sysfs_emit_at(page, rb,
|
||||
"TARG_CONN_STATE_CLEANUP_WAIT\n");
|
||||
break;
|
||||
default:
|
||||
rb += sprintf(page+rb,
|
||||
rb += sysfs_emit_at(page, rb,
|
||||
"ERROR: Unknown Connection State!\n");
|
||||
break;
|
||||
}
|
||||
|
||||
rb += sprintf(page+rb, " Address %pISc %s", &conn->login_sockaddr,
|
||||
rb += sysfs_emit_at(page, rb, " Address %pISc %s", &conn->login_sockaddr,
|
||||
(conn->network_transport == ISCSI_TCP) ?
|
||||
"TCP" : "SCTP");
|
||||
rb += sprintf(page+rb, " StatSN: 0x%08x\n",
|
||||
rb += sysfs_emit_at(page, rb, " StatSN: 0x%08x\n",
|
||||
conn->stat_sn);
|
||||
}
|
||||
spin_unlock(&sess->conn_lock);
|
||||
|
||||
@@ -1276,19 +1276,14 @@ static void cpm_uart_console_write(struct console *co, const char *s,
|
||||
{
|
||||
struct uart_cpm_port *pinfo = &cpm_uart_ports[co->index];
|
||||
unsigned long flags;
|
||||
int nolock = oops_in_progress;
|
||||
|
||||
if (unlikely(nolock)) {
|
||||
if (unlikely(oops_in_progress)) {
|
||||
local_irq_save(flags);
|
||||
} else {
|
||||
spin_lock_irqsave(&pinfo->port.lock, flags);
|
||||
}
|
||||
|
||||
cpm_uart_early_write(pinfo, s, count, true);
|
||||
|
||||
if (unlikely(nolock)) {
|
||||
cpm_uart_early_write(pinfo, s, count, true);
|
||||
local_irq_restore(flags);
|
||||
} else {
|
||||
spin_lock_irqsave(&pinfo->port.lock, flags);
|
||||
cpm_uart_early_write(pinfo, s, count, true);
|
||||
spin_unlock_irqrestore(&pinfo->port.lock, flags);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -256,9 +256,10 @@ static int cdns3_controller_resume(struct device *dev, pm_message_t msg)
|
||||
cdns3_set_platform_suspend(cdns->dev, false, false);
|
||||
|
||||
spin_lock_irqsave(&cdns->lock, flags);
|
||||
cdns_resume(cdns, !PMSG_IS_AUTO(msg));
|
||||
cdns_resume(cdns);
|
||||
cdns->in_lpm = false;
|
||||
spin_unlock_irqrestore(&cdns->lock, flags);
|
||||
cdns_set_active(cdns, !PMSG_IS_AUTO(msg));
|
||||
if (cdns->wakeup_pending) {
|
||||
cdns->wakeup_pending = false;
|
||||
enable_irq(cdns->wakeup_irq);
|
||||
|
||||
@@ -210,8 +210,9 @@ static int __maybe_unused cdnsp_pci_resume(struct device *dev)
|
||||
int ret;
|
||||
|
||||
spin_lock_irqsave(&cdns->lock, flags);
|
||||
ret = cdns_resume(cdns, 1);
|
||||
ret = cdns_resume(cdns);
|
||||
spin_unlock_irqrestore(&cdns->lock, flags);
|
||||
cdns_set_active(cdns, 1);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -522,9 +522,8 @@ int cdns_suspend(struct cdns *cdns)
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(cdns_suspend);
|
||||
|
||||
int cdns_resume(struct cdns *cdns, u8 set_active)
|
||||
int cdns_resume(struct cdns *cdns)
|
||||
{
|
||||
struct device *dev = cdns->dev;
|
||||
enum usb_role real_role;
|
||||
bool role_changed = false;
|
||||
int ret = 0;
|
||||
@@ -556,15 +555,23 @@ int cdns_resume(struct cdns *cdns, u8 set_active)
|
||||
if (cdns->roles[cdns->role]->resume)
|
||||
cdns->roles[cdns->role]->resume(cdns, cdns_power_is_lost(cdns));
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(cdns_resume);
|
||||
|
||||
void cdns_set_active(struct cdns *cdns, u8 set_active)
|
||||
{
|
||||
struct device *dev = cdns->dev;
|
||||
|
||||
if (set_active) {
|
||||
pm_runtime_disable(dev);
|
||||
pm_runtime_set_active(dev);
|
||||
pm_runtime_enable(dev);
|
||||
}
|
||||
|
||||
return 0;
|
||||
return;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(cdns_resume);
|
||||
EXPORT_SYMBOL_GPL(cdns_set_active);
|
||||
#endif /* CONFIG_PM_SLEEP */
|
||||
|
||||
MODULE_AUTHOR("Peter Chen <peter.chen@nxp.com>");
|
||||
|
||||
@@ -125,10 +125,13 @@ int cdns_init(struct cdns *cdns);
|
||||
int cdns_remove(struct cdns *cdns);
|
||||
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
int cdns_resume(struct cdns *cdns, u8 set_active);
|
||||
int cdns_resume(struct cdns *cdns);
|
||||
int cdns_suspend(struct cdns *cdns);
|
||||
void cdns_set_active(struct cdns *cdns, u8 set_active);
|
||||
#else /* CONFIG_PM_SLEEP */
|
||||
static inline int cdns_resume(struct cdns *cdns, u8 set_active)
|
||||
static inline int cdns_resume(struct cdns *cdns)
|
||||
{ return 0; }
|
||||
static inline int cdns_set_active(struct cdns *cdns, u8 set_active)
|
||||
{ return 0; }
|
||||
static inline int cdns_suspend(struct cdns *cdns)
|
||||
{ return 0; }
|
||||
|
||||
@@ -1956,9 +1956,13 @@ static void ch9getstatus(struct qe_udc *udc, u8 request_type, u16 value,
|
||||
} else if ((request_type & USB_RECIP_MASK) == USB_RECIP_ENDPOINT) {
|
||||
/* Get endpoint status */
|
||||
int pipe = index & USB_ENDPOINT_NUMBER_MASK;
|
||||
struct qe_ep *target_ep = &udc->eps[pipe];
|
||||
struct qe_ep *target_ep;
|
||||
u16 usep;
|
||||
|
||||
if (pipe >= USB_MAX_ENDPOINTS)
|
||||
goto stall;
|
||||
target_ep = &udc->eps[pipe];
|
||||
|
||||
/* stall if endpoint doesn't exist */
|
||||
if (!target_ep->ep.desc)
|
||||
goto stall;
|
||||
|
||||
@@ -755,10 +755,14 @@ restart:
|
||||
|
||||
/* normal [4.15.1.2] or error [4.15.1.1] completion */
|
||||
if (likely ((status & (STS_INT|STS_ERR)) != 0)) {
|
||||
if (likely ((status & STS_ERR) == 0))
|
||||
if (likely ((status & STS_ERR) == 0)) {
|
||||
INCR(ehci->stats.normal);
|
||||
else
|
||||
} else {
|
||||
/* Force to check port status */
|
||||
if (ehci->has_ci_pec_bug)
|
||||
status |= STS_PCD;
|
||||
INCR(ehci->stats.error);
|
||||
}
|
||||
bh = 1;
|
||||
}
|
||||
|
||||
|
||||
@@ -674,7 +674,8 @@ ehci_hub_status_data (struct usb_hcd *hcd, char *buf)
|
||||
|
||||
if ((temp & mask) != 0 || test_bit(i, &ehci->port_c_suspend)
|
||||
|| (ehci->reset_done[i] && time_after_eq(
|
||||
jiffies, ehci->reset_done[i]))) {
|
||||
jiffies, ehci->reset_done[i]))
|
||||
|| ehci_has_ci_pec_bug(ehci, temp)) {
|
||||
if (i < 7)
|
||||
buf [0] |= 1 << (i + 1);
|
||||
else
|
||||
@@ -874,6 +875,13 @@ int ehci_hub_control(
|
||||
if (temp & PORT_PEC)
|
||||
status |= USB_PORT_STAT_C_ENABLE << 16;
|
||||
|
||||
if (ehci_has_ci_pec_bug(ehci, temp)) {
|
||||
status |= USB_PORT_STAT_C_ENABLE << 16;
|
||||
ehci_info(ehci,
|
||||
"PE is cleared by HW port:%d PORTSC:%08x\n",
|
||||
wIndex + 1, temp);
|
||||
}
|
||||
|
||||
if ((temp & PORT_OCC) && (!ignore_oc && !ehci->spurious_oc)){
|
||||
status |= USB_PORT_STAT_C_OVERCURRENT << 16;
|
||||
|
||||
|
||||
@@ -207,6 +207,7 @@ struct ehci_hcd { /* one per controller */
|
||||
unsigned has_fsl_port_bug:1; /* FreeScale */
|
||||
unsigned has_fsl_hs_errata:1; /* Freescale HS quirk */
|
||||
unsigned has_fsl_susp_errata:1; /* NXP SUSP quirk */
|
||||
unsigned has_ci_pec_bug:1; /* ChipIdea PEC bug */
|
||||
unsigned big_endian_mmio:1;
|
||||
unsigned big_endian_desc:1;
|
||||
unsigned big_endian_capbase:1;
|
||||
@@ -706,6 +707,15 @@ ehci_port_speed(struct ehci_hcd *ehci, unsigned int portsc)
|
||||
*/
|
||||
#define ehci_has_fsl_susp_errata(e) ((e)->has_fsl_susp_errata)
|
||||
|
||||
/*
|
||||
* Some Freescale/NXP processors using ChipIdea IP have a bug in which
|
||||
* disabling the port (PE is cleared) does not cause PEC to be asserted
|
||||
* when frame babble is detected.
|
||||
*/
|
||||
#define ehci_has_ci_pec_bug(e, portsc) \
|
||||
((e)->has_ci_pec_bug && ((e)->command & CMD_PSE) \
|
||||
&& !(portsc & PORT_PEC) && !(portsc & PORT_PE))
|
||||
|
||||
/*
|
||||
* While most USB host controllers implement their registers in
|
||||
* little-endian format, a minority (celleb companion chip) implement
|
||||
|
||||
20
fs/attr.c
20
fs/attr.c
@@ -402,9 +402,25 @@ int notify_change(struct user_namespace *mnt_userns, struct dentry *dentry,
|
||||
return error;
|
||||
|
||||
if ((ia_valid & ATTR_MODE)) {
|
||||
umode_t amode = attr->ia_mode;
|
||||
/*
|
||||
* Don't allow changing the mode of symlinks:
|
||||
*
|
||||
* (1) The vfs doesn't take the mode of symlinks into account
|
||||
* during permission checking.
|
||||
* (2) This has never worked correctly. Most major filesystems
|
||||
* did return EOPNOTSUPP due to interactions with POSIX ACLs
|
||||
* but did still updated the mode of the symlink.
|
||||
* This inconsistency led system call wrapper providers such
|
||||
* as libc to block changing the mode of symlinks with
|
||||
* EOPNOTSUPP already.
|
||||
* (3) To even do this in the first place one would have to use
|
||||
* specific file descriptors and quite some effort.
|
||||
*/
|
||||
if (S_ISLNK(inode->i_mode))
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
/* Flag setting protected by i_mutex */
|
||||
if (is_sxid(amode))
|
||||
if (is_sxid(attr->ia_mode))
|
||||
inode->i_flags &= ~S_NOSEC;
|
||||
}
|
||||
|
||||
|
||||
@@ -32,8 +32,9 @@ void autofs_catatonic_mode(struct autofs_sb_info *sbi)
|
||||
wq->status = -ENOENT; /* Magic is gone - report failure */
|
||||
kfree(wq->name.name - wq->offset);
|
||||
wq->name.name = NULL;
|
||||
wq->wait_ctr--;
|
||||
wake_up_interruptible(&wq->queue);
|
||||
if (!--wq->wait_ctr)
|
||||
kfree(wq);
|
||||
wq = nwq;
|
||||
}
|
||||
fput(sbi->pipe); /* Close the pipe */
|
||||
|
||||
@@ -536,8 +536,6 @@ struct btrfs_swapfile_pin {
|
||||
int bg_extent_count;
|
||||
};
|
||||
|
||||
bool btrfs_pinned_by_swapfile(struct btrfs_fs_info *fs_info, void *ptr);
|
||||
|
||||
enum {
|
||||
BTRFS_FS_BARRIER,
|
||||
BTRFS_FS_CLOSING_START,
|
||||
|
||||
@@ -1083,20 +1083,33 @@ static int __btrfs_run_delayed_items(struct btrfs_trans_handle *trans, int nr)
|
||||
ret = __btrfs_commit_inode_delayed_items(trans, path,
|
||||
curr_node);
|
||||
if (ret) {
|
||||
btrfs_release_delayed_node(curr_node);
|
||||
curr_node = NULL;
|
||||
btrfs_abort_transaction(trans, ret);
|
||||
break;
|
||||
}
|
||||
|
||||
prev_node = curr_node;
|
||||
curr_node = btrfs_next_delayed_node(curr_node);
|
||||
/*
|
||||
* See the comment below about releasing path before releasing
|
||||
* node. If the commit of delayed items was successful the path
|
||||
* should always be released, but in case of an error, it may
|
||||
* point to locked extent buffers (a leaf at the very least).
|
||||
*/
|
||||
ASSERT(path->nodes[0] == NULL);
|
||||
btrfs_release_delayed_node(prev_node);
|
||||
}
|
||||
|
||||
/*
|
||||
* Release the path to avoid a potential deadlock and lockdep splat when
|
||||
* releasing the delayed node, as that requires taking the delayed node's
|
||||
* mutex. If another task starts running delayed items before we take
|
||||
* the mutex, it will first lock the mutex and then it may try to lock
|
||||
* the same btree path (leaf).
|
||||
*/
|
||||
btrfs_free_path(path);
|
||||
|
||||
if (curr_node)
|
||||
btrfs_release_delayed_node(curr_node);
|
||||
btrfs_free_path(path);
|
||||
trans->block_rsv = block_rsv;
|
||||
|
||||
return ret;
|
||||
|
||||
@@ -2605,13 +2605,11 @@ int btrfs_validate_super(struct btrfs_fs_info *fs_info,
|
||||
ret = -EINVAL;
|
||||
}
|
||||
|
||||
if (btrfs_fs_incompat(fs_info, METADATA_UUID) &&
|
||||
memcmp(fs_info->fs_devices->metadata_uuid,
|
||||
fs_info->super_copy->metadata_uuid, BTRFS_FSID_SIZE)) {
|
||||
if (memcmp(fs_info->fs_devices->metadata_uuid, btrfs_sb_fsid_ptr(sb),
|
||||
BTRFS_FSID_SIZE) != 0) {
|
||||
btrfs_err(fs_info,
|
||||
"superblock metadata_uuid doesn't match metadata uuid of fs_devices: %pU != %pU",
|
||||
fs_info->super_copy->metadata_uuid,
|
||||
fs_info->fs_devices->metadata_uuid);
|
||||
btrfs_sb_fsid_ptr(sb), fs_info->fs_devices->metadata_uuid);
|
||||
ret = -EINVAL;
|
||||
}
|
||||
|
||||
|
||||
@@ -860,6 +860,11 @@ again:
|
||||
err = -ENOENT;
|
||||
goto out;
|
||||
} else if (WARN_ON(ret)) {
|
||||
btrfs_print_leaf(path->nodes[0]);
|
||||
btrfs_err(fs_info,
|
||||
"extent item not found for insert, bytenr %llu num_bytes %llu parent %llu root_objectid %llu owner %llu offset %llu",
|
||||
bytenr, num_bytes, parent, root_objectid, owner,
|
||||
offset);
|
||||
err = -EIO;
|
||||
goto out;
|
||||
}
|
||||
|
||||
@@ -2526,6 +2526,13 @@ static int btrfs_search_path_in_tree_user(struct user_namespace *mnt_userns,
|
||||
goto out_put;
|
||||
}
|
||||
|
||||
/*
|
||||
* We don't need the path anymore, so release it and
|
||||
* avoid deadlocks and lockdep warnings in case
|
||||
* btrfs_iget() needs to lookup the inode from its root
|
||||
* btree and lock the same leaf.
|
||||
*/
|
||||
btrfs_release_path(path);
|
||||
temp_inode = btrfs_iget(sb, key2.objectid, root);
|
||||
if (IS_ERR(temp_inode)) {
|
||||
ret = PTR_ERR(temp_inode);
|
||||
@@ -2546,7 +2553,6 @@ static int btrfs_search_path_in_tree_user(struct user_namespace *mnt_userns,
|
||||
goto out_put;
|
||||
}
|
||||
|
||||
btrfs_release_path(path);
|
||||
key.objectid = key.offset;
|
||||
key.offset = (u64)-1;
|
||||
dirid = key.objectid;
|
||||
|
||||
@@ -709,6 +709,14 @@ error_free_page:
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
u8 *btrfs_sb_fsid_ptr(struct btrfs_super_block *sb)
|
||||
{
|
||||
bool has_metadata_uuid = (btrfs_super_incompat_flags(sb) &
|
||||
BTRFS_FEATURE_INCOMPAT_METADATA_UUID);
|
||||
|
||||
return has_metadata_uuid ? sb->metadata_uuid : sb->fsid;
|
||||
}
|
||||
|
||||
/*
|
||||
* Handle scanned device having its CHANGING_FSID_V2 flag set and the fs_devices
|
||||
* being created with a disk that has already completed its fsid change. Such
|
||||
|
||||
@@ -622,4 +622,7 @@ const char *btrfs_bg_type_to_raid_name(u64 flags);
|
||||
int btrfs_verify_dev_extents(struct btrfs_fs_info *fs_info);
|
||||
int btrfs_repair_one_zone(struct btrfs_fs_info *fs_info, u64 logical);
|
||||
|
||||
bool btrfs_pinned_by_swapfile(struct btrfs_fs_info *fs_info, void *ptr);
|
||||
u8 *btrfs_sb_fsid_ptr(struct btrfs_super_block *sb);
|
||||
|
||||
#endif
|
||||
|
||||
@@ -694,10 +694,10 @@ ext2_xattr_set2(struct inode *inode, struct buffer_head *old_bh,
|
||||
/* We need to allocate a new block */
|
||||
ext2_fsblk_t goal = ext2_group_first_block_no(sb,
|
||||
EXT2_I(inode)->i_block_group);
|
||||
int block = ext2_new_block(inode, goal, &error);
|
||||
ext2_fsblk_t block = ext2_new_block(inode, goal, &error);
|
||||
if (error)
|
||||
goto cleanup;
|
||||
ea_idebug(inode, "creating block %d", block);
|
||||
ea_idebug(inode, "creating block %lu", block);
|
||||
|
||||
new_bh = sb_getblk(sb, block);
|
||||
if (unlikely(!new_bh)) {
|
||||
|
||||
@@ -343,17 +343,17 @@ static struct ext4_dir_entry_tail *get_dirent_tail(struct inode *inode,
|
||||
struct buffer_head *bh)
|
||||
{
|
||||
struct ext4_dir_entry_tail *t;
|
||||
int blocksize = EXT4_BLOCK_SIZE(inode->i_sb);
|
||||
|
||||
#ifdef PARANOID
|
||||
struct ext4_dir_entry *d, *top;
|
||||
|
||||
d = (struct ext4_dir_entry *)bh->b_data;
|
||||
top = (struct ext4_dir_entry *)(bh->b_data +
|
||||
(EXT4_BLOCK_SIZE(inode->i_sb) -
|
||||
sizeof(struct ext4_dir_entry_tail)));
|
||||
while (d < top && d->rec_len)
|
||||
(blocksize - sizeof(struct ext4_dir_entry_tail)));
|
||||
while (d < top && ext4_rec_len_from_disk(d->rec_len, blocksize))
|
||||
d = (struct ext4_dir_entry *)(((void *)d) +
|
||||
le16_to_cpu(d->rec_len));
|
||||
ext4_rec_len_from_disk(d->rec_len, blocksize));
|
||||
|
||||
if (d != top)
|
||||
return NULL;
|
||||
@@ -364,7 +364,8 @@ static struct ext4_dir_entry_tail *get_dirent_tail(struct inode *inode,
|
||||
#endif
|
||||
|
||||
if (t->det_reserved_zero1 ||
|
||||
le16_to_cpu(t->det_rec_len) != sizeof(struct ext4_dir_entry_tail) ||
|
||||
(ext4_rec_len_from_disk(t->det_rec_len, blocksize) !=
|
||||
sizeof(struct ext4_dir_entry_tail)) ||
|
||||
t->det_reserved_zero2 ||
|
||||
t->det_reserved_ft != EXT4_FT_DIR_CSUM)
|
||||
return NULL;
|
||||
@@ -445,13 +446,14 @@ static struct dx_countlimit *get_dx_countlimit(struct inode *inode,
|
||||
struct ext4_dir_entry *dp;
|
||||
struct dx_root_info *root;
|
||||
int count_offset;
|
||||
int blocksize = EXT4_BLOCK_SIZE(inode->i_sb);
|
||||
unsigned int rlen = ext4_rec_len_from_disk(dirent->rec_len, blocksize);
|
||||
|
||||
if (le16_to_cpu(dirent->rec_len) == EXT4_BLOCK_SIZE(inode->i_sb))
|
||||
if (rlen == blocksize)
|
||||
count_offset = 8;
|
||||
else if (le16_to_cpu(dirent->rec_len) == 12) {
|
||||
else if (rlen == 12) {
|
||||
dp = (struct ext4_dir_entry *)(((void *)dirent) + 12);
|
||||
if (le16_to_cpu(dp->rec_len) !=
|
||||
EXT4_BLOCK_SIZE(inode->i_sb) - 12)
|
||||
if (ext4_rec_len_from_disk(dp->rec_len, blocksize) != blocksize - 12)
|
||||
return NULL;
|
||||
root = (struct dx_root_info *)(((void *)dp + 12));
|
||||
if (root->reserved_zero ||
|
||||
@@ -1315,6 +1317,7 @@ static int dx_make_map(struct inode *dir, struct buffer_head *bh,
|
||||
unsigned int buflen = bh->b_size;
|
||||
char *base = bh->b_data;
|
||||
struct dx_hash_info h = *hinfo;
|
||||
int blocksize = EXT4_BLOCK_SIZE(dir->i_sb);
|
||||
|
||||
if (ext4_has_metadata_csum(dir->i_sb))
|
||||
buflen -= sizeof(struct ext4_dir_entry_tail);
|
||||
@@ -1335,11 +1338,12 @@ static int dx_make_map(struct inode *dir, struct buffer_head *bh,
|
||||
map_tail--;
|
||||
map_tail->hash = h.hash;
|
||||
map_tail->offs = ((char *) de - base)>>2;
|
||||
map_tail->size = le16_to_cpu(de->rec_len);
|
||||
map_tail->size = ext4_rec_len_from_disk(de->rec_len,
|
||||
blocksize);
|
||||
count++;
|
||||
cond_resched();
|
||||
}
|
||||
de = ext4_next_entry(de, dir->i_sb->s_blocksize);
|
||||
de = ext4_next_entry(de, blocksize);
|
||||
}
|
||||
return count;
|
||||
}
|
||||
|
||||
@@ -165,7 +165,7 @@ int jbd2_log_do_checkpoint(journal_t *journal)
|
||||
tid_t this_tid;
|
||||
int result, batch_count = 0;
|
||||
|
||||
jbd_debug(1, "Start checkpoint\n");
|
||||
jbd2_debug(1, "Start checkpoint\n");
|
||||
|
||||
/*
|
||||
* First thing: if there are any transactions in the log which
|
||||
@@ -174,7 +174,7 @@ int jbd2_log_do_checkpoint(journal_t *journal)
|
||||
*/
|
||||
result = jbd2_cleanup_journal_tail(journal);
|
||||
trace_jbd2_checkpoint(journal, result);
|
||||
jbd_debug(1, "cleanup_journal_tail returned %d\n", result);
|
||||
jbd2_debug(1, "cleanup_journal_tail returned %d\n", result);
|
||||
if (result <= 0)
|
||||
return result;
|
||||
|
||||
@@ -725,5 +725,5 @@ void __jbd2_journal_drop_transaction(journal_t *journal, transaction_t *transact
|
||||
|
||||
trace_jbd2_drop_transaction(journal, transaction);
|
||||
|
||||
jbd_debug(1, "Dropping transaction %d, all done\n", transaction->t_tid);
|
||||
jbd2_debug(1, "Dropping transaction %d, all done\n", transaction->t_tid);
|
||||
}
|
||||
|
||||
@@ -419,7 +419,7 @@ void jbd2_journal_commit_transaction(journal_t *journal)
|
||||
|
||||
/* Do we need to erase the effects of a prior jbd2_journal_flush? */
|
||||
if (journal->j_flags & JBD2_FLUSHED) {
|
||||
jbd_debug(3, "super block updated\n");
|
||||
jbd2_debug(3, "super block updated\n");
|
||||
mutex_lock_io(&journal->j_checkpoint_mutex);
|
||||
/*
|
||||
* We hold j_checkpoint_mutex so tail cannot change under us.
|
||||
@@ -433,7 +433,7 @@ void jbd2_journal_commit_transaction(journal_t *journal)
|
||||
REQ_SYNC);
|
||||
mutex_unlock(&journal->j_checkpoint_mutex);
|
||||
} else {
|
||||
jbd_debug(3, "superblock not updated\n");
|
||||
jbd2_debug(3, "superblock not updated\n");
|
||||
}
|
||||
|
||||
J_ASSERT(journal->j_running_transaction != NULL);
|
||||
@@ -465,7 +465,7 @@ void jbd2_journal_commit_transaction(journal_t *journal)
|
||||
commit_transaction = journal->j_running_transaction;
|
||||
|
||||
trace_jbd2_start_commit(journal, commit_transaction);
|
||||
jbd_debug(1, "JBD2: starting commit of transaction %d\n",
|
||||
jbd2_debug(1, "JBD2: starting commit of transaction %d\n",
|
||||
commit_transaction->t_tid);
|
||||
|
||||
write_lock(&journal->j_state_lock);
|
||||
@@ -484,22 +484,9 @@ void jbd2_journal_commit_transaction(journal_t *journal)
|
||||
stats.run.rs_running = jbd2_time_diff(commit_transaction->t_start,
|
||||
stats.run.rs_locked);
|
||||
|
||||
spin_lock(&commit_transaction->t_handle_lock);
|
||||
while (atomic_read(&commit_transaction->t_updates)) {
|
||||
DEFINE_WAIT(wait);
|
||||
// waits for any t_updates to finish
|
||||
jbd2_journal_wait_updates(journal);
|
||||
|
||||
prepare_to_wait(&journal->j_wait_updates, &wait,
|
||||
TASK_UNINTERRUPTIBLE);
|
||||
if (atomic_read(&commit_transaction->t_updates)) {
|
||||
spin_unlock(&commit_transaction->t_handle_lock);
|
||||
write_unlock(&journal->j_state_lock);
|
||||
schedule();
|
||||
write_lock(&journal->j_state_lock);
|
||||
spin_lock(&commit_transaction->t_handle_lock);
|
||||
}
|
||||
finish_wait(&journal->j_wait_updates, &wait);
|
||||
}
|
||||
spin_unlock(&commit_transaction->t_handle_lock);
|
||||
commit_transaction->t_state = T_SWITCH;
|
||||
|
||||
J_ASSERT (atomic_read(&commit_transaction->t_outstanding_credits) <=
|
||||
@@ -551,7 +538,7 @@ void jbd2_journal_commit_transaction(journal_t *journal)
|
||||
__jbd2_journal_clean_checkpoint_list(journal, false);
|
||||
spin_unlock(&journal->j_list_lock);
|
||||
|
||||
jbd_debug(3, "JBD2: commit phase 1\n");
|
||||
jbd2_debug(3, "JBD2: commit phase 1\n");
|
||||
|
||||
/*
|
||||
* Clear revoked flag to reflect there is no revoked buffers
|
||||
@@ -584,7 +571,7 @@ void jbd2_journal_commit_transaction(journal_t *journal)
|
||||
wake_up_all(&journal->j_wait_transaction_locked);
|
||||
write_unlock(&journal->j_state_lock);
|
||||
|
||||
jbd_debug(3, "JBD2: commit phase 2a\n");
|
||||
jbd2_debug(3, "JBD2: commit phase 2a\n");
|
||||
|
||||
/*
|
||||
* Now start flushing things to disk, in the order they appear
|
||||
@@ -597,7 +584,7 @@ void jbd2_journal_commit_transaction(journal_t *journal)
|
||||
blk_start_plug(&plug);
|
||||
jbd2_journal_write_revoke_records(commit_transaction, &log_bufs);
|
||||
|
||||
jbd_debug(3, "JBD2: commit phase 2b\n");
|
||||
jbd2_debug(3, "JBD2: commit phase 2b\n");
|
||||
|
||||
/*
|
||||
* Way to go: we have now written out all of the data for a
|
||||
@@ -653,7 +640,7 @@ void jbd2_journal_commit_transaction(journal_t *journal)
|
||||
if (!descriptor) {
|
||||
J_ASSERT (bufs == 0);
|
||||
|
||||
jbd_debug(4, "JBD2: get descriptor\n");
|
||||
jbd2_debug(4, "JBD2: get descriptor\n");
|
||||
|
||||
descriptor = jbd2_journal_get_descriptor_buffer(
|
||||
commit_transaction,
|
||||
@@ -663,7 +650,7 @@ void jbd2_journal_commit_transaction(journal_t *journal)
|
||||
continue;
|
||||
}
|
||||
|
||||
jbd_debug(4, "JBD2: got buffer %llu (%p)\n",
|
||||
jbd2_debug(4, "JBD2: got buffer %llu (%p)\n",
|
||||
(unsigned long long)descriptor->b_blocknr,
|
||||
descriptor->b_data);
|
||||
tagp = &descriptor->b_data[sizeof(journal_header_t)];
|
||||
@@ -748,7 +735,7 @@ void jbd2_journal_commit_transaction(journal_t *journal)
|
||||
commit_transaction->t_buffers == NULL ||
|
||||
space_left < tag_bytes + 16 + csum_size) {
|
||||
|
||||
jbd_debug(4, "JBD2: Submit %d IOs\n", bufs);
|
||||
jbd2_debug(4, "JBD2: Submit %d IOs\n", bufs);
|
||||
|
||||
/* Write an end-of-descriptor marker before
|
||||
submitting the IOs. "tag" still points to
|
||||
@@ -819,7 +806,7 @@ start_journal_io:
|
||||
commit_transaction->t_state = T_COMMIT_DFLUSH;
|
||||
write_unlock(&journal->j_state_lock);
|
||||
|
||||
/*
|
||||
/*
|
||||
* If the journal is not located on the file system device,
|
||||
* then we must flush the file system device before we issue
|
||||
* the commit record
|
||||
@@ -850,7 +837,7 @@ start_journal_io:
|
||||
so we incur less scheduling load.
|
||||
*/
|
||||
|
||||
jbd_debug(3, "JBD2: commit phase 3\n");
|
||||
jbd2_debug(3, "JBD2: commit phase 3\n");
|
||||
|
||||
while (!list_empty(&io_bufs)) {
|
||||
struct buffer_head *bh = list_entry(io_bufs.prev,
|
||||
@@ -893,7 +880,7 @@ start_journal_io:
|
||||
|
||||
J_ASSERT (commit_transaction->t_shadow_list == NULL);
|
||||
|
||||
jbd_debug(3, "JBD2: commit phase 4\n");
|
||||
jbd2_debug(3, "JBD2: commit phase 4\n");
|
||||
|
||||
/* Here we wait for the revoke record and descriptor record buffers */
|
||||
while (!list_empty(&log_bufs)) {
|
||||
@@ -917,7 +904,7 @@ start_journal_io:
|
||||
if (err)
|
||||
jbd2_journal_abort(journal, err);
|
||||
|
||||
jbd_debug(3, "JBD2: commit phase 5\n");
|
||||
jbd2_debug(3, "JBD2: commit phase 5\n");
|
||||
write_lock(&journal->j_state_lock);
|
||||
J_ASSERT(commit_transaction->t_state == T_COMMIT_DFLUSH);
|
||||
commit_transaction->t_state = T_COMMIT_JFLUSH;
|
||||
@@ -956,7 +943,7 @@ start_journal_io:
|
||||
transaction can be removed from any checkpoint list it was on
|
||||
before. */
|
||||
|
||||
jbd_debug(3, "JBD2: commit phase 6\n");
|
||||
jbd2_debug(3, "JBD2: commit phase 6\n");
|
||||
|
||||
J_ASSERT(list_empty(&commit_transaction->t_inode_list));
|
||||
J_ASSERT(commit_transaction->t_buffers == NULL);
|
||||
@@ -1133,7 +1120,7 @@ restart_loop:
|
||||
|
||||
/* Done with this transaction! */
|
||||
|
||||
jbd_debug(3, "JBD2: commit phase 7\n");
|
||||
jbd2_debug(3, "JBD2: commit phase 7\n");
|
||||
|
||||
J_ASSERT(commit_transaction->t_state == T_COMMIT_JFLUSH);
|
||||
|
||||
@@ -1175,7 +1162,7 @@ restart_loop:
|
||||
journal->j_fc_cleanup_callback(journal, 1, commit_transaction->t_tid);
|
||||
|
||||
trace_jbd2_end_commit(journal, commit_transaction);
|
||||
jbd_debug(1, "JBD2: commit %d complete, head %d\n",
|
||||
jbd2_debug(1, "JBD2: commit %d complete, head %d\n",
|
||||
journal->j_commit_sequence, journal->j_tail_sequence);
|
||||
|
||||
write_lock(&journal->j_state_lock);
|
||||
|
||||
@@ -203,11 +203,11 @@ loop:
|
||||
if (journal->j_flags & JBD2_UNMOUNT)
|
||||
goto end_loop;
|
||||
|
||||
jbd_debug(1, "commit_sequence=%u, commit_request=%u\n",
|
||||
jbd2_debug(1, "commit_sequence=%u, commit_request=%u\n",
|
||||
journal->j_commit_sequence, journal->j_commit_request);
|
||||
|
||||
if (journal->j_commit_sequence != journal->j_commit_request) {
|
||||
jbd_debug(1, "OK, requests differ\n");
|
||||
jbd2_debug(1, "OK, requests differ\n");
|
||||
write_unlock(&journal->j_state_lock);
|
||||
del_timer_sync(&journal->j_commit_timer);
|
||||
jbd2_journal_commit_transaction(journal);
|
||||
@@ -222,7 +222,7 @@ loop:
|
||||
* good idea, because that depends on threads that may
|
||||
* be already stopped.
|
||||
*/
|
||||
jbd_debug(1, "Now suspending kjournald2\n");
|
||||
jbd2_debug(1, "Now suspending kjournald2\n");
|
||||
write_unlock(&journal->j_state_lock);
|
||||
try_to_freeze();
|
||||
write_lock(&journal->j_state_lock);
|
||||
@@ -252,7 +252,7 @@ loop:
|
||||
finish_wait(&journal->j_wait_commit, &wait);
|
||||
}
|
||||
|
||||
jbd_debug(1, "kjournald2 wakes\n");
|
||||
jbd2_debug(1, "kjournald2 wakes\n");
|
||||
|
||||
/*
|
||||
* Were we woken up by a commit wakeup event?
|
||||
@@ -260,7 +260,7 @@ loop:
|
||||
transaction = journal->j_running_transaction;
|
||||
if (transaction && time_after_eq(jiffies, transaction->t_expires)) {
|
||||
journal->j_commit_request = transaction->t_tid;
|
||||
jbd_debug(1, "woke because of timeout\n");
|
||||
jbd2_debug(1, "woke because of timeout\n");
|
||||
}
|
||||
goto loop;
|
||||
|
||||
@@ -268,7 +268,7 @@ end_loop:
|
||||
del_timer_sync(&journal->j_commit_timer);
|
||||
journal->j_task = NULL;
|
||||
wake_up(&journal->j_wait_done_commit);
|
||||
jbd_debug(1, "Journal thread exiting.\n");
|
||||
jbd2_debug(1, "Journal thread exiting.\n");
|
||||
write_unlock(&journal->j_state_lock);
|
||||
return 0;
|
||||
}
|
||||
@@ -500,7 +500,7 @@ int __jbd2_log_start_commit(journal_t *journal, tid_t target)
|
||||
*/
|
||||
|
||||
journal->j_commit_request = target;
|
||||
jbd_debug(1, "JBD2: requesting commit %u/%u\n",
|
||||
jbd2_debug(1, "JBD2: requesting commit %u/%u\n",
|
||||
journal->j_commit_request,
|
||||
journal->j_commit_sequence);
|
||||
journal->j_running_transaction->t_requested = jiffies;
|
||||
@@ -705,7 +705,7 @@ int jbd2_log_wait_commit(journal_t *journal, tid_t tid)
|
||||
}
|
||||
#endif
|
||||
while (tid_gt(tid, journal->j_commit_sequence)) {
|
||||
jbd_debug(1, "JBD2: want %u, j_commit_sequence=%u\n",
|
||||
jbd2_debug(1, "JBD2: want %u, j_commit_sequence=%u\n",
|
||||
tid, journal->j_commit_sequence);
|
||||
read_unlock(&journal->j_state_lock);
|
||||
wake_up(&journal->j_wait_commit);
|
||||
@@ -1123,7 +1123,7 @@ int __jbd2_update_log_tail(journal_t *journal, tid_t tid, unsigned long block)
|
||||
freed += journal->j_last - journal->j_first;
|
||||
|
||||
trace_jbd2_update_log_tail(journal, tid, block, freed);
|
||||
jbd_debug(1,
|
||||
jbd2_debug(1,
|
||||
"Cleaning journal tail from %u to %u (offset %lu), "
|
||||
"freeing %lu\n",
|
||||
journal->j_tail_sequence, tid, block, freed);
|
||||
@@ -1498,7 +1498,7 @@ journal_t *jbd2_journal_init_inode(struct inode *inode)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
jbd_debug(1, "JBD2: inode %s/%ld, size %lld, bits %d, blksize %ld\n",
|
||||
jbd2_debug(1, "JBD2: inode %s/%ld, size %lld, bits %d, blksize %ld\n",
|
||||
inode->i_sb->s_id, inode->i_ino, (long long) inode->i_size,
|
||||
inode->i_sb->s_blocksize_bits, inode->i_sb->s_blocksize);
|
||||
|
||||
@@ -1577,7 +1577,7 @@ static int journal_reset(journal_t *journal)
|
||||
* attempting a write to a potential-readonly device.
|
||||
*/
|
||||
if (sb->s_start == 0) {
|
||||
jbd_debug(1, "JBD2: Skipping superblock update on recovered sb "
|
||||
jbd2_debug(1, "JBD2: Skipping superblock update on recovered sb "
|
||||
"(start %ld, seq %u, errno %d)\n",
|
||||
journal->j_tail, journal->j_tail_sequence,
|
||||
journal->j_errno);
|
||||
@@ -1680,7 +1680,7 @@ int jbd2_journal_update_sb_log_tail(journal_t *journal, tid_t tail_tid,
|
||||
}
|
||||
|
||||
BUG_ON(!mutex_is_locked(&journal->j_checkpoint_mutex));
|
||||
jbd_debug(1, "JBD2: updating superblock (start %lu, seq %u)\n",
|
||||
jbd2_debug(1, "JBD2: updating superblock (start %lu, seq %u)\n",
|
||||
tail_block, tail_tid);
|
||||
|
||||
lock_buffer(journal->j_sb_buffer);
|
||||
@@ -1721,7 +1721,7 @@ static void jbd2_mark_journal_empty(journal_t *journal, int write_op)
|
||||
return;
|
||||
}
|
||||
|
||||
jbd_debug(1, "JBD2: Marking journal as empty (seq %u)\n",
|
||||
jbd2_debug(1, "JBD2: Marking journal as empty (seq %u)\n",
|
||||
journal->j_tail_sequence);
|
||||
|
||||
sb->s_sequence = cpu_to_be32(journal->j_tail_sequence);
|
||||
@@ -1867,7 +1867,7 @@ void jbd2_journal_update_sb_errno(journal_t *journal)
|
||||
errcode = journal->j_errno;
|
||||
if (errcode == -ESHUTDOWN)
|
||||
errcode = 0;
|
||||
jbd_debug(1, "JBD2: updating superblock error (errno %d)\n", errcode);
|
||||
jbd2_debug(1, "JBD2: updating superblock error (errno %d)\n", errcode);
|
||||
sb->s_errno = cpu_to_be32(errcode);
|
||||
|
||||
jbd2_write_superblock(journal, REQ_SYNC | REQ_FUA);
|
||||
@@ -2339,7 +2339,7 @@ int jbd2_journal_set_features(journal_t *journal, unsigned long compat,
|
||||
compat & JBD2_FEATURE_COMPAT_CHECKSUM)
|
||||
compat &= ~JBD2_FEATURE_COMPAT_CHECKSUM;
|
||||
|
||||
jbd_debug(1, "Setting new features 0x%lx/0x%lx/0x%lx\n",
|
||||
jbd2_debug(1, "Setting new features 0x%lx/0x%lx/0x%lx\n",
|
||||
compat, ro, incompat);
|
||||
|
||||
sb = journal->j_superblock;
|
||||
@@ -2408,7 +2408,7 @@ void jbd2_journal_clear_features(journal_t *journal, unsigned long compat,
|
||||
{
|
||||
journal_superblock_t *sb;
|
||||
|
||||
jbd_debug(1, "Clear features 0x%lx/0x%lx/0x%lx\n",
|
||||
jbd2_debug(1, "Clear features 0x%lx/0x%lx/0x%lx\n",
|
||||
compat, ro, incompat);
|
||||
|
||||
sb = journal->j_superblock;
|
||||
@@ -2865,7 +2865,7 @@ static struct journal_head *journal_alloc_journal_head(void)
|
||||
#endif
|
||||
ret = kmem_cache_zalloc(jbd2_journal_head_cache, GFP_NOFS);
|
||||
if (!ret) {
|
||||
jbd_debug(1, "out of memory for journal_head\n");
|
||||
jbd2_debug(1, "out of memory for journal_head\n");
|
||||
pr_notice_ratelimited("ENOMEM in %s, retrying.\n", __func__);
|
||||
ret = kmem_cache_zalloc(jbd2_journal_head_cache,
|
||||
GFP_NOFS | __GFP_NOFAIL);
|
||||
|
||||
@@ -224,12 +224,8 @@ static int count_tags(journal_t *journal, struct buffer_head *bh)
|
||||
/* Make sure we wrap around the log correctly! */
|
||||
#define wrap(journal, var) \
|
||||
do { \
|
||||
unsigned long _wrap_last = \
|
||||
jbd2_has_feature_fast_commit(journal) ? \
|
||||
(journal)->j_fc_last : (journal)->j_last; \
|
||||
\
|
||||
if (var >= _wrap_last) \
|
||||
var -= (_wrap_last - (journal)->j_first); \
|
||||
if (var >= (journal)->j_last) \
|
||||
var -= ((journal)->j_last - (journal)->j_first); \
|
||||
} while (0)
|
||||
|
||||
static int fc_do_one_pass(journal_t *journal,
|
||||
@@ -245,11 +241,11 @@ static int fc_do_one_pass(journal_t *journal,
|
||||
return 0;
|
||||
|
||||
while (next_fc_block <= journal->j_fc_last) {
|
||||
jbd_debug(3, "Fast commit replay: next block %ld\n",
|
||||
jbd2_debug(3, "Fast commit replay: next block %ld\n",
|
||||
next_fc_block);
|
||||
err = jread(&bh, journal, next_fc_block);
|
||||
if (err) {
|
||||
jbd_debug(3, "Fast commit replay: read error\n");
|
||||
jbd2_debug(3, "Fast commit replay: read error\n");
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -264,7 +260,7 @@ static int fc_do_one_pass(journal_t *journal,
|
||||
}
|
||||
|
||||
if (err)
|
||||
jbd_debug(3, "Fast commit replay failed, err = %d\n", err);
|
||||
jbd2_debug(3, "Fast commit replay failed, err = %d\n", err);
|
||||
|
||||
return err;
|
||||
}
|
||||
@@ -298,7 +294,7 @@ int jbd2_journal_recover(journal_t *journal)
|
||||
*/
|
||||
|
||||
if (!sb->s_start) {
|
||||
jbd_debug(1, "No recovery required, last transaction %d\n",
|
||||
jbd2_debug(1, "No recovery required, last transaction %d\n",
|
||||
be32_to_cpu(sb->s_sequence));
|
||||
journal->j_transaction_sequence = be32_to_cpu(sb->s_sequence) + 1;
|
||||
return 0;
|
||||
@@ -310,10 +306,10 @@ int jbd2_journal_recover(journal_t *journal)
|
||||
if (!err)
|
||||
err = do_one_pass(journal, &info, PASS_REPLAY);
|
||||
|
||||
jbd_debug(1, "JBD2: recovery, exit status %d, "
|
||||
jbd2_debug(1, "JBD2: recovery, exit status %d, "
|
||||
"recovered transactions %u to %u\n",
|
||||
err, info.start_transaction, info.end_transaction);
|
||||
jbd_debug(1, "JBD2: Replayed %d and revoked %d/%d blocks\n",
|
||||
jbd2_debug(1, "JBD2: Replayed %d and revoked %d/%d blocks\n",
|
||||
info.nr_replays, info.nr_revoke_hits, info.nr_revokes);
|
||||
|
||||
/* Restart the log at the next transaction ID, thus invalidating
|
||||
@@ -363,7 +359,7 @@ int jbd2_journal_skip_recovery(journal_t *journal)
|
||||
#ifdef CONFIG_JBD2_DEBUG
|
||||
int dropped = info.end_transaction -
|
||||
be32_to_cpu(journal->j_superblock->s_sequence);
|
||||
jbd_debug(1,
|
||||
jbd2_debug(1,
|
||||
"JBD2: ignoring %d transaction%s from the journal.\n",
|
||||
dropped, (dropped == 1) ? "" : "s");
|
||||
#endif
|
||||
@@ -485,7 +481,7 @@ static int do_one_pass(journal_t *journal,
|
||||
if (pass == PASS_SCAN)
|
||||
info->start_transaction = first_commit_ID;
|
||||
|
||||
jbd_debug(1, "Starting recovery pass %d\n", pass);
|
||||
jbd2_debug(1, "Starting recovery pass %d\n", pass);
|
||||
|
||||
/*
|
||||
* Now we walk through the log, transaction by transaction,
|
||||
@@ -511,16 +507,14 @@ static int do_one_pass(journal_t *journal,
|
||||
if (tid_geq(next_commit_ID, info->end_transaction))
|
||||
break;
|
||||
|
||||
jbd_debug(2, "Scanning for sequence ID %u at %lu/%lu\n",
|
||||
next_commit_ID, next_log_block,
|
||||
jbd2_has_feature_fast_commit(journal) ?
|
||||
journal->j_fc_last : journal->j_last);
|
||||
jbd2_debug(2, "Scanning for sequence ID %u at %lu/%lu\n",
|
||||
next_commit_ID, next_log_block, journal->j_last);
|
||||
|
||||
/* Skip over each chunk of the transaction looking
|
||||
* either the next descriptor block or the final commit
|
||||
* record. */
|
||||
|
||||
jbd_debug(3, "JBD2: checking block %ld\n", next_log_block);
|
||||
jbd2_debug(3, "JBD2: checking block %ld\n", next_log_block);
|
||||
err = jread(&bh, journal, next_log_block);
|
||||
if (err)
|
||||
goto failed;
|
||||
@@ -543,7 +537,7 @@ static int do_one_pass(journal_t *journal,
|
||||
|
||||
blocktype = be32_to_cpu(tmp->h_blocktype);
|
||||
sequence = be32_to_cpu(tmp->h_sequence);
|
||||
jbd_debug(3, "Found magic %d, sequence %d\n",
|
||||
jbd2_debug(3, "Found magic %d, sequence %d\n",
|
||||
blocktype, sequence);
|
||||
|
||||
if (sequence != next_commit_ID) {
|
||||
@@ -576,7 +570,7 @@ static int do_one_pass(journal_t *journal,
|
||||
goto failed;
|
||||
}
|
||||
need_check_commit_time = true;
|
||||
jbd_debug(1,
|
||||
jbd2_debug(1,
|
||||
"invalid descriptor block found in %lu\n",
|
||||
next_log_block);
|
||||
}
|
||||
@@ -759,7 +753,7 @@ static int do_one_pass(journal_t *journal,
|
||||
* It likely does not belong to same journal,
|
||||
* just end this recovery with success.
|
||||
*/
|
||||
jbd_debug(1, "JBD2: Invalid checksum ignored in transaction %u, likely stale data\n",
|
||||
jbd2_debug(1, "JBD2: Invalid checksum ignored in transaction %u, likely stale data\n",
|
||||
next_commit_ID);
|
||||
brelse(bh);
|
||||
goto done;
|
||||
@@ -827,7 +821,7 @@ static int do_one_pass(journal_t *journal,
|
||||
if (pass == PASS_SCAN &&
|
||||
!jbd2_descriptor_block_csum_verify(journal,
|
||||
bh->b_data)) {
|
||||
jbd_debug(1, "JBD2: invalid revoke block found in %lu\n",
|
||||
jbd2_debug(1, "JBD2: invalid revoke block found in %lu\n",
|
||||
next_log_block);
|
||||
need_check_commit_time = true;
|
||||
}
|
||||
@@ -846,7 +840,7 @@ static int do_one_pass(journal_t *journal,
|
||||
continue;
|
||||
|
||||
default:
|
||||
jbd_debug(3, "Unrecognised magic %d, end of scan.\n",
|
||||
jbd2_debug(3, "Unrecognised magic %d, end of scan.\n",
|
||||
blocktype);
|
||||
brelse(bh);
|
||||
goto done;
|
||||
|
||||
@@ -398,7 +398,7 @@ int jbd2_journal_revoke(handle_t *handle, unsigned long long blocknr,
|
||||
}
|
||||
handle->h_revoke_credits--;
|
||||
|
||||
jbd_debug(2, "insert revoke for block %llu, bh_in=%p\n",blocknr, bh_in);
|
||||
jbd2_debug(2, "insert revoke for block %llu, bh_in=%p\n",blocknr, bh_in);
|
||||
err = insert_revoke_hash(journal, blocknr,
|
||||
handle->h_transaction->t_tid);
|
||||
BUFFER_TRACE(bh_in, "exit");
|
||||
@@ -428,7 +428,7 @@ int jbd2_journal_cancel_revoke(handle_t *handle, struct journal_head *jh)
|
||||
int did_revoke = 0; /* akpm: debug */
|
||||
struct buffer_head *bh = jh2bh(jh);
|
||||
|
||||
jbd_debug(4, "journal_head %p, cancelling revoke\n", jh);
|
||||
jbd2_debug(4, "journal_head %p, cancelling revoke\n", jh);
|
||||
|
||||
/* Is the existing Revoke bit valid? If so, we trust it, and
|
||||
* only perform the full cancel if the revoke bit is set. If
|
||||
@@ -444,7 +444,7 @@ int jbd2_journal_cancel_revoke(handle_t *handle, struct journal_head *jh)
|
||||
if (need_cancel) {
|
||||
record = find_revoke_record(journal, bh->b_blocknr);
|
||||
if (record) {
|
||||
jbd_debug(4, "cancelled existing revoke on "
|
||||
jbd2_debug(4, "cancelled existing revoke on "
|
||||
"blocknr %llu\n", (unsigned long long)bh->b_blocknr);
|
||||
spin_lock(&journal->j_revoke_lock);
|
||||
list_del(&record->hash);
|
||||
@@ -560,7 +560,7 @@ void jbd2_journal_write_revoke_records(transaction_t *transaction,
|
||||
}
|
||||
if (descriptor)
|
||||
flush_descriptor(journal, descriptor, offset);
|
||||
jbd_debug(1, "Wrote %d revoke records\n", count);
|
||||
jbd2_debug(1, "Wrote %d revoke records\n", count);
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
@@ -107,7 +107,6 @@ static void jbd2_get_transaction(journal_t *journal,
|
||||
transaction->t_start_time = ktime_get();
|
||||
transaction->t_tid = journal->j_transaction_sequence++;
|
||||
transaction->t_expires = jiffies + journal->j_commit_interval;
|
||||
spin_lock_init(&transaction->t_handle_lock);
|
||||
atomic_set(&transaction->t_updates, 0);
|
||||
atomic_set(&transaction->t_outstanding_credits,
|
||||
jbd2_descriptor_blocks_per_trans(journal) +
|
||||
@@ -139,24 +138,21 @@ static void jbd2_get_transaction(journal_t *journal,
|
||||
/*
|
||||
* Update transaction's maximum wait time, if debugging is enabled.
|
||||
*
|
||||
* In order for t_max_wait to be reliable, it must be protected by a
|
||||
* lock. But doing so will mean that start_this_handle() can not be
|
||||
* run in parallel on SMP systems, which limits our scalability. So
|
||||
* unless debugging is enabled, we no longer update t_max_wait, which
|
||||
* means that maximum wait time reported by the jbd2_run_stats
|
||||
* tracepoint will always be zero.
|
||||
* t_max_wait is carefully updated here with use of atomic compare exchange.
|
||||
* Note that there could be multiplre threads trying to do this simultaneously
|
||||
* hence using cmpxchg to avoid any use of locks in this case.
|
||||
*/
|
||||
static inline void update_t_max_wait(transaction_t *transaction,
|
||||
unsigned long ts)
|
||||
{
|
||||
#ifdef CONFIG_JBD2_DEBUG
|
||||
unsigned long oldts, newts;
|
||||
if (jbd2_journal_enable_debug &&
|
||||
time_after(transaction->t_start, ts)) {
|
||||
ts = jbd2_time_diff(ts, transaction->t_start);
|
||||
spin_lock(&transaction->t_handle_lock);
|
||||
if (ts > transaction->t_max_wait)
|
||||
transaction->t_max_wait = ts;
|
||||
spin_unlock(&transaction->t_handle_lock);
|
||||
newts = jbd2_time_diff(ts, transaction->t_start);
|
||||
oldts = READ_ONCE(transaction->t_max_wait);
|
||||
while (oldts < newts)
|
||||
oldts = cmpxchg(&transaction->t_max_wait, oldts, newts);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
@@ -378,7 +374,7 @@ alloc_transaction:
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
jbd_debug(3, "New handle %p going live.\n", handle);
|
||||
jbd2_debug(3, "New handle %p going live.\n", handle);
|
||||
|
||||
/*
|
||||
* We need to hold j_state_lock until t_updates has been incremented,
|
||||
@@ -449,7 +445,7 @@ repeat:
|
||||
}
|
||||
|
||||
/* OK, account for the buffers that this operation expects to
|
||||
* use and add the handle to the running transaction.
|
||||
* use and add the handle to the running transaction.
|
||||
*/
|
||||
update_t_max_wait(transaction, ts);
|
||||
handle->h_transaction = transaction;
|
||||
@@ -458,7 +454,7 @@ repeat:
|
||||
handle->h_start_jiffies = jiffies;
|
||||
atomic_inc(&transaction->t_updates);
|
||||
atomic_inc(&transaction->t_handle_count);
|
||||
jbd_debug(4, "Handle %p given %d credits (total %d, free %lu)\n",
|
||||
jbd2_debug(4, "Handle %p given %d credits (total %d, free %lu)\n",
|
||||
handle, blocks,
|
||||
atomic_read(&transaction->t_outstanding_credits),
|
||||
jbd2_log_space_left(journal));
|
||||
@@ -679,7 +675,7 @@ int jbd2_journal_extend(handle_t *handle, int nblocks, int revoke_records)
|
||||
|
||||
/* Don't extend a locked-down transaction! */
|
||||
if (transaction->t_state != T_RUNNING) {
|
||||
jbd_debug(3, "denied handle %p %d blocks: "
|
||||
jbd2_debug(3, "denied handle %p %d blocks: "
|
||||
"transaction not running\n", handle, nblocks);
|
||||
goto error_out;
|
||||
}
|
||||
@@ -690,15 +686,14 @@ int jbd2_journal_extend(handle_t *handle, int nblocks, int revoke_records)
|
||||
DIV_ROUND_UP(
|
||||
handle->h_revoke_credits_requested,
|
||||
journal->j_revoke_records_per_block);
|
||||
spin_lock(&transaction->t_handle_lock);
|
||||
wanted = atomic_add_return(nblocks,
|
||||
&transaction->t_outstanding_credits);
|
||||
|
||||
if (wanted > journal->j_max_transaction_buffers) {
|
||||
jbd_debug(3, "denied handle %p %d blocks: "
|
||||
jbd2_debug(3, "denied handle %p %d blocks: "
|
||||
"transaction too large\n", handle, nblocks);
|
||||
atomic_sub(nblocks, &transaction->t_outstanding_credits);
|
||||
goto unlock;
|
||||
goto error_out;
|
||||
}
|
||||
|
||||
trace_jbd2_handle_extend(journal->j_fs_dev->bd_dev,
|
||||
@@ -713,9 +708,7 @@ int jbd2_journal_extend(handle_t *handle, int nblocks, int revoke_records)
|
||||
handle->h_revoke_credits_requested += revoke_records;
|
||||
result = 0;
|
||||
|
||||
jbd_debug(3, "extended handle %p by %d\n", handle, nblocks);
|
||||
unlock:
|
||||
spin_unlock(&transaction->t_handle_lock);
|
||||
jbd2_debug(3, "extended handle %p by %d\n", handle, nblocks);
|
||||
error_out:
|
||||
read_unlock(&journal->j_state_lock);
|
||||
return result;
|
||||
@@ -803,7 +796,7 @@ int jbd2__journal_restart(handle_t *handle, int nblocks, int revoke_records,
|
||||
* First unlink the handle from its current transaction, and start the
|
||||
* commit on that.
|
||||
*/
|
||||
jbd_debug(2, "restarting handle %p\n", handle);
|
||||
jbd2_debug(2, "restarting handle %p\n", handle);
|
||||
stop_this_handle(handle);
|
||||
handle->h_transaction = NULL;
|
||||
|
||||
@@ -836,6 +829,43 @@ int jbd2_journal_restart(handle_t *handle, int nblocks)
|
||||
}
|
||||
EXPORT_SYMBOL(jbd2_journal_restart);
|
||||
|
||||
/*
|
||||
* Waits for any outstanding t_updates to finish.
|
||||
* This is called with write j_state_lock held.
|
||||
*/
|
||||
void jbd2_journal_wait_updates(journal_t *journal)
|
||||
{
|
||||
DEFINE_WAIT(wait);
|
||||
|
||||
while (1) {
|
||||
/*
|
||||
* Note that the running transaction can get freed under us if
|
||||
* this transaction is getting committed in
|
||||
* jbd2_journal_commit_transaction() ->
|
||||
* jbd2_journal_free_transaction(). This can only happen when we
|
||||
* release j_state_lock -> schedule() -> acquire j_state_lock.
|
||||
* Hence we should everytime retrieve new j_running_transaction
|
||||
* value (after j_state_lock release acquire cycle), else it may
|
||||
* lead to use-after-free of old freed transaction.
|
||||
*/
|
||||
transaction_t *transaction = journal->j_running_transaction;
|
||||
|
||||
if (!transaction)
|
||||
break;
|
||||
|
||||
prepare_to_wait(&journal->j_wait_updates, &wait,
|
||||
TASK_UNINTERRUPTIBLE);
|
||||
if (!atomic_read(&transaction->t_updates)) {
|
||||
finish_wait(&journal->j_wait_updates, &wait);
|
||||
break;
|
||||
}
|
||||
write_unlock(&journal->j_state_lock);
|
||||
schedule();
|
||||
finish_wait(&journal->j_wait_updates, &wait);
|
||||
write_lock(&journal->j_state_lock);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* jbd2_journal_lock_updates () - establish a transaction barrier.
|
||||
* @journal: Journal to establish a barrier on.
|
||||
@@ -848,8 +878,6 @@ EXPORT_SYMBOL(jbd2_journal_restart);
|
||||
*/
|
||||
void jbd2_journal_lock_updates(journal_t *journal)
|
||||
{
|
||||
DEFINE_WAIT(wait);
|
||||
|
||||
jbd2_might_wait_for_commit(journal);
|
||||
|
||||
write_lock(&journal->j_state_lock);
|
||||
@@ -863,27 +891,9 @@ void jbd2_journal_lock_updates(journal_t *journal)
|
||||
write_lock(&journal->j_state_lock);
|
||||
}
|
||||
|
||||
/* Wait until there are no running updates */
|
||||
while (1) {
|
||||
transaction_t *transaction = journal->j_running_transaction;
|
||||
/* Wait until there are no running t_updates */
|
||||
jbd2_journal_wait_updates(journal);
|
||||
|
||||
if (!transaction)
|
||||
break;
|
||||
|
||||
spin_lock(&transaction->t_handle_lock);
|
||||
prepare_to_wait(&journal->j_wait_updates, &wait,
|
||||
TASK_UNINTERRUPTIBLE);
|
||||
if (!atomic_read(&transaction->t_updates)) {
|
||||
spin_unlock(&transaction->t_handle_lock);
|
||||
finish_wait(&journal->j_wait_updates, &wait);
|
||||
break;
|
||||
}
|
||||
spin_unlock(&transaction->t_handle_lock);
|
||||
write_unlock(&journal->j_state_lock);
|
||||
schedule();
|
||||
finish_wait(&journal->j_wait_updates, &wait);
|
||||
write_lock(&journal->j_state_lock);
|
||||
}
|
||||
write_unlock(&journal->j_state_lock);
|
||||
|
||||
/*
|
||||
@@ -970,7 +980,7 @@ do_get_write_access(handle_t *handle, struct journal_head *jh,
|
||||
|
||||
journal = transaction->t_journal;
|
||||
|
||||
jbd_debug(5, "journal_head %p, force_copy %d\n", jh, force_copy);
|
||||
jbd2_debug(5, "journal_head %p, force_copy %d\n", jh, force_copy);
|
||||
|
||||
JBUFFER_TRACE(jh, "entry");
|
||||
repeat:
|
||||
@@ -1270,7 +1280,7 @@ int jbd2_journal_get_create_access(handle_t *handle, struct buffer_head *bh)
|
||||
struct journal_head *jh = jbd2_journal_add_journal_head(bh);
|
||||
int err;
|
||||
|
||||
jbd_debug(5, "journal_head %p\n", jh);
|
||||
jbd2_debug(5, "journal_head %p\n", jh);
|
||||
err = -EROFS;
|
||||
if (is_handle_aborted(handle))
|
||||
goto out;
|
||||
@@ -1493,7 +1503,7 @@ int jbd2_journal_dirty_metadata(handle_t *handle, struct buffer_head *bh)
|
||||
* of the running transaction.
|
||||
*/
|
||||
jh = bh2jh(bh);
|
||||
jbd_debug(5, "journal_head %p\n", jh);
|
||||
jbd2_debug(5, "journal_head %p\n", jh);
|
||||
JBUFFER_TRACE(jh, "entry");
|
||||
|
||||
/*
|
||||
@@ -1826,7 +1836,7 @@ int jbd2_journal_stop(handle_t *handle)
|
||||
pid_t pid;
|
||||
|
||||
if (--handle->h_ref > 0) {
|
||||
jbd_debug(4, "h_ref %d -> %d\n", handle->h_ref + 1,
|
||||
jbd2_debug(4, "h_ref %d -> %d\n", handle->h_ref + 1,
|
||||
handle->h_ref);
|
||||
if (is_handle_aborted(handle))
|
||||
return -EIO;
|
||||
@@ -1846,7 +1856,7 @@ int jbd2_journal_stop(handle_t *handle)
|
||||
if (is_handle_aborted(handle))
|
||||
err = -EIO;
|
||||
|
||||
jbd_debug(4, "Handle %p going down\n", handle);
|
||||
jbd2_debug(4, "Handle %p going down\n", handle);
|
||||
trace_jbd2_handle_stats(journal->j_fs_dev->bd_dev,
|
||||
tid, handle->h_type, handle->h_line_no,
|
||||
jiffies - handle->h_start_jiffies,
|
||||
@@ -1924,7 +1934,7 @@ int jbd2_journal_stop(handle_t *handle)
|
||||
* completes the commit thread, it just doesn't write
|
||||
* anything to disk. */
|
||||
|
||||
jbd_debug(2, "transaction too old, requesting commit for "
|
||||
jbd2_debug(2, "transaction too old, requesting commit for "
|
||||
"handle %p\n", handle);
|
||||
/* This is non-blocking */
|
||||
jbd2_log_start_commit(journal, tid);
|
||||
@@ -2668,7 +2678,7 @@ static int jbd2_journal_file_inode(handle_t *handle, struct jbd2_inode *jinode,
|
||||
return -EROFS;
|
||||
journal = transaction->t_journal;
|
||||
|
||||
jbd_debug(4, "Adding inode %lu, tid:%d\n", jinode->i_vfs_inode->i_ino,
|
||||
jbd2_debug(4, "Adding inode %lu, tid:%d\n", jinode->i_vfs_inode->i_ino,
|
||||
transaction->t_tid);
|
||||
|
||||
spin_lock(&journal->j_list_lock);
|
||||
|
||||
@@ -269,6 +269,7 @@ int dbUnmount(struct inode *ipbmap, int mounterror)
|
||||
|
||||
/* free the memory for the in-memory bmap. */
|
||||
kfree(bmp);
|
||||
JFS_SBI(ipbmap->i_sb)->bmap = NULL;
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
@@ -193,6 +193,7 @@ int diUnmount(struct inode *ipimap, int mounterror)
|
||||
* free in-memory control structure
|
||||
*/
|
||||
kfree(imap);
|
||||
JFS_IP(ipimap)->i_imap = NULL;
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
@@ -1339,6 +1339,7 @@ static int posix_lock_inode(struct inode *inode, struct file_lock *request,
|
||||
out:
|
||||
spin_unlock(&ctx->flc_lock);
|
||||
percpu_up_read(&file_rwsem);
|
||||
trace_posix_lock_inode(inode, request, error);
|
||||
/*
|
||||
* Free any unused locks.
|
||||
*/
|
||||
@@ -1347,7 +1348,6 @@ static int posix_lock_inode(struct inode *inode, struct file_lock *request,
|
||||
if (new_fl2)
|
||||
locks_free_lock(new_fl2);
|
||||
locks_dispose_list(&dispose);
|
||||
trace_posix_lock_inode(inode, request, error);
|
||||
|
||||
return error;
|
||||
}
|
||||
|
||||
@@ -895,8 +895,8 @@ nfsd4_rename(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
|
||||
rename->rn_tname, rename->rn_tnamelen);
|
||||
if (status)
|
||||
return status;
|
||||
set_change_info(&rename->rn_sinfo, &cstate->current_fh);
|
||||
set_change_info(&rename->rn_tinfo, &cstate->save_fh);
|
||||
set_change_info(&rename->rn_sinfo, &cstate->save_fh);
|
||||
set_change_info(&rename->rn_tinfo, &cstate->current_fh);
|
||||
return nfs_ok;
|
||||
}
|
||||
|
||||
|
||||
@@ -583,7 +583,8 @@ static int ovl_copy_up_inode(struct ovl_copy_up_ctx *c, struct dentry *temp)
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
if (inode->i_flags & OVL_COPY_I_FLAGS_MASK) {
|
||||
if (inode->i_flags & OVL_COPY_I_FLAGS_MASK &&
|
||||
(S_ISREG(c->stat.mode) || S_ISDIR(c->stat.mode))) {
|
||||
/*
|
||||
* Copy the fileattr inode flags that are the source of already
|
||||
* copied i_flags
|
||||
|
||||
@@ -21,7 +21,6 @@ struct ovl_aio_req {
|
||||
struct kiocb iocb;
|
||||
refcount_t ref;
|
||||
struct kiocb *orig_iocb;
|
||||
struct fd fd;
|
||||
};
|
||||
|
||||
static struct kmem_cache *ovl_aio_request_cachep;
|
||||
@@ -243,7 +242,7 @@ static void ovl_file_accessed(struct file *file)
|
||||
static inline void ovl_aio_put(struct ovl_aio_req *aio_req)
|
||||
{
|
||||
if (refcount_dec_and_test(&aio_req->ref)) {
|
||||
fdput(aio_req->fd);
|
||||
fput(aio_req->iocb.ki_filp);
|
||||
kmem_cache_free(ovl_aio_request_cachep, aio_req);
|
||||
}
|
||||
}
|
||||
@@ -310,10 +309,9 @@ static ssize_t ovl_read_iter(struct kiocb *iocb, struct iov_iter *iter)
|
||||
if (!aio_req)
|
||||
goto out;
|
||||
|
||||
aio_req->fd = real;
|
||||
real.flags = 0;
|
||||
aio_req->orig_iocb = iocb;
|
||||
kiocb_clone(&aio_req->iocb, iocb, real.file);
|
||||
kiocb_clone(&aio_req->iocb, iocb, get_file(real.file));
|
||||
aio_req->iocb.ki_complete = ovl_aio_rw_complete;
|
||||
refcount_set(&aio_req->ref, 2);
|
||||
ret = vfs_iocb_iter_read(real.file, &aio_req->iocb, iter);
|
||||
@@ -382,10 +380,9 @@ static ssize_t ovl_write_iter(struct kiocb *iocb, struct iov_iter *iter)
|
||||
/* Pacify lockdep, same trick as done in aio_write() */
|
||||
__sb_writers_release(file_inode(real.file)->i_sb,
|
||||
SB_FREEZE_WRITE);
|
||||
aio_req->fd = real;
|
||||
real.flags = 0;
|
||||
aio_req->orig_iocb = iocb;
|
||||
kiocb_clone(&aio_req->iocb, iocb, real.file);
|
||||
kiocb_clone(&aio_req->iocb, iocb, get_file(real.file));
|
||||
aio_req->iocb.ki_flags = ifl;
|
||||
aio_req->iocb.ki_complete = ovl_aio_rw_complete;
|
||||
refcount_set(&aio_req->ref, 2);
|
||||
|
||||
@@ -555,6 +555,9 @@ static struct dentry *__create_dir(const char *name, struct dentry *parent,
|
||||
*/
|
||||
struct dentry *tracefs_create_dir(const char *name, struct dentry *parent)
|
||||
{
|
||||
if (security_locked_down(LOCKDOWN_TRACEFS))
|
||||
return NULL;
|
||||
|
||||
return __create_dir(name, parent, &simple_dir_inode_operations);
|
||||
}
|
||||
|
||||
|
||||
@@ -21,6 +21,7 @@
|
||||
*/
|
||||
#define IORT_SMMU_V3_PMCG_GENERIC 0x00000000 /* Generic SMMUv3 PMCG */
|
||||
#define IORT_SMMU_V3_PMCG_HISI_HIP08 0x00000001 /* HiSilicon HIP08 PMCG */
|
||||
#define IORT_SMMU_V3_PMCG_HISI_HIP09 0x00000002 /* HiSilicon HIP09 PMCG */
|
||||
|
||||
int iort_register_domain_token(int trans_id, phys_addr_t base,
|
||||
struct fwnode_handle *fw_node);
|
||||
|
||||
@@ -58,10 +58,10 @@ extern ushort jbd2_journal_enable_debug;
|
||||
void __jbd2_debug(int level, const char *file, const char *func,
|
||||
unsigned int line, const char *fmt, ...);
|
||||
|
||||
#define jbd_debug(n, fmt, a...) \
|
||||
#define jbd2_debug(n, fmt, a...) \
|
||||
__jbd2_debug((n), __FILE__, __func__, __LINE__, (fmt), ##a)
|
||||
#else
|
||||
#define jbd_debug(n, fmt, a...) no_printk(fmt, ##a)
|
||||
#define jbd2_debug(n, fmt, a...) no_printk(fmt, ##a)
|
||||
#endif
|
||||
|
||||
extern void *jbd2_alloc(size_t size, gfp_t flags);
|
||||
@@ -554,9 +554,6 @@ struct transaction_chp_stats_s {
|
||||
* ->j_list_lock
|
||||
*
|
||||
* j_state_lock
|
||||
* ->t_handle_lock
|
||||
*
|
||||
* j_state_lock
|
||||
* ->j_list_lock (journal_unmap_buffer)
|
||||
*
|
||||
*/
|
||||
@@ -594,7 +591,7 @@ struct transaction_s
|
||||
*/
|
||||
unsigned long t_log_start;
|
||||
|
||||
/*
|
||||
/*
|
||||
* Number of buffers on the t_buffers list [j_list_lock, no locks
|
||||
* needed for jbd2 thread]
|
||||
*/
|
||||
@@ -1538,6 +1535,8 @@ extern int jbd2_journal_flush(journal_t *journal, unsigned int flags);
|
||||
extern void jbd2_journal_lock_updates (journal_t *);
|
||||
extern void jbd2_journal_unlock_updates (journal_t *);
|
||||
|
||||
void jbd2_journal_wait_updates(journal_t *);
|
||||
|
||||
extern journal_t * jbd2_journal_init_dev(struct block_device *bdev,
|
||||
struct block_device *fs_dev,
|
||||
unsigned long long start, int len, int bsize);
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user