mirror of
https://github.com/torvalds/linux.git
synced 2024-11-24 13:11:40 +00:00
Non-MM patches for 6.2-rc1.
- A ptrace API cleanup series from Sergey Shtylyov - Fixes and cleanups for kexec from ye xingchen - nilfs2 updates from Ryusuke Konishi - squashfs feature work from Xiaoming Ni: permit configuration of the filesystem's compression concurrency from the mount command line. - A series from Akinobu Mita which addresses bound checking errors when writing to debugfs files. - A series from Yang Yingliang to address rapido memory leaks - A series from Zheng Yejian to address possible overflow errors in encode_comp_t(). - And a whole shower of singleton patches all over the place. -----BEGIN PGP SIGNATURE----- iHUEABYKAB0WIQTTMBEPP41GrTpTJgfdBJ7gKXxAjgUCY5efRgAKCRDdBJ7gKXxA jgvdAP0al6oFDtaSsshIdNhrzcMwfjt6PfVxxHdLmNhF1hX2dwD/SVluS1bPSP7y 0sZp7Ustu3YTb8aFkMl96Y9m9mY1Nwg= =ga5B -----END PGP SIGNATURE----- Merge tag 'mm-nonmm-stable-2022-12-12' of git://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm Pull non-MM updates from Andrew Morton: - A ptrace API cleanup series from Sergey Shtylyov - Fixes and cleanups for kexec from ye xingchen - nilfs2 updates from Ryusuke Konishi - squashfs feature work from Xiaoming Ni: permit configuration of the filesystem's compression concurrency from the mount command line - A series from Akinobu Mita which addresses bound checking errors when writing to debugfs files - A series from Yang Yingliang to address rapidio memory leaks - A series from Zheng Yejian to address possible overflow errors in encode_comp_t() - And a whole shower of singleton patches all over the place * tag 'mm-nonmm-stable-2022-12-12' of git://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm: (79 commits) ipc: fix memory leak in init_mqueue_fs() hfsplus: fix bug causing custom uid and gid being unable to be assigned with mount rapidio: devices: fix missing put_device in mport_cdev_open kcov: fix spelling typos in comments hfs: Fix OOB Write in hfs_asc2mac hfs: fix OOB Read in __hfs_brec_find relay: fix type mismatch when allocating memory in relay_create_buf() ocfs2: always read both high and low parts of dinode link count io-mapping: move some code within the include guarded section kernel: kcsan: kcsan_test: build without structleak plugin mailmap: update email for Iskren Chernev eventfd: change int to __u64 in eventfd_signal() ifndef CONFIG_EVENTFD rapidio: fix possible UAF when kfifo_alloc() fails relay: use strscpy() is more robust and safer cpumask: limit visibility of FORCE_NR_CPUS acct: fix potential integer overflow in encode_comp_t() acct: fix accuracy loss for input value of encode_comp_t() linux/init.h: include <linux/build_bug.h> and <linux/stringify.h> rapidio: rio: fix possible name leak in rio_register_mport() rapidio: fix possible name leaks when rio_add_device() fails ...
This commit is contained in:
commit
8702f2c611
1
.mailmap
1
.mailmap
@ -228,6 +228,7 @@ Juha Yrjola <at solidboot.com>
|
||||
Juha Yrjola <juha.yrjola@nokia.com>
|
||||
Juha Yrjola <juha.yrjola@solidboot.com>
|
||||
Julien Thierry <julien.thierry.kdev@gmail.com> <julien.thierry@arm.com>
|
||||
Iskren Chernev <me@iskren.info> <iskren.chernev@gmail.com>
|
||||
Kalle Valo <kvalo@kernel.org> <kvalo@codeaurora.org>
|
||||
Kalyan Thota <quic_kalyant@quicinc.com> <kalyan_t@codeaurora.org>
|
||||
Kay Sievers <kay.sievers@vrfy.org>
|
||||
|
@ -176,6 +176,7 @@ core_pattern
|
||||
%f executable filename
|
||||
%E executable path
|
||||
%c maximum size of core file by resource limit RLIMIT_CORE
|
||||
%C CPU the task ran on
|
||||
%<OTHER> both are dropped
|
||||
======== ==========================================
|
||||
|
||||
|
@ -83,9 +83,7 @@ configuration of fault-injection capabilities.
|
||||
- /sys/kernel/debug/fail*/times:
|
||||
|
||||
specifies how many times failures may happen at most. A value of -1
|
||||
means "no limit". Note, though, that this file only accepts unsigned
|
||||
values. So, if you want to specify -1, you better use 'printf' instead
|
||||
of 'echo', e.g.: $ printf %#x -1 > times
|
||||
means "no limit".
|
||||
|
||||
- /sys/kernel/debug/fail*/space:
|
||||
|
||||
@ -284,7 +282,7 @@ Application Examples
|
||||
echo Y > /sys/kernel/debug/$FAILTYPE/task-filter
|
||||
echo 10 > /sys/kernel/debug/$FAILTYPE/probability
|
||||
echo 100 > /sys/kernel/debug/$FAILTYPE/interval
|
||||
printf %#x -1 > /sys/kernel/debug/$FAILTYPE/times
|
||||
echo -1 > /sys/kernel/debug/$FAILTYPE/times
|
||||
echo 0 > /sys/kernel/debug/$FAILTYPE/space
|
||||
echo 2 > /sys/kernel/debug/$FAILTYPE/verbose
|
||||
echo Y > /sys/kernel/debug/$FAILTYPE/ignore-gfp-wait
|
||||
@ -338,7 +336,7 @@ Application Examples
|
||||
echo N > /sys/kernel/debug/$FAILTYPE/task-filter
|
||||
echo 10 > /sys/kernel/debug/$FAILTYPE/probability
|
||||
echo 100 > /sys/kernel/debug/$FAILTYPE/interval
|
||||
printf %#x -1 > /sys/kernel/debug/$FAILTYPE/times
|
||||
echo -1 > /sys/kernel/debug/$FAILTYPE/times
|
||||
echo 0 > /sys/kernel/debug/$FAILTYPE/space
|
||||
echo 2 > /sys/kernel/debug/$FAILTYPE/verbose
|
||||
echo Y > /sys/kernel/debug/$FAILTYPE/ignore-gfp-wait
|
||||
@ -369,7 +367,7 @@ Application Examples
|
||||
echo N > /sys/kernel/debug/$FAILTYPE/task-filter
|
||||
echo 100 > /sys/kernel/debug/$FAILTYPE/probability
|
||||
echo 0 > /sys/kernel/debug/$FAILTYPE/interval
|
||||
printf %#x -1 > /sys/kernel/debug/$FAILTYPE/times
|
||||
echo -1 > /sys/kernel/debug/$FAILTYPE/times
|
||||
echo 0 > /sys/kernel/debug/$FAILTYPE/space
|
||||
echo 1 > /sys/kernel/debug/$FAILTYPE/verbose
|
||||
|
||||
|
@ -47,6 +47,7 @@ fixes/update part 1.1 Stefani Seibold <stefani@seibold.net> June 9 2009
|
||||
3.10 /proc/<pid>/timerslack_ns - Task timerslack value
|
||||
3.11 /proc/<pid>/patch_state - Livepatch patch operation state
|
||||
3.12 /proc/<pid>/arch_status - Task architecture specific information
|
||||
3.13 /proc/<pid>/fd - List of symlinks to open files
|
||||
|
||||
4 Configuring procfs
|
||||
4.1 Mount options
|
||||
@ -2150,6 +2151,22 @@ AVX512_elapsed_ms
|
||||
the task is unlikely an AVX512 user, but depends on the workload and the
|
||||
scheduling scenario, it also could be a false negative mentioned above.
|
||||
|
||||
3.13 /proc/<pid>/fd - List of symlinks to open files
|
||||
-------------------------------------------------------
|
||||
This directory contains symbolic links which represent open files
|
||||
the process is maintaining. Example output::
|
||||
|
||||
lr-x------ 1 root root 64 Sep 20 17:53 0 -> /dev/null
|
||||
l-wx------ 1 root root 64 Sep 20 17:53 1 -> /dev/null
|
||||
lrwx------ 1 root root 64 Sep 20 17:53 10 -> 'socket:[12539]'
|
||||
lrwx------ 1 root root 64 Sep 20 17:53 11 -> 'socket:[12540]'
|
||||
lrwx------ 1 root root 64 Sep 20 17:53 12 -> 'socket:[12542]'
|
||||
|
||||
The number of open files for the process is stored in 'size' member
|
||||
of stat() output for /proc/<pid>/fd for fast access.
|
||||
-------------------------------------------------------
|
||||
|
||||
|
||||
Chapter 4: Configuring procfs
|
||||
=============================
|
||||
|
||||
|
@ -12126,7 +12126,7 @@ M: Alexey Kodanev <alexey.kodanev@oracle.com>
|
||||
L: ltp@lists.linux.it (subscribers-only)
|
||||
S: Maintained
|
||||
W: http://linux-test-project.github.io/
|
||||
T: git git://github.com/linux-test-project/ltp.git
|
||||
T: git https://github.com/linux-test-project/ltp.git
|
||||
|
||||
LYNX 28G SERDES PHY DRIVER
|
||||
M: Ioana Ciornei <ioana.ciornei@nxp.com>
|
||||
|
@ -185,7 +185,7 @@ static int genregs_set(struct task_struct *target,
|
||||
|
||||
#define REG_IGNORE_ONE(LOC) \
|
||||
if (!ret) \
|
||||
ret = user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf, \
|
||||
user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf, \
|
||||
offsetof(struct user_regs_struct, LOC), \
|
||||
offsetof(struct user_regs_struct, LOC) + 4);
|
||||
|
||||
|
@ -73,7 +73,7 @@ void machine_kexec_cleanup(struct kimage *image)
|
||||
{
|
||||
}
|
||||
|
||||
void machine_crash_nonpanic_core(void *unused)
|
||||
static void machine_crash_nonpanic_core(void *unused)
|
||||
{
|
||||
struct pt_regs regs;
|
||||
|
||||
|
@ -651,11 +651,9 @@ static int vfp_set(struct task_struct *target,
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf,
|
||||
user_fpregs_offset + sizeof(new_vfp.fpregs),
|
||||
user_fpscr_offset);
|
||||
if (ret)
|
||||
return ret;
|
||||
user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf,
|
||||
user_fpregs_offset + sizeof(new_vfp.fpregs),
|
||||
user_fpscr_offset);
|
||||
|
||||
ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf,
|
||||
&new_vfp.fpscr,
|
||||
|
@ -514,9 +514,7 @@ static int hw_break_set(struct task_struct *target,
|
||||
|
||||
/* Resource info and pad */
|
||||
offset = offsetof(struct user_hwdebug_state, dbg_regs);
|
||||
ret = user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf, 0, offset);
|
||||
if (ret)
|
||||
return ret;
|
||||
user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf, 0, offset);
|
||||
|
||||
/* (address, ctrl) registers */
|
||||
limit = regset->n * regset->size;
|
||||
@ -543,11 +541,8 @@ static int hw_break_set(struct task_struct *target,
|
||||
return ret;
|
||||
offset += PTRACE_HBP_CTRL_SZ;
|
||||
|
||||
ret = user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf,
|
||||
offset,
|
||||
offset + PTRACE_HBP_PAD_SZ);
|
||||
if (ret)
|
||||
return ret;
|
||||
user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf,
|
||||
offset, offset + PTRACE_HBP_PAD_SZ);
|
||||
offset += PTRACE_HBP_PAD_SZ;
|
||||
idx++;
|
||||
}
|
||||
@ -955,10 +950,7 @@ static int sve_set_common(struct task_struct *target,
|
||||
|
||||
start = end;
|
||||
end = SVE_PT_SVE_FPSR_OFFSET(vq);
|
||||
ret = user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf,
|
||||
start, end);
|
||||
if (ret)
|
||||
goto out;
|
||||
user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf, start, end);
|
||||
|
||||
/*
|
||||
* Copy fpsr, and fpcr which must follow contiguously in
|
||||
|
@ -115,10 +115,9 @@ static int genregs_set(struct task_struct *target,
|
||||
|
||||
/* Ignore the rest, if needed */
|
||||
if (!ret)
|
||||
ret = user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf,
|
||||
offsetof(struct user_regs_struct, pad1), -1);
|
||||
|
||||
if (ret)
|
||||
user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf,
|
||||
offsetof(struct user_regs_struct, pad1), -1);
|
||||
else
|
||||
return ret;
|
||||
|
||||
/*
|
||||
|
@ -23,10 +23,6 @@
|
||||
#include <asm/unaligned.h>
|
||||
#include <asm/early_ioremap.h>
|
||||
|
||||
/* We don't use IO slowdowns on the ia64, but.. */
|
||||
#define __SLOW_DOWN_IO do { } while (0)
|
||||
#define SLOW_DOWN_IO do { } while (0)
|
||||
|
||||
#define __IA64_UNCACHED_OFFSET RGN_BASE(RGN_UNCACHED)
|
||||
|
||||
/*
|
||||
|
@ -110,8 +110,6 @@ extern int kprobe_fault_handler(struct pt_regs *regs, int trapnr);
|
||||
extern int kprobe_exceptions_notify(struct notifier_block *self,
|
||||
unsigned long val, void *data);
|
||||
|
||||
extern void invalidate_stacked_regs(void);
|
||||
extern void flush_register_stack(void);
|
||||
extern void arch_remove_kprobe(struct kprobe *p);
|
||||
|
||||
#endif /* CONFIG_KPROBES */
|
||||
|
@ -1481,12 +1481,10 @@ static void do_gpregs_set(struct unw_frame_info *info, void *arg)
|
||||
return;
|
||||
/* Skip r0 */
|
||||
if (dst->pos < ELF_GR_OFFSET(1)) {
|
||||
dst->ret = user_regset_copyin_ignore(&dst->pos, &dst->count,
|
||||
&dst->u.set.kbuf,
|
||||
&dst->u.set.ubuf,
|
||||
0, ELF_GR_OFFSET(1));
|
||||
if (dst->ret)
|
||||
return;
|
||||
user_regset_copyin_ignore(&dst->pos, &dst->count,
|
||||
&dst->u.set.kbuf, &dst->u.set.ubuf,
|
||||
0, ELF_GR_OFFSET(1));
|
||||
dst->ret = 0;
|
||||
}
|
||||
|
||||
while (dst->count && dst->pos < ELF_AR_END_OFFSET) {
|
||||
@ -1560,11 +1558,11 @@ static void do_fpregs_set(struct unw_frame_info *info, void *arg)
|
||||
|
||||
/* Skip pos 0 and 1 */
|
||||
if (dst->count > 0 && dst->pos < ELF_FP_OFFSET(2)) {
|
||||
dst->ret = user_regset_copyin_ignore(&dst->pos, &dst->count,
|
||||
&dst->u.set.kbuf,
|
||||
&dst->u.set.ubuf,
|
||||
0, ELF_FP_OFFSET(2));
|
||||
if (dst->count == 0 || dst->ret)
|
||||
user_regset_copyin_ignore(&dst->pos, &dst->count,
|
||||
&dst->u.set.kbuf, &dst->u.set.ubuf,
|
||||
0, ELF_FP_OFFSET(2));
|
||||
dst->ret = 0;
|
||||
if (dst->count == 0)
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -140,7 +140,7 @@ asmlinkage unsigned long
|
||||
sys_mmap2 (unsigned long addr, unsigned long len, int prot, int flags, int fd, long pgoff)
|
||||
{
|
||||
addr = ksys_mmap_pgoff(addr, len, prot, flags, fd, pgoff);
|
||||
if (!IS_ERR((void *) addr))
|
||||
if (!IS_ERR_VALUE(addr))
|
||||
force_successful_syscall_return();
|
||||
return addr;
|
||||
}
|
||||
@ -152,7 +152,7 @@ sys_mmap (unsigned long addr, unsigned long len, int prot, int flags, int fd, lo
|
||||
return -EINVAL;
|
||||
|
||||
addr = ksys_mmap_pgoff(addr, len, prot, flags, fd, off >> PAGE_SHIFT);
|
||||
if (!IS_ERR((void *) addr))
|
||||
if (!IS_ERR_VALUE(addr))
|
||||
force_successful_syscall_return();
|
||||
return addr;
|
||||
}
|
||||
@ -162,7 +162,7 @@ ia64_mremap (unsigned long addr, unsigned long old_len, unsigned long new_len, u
|
||||
unsigned long new_addr)
|
||||
{
|
||||
addr = sys_mremap(addr, old_len, new_len, flags, new_addr);
|
||||
if (!IS_ERR((void *) addr))
|
||||
if (!IS_ERR_VALUE(addr))
|
||||
force_successful_syscall_return();
|
||||
return addr;
|
||||
}
|
||||
|
@ -531,10 +531,11 @@ static int fpr_set(struct task_struct *target,
|
||||
ptrace_setfcr31(target, fcr31);
|
||||
}
|
||||
|
||||
if (count > 0)
|
||||
err = user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf,
|
||||
fir_pos,
|
||||
fir_pos + sizeof(u32));
|
||||
if (count > 0) {
|
||||
user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf,
|
||||
fir_pos, fir_pos + sizeof(u32));
|
||||
return 0;
|
||||
}
|
||||
|
||||
return err;
|
||||
}
|
||||
|
@ -54,7 +54,7 @@ static int genregs_set(struct task_struct *target,
|
||||
|
||||
#define REG_IGNORE_RANGE(START, END) \
|
||||
if (!ret) \
|
||||
ret = user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf, \
|
||||
user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf, \
|
||||
START * 4, (END * 4) + 4);
|
||||
|
||||
#define REG_IN_ONE(PTR, LOC) \
|
||||
@ -80,8 +80,8 @@ static int genregs_set(struct task_struct *target,
|
||||
REG_IN_ONE(®s->ra, PTR_RA);
|
||||
REG_IN_ONE(®s->ea, PTR_PC); /* use ea for PC */
|
||||
if (!ret)
|
||||
ret = user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf,
|
||||
PTR_STATUS * 4, -1);
|
||||
user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf,
|
||||
PTR_STATUS * 4, -1);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
@ -66,10 +66,9 @@ static int genregs_set(struct task_struct *target,
|
||||
int ret;
|
||||
|
||||
/* ignore r0 */
|
||||
ret = user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf, 0, 4);
|
||||
user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf, 0, 4);
|
||||
/* r1 - r31 */
|
||||
if (!ret)
|
||||
ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf,
|
||||
ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf,
|
||||
regs->gpr+1, 4, 4*32);
|
||||
/* PC */
|
||||
if (!ret)
|
||||
@ -80,8 +79,7 @@ static int genregs_set(struct task_struct *target,
|
||||
* the Supervision register
|
||||
*/
|
||||
if (!ret)
|
||||
ret = user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf,
|
||||
4*33, -1);
|
||||
user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf, 4*33, -1);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
@ -424,8 +424,9 @@ static int fpr_set(struct task_struct *target,
|
||||
ubuf = u;
|
||||
pos *= sizeof(reg);
|
||||
count *= sizeof(reg);
|
||||
return user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf,
|
||||
ELF_NFPREG * sizeof(reg), -1);
|
||||
user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf,
|
||||
ELF_NFPREG * sizeof(reg), -1);
|
||||
return 0;
|
||||
}
|
||||
|
||||
#define RI(reg) (offsetof(struct user_regs_struct,reg) / sizeof(long))
|
||||
@ -543,8 +544,9 @@ static int gpr_set(struct task_struct *target,
|
||||
ubuf = u;
|
||||
pos *= sizeof(reg);
|
||||
count *= sizeof(reg);
|
||||
return user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf,
|
||||
ELF_NGREG * sizeof(reg), -1);
|
||||
user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf,
|
||||
ELF_NGREG * sizeof(reg), -1);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct user_regset native_regsets[] = {
|
||||
@ -606,8 +608,9 @@ static int gpr32_set(struct task_struct *target,
|
||||
ubuf = u;
|
||||
pos *= sizeof(reg);
|
||||
count *= sizeof(reg);
|
||||
return user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf,
|
||||
ELF_NGREG * sizeof(reg), -1);
|
||||
user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf,
|
||||
ELF_NGREG * sizeof(reg), -1);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -170,9 +170,9 @@ int tm_cgpr_set(struct task_struct *target, const struct user_regset *regset,
|
||||
(PT_MAX_PUT_REG + 1) * sizeof(reg));
|
||||
|
||||
if (PT_MAX_PUT_REG + 1 < PT_TRAP && !ret)
|
||||
ret = user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf,
|
||||
(PT_MAX_PUT_REG + 1) * sizeof(reg),
|
||||
PT_TRAP * sizeof(reg));
|
||||
user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf,
|
||||
(PT_MAX_PUT_REG + 1) * sizeof(reg),
|
||||
PT_TRAP * sizeof(reg));
|
||||
|
||||
if (!ret && count > 0) {
|
||||
ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf, ®,
|
||||
@ -183,8 +183,8 @@ int tm_cgpr_set(struct task_struct *target, const struct user_regset *regset,
|
||||
}
|
||||
|
||||
if (!ret)
|
||||
ret = user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf,
|
||||
(PT_TRAP + 1) * sizeof(reg), -1);
|
||||
user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf,
|
||||
(PT_TRAP + 1) * sizeof(reg), -1);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
@ -267,9 +267,9 @@ static int gpr_set(struct task_struct *target, const struct user_regset *regset,
|
||||
(PT_MAX_PUT_REG + 1) * sizeof(reg));
|
||||
|
||||
if (PT_MAX_PUT_REG + 1 < PT_TRAP && !ret)
|
||||
ret = user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf,
|
||||
(PT_MAX_PUT_REG + 1) * sizeof(reg),
|
||||
PT_TRAP * sizeof(reg));
|
||||
user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf,
|
||||
(PT_MAX_PUT_REG + 1) * sizeof(reg),
|
||||
PT_TRAP * sizeof(reg));
|
||||
|
||||
if (!ret && count > 0) {
|
||||
ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf, ®,
|
||||
@ -280,8 +280,8 @@ static int gpr_set(struct task_struct *target, const struct user_regset *regset,
|
||||
}
|
||||
|
||||
if (!ret)
|
||||
ret = user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf,
|
||||
(PT_TRAP + 1) * sizeof(reg), -1);
|
||||
user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf,
|
||||
(PT_TRAP + 1) * sizeof(reg), -1);
|
||||
|
||||
return ret;
|
||||
}
|
||||
@ -706,8 +706,9 @@ int gpr32_set_common(struct task_struct *target,
|
||||
ubuf = u;
|
||||
pos *= sizeof(reg);
|
||||
count *= sizeof(reg);
|
||||
return user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf,
|
||||
(PT_TRAP + 1) * sizeof(reg), -1);
|
||||
user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf,
|
||||
(PT_TRAP + 1) * sizeof(reg), -1);
|
||||
return 0;
|
||||
|
||||
Efault:
|
||||
user_read_access_end();
|
||||
|
@ -35,7 +35,7 @@ struct umem_info {
|
||||
|
||||
/* usable memory ranges to look up */
|
||||
unsigned int nr_ranges;
|
||||
const struct crash_mem_range *ranges;
|
||||
const struct range *ranges;
|
||||
};
|
||||
|
||||
const struct kexec_file_ops * const kexec_file_loaders[] = {
|
||||
|
@ -33,7 +33,7 @@
|
||||
static inline unsigned int get_max_nr_ranges(size_t size)
|
||||
{
|
||||
return ((size - sizeof(struct crash_mem)) /
|
||||
sizeof(struct crash_mem_range));
|
||||
sizeof(struct range));
|
||||
}
|
||||
|
||||
/**
|
||||
@ -51,7 +51,7 @@ static inline size_t get_mem_rngs_size(struct crash_mem *mem_rngs)
|
||||
return 0;
|
||||
|
||||
size = (sizeof(struct crash_mem) +
|
||||
(mem_rngs->max_nr_ranges * sizeof(struct crash_mem_range)));
|
||||
(mem_rngs->max_nr_ranges * sizeof(struct range)));
|
||||
|
||||
/*
|
||||
* Memory is allocated in size multiple of MEM_RANGE_CHUNK_SZ.
|
||||
@ -98,7 +98,7 @@ static int __add_mem_range(struct crash_mem **mem_ranges, u64 base, u64 size)
|
||||
*/
|
||||
static void __merge_memory_ranges(struct crash_mem *mem_rngs)
|
||||
{
|
||||
struct crash_mem_range *ranges;
|
||||
struct range *ranges;
|
||||
int i, idx;
|
||||
|
||||
if (!mem_rngs)
|
||||
@ -123,7 +123,7 @@ static void __merge_memory_ranges(struct crash_mem *mem_rngs)
|
||||
/* cmp_func_t callback to sort ranges with sort() */
|
||||
static int rngcmp(const void *_x, const void *_y)
|
||||
{
|
||||
const struct crash_mem_range *x = _x, *y = _y;
|
||||
const struct range *x = _x, *y = _y;
|
||||
|
||||
if (x->start > y->start)
|
||||
return 1;
|
||||
|
@ -157,8 +157,8 @@ static int genregs_set(struct task_struct *target,
|
||||
offsetof(struct pt_regs, pc),
|
||||
sizeof(struct pt_regs));
|
||||
if (!ret)
|
||||
ret = user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf,
|
||||
sizeof(struct pt_regs), -1);
|
||||
user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf,
|
||||
sizeof(struct pt_regs), -1);
|
||||
|
||||
return ret;
|
||||
}
|
||||
@ -229,8 +229,8 @@ static int dspregs_set(struct task_struct *target,
|
||||
ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf, regs,
|
||||
0, sizeof(struct pt_dspregs));
|
||||
if (!ret)
|
||||
ret = user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf,
|
||||
sizeof(struct pt_dspregs), -1);
|
||||
user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf,
|
||||
sizeof(struct pt_dspregs), -1);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
@ -158,8 +158,9 @@ static int genregs32_set(struct task_struct *target,
|
||||
35 * sizeof(u32), 36 * sizeof(u32));
|
||||
if (ret || !count)
|
||||
return ret;
|
||||
return user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf,
|
||||
36 * sizeof(u32), 38 * sizeof(u32));
|
||||
user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf, 36 * sizeof(u32),
|
||||
38 * sizeof(u32));
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int fpregs32_get(struct task_struct *target,
|
||||
@ -203,8 +204,8 @@ static int fpregs32_set(struct task_struct *target,
|
||||
33 * sizeof(u32),
|
||||
34 * sizeof(u32));
|
||||
if (!ret)
|
||||
ret = user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf,
|
||||
34 * sizeof(u32), -1);
|
||||
user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf,
|
||||
34 * sizeof(u32), -1);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -332,8 +332,8 @@ static int genregs64_set(struct task_struct *target,
|
||||
}
|
||||
|
||||
if (!ret)
|
||||
ret = user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf,
|
||||
36 * sizeof(u64), -1);
|
||||
user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf,
|
||||
36 * sizeof(u64), -1);
|
||||
|
||||
return ret;
|
||||
}
|
||||
@ -406,8 +406,8 @@ static int fpregs64_set(struct task_struct *target,
|
||||
task_thread_info(target)->fpsaved[0] = fprs;
|
||||
|
||||
if (!ret)
|
||||
ret = user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf,
|
||||
35 * sizeof(u64), -1);
|
||||
user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf,
|
||||
35 * sizeof(u64), -1);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@ -473,10 +473,8 @@ static int setregs64_set(struct task_struct *target,
|
||||
15 * sizeof(u64));
|
||||
if (ret)
|
||||
return ret;
|
||||
ret =user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf,
|
||||
15 * sizeof(u64), 16 * sizeof(u64));
|
||||
if (ret)
|
||||
return ret;
|
||||
user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf,
|
||||
15 * sizeof(u64), 16 * sizeof(u64));
|
||||
/* TSTATE */
|
||||
ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf,
|
||||
&tstate,
|
||||
@ -670,8 +668,9 @@ finish:
|
||||
pos *= sizeof(reg);
|
||||
count *= sizeof(reg);
|
||||
|
||||
return user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf,
|
||||
38 * sizeof(reg), -1);
|
||||
user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf,
|
||||
38 * sizeof(reg), -1);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int fpregs32_get(struct task_struct *target,
|
||||
@ -737,8 +736,8 @@ static int fpregs32_set(struct task_struct *target,
|
||||
task_thread_info(target)->fpsaved[0] = fprs;
|
||||
|
||||
if (!ret)
|
||||
ret = user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf,
|
||||
34 * sizeof(u32), -1);
|
||||
user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf,
|
||||
34 * sizeof(u32), -1);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -1804,8 +1804,11 @@ static int rio_mport_add_riodev(struct mport_cdev_priv *priv,
|
||||
rio_init_dbell_res(&rdev->riores[RIO_DOORBELL_RESOURCE],
|
||||
0, 0xffff);
|
||||
err = rio_add_device(rdev);
|
||||
if (err)
|
||||
goto cleanup;
|
||||
if (err) {
|
||||
put_device(&rdev->dev);
|
||||
return err;
|
||||
}
|
||||
|
||||
rio_dev_get(rdev);
|
||||
|
||||
return 0;
|
||||
@ -1901,10 +1904,6 @@ static int mport_cdev_open(struct inode *inode, struct file *filp)
|
||||
|
||||
priv->md = chdev;
|
||||
|
||||
mutex_lock(&chdev->file_mutex);
|
||||
list_add_tail(&priv->list, &chdev->file_list);
|
||||
mutex_unlock(&chdev->file_mutex);
|
||||
|
||||
INIT_LIST_HEAD(&priv->db_filters);
|
||||
INIT_LIST_HEAD(&priv->pw_filters);
|
||||
spin_lock_init(&priv->fifo_lock);
|
||||
@ -1913,6 +1912,7 @@ static int mport_cdev_open(struct inode *inode, struct file *filp)
|
||||
sizeof(struct rio_event) * MPORT_EVENT_DEPTH,
|
||||
GFP_KERNEL);
|
||||
if (ret < 0) {
|
||||
put_device(&chdev->dev);
|
||||
dev_err(&chdev->dev, DRV_NAME ": kfifo_alloc failed\n");
|
||||
ret = -ENOMEM;
|
||||
goto err_fifo;
|
||||
@ -1923,6 +1923,9 @@ static int mport_cdev_open(struct inode *inode, struct file *filp)
|
||||
spin_lock_init(&priv->req_lock);
|
||||
mutex_init(&priv->dma_lock);
|
||||
#endif
|
||||
mutex_lock(&chdev->file_mutex);
|
||||
list_add_tail(&priv->list, &chdev->file_list);
|
||||
mutex_unlock(&chdev->file_mutex);
|
||||
|
||||
filp->private_data = priv;
|
||||
goto out;
|
||||
|
@ -2941,7 +2941,8 @@ static void tsi721_remove(struct pci_dev *pdev)
|
||||
|
||||
tsi721_disable_ints(priv);
|
||||
tsi721_free_irq(priv);
|
||||
flush_scheduled_work();
|
||||
flush_work(&priv->idb_work);
|
||||
flush_work(&priv->pw_work);
|
||||
rio_unregister_mport(&priv->mport);
|
||||
|
||||
tsi721_unregister_dma(priv);
|
||||
|
@ -454,8 +454,12 @@ static struct rio_dev *rio_setup_device(struct rio_net *net,
|
||||
0, 0xffff);
|
||||
|
||||
ret = rio_add_device(rdev);
|
||||
if (ret)
|
||||
goto cleanup;
|
||||
if (ret) {
|
||||
if (rswitch)
|
||||
kfree(rswitch->route_table);
|
||||
put_device(&rdev->dev);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
rio_dev_get(rdev);
|
||||
|
||||
|
@ -2186,11 +2186,16 @@ int rio_register_mport(struct rio_mport *port)
|
||||
atomic_set(&port->state, RIO_DEVICE_RUNNING);
|
||||
|
||||
res = device_register(&port->dev);
|
||||
if (res)
|
||||
if (res) {
|
||||
dev_err(&port->dev, "RIO: mport%d registration failed ERR=%d\n",
|
||||
port->id, res);
|
||||
else
|
||||
mutex_lock(&rio_mport_list_lock);
|
||||
list_del(&port->node);
|
||||
mutex_unlock(&rio_mport_list_lock);
|
||||
put_device(&port->dev);
|
||||
} else {
|
||||
dev_dbg(&port->dev, "RIO: registered mport%d\n", port->id);
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
|
@ -325,6 +325,10 @@ static int format_corename(struct core_name *cn, struct coredump_params *cprm,
|
||||
err = cn_printf(cn, "%lu",
|
||||
rlimit(RLIMIT_CORE));
|
||||
break;
|
||||
/* CPU the task ran on */
|
||||
case 'C':
|
||||
err = cn_printf(cn, "%d", cprm->cpu);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
@ -534,6 +538,7 @@ void do_coredump(const kernel_siginfo_t *siginfo)
|
||||
*/
|
||||
.mm_flags = mm->flags,
|
||||
.vma_meta = NULL,
|
||||
.cpu = raw_smp_processor_id(),
|
||||
};
|
||||
|
||||
audit_core_dumps(siginfo->si_signo);
|
||||
|
@ -378,8 +378,8 @@ ssize_t debugfs_attr_read(struct file *file, char __user *buf,
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(debugfs_attr_read);
|
||||
|
||||
ssize_t debugfs_attr_write(struct file *file, const char __user *buf,
|
||||
size_t len, loff_t *ppos)
|
||||
static ssize_t debugfs_attr_write_xsigned(struct file *file, const char __user *buf,
|
||||
size_t len, loff_t *ppos, bool is_signed)
|
||||
{
|
||||
struct dentry *dentry = F_DENTRY(file);
|
||||
ssize_t ret;
|
||||
@ -387,12 +387,28 @@ ssize_t debugfs_attr_write(struct file *file, const char __user *buf,
|
||||
ret = debugfs_file_get(dentry);
|
||||
if (unlikely(ret))
|
||||
return ret;
|
||||
ret = simple_attr_write(file, buf, len, ppos);
|
||||
if (is_signed)
|
||||
ret = simple_attr_write_signed(file, buf, len, ppos);
|
||||
else
|
||||
ret = simple_attr_write(file, buf, len, ppos);
|
||||
debugfs_file_put(dentry);
|
||||
return ret;
|
||||
}
|
||||
|
||||
ssize_t debugfs_attr_write(struct file *file, const char __user *buf,
|
||||
size_t len, loff_t *ppos)
|
||||
{
|
||||
return debugfs_attr_write_xsigned(file, buf, len, ppos, false);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(debugfs_attr_write);
|
||||
|
||||
ssize_t debugfs_attr_write_signed(struct file *file, const char __user *buf,
|
||||
size_t len, loff_t *ppos)
|
||||
{
|
||||
return debugfs_attr_write_xsigned(file, buf, len, ppos, true);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(debugfs_attr_write_signed);
|
||||
|
||||
static struct dentry *debugfs_create_mode_unsafe(const char *name, umode_t mode,
|
||||
struct dentry *parent, void *value,
|
||||
const struct file_operations *fops,
|
||||
@ -738,11 +754,11 @@ static int debugfs_atomic_t_get(void *data, u64 *val)
|
||||
*val = atomic_read((atomic_t *)data);
|
||||
return 0;
|
||||
}
|
||||
DEFINE_DEBUGFS_ATTRIBUTE(fops_atomic_t, debugfs_atomic_t_get,
|
||||
DEFINE_DEBUGFS_ATTRIBUTE_SIGNED(fops_atomic_t, debugfs_atomic_t_get,
|
||||
debugfs_atomic_t_set, "%lld\n");
|
||||
DEFINE_DEBUGFS_ATTRIBUTE(fops_atomic_t_ro, debugfs_atomic_t_get, NULL,
|
||||
DEFINE_DEBUGFS_ATTRIBUTE_SIGNED(fops_atomic_t_ro, debugfs_atomic_t_get, NULL,
|
||||
"%lld\n");
|
||||
DEFINE_DEBUGFS_ATTRIBUTE(fops_atomic_t_wo, NULL, debugfs_atomic_t_set,
|
||||
DEFINE_DEBUGFS_ATTRIBUTE_SIGNED(fops_atomic_t_wo, NULL, debugfs_atomic_t_set,
|
||||
"%lld\n");
|
||||
|
||||
/**
|
||||
|
@ -17,7 +17,7 @@ struct fat_fid {
|
||||
#define FAT_FID_SIZE_WITHOUT_PARENT 3
|
||||
#define FAT_FID_SIZE_WITH_PARENT (sizeof(struct fat_fid)/sizeof(u32))
|
||||
|
||||
/**
|
||||
/*
|
||||
* Look up a directory inode given its starting cluster.
|
||||
*/
|
||||
static struct inode *fat_dget(struct super_block *sb, int i_logstart)
|
||||
@ -135,7 +135,7 @@ fat_encode_fh_nostale(struct inode *inode, __u32 *fh, int *lenp,
|
||||
return type;
|
||||
}
|
||||
|
||||
/**
|
||||
/*
|
||||
* Map a NFS file handle to a corresponding dentry.
|
||||
* The dentry may or may not be connected to the filesystem root.
|
||||
*/
|
||||
|
@ -458,6 +458,8 @@ int hfs_write_inode(struct inode *inode, struct writeback_control *wbc)
|
||||
/* panic? */
|
||||
return -EIO;
|
||||
|
||||
if (HFS_I(main_inode)->cat_key.CName.len > HFS_NAMELEN)
|
||||
return -EIO;
|
||||
fd.search_key->cat = HFS_I(main_inode)->cat_key;
|
||||
if (hfs_brec_find(&fd))
|
||||
/* panic? */
|
||||
|
@ -109,7 +109,7 @@ void hfs_asc2mac(struct super_block *sb, struct hfs_name *out, const struct qstr
|
||||
if (nls_io) {
|
||||
wchar_t ch;
|
||||
|
||||
while (srclen > 0) {
|
||||
while (srclen > 0 && dstlen > 0) {
|
||||
size = nls_io->char2uni(src, srclen, &ch);
|
||||
if (size < 0) {
|
||||
ch = '?';
|
||||
|
@ -198,6 +198,8 @@ struct hfsplus_sb_info {
|
||||
#define HFSPLUS_SB_HFSX 3
|
||||
#define HFSPLUS_SB_CASEFOLD 4
|
||||
#define HFSPLUS_SB_NOBARRIER 5
|
||||
#define HFSPLUS_SB_UID 6
|
||||
#define HFSPLUS_SB_GID 7
|
||||
|
||||
static inline struct hfsplus_sb_info *HFSPLUS_SB(struct super_block *sb)
|
||||
{
|
||||
|
@ -192,11 +192,11 @@ static void hfsplus_get_perms(struct inode *inode,
|
||||
mode = be16_to_cpu(perms->mode);
|
||||
|
||||
i_uid_write(inode, be32_to_cpu(perms->owner));
|
||||
if (!i_uid_read(inode) && !mode)
|
||||
if ((test_bit(HFSPLUS_SB_UID, &sbi->flags)) || (!i_uid_read(inode) && !mode))
|
||||
inode->i_uid = sbi->uid;
|
||||
|
||||
i_gid_write(inode, be32_to_cpu(perms->group));
|
||||
if (!i_gid_read(inode) && !mode)
|
||||
if ((test_bit(HFSPLUS_SB_GID, &sbi->flags)) || (!i_gid_read(inode) && !mode))
|
||||
inode->i_gid = sbi->gid;
|
||||
|
||||
if (dir) {
|
||||
|
@ -140,6 +140,8 @@ int hfsplus_parse_options(char *input, struct hfsplus_sb_info *sbi)
|
||||
if (!uid_valid(sbi->uid)) {
|
||||
pr_err("invalid uid specified\n");
|
||||
return 0;
|
||||
} else {
|
||||
set_bit(HFSPLUS_SB_UID, &sbi->flags);
|
||||
}
|
||||
break;
|
||||
case opt_gid:
|
||||
@ -151,6 +153,8 @@ int hfsplus_parse_options(char *input, struct hfsplus_sb_info *sbi)
|
||||
if (!gid_valid(sbi->gid)) {
|
||||
pr_err("invalid gid specified\n");
|
||||
return 0;
|
||||
} else {
|
||||
set_bit(HFSPLUS_SB_GID, &sbi->flags);
|
||||
}
|
||||
break;
|
||||
case opt_part:
|
||||
|
22
fs/libfs.c
22
fs/libfs.c
@ -995,8 +995,8 @@ out:
|
||||
EXPORT_SYMBOL_GPL(simple_attr_read);
|
||||
|
||||
/* interpret the buffer as a number to call the set function with */
|
||||
ssize_t simple_attr_write(struct file *file, const char __user *buf,
|
||||
size_t len, loff_t *ppos)
|
||||
static ssize_t simple_attr_write_xsigned(struct file *file, const char __user *buf,
|
||||
size_t len, loff_t *ppos, bool is_signed)
|
||||
{
|
||||
struct simple_attr *attr;
|
||||
unsigned long long val;
|
||||
@ -1017,7 +1017,10 @@ ssize_t simple_attr_write(struct file *file, const char __user *buf,
|
||||
goto out;
|
||||
|
||||
attr->set_buf[size] = '\0';
|
||||
ret = kstrtoull(attr->set_buf, 0, &val);
|
||||
if (is_signed)
|
||||
ret = kstrtoll(attr->set_buf, 0, &val);
|
||||
else
|
||||
ret = kstrtoull(attr->set_buf, 0, &val);
|
||||
if (ret)
|
||||
goto out;
|
||||
ret = attr->set(attr->data, val);
|
||||
@ -1027,8 +1030,21 @@ out:
|
||||
mutex_unlock(&attr->mutex);
|
||||
return ret;
|
||||
}
|
||||
|
||||
ssize_t simple_attr_write(struct file *file, const char __user *buf,
|
||||
size_t len, loff_t *ppos)
|
||||
{
|
||||
return simple_attr_write_xsigned(file, buf, len, ppos, false);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(simple_attr_write);
|
||||
|
||||
ssize_t simple_attr_write_signed(struct file *file, const char __user *buf,
|
||||
size_t len, loff_t *ppos)
|
||||
{
|
||||
return simple_attr_write_xsigned(file, buf, len, ppos, true);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(simple_attr_write_signed);
|
||||
|
||||
/**
|
||||
* generic_fh_to_dentry - generic helper for the fh_to_dentry export operation
|
||||
* @sb: filesystem to do the file handle conversion on
|
||||
|
@ -13,6 +13,7 @@
|
||||
#include <linux/blkdev.h>
|
||||
#include <linux/backing-dev.h>
|
||||
#include <linux/random.h>
|
||||
#include <linux/log2.h>
|
||||
#include <linux/crc32.h>
|
||||
#include "nilfs.h"
|
||||
#include "segment.h"
|
||||
@ -192,6 +193,34 @@ static int nilfs_store_log_cursor(struct the_nilfs *nilfs,
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* nilfs_get_blocksize - get block size from raw superblock data
|
||||
* @sb: super block instance
|
||||
* @sbp: superblock raw data buffer
|
||||
* @blocksize: place to store block size
|
||||
*
|
||||
* nilfs_get_blocksize() calculates the block size from the block size
|
||||
* exponent information written in @sbp and stores it in @blocksize,
|
||||
* or aborts with an error message if it's too large.
|
||||
*
|
||||
* Return Value: On success, 0 is returned. If the block size is too
|
||||
* large, -EINVAL is returned.
|
||||
*/
|
||||
static int nilfs_get_blocksize(struct super_block *sb,
|
||||
struct nilfs_super_block *sbp, int *blocksize)
|
||||
{
|
||||
unsigned int shift_bits = le32_to_cpu(sbp->s_log_block_size);
|
||||
|
||||
if (unlikely(shift_bits >
|
||||
ilog2(NILFS_MAX_BLOCK_SIZE) - BLOCK_SIZE_BITS)) {
|
||||
nilfs_err(sb, "too large filesystem blocksize: 2 ^ %u KiB",
|
||||
shift_bits);
|
||||
return -EINVAL;
|
||||
}
|
||||
*blocksize = BLOCK_SIZE << shift_bits;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* load_nilfs - load and recover the nilfs
|
||||
* @nilfs: the_nilfs structure to be released
|
||||
@ -245,11 +274,15 @@ int load_nilfs(struct the_nilfs *nilfs, struct super_block *sb)
|
||||
nilfs->ns_sbwtime = le64_to_cpu(sbp[0]->s_wtime);
|
||||
|
||||
/* verify consistency between two super blocks */
|
||||
blocksize = BLOCK_SIZE << le32_to_cpu(sbp[0]->s_log_block_size);
|
||||
err = nilfs_get_blocksize(sb, sbp[0], &blocksize);
|
||||
if (err)
|
||||
goto scan_error;
|
||||
|
||||
if (blocksize != nilfs->ns_blocksize) {
|
||||
nilfs_warn(sb,
|
||||
"blocksize differs between two super blocks (%d != %d)",
|
||||
blocksize, nilfs->ns_blocksize);
|
||||
err = -EINVAL;
|
||||
goto scan_error;
|
||||
}
|
||||
|
||||
@ -443,11 +476,33 @@ static int nilfs_valid_sb(struct nilfs_super_block *sbp)
|
||||
return crc == le32_to_cpu(sbp->s_sum);
|
||||
}
|
||||
|
||||
static int nilfs_sb2_bad_offset(struct nilfs_super_block *sbp, u64 offset)
|
||||
/**
|
||||
* nilfs_sb2_bad_offset - check the location of the second superblock
|
||||
* @sbp: superblock raw data buffer
|
||||
* @offset: byte offset of second superblock calculated from device size
|
||||
*
|
||||
* nilfs_sb2_bad_offset() checks if the position on the second
|
||||
* superblock is valid or not based on the filesystem parameters
|
||||
* stored in @sbp. If @offset points to a location within the segment
|
||||
* area, or if the parameters themselves are not normal, it is
|
||||
* determined to be invalid.
|
||||
*
|
||||
* Return Value: true if invalid, false if valid.
|
||||
*/
|
||||
static bool nilfs_sb2_bad_offset(struct nilfs_super_block *sbp, u64 offset)
|
||||
{
|
||||
return offset < ((le64_to_cpu(sbp->s_nsegments) *
|
||||
le32_to_cpu(sbp->s_blocks_per_segment)) <<
|
||||
(le32_to_cpu(sbp->s_log_block_size) + 10));
|
||||
unsigned int shift_bits = le32_to_cpu(sbp->s_log_block_size);
|
||||
u32 blocks_per_segment = le32_to_cpu(sbp->s_blocks_per_segment);
|
||||
u64 nsegments = le64_to_cpu(sbp->s_nsegments);
|
||||
u64 index;
|
||||
|
||||
if (blocks_per_segment < NILFS_SEG_MIN_BLOCKS ||
|
||||
shift_bits > ilog2(NILFS_MAX_BLOCK_SIZE) - BLOCK_SIZE_BITS)
|
||||
return true;
|
||||
|
||||
index = offset >> (shift_bits + BLOCK_SIZE_BITS);
|
||||
do_div(index, blocks_per_segment);
|
||||
return index < nsegments;
|
||||
}
|
||||
|
||||
static void nilfs_release_super_block(struct the_nilfs *nilfs)
|
||||
@ -586,9 +641,11 @@ int init_nilfs(struct the_nilfs *nilfs, struct super_block *sb, char *data)
|
||||
if (err)
|
||||
goto failed_sbh;
|
||||
|
||||
blocksize = BLOCK_SIZE << le32_to_cpu(sbp->s_log_block_size);
|
||||
if (blocksize < NILFS_MIN_BLOCK_SIZE ||
|
||||
blocksize > NILFS_MAX_BLOCK_SIZE) {
|
||||
err = nilfs_get_blocksize(sb, sbp, &blocksize);
|
||||
if (err)
|
||||
goto failed_sbh;
|
||||
|
||||
if (blocksize < NILFS_MIN_BLOCK_SIZE) {
|
||||
nilfs_err(sb,
|
||||
"couldn't mount because of unsupported filesystem blocksize %d",
|
||||
blocksize);
|
||||
|
@ -335,7 +335,7 @@ static void o2hb_arm_timeout(struct o2hb_region *reg)
|
||||
/* negotiate timeout must be less than write timeout. */
|
||||
schedule_delayed_work(®->hr_nego_timeout_work,
|
||||
msecs_to_jiffies(O2HB_NEGO_TIMEOUT_MS));
|
||||
memset(reg->hr_nego_node_bitmap, 0, sizeof(reg->hr_nego_node_bitmap));
|
||||
bitmap_zero(reg->hr_nego_node_bitmap, O2NM_MAX_NODES);
|
||||
}
|
||||
|
||||
static void o2hb_disarm_timeout(struct o2hb_region *reg)
|
||||
@ -375,7 +375,7 @@ static void o2hb_nego_timeout(struct work_struct *work)
|
||||
if (reg->hr_last_hb_status)
|
||||
return;
|
||||
|
||||
o2hb_fill_node_map(live_node_bitmap, sizeof(live_node_bitmap));
|
||||
o2hb_fill_node_map(live_node_bitmap, O2NM_MAX_NODES);
|
||||
/* lowest node as master node to make negotiate decision. */
|
||||
master_node = find_first_bit(live_node_bitmap, O2NM_MAX_NODES);
|
||||
|
||||
@ -386,8 +386,8 @@ static void o2hb_nego_timeout(struct work_struct *work)
|
||||
config_item_name(®->hr_item), reg->hr_bdev);
|
||||
set_bit(master_node, reg->hr_nego_node_bitmap);
|
||||
}
|
||||
if (memcmp(reg->hr_nego_node_bitmap, live_node_bitmap,
|
||||
sizeof(reg->hr_nego_node_bitmap))) {
|
||||
if (!bitmap_equal(reg->hr_nego_node_bitmap, live_node_bitmap,
|
||||
O2NM_MAX_NODES)) {
|
||||
/* check negotiate bitmap every second to do timeout
|
||||
* approve decision.
|
||||
*/
|
||||
@ -856,8 +856,8 @@ static void o2hb_set_quorum_device(struct o2hb_region *reg)
|
||||
* live nodes heartbeat on it. In other words, the region has been
|
||||
* added to all nodes.
|
||||
*/
|
||||
if (memcmp(reg->hr_live_node_bitmap, o2hb_live_node_bitmap,
|
||||
sizeof(o2hb_live_node_bitmap)))
|
||||
if (!bitmap_equal(reg->hr_live_node_bitmap, o2hb_live_node_bitmap,
|
||||
O2NM_MAX_NODES))
|
||||
goto unlock;
|
||||
|
||||
printk(KERN_NOTICE "o2hb: Region %s (%pg) is now a quorum device\n",
|
||||
@ -1087,7 +1087,7 @@ static int o2hb_do_disk_heartbeat(struct o2hb_region *reg)
|
||||
* If a node is not configured but is in the livemap, we still need
|
||||
* to read the slot so as to be able to remove it from the livemap.
|
||||
*/
|
||||
o2hb_fill_node_map(live_node_bitmap, sizeof(live_node_bitmap));
|
||||
o2hb_fill_node_map(live_node_bitmap, O2NM_MAX_NODES);
|
||||
i = -1;
|
||||
while ((i = find_next_bit(live_node_bitmap,
|
||||
O2NM_MAX_NODES, i + 1)) < O2NM_MAX_NODES) {
|
||||
@ -1437,11 +1437,11 @@ void o2hb_init(void)
|
||||
for (i = 0; i < ARRAY_SIZE(o2hb_live_slots); i++)
|
||||
INIT_LIST_HEAD(&o2hb_live_slots[i]);
|
||||
|
||||
memset(o2hb_live_node_bitmap, 0, sizeof(o2hb_live_node_bitmap));
|
||||
memset(o2hb_region_bitmap, 0, sizeof(o2hb_region_bitmap));
|
||||
memset(o2hb_live_region_bitmap, 0, sizeof(o2hb_live_region_bitmap));
|
||||
memset(o2hb_quorum_region_bitmap, 0, sizeof(o2hb_quorum_region_bitmap));
|
||||
memset(o2hb_failed_region_bitmap, 0, sizeof(o2hb_failed_region_bitmap));
|
||||
bitmap_zero(o2hb_live_node_bitmap, O2NM_MAX_NODES);
|
||||
bitmap_zero(o2hb_region_bitmap, O2NM_MAX_REGIONS);
|
||||
bitmap_zero(o2hb_live_region_bitmap, O2NM_MAX_REGIONS);
|
||||
bitmap_zero(o2hb_quorum_region_bitmap, O2NM_MAX_REGIONS);
|
||||
bitmap_zero(o2hb_failed_region_bitmap, O2NM_MAX_REGIONS);
|
||||
|
||||
o2hb_dependent_users = 0;
|
||||
|
||||
@ -1450,23 +1450,21 @@ void o2hb_init(void)
|
||||
|
||||
/* if we're already in a callback then we're already serialized by the sem */
|
||||
static void o2hb_fill_node_map_from_callback(unsigned long *map,
|
||||
unsigned bytes)
|
||||
unsigned int bits)
|
||||
{
|
||||
BUG_ON(bytes < (BITS_TO_LONGS(O2NM_MAX_NODES) * sizeof(unsigned long)));
|
||||
|
||||
memcpy(map, &o2hb_live_node_bitmap, bytes);
|
||||
bitmap_copy(map, o2hb_live_node_bitmap, bits);
|
||||
}
|
||||
|
||||
/*
|
||||
* get a map of all nodes that are heartbeating in any regions
|
||||
*/
|
||||
void o2hb_fill_node_map(unsigned long *map, unsigned bytes)
|
||||
void o2hb_fill_node_map(unsigned long *map, unsigned int bits)
|
||||
{
|
||||
/* callers want to serialize this map and callbacks so that they
|
||||
* can trust that they don't miss nodes coming to the party */
|
||||
down_read(&o2hb_callback_sem);
|
||||
spin_lock(&o2hb_live_lock);
|
||||
o2hb_fill_node_map_from_callback(map, bytes);
|
||||
o2hb_fill_node_map_from_callback(map, bits);
|
||||
spin_unlock(&o2hb_live_lock);
|
||||
up_read(&o2hb_callback_sem);
|
||||
}
|
||||
@ -2460,7 +2458,7 @@ int o2hb_check_node_heartbeating_no_sem(u8 node_num)
|
||||
unsigned long testing_map[BITS_TO_LONGS(O2NM_MAX_NODES)];
|
||||
|
||||
spin_lock(&o2hb_live_lock);
|
||||
o2hb_fill_node_map_from_callback(testing_map, sizeof(testing_map));
|
||||
o2hb_fill_node_map_from_callback(testing_map, O2NM_MAX_NODES);
|
||||
spin_unlock(&o2hb_live_lock);
|
||||
if (!test_bit(node_num, testing_map)) {
|
||||
mlog(ML_HEARTBEAT,
|
||||
@ -2477,7 +2475,7 @@ int o2hb_check_node_heartbeating_from_callback(u8 node_num)
|
||||
{
|
||||
unsigned long testing_map[BITS_TO_LONGS(O2NM_MAX_NODES)];
|
||||
|
||||
o2hb_fill_node_map_from_callback(testing_map, sizeof(testing_map));
|
||||
o2hb_fill_node_map_from_callback(testing_map, O2NM_MAX_NODES);
|
||||
if (!test_bit(node_num, testing_map)) {
|
||||
mlog(ML_HEARTBEAT,
|
||||
"node (%u) does not have heartbeating enabled.\n",
|
||||
|
@ -59,7 +59,7 @@ int o2hb_register_callback(const char *region_uuid,
|
||||
void o2hb_unregister_callback(const char *region_uuid,
|
||||
struct o2hb_callback_func *hc);
|
||||
void o2hb_fill_node_map(unsigned long *map,
|
||||
unsigned bytes);
|
||||
unsigned int bits);
|
||||
void o2hb_exit(void);
|
||||
void o2hb_init(void);
|
||||
int o2hb_check_node_heartbeating_no_sem(u8 node_num);
|
||||
|
@ -438,7 +438,7 @@ static int o2net_fill_bitmap(char *buf, int len)
|
||||
unsigned long map[BITS_TO_LONGS(O2NM_MAX_NODES)];
|
||||
int i = -1, out = 0;
|
||||
|
||||
o2net_fill_node_map(map, sizeof(map));
|
||||
o2net_fill_node_map(map, O2NM_MAX_NODES);
|
||||
|
||||
while ((i = find_next_bit(map, O2NM_MAX_NODES, i + 1)) < O2NM_MAX_NODES)
|
||||
out += scnprintf(buf + out, PAGE_SIZE - out, "%d ", i);
|
||||
|
@ -54,7 +54,7 @@ int o2nm_configured_node_map(unsigned long *map, unsigned bytes)
|
||||
return -EINVAL;
|
||||
|
||||
read_lock(&cluster->cl_nodes_lock);
|
||||
memcpy(map, cluster->cl_nodes_bitmap, sizeof(cluster->cl_nodes_bitmap));
|
||||
bitmap_copy(map, cluster->cl_nodes_bitmap, O2NM_MAX_NODES);
|
||||
read_unlock(&cluster->cl_nodes_lock);
|
||||
|
||||
return 0;
|
||||
|
@ -990,14 +990,12 @@ static int o2net_tx_can_proceed(struct o2net_node *nn,
|
||||
}
|
||||
|
||||
/* Get a map of all nodes to which this node is currently connected to */
|
||||
void o2net_fill_node_map(unsigned long *map, unsigned bytes)
|
||||
void o2net_fill_node_map(unsigned long *map, unsigned int bits)
|
||||
{
|
||||
struct o2net_sock_container *sc;
|
||||
int node, ret;
|
||||
|
||||
BUG_ON(bytes < (BITS_TO_LONGS(O2NM_MAX_NODES) * sizeof(unsigned long)));
|
||||
|
||||
memset(map, 0, bytes);
|
||||
bitmap_zero(map, bits);
|
||||
for (node = 0; node < O2NM_MAX_NODES; ++node) {
|
||||
if (!o2net_tx_can_proceed(o2net_nn_from_num(node), &sc, &ret))
|
||||
continue;
|
||||
|
@ -1094,7 +1094,7 @@ static inline enum dlm_status dlm_err_to_dlm_status(int err)
|
||||
static inline void dlm_node_iter_init(unsigned long *map,
|
||||
struct dlm_node_iter *iter)
|
||||
{
|
||||
memcpy(iter->node_map, map, sizeof(iter->node_map));
|
||||
bitmap_copy(iter->node_map, map, O2NM_MAX_NODES);
|
||||
iter->curnode = -1;
|
||||
}
|
||||
|
||||
|
@ -1576,8 +1576,8 @@ static int dlm_should_restart_join(struct dlm_ctxt *dlm,
|
||||
spin_lock(&dlm->spinlock);
|
||||
/* For now, we restart the process if the node maps have
|
||||
* changed at all */
|
||||
ret = memcmp(ctxt->live_map, dlm->live_nodes_map,
|
||||
sizeof(dlm->live_nodes_map));
|
||||
ret = !bitmap_equal(ctxt->live_map, dlm->live_nodes_map,
|
||||
O2NM_MAX_NODES);
|
||||
spin_unlock(&dlm->spinlock);
|
||||
|
||||
if (ret)
|
||||
@ -1604,13 +1604,11 @@ static int dlm_try_to_join_domain(struct dlm_ctxt *dlm)
|
||||
/* group sem locking should work for us here -- we're already
|
||||
* registered for heartbeat events so filling this should be
|
||||
* atomic wrt getting those handlers called. */
|
||||
o2hb_fill_node_map(dlm->live_nodes_map, sizeof(dlm->live_nodes_map));
|
||||
o2hb_fill_node_map(dlm->live_nodes_map, O2NM_MAX_NODES);
|
||||
|
||||
spin_lock(&dlm->spinlock);
|
||||
memcpy(ctxt->live_map, dlm->live_nodes_map, sizeof(ctxt->live_map));
|
||||
|
||||
bitmap_copy(ctxt->live_map, dlm->live_nodes_map, O2NM_MAX_NODES);
|
||||
__dlm_set_joining_node(dlm, dlm->node_num);
|
||||
|
||||
spin_unlock(&dlm->spinlock);
|
||||
|
||||
node = -1;
|
||||
@ -1643,8 +1641,7 @@ static int dlm_try_to_join_domain(struct dlm_ctxt *dlm)
|
||||
* yes_resp_map. Copy that into our domain map and send a join
|
||||
* assert message to clean up everyone elses state. */
|
||||
spin_lock(&dlm->spinlock);
|
||||
memcpy(dlm->domain_map, ctxt->yes_resp_map,
|
||||
sizeof(ctxt->yes_resp_map));
|
||||
bitmap_copy(dlm->domain_map, ctxt->yes_resp_map, O2NM_MAX_NODES);
|
||||
set_bit(dlm->node_num, dlm->domain_map);
|
||||
spin_unlock(&dlm->spinlock);
|
||||
|
||||
@ -2009,9 +2006,9 @@ static struct dlm_ctxt *dlm_alloc_ctxt(const char *domain,
|
||||
mlog(0, "dlm->recovery_map=%p, &(dlm->recovery_map[0])=%p\n",
|
||||
dlm->recovery_map, &(dlm->recovery_map[0]));
|
||||
|
||||
memset(dlm->recovery_map, 0, sizeof(dlm->recovery_map));
|
||||
memset(dlm->live_nodes_map, 0, sizeof(dlm->live_nodes_map));
|
||||
memset(dlm->domain_map, 0, sizeof(dlm->domain_map));
|
||||
bitmap_zero(dlm->recovery_map, O2NM_MAX_NODES);
|
||||
bitmap_zero(dlm->live_nodes_map, O2NM_MAX_NODES);
|
||||
bitmap_zero(dlm->domain_map, O2NM_MAX_NODES);
|
||||
|
||||
dlm->dlm_thread_task = NULL;
|
||||
dlm->dlm_reco_thread_task = NULL;
|
||||
|
@ -258,12 +258,12 @@ static void dlm_init_mle(struct dlm_master_list_entry *mle,
|
||||
mle->type = type;
|
||||
INIT_HLIST_NODE(&mle->master_hash_node);
|
||||
INIT_LIST_HEAD(&mle->hb_events);
|
||||
memset(mle->maybe_map, 0, sizeof(mle->maybe_map));
|
||||
bitmap_zero(mle->maybe_map, O2NM_MAX_NODES);
|
||||
spin_lock_init(&mle->spinlock);
|
||||
init_waitqueue_head(&mle->wq);
|
||||
atomic_set(&mle->woken, 0);
|
||||
kref_init(&mle->mle_refs);
|
||||
memset(mle->response_map, 0, sizeof(mle->response_map));
|
||||
bitmap_zero(mle->response_map, O2NM_MAX_NODES);
|
||||
mle->master = O2NM_MAX_NODES;
|
||||
mle->new_master = O2NM_MAX_NODES;
|
||||
mle->inuse = 0;
|
||||
@ -290,8 +290,8 @@ static void dlm_init_mle(struct dlm_master_list_entry *mle,
|
||||
atomic_inc(&dlm->mle_cur_count[mle->type]);
|
||||
|
||||
/* copy off the node_map and register hb callbacks on our copy */
|
||||
memcpy(mle->node_map, dlm->domain_map, sizeof(mle->node_map));
|
||||
memcpy(mle->vote_map, dlm->domain_map, sizeof(mle->vote_map));
|
||||
bitmap_copy(mle->node_map, dlm->domain_map, O2NM_MAX_NODES);
|
||||
bitmap_copy(mle->vote_map, dlm->domain_map, O2NM_MAX_NODES);
|
||||
clear_bit(dlm->node_num, mle->vote_map);
|
||||
clear_bit(dlm->node_num, mle->node_map);
|
||||
|
||||
@ -572,7 +572,7 @@ static void dlm_init_lockres(struct dlm_ctxt *dlm,
|
||||
spin_unlock(&dlm->track_lock);
|
||||
|
||||
memset(res->lvb, 0, DLM_LVB_LEN);
|
||||
memset(res->refmap, 0, sizeof(res->refmap));
|
||||
bitmap_zero(res->refmap, O2NM_MAX_NODES);
|
||||
}
|
||||
|
||||
struct dlm_lock_resource *dlm_new_lockres(struct dlm_ctxt *dlm,
|
||||
@ -1036,10 +1036,10 @@ recheck:
|
||||
|
||||
spin_lock(&mle->spinlock);
|
||||
m = mle->master;
|
||||
map_changed = (memcmp(mle->vote_map, mle->node_map,
|
||||
sizeof(mle->vote_map)) != 0);
|
||||
voting_done = (memcmp(mle->vote_map, mle->response_map,
|
||||
sizeof(mle->vote_map)) == 0);
|
||||
map_changed = !bitmap_equal(mle->vote_map, mle->node_map,
|
||||
O2NM_MAX_NODES);
|
||||
voting_done = bitmap_equal(mle->vote_map, mle->response_map,
|
||||
O2NM_MAX_NODES);
|
||||
|
||||
/* restart if we hit any errors */
|
||||
if (map_changed) {
|
||||
@ -1277,11 +1277,11 @@ static int dlm_restart_lock_mastery(struct dlm_ctxt *dlm,
|
||||
|
||||
/* now blank out everything, as if we had never
|
||||
* contacted anyone */
|
||||
memset(mle->maybe_map, 0, sizeof(mle->maybe_map));
|
||||
memset(mle->response_map, 0, sizeof(mle->response_map));
|
||||
bitmap_zero(mle->maybe_map, O2NM_MAX_NODES);
|
||||
bitmap_zero(mle->response_map, O2NM_MAX_NODES);
|
||||
/* reset the vote_map to the current node_map */
|
||||
memcpy(mle->vote_map, mle->node_map,
|
||||
sizeof(mle->node_map));
|
||||
bitmap_copy(mle->vote_map, mle->node_map,
|
||||
O2NM_MAX_NODES);
|
||||
/* put myself into the maybe map */
|
||||
if (mle->type != DLM_MLE_BLOCK)
|
||||
set_bit(dlm->node_num, mle->maybe_map);
|
||||
@ -2094,7 +2094,7 @@ static void dlm_assert_master_worker(struct dlm_work_item *item, void *data)
|
||||
flags = item->u.am.flags;
|
||||
|
||||
spin_lock(&dlm->spinlock);
|
||||
memcpy(nodemap, dlm->domain_map, sizeof(nodemap));
|
||||
bitmap_copy(nodemap, dlm->domain_map, O2NM_MAX_NODES);
|
||||
spin_unlock(&dlm->spinlock);
|
||||
|
||||
clear_bit(dlm->node_num, nodemap);
|
||||
@ -3447,7 +3447,7 @@ int dlm_finish_migration(struct dlm_ctxt *dlm, struct dlm_lock_resource *res,
|
||||
ret = 0;
|
||||
}
|
||||
|
||||
memset(iter.node_map, 0, sizeof(iter.node_map));
|
||||
bitmap_zero(iter.node_map, O2NM_MAX_NODES);
|
||||
set_bit(old_master, iter.node_map);
|
||||
mlog(0, "doing assert master of %.*s back to %u\n",
|
||||
res->lockname.len, res->lockname.name, old_master);
|
||||
|
@ -733,7 +733,7 @@ static int dlm_init_recovery_area(struct dlm_ctxt *dlm, u8 dead_node)
|
||||
struct dlm_reco_node_data *ndata;
|
||||
|
||||
spin_lock(&dlm->spinlock);
|
||||
memcpy(dlm->reco.node_map, dlm->domain_map, sizeof(dlm->domain_map));
|
||||
bitmap_copy(dlm->reco.node_map, dlm->domain_map, O2NM_MAX_NODES);
|
||||
/* nodes can only be removed (by dying) after dropping
|
||||
* this lock, and death will be trapped later, so this should do */
|
||||
spin_unlock(&dlm->spinlock);
|
||||
|
@ -157,7 +157,7 @@ static void ocfs2_queue_replay_slots(struct ocfs2_super *osb,
|
||||
replay_map->rm_state = REPLAY_DONE;
|
||||
}
|
||||
|
||||
static void ocfs2_free_replay_slots(struct ocfs2_super *osb)
|
||||
void ocfs2_free_replay_slots(struct ocfs2_super *osb)
|
||||
{
|
||||
struct ocfs2_replay_map *replay_map = osb->replay_map;
|
||||
|
||||
|
@ -150,6 +150,7 @@ int ocfs2_recovery_init(struct ocfs2_super *osb);
|
||||
void ocfs2_recovery_exit(struct ocfs2_super *osb);
|
||||
|
||||
int ocfs2_compute_replay_slots(struct ocfs2_super *osb);
|
||||
void ocfs2_free_replay_slots(struct ocfs2_super *osb);
|
||||
/*
|
||||
* Journal Control:
|
||||
* Initialize, Load, Shutdown, Wipe a journal.
|
||||
|
@ -560,8 +560,7 @@ static inline unsigned int ocfs2_read_links_count(struct ocfs2_dinode *di)
|
||||
u32 nlink = le16_to_cpu(di->i_links_count);
|
||||
u32 hi = le16_to_cpu(di->i_links_count_hi);
|
||||
|
||||
if (di->i_dyn_features & cpu_to_le16(OCFS2_INDEXED_DIR_FL))
|
||||
nlink |= (hi << OCFS2_LINKS_HI_SHIFT);
|
||||
nlink |= (hi << OCFS2_LINKS_HI_SHIFT);
|
||||
|
||||
return nlink;
|
||||
}
|
||||
|
@ -273,17 +273,17 @@ static int o2cb_cluster_check(void)
|
||||
*/
|
||||
#define O2CB_MAP_STABILIZE_COUNT 60
|
||||
for (i = 0; i < O2CB_MAP_STABILIZE_COUNT; ++i) {
|
||||
o2hb_fill_node_map(hbmap, sizeof(hbmap));
|
||||
o2hb_fill_node_map(hbmap, O2NM_MAX_NODES);
|
||||
if (!test_bit(node_num, hbmap)) {
|
||||
printk(KERN_ERR "o2cb: %s heartbeat has not been "
|
||||
"started.\n", (o2hb_global_heartbeat_active() ?
|
||||
"Global" : "Local"));
|
||||
return -EINVAL;
|
||||
}
|
||||
o2net_fill_node_map(netmap, sizeof(netmap));
|
||||
o2net_fill_node_map(netmap, O2NM_MAX_NODES);
|
||||
/* Force set the current node to allow easy compare */
|
||||
set_bit(node_num, netmap);
|
||||
if (!memcmp(hbmap, netmap, sizeof(hbmap)))
|
||||
if (bitmap_equal(hbmap, netmap, O2NM_MAX_NODES))
|
||||
return 0;
|
||||
if (i < O2CB_MAP_STABILIZE_COUNT - 1)
|
||||
msleep(1000);
|
||||
|
@ -669,6 +669,8 @@ static struct ctl_table_header *ocfs2_table_header;
|
||||
|
||||
static int __init ocfs2_stack_glue_init(void)
|
||||
{
|
||||
int ret;
|
||||
|
||||
strcpy(cluster_stack_name, OCFS2_STACK_PLUGIN_O2CB);
|
||||
|
||||
ocfs2_table_header = register_sysctl("fs/ocfs2/nm", ocfs2_nm_table);
|
||||
@ -678,7 +680,11 @@ static int __init ocfs2_stack_glue_init(void)
|
||||
return -ENOMEM; /* or something. */
|
||||
}
|
||||
|
||||
return ocfs2_sysfs_init();
|
||||
ret = ocfs2_sysfs_init();
|
||||
if (ret)
|
||||
unregister_sysctl_table(ocfs2_table_header);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void __exit ocfs2_stack_glue_exit(void)
|
||||
|
@ -1159,6 +1159,7 @@ static int ocfs2_fill_super(struct super_block *sb, void *data, int silent)
|
||||
out_dismount:
|
||||
atomic_set(&osb->vol_state, VOLUME_DISABLED);
|
||||
wake_up(&osb->osb_mount_event);
|
||||
ocfs2_free_replay_slots(osb);
|
||||
ocfs2_dismount_volume(sb, 1);
|
||||
goto out;
|
||||
|
||||
@ -1822,12 +1823,14 @@ static int ocfs2_mount_volume(struct super_block *sb)
|
||||
status = ocfs2_truncate_log_init(osb);
|
||||
if (status < 0) {
|
||||
mlog_errno(status);
|
||||
goto out_system_inodes;
|
||||
goto out_check_volume;
|
||||
}
|
||||
|
||||
ocfs2_super_unlock(osb, 1);
|
||||
return 0;
|
||||
|
||||
out_check_volume:
|
||||
ocfs2_free_replay_slots(osb);
|
||||
out_system_inodes:
|
||||
if (osb->local_alloc_state == OCFS2_LA_ENABLED)
|
||||
ocfs2_shutdown_local_alloc(osb);
|
||||
|
@ -3,6 +3,7 @@
|
||||
#include <linux/init.h>
|
||||
#include <linux/proc_fs.h>
|
||||
#include <linux/seq_file.h>
|
||||
#include "internal.h"
|
||||
|
||||
static int cmdline_proc_show(struct seq_file *m, void *v)
|
||||
{
|
||||
@ -13,7 +14,10 @@ static int cmdline_proc_show(struct seq_file *m, void *v)
|
||||
|
||||
static int __init proc_cmdline_init(void)
|
||||
{
|
||||
proc_create_single("cmdline", 0, NULL, cmdline_proc_show);
|
||||
struct proc_dir_entry *pde;
|
||||
|
||||
pde = proc_create_single("cmdline", 0, NULL, cmdline_proc_show);
|
||||
pde->size = saved_command_line_len + 1;
|
||||
return 0;
|
||||
}
|
||||
fs_initcall(proc_cmdline_init);
|
||||
|
45
fs/proc/fd.c
45
fs/proc/fd.c
@ -7,6 +7,7 @@
|
||||
#include <linux/namei.h>
|
||||
#include <linux/pid.h>
|
||||
#include <linux/ptrace.h>
|
||||
#include <linux/bitmap.h>
|
||||
#include <linux/security.h>
|
||||
#include <linux/file.h>
|
||||
#include <linux/seq_file.h>
|
||||
@ -279,6 +280,30 @@ out:
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int proc_readfd_count(struct inode *inode, loff_t *count)
|
||||
{
|
||||
struct task_struct *p = get_proc_task(inode);
|
||||
struct fdtable *fdt;
|
||||
|
||||
if (!p)
|
||||
return -ENOENT;
|
||||
|
||||
task_lock(p);
|
||||
if (p->files) {
|
||||
rcu_read_lock();
|
||||
|
||||
fdt = files_fdtable(p->files);
|
||||
*count = bitmap_weight(fdt->open_fds, fdt->max_fds);
|
||||
|
||||
rcu_read_unlock();
|
||||
}
|
||||
task_unlock(p);
|
||||
|
||||
put_task_struct(p);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int proc_readfd(struct file *file, struct dir_context *ctx)
|
||||
{
|
||||
return proc_readfd_common(file, ctx, proc_fd_instantiate);
|
||||
@ -319,9 +344,29 @@ int proc_fd_permission(struct user_namespace *mnt_userns,
|
||||
return rv;
|
||||
}
|
||||
|
||||
static int proc_fd_getattr(struct user_namespace *mnt_userns,
|
||||
const struct path *path, struct kstat *stat,
|
||||
u32 request_mask, unsigned int query_flags)
|
||||
{
|
||||
struct inode *inode = d_inode(path->dentry);
|
||||
int rv = 0;
|
||||
|
||||
generic_fillattr(&init_user_ns, inode, stat);
|
||||
|
||||
/* If it's a directory, put the number of open fds there */
|
||||
if (S_ISDIR(inode->i_mode)) {
|
||||
rv = proc_readfd_count(inode, &stat->size);
|
||||
if (rv < 0)
|
||||
return rv;
|
||||
}
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
const struct inode_operations proc_fd_inode_operations = {
|
||||
.lookup = proc_lookupfd,
|
||||
.permission = proc_fd_permission,
|
||||
.getattr = proc_fd_getattr,
|
||||
.setattr = proc_setattr,
|
||||
};
|
||||
|
||||
|
@ -1567,6 +1567,7 @@ static int __init vmcore_init(void)
|
||||
return rc;
|
||||
rc = parse_crash_elf_headers();
|
||||
if (rc) {
|
||||
elfcorehdr_free(elfcorehdr_addr);
|
||||
pr_warn("Kdump: vmcore not initialized\n");
|
||||
return rc;
|
||||
}
|
||||
|
@ -54,9 +54,35 @@ config SQUASHFS_FILE_DIRECT
|
||||
|
||||
endchoice
|
||||
|
||||
choice
|
||||
prompt "Decompressor parallelisation options"
|
||||
config SQUASHFS_DECOMP_SINGLE
|
||||
depends on SQUASHFS
|
||||
def_bool n
|
||||
|
||||
config SQUASHFS_DECOMP_MULTI
|
||||
depends on SQUASHFS
|
||||
def_bool n
|
||||
|
||||
config SQUASHFS_DECOMP_MULTI_PERCPU
|
||||
depends on SQUASHFS
|
||||
def_bool n
|
||||
|
||||
config SQUASHFS_CHOICE_DECOMP_BY_MOUNT
|
||||
bool "Select the parallel decompression mode during mount"
|
||||
depends on SQUASHFS
|
||||
default n
|
||||
select SQUASHFS_DECOMP_SINGLE
|
||||
select SQUASHFS_DECOMP_MULTI
|
||||
select SQUASHFS_DECOMP_MULTI_PERCPU
|
||||
select SQUASHFS_MOUNT_DECOMP_THREADS
|
||||
help
|
||||
Compile all parallel decompression modes and specify the
|
||||
decompression mode by setting "threads=" during mount.
|
||||
default Decompressor parallelisation is SQUASHFS_DECOMP_SINGLE
|
||||
|
||||
choice
|
||||
prompt "Select decompression parallel mode at compile time"
|
||||
depends on SQUASHFS
|
||||
depends on !SQUASHFS_CHOICE_DECOMP_BY_MOUNT
|
||||
help
|
||||
Squashfs now supports three parallelisation options for
|
||||
decompression. Each one exhibits various trade-offs between
|
||||
@ -64,15 +90,17 @@ choice
|
||||
|
||||
If in doubt, select "Single threaded compression"
|
||||
|
||||
config SQUASHFS_DECOMP_SINGLE
|
||||
config SQUASHFS_COMPILE_DECOMP_SINGLE
|
||||
bool "Single threaded compression"
|
||||
select SQUASHFS_DECOMP_SINGLE
|
||||
help
|
||||
Traditionally Squashfs has used single-threaded decompression.
|
||||
Only one block (data or metadata) can be decompressed at any
|
||||
one time. This limits CPU and memory usage to a minimum.
|
||||
|
||||
config SQUASHFS_DECOMP_MULTI
|
||||
config SQUASHFS_COMPILE_DECOMP_MULTI
|
||||
bool "Use multiple decompressors for parallel I/O"
|
||||
select SQUASHFS_DECOMP_MULTI
|
||||
help
|
||||
By default Squashfs uses a single decompressor but it gives
|
||||
poor performance on parallel I/O workloads when using multiple CPU
|
||||
@ -85,8 +113,9 @@ config SQUASHFS_DECOMP_MULTI
|
||||
decompressors per core. It dynamically allocates decompressors
|
||||
on a demand basis.
|
||||
|
||||
config SQUASHFS_DECOMP_MULTI_PERCPU
|
||||
config SQUASHFS_COMPILE_DECOMP_MULTI_PERCPU
|
||||
bool "Use percpu multiple decompressors for parallel I/O"
|
||||
select SQUASHFS_DECOMP_MULTI_PERCPU
|
||||
help
|
||||
By default Squashfs uses a single decompressor but it gives
|
||||
poor performance on parallel I/O workloads when using multiple CPU
|
||||
@ -95,9 +124,21 @@ config SQUASHFS_DECOMP_MULTI_PERCPU
|
||||
This decompressor implementation uses a maximum of one
|
||||
decompressor per core. It uses percpu variables to ensure
|
||||
decompression is load-balanced across the cores.
|
||||
|
||||
endchoice
|
||||
|
||||
config SQUASHFS_MOUNT_DECOMP_THREADS
|
||||
bool "Add the mount parameter 'threads=' for squashfs"
|
||||
depends on SQUASHFS
|
||||
depends on SQUASHFS_DECOMP_MULTI
|
||||
default n
|
||||
help
|
||||
Use threads= to set the decompression parallel mode and the number of threads.
|
||||
If SQUASHFS_CHOICE_DECOMP_BY_MOUNT=y
|
||||
threads=<single|multi|percpu|1|2|3|...>
|
||||
else
|
||||
threads=<2|3|...>
|
||||
The upper limit is num_online_cpus() * 2.
|
||||
|
||||
config SQUASHFS_XATTR
|
||||
bool "Squashfs XATTR support"
|
||||
depends on SQUASHFS
|
||||
|
@ -216,7 +216,7 @@ int squashfs_read_data(struct super_block *sb, u64 index, int length,
|
||||
res = -EIO;
|
||||
goto out_free_bio;
|
||||
}
|
||||
res = squashfs_decompress(msblk, bio, offset, length, output);
|
||||
res = msblk->thread_ops->decompress(msblk, bio, offset, length, output);
|
||||
} else {
|
||||
res = copy_bio_to_actor(bio, output, offset, length);
|
||||
}
|
||||
|
@ -134,7 +134,7 @@ void *squashfs_decompressor_setup(struct super_block *sb, unsigned short flags)
|
||||
if (IS_ERR(comp_opts))
|
||||
return comp_opts;
|
||||
|
||||
stream = squashfs_decompressor_create(msblk, comp_opts);
|
||||
stream = msblk->thread_ops->create(msblk, comp_opts);
|
||||
if (IS_ERR(stream))
|
||||
kfree(comp_opts);
|
||||
|
||||
|
@ -29,12 +29,11 @@
|
||||
#define MAX_DECOMPRESSOR (num_online_cpus() * 2)
|
||||
|
||||
|
||||
int squashfs_max_decompressors(void)
|
||||
static int squashfs_max_decompressors(void)
|
||||
{
|
||||
return MAX_DECOMPRESSOR;
|
||||
}
|
||||
|
||||
|
||||
struct squashfs_stream {
|
||||
void *comp_opts;
|
||||
struct list_head strm_list;
|
||||
@ -59,7 +58,7 @@ static void put_decomp_stream(struct decomp_stream *decomp_strm,
|
||||
wake_up(&stream->wait);
|
||||
}
|
||||
|
||||
void *squashfs_decompressor_create(struct squashfs_sb_info *msblk,
|
||||
static void *squashfs_decompressor_create(struct squashfs_sb_info *msblk,
|
||||
void *comp_opts)
|
||||
{
|
||||
struct squashfs_stream *stream;
|
||||
@ -103,7 +102,7 @@ out:
|
||||
}
|
||||
|
||||
|
||||
void squashfs_decompressor_destroy(struct squashfs_sb_info *msblk)
|
||||
static void squashfs_decompressor_destroy(struct squashfs_sb_info *msblk)
|
||||
{
|
||||
struct squashfs_stream *stream = msblk->stream;
|
||||
if (stream) {
|
||||
@ -145,7 +144,7 @@ static struct decomp_stream *get_decomp_stream(struct squashfs_sb_info *msblk,
|
||||
* If there is no available decomp and already full,
|
||||
* let's wait for releasing decomp from other users.
|
||||
*/
|
||||
if (stream->avail_decomp >= MAX_DECOMPRESSOR)
|
||||
if (stream->avail_decomp >= msblk->max_thread_num)
|
||||
goto wait;
|
||||
|
||||
/* Let's allocate new decomp */
|
||||
@ -161,7 +160,7 @@ static struct decomp_stream *get_decomp_stream(struct squashfs_sb_info *msblk,
|
||||
}
|
||||
|
||||
stream->avail_decomp++;
|
||||
WARN_ON(stream->avail_decomp > MAX_DECOMPRESSOR);
|
||||
WARN_ON(stream->avail_decomp > msblk->max_thread_num);
|
||||
|
||||
mutex_unlock(&stream->mutex);
|
||||
break;
|
||||
@ -180,7 +179,7 @@ wait:
|
||||
}
|
||||
|
||||
|
||||
int squashfs_decompress(struct squashfs_sb_info *msblk, struct bio *bio,
|
||||
static int squashfs_decompress(struct squashfs_sb_info *msblk, struct bio *bio,
|
||||
int offset, int length,
|
||||
struct squashfs_page_actor *output)
|
||||
{
|
||||
@ -195,3 +194,10 @@ int squashfs_decompress(struct squashfs_sb_info *msblk, struct bio *bio,
|
||||
msblk->decompressor->name);
|
||||
return res;
|
||||
}
|
||||
|
||||
const struct squashfs_decompressor_thread_ops squashfs_decompressor_multi = {
|
||||
.create = squashfs_decompressor_create,
|
||||
.destroy = squashfs_decompressor_destroy,
|
||||
.decompress = squashfs_decompress,
|
||||
.max_decompressors = squashfs_max_decompressors,
|
||||
};
|
||||
|
@ -25,7 +25,7 @@ struct squashfs_stream {
|
||||
local_lock_t lock;
|
||||
};
|
||||
|
||||
void *squashfs_decompressor_create(struct squashfs_sb_info *msblk,
|
||||
static void *squashfs_decompressor_create(struct squashfs_sb_info *msblk,
|
||||
void *comp_opts)
|
||||
{
|
||||
struct squashfs_stream *stream;
|
||||
@ -59,7 +59,7 @@ out:
|
||||
return ERR_PTR(err);
|
||||
}
|
||||
|
||||
void squashfs_decompressor_destroy(struct squashfs_sb_info *msblk)
|
||||
static void squashfs_decompressor_destroy(struct squashfs_sb_info *msblk)
|
||||
{
|
||||
struct squashfs_stream __percpu *percpu =
|
||||
(struct squashfs_stream __percpu *) msblk->stream;
|
||||
@ -75,19 +75,21 @@ void squashfs_decompressor_destroy(struct squashfs_sb_info *msblk)
|
||||
}
|
||||
}
|
||||
|
||||
int squashfs_decompress(struct squashfs_sb_info *msblk, struct bio *bio,
|
||||
static int squashfs_decompress(struct squashfs_sb_info *msblk, struct bio *bio,
|
||||
int offset, int length, struct squashfs_page_actor *output)
|
||||
{
|
||||
struct squashfs_stream *stream;
|
||||
struct squashfs_stream __percpu *percpu =
|
||||
(struct squashfs_stream __percpu *) msblk->stream;
|
||||
int res;
|
||||
|
||||
local_lock(&msblk->stream->lock);
|
||||
stream = this_cpu_ptr(msblk->stream);
|
||||
local_lock(&percpu->lock);
|
||||
stream = this_cpu_ptr(percpu);
|
||||
|
||||
res = msblk->decompressor->decompress(msblk, stream->stream, bio,
|
||||
offset, length, output);
|
||||
|
||||
local_unlock(&msblk->stream->lock);
|
||||
local_unlock(&percpu->lock);
|
||||
|
||||
if (res < 0)
|
||||
ERROR("%s decompression failed, data probably corrupt\n",
|
||||
@ -96,7 +98,14 @@ int squashfs_decompress(struct squashfs_sb_info *msblk, struct bio *bio,
|
||||
return res;
|
||||
}
|
||||
|
||||
int squashfs_max_decompressors(void)
|
||||
static int squashfs_max_decompressors(void)
|
||||
{
|
||||
return num_possible_cpus();
|
||||
}
|
||||
|
||||
const struct squashfs_decompressor_thread_ops squashfs_decompressor_percpu = {
|
||||
.create = squashfs_decompressor_create,
|
||||
.destroy = squashfs_decompressor_destroy,
|
||||
.decompress = squashfs_decompress,
|
||||
.max_decompressors = squashfs_max_decompressors,
|
||||
};
|
||||
|
@ -24,7 +24,7 @@ struct squashfs_stream {
|
||||
struct mutex mutex;
|
||||
};
|
||||
|
||||
void *squashfs_decompressor_create(struct squashfs_sb_info *msblk,
|
||||
static void *squashfs_decompressor_create(struct squashfs_sb_info *msblk,
|
||||
void *comp_opts)
|
||||
{
|
||||
struct squashfs_stream *stream;
|
||||
@ -49,7 +49,7 @@ out:
|
||||
return ERR_PTR(err);
|
||||
}
|
||||
|
||||
void squashfs_decompressor_destroy(struct squashfs_sb_info *msblk)
|
||||
static void squashfs_decompressor_destroy(struct squashfs_sb_info *msblk)
|
||||
{
|
||||
struct squashfs_stream *stream = msblk->stream;
|
||||
|
||||
@ -59,7 +59,7 @@ void squashfs_decompressor_destroy(struct squashfs_sb_info *msblk)
|
||||
}
|
||||
}
|
||||
|
||||
int squashfs_decompress(struct squashfs_sb_info *msblk, struct bio *bio,
|
||||
static int squashfs_decompress(struct squashfs_sb_info *msblk, struct bio *bio,
|
||||
int offset, int length,
|
||||
struct squashfs_page_actor *output)
|
||||
{
|
||||
@ -78,7 +78,14 @@ int squashfs_decompress(struct squashfs_sb_info *msblk, struct bio *bio,
|
||||
return res;
|
||||
}
|
||||
|
||||
int squashfs_max_decompressors(void)
|
||||
static int squashfs_max_decompressors(void)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
const struct squashfs_decompressor_thread_ops squashfs_decompressor_single = {
|
||||
.create = squashfs_decompressor_create,
|
||||
.destroy = squashfs_decompressor_destroy,
|
||||
.decompress = squashfs_decompress,
|
||||
.max_decompressors = squashfs_max_decompressors,
|
||||
};
|
||||
|
@ -38,11 +38,24 @@ extern const struct squashfs_decompressor *squashfs_lookup_decompressor(int);
|
||||
extern void *squashfs_decompressor_setup(struct super_block *, unsigned short);
|
||||
|
||||
/* decompressor_xxx.c */
|
||||
extern void *squashfs_decompressor_create(struct squashfs_sb_info *, void *);
|
||||
extern void squashfs_decompressor_destroy(struct squashfs_sb_info *);
|
||||
extern int squashfs_decompress(struct squashfs_sb_info *, struct bio *,
|
||||
int, int, struct squashfs_page_actor *);
|
||||
extern int squashfs_max_decompressors(void);
|
||||
|
||||
struct squashfs_decompressor_thread_ops {
|
||||
void * (*create)(struct squashfs_sb_info *msblk, void *comp_opts);
|
||||
void (*destroy)(struct squashfs_sb_info *msblk);
|
||||
int (*decompress)(struct squashfs_sb_info *msblk, struct bio *bio,
|
||||
int offset, int length, struct squashfs_page_actor *output);
|
||||
int (*max_decompressors)(void);
|
||||
};
|
||||
|
||||
#ifdef CONFIG_SQUASHFS_DECOMP_SINGLE
|
||||
extern const struct squashfs_decompressor_thread_ops squashfs_decompressor_single;
|
||||
#endif
|
||||
#ifdef CONFIG_SQUASHFS_DECOMP_MULTI
|
||||
extern const struct squashfs_decompressor_thread_ops squashfs_decompressor_multi;
|
||||
#endif
|
||||
#ifdef CONFIG_SQUASHFS_DECOMP_MULTI_PERCPU
|
||||
extern const struct squashfs_decompressor_thread_ops squashfs_decompressor_percpu;
|
||||
#endif
|
||||
|
||||
/* export.c */
|
||||
extern __le64 *squashfs_read_inode_lookup_table(struct super_block *, u64, u64,
|
||||
|
@ -53,7 +53,7 @@ struct squashfs_sb_info {
|
||||
__le64 *xattr_id_table;
|
||||
struct mutex meta_index_mutex;
|
||||
struct meta_index *meta_index;
|
||||
struct squashfs_stream *stream;
|
||||
void *stream;
|
||||
__le64 *inode_lookup_table;
|
||||
u64 inode_table;
|
||||
u64 directory_table;
|
||||
@ -66,5 +66,7 @@ struct squashfs_sb_info {
|
||||
int xattr_ids;
|
||||
unsigned int ids;
|
||||
bool panic_on_errors;
|
||||
const struct squashfs_decompressor_thread_ops *thread_ops;
|
||||
int max_thread_num;
|
||||
};
|
||||
#endif
|
||||
|
@ -47,10 +47,13 @@ enum Opt_errors {
|
||||
|
||||
enum squashfs_param {
|
||||
Opt_errors,
|
||||
Opt_threads,
|
||||
};
|
||||
|
||||
struct squashfs_mount_opts {
|
||||
enum Opt_errors errors;
|
||||
const struct squashfs_decompressor_thread_ops *thread_ops;
|
||||
int thread_num;
|
||||
};
|
||||
|
||||
static const struct constant_table squashfs_param_errors[] = {
|
||||
@ -61,9 +64,66 @@ static const struct constant_table squashfs_param_errors[] = {
|
||||
|
||||
static const struct fs_parameter_spec squashfs_fs_parameters[] = {
|
||||
fsparam_enum("errors", Opt_errors, squashfs_param_errors),
|
||||
fsparam_string("threads", Opt_threads),
|
||||
{}
|
||||
};
|
||||
|
||||
|
||||
static int squashfs_parse_param_threads_str(const char *str, struct squashfs_mount_opts *opts)
|
||||
{
|
||||
#ifdef CONFIG_SQUASHFS_CHOICE_DECOMP_BY_MOUNT
|
||||
if (strcmp(str, "single") == 0) {
|
||||
opts->thread_ops = &squashfs_decompressor_single;
|
||||
return 0;
|
||||
}
|
||||
if (strcmp(str, "multi") == 0) {
|
||||
opts->thread_ops = &squashfs_decompressor_multi;
|
||||
return 0;
|
||||
}
|
||||
if (strcmp(str, "percpu") == 0) {
|
||||
opts->thread_ops = &squashfs_decompressor_percpu;
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
static int squashfs_parse_param_threads_num(const char *str, struct squashfs_mount_opts *opts)
|
||||
{
|
||||
#ifdef CONFIG_SQUASHFS_MOUNT_DECOMP_THREADS
|
||||
int ret;
|
||||
unsigned long num;
|
||||
|
||||
ret = kstrtoul(str, 0, &num);
|
||||
if (ret != 0)
|
||||
return -EINVAL;
|
||||
if (num > 1) {
|
||||
opts->thread_ops = &squashfs_decompressor_multi;
|
||||
if (num > opts->thread_ops->max_decompressors())
|
||||
return -EINVAL;
|
||||
opts->thread_num = (int)num;
|
||||
return 0;
|
||||
}
|
||||
#ifdef CONFIG_SQUASHFS_DECOMP_SINGLE
|
||||
if (num == 1) {
|
||||
opts->thread_ops = &squashfs_decompressor_single;
|
||||
opts->thread_num = 1;
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
#endif /* !CONFIG_SQUASHFS_MOUNT_DECOMP_THREADS */
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
static int squashfs_parse_param_threads(const char *str, struct squashfs_mount_opts *opts)
|
||||
{
|
||||
int ret = squashfs_parse_param_threads_str(str, opts);
|
||||
|
||||
if (ret == 0)
|
||||
return ret;
|
||||
return squashfs_parse_param_threads_num(str, opts);
|
||||
}
|
||||
|
||||
static int squashfs_parse_param(struct fs_context *fc, struct fs_parameter *param)
|
||||
{
|
||||
struct squashfs_mount_opts *opts = fc->fs_private;
|
||||
@ -78,6 +138,10 @@ static int squashfs_parse_param(struct fs_context *fc, struct fs_parameter *para
|
||||
case Opt_errors:
|
||||
opts->errors = result.uint_32;
|
||||
break;
|
||||
case Opt_threads:
|
||||
if (squashfs_parse_param_threads(param->string, opts) != 0)
|
||||
return -EINVAL;
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
@ -133,6 +197,7 @@ static int squashfs_fill_super(struct super_block *sb, struct fs_context *fc)
|
||||
return -ENOMEM;
|
||||
}
|
||||
msblk = sb->s_fs_info;
|
||||
msblk->thread_ops = opts->thread_ops;
|
||||
|
||||
msblk->panic_on_errors = (opts->errors == Opt_errors_panic);
|
||||
|
||||
@ -168,6 +233,12 @@ static int squashfs_fill_super(struct super_block *sb, struct fs_context *fc)
|
||||
goto failed_mount;
|
||||
}
|
||||
|
||||
if (opts->thread_num == 0) {
|
||||
msblk->max_thread_num = msblk->thread_ops->max_decompressors();
|
||||
} else {
|
||||
msblk->max_thread_num = opts->thread_num;
|
||||
}
|
||||
|
||||
/* Check the MAJOR & MINOR versions and lookup compression type */
|
||||
msblk->decompressor = supported_squashfs_filesystem(
|
||||
fc,
|
||||
@ -252,7 +323,7 @@ static int squashfs_fill_super(struct super_block *sb, struct fs_context *fc)
|
||||
|
||||
/* Allocate read_page block */
|
||||
msblk->read_page = squashfs_cache_init("data",
|
||||
squashfs_max_decompressors(), msblk->block_size);
|
||||
msblk->max_thread_num, msblk->block_size);
|
||||
if (msblk->read_page == NULL) {
|
||||
errorf(fc, "Failed to allocate read_page block");
|
||||
goto failed_mount;
|
||||
@ -383,7 +454,7 @@ failed_mount:
|
||||
squashfs_cache_delete(msblk->block_cache);
|
||||
squashfs_cache_delete(msblk->fragment_cache);
|
||||
squashfs_cache_delete(msblk->read_page);
|
||||
squashfs_decompressor_destroy(msblk);
|
||||
msblk->thread_ops->destroy(msblk);
|
||||
kfree(msblk->inode_lookup_table);
|
||||
kfree(msblk->fragment_index);
|
||||
kfree(msblk->id_table);
|
||||
@ -435,6 +506,19 @@ static int squashfs_show_options(struct seq_file *s, struct dentry *root)
|
||||
else
|
||||
seq_puts(s, ",errors=continue");
|
||||
|
||||
#ifdef CONFIG_SQUASHFS_CHOICE_DECOMP_BY_MOUNT
|
||||
if (msblk->thread_ops == &squashfs_decompressor_single) {
|
||||
seq_puts(s, ",threads=single");
|
||||
return 0;
|
||||
}
|
||||
if (msblk->thread_ops == &squashfs_decompressor_percpu) {
|
||||
seq_puts(s, ",threads=percpu");
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
#ifdef CONFIG_SQUASHFS_MOUNT_DECOMP_THREADS
|
||||
seq_printf(s, ",threads=%d", msblk->max_thread_num);
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -446,6 +530,16 @@ static int squashfs_init_fs_context(struct fs_context *fc)
|
||||
if (!opts)
|
||||
return -ENOMEM;
|
||||
|
||||
#ifdef CONFIG_SQUASHFS_DECOMP_SINGLE
|
||||
opts->thread_ops = &squashfs_decompressor_single;
|
||||
#elif defined(CONFIG_SQUASHFS_DECOMP_MULTI)
|
||||
opts->thread_ops = &squashfs_decompressor_multi;
|
||||
#elif defined(CONFIG_SQUASHFS_DECOMP_MULTI_PERCPU)
|
||||
opts->thread_ops = &squashfs_decompressor_percpu;
|
||||
#else
|
||||
#error "fail: unknown squashfs decompression thread mode?"
|
||||
#endif
|
||||
opts->thread_num = 0;
|
||||
fc->fs_private = opts;
|
||||
fc->ops = &squashfs_context_ops;
|
||||
return 0;
|
||||
@ -478,7 +572,7 @@ static void squashfs_put_super(struct super_block *sb)
|
||||
squashfs_cache_delete(sbi->block_cache);
|
||||
squashfs_cache_delete(sbi->fragment_cache);
|
||||
squashfs_cache_delete(sbi->read_page);
|
||||
squashfs_decompressor_destroy(sbi);
|
||||
sbi->thread_ops->destroy(sbi);
|
||||
kfree(sbi->id_table);
|
||||
kfree(sbi->fragment_index);
|
||||
kfree(sbi->meta_index);
|
||||
|
@ -22,6 +22,7 @@ struct coredump_params {
|
||||
struct file *file;
|
||||
unsigned long limit;
|
||||
unsigned long mm_flags;
|
||||
int cpu;
|
||||
loff_t written;
|
||||
loff_t pos;
|
||||
loff_t to_skip;
|
||||
|
@ -45,7 +45,7 @@ struct debugfs_u32_array {
|
||||
|
||||
extern struct dentry *arch_debugfs_dir;
|
||||
|
||||
#define DEFINE_DEBUGFS_ATTRIBUTE(__fops, __get, __set, __fmt) \
|
||||
#define DEFINE_DEBUGFS_ATTRIBUTE_XSIGNED(__fops, __get, __set, __fmt, __is_signed) \
|
||||
static int __fops ## _open(struct inode *inode, struct file *file) \
|
||||
{ \
|
||||
__simple_attr_check_format(__fmt, 0ull); \
|
||||
@ -56,10 +56,16 @@ static const struct file_operations __fops = { \
|
||||
.open = __fops ## _open, \
|
||||
.release = simple_attr_release, \
|
||||
.read = debugfs_attr_read, \
|
||||
.write = debugfs_attr_write, \
|
||||
.write = (__is_signed) ? debugfs_attr_write_signed : debugfs_attr_write, \
|
||||
.llseek = no_llseek, \
|
||||
}
|
||||
|
||||
#define DEFINE_DEBUGFS_ATTRIBUTE(__fops, __get, __set, __fmt) \
|
||||
DEFINE_DEBUGFS_ATTRIBUTE_XSIGNED(__fops, __get, __set, __fmt, false)
|
||||
|
||||
#define DEFINE_DEBUGFS_ATTRIBUTE_SIGNED(__fops, __get, __set, __fmt) \
|
||||
DEFINE_DEBUGFS_ATTRIBUTE_XSIGNED(__fops, __get, __set, __fmt, true)
|
||||
|
||||
typedef struct vfsmount *(*debugfs_automount_t)(struct dentry *, void *);
|
||||
|
||||
#if defined(CONFIG_DEBUG_FS)
|
||||
@ -102,6 +108,8 @@ ssize_t debugfs_attr_read(struct file *file, char __user *buf,
|
||||
size_t len, loff_t *ppos);
|
||||
ssize_t debugfs_attr_write(struct file *file, const char __user *buf,
|
||||
size_t len, loff_t *ppos);
|
||||
ssize_t debugfs_attr_write_signed(struct file *file, const char __user *buf,
|
||||
size_t len, loff_t *ppos);
|
||||
|
||||
struct dentry *debugfs_rename(struct dentry *old_dir, struct dentry *old_dentry,
|
||||
struct dentry *new_dir, const char *new_name);
|
||||
@ -254,6 +262,13 @@ static inline ssize_t debugfs_attr_write(struct file *file,
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
static inline ssize_t debugfs_attr_write_signed(struct file *file,
|
||||
const char __user *buf,
|
||||
size_t len, loff_t *ppos)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
static inline struct dentry *debugfs_rename(struct dentry *old_dir, struct dentry *old_dentry,
|
||||
struct dentry *new_dir, char *new_name)
|
||||
{
|
||||
|
@ -61,7 +61,7 @@ static inline struct eventfd_ctx *eventfd_ctx_fdget(int fd)
|
||||
return ERR_PTR(-ENOSYS);
|
||||
}
|
||||
|
||||
static inline int eventfd_signal(struct eventfd_ctx *ctx, int n)
|
||||
static inline int eventfd_signal(struct eventfd_ctx *ctx, __u64 n)
|
||||
{
|
||||
return -ENOSYS;
|
||||
}
|
||||
|
@ -3513,7 +3513,7 @@ void simple_transaction_set(struct file *file, size_t n);
|
||||
* All attributes contain a text representation of a numeric value
|
||||
* that are accessed with the get() and set() functions.
|
||||
*/
|
||||
#define DEFINE_SIMPLE_ATTRIBUTE(__fops, __get, __set, __fmt) \
|
||||
#define DEFINE_SIMPLE_ATTRIBUTE_XSIGNED(__fops, __get, __set, __fmt, __is_signed) \
|
||||
static int __fops ## _open(struct inode *inode, struct file *file) \
|
||||
{ \
|
||||
__simple_attr_check_format(__fmt, 0ull); \
|
||||
@ -3524,10 +3524,16 @@ static const struct file_operations __fops = { \
|
||||
.open = __fops ## _open, \
|
||||
.release = simple_attr_release, \
|
||||
.read = simple_attr_read, \
|
||||
.write = simple_attr_write, \
|
||||
.write = (__is_signed) ? simple_attr_write_signed : simple_attr_write, \
|
||||
.llseek = generic_file_llseek, \
|
||||
}
|
||||
|
||||
#define DEFINE_SIMPLE_ATTRIBUTE(__fops, __get, __set, __fmt) \
|
||||
DEFINE_SIMPLE_ATTRIBUTE_XSIGNED(__fops, __get, __set, __fmt, false)
|
||||
|
||||
#define DEFINE_SIMPLE_ATTRIBUTE_SIGNED(__fops, __get, __set, __fmt) \
|
||||
DEFINE_SIMPLE_ATTRIBUTE_XSIGNED(__fops, __get, __set, __fmt, true)
|
||||
|
||||
static inline __printf(1, 2)
|
||||
void __simple_attr_check_format(const char *fmt, ...)
|
||||
{
|
||||
@ -3542,6 +3548,8 @@ ssize_t simple_attr_read(struct file *file, char __user *buf,
|
||||
size_t len, loff_t *ppos);
|
||||
ssize_t simple_attr_write(struct file *file, const char __user *buf,
|
||||
size_t len, loff_t *ppos);
|
||||
ssize_t simple_attr_write_signed(struct file *file, const char __user *buf,
|
||||
size_t len, loff_t *ppos);
|
||||
|
||||
struct ctl_table;
|
||||
int __init list_bdev_fs_names(char *buf, size_t size);
|
||||
|
@ -2,7 +2,9 @@
|
||||
#ifndef _LINUX_INIT_H
|
||||
#define _LINUX_INIT_H
|
||||
|
||||
#include <linux/build_bug.h>
|
||||
#include <linux/compiler.h>
|
||||
#include <linux/stringify.h>
|
||||
#include <linux/types.h>
|
||||
|
||||
/* Built-in __init functions needn't be compiled with retpoline */
|
||||
@ -143,6 +145,7 @@ struct file_system_type;
|
||||
extern int do_one_initcall(initcall_t fn);
|
||||
extern char __initdata boot_command_line[];
|
||||
extern char *saved_command_line;
|
||||
extern unsigned int saved_command_line_len;
|
||||
extern unsigned int reset_devices;
|
||||
|
||||
/* used by init/main.c */
|
||||
|
@ -213,7 +213,7 @@ io_mapping_free(struct io_mapping *iomap)
|
||||
kfree(iomap);
|
||||
}
|
||||
|
||||
#endif /* _LINUX_IO_MAPPING_H */
|
||||
|
||||
int io_mapping_map_user(struct io_mapping *iomap, struct vm_area_struct *vma,
|
||||
unsigned long addr, unsigned long pfn, unsigned long size);
|
||||
|
||||
#endif /* _LINUX_IO_MAPPING_H */
|
||||
|
@ -56,7 +56,7 @@ static inline void kcov_remote_start_usb(u64 id)
|
||||
/*
|
||||
* The softirq flavor of kcov_remote_*() functions is introduced as a temporary
|
||||
* work around for kcov's lack of nested remote coverage sections support in
|
||||
* task context. Adding suport for nested sections is tracked in:
|
||||
* task context. Adding support for nested sections is tracked in:
|
||||
* https://bugzilla.kernel.org/show_bug.cgi?id=210337
|
||||
*/
|
||||
|
||||
|
@ -17,6 +17,7 @@
|
||||
|
||||
#include <linux/crash_core.h>
|
||||
#include <asm/io.h>
|
||||
#include <linux/range.h>
|
||||
|
||||
#include <uapi/linux/kexec.h>
|
||||
#include <linux/verification.h>
|
||||
@ -240,14 +241,10 @@ static inline int arch_kexec_locate_mem_hole(struct kexec_buf *kbuf)
|
||||
/* Alignment required for elf header segment */
|
||||
#define ELF_CORE_HEADER_ALIGN 4096
|
||||
|
||||
struct crash_mem_range {
|
||||
u64 start, end;
|
||||
};
|
||||
|
||||
struct crash_mem {
|
||||
unsigned int max_nr_ranges;
|
||||
unsigned int nr_ranges;
|
||||
struct crash_mem_range ranges[];
|
||||
struct range ranges[];
|
||||
};
|
||||
|
||||
extern int crash_exclude_mem_range(struct crash_mem *mem,
|
||||
|
@ -37,6 +37,28 @@
|
||||
__cmp(x, y, op), \
|
||||
__cmp_once(x, y, __UNIQUE_ID(__x), __UNIQUE_ID(__y), op))
|
||||
|
||||
#define __clamp(val, lo, hi) \
|
||||
((val) >= (hi) ? (hi) : ((val) <= (lo) ? (lo) : (val)))
|
||||
|
||||
#define __clamp_once(val, lo, hi, unique_val, unique_lo, unique_hi) ({ \
|
||||
typeof(val) unique_val = (val); \
|
||||
typeof(lo) unique_lo = (lo); \
|
||||
typeof(hi) unique_hi = (hi); \
|
||||
__clamp(unique_val, unique_lo, unique_hi); })
|
||||
|
||||
#define __clamp_input_check(lo, hi) \
|
||||
(BUILD_BUG_ON_ZERO(__builtin_choose_expr( \
|
||||
__is_constexpr((lo) > (hi)), (lo) > (hi), false)))
|
||||
|
||||
#define __careful_clamp(val, lo, hi) ({ \
|
||||
__clamp_input_check(lo, hi) + \
|
||||
__builtin_choose_expr(__typecheck(val, lo) && __typecheck(val, hi) && \
|
||||
__typecheck(hi, lo) && __is_constexpr(val) && \
|
||||
__is_constexpr(lo) && __is_constexpr(hi), \
|
||||
__clamp(val, lo, hi), \
|
||||
__clamp_once(val, lo, hi, __UNIQUE_ID(__val), \
|
||||
__UNIQUE_ID(__lo), __UNIQUE_ID(__hi))); })
|
||||
|
||||
/**
|
||||
* min - return minimum of two values of the same or compatible types
|
||||
* @x: first value
|
||||
@ -86,7 +108,7 @@
|
||||
* This macro does strict typechecking of @lo/@hi to make sure they are of the
|
||||
* same type as @val. See the unnecessary pointer comparisons.
|
||||
*/
|
||||
#define clamp(val, lo, hi) min((typeof(val))max(val, lo), hi)
|
||||
#define clamp(val, lo, hi) __careful_clamp(val, lo, hi)
|
||||
|
||||
/*
|
||||
* ..and if you can't take the strict
|
||||
@ -121,7 +143,7 @@
|
||||
* This macro does no typechecking and uses temporary variables of type
|
||||
* @type to make all the comparisons.
|
||||
*/
|
||||
#define clamp_t(type, val, lo, hi) min_t(type, max_t(type, val, lo), hi)
|
||||
#define clamp_t(type, val, lo, hi) __careful_clamp((type)(val), (type)(lo), (type)(hi))
|
||||
|
||||
/**
|
||||
* clamp_val - return a value clamped to a given range using val's type
|
||||
|
@ -275,15 +275,15 @@ static inline int user_regset_copyin(unsigned int *pos, unsigned int *count,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int user_regset_copyin_ignore(unsigned int *pos,
|
||||
unsigned int *count,
|
||||
const void **kbuf,
|
||||
const void __user **ubuf,
|
||||
const int start_pos,
|
||||
const int end_pos)
|
||||
static inline void user_regset_copyin_ignore(unsigned int *pos,
|
||||
unsigned int *count,
|
||||
const void **kbuf,
|
||||
const void __user **ubuf,
|
||||
const int start_pos,
|
||||
const int end_pos)
|
||||
{
|
||||
if (*count == 0)
|
||||
return 0;
|
||||
return;
|
||||
BUG_ON(*pos < start_pos);
|
||||
if (end_pos < 0 || *pos < end_pos) {
|
||||
unsigned int copy = (end_pos < 0 ? *count
|
||||
@ -295,7 +295,6 @@ static inline int user_regset_copyin_ignore(unsigned int *pos,
|
||||
*pos += copy;
|
||||
*count -= copy;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
extern int regset_get(struct task_struct *target,
|
||||
|
@ -461,7 +461,7 @@ static long __init write_buffer(char *buf, unsigned long len)
|
||||
|
||||
static long __init flush_buffer(void *bufv, unsigned long len)
|
||||
{
|
||||
char *buf = (char *) bufv;
|
||||
char *buf = bufv;
|
||||
long written;
|
||||
long origLen = len;
|
||||
if (message)
|
||||
|
@ -145,7 +145,8 @@ void (*__initdata late_time_init)(void);
|
||||
/* Untouched command line saved by arch-specific code. */
|
||||
char __initdata boot_command_line[COMMAND_LINE_SIZE];
|
||||
/* Untouched saved command line (eg. for /proc) */
|
||||
char *saved_command_line;
|
||||
char *saved_command_line __ro_after_init;
|
||||
unsigned int saved_command_line_len __ro_after_init;
|
||||
/* Command line for parameter parsing */
|
||||
static char *static_command_line;
|
||||
/* Untouched extra command line */
|
||||
@ -667,6 +668,8 @@ static void __init setup_command_line(char *command_line)
|
||||
strcpy(saved_command_line + len, extra_init_args);
|
||||
}
|
||||
}
|
||||
|
||||
saved_command_line_len = strlen(saved_command_line);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -1379,7 +1382,7 @@ static void __init do_initcall_level(int level, char *command_line)
|
||||
static void __init do_initcalls(void)
|
||||
{
|
||||
int level;
|
||||
size_t len = strlen(saved_command_line) + 1;
|
||||
size_t len = saved_command_line_len + 1;
|
||||
char *command_line;
|
||||
|
||||
command_line = kzalloc(len, GFP_KERNEL);
|
||||
|
@ -1726,7 +1726,8 @@ static int __init init_mqueue_fs(void)
|
||||
|
||||
if (!setup_mq_sysctls(&init_ipc_ns)) {
|
||||
pr_warn("sysctl registration failed\n");
|
||||
return -ENOMEM;
|
||||
error = -ENOMEM;
|
||||
goto out_kmem;
|
||||
}
|
||||
|
||||
error = register_filesystem(&mqueue_fs_type);
|
||||
@ -1744,8 +1745,9 @@ static int __init init_mqueue_fs(void)
|
||||
out_filesystem:
|
||||
unregister_filesystem(&mqueue_fs_type);
|
||||
out_sysctl:
|
||||
kmem_cache_destroy(mqueue_inode_cachep);
|
||||
retire_mq_sysctls(&init_ipc_ns);
|
||||
out_kmem:
|
||||
kmem_cache_destroy(mqueue_inode_cachep);
|
||||
return error;
|
||||
}
|
||||
|
||||
|
@ -320,7 +320,7 @@ void acct_exit_ns(struct pid_namespace *ns)
|
||||
}
|
||||
|
||||
/*
|
||||
* encode an unsigned long into a comp_t
|
||||
* encode an u64 into a comp_t
|
||||
*
|
||||
* This routine has been adopted from the encode_comp_t() function in
|
||||
* the kern_acct.c file of the FreeBSD operating system. The encoding
|
||||
@ -331,7 +331,7 @@ void acct_exit_ns(struct pid_namespace *ns)
|
||||
#define EXPSIZE 3 /* Base 8 (3 bit) exponent. */
|
||||
#define MAXFRACT ((1 << MANTSIZE) - 1) /* Maximum fractional value. */
|
||||
|
||||
static comp_t encode_comp_t(unsigned long value)
|
||||
static comp_t encode_comp_t(u64 value)
|
||||
{
|
||||
int exp, rnd;
|
||||
|
||||
@ -350,6 +350,8 @@ static comp_t encode_comp_t(unsigned long value)
|
||||
exp++;
|
||||
}
|
||||
|
||||
if (exp > (((comp_t) ~0U) >> MANTSIZE))
|
||||
return (comp_t) ~0U;
|
||||
/*
|
||||
* Clean it up and polish it off.
|
||||
*/
|
||||
|
@ -383,6 +383,9 @@ void vmcoreinfo_append_str(const char *fmt, ...)
|
||||
memcpy(&vmcoreinfo_data[vmcoreinfo_size], buf, r);
|
||||
|
||||
vmcoreinfo_size += r;
|
||||
|
||||
WARN_ONCE(vmcoreinfo_size == VMCOREINFO_BYTES,
|
||||
"vmcoreinfo data exceeds allocated size, truncating");
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -17,4 +17,5 @@ KCSAN_INSTRUMENT_BARRIERS_selftest.o := y
|
||||
obj-$(CONFIG_KCSAN_SELFTEST) += selftest.o
|
||||
|
||||
CFLAGS_kcsan_test.o := $(CFLAGS_KCSAN) -g -fno-omit-frame-pointer
|
||||
CFLAGS_kcsan_test.o += $(DISABLE_STRUCTLEAK_PLUGIN)
|
||||
obj-$(CONFIG_KCSAN_KUNIT_TEST) += kcsan_test.o
|
||||
|
@ -561,23 +561,17 @@ static int kimage_add_entry(struct kimage *image, kimage_entry_t entry)
|
||||
static int kimage_set_destination(struct kimage *image,
|
||||
unsigned long destination)
|
||||
{
|
||||
int result;
|
||||
|
||||
destination &= PAGE_MASK;
|
||||
result = kimage_add_entry(image, destination | IND_DESTINATION);
|
||||
|
||||
return result;
|
||||
return kimage_add_entry(image, destination | IND_DESTINATION);
|
||||
}
|
||||
|
||||
|
||||
static int kimage_add_page(struct kimage *image, unsigned long page)
|
||||
{
|
||||
int result;
|
||||
|
||||
page &= PAGE_MASK;
|
||||
result = kimage_add_entry(image, page | IND_SOURCE);
|
||||
|
||||
return result;
|
||||
return kimage_add_entry(image, page | IND_SOURCE);
|
||||
}
|
||||
|
||||
|
||||
|
@ -1141,7 +1141,7 @@ int crash_exclude_mem_range(struct crash_mem *mem,
|
||||
{
|
||||
int i, j;
|
||||
unsigned long long start, end, p_start, p_end;
|
||||
struct crash_mem_range temp_range = {0, 0};
|
||||
struct range temp_range = {0, 0};
|
||||
|
||||
for (i = 0; i < mem->nr_ranges; i++) {
|
||||
start = mem->ranges[i].start;
|
||||
|
@ -25,6 +25,7 @@
|
||||
#include <linux/kexec.h>
|
||||
#include <linux/panic_notifier.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/string_helpers.h>
|
||||
#include <linux/sysrq.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/nmi.h>
|
||||
@ -744,8 +745,8 @@ static int __init panic_on_taint_setup(char *s)
|
||||
if (s && !strcmp(s, "nousertaint"))
|
||||
panic_on_taint_nousertaint = true;
|
||||
|
||||
pr_info("panic_on_taint: bitmask=0x%lx nousertaint_mode=%sabled\n",
|
||||
panic_on_taint, panic_on_taint_nousertaint ? "en" : "dis");
|
||||
pr_info("panic_on_taint: bitmask=0x%lx nousertaint_mode=%s\n",
|
||||
panic_on_taint, str_enabled_disabled(panic_on_taint_nousertaint));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -148,13 +148,13 @@ static struct rchan_buf *relay_create_buf(struct rchan *chan)
|
||||
{
|
||||
struct rchan_buf *buf;
|
||||
|
||||
if (chan->n_subbufs > KMALLOC_MAX_SIZE / sizeof(size_t *))
|
||||
if (chan->n_subbufs > KMALLOC_MAX_SIZE / sizeof(size_t))
|
||||
return NULL;
|
||||
|
||||
buf = kzalloc(sizeof(struct rchan_buf), GFP_KERNEL);
|
||||
if (!buf)
|
||||
return NULL;
|
||||
buf->padding = kmalloc_array(chan->n_subbufs, sizeof(size_t *),
|
||||
buf->padding = kmalloc_array(chan->n_subbufs, sizeof(size_t),
|
||||
GFP_KERNEL);
|
||||
if (!buf->padding)
|
||||
goto free_buf;
|
||||
@ -507,7 +507,7 @@ struct rchan *relay_open(const char *base_filename,
|
||||
chan->private_data = private_data;
|
||||
if (base_filename) {
|
||||
chan->has_base_filename = 1;
|
||||
strlcpy(chan->base_filename, base_filename, NAME_MAX);
|
||||
strscpy(chan->base_filename, base_filename, NAME_MAX);
|
||||
}
|
||||
chan->cb = cb;
|
||||
kref_init(&chan->kref);
|
||||
@ -578,7 +578,7 @@ int relay_late_setup_files(struct rchan *chan,
|
||||
if (!chan || !base_filename)
|
||||
return -EINVAL;
|
||||
|
||||
strlcpy(chan->base_filename, base_filename, NAME_MAX);
|
||||
strscpy(chan->base_filename, base_filename, NAME_MAX);
|
||||
|
||||
mutex_lock(&relay_channels_mutex);
|
||||
/* Is chan already set up? */
|
||||
|
@ -2964,7 +2964,7 @@ static void task_numa_work(struct callback_head *work)
|
||||
}
|
||||
|
||||
next_scan = now + msecs_to_jiffies(p->numa_scan_period);
|
||||
if (cmpxchg(&mm->numa_next_scan, migrate, next_scan) != migrate)
|
||||
if (!try_cmpxchg(&mm->numa_next_scan, &migrate, next_scan))
|
||||
return;
|
||||
|
||||
/*
|
||||
|
@ -529,8 +529,8 @@ config CPUMASK_OFFSTACK
|
||||
stack overflow.
|
||||
|
||||
config FORCE_NR_CPUS
|
||||
bool "NR_CPUS is set to an actual number of CPUs"
|
||||
depends on SMP
|
||||
bool "Set number of CPUs at compile time"
|
||||
depends on SMP && EXPERT && !COMPILE_TEST
|
||||
help
|
||||
Say Yes if you have NR_CPUS set to an actual number of possible
|
||||
CPUs in your system, not to a default value. This forces the core
|
||||
|
@ -437,6 +437,7 @@ static int object_cpu_offline(unsigned int cpu)
|
||||
struct debug_percpu_free *percpu_pool;
|
||||
struct hlist_node *tmp;
|
||||
struct debug_obj *obj;
|
||||
unsigned long flags;
|
||||
|
||||
/* Remote access is safe as the CPU is dead already */
|
||||
percpu_pool = per_cpu_ptr(&percpu_obj_pool, cpu);
|
||||
@ -444,6 +445,12 @@ static int object_cpu_offline(unsigned int cpu)
|
||||
hlist_del(&obj->node);
|
||||
kmem_cache_free(obj_cache, obj);
|
||||
}
|
||||
|
||||
raw_spin_lock_irqsave(&pool_lock, flags);
|
||||
obj_pool_used -= percpu_pool->obj_free;
|
||||
debug_objects_freed += percpu_pool->obj_free;
|
||||
raw_spin_unlock_irqrestore(&pool_lock, flags);
|
||||
|
||||
percpu_pool->obj_free = 0;
|
||||
|
||||
return 0;
|
||||
@ -1318,6 +1325,8 @@ static int __init debug_objects_replace_static_objects(void)
|
||||
hlist_add_head(&obj->node, &objects);
|
||||
}
|
||||
|
||||
debug_objects_allocated += i;
|
||||
|
||||
/*
|
||||
* debug_objects_mem_init() is now called early that only one CPU is up
|
||||
* and interrupts have been disabled, so it is safe to replace the
|
||||
@ -1386,6 +1395,7 @@ void __init debug_objects_mem_init(void)
|
||||
debug_objects_enabled = 0;
|
||||
kmem_cache_destroy(obj_cache);
|
||||
pr_warn("out of memory.\n");
|
||||
return;
|
||||
} else
|
||||
debug_objects_selftest();
|
||||
|
||||
|
@ -135,8 +135,8 @@ const struct font_desc *get_default_font(int xres, int yres, u32 font_w,
|
||||
if (res > 20)
|
||||
c += 20 - res;
|
||||
|
||||
if ((font_w & (1 << (f->width - 1))) &&
|
||||
(font_h & (1 << (f->height - 1))))
|
||||
if ((font_w & (1U << (f->width - 1))) &&
|
||||
(font_h & (1U << (f->height - 1))))
|
||||
c += 1000;
|
||||
|
||||
if (c > cc) {
|
||||
|
@ -26,10 +26,10 @@
|
||||
bool llist_add_batch(struct llist_node *new_first, struct llist_node *new_last,
|
||||
struct llist_head *head)
|
||||
{
|
||||
struct llist_node *first;
|
||||
struct llist_node *first = READ_ONCE(head->first);
|
||||
|
||||
do {
|
||||
new_last->next = first = READ_ONCE(head->first);
|
||||
new_last->next = first;
|
||||
} while (!try_cmpxchg(&head->first, &first, new_first));
|
||||
|
||||
return !first;
|
||||
|
@ -15,7 +15,7 @@ static int debugfs_errno_get(void *data, u64 *val)
|
||||
return 0;
|
||||
}
|
||||
|
||||
DEFINE_SIMPLE_ATTRIBUTE(fops_errno, debugfs_errno_get, debugfs_errno_set,
|
||||
DEFINE_SIMPLE_ATTRIBUTE_SIGNED(fops_errno, debugfs_errno_get, debugfs_errno_set,
|
||||
"%lld\n");
|
||||
|
||||
static struct dentry *debugfs_create_errno(const char *name, umode_t mode,
|
||||
|
@ -146,7 +146,6 @@ int sprint_oid(const void *data, size_t datasize, char *buffer, size_t bufsize)
|
||||
bufsize -= count;
|
||||
|
||||
while (v < end) {
|
||||
num = 0;
|
||||
n = *v++;
|
||||
if (!(n & 0x80)) {
|
||||
num = n;
|
||||
|
@ -1029,7 +1029,7 @@ void *radix_tree_tag_clear(struct radix_tree_root *root,
|
||||
{
|
||||
struct radix_tree_node *node, *parent;
|
||||
unsigned long maxindex;
|
||||
int offset;
|
||||
int offset = 0;
|
||||
|
||||
radix_tree_load_root(root, &node, &maxindex);
|
||||
if (index > maxindex)
|
||||
|
@ -702,6 +702,17 @@ sub find_standard_signature {
|
||||
return "";
|
||||
}
|
||||
|
||||
our $obsolete_archives = qr{(?xi:
|
||||
\Qfreedesktop.org/archives/dri-devel\E |
|
||||
\Qlists.infradead.org\E |
|
||||
\Qlkml.org\E |
|
||||
\Qmail-archive.com\E |
|
||||
\Qmailman.alsa-project.org/pipermail\E |
|
||||
\Qmarc.info\E |
|
||||
\Qozlabs.org/pipermail\E |
|
||||
\Qspinics.net\E
|
||||
)};
|
||||
|
||||
our @typeListMisordered = (
|
||||
qr{char\s+(?:un)?signed},
|
||||
qr{int\s+(?:(?:un)?signed\s+)?short\s},
|
||||
@ -3324,6 +3335,12 @@ sub process {
|
||||
$last_git_commit_id_linenr = $linenr if ($line =~ /\bcommit\s*$/i);
|
||||
}
|
||||
|
||||
# Check for mailing list archives other than lore.kernel.org
|
||||
if ($rawline =~ m{http.*\b$obsolete_archives}) {
|
||||
WARN("PREFER_LORE_ARCHIVE",
|
||||
"Use lore.kernel.org archive links when possible - see https://lore.kernel.org/lists.html\n" . $herecurr);
|
||||
}
|
||||
|
||||
# Check for added, moved or deleted files
|
||||
if (!$reported_maintainer_file && !$in_commit_log &&
|
||||
($line =~ /^(?:new|deleted) file mode\s*\d+\s*$/ ||
|
||||
@ -5901,6 +5918,7 @@ sub process {
|
||||
$dstat !~ /$exceptions/ &&
|
||||
$dstat !~ /^\.$Ident\s*=/ && # .foo =
|
||||
$dstat !~ /^(?:\#\s*$Ident|\#\s*$Constant)\s*$/ && # stringification #foo
|
||||
$dstat !~ /^case\b/ && # case ...
|
||||
$dstat !~ /^do\s*$Constant\s*while\s*$Constant;?$/ && # do {...} while (...); // do {...} while (...)
|
||||
$dstat !~ /^while\s*$Constant\s*$Constant\s*$/ && # while (...) {...}
|
||||
$dstat !~ /^for\s*$Constant$/ && # for (...)
|
||||
@ -7128,7 +7146,7 @@ sub process {
|
||||
}
|
||||
|
||||
# check for alloc argument mismatch
|
||||
if ($line =~ /\b((?:devm_)?(?:kcalloc|kmalloc_array))\s*\(\s*sizeof\b/) {
|
||||
if ($line =~ /\b((?:devm_)?((?:k|kv)?(calloc|malloc_array)(?:_node)?))\s*\(\s*sizeof\b/) {
|
||||
WARN("ALLOC_ARRAY_ARGS",
|
||||
"$1 uses number as first arg, sizeof is generally wrong\n" . $herecurr);
|
||||
}
|
||||
|
@ -23,6 +23,7 @@ absoulte||absolute
|
||||
acccess||access
|
||||
acceess||access
|
||||
accelaration||acceleration
|
||||
accelearion||acceleration
|
||||
acceleratoin||acceleration
|
||||
accelleration||acceleration
|
||||
accesing||accessing
|
||||
@ -58,6 +59,7 @@ acording||according
|
||||
activete||activate
|
||||
actived||activated
|
||||
actualy||actually
|
||||
actvie||active
|
||||
acumulating||accumulating
|
||||
acumulative||accumulative
|
||||
acumulator||accumulator
|
||||
@ -253,6 +255,7 @@ brigde||bridge
|
||||
broadcase||broadcast
|
||||
broadcat||broadcast
|
||||
bufer||buffer
|
||||
bufferred||buffered
|
||||
bufufer||buffer
|
||||
cacluated||calculated
|
||||
caculate||calculate
|
||||
@ -273,6 +276,7 @@ cant||can't
|
||||
cant'||can't
|
||||
canot||cannot
|
||||
cann't||can't
|
||||
cannnot||cannot
|
||||
capabilites||capabilities
|
||||
capabilties||capabilities
|
||||
capabilty||capability
|
||||
@ -309,6 +313,7 @@ chiled||child
|
||||
chked||checked
|
||||
chnage||change
|
||||
chnages||changes
|
||||
chnange||change
|
||||
chnnel||channel
|
||||
choosen||chosen
|
||||
chouse||chose
|
||||
@ -439,6 +444,7 @@ defferred||deferred
|
||||
definate||definite
|
||||
definately||definitely
|
||||
definiation||definition
|
||||
definiton||definition
|
||||
defintion||definition
|
||||
defintions||definitions
|
||||
defualt||default
|
||||
@ -452,6 +458,7 @@ delare||declare
|
||||
delares||declares
|
||||
delaring||declaring
|
||||
delemiter||delimiter
|
||||
delibrately||deliberately
|
||||
delievered||delivered
|
||||
demodualtor||demodulator
|
||||
demension||dimension
|
||||
@ -481,6 +488,7 @@ destroied||destroyed
|
||||
detabase||database
|
||||
deteced||detected
|
||||
detectt||detect
|
||||
detroyed||destroyed
|
||||
develope||develop
|
||||
developement||development
|
||||
developped||developed
|
||||
@ -507,6 +515,7 @@ dimention||dimension
|
||||
dimesions||dimensions
|
||||
diconnected||disconnected
|
||||
disabed||disabled
|
||||
disasembler||disassembler
|
||||
disble||disable
|
||||
disgest||digest
|
||||
disired||desired
|
||||
@ -666,6 +675,7 @@ finanize||finalize
|
||||
findn||find
|
||||
finilizes||finalizes
|
||||
finsih||finish
|
||||
fliter||filter
|
||||
flusing||flushing
|
||||
folloing||following
|
||||
followign||following
|
||||
@ -725,6 +735,7 @@ hanled||handled
|
||||
happend||happened
|
||||
hardare||hardware
|
||||
harware||hardware
|
||||
hardward||hardware
|
||||
havind||having
|
||||
heirarchically||hierarchically
|
||||
heirarchy||hierarchy
|
||||
@ -740,6 +751,7 @@ howver||however
|
||||
hsould||should
|
||||
hypervior||hypervisor
|
||||
hypter||hyper
|
||||
idel||idle
|
||||
identidier||identifier
|
||||
iligal||illegal
|
||||
illigal||illegal
|
||||
@ -931,9 +943,11 @@ matchs||matches
|
||||
mathimatical||mathematical
|
||||
mathimatic||mathematic
|
||||
mathimatics||mathematics
|
||||
maxmium||maximum
|
||||
maximium||maximum
|
||||
maxium||maximum
|
||||
mechamism||mechanism
|
||||
mechanim||mechanism
|
||||
meetign||meeting
|
||||
memeory||memory
|
||||
memmber||member
|
||||
@ -942,6 +956,7 @@ memroy||memory
|
||||
ment||meant
|
||||
mergable||mergeable
|
||||
mesage||message
|
||||
mesages||messages
|
||||
messags||messages
|
||||
messgaes||messages
|
||||
messsage||message
|
||||
@ -983,8 +998,9 @@ monochromo||monochrome
|
||||
monocrome||monochrome
|
||||
mopdule||module
|
||||
mroe||more
|
||||
multipler||multiplier
|
||||
mulitplied||multiplied
|
||||
muliple||multiple
|
||||
multipler||multiplier
|
||||
multidimensionnal||multidimensional
|
||||
multipe||multiple
|
||||
multple||multiple
|
||||
@ -1109,6 +1125,7 @@ peroid||period
|
||||
persistance||persistence
|
||||
persistant||persistent
|
||||
phoneticly||phonetically
|
||||
plaform||platform
|
||||
plalform||platform
|
||||
platfoem||platform
|
||||
platfrom||platform
|
||||
@ -1236,6 +1253,7 @@ refering||referring
|
||||
refernces||references
|
||||
refernnce||reference
|
||||
refrence||reference
|
||||
regiser||register
|
||||
registed||registered
|
||||
registerd||registered
|
||||
registeration||registration
|
||||
@ -1276,6 +1294,7 @@ reseting||resetting
|
||||
reseved||reserved
|
||||
reseverd||reserved
|
||||
resizeable||resizable
|
||||
resotre||restore
|
||||
resouce||resource
|
||||
resouces||resources
|
||||
resoures||resources
|
||||
@ -1314,6 +1333,7 @@ runtine||runtime
|
||||
sacrifying||sacrificing
|
||||
safly||safely
|
||||
safty||safety
|
||||
satify||satisfy
|
||||
savable||saveable
|
||||
scaleing||scaling
|
||||
scaned||scanned
|
||||
@ -1365,10 +1385,12 @@ similiar||similar
|
||||
simlar||similar
|
||||
simliar||similar
|
||||
simpified||simplified
|
||||
simultaneusly||simultaneously
|
||||
simultanous||simultaneous
|
||||
singaled||signaled
|
||||
singal||signal
|
||||
singed||signed
|
||||
slect||select
|
||||
sleeped||slept
|
||||
sliped||slipped
|
||||
softwade||software
|
||||
@ -1438,6 +1460,7 @@ suported||supported
|
||||
suport||support
|
||||
supportet||supported
|
||||
suppored||supported
|
||||
supporing||supporting
|
||||
supportin||supporting
|
||||
suppoted||supported
|
||||
suppported||supported
|
||||
@ -1475,15 +1498,18 @@ sytem||system
|
||||
sythesis||synthesis
|
||||
taht||that
|
||||
tained||tainted
|
||||
tarffic||traffic
|
||||
tansmit||transmit
|
||||
targetted||targeted
|
||||
targetting||targeting
|
||||
taskelt||tasklet
|
||||
teh||the
|
||||
temeprature||temperature
|
||||
temorary||temporary
|
||||
temproarily||temporarily
|
||||
temperture||temperature
|
||||
thead||thread
|
||||
theads||threads
|
||||
therfore||therefore
|
||||
thier||their
|
||||
threds||threads
|
||||
@ -1533,12 +1559,14 @@ ture||true
|
||||
tyep||type
|
||||
udpate||update
|
||||
uesd||used
|
||||
unknwon||unknown
|
||||
uknown||unknown
|
||||
usccess||success
|
||||
uncommited||uncommitted
|
||||
uncompatible||incompatible
|
||||
unconditionaly||unconditionally
|
||||
undeflow||underflow
|
||||
undelying||underlying
|
||||
underun||underrun
|
||||
unecessary||unnecessary
|
||||
unexecpted||unexpected
|
||||
@ -1569,11 +1597,14 @@ unneedingly||unnecessarily
|
||||
unnsupported||unsupported
|
||||
unmached||unmatched
|
||||
unprecise||imprecise
|
||||
unpriviledged||unprivileged
|
||||
unpriviliged||unprivileged
|
||||
unregester||unregister
|
||||
unresgister||unregister
|
||||
unrgesiter||unregister
|
||||
unsinged||unsigned
|
||||
unstabel||unstable
|
||||
unsolicted||unsolicited
|
||||
unsolicitied||unsolicited
|
||||
unsuccessfull||unsuccessful
|
||||
unsuported||unsupported
|
||||
|
@ -261,25 +261,20 @@ void handle_aggr(int mother, struct nlattr *na, int fd)
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
int c, rc, rep_len, aggr_len, len2;
|
||||
int cmd_type = TASKSTATS_CMD_ATTR_UNSPEC;
|
||||
int c, rc, rep_len;
|
||||
__u16 id;
|
||||
__u32 mypid;
|
||||
|
||||
struct nlattr *na;
|
||||
int nl_sd = -1;
|
||||
int len = 0;
|
||||
pid_t tid = 0;
|
||||
|
||||
int fd = 0;
|
||||
int write_file = 0;
|
||||
int maskset = 0;
|
||||
char *logfile = NULL;
|
||||
int containerset = 0;
|
||||
char *containerpath = NULL;
|
||||
int cfd = 0;
|
||||
int forking = 0;
|
||||
sigset_t sigset;
|
||||
|
||||
struct msgtemplate msg;
|
||||
|
||||
|
@ -555,6 +555,7 @@ int proc_mount_contains(const char *option)
|
||||
ssize_t proc_read_text(int pid, bool thread, const char *item, char *buf, size_t size)
|
||||
{
|
||||
char path[PATH_MAX];
|
||||
ssize_t ret;
|
||||
|
||||
if (!pid)
|
||||
snprintf(path, sizeof(path), "/proc/%s/%s",
|
||||
@ -562,8 +563,8 @@ ssize_t proc_read_text(int pid, bool thread, const char *item, char *buf, size_t
|
||||
else
|
||||
snprintf(path, sizeof(path), "/proc/%d/%s", pid, item);
|
||||
|
||||
size = read_text(path, buf, size);
|
||||
return size < 0 ? -1 : size;
|
||||
ret = read_text(path, buf, size);
|
||||
return ret < 0 ? -1 : ret;
|
||||
}
|
||||
|
||||
int proc_read_strstr(int pid, bool thread, const char *item, const char *needle)
|
||||
|
@ -17,6 +17,7 @@
|
||||
// while shifting across CPUs.
|
||||
#undef NDEBUG
|
||||
#include <assert.h>
|
||||
#include <errno.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/syscall.h>
|
||||
#include <stdlib.h>
|
||||
@ -54,7 +55,7 @@ int main(void)
|
||||
len += sizeof(unsigned long);
|
||||
free(m);
|
||||
m = malloc(len);
|
||||
} while (sys_sched_getaffinity(0, len, m) == -EINVAL);
|
||||
} while (sys_sched_getaffinity(0, len, m) == -1 && errno == EINVAL);
|
||||
|
||||
fd = open("/proc/uptime", O_RDONLY);
|
||||
assert(fd >= 0);
|
||||
|
2
tools/testing/selftests/vm/.gitignore
vendored
2
tools/testing/selftests/vm/.gitignore
vendored
@ -33,3 +33,5 @@ memfd_secret
|
||||
soft-dirty
|
||||
split_huge_page_test
|
||||
ksm_tests
|
||||
local_config.h
|
||||
local_config.mk
|
||||
|
Loading…
Reference in New Issue
Block a user