mirror of
https://github.com/torvalds/linux.git
synced 2026-06-07 14:04:54 +02:00
Merge 812da4d394 ("Merge tag 'riscv-for-linus-5.12-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/riscv/linux") into android-mainline
Steps on the way to 5.12-rc4 Signed-off-by: Greg Kroah-Hartman <gregkh@google.com> Change-Id: Ic0175a8f19f4003b52675cc3d720f3c144adb056
This commit is contained in:
commit
b1c827c21b
|
|
@ -9,7 +9,7 @@ int arch_check_ftrace_location(struct kprobe *p)
|
|||
return 0;
|
||||
}
|
||||
|
||||
/* Ftrace callback handler for kprobes -- called under preepmt disabed */
|
||||
/* Ftrace callback handler for kprobes -- called under preepmt disabled */
|
||||
void kprobe_ftrace_handler(unsigned long ip, unsigned long parent_ip,
|
||||
struct ftrace_ops *ops, struct ftrace_regs *fregs)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -93,7 +93,6 @@ config RISCV
|
|||
select PCI_MSI if PCI
|
||||
select RISCV_INTC
|
||||
select RISCV_TIMER if RISCV_SBI
|
||||
select SPARSEMEM_STATIC if 32BIT
|
||||
select SPARSE_IRQ
|
||||
select SYSCTL_EXCEPTION_TRACE
|
||||
select THREAD_INFO_IN_TASK
|
||||
|
|
@ -154,7 +153,8 @@ config ARCH_FLATMEM_ENABLE
|
|||
config ARCH_SPARSEMEM_ENABLE
|
||||
def_bool y
|
||||
depends on MMU
|
||||
select SPARSEMEM_VMEMMAP_ENABLE
|
||||
select SPARSEMEM_STATIC if 32BIT && SPARSMEM
|
||||
select SPARSEMEM_VMEMMAP_ENABLE if 64BIT
|
||||
|
||||
config ARCH_SELECT_MEMORY_MODEL
|
||||
def_bool ARCH_SPARSEMEM_ENABLE
|
||||
|
|
|
|||
|
|
@ -31,6 +31,8 @@ config SOC_CANAAN
|
|||
select SIFIVE_PLIC
|
||||
select ARCH_HAS_RESET_CONTROLLER
|
||||
select PINCTRL
|
||||
select COMMON_CLK
|
||||
select COMMON_CLK_K210
|
||||
help
|
||||
This enables support for Canaan Kendryte K210 SoC platform hardware.
|
||||
|
||||
|
|
|
|||
|
|
@ -9,4 +9,20 @@ long long __lshrti3(long long a, int b);
|
|||
long long __ashrti3(long long a, int b);
|
||||
long long __ashlti3(long long a, int b);
|
||||
|
||||
|
||||
#define DECLARE_DO_ERROR_INFO(name) asmlinkage void name(struct pt_regs *regs)
|
||||
|
||||
DECLARE_DO_ERROR_INFO(do_trap_unknown);
|
||||
DECLARE_DO_ERROR_INFO(do_trap_insn_misaligned);
|
||||
DECLARE_DO_ERROR_INFO(do_trap_insn_fault);
|
||||
DECLARE_DO_ERROR_INFO(do_trap_insn_illegal);
|
||||
DECLARE_DO_ERROR_INFO(do_trap_load_fault);
|
||||
DECLARE_DO_ERROR_INFO(do_trap_load_misaligned);
|
||||
DECLARE_DO_ERROR_INFO(do_trap_store_misaligned);
|
||||
DECLARE_DO_ERROR_INFO(do_trap_store_fault);
|
||||
DECLARE_DO_ERROR_INFO(do_trap_ecall_u);
|
||||
DECLARE_DO_ERROR_INFO(do_trap_ecall_s);
|
||||
DECLARE_DO_ERROR_INFO(do_trap_ecall_m);
|
||||
DECLARE_DO_ERROR_INFO(do_trap_break);
|
||||
|
||||
#endif /* _ASM_RISCV_PROTOTYPES_H */
|
||||
|
|
|
|||
|
|
@ -12,4 +12,6 @@
|
|||
|
||||
#include <asm-generic/irq.h>
|
||||
|
||||
extern void __init init_IRQ(void);
|
||||
|
||||
#endif /* _ASM_RISCV_IRQ_H */
|
||||
|
|
|
|||
|
|
@ -71,6 +71,7 @@ int riscv_of_processor_hartid(struct device_node *node);
|
|||
int riscv_of_parent_hartid(struct device_node *node);
|
||||
|
||||
extern void riscv_fill_hwcap(void);
|
||||
extern int arch_dup_task_struct(struct task_struct *dst, struct task_struct *src);
|
||||
|
||||
#endif /* __ASSEMBLY__ */
|
||||
|
||||
|
|
|
|||
|
|
@ -119,6 +119,11 @@ extern int regs_query_register_offset(const char *name);
|
|||
extern unsigned long regs_get_kernel_stack_nth(struct pt_regs *regs,
|
||||
unsigned int n);
|
||||
|
||||
void prepare_ftrace_return(unsigned long *parent, unsigned long self_addr,
|
||||
unsigned long frame_pointer);
|
||||
int do_syscall_trace_enter(struct pt_regs *regs);
|
||||
void do_syscall_trace_exit(struct pt_regs *regs);
|
||||
|
||||
/**
|
||||
* regs_get_register() - get register value from its offset
|
||||
* @regs: pt_regs from which register value is gotten
|
||||
|
|
|
|||
|
|
@ -51,10 +51,10 @@ enum sbi_ext_rfence_fid {
|
|||
SBI_EXT_RFENCE_REMOTE_FENCE_I = 0,
|
||||
SBI_EXT_RFENCE_REMOTE_SFENCE_VMA,
|
||||
SBI_EXT_RFENCE_REMOTE_SFENCE_VMA_ASID,
|
||||
SBI_EXT_RFENCE_REMOTE_HFENCE_GVMA,
|
||||
SBI_EXT_RFENCE_REMOTE_HFENCE_GVMA_VMID,
|
||||
SBI_EXT_RFENCE_REMOTE_HFENCE_VVMA,
|
||||
SBI_EXT_RFENCE_REMOTE_HFENCE_GVMA,
|
||||
SBI_EXT_RFENCE_REMOTE_HFENCE_VVMA_ASID,
|
||||
SBI_EXT_RFENCE_REMOTE_HFENCE_VVMA,
|
||||
};
|
||||
|
||||
enum sbi_ext_hsm_fid {
|
||||
|
|
|
|||
|
|
@ -88,4 +88,6 @@ static inline int read_current_timer(unsigned long *timer_val)
|
|||
return 0;
|
||||
}
|
||||
|
||||
extern void time_init(void);
|
||||
|
||||
#endif /* _ASM_RISCV_TIMEX_H */
|
||||
|
|
|
|||
|
|
@ -8,6 +8,7 @@ CFLAGS_REMOVE_ftrace.o = $(CC_FLAGS_FTRACE)
|
|||
CFLAGS_REMOVE_patch.o = $(CC_FLAGS_FTRACE)
|
||||
CFLAGS_REMOVE_sbi.o = $(CC_FLAGS_FTRACE)
|
||||
endif
|
||||
CFLAGS_syscall_table.o += $(call cc-option,-Wno-override-init,)
|
||||
|
||||
extra-y += head.o
|
||||
extra-y += vmlinux.lds
|
||||
|
|
|
|||
|
|
@ -2,39 +2,41 @@
|
|||
|
||||
#include <linux/kprobes.h>
|
||||
|
||||
/* Ftrace callback handler for kprobes -- called under preepmt disabed */
|
||||
/* Ftrace callback handler for kprobes -- called under preepmt disabled */
|
||||
void kprobe_ftrace_handler(unsigned long ip, unsigned long parent_ip,
|
||||
struct ftrace_ops *ops, struct ftrace_regs *regs)
|
||||
struct ftrace_ops *ops, struct ftrace_regs *fregs)
|
||||
{
|
||||
struct kprobe *p;
|
||||
struct pt_regs *regs;
|
||||
struct kprobe_ctlblk *kcb;
|
||||
|
||||
p = get_kprobe((kprobe_opcode_t *)ip);
|
||||
if (unlikely(!p) || kprobe_disabled(p))
|
||||
return;
|
||||
|
||||
regs = ftrace_get_regs(fregs);
|
||||
kcb = get_kprobe_ctlblk();
|
||||
if (kprobe_running()) {
|
||||
kprobes_inc_nmissed_count(p);
|
||||
} else {
|
||||
unsigned long orig_ip = instruction_pointer(&(regs->regs));
|
||||
unsigned long orig_ip = instruction_pointer(regs);
|
||||
|
||||
instruction_pointer_set(&(regs->regs), ip);
|
||||
instruction_pointer_set(regs, ip);
|
||||
|
||||
__this_cpu_write(current_kprobe, p);
|
||||
kcb->kprobe_status = KPROBE_HIT_ACTIVE;
|
||||
if (!p->pre_handler || !p->pre_handler(p, &(regs->regs))) {
|
||||
if (!p->pre_handler || !p->pre_handler(p, regs)) {
|
||||
/*
|
||||
* Emulate singlestep (and also recover regs->pc)
|
||||
* as if there is a nop
|
||||
*/
|
||||
instruction_pointer_set(&(regs->regs),
|
||||
instruction_pointer_set(regs,
|
||||
(unsigned long)p->addr + MCOUNT_INSN_SIZE);
|
||||
if (unlikely(p->post_handler)) {
|
||||
kcb->kprobe_status = KPROBE_HIT_SSDONE;
|
||||
p->post_handler(p, &(regs->regs), 0);
|
||||
p->post_handler(p, regs, 0);
|
||||
}
|
||||
instruction_pointer_set(&(regs->regs), orig_ip);
|
||||
instruction_pointer_set(regs, orig_ip);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -256,8 +256,7 @@ int __kprobes kprobe_fault_handler(struct pt_regs *regs, unsigned int trapnr)
|
|||
* normal page fault.
|
||||
*/
|
||||
regs->epc = (unsigned long) cur->addr;
|
||||
if (!instruction_pointer(regs))
|
||||
BUG();
|
||||
BUG_ON(!instruction_pointer(regs));
|
||||
|
||||
if (kcb->kprobe_status == KPROBE_REENTER)
|
||||
restore_previous_kprobe(kcb);
|
||||
|
|
|
|||
|
|
@ -10,6 +10,7 @@
|
|||
#include <linux/cpu.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/sched/debug.h>
|
||||
#include <linux/sched/task_stack.h>
|
||||
#include <linux/tick.h>
|
||||
#include <linux/ptrace.h>
|
||||
|
|
|
|||
|
|
@ -116,7 +116,7 @@ void sbi_clear_ipi(void)
|
|||
EXPORT_SYMBOL(sbi_clear_ipi);
|
||||
|
||||
/**
|
||||
* sbi_set_timer_v01() - Program the timer for next timer event.
|
||||
* __sbi_set_timer_v01() - Program the timer for next timer event.
|
||||
* @stime_value: The value after which next timer event should fire.
|
||||
*
|
||||
* Return: None
|
||||
|
|
|
|||
|
|
@ -147,7 +147,8 @@ static void __init init_resources(void)
|
|||
bss_res.end = __pa_symbol(__bss_stop) - 1;
|
||||
bss_res.flags = IORESOURCE_SYSTEM_RAM | IORESOURCE_BUSY;
|
||||
|
||||
mem_res_sz = (memblock.memory.cnt + memblock.reserved.cnt) * sizeof(*mem_res);
|
||||
/* + 1 as memblock_alloc() might increase memblock.reserved.cnt */
|
||||
mem_res_sz = (memblock.memory.cnt + memblock.reserved.cnt + 1) * sizeof(*mem_res);
|
||||
mem_res = memblock_alloc(mem_res_sz, SMP_CACHE_BYTES);
|
||||
if (!mem_res)
|
||||
panic("%s: Failed to allocate %zu bytes\n", __func__, mem_res_sz);
|
||||
|
|
|
|||
|
|
@ -9,6 +9,7 @@
|
|||
#include <linux/delay.h>
|
||||
#include <asm/sbi.h>
|
||||
#include <asm/processor.h>
|
||||
#include <asm/timex.h>
|
||||
|
||||
unsigned long riscv_timebase;
|
||||
EXPORT_SYMBOL_GPL(riscv_timebase);
|
||||
|
|
|
|||
|
|
@ -17,6 +17,7 @@
|
|||
#include <linux/module.h>
|
||||
#include <linux/irq.h>
|
||||
|
||||
#include <asm/asm-prototypes.h>
|
||||
#include <asm/bug.h>
|
||||
#include <asm/processor.h>
|
||||
#include <asm/ptrace.h>
|
||||
|
|
|
|||
|
|
@ -155,7 +155,7 @@ static void __init kasan_populate(void *start, void *end)
|
|||
memset(start, KASAN_SHADOW_INIT, end - start);
|
||||
}
|
||||
|
||||
void __init kasan_shallow_populate(void *start, void *end)
|
||||
static void __init kasan_shallow_populate(void *start, void *end)
|
||||
{
|
||||
unsigned long vaddr = (unsigned long)start & PAGE_MASK;
|
||||
unsigned long vend = PAGE_ALIGN((unsigned long)end);
|
||||
|
|
@ -187,6 +187,8 @@ void __init kasan_shallow_populate(void *start, void *end)
|
|||
}
|
||||
vaddr += PAGE_SIZE;
|
||||
}
|
||||
|
||||
local_flush_tlb_all();
|
||||
}
|
||||
|
||||
void __init kasan_init(void)
|
||||
|
|
|
|||
|
|
@ -12,7 +12,7 @@
|
|||
|
||||
#include "common.h"
|
||||
|
||||
/* Ftrace callback handler for kprobes -- called under preepmt disabed */
|
||||
/* Ftrace callback handler for kprobes -- called under preepmt disabled */
|
||||
void kprobe_ftrace_handler(unsigned long ip, unsigned long parent_ip,
|
||||
struct ftrace_ops *ops, struct ftrace_regs *fregs)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -5784,6 +5784,8 @@ static void ibmvfc_free_mem(struct ibmvfc_host *vhost)
|
|||
vhost->disc_buf_dma);
|
||||
dma_free_coherent(vhost->dev, sizeof(*vhost->login_buf),
|
||||
vhost->login_buf, vhost->login_buf_dma);
|
||||
dma_free_coherent(vhost->dev, sizeof(*vhost->channel_setup_buf),
|
||||
vhost->channel_setup_buf, vhost->channel_setup_dma);
|
||||
dma_pool_destroy(vhost->sg_pool);
|
||||
ibmvfc_free_queue(vhost, async_q);
|
||||
LEAVE;
|
||||
|
|
|
|||
|
|
@ -2421,7 +2421,7 @@ lpfc_debugfs_dif_err_write(struct file *file, const char __user *buf,
|
|||
memset(dstbuf, 0, 33);
|
||||
size = (nbytes < 32) ? nbytes : 32;
|
||||
if (copy_from_user(dstbuf, buf, size))
|
||||
return 0;
|
||||
return -EFAULT;
|
||||
|
||||
if (dent == phba->debug_InjErrLBA) {
|
||||
if ((dstbuf[0] == 'o') && (dstbuf[1] == 'f') &&
|
||||
|
|
@ -2430,7 +2430,7 @@ lpfc_debugfs_dif_err_write(struct file *file, const char __user *buf,
|
|||
}
|
||||
|
||||
if ((tmp == 0) && (kstrtoull(dstbuf, 0, &tmp)))
|
||||
return 0;
|
||||
return -EINVAL;
|
||||
|
||||
if (dent == phba->debug_writeGuard)
|
||||
phba->lpfc_injerr_wgrd_cnt = (uint32_t)tmp;
|
||||
|
|
|
|||
|
|
@ -413,7 +413,7 @@ mpt3sas_get_port_by_id(struct MPT3SAS_ADAPTER *ioc,
|
|||
* And add this object to port_table_list.
|
||||
*/
|
||||
if (!ioc->multipath_on_hba) {
|
||||
port = kzalloc(sizeof(struct hba_port), GFP_KERNEL);
|
||||
port = kzalloc(sizeof(struct hba_port), GFP_ATOMIC);
|
||||
if (!port)
|
||||
return NULL;
|
||||
|
||||
|
|
|
|||
|
|
@ -2273,12 +2273,12 @@ static void myrs_cleanup(struct myrs_hba *cs)
|
|||
if (cs->mmio_base) {
|
||||
cs->disable_intr(cs);
|
||||
iounmap(cs->mmio_base);
|
||||
cs->mmio_base = NULL;
|
||||
}
|
||||
if (cs->irq)
|
||||
free_irq(cs->irq, cs);
|
||||
if (cs->io_addr)
|
||||
release_region(cs->io_addr, 0x80);
|
||||
iounmap(cs->mmio_base);
|
||||
pci_set_drvdata(pdev, NULL);
|
||||
pci_disable_device(pdev);
|
||||
scsi_host_put(cs->host);
|
||||
|
|
|
|||
|
|
@ -116,7 +116,6 @@
|
|||
(min(1270, ((ql) > 0) ? (QLA_TGT_DATASEGS_PER_CMD_24XX + \
|
||||
QLA_TGT_DATASEGS_PER_CONT_24XX*((ql) - 1)) : 0))
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#define GET_TARGET_ID(ha, iocb) ((HAS_EXTENDED_IDS(ha)) \
|
||||
? le16_to_cpu((iocb)->u.isp2x.target.extended) \
|
||||
|
|
@ -244,6 +243,7 @@ struct ctio_to_2xxx {
|
|||
#ifndef CTIO_RET_TYPE
|
||||
#define CTIO_RET_TYPE 0x17 /* CTIO return entry */
|
||||
#define ATIO_TYPE7 0x06 /* Accept target I/O entry for 24xx */
|
||||
#endif
|
||||
|
||||
struct fcp_hdr {
|
||||
uint8_t r_ctl;
|
||||
|
|
|
|||
|
|
@ -280,27 +280,28 @@ static int sd_zbc_update_wp_offset_cb(struct blk_zone *zone, unsigned int idx,
|
|||
static void sd_zbc_update_wp_offset_workfn(struct work_struct *work)
|
||||
{
|
||||
struct scsi_disk *sdkp;
|
||||
unsigned long flags;
|
||||
unsigned int zno;
|
||||
int ret;
|
||||
|
||||
sdkp = container_of(work, struct scsi_disk, zone_wp_offset_work);
|
||||
|
||||
spin_lock_bh(&sdkp->zones_wp_offset_lock);
|
||||
spin_lock_irqsave(&sdkp->zones_wp_offset_lock, flags);
|
||||
for (zno = 0; zno < sdkp->nr_zones; zno++) {
|
||||
if (sdkp->zones_wp_offset[zno] != SD_ZBC_UPDATING_WP_OFST)
|
||||
continue;
|
||||
|
||||
spin_unlock_bh(&sdkp->zones_wp_offset_lock);
|
||||
spin_unlock_irqrestore(&sdkp->zones_wp_offset_lock, flags);
|
||||
ret = sd_zbc_do_report_zones(sdkp, sdkp->zone_wp_update_buf,
|
||||
SD_BUF_SIZE,
|
||||
zno * sdkp->zone_blocks, true);
|
||||
spin_lock_bh(&sdkp->zones_wp_offset_lock);
|
||||
spin_lock_irqsave(&sdkp->zones_wp_offset_lock, flags);
|
||||
if (!ret)
|
||||
sd_zbc_parse_report(sdkp, sdkp->zone_wp_update_buf + 64,
|
||||
zno, sd_zbc_update_wp_offset_cb,
|
||||
sdkp);
|
||||
}
|
||||
spin_unlock_bh(&sdkp->zones_wp_offset_lock);
|
||||
spin_unlock_irqrestore(&sdkp->zones_wp_offset_lock, flags);
|
||||
|
||||
scsi_device_put(sdkp->device);
|
||||
}
|
||||
|
|
@ -324,6 +325,7 @@ blk_status_t sd_zbc_prepare_zone_append(struct scsi_cmnd *cmd, sector_t *lba,
|
|||
struct request *rq = cmd->request;
|
||||
struct scsi_disk *sdkp = scsi_disk(rq->rq_disk);
|
||||
unsigned int wp_offset, zno = blk_rq_zone_no(rq);
|
||||
unsigned long flags;
|
||||
blk_status_t ret;
|
||||
|
||||
ret = sd_zbc_cmnd_checks(cmd);
|
||||
|
|
@ -337,7 +339,7 @@ blk_status_t sd_zbc_prepare_zone_append(struct scsi_cmnd *cmd, sector_t *lba,
|
|||
if (!blk_req_zone_write_trylock(rq))
|
||||
return BLK_STS_ZONE_RESOURCE;
|
||||
|
||||
spin_lock_bh(&sdkp->zones_wp_offset_lock);
|
||||
spin_lock_irqsave(&sdkp->zones_wp_offset_lock, flags);
|
||||
wp_offset = sdkp->zones_wp_offset[zno];
|
||||
switch (wp_offset) {
|
||||
case SD_ZBC_INVALID_WP_OFST:
|
||||
|
|
@ -366,7 +368,7 @@ blk_status_t sd_zbc_prepare_zone_append(struct scsi_cmnd *cmd, sector_t *lba,
|
|||
|
||||
*lba += wp_offset;
|
||||
}
|
||||
spin_unlock_bh(&sdkp->zones_wp_offset_lock);
|
||||
spin_unlock_irqrestore(&sdkp->zones_wp_offset_lock, flags);
|
||||
if (ret)
|
||||
blk_req_zone_write_unlock(rq);
|
||||
return ret;
|
||||
|
|
@ -445,6 +447,7 @@ static unsigned int sd_zbc_zone_wp_update(struct scsi_cmnd *cmd,
|
|||
struct scsi_disk *sdkp = scsi_disk(rq->rq_disk);
|
||||
unsigned int zno = blk_rq_zone_no(rq);
|
||||
enum req_opf op = req_op(rq);
|
||||
unsigned long flags;
|
||||
|
||||
/*
|
||||
* If we got an error for a command that needs updating the write
|
||||
|
|
@ -452,7 +455,7 @@ static unsigned int sd_zbc_zone_wp_update(struct scsi_cmnd *cmd,
|
|||
* invalid to force an update from disk the next time a zone append
|
||||
* command is issued.
|
||||
*/
|
||||
spin_lock_bh(&sdkp->zones_wp_offset_lock);
|
||||
spin_lock_irqsave(&sdkp->zones_wp_offset_lock, flags);
|
||||
|
||||
if (result && op != REQ_OP_ZONE_RESET_ALL) {
|
||||
if (op == REQ_OP_ZONE_APPEND) {
|
||||
|
|
@ -496,7 +499,7 @@ static unsigned int sd_zbc_zone_wp_update(struct scsi_cmnd *cmd,
|
|||
}
|
||||
|
||||
unlock_wp_offset:
|
||||
spin_unlock_bh(&sdkp->zones_wp_offset_lock);
|
||||
spin_unlock_irqrestore(&sdkp->zones_wp_offset_lock, flags);
|
||||
|
||||
return good_bytes;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1269,8 +1269,8 @@ static int st_open(struct inode *inode, struct file *filp)
|
|||
spin_lock(&st_use_lock);
|
||||
if (STp->in_use) {
|
||||
spin_unlock(&st_use_lock);
|
||||
scsi_tape_put(STp);
|
||||
DEBC_printk(STp, "Device already in use.\n");
|
||||
scsi_tape_put(STp);
|
||||
return (-EBUSY);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -911,7 +911,7 @@ static void ufs_mtk_vreg_set_lpm(struct ufs_hba *hba, bool lpm)
|
|||
if (!hba->vreg_info.vccq2 || !hba->vreg_info.vcc)
|
||||
return;
|
||||
|
||||
if (lpm & !hba->vreg_info.vcc->enabled)
|
||||
if (lpm && !hba->vreg_info.vcc->enabled)
|
||||
regulator_set_mode(hba->vreg_info.vccq2->reg,
|
||||
REGULATOR_MODE_IDLE);
|
||||
else if (!lpm)
|
||||
|
|
|
|||
|
|
@ -248,7 +248,7 @@ static int cifs_swn_send_unregister_message(struct cifs_swn_reg *swnreg)
|
|||
|
||||
/*
|
||||
* Try to find a matching registration for the tcon's server name and share name.
|
||||
* Calls to this funciton must be protected by cifs_swnreg_idr_mutex.
|
||||
* Calls to this function must be protected by cifs_swnreg_idr_mutex.
|
||||
* TODO Try to avoid memory allocations
|
||||
*/
|
||||
static struct cifs_swn_reg *cifs_find_swn_reg(struct cifs_tcon *tcon)
|
||||
|
|
|
|||
|
|
@ -1118,7 +1118,6 @@ static int set_chmod_dacl(struct cifs_acl *pdacl, struct cifs_acl *pndacl,
|
|||
/* Retain old ACEs which we can retain */
|
||||
for (i = 0; i < src_num_aces; ++i) {
|
||||
pntace = (struct cifs_ace *) (acl_base + size);
|
||||
pnntace = (struct cifs_ace *) (nacl_base + nsize);
|
||||
|
||||
if (!new_aces_set && (pntace->flags & INHERITED_ACE)) {
|
||||
/* Place the new ACEs in between existing explicit and inherited */
|
||||
|
|
@ -1131,14 +1130,18 @@ static int set_chmod_dacl(struct cifs_acl *pdacl, struct cifs_acl *pndacl,
|
|||
}
|
||||
|
||||
/* If it's any one of the ACE we're replacing, skip! */
|
||||
if ((compare_sids(&pntace->sid, &sid_unix_NFS_mode) == 0) ||
|
||||
if (!mode_from_sid &&
|
||||
((compare_sids(&pntace->sid, &sid_unix_NFS_mode) == 0) ||
|
||||
(compare_sids(&pntace->sid, pownersid) == 0) ||
|
||||
(compare_sids(&pntace->sid, pgrpsid) == 0) ||
|
||||
(compare_sids(&pntace->sid, &sid_everyone) == 0) ||
|
||||
(compare_sids(&pntace->sid, &sid_authusers) == 0)) {
|
||||
(compare_sids(&pntace->sid, &sid_authusers) == 0))) {
|
||||
goto next_ace;
|
||||
}
|
||||
|
||||
/* update the pointer to the next ACE to populate*/
|
||||
pnntace = (struct cifs_ace *) (nacl_base + nsize);
|
||||
|
||||
nsize += cifs_copy_ace(pnntace, pntace, NULL);
|
||||
num_aces++;
|
||||
|
||||
|
|
|
|||
|
|
@ -1196,9 +1196,11 @@ static int smb3_fs_context_parse_param(struct fs_context *fc,
|
|||
pr_warn_once("Witness protocol support is experimental\n");
|
||||
break;
|
||||
case Opt_rootfs:
|
||||
#ifdef CONFIG_CIFS_ROOT
|
||||
ctx->rootfs = true;
|
||||
#ifndef CONFIG_CIFS_ROOT
|
||||
cifs_dbg(VFS, "rootfs support requires CONFIG_CIFS_ROOT config option\n");
|
||||
goto cifs_parse_mount_err;
|
||||
#endif
|
||||
ctx->rootfs = true;
|
||||
break;
|
||||
case Opt_posixpaths:
|
||||
if (result.negated)
|
||||
|
|
|
|||
|
|
@ -2395,7 +2395,7 @@ int cifs_getattr(struct user_namespace *mnt_userns, const struct path *path,
|
|||
* We need to be sure that all dirty pages are written and the server
|
||||
* has actual ctime, mtime and file length.
|
||||
*/
|
||||
if ((request_mask & (STATX_CTIME | STATX_MTIME | STATX_SIZE)) &&
|
||||
if ((request_mask & (STATX_CTIME | STATX_MTIME | STATX_SIZE | STATX_BLOCKS)) &&
|
||||
!CIFS_CACHE_READ(CIFS_I(inode)) &&
|
||||
inode->i_mapping && inode->i_mapping->nrpages != 0) {
|
||||
rc = filemap_fdatawait(inode->i_mapping);
|
||||
|
|
@ -2585,6 +2585,14 @@ cifs_set_file_size(struct inode *inode, struct iattr *attrs,
|
|||
if (rc == 0) {
|
||||
cifsInode->server_eof = attrs->ia_size;
|
||||
cifs_setsize(inode, attrs->ia_size);
|
||||
/*
|
||||
* i_blocks is not related to (i_size / i_blksize), but instead
|
||||
* 512 byte (2**9) size is required for calculating num blocks.
|
||||
* Until we can query the server for actual allocation size,
|
||||
* this is best estimate we have for blocks allocated for a file
|
||||
* Number of blocks must be rounded up so size 1 is not 0 blocks
|
||||
*/
|
||||
inode->i_blocks = (512 - 1 + attrs->ia_size) >> 9;
|
||||
|
||||
/*
|
||||
* The man page of truncate says if the size changed,
|
||||
|
|
|
|||
|
|
@ -1196,9 +1196,12 @@ compound_send_recv(const unsigned int xid, struct cifs_ses *ses,
|
|||
/*
|
||||
* Compounding is never used during session establish.
|
||||
*/
|
||||
if ((ses->status == CifsNew) || (optype & CIFS_NEG_OP) || (optype & CIFS_SESS_OP))
|
||||
if ((ses->status == CifsNew) || (optype & CIFS_NEG_OP) || (optype & CIFS_SESS_OP)) {
|
||||
mutex_lock(&server->srv_mutex);
|
||||
smb311_update_preauth_hash(ses, rqst[0].rq_iov,
|
||||
rqst[0].rq_nvec);
|
||||
mutex_unlock(&server->srv_mutex);
|
||||
}
|
||||
|
||||
for (i = 0; i < num_rqst; i++) {
|
||||
rc = wait_for_response(server, midQ[i]);
|
||||
|
|
@ -1266,7 +1269,9 @@ compound_send_recv(const unsigned int xid, struct cifs_ses *ses,
|
|||
.iov_base = resp_iov[0].iov_base,
|
||||
.iov_len = resp_iov[0].iov_len
|
||||
};
|
||||
mutex_lock(&server->srv_mutex);
|
||||
smb311_update_preauth_hash(ses, &iov, 1);
|
||||
mutex_unlock(&server->srv_mutex);
|
||||
}
|
||||
|
||||
out:
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user