You've already forked linux-rockchip
mirror of
https://github.com/armbian/linux-rockchip.git
synced 2026-01-06 11:08:10 -08:00
Merge 5.10.87 into android12-5.10-lts
Changes in 5.10.87 nfc: fix segfault in nfc_genl_dump_devices_done drm/msm/dsi: set default num_data_lanes KVM: arm64: Save PSTATE early on exit s390/test_unwind: use raw opcode instead of invalid instruction Revert "tty: serial: fsl_lpuart: drop earlycon entry for i.MX8QXP" net/mlx4_en: Update reported link modes for 1/10G ALSA: hda: Add Intel DG2 PCI ID and HDMI codec vid ALSA: hda/hdmi: fix HDA codec entry table order for ADL-P parisc/agp: Annotate parisc agp init functions with __init i2c: rk3x: Handle a spurious start completion interrupt flag net: netlink: af_netlink: Prevent empty skb by adding a check on len. drm/amd/display: Fix for the no Audio bug with Tiled Displays drm/amd/display: add connector type check for CRC source set tracing: Fix a kmemleak false positive in tracing_map KVM: x86: Ignore sparse banks size for an "all CPUs", non-sparse IPI req staging: most: dim2: use device release method bpf: Fix integer overflow in argument calculation for bpf_map_area_alloc fuse: make sure reclaim doesn't write the inode hwmon: (dell-smm) Fix warning on /proc/i8k creation error ethtool: do not perform operations on net devices being unregistered perf inject: Fix itrace space allowed for new attributes perf intel-pt: Fix some PGE (packet generation enable/control flow packets) usage perf intel-pt: Fix sync state when a PSB (synchronization) packet is found perf intel-pt: Fix intel_pt_fup_event() assumptions about setting state type perf intel-pt: Fix state setting when receiving overflow (OVF) packet perf intel-pt: Fix next 'err' value, walking trace perf intel-pt: Fix missing 'instruction' events with 'q' option perf intel-pt: Fix error timestamp setting on the decoder error path memblock: free_unused_memmap: use pageblock units instead of MAX_ORDER memblock: align freed memory map on pageblock boundaries with SPARSEMEM memblock: ensure there is no overflow in memblock_overlaps_region() arm: extend pfn_valid to take into account freed memory map alignment arm: ioremap: don't abuse pfn_valid() to check if pfn is in RAM Linux 5.10.87 Signed-off-by: Greg Kroah-Hartman <gregkh@google.com> Change-Id: I56719d03237a8607e6cc0bc357421d0b4a479084
This commit is contained in:
2
Makefile
2
Makefile
@@ -1,7 +1,7 @@
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
VERSION = 5
|
||||
PATCHLEVEL = 10
|
||||
SUBLEVEL = 86
|
||||
SUBLEVEL = 87
|
||||
EXTRAVERSION =
|
||||
NAME = Dare mighty things
|
||||
|
||||
|
||||
@@ -125,11 +125,22 @@ static void __init zone_sizes_init(unsigned long min, unsigned long max_low,
|
||||
int pfn_valid(unsigned long pfn)
|
||||
{
|
||||
phys_addr_t addr = __pfn_to_phys(pfn);
|
||||
unsigned long pageblock_size = PAGE_SIZE * pageblock_nr_pages;
|
||||
|
||||
if (__phys_to_pfn(addr) != pfn)
|
||||
return 0;
|
||||
|
||||
return memblock_is_map_memory(addr);
|
||||
/*
|
||||
* If address less than pageblock_size bytes away from a present
|
||||
* memory chunk there still will be a memory map entry for it
|
||||
* because we round freed memory map to the pageblock boundaries.
|
||||
*/
|
||||
if (memblock_overlaps_region(&memblock.memory,
|
||||
ALIGN_DOWN(addr, pageblock_size),
|
||||
pageblock_size))
|
||||
return 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(pfn_valid);
|
||||
#endif
|
||||
@@ -313,14 +324,14 @@ static void __init free_unused_memmap(void)
|
||||
*/
|
||||
start = min(start,
|
||||
ALIGN(prev_end, PAGES_PER_SECTION));
|
||||
#else
|
||||
/*
|
||||
* Align down here since the VM subsystem insists that the
|
||||
* memmap entries are valid from the bank start aligned to
|
||||
* MAX_ORDER_NR_PAGES.
|
||||
*/
|
||||
start = round_down(start, MAX_ORDER_NR_PAGES);
|
||||
#endif
|
||||
/*
|
||||
* Align down here since many operations in VM subsystem
|
||||
* presume that there are no holes in the memory map inside
|
||||
* a pageblock
|
||||
*/
|
||||
start = round_down(start, pageblock_nr_pages);
|
||||
|
||||
/*
|
||||
* If we had a previous bank, and there is a space
|
||||
* between the current bank and the previous, free it.
|
||||
@@ -329,17 +340,19 @@ static void __init free_unused_memmap(void)
|
||||
free_memmap(prev_end, start);
|
||||
|
||||
/*
|
||||
* Align up here since the VM subsystem insists that the
|
||||
* memmap entries are valid from the bank end aligned to
|
||||
* MAX_ORDER_NR_PAGES.
|
||||
* Align up here since many operations in VM subsystem
|
||||
* presume that there are no holes in the memory map inside
|
||||
* a pageblock
|
||||
*/
|
||||
prev_end = ALIGN(end, MAX_ORDER_NR_PAGES);
|
||||
prev_end = ALIGN(end, pageblock_nr_pages);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_SPARSEMEM
|
||||
if (!IS_ALIGNED(prev_end, PAGES_PER_SECTION))
|
||||
if (!IS_ALIGNED(prev_end, PAGES_PER_SECTION)) {
|
||||
prev_end = ALIGN(end, pageblock_nr_pages);
|
||||
free_memmap(prev_end,
|
||||
ALIGN(prev_end, PAGES_PER_SECTION));
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
@@ -27,6 +27,7 @@
|
||||
#include <linux/vmalloc.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/sizes.h>
|
||||
#include <linux/memblock.h>
|
||||
|
||||
#include <asm/cp15.h>
|
||||
#include <asm/cputype.h>
|
||||
@@ -284,7 +285,8 @@ static void __iomem * __arm_ioremap_pfn_caller(unsigned long pfn,
|
||||
* Don't allow RAM to be mapped with mismatched attributes - this
|
||||
* causes problems with ARMv6+
|
||||
*/
|
||||
if (WARN_ON(pfn_valid(pfn) && mtype != MT_MEMORY_RW))
|
||||
if (WARN_ON(memblock_is_map_memory(PFN_PHYS(pfn)) &&
|
||||
mtype != MT_MEMORY_RW))
|
||||
return NULL;
|
||||
|
||||
area = get_vm_area_caller(size, VM_IOREMAP, caller);
|
||||
|
||||
@@ -414,6 +414,12 @@ static inline bool __hyp_handle_ptrauth(struct kvm_vcpu *vcpu)
|
||||
*/
|
||||
static inline bool fixup_guest_exit(struct kvm_vcpu *vcpu, u64 *exit_code)
|
||||
{
|
||||
/*
|
||||
* Save PSTATE early so that we can evaluate the vcpu mode
|
||||
* early on.
|
||||
*/
|
||||
vcpu->arch.ctxt.regs.pstate = read_sysreg_el2(SYS_SPSR);
|
||||
|
||||
if (ARM_EXCEPTION_CODE(*exit_code) != ARM_EXCEPTION_IRQ)
|
||||
vcpu->arch.fault.esr_el2 = read_sysreg_el2(SYS_ESR);
|
||||
|
||||
|
||||
@@ -54,7 +54,12 @@ static inline void __sysreg_save_el1_state(struct kvm_cpu_context *ctxt)
|
||||
static inline void __sysreg_save_el2_return_state(struct kvm_cpu_context *ctxt)
|
||||
{
|
||||
ctxt->regs.pc = read_sysreg_el2(SYS_ELR);
|
||||
ctxt->regs.pstate = read_sysreg_el2(SYS_SPSR);
|
||||
/*
|
||||
* Guest PSTATE gets saved at guest fixup time in all
|
||||
* cases. We still need to handle the nVHE host side here.
|
||||
*/
|
||||
if (!has_vhe() && ctxt->__hyp_running_vcpu)
|
||||
ctxt->regs.pstate = read_sysreg_el2(SYS_SPSR);
|
||||
|
||||
if (cpus_have_final_cap(ARM64_HAS_RAS_EXTN))
|
||||
ctxt_sys_reg(ctxt, DISR_EL1) = read_sysreg_s(SYS_VDISR_EL2);
|
||||
|
||||
@@ -171,10 +171,11 @@ static noinline int unwindme_func4(struct unwindme *u)
|
||||
}
|
||||
|
||||
/*
|
||||
* trigger specification exception
|
||||
* Trigger operation exception; use insn notation to bypass
|
||||
* llvm's integrated assembler sanity checks.
|
||||
*/
|
||||
asm volatile(
|
||||
" mvcl %%r1,%%r1\n"
|
||||
" .insn e,0x0000\n" /* illegal opcode */
|
||||
"0: nopr %%r7\n"
|
||||
EX_TABLE(0b, 0b)
|
||||
:);
|
||||
|
||||
@@ -1641,11 +1641,13 @@ static u64 kvm_hv_send_ipi(struct kvm_vcpu *current_vcpu, u64 ingpa, u64 outgpa,
|
||||
|
||||
all_cpus = send_ipi_ex.vp_set.format == HV_GENERIC_SET_ALL;
|
||||
|
||||
if (all_cpus)
|
||||
goto check_and_send_ipi;
|
||||
|
||||
if (!sparse_banks_len)
|
||||
goto ret_success;
|
||||
|
||||
if (!all_cpus &&
|
||||
kvm_read_guest(kvm,
|
||||
if (kvm_read_guest(kvm,
|
||||
ingpa + offsetof(struct hv_send_ipi_ex,
|
||||
vp_set.bank_contents),
|
||||
sparse_banks,
|
||||
@@ -1653,6 +1655,7 @@ static u64 kvm_hv_send_ipi(struct kvm_vcpu *current_vcpu, u64 ingpa, u64 outgpa,
|
||||
return HV_STATUS_INVALID_HYPERCALL_INPUT;
|
||||
}
|
||||
|
||||
check_and_send_ipi:
|
||||
if ((vector < HV_IPI_LOW_VECTOR) || (vector > HV_IPI_HIGH_VECTOR))
|
||||
return HV_STATUS_INVALID_HYPERCALL_INPUT;
|
||||
|
||||
|
||||
@@ -281,7 +281,7 @@ agp_ioc_init(void __iomem *ioc_regs)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
static int __init
|
||||
lba_find_capability(int cap)
|
||||
{
|
||||
struct _parisc_agp_info *info = &parisc_agp_info;
|
||||
@@ -366,7 +366,7 @@ fail:
|
||||
return error;
|
||||
}
|
||||
|
||||
static int
|
||||
static int __init
|
||||
find_quicksilver(struct device *dev, void *data)
|
||||
{
|
||||
struct parisc_device **lba = data;
|
||||
@@ -378,7 +378,7 @@ find_quicksilver(struct device *dev, void *data)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
static int __init
|
||||
parisc_agp_init(void)
|
||||
{
|
||||
extern struct sba_device *sba_list;
|
||||
|
||||
@@ -226,6 +226,14 @@ int amdgpu_dm_crtc_set_crc_source(struct drm_crtc *crtc, const char *src_name)
|
||||
ret = -EINVAL;
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
if ((aconn->base.connector_type != DRM_MODE_CONNECTOR_DisplayPort) &&
|
||||
(aconn->base.connector_type != DRM_MODE_CONNECTOR_eDP)) {
|
||||
DRM_DEBUG_DRIVER("No DP connector available for CRC source\n");
|
||||
ret = -EINVAL;
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if (amdgpu_dm_crtc_configure_crc_source(crtc, crtc_state, source)) {
|
||||
|
||||
@@ -1698,6 +1698,10 @@ bool dc_is_stream_unchanged(
|
||||
if (old_stream->ignore_msa_timing_param != stream->ignore_msa_timing_param)
|
||||
return false;
|
||||
|
||||
// Only Have Audio left to check whether it is same or not. This is a corner case for Tiled sinks
|
||||
if (old_stream->audio_info.mode_count != stream->audio_info.mode_count)
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -1692,6 +1692,8 @@ static int dsi_host_parse_lane_data(struct msm_dsi_host *msm_host,
|
||||
if (!prop) {
|
||||
DRM_DEV_DEBUG(dev,
|
||||
"failed to find data lane mapping, using default\n");
|
||||
/* Set the number of date lanes to 4 by default. */
|
||||
msm_host->num_data_lanes = 4;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -603,15 +603,18 @@ static const struct proc_ops i8k_proc_ops = {
|
||||
.proc_ioctl = i8k_ioctl,
|
||||
};
|
||||
|
||||
static struct proc_dir_entry *entry;
|
||||
|
||||
static void __init i8k_init_procfs(void)
|
||||
{
|
||||
/* Register the proc entry */
|
||||
proc_create("i8k", 0, NULL, &i8k_proc_ops);
|
||||
entry = proc_create("i8k", 0, NULL, &i8k_proc_ops);
|
||||
}
|
||||
|
||||
static void __exit i8k_exit_procfs(void)
|
||||
{
|
||||
remove_proc_entry("i8k", NULL);
|
||||
if (entry)
|
||||
remove_proc_entry("i8k", NULL);
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
@@ -423,8 +423,8 @@ static void rk3x_i2c_handle_read(struct rk3x_i2c *i2c, unsigned int ipd)
|
||||
if (!(ipd & REG_INT_MBRF))
|
||||
return;
|
||||
|
||||
/* ack interrupt */
|
||||
i2c_writel(i2c, REG_INT_MBRF, REG_IPD);
|
||||
/* ack interrupt (read also produces a spurious START flag, clear it too) */
|
||||
i2c_writel(i2c, REG_INT_MBRF | REG_INT_START, REG_IPD);
|
||||
|
||||
/* Can only handle a maximum of 32 bytes at a time */
|
||||
if (len > 32)
|
||||
|
||||
@@ -663,7 +663,7 @@ void __init mlx4_en_init_ptys2ethtool_map(void)
|
||||
MLX4_BUILD_PTYS2ETHTOOL_CONFIG(MLX4_1000BASE_T, SPEED_1000,
|
||||
ETHTOOL_LINK_MODE_1000baseT_Full_BIT);
|
||||
MLX4_BUILD_PTYS2ETHTOOL_CONFIG(MLX4_1000BASE_CX_SGMII, SPEED_1000,
|
||||
ETHTOOL_LINK_MODE_1000baseKX_Full_BIT);
|
||||
ETHTOOL_LINK_MODE_1000baseX_Full_BIT);
|
||||
MLX4_BUILD_PTYS2ETHTOOL_CONFIG(MLX4_1000BASE_KX, SPEED_1000,
|
||||
ETHTOOL_LINK_MODE_1000baseKX_Full_BIT);
|
||||
MLX4_BUILD_PTYS2ETHTOOL_CONFIG(MLX4_10GBASE_T, SPEED_10000,
|
||||
@@ -675,9 +675,9 @@ void __init mlx4_en_init_ptys2ethtool_map(void)
|
||||
MLX4_BUILD_PTYS2ETHTOOL_CONFIG(MLX4_10GBASE_KR, SPEED_10000,
|
||||
ETHTOOL_LINK_MODE_10000baseKR_Full_BIT);
|
||||
MLX4_BUILD_PTYS2ETHTOOL_CONFIG(MLX4_10GBASE_CR, SPEED_10000,
|
||||
ETHTOOL_LINK_MODE_10000baseKR_Full_BIT);
|
||||
ETHTOOL_LINK_MODE_10000baseCR_Full_BIT);
|
||||
MLX4_BUILD_PTYS2ETHTOOL_CONFIG(MLX4_10GBASE_SR, SPEED_10000,
|
||||
ETHTOOL_LINK_MODE_10000baseKR_Full_BIT);
|
||||
ETHTOOL_LINK_MODE_10000baseSR_Full_BIT);
|
||||
MLX4_BUILD_PTYS2ETHTOOL_CONFIG(MLX4_20GBASE_KR2, SPEED_20000,
|
||||
ETHTOOL_LINK_MODE_20000baseMLD2_Full_BIT,
|
||||
ETHTOOL_LINK_MODE_20000baseKR2_Full_BIT);
|
||||
|
||||
@@ -723,6 +723,23 @@ static int get_dim2_clk_speed(const char *clock_speed, u8 *val)
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
static void dim2_release(struct device *d)
|
||||
{
|
||||
struct dim2_hdm *dev = container_of(d, struct dim2_hdm, dev);
|
||||
unsigned long flags;
|
||||
|
||||
kthread_stop(dev->netinfo_task);
|
||||
|
||||
spin_lock_irqsave(&dim_lock, flags);
|
||||
dim_shutdown();
|
||||
spin_unlock_irqrestore(&dim_lock, flags);
|
||||
|
||||
if (dev->disable_platform)
|
||||
dev->disable_platform(to_platform_device(d->parent));
|
||||
|
||||
kfree(dev);
|
||||
}
|
||||
|
||||
/*
|
||||
* dim2_probe - dim2 probe handler
|
||||
* @pdev: platform device structure
|
||||
@@ -743,7 +760,7 @@ static int dim2_probe(struct platform_device *pdev)
|
||||
|
||||
enum { MLB_INT_IDX, AHB0_INT_IDX };
|
||||
|
||||
dev = devm_kzalloc(&pdev->dev, sizeof(*dev), GFP_KERNEL);
|
||||
dev = kzalloc(sizeof(*dev), GFP_KERNEL);
|
||||
if (!dev)
|
||||
return -ENOMEM;
|
||||
|
||||
@@ -755,25 +772,27 @@ static int dim2_probe(struct platform_device *pdev)
|
||||
"microchip,clock-speed", &clock_speed);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "missing dt property clock-speed\n");
|
||||
return ret;
|
||||
goto err_free_dev;
|
||||
}
|
||||
|
||||
ret = get_dim2_clk_speed(clock_speed, &dev->clk_speed);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "bad dt property clock-speed\n");
|
||||
return ret;
|
||||
goto err_free_dev;
|
||||
}
|
||||
|
||||
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
dev->io_base = devm_ioremap_resource(&pdev->dev, res);
|
||||
if (IS_ERR(dev->io_base))
|
||||
return PTR_ERR(dev->io_base);
|
||||
if (IS_ERR(dev->io_base)) {
|
||||
ret = PTR_ERR(dev->io_base);
|
||||
goto err_free_dev;
|
||||
}
|
||||
|
||||
of_id = of_match_node(dim2_of_match, pdev->dev.of_node);
|
||||
pdata = of_id->data;
|
||||
ret = pdata && pdata->enable ? pdata->enable(pdev) : 0;
|
||||
if (ret)
|
||||
return ret;
|
||||
goto err_free_dev;
|
||||
|
||||
dev->disable_platform = pdata ? pdata->disable : NULL;
|
||||
|
||||
@@ -864,24 +883,19 @@ static int dim2_probe(struct platform_device *pdev)
|
||||
dev->most_iface.request_netinfo = request_netinfo;
|
||||
dev->most_iface.driver_dev = &pdev->dev;
|
||||
dev->most_iface.dev = &dev->dev;
|
||||
dev->dev.init_name = "dim2_state";
|
||||
dev->dev.init_name = dev->name;
|
||||
dev->dev.parent = &pdev->dev;
|
||||
dev->dev.release = dim2_release;
|
||||
|
||||
ret = most_register_interface(&dev->most_iface);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "failed to register MOST interface\n");
|
||||
goto err_stop_thread;
|
||||
}
|
||||
return most_register_interface(&dev->most_iface);
|
||||
|
||||
return 0;
|
||||
|
||||
err_stop_thread:
|
||||
kthread_stop(dev->netinfo_task);
|
||||
err_shutdown_dim:
|
||||
dim_shutdown();
|
||||
err_disable_platform:
|
||||
if (dev->disable_platform)
|
||||
dev->disable_platform(pdev);
|
||||
err_free_dev:
|
||||
kfree(dev);
|
||||
|
||||
return ret;
|
||||
}
|
||||
@@ -895,17 +909,8 @@ err_disable_platform:
|
||||
static int dim2_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct dim2_hdm *dev = platform_get_drvdata(pdev);
|
||||
unsigned long flags;
|
||||
|
||||
most_deregister_interface(&dev->most_iface);
|
||||
kthread_stop(dev->netinfo_task);
|
||||
|
||||
spin_lock_irqsave(&dim_lock, flags);
|
||||
dim_shutdown();
|
||||
spin_unlock_irqrestore(&dim_lock, flags);
|
||||
|
||||
if (dev->disable_platform)
|
||||
dev->disable_platform(pdev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -2559,6 +2559,7 @@ OF_EARLYCON_DECLARE(lpuart, "fsl,vf610-lpuart", lpuart_early_console_setup);
|
||||
OF_EARLYCON_DECLARE(lpuart32, "fsl,ls1021a-lpuart", lpuart32_early_console_setup);
|
||||
OF_EARLYCON_DECLARE(lpuart32, "fsl,ls1028a-lpuart", ls1028a_early_console_setup);
|
||||
OF_EARLYCON_DECLARE(lpuart32, "fsl,imx7ulp-lpuart", lpuart32_imx_early_console_setup);
|
||||
OF_EARLYCON_DECLARE(lpuart32, "fsl,imx8qxp-lpuart", lpuart32_imx_early_console_setup);
|
||||
EARLYCON_DECLARE(lpuart, lpuart_early_console_setup);
|
||||
EARLYCON_DECLARE(lpuart32, lpuart32_early_console_setup);
|
||||
|
||||
|
||||
@@ -833,11 +833,19 @@ static int fuse_symlink(struct inode *dir, struct dentry *entry,
|
||||
return create_new_entry(fm, &args, dir, entry, S_IFLNK);
|
||||
}
|
||||
|
||||
void fuse_flush_time_update(struct inode *inode)
|
||||
{
|
||||
int err = sync_inode_metadata(inode, 1);
|
||||
|
||||
mapping_set_error(inode->i_mapping, err);
|
||||
}
|
||||
|
||||
void fuse_update_ctime(struct inode *inode)
|
||||
{
|
||||
if (!IS_NOCMTIME(inode)) {
|
||||
inode->i_ctime = current_time(inode);
|
||||
mark_inode_dirty_sync(inode);
|
||||
fuse_flush_time_update(inode);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1855,6 +1855,17 @@ int fuse_write_inode(struct inode *inode, struct writeback_control *wbc)
|
||||
struct fuse_file *ff;
|
||||
int err;
|
||||
|
||||
/*
|
||||
* Inode is always written before the last reference is dropped and
|
||||
* hence this should not be reached from reclaim.
|
||||
*
|
||||
* Writing back the inode from reclaim can deadlock if the request
|
||||
* processing itself needs an allocation. Allocations triggering
|
||||
* reclaim while serving a request can't be prevented, because it can
|
||||
* involve any number of unrelated userspace processes.
|
||||
*/
|
||||
WARN_ON(wbc->for_reclaim);
|
||||
|
||||
ff = __fuse_write_file_get(fc, fi);
|
||||
err = fuse_flush_times(inode, ff);
|
||||
if (ff)
|
||||
@@ -3347,6 +3358,8 @@ out:
|
||||
if (lock_inode)
|
||||
inode_unlock(inode);
|
||||
|
||||
fuse_flush_time_update(inode);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
@@ -3456,6 +3469,8 @@ out:
|
||||
inode_unlock(inode_out);
|
||||
file_accessed(file_in);
|
||||
|
||||
fuse_flush_time_update(inode_out);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
|
||||
@@ -1137,6 +1137,7 @@ int fuse_allow_current_process(struct fuse_conn *fc);
|
||||
|
||||
u64 fuse_lock_owner_id(struct fuse_conn *fc, fl_owner_t id);
|
||||
|
||||
void fuse_flush_time_update(struct inode *inode);
|
||||
void fuse_update_ctime(struct inode *inode);
|
||||
|
||||
int fuse_update_attributes(struct inode *inode, struct file *file);
|
||||
|
||||
@@ -119,6 +119,9 @@ static void fuse_evict_inode(struct inode *inode)
|
||||
{
|
||||
struct fuse_inode *fi = get_fuse_inode(inode);
|
||||
|
||||
/* Will write inode on close/munmap and in all other dirtiers */
|
||||
WARN_ON(inode->i_state & I_DIRTY_INODE);
|
||||
|
||||
truncate_inode_pages_final(&inode->i_data);
|
||||
clear_inode(inode);
|
||||
if (inode->i_sb->s_flags & SB_ACTIVE) {
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user