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:
Linus Torvalds 2022-12-12 17:28:58 -08:00
commit 8702f2c611
100 changed files with 751 additions and 303 deletions

View File

@ -228,6 +228,7 @@ Juha Yrjola <at solidboot.com>
Juha Yrjola <juha.yrjola@nokia.com> Juha Yrjola <juha.yrjola@nokia.com>
Juha Yrjola <juha.yrjola@solidboot.com> Juha Yrjola <juha.yrjola@solidboot.com>
Julien Thierry <julien.thierry.kdev@gmail.com> <julien.thierry@arm.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> Kalle Valo <kvalo@kernel.org> <kvalo@codeaurora.org>
Kalyan Thota <quic_kalyant@quicinc.com> <kalyan_t@codeaurora.org> Kalyan Thota <quic_kalyant@quicinc.com> <kalyan_t@codeaurora.org>
Kay Sievers <kay.sievers@vrfy.org> Kay Sievers <kay.sievers@vrfy.org>

View File

@ -176,6 +176,7 @@ core_pattern
%f executable filename %f executable filename
%E executable path %E executable path
%c maximum size of core file by resource limit RLIMIT_CORE %c maximum size of core file by resource limit RLIMIT_CORE
%C CPU the task ran on
%<OTHER> both are dropped %<OTHER> both are dropped
======== ========================================== ======== ==========================================

View File

@ -83,9 +83,7 @@ configuration of fault-injection capabilities.
- /sys/kernel/debug/fail*/times: - /sys/kernel/debug/fail*/times:
specifies how many times failures may happen at most. A value of -1 specifies how many times failures may happen at most. A value of -1
means "no limit". Note, though, that this file only accepts unsigned means "no limit".
values. So, if you want to specify -1, you better use 'printf' instead
of 'echo', e.g.: $ printf %#x -1 > times
- /sys/kernel/debug/fail*/space: - /sys/kernel/debug/fail*/space:
@ -284,7 +282,7 @@ Application Examples
echo Y > /sys/kernel/debug/$FAILTYPE/task-filter echo Y > /sys/kernel/debug/$FAILTYPE/task-filter
echo 10 > /sys/kernel/debug/$FAILTYPE/probability echo 10 > /sys/kernel/debug/$FAILTYPE/probability
echo 100 > /sys/kernel/debug/$FAILTYPE/interval 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 0 > /sys/kernel/debug/$FAILTYPE/space
echo 2 > /sys/kernel/debug/$FAILTYPE/verbose echo 2 > /sys/kernel/debug/$FAILTYPE/verbose
echo Y > /sys/kernel/debug/$FAILTYPE/ignore-gfp-wait echo Y > /sys/kernel/debug/$FAILTYPE/ignore-gfp-wait
@ -338,7 +336,7 @@ Application Examples
echo N > /sys/kernel/debug/$FAILTYPE/task-filter echo N > /sys/kernel/debug/$FAILTYPE/task-filter
echo 10 > /sys/kernel/debug/$FAILTYPE/probability echo 10 > /sys/kernel/debug/$FAILTYPE/probability
echo 100 > /sys/kernel/debug/$FAILTYPE/interval 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 0 > /sys/kernel/debug/$FAILTYPE/space
echo 2 > /sys/kernel/debug/$FAILTYPE/verbose echo 2 > /sys/kernel/debug/$FAILTYPE/verbose
echo Y > /sys/kernel/debug/$FAILTYPE/ignore-gfp-wait echo Y > /sys/kernel/debug/$FAILTYPE/ignore-gfp-wait
@ -369,7 +367,7 @@ Application Examples
echo N > /sys/kernel/debug/$FAILTYPE/task-filter echo N > /sys/kernel/debug/$FAILTYPE/task-filter
echo 100 > /sys/kernel/debug/$FAILTYPE/probability echo 100 > /sys/kernel/debug/$FAILTYPE/probability
echo 0 > /sys/kernel/debug/$FAILTYPE/interval 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 0 > /sys/kernel/debug/$FAILTYPE/space
echo 1 > /sys/kernel/debug/$FAILTYPE/verbose echo 1 > /sys/kernel/debug/$FAILTYPE/verbose

View File

@ -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.10 /proc/<pid>/timerslack_ns - Task timerslack value
3.11 /proc/<pid>/patch_state - Livepatch patch operation state 3.11 /proc/<pid>/patch_state - Livepatch patch operation state
3.12 /proc/<pid>/arch_status - Task architecture specific information 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 Configuring procfs
4.1 Mount options 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 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. 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 Chapter 4: Configuring procfs
============================= =============================

View File

@ -12126,7 +12126,7 @@ M: Alexey Kodanev <alexey.kodanev@oracle.com>
L: ltp@lists.linux.it (subscribers-only) L: ltp@lists.linux.it (subscribers-only)
S: Maintained S: Maintained
W: http://linux-test-project.github.io/ 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 LYNX 28G SERDES PHY DRIVER
M: Ioana Ciornei <ioana.ciornei@nxp.com> M: Ioana Ciornei <ioana.ciornei@nxp.com>

View File

@ -185,7 +185,7 @@ static int genregs_set(struct task_struct *target,
#define REG_IGNORE_ONE(LOC) \ #define REG_IGNORE_ONE(LOC) \
if (!ret) \ 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), \
offsetof(struct user_regs_struct, LOC) + 4); offsetof(struct user_regs_struct, LOC) + 4);

View File

@ -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; struct pt_regs regs;

View File

@ -651,11 +651,9 @@ static int vfp_set(struct task_struct *target,
if (ret) if (ret)
return ret; return ret;
ret = user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf, user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf,
user_fpregs_offset + sizeof(new_vfp.fpregs), user_fpregs_offset + sizeof(new_vfp.fpregs),
user_fpscr_offset); user_fpscr_offset);
if (ret)
return ret;
ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf, ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf,
&new_vfp.fpscr, &new_vfp.fpscr,

View File

@ -514,9 +514,7 @@ static int hw_break_set(struct task_struct *target,
/* Resource info and pad */ /* Resource info and pad */
offset = offsetof(struct user_hwdebug_state, dbg_regs); offset = offsetof(struct user_hwdebug_state, dbg_regs);
ret = user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf, 0, offset); user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf, 0, offset);
if (ret)
return ret;
/* (address, ctrl) registers */ /* (address, ctrl) registers */
limit = regset->n * regset->size; limit = regset->n * regset->size;
@ -543,11 +541,8 @@ static int hw_break_set(struct task_struct *target,
return ret; return ret;
offset += PTRACE_HBP_CTRL_SZ; offset += PTRACE_HBP_CTRL_SZ;
ret = user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf, user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf,
offset, offset, offset + PTRACE_HBP_PAD_SZ);
offset + PTRACE_HBP_PAD_SZ);
if (ret)
return ret;
offset += PTRACE_HBP_PAD_SZ; offset += PTRACE_HBP_PAD_SZ;
idx++; idx++;
} }
@ -955,10 +950,7 @@ static int sve_set_common(struct task_struct *target,
start = end; start = end;
end = SVE_PT_SVE_FPSR_OFFSET(vq); end = SVE_PT_SVE_FPSR_OFFSET(vq);
ret = user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf, user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf, start, end);
start, end);
if (ret)
goto out;
/* /*
* Copy fpsr, and fpcr which must follow contiguously in * Copy fpsr, and fpcr which must follow contiguously in

View File

@ -115,10 +115,9 @@ static int genregs_set(struct task_struct *target,
/* Ignore the rest, if needed */ /* Ignore the rest, if needed */
if (!ret) if (!ret)
ret = user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf, user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf,
offsetof(struct user_regs_struct, pad1), -1); offsetof(struct user_regs_struct, pad1), -1);
else
if (ret)
return ret; return ret;
/* /*

View File

@ -23,10 +23,6 @@
#include <asm/unaligned.h> #include <asm/unaligned.h>
#include <asm/early_ioremap.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) #define __IA64_UNCACHED_OFFSET RGN_BASE(RGN_UNCACHED)
/* /*

View File

@ -110,8 +110,6 @@ extern int kprobe_fault_handler(struct pt_regs *regs, int trapnr);
extern int kprobe_exceptions_notify(struct notifier_block *self, extern int kprobe_exceptions_notify(struct notifier_block *self,
unsigned long val, void *data); 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); extern void arch_remove_kprobe(struct kprobe *p);
#endif /* CONFIG_KPROBES */ #endif /* CONFIG_KPROBES */

View File

@ -1481,12 +1481,10 @@ static void do_gpregs_set(struct unw_frame_info *info, void *arg)
return; return;
/* Skip r0 */ /* Skip r0 */
if (dst->pos < ELF_GR_OFFSET(1)) { if (dst->pos < ELF_GR_OFFSET(1)) {
dst->ret = user_regset_copyin_ignore(&dst->pos, &dst->count, user_regset_copyin_ignore(&dst->pos, &dst->count,
&dst->u.set.kbuf, &dst->u.set.kbuf, &dst->u.set.ubuf,
&dst->u.set.ubuf, 0, ELF_GR_OFFSET(1));
0, ELF_GR_OFFSET(1)); dst->ret = 0;
if (dst->ret)
return;
} }
while (dst->count && dst->pos < ELF_AR_END_OFFSET) { 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 */ /* Skip pos 0 and 1 */
if (dst->count > 0 && dst->pos < ELF_FP_OFFSET(2)) { if (dst->count > 0 && dst->pos < ELF_FP_OFFSET(2)) {
dst->ret = user_regset_copyin_ignore(&dst->pos, &dst->count, user_regset_copyin_ignore(&dst->pos, &dst->count,
&dst->u.set.kbuf, &dst->u.set.kbuf, &dst->u.set.ubuf,
&dst->u.set.ubuf, 0, ELF_FP_OFFSET(2));
0, ELF_FP_OFFSET(2)); dst->ret = 0;
if (dst->count == 0 || dst->ret) if (dst->count == 0)
return; return;
} }

View File

@ -140,7 +140,7 @@ asmlinkage unsigned long
sys_mmap2 (unsigned long addr, unsigned long len, int prot, int flags, int fd, long pgoff) 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); addr = ksys_mmap_pgoff(addr, len, prot, flags, fd, pgoff);
if (!IS_ERR((void *) addr)) if (!IS_ERR_VALUE(addr))
force_successful_syscall_return(); force_successful_syscall_return();
return addr; return addr;
} }
@ -152,7 +152,7 @@ sys_mmap (unsigned long addr, unsigned long len, int prot, int flags, int fd, lo
return -EINVAL; return -EINVAL;
addr = ksys_mmap_pgoff(addr, len, prot, flags, fd, off >> PAGE_SHIFT); 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(); force_successful_syscall_return();
return addr; return addr;
} }
@ -162,7 +162,7 @@ ia64_mremap (unsigned long addr, unsigned long old_len, unsigned long new_len, u
unsigned long new_addr) unsigned long new_addr)
{ {
addr = sys_mremap(addr, old_len, new_len, flags, 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(); force_successful_syscall_return();
return addr; return addr;
} }

View File

@ -531,10 +531,11 @@ static int fpr_set(struct task_struct *target,
ptrace_setfcr31(target, fcr31); ptrace_setfcr31(target, fcr31);
} }
if (count > 0) if (count > 0) {
err = user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf, user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf,
fir_pos, fir_pos, fir_pos + sizeof(u32));
fir_pos + sizeof(u32)); return 0;
}
return err; return err;
} }

View File

@ -54,7 +54,7 @@ static int genregs_set(struct task_struct *target,
#define REG_IGNORE_RANGE(START, END) \ #define REG_IGNORE_RANGE(START, END) \
if (!ret) \ if (!ret) \
ret = user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf, \ user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf, \
START * 4, (END * 4) + 4); START * 4, (END * 4) + 4);
#define REG_IN_ONE(PTR, LOC) \ #define REG_IN_ONE(PTR, LOC) \
@ -80,8 +80,8 @@ static int genregs_set(struct task_struct *target,
REG_IN_ONE(&regs->ra, PTR_RA); REG_IN_ONE(&regs->ra, PTR_RA);
REG_IN_ONE(&regs->ea, PTR_PC); /* use ea for PC */ REG_IN_ONE(&regs->ea, PTR_PC); /* use ea for PC */
if (!ret) if (!ret)
ret = user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf, user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf,
PTR_STATUS * 4, -1); PTR_STATUS * 4, -1);
return ret; return ret;
} }

View File

@ -66,10 +66,9 @@ static int genregs_set(struct task_struct *target,
int ret; int ret;
/* ignore r0 */ /* 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 */ /* 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); regs->gpr+1, 4, 4*32);
/* PC */ /* PC */
if (!ret) if (!ret)
@ -80,8 +79,7 @@ static int genregs_set(struct task_struct *target,
* the Supervision register * the Supervision register
*/ */
if (!ret) if (!ret)
ret = user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf, user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf, 4*33, -1);
4*33, -1);
return ret; return ret;
} }

View File

@ -424,8 +424,9 @@ static int fpr_set(struct task_struct *target,
ubuf = u; ubuf = u;
pos *= sizeof(reg); pos *= sizeof(reg);
count *= sizeof(reg); count *= sizeof(reg);
return user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf, user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf,
ELF_NFPREG * sizeof(reg), -1); ELF_NFPREG * sizeof(reg), -1);
return 0;
} }
#define RI(reg) (offsetof(struct user_regs_struct,reg) / sizeof(long)) #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; ubuf = u;
pos *= sizeof(reg); pos *= sizeof(reg);
count *= sizeof(reg); count *= sizeof(reg);
return user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf, user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf,
ELF_NGREG * sizeof(reg), -1); ELF_NGREG * sizeof(reg), -1);
return 0;
} }
static const struct user_regset native_regsets[] = { static const struct user_regset native_regsets[] = {
@ -606,8 +608,9 @@ static int gpr32_set(struct task_struct *target,
ubuf = u; ubuf = u;
pos *= sizeof(reg); pos *= sizeof(reg);
count *= sizeof(reg); count *= sizeof(reg);
return user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf, user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf,
ELF_NGREG * sizeof(reg), -1); ELF_NGREG * sizeof(reg), -1);
return 0;
} }
/* /*

View File

@ -170,9 +170,9 @@ int tm_cgpr_set(struct task_struct *target, const struct user_regset *regset,
(PT_MAX_PUT_REG + 1) * sizeof(reg)); (PT_MAX_PUT_REG + 1) * sizeof(reg));
if (PT_MAX_PUT_REG + 1 < PT_TRAP && !ret) if (PT_MAX_PUT_REG + 1 < PT_TRAP && !ret)
ret = user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf, user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf,
(PT_MAX_PUT_REG + 1) * sizeof(reg), (PT_MAX_PUT_REG + 1) * sizeof(reg),
PT_TRAP * sizeof(reg)); PT_TRAP * sizeof(reg));
if (!ret && count > 0) { if (!ret && count > 0) {
ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf, &reg, ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf, &reg,
@ -183,8 +183,8 @@ int tm_cgpr_set(struct task_struct *target, const struct user_regset *regset,
} }
if (!ret) if (!ret)
ret = user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf, user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf,
(PT_TRAP + 1) * sizeof(reg), -1); (PT_TRAP + 1) * sizeof(reg), -1);
return ret; return ret;
} }

View File

@ -267,9 +267,9 @@ static int gpr_set(struct task_struct *target, const struct user_regset *regset,
(PT_MAX_PUT_REG + 1) * sizeof(reg)); (PT_MAX_PUT_REG + 1) * sizeof(reg));
if (PT_MAX_PUT_REG + 1 < PT_TRAP && !ret) if (PT_MAX_PUT_REG + 1 < PT_TRAP && !ret)
ret = user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf, user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf,
(PT_MAX_PUT_REG + 1) * sizeof(reg), (PT_MAX_PUT_REG + 1) * sizeof(reg),
PT_TRAP * sizeof(reg)); PT_TRAP * sizeof(reg));
if (!ret && count > 0) { if (!ret && count > 0) {
ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf, &reg, ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf, &reg,
@ -280,8 +280,8 @@ static int gpr_set(struct task_struct *target, const struct user_regset *regset,
} }
if (!ret) if (!ret)
ret = user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf, user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf,
(PT_TRAP + 1) * sizeof(reg), -1); (PT_TRAP + 1) * sizeof(reg), -1);
return ret; return ret;
} }
@ -706,8 +706,9 @@ int gpr32_set_common(struct task_struct *target,
ubuf = u; ubuf = u;
pos *= sizeof(reg); pos *= sizeof(reg);
count *= sizeof(reg); count *= sizeof(reg);
return user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf, user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf,
(PT_TRAP + 1) * sizeof(reg), -1); (PT_TRAP + 1) * sizeof(reg), -1);
return 0;
Efault: Efault:
user_read_access_end(); user_read_access_end();

View File

@ -35,7 +35,7 @@ struct umem_info {
/* usable memory ranges to look up */ /* usable memory ranges to look up */
unsigned int nr_ranges; unsigned int nr_ranges;
const struct crash_mem_range *ranges; const struct range *ranges;
}; };
const struct kexec_file_ops * const kexec_file_loaders[] = { const struct kexec_file_ops * const kexec_file_loaders[] = {

View File

@ -33,7 +33,7 @@
static inline unsigned int get_max_nr_ranges(size_t size) static inline unsigned int get_max_nr_ranges(size_t size)
{ {
return ((size - sizeof(struct crash_mem)) / 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; return 0;
size = (sizeof(struct crash_mem) + 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. * 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) static void __merge_memory_ranges(struct crash_mem *mem_rngs)
{ {
struct crash_mem_range *ranges; struct range *ranges;
int i, idx; int i, idx;
if (!mem_rngs) 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() */ /* cmp_func_t callback to sort ranges with sort() */
static int rngcmp(const void *_x, const void *_y) 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) if (x->start > y->start)
return 1; return 1;

View File

@ -157,8 +157,8 @@ static int genregs_set(struct task_struct *target,
offsetof(struct pt_regs, pc), offsetof(struct pt_regs, pc),
sizeof(struct pt_regs)); sizeof(struct pt_regs));
if (!ret) if (!ret)
ret = user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf, user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf,
sizeof(struct pt_regs), -1); sizeof(struct pt_regs), -1);
return ret; return ret;
} }
@ -229,8 +229,8 @@ static int dspregs_set(struct task_struct *target,
ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf, regs, ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf, regs,
0, sizeof(struct pt_dspregs)); 0, sizeof(struct pt_dspregs));
if (!ret) if (!ret)
ret = user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf, user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf,
sizeof(struct pt_dspregs), -1); sizeof(struct pt_dspregs), -1);
return ret; return ret;
} }

View File

@ -158,8 +158,9 @@ static int genregs32_set(struct task_struct *target,
35 * sizeof(u32), 36 * sizeof(u32)); 35 * sizeof(u32), 36 * sizeof(u32));
if (ret || !count) if (ret || !count)
return ret; return ret;
return user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf, user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf, 36 * sizeof(u32),
36 * sizeof(u32), 38 * sizeof(u32)); 38 * sizeof(u32));
return 0;
} }
static int fpregs32_get(struct task_struct *target, static int fpregs32_get(struct task_struct *target,
@ -203,8 +204,8 @@ static int fpregs32_set(struct task_struct *target,
33 * sizeof(u32), 33 * sizeof(u32),
34 * sizeof(u32)); 34 * sizeof(u32));
if (!ret) if (!ret)
ret = user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf, user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf,
34 * sizeof(u32), -1); 34 * sizeof(u32), -1);
return ret; return ret;
} }

View File

@ -332,8 +332,8 @@ static int genregs64_set(struct task_struct *target,
} }
if (!ret) if (!ret)
ret = user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf, user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf,
36 * sizeof(u64), -1); 36 * sizeof(u64), -1);
return ret; return ret;
} }
@ -406,8 +406,8 @@ static int fpregs64_set(struct task_struct *target,
task_thread_info(target)->fpsaved[0] = fprs; task_thread_info(target)->fpsaved[0] = fprs;
if (!ret) if (!ret)
ret = user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf, user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf,
35 * sizeof(u64), -1); 35 * sizeof(u64), -1);
return ret; return ret;
} }
@ -473,10 +473,8 @@ static int setregs64_set(struct task_struct *target,
15 * sizeof(u64)); 15 * sizeof(u64));
if (ret) if (ret)
return ret; return ret;
ret =user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf, user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf,
15 * sizeof(u64), 16 * sizeof(u64)); 15 * sizeof(u64), 16 * sizeof(u64));
if (ret)
return ret;
/* TSTATE */ /* TSTATE */
ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf, ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf,
&tstate, &tstate,
@ -670,8 +668,9 @@ finish:
pos *= sizeof(reg); pos *= sizeof(reg);
count *= sizeof(reg); count *= sizeof(reg);
return user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf, user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf,
38 * sizeof(reg), -1); 38 * sizeof(reg), -1);
return 0;
} }
static int fpregs32_get(struct task_struct *target, 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; task_thread_info(target)->fpsaved[0] = fprs;
if (!ret) if (!ret)
ret = user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf, user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf,
34 * sizeof(u32), -1); 34 * sizeof(u32), -1);
return ret; return ret;
} }

View File

@ -1804,8 +1804,11 @@ static int rio_mport_add_riodev(struct mport_cdev_priv *priv,
rio_init_dbell_res(&rdev->riores[RIO_DOORBELL_RESOURCE], rio_init_dbell_res(&rdev->riores[RIO_DOORBELL_RESOURCE],
0, 0xffff); 0, 0xffff);
err = rio_add_device(rdev); err = rio_add_device(rdev);
if (err) if (err) {
goto cleanup; put_device(&rdev->dev);
return err;
}
rio_dev_get(rdev); rio_dev_get(rdev);
return 0; return 0;
@ -1901,10 +1904,6 @@ static int mport_cdev_open(struct inode *inode, struct file *filp)
priv->md = chdev; 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->db_filters);
INIT_LIST_HEAD(&priv->pw_filters); INIT_LIST_HEAD(&priv->pw_filters);
spin_lock_init(&priv->fifo_lock); 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, sizeof(struct rio_event) * MPORT_EVENT_DEPTH,
GFP_KERNEL); GFP_KERNEL);
if (ret < 0) { if (ret < 0) {
put_device(&chdev->dev);
dev_err(&chdev->dev, DRV_NAME ": kfifo_alloc failed\n"); dev_err(&chdev->dev, DRV_NAME ": kfifo_alloc failed\n");
ret = -ENOMEM; ret = -ENOMEM;
goto err_fifo; goto err_fifo;
@ -1923,6 +1923,9 @@ static int mport_cdev_open(struct inode *inode, struct file *filp)
spin_lock_init(&priv->req_lock); spin_lock_init(&priv->req_lock);
mutex_init(&priv->dma_lock); mutex_init(&priv->dma_lock);
#endif #endif
mutex_lock(&chdev->file_mutex);
list_add_tail(&priv->list, &chdev->file_list);
mutex_unlock(&chdev->file_mutex);
filp->private_data = priv; filp->private_data = priv;
goto out; goto out;

View File

@ -2941,7 +2941,8 @@ static void tsi721_remove(struct pci_dev *pdev)
tsi721_disable_ints(priv); tsi721_disable_ints(priv);
tsi721_free_irq(priv); tsi721_free_irq(priv);
flush_scheduled_work(); flush_work(&priv->idb_work);
flush_work(&priv->pw_work);
rio_unregister_mport(&priv->mport); rio_unregister_mport(&priv->mport);
tsi721_unregister_dma(priv); tsi721_unregister_dma(priv);

View File

@ -454,8 +454,12 @@ static struct rio_dev *rio_setup_device(struct rio_net *net,
0, 0xffff); 0, 0xffff);
ret = rio_add_device(rdev); ret = rio_add_device(rdev);
if (ret) if (ret) {
goto cleanup; if (rswitch)
kfree(rswitch->route_table);
put_device(&rdev->dev);
return NULL;
}
rio_dev_get(rdev); rio_dev_get(rdev);

View File

@ -2186,11 +2186,16 @@ int rio_register_mport(struct rio_mport *port)
atomic_set(&port->state, RIO_DEVICE_RUNNING); atomic_set(&port->state, RIO_DEVICE_RUNNING);
res = device_register(&port->dev); res = device_register(&port->dev);
if (res) if (res) {
dev_err(&port->dev, "RIO: mport%d registration failed ERR=%d\n", dev_err(&port->dev, "RIO: mport%d registration failed ERR=%d\n",
port->id, res); 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); dev_dbg(&port->dev, "RIO: registered mport%d\n", port->id);
}
return res; return res;
} }

View File

@ -325,6 +325,10 @@ static int format_corename(struct core_name *cn, struct coredump_params *cprm,
err = cn_printf(cn, "%lu", err = cn_printf(cn, "%lu",
rlimit(RLIMIT_CORE)); rlimit(RLIMIT_CORE));
break; break;
/* CPU the task ran on */
case 'C':
err = cn_printf(cn, "%d", cprm->cpu);
break;
default: default:
break; break;
} }
@ -534,6 +538,7 @@ void do_coredump(const kernel_siginfo_t *siginfo)
*/ */
.mm_flags = mm->flags, .mm_flags = mm->flags,
.vma_meta = NULL, .vma_meta = NULL,
.cpu = raw_smp_processor_id(),
}; };
audit_core_dumps(siginfo->si_signo); audit_core_dumps(siginfo->si_signo);

View File

@ -378,8 +378,8 @@ ssize_t debugfs_attr_read(struct file *file, char __user *buf,
} }
EXPORT_SYMBOL_GPL(debugfs_attr_read); EXPORT_SYMBOL_GPL(debugfs_attr_read);
ssize_t debugfs_attr_write(struct file *file, const char __user *buf, static ssize_t debugfs_attr_write_xsigned(struct file *file, const char __user *buf,
size_t len, loff_t *ppos) size_t len, loff_t *ppos, bool is_signed)
{ {
struct dentry *dentry = F_DENTRY(file); struct dentry *dentry = F_DENTRY(file);
ssize_t ret; ssize_t ret;
@ -387,12 +387,28 @@ ssize_t debugfs_attr_write(struct file *file, const char __user *buf,
ret = debugfs_file_get(dentry); ret = debugfs_file_get(dentry);
if (unlikely(ret)) if (unlikely(ret))
return 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); debugfs_file_put(dentry);
return ret; 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); 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, static struct dentry *debugfs_create_mode_unsafe(const char *name, umode_t mode,
struct dentry *parent, void *value, struct dentry *parent, void *value,
const struct file_operations *fops, 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); *val = atomic_read((atomic_t *)data);
return 0; 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"); 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"); "%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"); "%lld\n");
/** /**

View File

@ -17,7 +17,7 @@ struct fat_fid {
#define FAT_FID_SIZE_WITHOUT_PARENT 3 #define FAT_FID_SIZE_WITHOUT_PARENT 3
#define FAT_FID_SIZE_WITH_PARENT (sizeof(struct fat_fid)/sizeof(u32)) #define FAT_FID_SIZE_WITH_PARENT (sizeof(struct fat_fid)/sizeof(u32))
/** /*
* Look up a directory inode given its starting cluster. * Look up a directory inode given its starting cluster.
*/ */
static struct inode *fat_dget(struct super_block *sb, int i_logstart) 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; return type;
} }
/** /*
* Map a NFS file handle to a corresponding dentry. * Map a NFS file handle to a corresponding dentry.
* The dentry may or may not be connected to the filesystem root. * The dentry may or may not be connected to the filesystem root.
*/ */

View File

@ -458,6 +458,8 @@ int hfs_write_inode(struct inode *inode, struct writeback_control *wbc)
/* panic? */ /* panic? */
return -EIO; 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; fd.search_key->cat = HFS_I(main_inode)->cat_key;
if (hfs_brec_find(&fd)) if (hfs_brec_find(&fd))
/* panic? */ /* panic? */

View File

@ -109,7 +109,7 @@ void hfs_asc2mac(struct super_block *sb, struct hfs_name *out, const struct qstr
if (nls_io) { if (nls_io) {
wchar_t ch; wchar_t ch;
while (srclen > 0) { while (srclen > 0 && dstlen > 0) {
size = nls_io->char2uni(src, srclen, &ch); size = nls_io->char2uni(src, srclen, &ch);
if (size < 0) { if (size < 0) {
ch = '?'; ch = '?';

View File

@ -198,6 +198,8 @@ struct hfsplus_sb_info {
#define HFSPLUS_SB_HFSX 3 #define HFSPLUS_SB_HFSX 3
#define HFSPLUS_SB_CASEFOLD 4 #define HFSPLUS_SB_CASEFOLD 4
#define HFSPLUS_SB_NOBARRIER 5 #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) static inline struct hfsplus_sb_info *HFSPLUS_SB(struct super_block *sb)
{ {

View File

@ -192,11 +192,11 @@ static void hfsplus_get_perms(struct inode *inode,
mode = be16_to_cpu(perms->mode); mode = be16_to_cpu(perms->mode);
i_uid_write(inode, be32_to_cpu(perms->owner)); 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; inode->i_uid = sbi->uid;
i_gid_write(inode, be32_to_cpu(perms->group)); 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; inode->i_gid = sbi->gid;
if (dir) { if (dir) {

View File

@ -140,6 +140,8 @@ int hfsplus_parse_options(char *input, struct hfsplus_sb_info *sbi)
if (!uid_valid(sbi->uid)) { if (!uid_valid(sbi->uid)) {
pr_err("invalid uid specified\n"); pr_err("invalid uid specified\n");
return 0; return 0;
} else {
set_bit(HFSPLUS_SB_UID, &sbi->flags);
} }
break; break;
case opt_gid: case opt_gid:
@ -151,6 +153,8 @@ int hfsplus_parse_options(char *input, struct hfsplus_sb_info *sbi)
if (!gid_valid(sbi->gid)) { if (!gid_valid(sbi->gid)) {
pr_err("invalid gid specified\n"); pr_err("invalid gid specified\n");
return 0; return 0;
} else {
set_bit(HFSPLUS_SB_GID, &sbi->flags);
} }
break; break;
case opt_part: case opt_part:

View File

@ -995,8 +995,8 @@ out:
EXPORT_SYMBOL_GPL(simple_attr_read); EXPORT_SYMBOL_GPL(simple_attr_read);
/* interpret the buffer as a number to call the set function with */ /* interpret the buffer as a number to call the set function with */
ssize_t simple_attr_write(struct file *file, const char __user *buf, static ssize_t simple_attr_write_xsigned(struct file *file, const char __user *buf,
size_t len, loff_t *ppos) size_t len, loff_t *ppos, bool is_signed)
{ {
struct simple_attr *attr; struct simple_attr *attr;
unsigned long long val; unsigned long long val;
@ -1017,7 +1017,10 @@ ssize_t simple_attr_write(struct file *file, const char __user *buf,
goto out; goto out;
attr->set_buf[size] = '\0'; 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) if (ret)
goto out; goto out;
ret = attr->set(attr->data, val); ret = attr->set(attr->data, val);
@ -1027,8 +1030,21 @@ out:
mutex_unlock(&attr->mutex); mutex_unlock(&attr->mutex);
return ret; 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); 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 * generic_fh_to_dentry - generic helper for the fh_to_dentry export operation
* @sb: filesystem to do the file handle conversion on * @sb: filesystem to do the file handle conversion on

View File

@ -13,6 +13,7 @@
#include <linux/blkdev.h> #include <linux/blkdev.h>
#include <linux/backing-dev.h> #include <linux/backing-dev.h>
#include <linux/random.h> #include <linux/random.h>
#include <linux/log2.h>
#include <linux/crc32.h> #include <linux/crc32.h>
#include "nilfs.h" #include "nilfs.h"
#include "segment.h" #include "segment.h"
@ -192,6 +193,34 @@ static int nilfs_store_log_cursor(struct the_nilfs *nilfs,
return ret; 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 * load_nilfs - load and recover the nilfs
* @nilfs: the_nilfs structure to be released * @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); nilfs->ns_sbwtime = le64_to_cpu(sbp[0]->s_wtime);
/* verify consistency between two super blocks */ /* 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) { if (blocksize != nilfs->ns_blocksize) {
nilfs_warn(sb, nilfs_warn(sb,
"blocksize differs between two super blocks (%d != %d)", "blocksize differs between two super blocks (%d != %d)",
blocksize, nilfs->ns_blocksize); blocksize, nilfs->ns_blocksize);
err = -EINVAL;
goto scan_error; 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); 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) * unsigned int shift_bits = le32_to_cpu(sbp->s_log_block_size);
le32_to_cpu(sbp->s_blocks_per_segment)) << u32 blocks_per_segment = le32_to_cpu(sbp->s_blocks_per_segment);
(le32_to_cpu(sbp->s_log_block_size) + 10)); 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) 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) if (err)
goto failed_sbh; goto failed_sbh;
blocksize = BLOCK_SIZE << le32_to_cpu(sbp->s_log_block_size); err = nilfs_get_blocksize(sb, sbp, &blocksize);
if (blocksize < NILFS_MIN_BLOCK_SIZE || if (err)
blocksize > NILFS_MAX_BLOCK_SIZE) { goto failed_sbh;
if (blocksize < NILFS_MIN_BLOCK_SIZE) {
nilfs_err(sb, nilfs_err(sb,
"couldn't mount because of unsupported filesystem blocksize %d", "couldn't mount because of unsupported filesystem blocksize %d",
blocksize); blocksize);

View File

@ -335,7 +335,7 @@ static void o2hb_arm_timeout(struct o2hb_region *reg)
/* negotiate timeout must be less than write timeout. */ /* negotiate timeout must be less than write timeout. */
schedule_delayed_work(&reg->hr_nego_timeout_work, schedule_delayed_work(&reg->hr_nego_timeout_work,
msecs_to_jiffies(O2HB_NEGO_TIMEOUT_MS)); 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) 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) if (reg->hr_last_hb_status)
return; 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. */ /* lowest node as master node to make negotiate decision. */
master_node = find_first_bit(live_node_bitmap, O2NM_MAX_NODES); 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(&reg->hr_item), reg->hr_bdev); config_item_name(&reg->hr_item), reg->hr_bdev);
set_bit(master_node, reg->hr_nego_node_bitmap); set_bit(master_node, reg->hr_nego_node_bitmap);
} }
if (memcmp(reg->hr_nego_node_bitmap, live_node_bitmap, if (!bitmap_equal(reg->hr_nego_node_bitmap, live_node_bitmap,
sizeof(reg->hr_nego_node_bitmap))) { O2NM_MAX_NODES)) {
/* check negotiate bitmap every second to do timeout /* check negotiate bitmap every second to do timeout
* approve decision. * 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 * live nodes heartbeat on it. In other words, the region has been
* added to all nodes. * added to all nodes.
*/ */
if (memcmp(reg->hr_live_node_bitmap, o2hb_live_node_bitmap, if (!bitmap_equal(reg->hr_live_node_bitmap, o2hb_live_node_bitmap,
sizeof(o2hb_live_node_bitmap))) O2NM_MAX_NODES))
goto unlock; goto unlock;
printk(KERN_NOTICE "o2hb: Region %s (%pg) is now a quorum device\n", 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 * 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. * 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; i = -1;
while ((i = find_next_bit(live_node_bitmap, while ((i = find_next_bit(live_node_bitmap,
O2NM_MAX_NODES, i + 1)) < O2NM_MAX_NODES) { 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++) for (i = 0; i < ARRAY_SIZE(o2hb_live_slots); i++)
INIT_LIST_HEAD(&o2hb_live_slots[i]); INIT_LIST_HEAD(&o2hb_live_slots[i]);
memset(o2hb_live_node_bitmap, 0, sizeof(o2hb_live_node_bitmap)); bitmap_zero(o2hb_live_node_bitmap, O2NM_MAX_NODES);
memset(o2hb_region_bitmap, 0, sizeof(o2hb_region_bitmap)); bitmap_zero(o2hb_region_bitmap, O2NM_MAX_REGIONS);
memset(o2hb_live_region_bitmap, 0, sizeof(o2hb_live_region_bitmap)); bitmap_zero(o2hb_live_region_bitmap, O2NM_MAX_REGIONS);
memset(o2hb_quorum_region_bitmap, 0, sizeof(o2hb_quorum_region_bitmap)); bitmap_zero(o2hb_quorum_region_bitmap, O2NM_MAX_REGIONS);
memset(o2hb_failed_region_bitmap, 0, sizeof(o2hb_failed_region_bitmap)); bitmap_zero(o2hb_failed_region_bitmap, O2NM_MAX_REGIONS);
o2hb_dependent_users = 0; 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 */ /* 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, 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))); bitmap_copy(map, o2hb_live_node_bitmap, bits);
memcpy(map, &o2hb_live_node_bitmap, bytes);
} }
/* /*
* get a map of all nodes that are heartbeating in any regions * 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 /* callers want to serialize this map and callbacks so that they
* can trust that they don't miss nodes coming to the party */ * can trust that they don't miss nodes coming to the party */
down_read(&o2hb_callback_sem); down_read(&o2hb_callback_sem);
spin_lock(&o2hb_live_lock); 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); spin_unlock(&o2hb_live_lock);
up_read(&o2hb_callback_sem); 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)]; unsigned long testing_map[BITS_TO_LONGS(O2NM_MAX_NODES)];
spin_lock(&o2hb_live_lock); 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); spin_unlock(&o2hb_live_lock);
if (!test_bit(node_num, testing_map)) { if (!test_bit(node_num, testing_map)) {
mlog(ML_HEARTBEAT, 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)]; 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)) { if (!test_bit(node_num, testing_map)) {
mlog(ML_HEARTBEAT, mlog(ML_HEARTBEAT,
"node (%u) does not have heartbeating enabled.\n", "node (%u) does not have heartbeating enabled.\n",

View File

@ -59,7 +59,7 @@ int o2hb_register_callback(const char *region_uuid,
void o2hb_unregister_callback(const char *region_uuid, void o2hb_unregister_callback(const char *region_uuid,
struct o2hb_callback_func *hc); struct o2hb_callback_func *hc);
void o2hb_fill_node_map(unsigned long *map, void o2hb_fill_node_map(unsigned long *map,
unsigned bytes); unsigned int bits);
void o2hb_exit(void); void o2hb_exit(void);
void o2hb_init(void); void o2hb_init(void);
int o2hb_check_node_heartbeating_no_sem(u8 node_num); int o2hb_check_node_heartbeating_no_sem(u8 node_num);

View File

@ -438,7 +438,7 @@ static int o2net_fill_bitmap(char *buf, int len)
unsigned long map[BITS_TO_LONGS(O2NM_MAX_NODES)]; unsigned long map[BITS_TO_LONGS(O2NM_MAX_NODES)];
int i = -1, out = 0; 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) while ((i = find_next_bit(map, O2NM_MAX_NODES, i + 1)) < O2NM_MAX_NODES)
out += scnprintf(buf + out, PAGE_SIZE - out, "%d ", i); out += scnprintf(buf + out, PAGE_SIZE - out, "%d ", i);

View File

@ -54,7 +54,7 @@ int o2nm_configured_node_map(unsigned long *map, unsigned bytes)
return -EINVAL; return -EINVAL;
read_lock(&cluster->cl_nodes_lock); 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); read_unlock(&cluster->cl_nodes_lock);
return 0; return 0;

View File

@ -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 */ /* 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; struct o2net_sock_container *sc;
int node, ret; int node, ret;
BUG_ON(bytes < (BITS_TO_LONGS(O2NM_MAX_NODES) * sizeof(unsigned long))); bitmap_zero(map, bits);
memset(map, 0, bytes);
for (node = 0; node < O2NM_MAX_NODES; ++node) { for (node = 0; node < O2NM_MAX_NODES; ++node) {
if (!o2net_tx_can_proceed(o2net_nn_from_num(node), &sc, &ret)) if (!o2net_tx_can_proceed(o2net_nn_from_num(node), &sc, &ret))
continue; continue;

View File

@ -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, static inline void dlm_node_iter_init(unsigned long *map,
struct dlm_node_iter *iter) 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; iter->curnode = -1;
} }

View File

@ -1576,8 +1576,8 @@ static int dlm_should_restart_join(struct dlm_ctxt *dlm,
spin_lock(&dlm->spinlock); spin_lock(&dlm->spinlock);
/* For now, we restart the process if the node maps have /* For now, we restart the process if the node maps have
* changed at all */ * changed at all */
ret = memcmp(ctxt->live_map, dlm->live_nodes_map, ret = !bitmap_equal(ctxt->live_map, dlm->live_nodes_map,
sizeof(dlm->live_nodes_map)); O2NM_MAX_NODES);
spin_unlock(&dlm->spinlock); spin_unlock(&dlm->spinlock);
if (ret) 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 /* group sem locking should work for us here -- we're already
* registered for heartbeat events so filling this should be * registered for heartbeat events so filling this should be
* atomic wrt getting those handlers called. */ * 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); 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); __dlm_set_joining_node(dlm, dlm->node_num);
spin_unlock(&dlm->spinlock); spin_unlock(&dlm->spinlock);
node = -1; 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 * yes_resp_map. Copy that into our domain map and send a join
* assert message to clean up everyone elses state. */ * assert message to clean up everyone elses state. */
spin_lock(&dlm->spinlock); spin_lock(&dlm->spinlock);
memcpy(dlm->domain_map, ctxt->yes_resp_map, bitmap_copy(dlm->domain_map, ctxt->yes_resp_map, O2NM_MAX_NODES);
sizeof(ctxt->yes_resp_map));
set_bit(dlm->node_num, dlm->domain_map); set_bit(dlm->node_num, dlm->domain_map);
spin_unlock(&dlm->spinlock); 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", mlog(0, "dlm->recovery_map=%p, &(dlm->recovery_map[0])=%p\n",
dlm->recovery_map, &(dlm->recovery_map[0])); dlm->recovery_map, &(dlm->recovery_map[0]));
memset(dlm->recovery_map, 0, sizeof(dlm->recovery_map)); bitmap_zero(dlm->recovery_map, O2NM_MAX_NODES);
memset(dlm->live_nodes_map, 0, sizeof(dlm->live_nodes_map)); bitmap_zero(dlm->live_nodes_map, O2NM_MAX_NODES);
memset(dlm->domain_map, 0, sizeof(dlm->domain_map)); bitmap_zero(dlm->domain_map, O2NM_MAX_NODES);
dlm->dlm_thread_task = NULL; dlm->dlm_thread_task = NULL;
dlm->dlm_reco_thread_task = NULL; dlm->dlm_reco_thread_task = NULL;

View File

@ -258,12 +258,12 @@ static void dlm_init_mle(struct dlm_master_list_entry *mle,
mle->type = type; mle->type = type;
INIT_HLIST_NODE(&mle->master_hash_node); INIT_HLIST_NODE(&mle->master_hash_node);
INIT_LIST_HEAD(&mle->hb_events); 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); spin_lock_init(&mle->spinlock);
init_waitqueue_head(&mle->wq); init_waitqueue_head(&mle->wq);
atomic_set(&mle->woken, 0); atomic_set(&mle->woken, 0);
kref_init(&mle->mle_refs); 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->master = O2NM_MAX_NODES;
mle->new_master = O2NM_MAX_NODES; mle->new_master = O2NM_MAX_NODES;
mle->inuse = 0; 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]); atomic_inc(&dlm->mle_cur_count[mle->type]);
/* copy off the node_map and register hb callbacks on our copy */ /* copy off the node_map and register hb callbacks on our copy */
memcpy(mle->node_map, dlm->domain_map, sizeof(mle->node_map)); bitmap_copy(mle->node_map, dlm->domain_map, O2NM_MAX_NODES);
memcpy(mle->vote_map, dlm->domain_map, sizeof(mle->vote_map)); 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->vote_map);
clear_bit(dlm->node_num, mle->node_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); spin_unlock(&dlm->track_lock);
memset(res->lvb, 0, DLM_LVB_LEN); 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, struct dlm_lock_resource *dlm_new_lockres(struct dlm_ctxt *dlm,
@ -1036,10 +1036,10 @@ recheck:
spin_lock(&mle->spinlock); spin_lock(&mle->spinlock);
m = mle->master; m = mle->master;
map_changed = (memcmp(mle->vote_map, mle->node_map, map_changed = !bitmap_equal(mle->vote_map, mle->node_map,
sizeof(mle->vote_map)) != 0); O2NM_MAX_NODES);
voting_done = (memcmp(mle->vote_map, mle->response_map, voting_done = bitmap_equal(mle->vote_map, mle->response_map,
sizeof(mle->vote_map)) == 0); O2NM_MAX_NODES);
/* restart if we hit any errors */ /* restart if we hit any errors */
if (map_changed) { 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 /* now blank out everything, as if we had never
* contacted anyone */ * contacted anyone */
memset(mle->maybe_map, 0, sizeof(mle->maybe_map)); bitmap_zero(mle->maybe_map, O2NM_MAX_NODES);
memset(mle->response_map, 0, sizeof(mle->response_map)); bitmap_zero(mle->response_map, O2NM_MAX_NODES);
/* reset the vote_map to the current node_map */ /* reset the vote_map to the current node_map */
memcpy(mle->vote_map, mle->node_map, bitmap_copy(mle->vote_map, mle->node_map,
sizeof(mle->node_map)); O2NM_MAX_NODES);
/* put myself into the maybe map */ /* put myself into the maybe map */
if (mle->type != DLM_MLE_BLOCK) if (mle->type != DLM_MLE_BLOCK)
set_bit(dlm->node_num, mle->maybe_map); 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; flags = item->u.am.flags;
spin_lock(&dlm->spinlock); spin_lock(&dlm->spinlock);
memcpy(nodemap, dlm->domain_map, sizeof(nodemap)); bitmap_copy(nodemap, dlm->domain_map, O2NM_MAX_NODES);
spin_unlock(&dlm->spinlock); spin_unlock(&dlm->spinlock);
clear_bit(dlm->node_num, nodemap); 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; 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); set_bit(old_master, iter.node_map);
mlog(0, "doing assert master of %.*s back to %u\n", mlog(0, "doing assert master of %.*s back to %u\n",
res->lockname.len, res->lockname.name, old_master); res->lockname.len, res->lockname.name, old_master);

View File

@ -733,7 +733,7 @@ static int dlm_init_recovery_area(struct dlm_ctxt *dlm, u8 dead_node)
struct dlm_reco_node_data *ndata; struct dlm_reco_node_data *ndata;
spin_lock(&dlm->spinlock); 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 /* nodes can only be removed (by dying) after dropping
* this lock, and death will be trapped later, so this should do */ * this lock, and death will be trapped later, so this should do */
spin_unlock(&dlm->spinlock); spin_unlock(&dlm->spinlock);

View File

@ -157,7 +157,7 @@ static void ocfs2_queue_replay_slots(struct ocfs2_super *osb,
replay_map->rm_state = REPLAY_DONE; 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; struct ocfs2_replay_map *replay_map = osb->replay_map;

View File

@ -150,6 +150,7 @@ int ocfs2_recovery_init(struct ocfs2_super *osb);
void ocfs2_recovery_exit(struct ocfs2_super *osb); void ocfs2_recovery_exit(struct ocfs2_super *osb);
int ocfs2_compute_replay_slots(struct ocfs2_super *osb); int ocfs2_compute_replay_slots(struct ocfs2_super *osb);
void ocfs2_free_replay_slots(struct ocfs2_super *osb);
/* /*
* Journal Control: * Journal Control:
* Initialize, Load, Shutdown, Wipe a journal. * Initialize, Load, Shutdown, Wipe a journal.

View File

@ -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 nlink = le16_to_cpu(di->i_links_count);
u32 hi = le16_to_cpu(di->i_links_count_hi); 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; return nlink;
} }

View File

@ -273,17 +273,17 @@ static int o2cb_cluster_check(void)
*/ */
#define O2CB_MAP_STABILIZE_COUNT 60 #define O2CB_MAP_STABILIZE_COUNT 60
for (i = 0; i < O2CB_MAP_STABILIZE_COUNT; ++i) { 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)) { if (!test_bit(node_num, hbmap)) {
printk(KERN_ERR "o2cb: %s heartbeat has not been " printk(KERN_ERR "o2cb: %s heartbeat has not been "
"started.\n", (o2hb_global_heartbeat_active() ? "started.\n", (o2hb_global_heartbeat_active() ?
"Global" : "Local")); "Global" : "Local"));
return -EINVAL; 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 */ /* Force set the current node to allow easy compare */
set_bit(node_num, netmap); set_bit(node_num, netmap);
if (!memcmp(hbmap, netmap, sizeof(hbmap))) if (bitmap_equal(hbmap, netmap, O2NM_MAX_NODES))
return 0; return 0;
if (i < O2CB_MAP_STABILIZE_COUNT - 1) if (i < O2CB_MAP_STABILIZE_COUNT - 1)
msleep(1000); msleep(1000);

View File

@ -669,6 +669,8 @@ static struct ctl_table_header *ocfs2_table_header;
static int __init ocfs2_stack_glue_init(void) static int __init ocfs2_stack_glue_init(void)
{ {
int ret;
strcpy(cluster_stack_name, OCFS2_STACK_PLUGIN_O2CB); strcpy(cluster_stack_name, OCFS2_STACK_PLUGIN_O2CB);
ocfs2_table_header = register_sysctl("fs/ocfs2/nm", ocfs2_nm_table); 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 -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) static void __exit ocfs2_stack_glue_exit(void)

View File

@ -1159,6 +1159,7 @@ static int ocfs2_fill_super(struct super_block *sb, void *data, int silent)
out_dismount: out_dismount:
atomic_set(&osb->vol_state, VOLUME_DISABLED); atomic_set(&osb->vol_state, VOLUME_DISABLED);
wake_up(&osb->osb_mount_event); wake_up(&osb->osb_mount_event);
ocfs2_free_replay_slots(osb);
ocfs2_dismount_volume(sb, 1); ocfs2_dismount_volume(sb, 1);
goto out; goto out;
@ -1822,12 +1823,14 @@ static int ocfs2_mount_volume(struct super_block *sb)
status = ocfs2_truncate_log_init(osb); status = ocfs2_truncate_log_init(osb);
if (status < 0) { if (status < 0) {
mlog_errno(status); mlog_errno(status);
goto out_system_inodes; goto out_check_volume;
} }
ocfs2_super_unlock(osb, 1); ocfs2_super_unlock(osb, 1);
return 0; return 0;
out_check_volume:
ocfs2_free_replay_slots(osb);
out_system_inodes: out_system_inodes:
if (osb->local_alloc_state == OCFS2_LA_ENABLED) if (osb->local_alloc_state == OCFS2_LA_ENABLED)
ocfs2_shutdown_local_alloc(osb); ocfs2_shutdown_local_alloc(osb);

View File

@ -3,6 +3,7 @@
#include <linux/init.h> #include <linux/init.h>
#include <linux/proc_fs.h> #include <linux/proc_fs.h>
#include <linux/seq_file.h> #include <linux/seq_file.h>
#include "internal.h"
static int cmdline_proc_show(struct seq_file *m, void *v) 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) 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; return 0;
} }
fs_initcall(proc_cmdline_init); fs_initcall(proc_cmdline_init);

View File

@ -7,6 +7,7 @@
#include <linux/namei.h> #include <linux/namei.h>
#include <linux/pid.h> #include <linux/pid.h>
#include <linux/ptrace.h> #include <linux/ptrace.h>
#include <linux/bitmap.h>
#include <linux/security.h> #include <linux/security.h>
#include <linux/file.h> #include <linux/file.h>
#include <linux/seq_file.h> #include <linux/seq_file.h>
@ -279,6 +280,30 @@ out:
return 0; 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) static int proc_readfd(struct file *file, struct dir_context *ctx)
{ {
return proc_readfd_common(file, ctx, proc_fd_instantiate); return proc_readfd_common(file, ctx, proc_fd_instantiate);
@ -319,9 +344,29 @@ int proc_fd_permission(struct user_namespace *mnt_userns,
return rv; 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 = { const struct inode_operations proc_fd_inode_operations = {
.lookup = proc_lookupfd, .lookup = proc_lookupfd,
.permission = proc_fd_permission, .permission = proc_fd_permission,
.getattr = proc_fd_getattr,
.setattr = proc_setattr, .setattr = proc_setattr,
}; };

View File

@ -1567,6 +1567,7 @@ static int __init vmcore_init(void)
return rc; return rc;
rc = parse_crash_elf_headers(); rc = parse_crash_elf_headers();
if (rc) { if (rc) {
elfcorehdr_free(elfcorehdr_addr);
pr_warn("Kdump: vmcore not initialized\n"); pr_warn("Kdump: vmcore not initialized\n");
return rc; return rc;
} }

View File

@ -54,9 +54,35 @@ config SQUASHFS_FILE_DIRECT
endchoice endchoice
choice config SQUASHFS_DECOMP_SINGLE
prompt "Decompressor parallelisation options"
depends on SQUASHFS 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 help
Squashfs now supports three parallelisation options for Squashfs now supports three parallelisation options for
decompression. Each one exhibits various trade-offs between decompression. Each one exhibits various trade-offs between
@ -64,15 +90,17 @@ choice
If in doubt, select "Single threaded compression" If in doubt, select "Single threaded compression"
config SQUASHFS_DECOMP_SINGLE config SQUASHFS_COMPILE_DECOMP_SINGLE
bool "Single threaded compression" bool "Single threaded compression"
select SQUASHFS_DECOMP_SINGLE
help help
Traditionally Squashfs has used single-threaded decompression. Traditionally Squashfs has used single-threaded decompression.
Only one block (data or metadata) can be decompressed at any Only one block (data or metadata) can be decompressed at any
one time. This limits CPU and memory usage to a minimum. 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" bool "Use multiple decompressors for parallel I/O"
select SQUASHFS_DECOMP_MULTI
help help
By default Squashfs uses a single decompressor but it gives By default Squashfs uses a single decompressor but it gives
poor performance on parallel I/O workloads when using multiple CPU 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 decompressors per core. It dynamically allocates decompressors
on a demand basis. on a demand basis.
config SQUASHFS_DECOMP_MULTI_PERCPU config SQUASHFS_COMPILE_DECOMP_MULTI_PERCPU
bool "Use percpu multiple decompressors for parallel I/O" bool "Use percpu multiple decompressors for parallel I/O"
select SQUASHFS_DECOMP_MULTI_PERCPU
help help
By default Squashfs uses a single decompressor but it gives By default Squashfs uses a single decompressor but it gives
poor performance on parallel I/O workloads when using multiple CPU 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 This decompressor implementation uses a maximum of one
decompressor per core. It uses percpu variables to ensure decompressor per core. It uses percpu variables to ensure
decompression is load-balanced across the cores. decompression is load-balanced across the cores.
endchoice 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 config SQUASHFS_XATTR
bool "Squashfs XATTR support" bool "Squashfs XATTR support"
depends on SQUASHFS depends on SQUASHFS

View File

@ -216,7 +216,7 @@ int squashfs_read_data(struct super_block *sb, u64 index, int length,
res = -EIO; res = -EIO;
goto out_free_bio; goto out_free_bio;
} }
res = squashfs_decompress(msblk, bio, offset, length, output); res = msblk->thread_ops->decompress(msblk, bio, offset, length, output);
} else { } else {
res = copy_bio_to_actor(bio, output, offset, length); res = copy_bio_to_actor(bio, output, offset, length);
} }

View File

@ -134,7 +134,7 @@ void *squashfs_decompressor_setup(struct super_block *sb, unsigned short flags)
if (IS_ERR(comp_opts)) if (IS_ERR(comp_opts))
return comp_opts; return comp_opts;
stream = squashfs_decompressor_create(msblk, comp_opts); stream = msblk->thread_ops->create(msblk, comp_opts);
if (IS_ERR(stream)) if (IS_ERR(stream))
kfree(comp_opts); kfree(comp_opts);

View File

@ -29,12 +29,11 @@
#define MAX_DECOMPRESSOR (num_online_cpus() * 2) #define MAX_DECOMPRESSOR (num_online_cpus() * 2)
int squashfs_max_decompressors(void) static int squashfs_max_decompressors(void)
{ {
return MAX_DECOMPRESSOR; return MAX_DECOMPRESSOR;
} }
struct squashfs_stream { struct squashfs_stream {
void *comp_opts; void *comp_opts;
struct list_head strm_list; struct list_head strm_list;
@ -59,7 +58,7 @@ static void put_decomp_stream(struct decomp_stream *decomp_strm,
wake_up(&stream->wait); 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) void *comp_opts)
{ {
struct squashfs_stream *stream; 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; struct squashfs_stream *stream = msblk->stream;
if (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, * If there is no available decomp and already full,
* let's wait for releasing decomp from other users. * 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; goto wait;
/* Let's allocate new decomp */ /* Let's allocate new decomp */
@ -161,7 +160,7 @@ static struct decomp_stream *get_decomp_stream(struct squashfs_sb_info *msblk,
} }
stream->avail_decomp++; stream->avail_decomp++;
WARN_ON(stream->avail_decomp > MAX_DECOMPRESSOR); WARN_ON(stream->avail_decomp > msblk->max_thread_num);
mutex_unlock(&stream->mutex); mutex_unlock(&stream->mutex);
break; 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, int offset, int length,
struct squashfs_page_actor *output) struct squashfs_page_actor *output)
{ {
@ -195,3 +194,10 @@ int squashfs_decompress(struct squashfs_sb_info *msblk, struct bio *bio,
msblk->decompressor->name); msblk->decompressor->name);
return res; 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,
};

View File

@ -25,7 +25,7 @@ struct squashfs_stream {
local_lock_t lock; 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) void *comp_opts)
{ {
struct squashfs_stream *stream; struct squashfs_stream *stream;
@ -59,7 +59,7 @@ out:
return ERR_PTR(err); 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 *percpu =
(struct squashfs_stream __percpu *) msblk->stream; (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) int offset, int length, struct squashfs_page_actor *output)
{ {
struct squashfs_stream *stream; struct squashfs_stream *stream;
struct squashfs_stream __percpu *percpu =
(struct squashfs_stream __percpu *) msblk->stream;
int res; int res;
local_lock(&msblk->stream->lock); local_lock(&percpu->lock);
stream = this_cpu_ptr(msblk->stream); stream = this_cpu_ptr(percpu);
res = msblk->decompressor->decompress(msblk, stream->stream, bio, res = msblk->decompressor->decompress(msblk, stream->stream, bio,
offset, length, output); offset, length, output);
local_unlock(&msblk->stream->lock); local_unlock(&percpu->lock);
if (res < 0) if (res < 0)
ERROR("%s decompression failed, data probably corrupt\n", 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; return res;
} }
int squashfs_max_decompressors(void) static int squashfs_max_decompressors(void)
{ {
return num_possible_cpus(); 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,
};

View File

@ -24,7 +24,7 @@ struct squashfs_stream {
struct mutex mutex; 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) void *comp_opts)
{ {
struct squashfs_stream *stream; struct squashfs_stream *stream;
@ -49,7 +49,7 @@ out:
return ERR_PTR(err); 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; 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, int offset, int length,
struct squashfs_page_actor *output) struct squashfs_page_actor *output)
{ {
@ -78,7 +78,14 @@ int squashfs_decompress(struct squashfs_sb_info *msblk, struct bio *bio,
return res; return res;
} }
int squashfs_max_decompressors(void) static int squashfs_max_decompressors(void)
{ {
return 1; 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,
};

View File

@ -38,11 +38,24 @@ extern const struct squashfs_decompressor *squashfs_lookup_decompressor(int);
extern void *squashfs_decompressor_setup(struct super_block *, unsigned short); extern void *squashfs_decompressor_setup(struct super_block *, unsigned short);
/* decompressor_xxx.c */ /* decompressor_xxx.c */
extern void *squashfs_decompressor_create(struct squashfs_sb_info *, void *);
extern void squashfs_decompressor_destroy(struct squashfs_sb_info *); struct squashfs_decompressor_thread_ops {
extern int squashfs_decompress(struct squashfs_sb_info *, struct bio *, void * (*create)(struct squashfs_sb_info *msblk, void *comp_opts);
int, int, struct squashfs_page_actor *); void (*destroy)(struct squashfs_sb_info *msblk);
extern int squashfs_max_decompressors(void); 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 */ /* export.c */
extern __le64 *squashfs_read_inode_lookup_table(struct super_block *, u64, u64, extern __le64 *squashfs_read_inode_lookup_table(struct super_block *, u64, u64,

View File

@ -53,7 +53,7 @@ struct squashfs_sb_info {
__le64 *xattr_id_table; __le64 *xattr_id_table;
struct mutex meta_index_mutex; struct mutex meta_index_mutex;
struct meta_index *meta_index; struct meta_index *meta_index;
struct squashfs_stream *stream; void *stream;
__le64 *inode_lookup_table; __le64 *inode_lookup_table;
u64 inode_table; u64 inode_table;
u64 directory_table; u64 directory_table;
@ -66,5 +66,7 @@ struct squashfs_sb_info {
int xattr_ids; int xattr_ids;
unsigned int ids; unsigned int ids;
bool panic_on_errors; bool panic_on_errors;
const struct squashfs_decompressor_thread_ops *thread_ops;
int max_thread_num;
}; };
#endif #endif

View File

@ -47,10 +47,13 @@ enum Opt_errors {
enum squashfs_param { enum squashfs_param {
Opt_errors, Opt_errors,
Opt_threads,
}; };
struct squashfs_mount_opts { struct squashfs_mount_opts {
enum Opt_errors errors; enum Opt_errors errors;
const struct squashfs_decompressor_thread_ops *thread_ops;
int thread_num;
}; };
static const struct constant_table squashfs_param_errors[] = { 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[] = { static const struct fs_parameter_spec squashfs_fs_parameters[] = {
fsparam_enum("errors", Opt_errors, squashfs_param_errors), 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) static int squashfs_parse_param(struct fs_context *fc, struct fs_parameter *param)
{ {
struct squashfs_mount_opts *opts = fc->fs_private; 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: case Opt_errors:
opts->errors = result.uint_32; opts->errors = result.uint_32;
break; break;
case Opt_threads:
if (squashfs_parse_param_threads(param->string, opts) != 0)
return -EINVAL;
break;
default: default:
return -EINVAL; return -EINVAL;
} }
@ -133,6 +197,7 @@ static int squashfs_fill_super(struct super_block *sb, struct fs_context *fc)
return -ENOMEM; return -ENOMEM;
} }
msblk = sb->s_fs_info; msblk = sb->s_fs_info;
msblk->thread_ops = opts->thread_ops;
msblk->panic_on_errors = (opts->errors == Opt_errors_panic); 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; 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 */ /* Check the MAJOR & MINOR versions and lookup compression type */
msblk->decompressor = supported_squashfs_filesystem( msblk->decompressor = supported_squashfs_filesystem(
fc, fc,
@ -252,7 +323,7 @@ static int squashfs_fill_super(struct super_block *sb, struct fs_context *fc)
/* Allocate read_page block */ /* Allocate read_page block */
msblk->read_page = squashfs_cache_init("data", 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) { if (msblk->read_page == NULL) {
errorf(fc, "Failed to allocate read_page block"); errorf(fc, "Failed to allocate read_page block");
goto failed_mount; goto failed_mount;
@ -383,7 +454,7 @@ failed_mount:
squashfs_cache_delete(msblk->block_cache); squashfs_cache_delete(msblk->block_cache);
squashfs_cache_delete(msblk->fragment_cache); squashfs_cache_delete(msblk->fragment_cache);
squashfs_cache_delete(msblk->read_page); squashfs_cache_delete(msblk->read_page);
squashfs_decompressor_destroy(msblk); msblk->thread_ops->destroy(msblk);
kfree(msblk->inode_lookup_table); kfree(msblk->inode_lookup_table);
kfree(msblk->fragment_index); kfree(msblk->fragment_index);
kfree(msblk->id_table); kfree(msblk->id_table);
@ -435,6 +506,19 @@ static int squashfs_show_options(struct seq_file *s, struct dentry *root)
else else
seq_puts(s, ",errors=continue"); 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; return 0;
} }
@ -446,6 +530,16 @@ static int squashfs_init_fs_context(struct fs_context *fc)
if (!opts) if (!opts)
return -ENOMEM; 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->fs_private = opts;
fc->ops = &squashfs_context_ops; fc->ops = &squashfs_context_ops;
return 0; 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->block_cache);
squashfs_cache_delete(sbi->fragment_cache); squashfs_cache_delete(sbi->fragment_cache);
squashfs_cache_delete(sbi->read_page); squashfs_cache_delete(sbi->read_page);
squashfs_decompressor_destroy(sbi); sbi->thread_ops->destroy(sbi);
kfree(sbi->id_table); kfree(sbi->id_table);
kfree(sbi->fragment_index); kfree(sbi->fragment_index);
kfree(sbi->meta_index); kfree(sbi->meta_index);

View File

@ -22,6 +22,7 @@ struct coredump_params {
struct file *file; struct file *file;
unsigned long limit; unsigned long limit;
unsigned long mm_flags; unsigned long mm_flags;
int cpu;
loff_t written; loff_t written;
loff_t pos; loff_t pos;
loff_t to_skip; loff_t to_skip;

View File

@ -45,7 +45,7 @@ struct debugfs_u32_array {
extern struct dentry *arch_debugfs_dir; 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) \ static int __fops ## _open(struct inode *inode, struct file *file) \
{ \ { \
__simple_attr_check_format(__fmt, 0ull); \ __simple_attr_check_format(__fmt, 0ull); \
@ -56,10 +56,16 @@ static const struct file_operations __fops = { \
.open = __fops ## _open, \ .open = __fops ## _open, \
.release = simple_attr_release, \ .release = simple_attr_release, \
.read = debugfs_attr_read, \ .read = debugfs_attr_read, \
.write = debugfs_attr_write, \ .write = (__is_signed) ? debugfs_attr_write_signed : debugfs_attr_write, \
.llseek = no_llseek, \ .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 *); typedef struct vfsmount *(*debugfs_automount_t)(struct dentry *, void *);
#if defined(CONFIG_DEBUG_FS) #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); size_t len, loff_t *ppos);
ssize_t debugfs_attr_write(struct file *file, const char __user *buf, ssize_t debugfs_attr_write(struct file *file, const char __user *buf,
size_t len, loff_t *ppos); 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 *debugfs_rename(struct dentry *old_dir, struct dentry *old_dentry,
struct dentry *new_dir, const char *new_name); struct dentry *new_dir, const char *new_name);
@ -254,6 +262,13 @@ static inline ssize_t debugfs_attr_write(struct file *file,
return -ENODEV; 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, static inline struct dentry *debugfs_rename(struct dentry *old_dir, struct dentry *old_dentry,
struct dentry *new_dir, char *new_name) struct dentry *new_dir, char *new_name)
{ {

View File

@ -61,7 +61,7 @@ static inline struct eventfd_ctx *eventfd_ctx_fdget(int fd)
return ERR_PTR(-ENOSYS); 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; return -ENOSYS;
} }

View File

@ -3513,7 +3513,7 @@ void simple_transaction_set(struct file *file, size_t n);
* All attributes contain a text representation of a numeric value * All attributes contain a text representation of a numeric value
* that are accessed with the get() and set() functions. * 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) \ static int __fops ## _open(struct inode *inode, struct file *file) \
{ \ { \
__simple_attr_check_format(__fmt, 0ull); \ __simple_attr_check_format(__fmt, 0ull); \
@ -3524,10 +3524,16 @@ static const struct file_operations __fops = { \
.open = __fops ## _open, \ .open = __fops ## _open, \
.release = simple_attr_release, \ .release = simple_attr_release, \
.read = simple_attr_read, \ .read = simple_attr_read, \
.write = simple_attr_write, \ .write = (__is_signed) ? simple_attr_write_signed : simple_attr_write, \
.llseek = generic_file_llseek, \ .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) static inline __printf(1, 2)
void __simple_attr_check_format(const char *fmt, ...) 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); size_t len, loff_t *ppos);
ssize_t simple_attr_write(struct file *file, const char __user *buf, ssize_t simple_attr_write(struct file *file, const char __user *buf,
size_t len, loff_t *ppos); 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; struct ctl_table;
int __init list_bdev_fs_names(char *buf, size_t size); int __init list_bdev_fs_names(char *buf, size_t size);

View File

@ -2,7 +2,9 @@
#ifndef _LINUX_INIT_H #ifndef _LINUX_INIT_H
#define _LINUX_INIT_H #define _LINUX_INIT_H
#include <linux/build_bug.h>
#include <linux/compiler.h> #include <linux/compiler.h>
#include <linux/stringify.h>
#include <linux/types.h> #include <linux/types.h>
/* Built-in __init functions needn't be compiled with retpoline */ /* 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 int do_one_initcall(initcall_t fn);
extern char __initdata boot_command_line[]; extern char __initdata boot_command_line[];
extern char *saved_command_line; extern char *saved_command_line;
extern unsigned int saved_command_line_len;
extern unsigned int reset_devices; extern unsigned int reset_devices;
/* used by init/main.c */ /* used by init/main.c */

View File

@ -213,7 +213,7 @@ io_mapping_free(struct io_mapping *iomap)
kfree(iomap); kfree(iomap);
} }
#endif /* _LINUX_IO_MAPPING_H */
int io_mapping_map_user(struct io_mapping *iomap, struct vm_area_struct *vma, int io_mapping_map_user(struct io_mapping *iomap, struct vm_area_struct *vma,
unsigned long addr, unsigned long pfn, unsigned long size); unsigned long addr, unsigned long pfn, unsigned long size);
#endif /* _LINUX_IO_MAPPING_H */

View File

@ -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 * 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 * 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 * https://bugzilla.kernel.org/show_bug.cgi?id=210337
*/ */

View File

@ -17,6 +17,7 @@
#include <linux/crash_core.h> #include <linux/crash_core.h>
#include <asm/io.h> #include <asm/io.h>
#include <linux/range.h>
#include <uapi/linux/kexec.h> #include <uapi/linux/kexec.h>
#include <linux/verification.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 */ /* Alignment required for elf header segment */
#define ELF_CORE_HEADER_ALIGN 4096 #define ELF_CORE_HEADER_ALIGN 4096
struct crash_mem_range {
u64 start, end;
};
struct crash_mem { struct crash_mem {
unsigned int max_nr_ranges; unsigned int max_nr_ranges;
unsigned int nr_ranges; unsigned int nr_ranges;
struct crash_mem_range ranges[]; struct range ranges[];
}; };
extern int crash_exclude_mem_range(struct crash_mem *mem, extern int crash_exclude_mem_range(struct crash_mem *mem,

View File

@ -37,6 +37,28 @@
__cmp(x, y, op), \ __cmp(x, y, op), \
__cmp_once(x, y, __UNIQUE_ID(__x), __UNIQUE_ID(__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 * min - return minimum of two values of the same or compatible types
* @x: first value * @x: first value
@ -86,7 +108,7 @@
* This macro does strict typechecking of @lo/@hi to make sure they are of the * This macro does strict typechecking of @lo/@hi to make sure they are of the
* same type as @val. See the unnecessary pointer comparisons. * 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 * ..and if you can't take the strict
@ -121,7 +143,7 @@
* This macro does no typechecking and uses temporary variables of type * This macro does no typechecking and uses temporary variables of type
* @type to make all the comparisons. * @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 * clamp_val - return a value clamped to a given range using val's type

View File

@ -275,15 +275,15 @@ static inline int user_regset_copyin(unsigned int *pos, unsigned int *count,
return 0; return 0;
} }
static inline int user_regset_copyin_ignore(unsigned int *pos, static inline void user_regset_copyin_ignore(unsigned int *pos,
unsigned int *count, unsigned int *count,
const void **kbuf, const void **kbuf,
const void __user **ubuf, const void __user **ubuf,
const int start_pos, const int start_pos,
const int end_pos) const int end_pos)
{ {
if (*count == 0) if (*count == 0)
return 0; return;
BUG_ON(*pos < start_pos); BUG_ON(*pos < start_pos);
if (end_pos < 0 || *pos < end_pos) { if (end_pos < 0 || *pos < end_pos) {
unsigned int copy = (end_pos < 0 ? *count unsigned int copy = (end_pos < 0 ? *count
@ -295,7 +295,6 @@ static inline int user_regset_copyin_ignore(unsigned int *pos,
*pos += copy; *pos += copy;
*count -= copy; *count -= copy;
} }
return 0;
} }
extern int regset_get(struct task_struct *target, extern int regset_get(struct task_struct *target,

View File

@ -461,7 +461,7 @@ static long __init write_buffer(char *buf, unsigned long len)
static long __init flush_buffer(void *bufv, unsigned long len) static long __init flush_buffer(void *bufv, unsigned long len)
{ {
char *buf = (char *) bufv; char *buf = bufv;
long written; long written;
long origLen = len; long origLen = len;
if (message) if (message)

View File

@ -145,7 +145,8 @@ void (*__initdata late_time_init)(void);
/* Untouched command line saved by arch-specific code. */ /* Untouched command line saved by arch-specific code. */
char __initdata boot_command_line[COMMAND_LINE_SIZE]; char __initdata boot_command_line[COMMAND_LINE_SIZE];
/* Untouched saved command line (eg. for /proc) */ /* 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 */ /* Command line for parameter parsing */
static char *static_command_line; static char *static_command_line;
/* Untouched extra 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); 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) static void __init do_initcalls(void)
{ {
int level; int level;
size_t len = strlen(saved_command_line) + 1; size_t len = saved_command_line_len + 1;
char *command_line; char *command_line;
command_line = kzalloc(len, GFP_KERNEL); command_line = kzalloc(len, GFP_KERNEL);

View File

@ -1726,7 +1726,8 @@ static int __init init_mqueue_fs(void)
if (!setup_mq_sysctls(&init_ipc_ns)) { if (!setup_mq_sysctls(&init_ipc_ns)) {
pr_warn("sysctl registration failed\n"); pr_warn("sysctl registration failed\n");
return -ENOMEM; error = -ENOMEM;
goto out_kmem;
} }
error = register_filesystem(&mqueue_fs_type); error = register_filesystem(&mqueue_fs_type);
@ -1744,8 +1745,9 @@ static int __init init_mqueue_fs(void)
out_filesystem: out_filesystem:
unregister_filesystem(&mqueue_fs_type); unregister_filesystem(&mqueue_fs_type);
out_sysctl: out_sysctl:
kmem_cache_destroy(mqueue_inode_cachep);
retire_mq_sysctls(&init_ipc_ns); retire_mq_sysctls(&init_ipc_ns);
out_kmem:
kmem_cache_destroy(mqueue_inode_cachep);
return error; return error;
} }

View File

@ -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 * This routine has been adopted from the encode_comp_t() function in
* the kern_acct.c file of the FreeBSD operating system. The encoding * 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 EXPSIZE 3 /* Base 8 (3 bit) exponent. */
#define MAXFRACT ((1 << MANTSIZE) - 1) /* Maximum fractional value. */ #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; int exp, rnd;
@ -350,6 +350,8 @@ static comp_t encode_comp_t(unsigned long value)
exp++; exp++;
} }
if (exp > (((comp_t) ~0U) >> MANTSIZE))
return (comp_t) ~0U;
/* /*
* Clean it up and polish it off. * Clean it up and polish it off.
*/ */

View File

@ -383,6 +383,9 @@ void vmcoreinfo_append_str(const char *fmt, ...)
memcpy(&vmcoreinfo_data[vmcoreinfo_size], buf, r); memcpy(&vmcoreinfo_data[vmcoreinfo_size], buf, r);
vmcoreinfo_size += r; vmcoreinfo_size += r;
WARN_ONCE(vmcoreinfo_size == VMCOREINFO_BYTES,
"vmcoreinfo data exceeds allocated size, truncating");
} }
/* /*

View File

@ -17,4 +17,5 @@ KCSAN_INSTRUMENT_BARRIERS_selftest.o := y
obj-$(CONFIG_KCSAN_SELFTEST) += selftest.o obj-$(CONFIG_KCSAN_SELFTEST) += selftest.o
CFLAGS_kcsan_test.o := $(CFLAGS_KCSAN) -g -fno-omit-frame-pointer 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 obj-$(CONFIG_KCSAN_KUNIT_TEST) += kcsan_test.o

View File

@ -561,23 +561,17 @@ static int kimage_add_entry(struct kimage *image, kimage_entry_t entry)
static int kimage_set_destination(struct kimage *image, static int kimage_set_destination(struct kimage *image,
unsigned long destination) unsigned long destination)
{ {
int result;
destination &= PAGE_MASK; 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) static int kimage_add_page(struct kimage *image, unsigned long page)
{ {
int result;
page &= PAGE_MASK; page &= PAGE_MASK;
result = kimage_add_entry(image, page | IND_SOURCE);
return result; return kimage_add_entry(image, page | IND_SOURCE);
} }

View File

@ -1141,7 +1141,7 @@ int crash_exclude_mem_range(struct crash_mem *mem,
{ {
int i, j; int i, j;
unsigned long long start, end, p_start, p_end; 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++) { for (i = 0; i < mem->nr_ranges; i++) {
start = mem->ranges[i].start; start = mem->ranges[i].start;

View File

@ -25,6 +25,7 @@
#include <linux/kexec.h> #include <linux/kexec.h>
#include <linux/panic_notifier.h> #include <linux/panic_notifier.h>
#include <linux/sched.h> #include <linux/sched.h>
#include <linux/string_helpers.h>
#include <linux/sysrq.h> #include <linux/sysrq.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/nmi.h> #include <linux/nmi.h>
@ -744,8 +745,8 @@ static int __init panic_on_taint_setup(char *s)
if (s && !strcmp(s, "nousertaint")) if (s && !strcmp(s, "nousertaint"))
panic_on_taint_nousertaint = true; panic_on_taint_nousertaint = true;
pr_info("panic_on_taint: bitmask=0x%lx nousertaint_mode=%sabled\n", pr_info("panic_on_taint: bitmask=0x%lx nousertaint_mode=%s\n",
panic_on_taint, panic_on_taint_nousertaint ? "en" : "dis"); panic_on_taint, str_enabled_disabled(panic_on_taint_nousertaint));
return 0; return 0;
} }

View File

@ -148,13 +148,13 @@ static struct rchan_buf *relay_create_buf(struct rchan *chan)
{ {
struct rchan_buf *buf; 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; return NULL;
buf = kzalloc(sizeof(struct rchan_buf), GFP_KERNEL); buf = kzalloc(sizeof(struct rchan_buf), GFP_KERNEL);
if (!buf) if (!buf)
return NULL; return NULL;
buf->padding = kmalloc_array(chan->n_subbufs, sizeof(size_t *), buf->padding = kmalloc_array(chan->n_subbufs, sizeof(size_t),
GFP_KERNEL); GFP_KERNEL);
if (!buf->padding) if (!buf->padding)
goto free_buf; goto free_buf;
@ -507,7 +507,7 @@ struct rchan *relay_open(const char *base_filename,
chan->private_data = private_data; chan->private_data = private_data;
if (base_filename) { if (base_filename) {
chan->has_base_filename = 1; chan->has_base_filename = 1;
strlcpy(chan->base_filename, base_filename, NAME_MAX); strscpy(chan->base_filename, base_filename, NAME_MAX);
} }
chan->cb = cb; chan->cb = cb;
kref_init(&chan->kref); kref_init(&chan->kref);
@ -578,7 +578,7 @@ int relay_late_setup_files(struct rchan *chan,
if (!chan || !base_filename) if (!chan || !base_filename)
return -EINVAL; return -EINVAL;
strlcpy(chan->base_filename, base_filename, NAME_MAX); strscpy(chan->base_filename, base_filename, NAME_MAX);
mutex_lock(&relay_channels_mutex); mutex_lock(&relay_channels_mutex);
/* Is chan already set up? */ /* Is chan already set up? */

View File

@ -2964,7 +2964,7 @@ static void task_numa_work(struct callback_head *work)
} }
next_scan = now + msecs_to_jiffies(p->numa_scan_period); 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; return;
/* /*

View File

@ -529,8 +529,8 @@ config CPUMASK_OFFSTACK
stack overflow. stack overflow.
config FORCE_NR_CPUS config FORCE_NR_CPUS
bool "NR_CPUS is set to an actual number of CPUs" bool "Set number of CPUs at compile time"
depends on SMP depends on SMP && EXPERT && !COMPILE_TEST
help help
Say Yes if you have NR_CPUS set to an actual number of possible 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 CPUs in your system, not to a default value. This forces the core

View File

@ -437,6 +437,7 @@ static int object_cpu_offline(unsigned int cpu)
struct debug_percpu_free *percpu_pool; struct debug_percpu_free *percpu_pool;
struct hlist_node *tmp; struct hlist_node *tmp;
struct debug_obj *obj; struct debug_obj *obj;
unsigned long flags;
/* Remote access is safe as the CPU is dead already */ /* Remote access is safe as the CPU is dead already */
percpu_pool = per_cpu_ptr(&percpu_obj_pool, cpu); 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); hlist_del(&obj->node);
kmem_cache_free(obj_cache, obj); 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; percpu_pool->obj_free = 0;
return 0; return 0;
@ -1318,6 +1325,8 @@ static int __init debug_objects_replace_static_objects(void)
hlist_add_head(&obj->node, &objects); hlist_add_head(&obj->node, &objects);
} }
debug_objects_allocated += i;
/* /*
* debug_objects_mem_init() is now called early that only one CPU is up * 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 * 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; debug_objects_enabled = 0;
kmem_cache_destroy(obj_cache); kmem_cache_destroy(obj_cache);
pr_warn("out of memory.\n"); pr_warn("out of memory.\n");
return;
} else } else
debug_objects_selftest(); debug_objects_selftest();

View File

@ -135,8 +135,8 @@ const struct font_desc *get_default_font(int xres, int yres, u32 font_w,
if (res > 20) if (res > 20)
c += 20 - res; c += 20 - res;
if ((font_w & (1 << (f->width - 1))) && if ((font_w & (1U << (f->width - 1))) &&
(font_h & (1 << (f->height - 1)))) (font_h & (1U << (f->height - 1))))
c += 1000; c += 1000;
if (c > cc) { if (c > cc) {

View File

@ -26,10 +26,10 @@
bool llist_add_batch(struct llist_node *new_first, struct llist_node *new_last, bool llist_add_batch(struct llist_node *new_first, struct llist_node *new_last,
struct llist_head *head) struct llist_head *head)
{ {
struct llist_node *first; struct llist_node *first = READ_ONCE(head->first);
do { do {
new_last->next = first = READ_ONCE(head->first); new_last->next = first;
} while (!try_cmpxchg(&head->first, &first, new_first)); } while (!try_cmpxchg(&head->first, &first, new_first));
return !first; return !first;

View File

@ -15,7 +15,7 @@ static int debugfs_errno_get(void *data, u64 *val)
return 0; 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"); "%lld\n");
static struct dentry *debugfs_create_errno(const char *name, umode_t mode, static struct dentry *debugfs_create_errno(const char *name, umode_t mode,

View File

@ -146,7 +146,6 @@ int sprint_oid(const void *data, size_t datasize, char *buffer, size_t bufsize)
bufsize -= count; bufsize -= count;
while (v < end) { while (v < end) {
num = 0;
n = *v++; n = *v++;
if (!(n & 0x80)) { if (!(n & 0x80)) {
num = n; num = n;

View File

@ -1029,7 +1029,7 @@ void *radix_tree_tag_clear(struct radix_tree_root *root,
{ {
struct radix_tree_node *node, *parent; struct radix_tree_node *node, *parent;
unsigned long maxindex; unsigned long maxindex;
int offset; int offset = 0;
radix_tree_load_root(root, &node, &maxindex); radix_tree_load_root(root, &node, &maxindex);
if (index > maxindex) if (index > maxindex)

View File

@ -702,6 +702,17 @@ sub find_standard_signature {
return ""; 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 = ( our @typeListMisordered = (
qr{char\s+(?:un)?signed}, qr{char\s+(?:un)?signed},
qr{int\s+(?:(?:un)?signed\s+)?short\s}, 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); $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 # Check for added, moved or deleted files
if (!$reported_maintainer_file && !$in_commit_log && if (!$reported_maintainer_file && !$in_commit_log &&
($line =~ /^(?:new|deleted) file mode\s*\d+\s*$/ || ($line =~ /^(?:new|deleted) file mode\s*\d+\s*$/ ||
@ -5901,6 +5918,7 @@ sub process {
$dstat !~ /$exceptions/ && $dstat !~ /$exceptions/ &&
$dstat !~ /^\.$Ident\s*=/ && # .foo = $dstat !~ /^\.$Ident\s*=/ && # .foo =
$dstat !~ /^(?:\#\s*$Ident|\#\s*$Constant)\s*$/ && # stringification #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 !~ /^do\s*$Constant\s*while\s*$Constant;?$/ && # do {...} while (...); // do {...} while (...)
$dstat !~ /^while\s*$Constant\s*$Constant\s*$/ && # while (...) {...} $dstat !~ /^while\s*$Constant\s*$Constant\s*$/ && # while (...) {...}
$dstat !~ /^for\s*$Constant$/ && # for (...) $dstat !~ /^for\s*$Constant$/ && # for (...)
@ -7128,7 +7146,7 @@ sub process {
} }
# check for alloc argument mismatch # 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", WARN("ALLOC_ARRAY_ARGS",
"$1 uses number as first arg, sizeof is generally wrong\n" . $herecurr); "$1 uses number as first arg, sizeof is generally wrong\n" . $herecurr);
} }

View File

@ -23,6 +23,7 @@ absoulte||absolute
acccess||access acccess||access
acceess||access acceess||access
accelaration||acceleration accelaration||acceleration
accelearion||acceleration
acceleratoin||acceleration acceleratoin||acceleration
accelleration||acceleration accelleration||acceleration
accesing||accessing accesing||accessing
@ -58,6 +59,7 @@ acording||according
activete||activate activete||activate
actived||activated actived||activated
actualy||actually actualy||actually
actvie||active
acumulating||accumulating acumulating||accumulating
acumulative||accumulative acumulative||accumulative
acumulator||accumulator acumulator||accumulator
@ -253,6 +255,7 @@ brigde||bridge
broadcase||broadcast broadcase||broadcast
broadcat||broadcast broadcat||broadcast
bufer||buffer bufer||buffer
bufferred||buffered
bufufer||buffer bufufer||buffer
cacluated||calculated cacluated||calculated
caculate||calculate caculate||calculate
@ -273,6 +276,7 @@ cant||can't
cant'||can't cant'||can't
canot||cannot canot||cannot
cann't||can't cann't||can't
cannnot||cannot
capabilites||capabilities capabilites||capabilities
capabilties||capabilities capabilties||capabilities
capabilty||capability capabilty||capability
@ -309,6 +313,7 @@ chiled||child
chked||checked chked||checked
chnage||change chnage||change
chnages||changes chnages||changes
chnange||change
chnnel||channel chnnel||channel
choosen||chosen choosen||chosen
chouse||chose chouse||chose
@ -439,6 +444,7 @@ defferred||deferred
definate||definite definate||definite
definately||definitely definately||definitely
definiation||definition definiation||definition
definiton||definition
defintion||definition defintion||definition
defintions||definitions defintions||definitions
defualt||default defualt||default
@ -452,6 +458,7 @@ delare||declare
delares||declares delares||declares
delaring||declaring delaring||declaring
delemiter||delimiter delemiter||delimiter
delibrately||deliberately
delievered||delivered delievered||delivered
demodualtor||demodulator demodualtor||demodulator
demension||dimension demension||dimension
@ -481,6 +488,7 @@ destroied||destroyed
detabase||database detabase||database
deteced||detected deteced||detected
detectt||detect detectt||detect
detroyed||destroyed
develope||develop develope||develop
developement||development developement||development
developped||developed developped||developed
@ -507,6 +515,7 @@ dimention||dimension
dimesions||dimensions dimesions||dimensions
diconnected||disconnected diconnected||disconnected
disabed||disabled disabed||disabled
disasembler||disassembler
disble||disable disble||disable
disgest||digest disgest||digest
disired||desired disired||desired
@ -666,6 +675,7 @@ finanize||finalize
findn||find findn||find
finilizes||finalizes finilizes||finalizes
finsih||finish finsih||finish
fliter||filter
flusing||flushing flusing||flushing
folloing||following folloing||following
followign||following followign||following
@ -725,6 +735,7 @@ hanled||handled
happend||happened happend||happened
hardare||hardware hardare||hardware
harware||hardware harware||hardware
hardward||hardware
havind||having havind||having
heirarchically||hierarchically heirarchically||hierarchically
heirarchy||hierarchy heirarchy||hierarchy
@ -740,6 +751,7 @@ howver||however
hsould||should hsould||should
hypervior||hypervisor hypervior||hypervisor
hypter||hyper hypter||hyper
idel||idle
identidier||identifier identidier||identifier
iligal||illegal iligal||illegal
illigal||illegal illigal||illegal
@ -931,9 +943,11 @@ matchs||matches
mathimatical||mathematical mathimatical||mathematical
mathimatic||mathematic mathimatic||mathematic
mathimatics||mathematics mathimatics||mathematics
maxmium||maximum
maximium||maximum maximium||maximum
maxium||maximum maxium||maximum
mechamism||mechanism mechamism||mechanism
mechanim||mechanism
meetign||meeting meetign||meeting
memeory||memory memeory||memory
memmber||member memmber||member
@ -942,6 +956,7 @@ memroy||memory
ment||meant ment||meant
mergable||mergeable mergable||mergeable
mesage||message mesage||message
mesages||messages
messags||messages messags||messages
messgaes||messages messgaes||messages
messsage||message messsage||message
@ -983,8 +998,9 @@ monochromo||monochrome
monocrome||monochrome monocrome||monochrome
mopdule||module mopdule||module
mroe||more mroe||more
multipler||multiplier
mulitplied||multiplied mulitplied||multiplied
muliple||multiple
multipler||multiplier
multidimensionnal||multidimensional multidimensionnal||multidimensional
multipe||multiple multipe||multiple
multple||multiple multple||multiple
@ -1109,6 +1125,7 @@ peroid||period
persistance||persistence persistance||persistence
persistant||persistent persistant||persistent
phoneticly||phonetically phoneticly||phonetically
plaform||platform
plalform||platform plalform||platform
platfoem||platform platfoem||platform
platfrom||platform platfrom||platform
@ -1236,6 +1253,7 @@ refering||referring
refernces||references refernces||references
refernnce||reference refernnce||reference
refrence||reference refrence||reference
regiser||register
registed||registered registed||registered
registerd||registered registerd||registered
registeration||registration registeration||registration
@ -1276,6 +1294,7 @@ reseting||resetting
reseved||reserved reseved||reserved
reseverd||reserved reseverd||reserved
resizeable||resizable resizeable||resizable
resotre||restore
resouce||resource resouce||resource
resouces||resources resouces||resources
resoures||resources resoures||resources
@ -1314,6 +1333,7 @@ runtine||runtime
sacrifying||sacrificing sacrifying||sacrificing
safly||safely safly||safely
safty||safety safty||safety
satify||satisfy
savable||saveable savable||saveable
scaleing||scaling scaleing||scaling
scaned||scanned scaned||scanned
@ -1365,10 +1385,12 @@ similiar||similar
simlar||similar simlar||similar
simliar||similar simliar||similar
simpified||simplified simpified||simplified
simultaneusly||simultaneously
simultanous||simultaneous simultanous||simultaneous
singaled||signaled singaled||signaled
singal||signal singal||signal
singed||signed singed||signed
slect||select
sleeped||slept sleeped||slept
sliped||slipped sliped||slipped
softwade||software softwade||software
@ -1438,6 +1460,7 @@ suported||supported
suport||support suport||support
supportet||supported supportet||supported
suppored||supported suppored||supported
supporing||supporting
supportin||supporting supportin||supporting
suppoted||supported suppoted||supported
suppported||supported suppported||supported
@ -1475,15 +1498,18 @@ sytem||system
sythesis||synthesis sythesis||synthesis
taht||that taht||that
tained||tainted tained||tainted
tarffic||traffic
tansmit||transmit tansmit||transmit
targetted||targeted targetted||targeted
targetting||targeting targetting||targeting
taskelt||tasklet taskelt||tasklet
teh||the teh||the
temeprature||temperature
temorary||temporary temorary||temporary
temproarily||temporarily temproarily||temporarily
temperture||temperature temperture||temperature
thead||thread thead||thread
theads||threads
therfore||therefore therfore||therefore
thier||their thier||their
threds||threads threds||threads
@ -1533,12 +1559,14 @@ ture||true
tyep||type tyep||type
udpate||update udpate||update
uesd||used uesd||used
unknwon||unknown
uknown||unknown uknown||unknown
usccess||success usccess||success
uncommited||uncommitted uncommited||uncommitted
uncompatible||incompatible uncompatible||incompatible
unconditionaly||unconditionally unconditionaly||unconditionally
undeflow||underflow undeflow||underflow
undelying||underlying
underun||underrun underun||underrun
unecessary||unnecessary unecessary||unnecessary
unexecpted||unexpected unexecpted||unexpected
@ -1569,11 +1597,14 @@ unneedingly||unnecessarily
unnsupported||unsupported unnsupported||unsupported
unmached||unmatched unmached||unmatched
unprecise||imprecise unprecise||imprecise
unpriviledged||unprivileged
unpriviliged||unprivileged
unregester||unregister unregester||unregister
unresgister||unregister unresgister||unregister
unrgesiter||unregister unrgesiter||unregister
unsinged||unsigned unsinged||unsigned
unstabel||unstable unstabel||unstable
unsolicted||unsolicited
unsolicitied||unsolicited unsolicitied||unsolicited
unsuccessfull||unsuccessful unsuccessfull||unsuccessful
unsuported||unsupported unsuported||unsupported

View File

@ -261,25 +261,20 @@ void handle_aggr(int mother, struct nlattr *na, int fd)
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
int c, rc, rep_len, aggr_len, len2; int c, rc, rep_len;
int cmd_type = TASKSTATS_CMD_ATTR_UNSPEC;
__u16 id; __u16 id;
__u32 mypid; __u32 mypid;
struct nlattr *na; struct nlattr *na;
int nl_sd = -1; int nl_sd = -1;
int len = 0; int len = 0;
pid_t tid = 0;
int fd = 0; int fd = 0;
int write_file = 0; int write_file = 0;
int maskset = 0; int maskset = 0;
char *logfile = NULL; char *logfile = NULL;
int containerset = 0;
char *containerpath = NULL;
int cfd = 0; int cfd = 0;
int forking = 0; int forking = 0;
sigset_t sigset;
struct msgtemplate msg; struct msgtemplate msg;

View File

@ -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) ssize_t proc_read_text(int pid, bool thread, const char *item, char *buf, size_t size)
{ {
char path[PATH_MAX]; char path[PATH_MAX];
ssize_t ret;
if (!pid) if (!pid)
snprintf(path, sizeof(path), "/proc/%s/%s", 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 else
snprintf(path, sizeof(path), "/proc/%d/%s", pid, item); snprintf(path, sizeof(path), "/proc/%d/%s", pid, item);
size = read_text(path, buf, size); ret = read_text(path, buf, size);
return size < 0 ? -1 : size; return ret < 0 ? -1 : ret;
} }
int proc_read_strstr(int pid, bool thread, const char *item, const char *needle) int proc_read_strstr(int pid, bool thread, const char *item, const char *needle)

View File

@ -17,6 +17,7 @@
// while shifting across CPUs. // while shifting across CPUs.
#undef NDEBUG #undef NDEBUG
#include <assert.h> #include <assert.h>
#include <errno.h>
#include <unistd.h> #include <unistd.h>
#include <sys/syscall.h> #include <sys/syscall.h>
#include <stdlib.h> #include <stdlib.h>
@ -54,7 +55,7 @@ int main(void)
len += sizeof(unsigned long); len += sizeof(unsigned long);
free(m); free(m);
m = malloc(len); 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); fd = open("/proc/uptime", O_RDONLY);
assert(fd >= 0); assert(fd >= 0);

View File

@ -33,3 +33,5 @@ memfd_secret
soft-dirty soft-dirty
split_huge_page_test split_huge_page_test
ksm_tests ksm_tests
local_config.h
local_config.mk