Permalink
Browse files

Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel…

…/git/viro/vfs

Pull vfs updates from Al Viro:
 "All kinds of stuff this time around; some more notable parts:

   - RCU'd vfsmounts handling
   - new primitives for coredump handling
   - files_lock is gone
   - Bruce's delegations handling series
   - exportfs fixes

  plus misc stuff all over the place"

* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs: (101 commits)
  ecryptfs: ->f_op is never NULL
  locks: break delegations on any attribute modification
  locks: break delegations on link
  locks: break delegations on rename
  locks: helper functions for delegation breaking
  locks: break delegations on unlink
  namei: minor vfs_unlink cleanup
  locks: implement delegations
  locks: introduce new FL_DELEG lock flag
  vfs: take i_mutex on renamed file
  vfs: rename I_MUTEX_QUOTA now that it's not used for quotas
  vfs: don't use PARENT/CHILD lock classes for non-directories
  vfs: pull ext4's double-i_mutex-locking into common code
  exportfs: fix quadratic behavior in filehandle lookup
  exportfs: better variable name
  exportfs: move most of reconnect_path to helper function
  exportfs: eliminate unused "noprogress" counter
  exportfs: stop retrying once we race with rename/remove
  exportfs: clear DISCONNECTED on all parents sooner
  exportfs: more detailed comment for path_reconnect
  ...
  • Loading branch information...
2 parents f023029 + bdd3536 commit 9bc9ccd7db1c9f043f75380b5a5b94912046a60e @torvalds committed Nov 13, 2013
Showing with 2,099 additions and 2,491 deletions.
  1. +22 −9 Documentation/filesystems/directory-locking
  2. +8 −0 Documentation/filesystems/porting
  3. +1 −1 arch/arm64/kernel/signal32.c
  4. +4 −8 arch/ia64/kernel/elfcore.c
  5. +1 −1 arch/ia64/kernel/signal.c
  6. +1 −1 arch/mips/kernel/signal32.c
  7. +1 −1 arch/parisc/kernel/signal32.c
  8. +1 −1 arch/parisc/kernel/signal32.h
  9. +2 −1 arch/powerpc/include/asm/spu.h
  10. +1 −1 arch/powerpc/kernel/signal_32.c
  11. +3 −2 arch/powerpc/platforms/cell/spu_syscalls.c
  12. +25 −64 arch/powerpc/platforms/cell/spufs/coredump.c
  13. +2 −1 arch/powerpc/platforms/cell/spufs/spufs.h
  14. +1 −1 arch/s390/kernel/compat_signal.c
  15. +1 −1 arch/sparc/kernel/signal32.c
  16. +1 −1 arch/tile/kernel/compat_signal.c
  17. +42 −44 arch/x86/ia32/ia32_aout.c
  18. +1 −1 arch/x86/ia32/ia32_signal.c
  19. +4 −11 arch/x86/um/elfcore.c
  20. +3 −3 drivers/base/devtmpfs.c
  21. +3 −9 drivers/char/misc.c
  22. +6 −11 drivers/gpu/drm/drm_fops.c
  23. +0 −4 drivers/media/dvb-core/dmxdev.c
  24. +6 −13 drivers/media/dvb-core/dvbdev.c
  25. +1 −1 drivers/mtd/nand/nandsim.c
  26. +0 −3 drivers/staging/comedi/comedi_compat32.c
  27. +2 −2 drivers/staging/lustre/lustre/include/linux/lustre_compat25.h
  28. +1 −1 drivers/staging/lustre/lustre/llite/namei.c
  29. +1 −1 drivers/staging/lustre/lustre/lvfs/lvfs_linux.c
  30. +0 −5 drivers/staging/rtl8188eu/include/osdep_service.h
  31. +0 −208 drivers/staging/rtl8188eu/os_dep/osdep_service.c
  32. +4 −12 drivers/usb/core/file.c
  33. +12 −0 fs/9p/cache.h
  34. +0 −2 fs/9p/vfs_file.c
  35. +0 −6 fs/9p/vfs_inode.c
  36. +0 −4 fs/9p/vfs_inode_dotl.c
  37. +6 −3 fs/adfs/adfs.h
  38. +1 −2 fs/adfs/super.c
  39. +57 −6 fs/aio.c
  40. +1 −113 fs/anon_inodes.c
  41. +24 −1 fs/attr.c
  42. +2 −1 fs/autofs4/autofs_i.h
  43. +0 −6 fs/autofs4/dev-ioctl.c
  44. +4 −9 fs/autofs4/inode.c
  45. +31 −30 fs/befs/linuxvfs.c
  46. +6 −7 fs/binfmt_aout.c
  47. +47 −80 fs/binfmt_elf.c
  48. +47 −105 fs/binfmt_elf_fdpic.c
  49. +1 −1 fs/binfmt_em86.c
  50. +2 −2 fs/cachefiles/interface.c
  51. +2 −2 fs/cachefiles/namei.c
  52. +4 −2 fs/char_dev.c
  53. +1 −0 fs/cifs/cifs_fs_sb.h
  54. +1 −1 fs/cifs/cifsfs.c
  55. +0 −2 fs/cifs/cifsfs.h
  56. +8 −2 fs/cifs/connect.c
  57. +0 −7 fs/cifs/link.c
  58. +1 −1 fs/coda/coda_linux.h
  59. +1 −5 fs/coda/dir.c
  60. +3 −3 fs/coda/file.c
  61. +1 −1 fs/coda/inode.c
  62. +2 −2 fs/compat_ioctl.c
  63. +43 −28 fs/coredump.c
  64. +187 −155 fs/dcache.c
  65. +15 −14 fs/ecryptfs/dentry.c
  66. +4 −15 fs/ecryptfs/ecryptfs_kernel.h
  67. +4 −4 fs/ecryptfs/file.c
  68. +10 −19 fs/ecryptfs/inode.c
  69. +1 −2 fs/ecryptfs/main.c
  70. +1 −1 fs/eventpoll.c
  71. +15 −20 fs/exec.c
  72. +149 −118 fs/exportfs/expfs.c
  73. +0 −2 fs/ext4/ext4.h
  74. +2 −2 fs/ext4/ioctl.c
  75. +2 −38 fs/ext4/move_extent.c
  76. +1 −0 fs/fat/fat.h
  77. +11 −8 fs/fat/inode.c
  78. +2 −3 fs/fcntl.c
  79. +2 −127 fs/file_table.c
  80. +1 −0 fs/fs-writeback.c
  81. +1 −1 fs/fuse/cuse.c
  82. +5 −35 fs/fuse/dir.c
  83. +2 −3 fs/fuse/fuse_i.h
  84. +1 −3 fs/fuse/inode.c
  85. +1 −8 fs/gfs2/inode.c
  86. +1 −0 fs/hpfs/hpfs_fn.h
  87. +1 −1 fs/hpfs/namei.c
  88. +14 −14 fs/hpfs/super.c
  89. +47 −15 fs/inode.c
  90. +0 −7 fs/internal.h
  91. +2 −2 fs/ioctl.c
  92. +6 −6 fs/isofs/inode.c
  93. +87 −35 fs/libfs.c
  94. +52 −17 fs/locks.c
  95. +18 −2 fs/mount.h
  96. +196 −126 fs/namei.c
  97. +194 −196 fs/namespace.c
  98. +20 −35 fs/ncpfs/dir.c
  99. +4 −8 fs/ncpfs/file.c
  100. +12 −7 fs/ncpfs/inode.c
  101. +1 −1 fs/ncpfs/ncp_fs_sb.h
  102. +48 −71 fs/nfs/dir.c
  103. +6 −11 fs/nfs/direct.c
  104. +43 −74 fs/nfs/file.c
  105. +2 −3 fs/nfs/namespace.c
  106. +4 −4 fs/nfs/nfs3proc.c
  107. +1 −3 fs/nfs/nfs4file.c
  108. +3 −4 fs/nfs/nfs4namespace.c
  109. +2 −3 fs/nfs/nfs4proc.c
  110. +4 −4 fs/nfs/proc.c
  111. +4 −5 fs/nfs/unlink.c
  112. +2 −4 fs/nfs/write.c
  113. +6 −6 fs/nfsd/nfs4recover.c
  114. +7 −10 fs/nfsd/nfs4state.c
  115. +13 −15 fs/nfsd/nfsfh.c
  116. +2 −2 fs/nfsd/nfsfh.h
  117. +13 −10 fs/nfsd/vfs.c
  118. +1 −1 fs/ntfs/inode.c
  119. +0 −10 fs/ocfs2/inode.c
  120. +24 −8 fs/open.c
  121. +6 −7 fs/pnode.c
  122. +1 −9 fs/proc/self.c
  123. +4 −4 fs/proc_namespace.c
  124. +0 −4 fs/qnx4/namei.c
  125. +8 −17 fs/read_write.c
  126. +1 −1 fs/readdir.c
  127. +2 −2 fs/select.c
  128. +3 −3 fs/splice.c
  129. +25 −6 fs/stat.c
  130. +78 −123 fs/super.c
  131. +1 −1 fs/sync.c
  132. +19 −22 fs/ubifs/dir.c
  133. +2 −4 fs/ubifs/journal.c
  134. +8 −8 fs/ubifs/xattr.c
  135. +8 −1 fs/utimes.c
  136. +1 −1 include/asm-generic/siginfo.h
  137. +0 −3 include/linux/anon_inodes.h
  138. +2 −1 include/linux/binfmts.h
  139. +1 −1 include/linux/compat.h
  140. +6 −4 include/linux/coredump.h
  141. +84 −20 include/linux/dcache.h
  142. +3 −3 include/linux/elf.h
  143. +4 −3 include/linux/elfcore.h
  144. +81 −25 include/linux/fs.h
  145. +0 −10 include/linux/lglock.h
  146. +2 −0 include/linux/mount.h
  147. +1 −1 include/linux/namei.h
  148. +1 −0 include/linux/pid_namespace.h
  149. +1 −1 ipc/mqueue.c
  150. +3 −7 kernel/elfcore.c
  151. +7 −1 kernel/pid_namespace.c
  152. +1 −1 kernel/signal.c
  153. +1 −1 mm/memory.c
  154. +2 −2 mm/mmap.c
  155. +1 −1 mm/nommu.c
  156. +2 −2 net/9p/trans_fd.c
  157. +6 −6 net/sunrpc/rpc_pipe.c
  158. +6 −16 sound/core/sound.c
  159. +3 −14 sound/sound_core.c
@@ -2,6 +2,10 @@
kinds of locks - per-inode (->i_mutex) and per-filesystem
(->s_vfs_rename_mutex).
+ When taking the i_mutex on multiple non-directory objects, we
+always acquire the locks in order by increasing address. We'll call
+that "inode pointer" order in the following.
+
For our purposes all operations fall in 5 classes:
1) read access. Locking rules: caller locks directory we are accessing.
@@ -12,8 +16,9 @@ kinds of locks - per-inode (->i_mutex) and per-filesystem
locks victim and calls the method.
4) rename() that is _not_ cross-directory. Locking rules: caller locks
-the parent, finds source and target, if target already exists - locks it
-and then calls the method.
+the parent and finds source and target. If target already exists, lock
+it. If source is a non-directory, lock it. If that means we need to
+lock both, lock them in inode pointer order.
5) link creation. Locking rules:
* lock parent
@@ -30,7 +35,9 @@ rules:
fail with -ENOTEMPTY
* if new parent is equal to or is a descendent of source
fail with -ELOOP
- * if target exists - lock it.
+ * If target exists, lock it. If source is a non-directory, lock
+ it. In case that means we need to lock both source and target,
+ do so in inode pointer order.
* call the method.
@@ -56,19 +63,25 @@ objects - A < B iff A is an ancestor of B.
renames will be blocked on filesystem lock and we don't start changing
the order until we had acquired all locks).
-(3) any operation holds at most one lock on non-directory object and
- that lock is acquired after all other locks. (Proof: see descriptions
- of operations).
+(3) locks on non-directory objects are acquired only after locks on
+ directory objects, and are acquired in inode pointer order.
+ (Proof: all operations but renames take lock on at most one
+ non-directory object, except renames, which take locks on source and
+ target in inode pointer order in the case they are not directories.)
Now consider the minimal deadlock. Each process is blocked on
attempt to acquire some lock and already holds at least one lock. Let's
consider the set of contended locks. First of all, filesystem lock is
not contended, since any process blocked on it is not holding any locks.
Thus all processes are blocked on ->i_mutex.
- Non-directory objects are not contended due to (3). Thus link
-creation can't be a part of deadlock - it can't be blocked on source
-and it means that it doesn't hold any locks.
+ By (3), any process holding a non-directory lock can only be
+waiting on another non-directory lock with a larger address. Therefore
+the process holding the "largest" such lock can always make progress, and
+non-directory objects are not included in the set of contended locks.
+
+ Thus link creation can't be a part of deadlock - it can't be
+blocked on source and it means that it doesn't hold any locks.
Any contended object is either held by cross-directory rename or
has a child that is also contended. Indeed, suppose that it is held by
@@ -455,3 +455,11 @@ in your dentry operations instead.
vfs_follow_link has been removed. Filesystems must use nd_set_link
from ->follow_link for normal symlinks, or nd_jump_link for magic
/proc/<pid> style links.
+--
+[mandatory]
+ iget5_locked()/ilookup5()/ilookup5_nowait() test() callback used to be
+ called with both ->i_lock and inode_hash_lock held; the former is *not*
+ taken anymore, so verify that your callbacks do not rely on it (none
+ of the in-tree instances did). inode_hash_lock is still held,
+ of course, so they are still serialized wrt removal from inode hash,
+ as well as wrt set() callback of iget5_locked().
@@ -122,7 +122,7 @@ static inline int get_sigset_t(sigset_t *set,
return 0;
}
-int copy_siginfo_to_user32(compat_siginfo_t __user *to, siginfo_t *from)
+int copy_siginfo_to_user32(compat_siginfo_t __user *to, const siginfo_t *from)
{
int err;
@@ -11,8 +11,7 @@ Elf64_Half elf_core_extra_phdrs(void)
return GATE_EHDR->e_phnum;
}
-int elf_core_write_extra_phdrs(struct file *file, loff_t offset, size_t *size,
- unsigned long limit)
+int elf_core_write_extra_phdrs(struct coredump_params *cprm, loff_t offset)
{
const struct elf_phdr *const gate_phdrs =
(const struct elf_phdr *) (GATE_ADDR + GATE_EHDR->e_phoff);
@@ -35,15 +34,13 @@ int elf_core_write_extra_phdrs(struct file *file, loff_t offset, size_t *size,
phdr.p_offset += ofs;
}
phdr.p_paddr = 0; /* match other core phdrs */
- *size += sizeof(phdr);
- if (*size > limit || !dump_write(file, &phdr, sizeof(phdr)))
+ if (!dump_emit(cprm, &phdr, sizeof(phdr)))
return 0;
}
return 1;
}
-int elf_core_write_extra_data(struct file *file, size_t *size,
- unsigned long limit)
+int elf_core_write_extra_data(struct coredump_params *cprm)
{
const struct elf_phdr *const gate_phdrs =
(const struct elf_phdr *) (GATE_ADDR + GATE_EHDR->e_phoff);
@@ -54,8 +51,7 @@ int elf_core_write_extra_data(struct file *file, size_t *size,
void *addr = (void *)gate_phdrs[i].p_vaddr;
size_t memsz = PAGE_ALIGN(gate_phdrs[i].p_memsz);
- *size += memsz;
- if (*size > limit || !dump_write(file, addr, memsz))
+ if (!dump_emit(cprm, addr, memsz))
return 0;
break;
}
@@ -105,7 +105,7 @@ restore_sigcontext (struct sigcontext __user *sc, struct sigscratch *scr)
}
int
-copy_siginfo_to_user (siginfo_t __user *to, siginfo_t *from)
+copy_siginfo_to_user (siginfo_t __user *to, const siginfo_t *from)
{
if (!access_ok(VERIFY_WRITE, to, sizeof(siginfo_t)))
return -EFAULT;
@@ -314,7 +314,7 @@ SYSCALL_DEFINE3(32_sigaction, long, sig, const struct compat_sigaction __user *,
return ret;
}
-int copy_siginfo_to_user32(compat_siginfo_t __user *to, siginfo_t *from)
+int copy_siginfo_to_user32(compat_siginfo_t __user *to, const siginfo_t *from)
{
int err;
@@ -319,7 +319,7 @@ copy_siginfo_from_user32 (siginfo_t *to, compat_siginfo_t __user *from)
}
int
-copy_siginfo_to_user32 (compat_siginfo_t __user *to, siginfo_t *from)
+copy_siginfo_to_user32 (compat_siginfo_t __user *to, const siginfo_t *from)
{
compat_uptr_t addr;
compat_int_t val;
@@ -34,7 +34,7 @@ struct compat_ucontext {
/* ELF32 signal handling */
-int copy_siginfo_to_user32 (compat_siginfo_t __user *to, siginfo_t *from);
+int copy_siginfo_to_user32 (compat_siginfo_t __user *to, const siginfo_t *from);
int copy_siginfo_from_user32 (siginfo_t *to, compat_siginfo_t __user *from);
/* In a deft move of uber-hackery, we decide to carry the top half of all
@@ -235,14 +235,15 @@ extern long spu_sys_callback(struct spu_syscall_block *s);
/* syscalls implemented in spufs */
struct file;
+struct coredump_params;
struct spufs_calls {
long (*create_thread)(const char __user *name,
unsigned int flags, umode_t mode,
struct file *neighbor);
long (*spu_run)(struct file *filp, __u32 __user *unpc,
__u32 __user *ustatus);
int (*coredump_extra_notes_size)(void);
- int (*coredump_extra_notes_write)(struct file *file, loff_t *foffset);
+ int (*coredump_extra_notes_write)(struct coredump_params *cprm);
void (*notify_spus_active)(void);
struct module *owner;
};
@@ -893,7 +893,7 @@ static long restore_tm_user_regs(struct pt_regs *regs,
#endif
#ifdef CONFIG_PPC64
-int copy_siginfo_to_user32(struct compat_siginfo __user *d, siginfo_t *s)
+int copy_siginfo_to_user32(struct compat_siginfo __user *d, const siginfo_t *s)
{
int err;
@@ -25,6 +25,7 @@
#include <linux/module.h>
#include <linux/syscalls.h>
#include <linux/rcupdate.h>
+#include <linux/binfmts.h>
#include <asm/spu.h>
@@ -126,7 +127,7 @@ int elf_coredump_extra_notes_size(void)
return ret;
}
-int elf_coredump_extra_notes_write(struct file *file, loff_t *foffset)
+int elf_coredump_extra_notes_write(struct coredump_params *cprm)
{
struct spufs_calls *calls;
int ret;
@@ -135,7 +136,7 @@ int elf_coredump_extra_notes_write(struct file *file, loff_t *foffset)
if (!calls)
return 0;
- ret = calls->coredump_extra_notes_write(file, foffset);
+ ret = calls->coredump_extra_notes_write(cprm);
spufs_calls_put(calls);
@@ -27,6 +27,8 @@
#include <linux/gfp.h>
#include <linux/list.h>
#include <linux/syscalls.h>
+#include <linux/coredump.h>
+#include <linux/binfmts.h>
#include <asm/uaccess.h>
@@ -48,44 +50,6 @@ static ssize_t do_coredump_read(int num, struct spu_context *ctx, void *buffer,
return ++ret; /* count trailing NULL */
}
-/*
- * These are the only things you should do on a core-file: use only these
- * functions to write out all the necessary info.
- */
-static int spufs_dump_write(struct file *file, const void *addr, int nr, loff_t *foffset)
-{
- unsigned long limit = rlimit(RLIMIT_CORE);
- ssize_t written;
-
- if (*foffset + nr > limit)
- return -EIO;
-
- written = file->f_op->write(file, addr, nr, &file->f_pos);
- *foffset += written;
-
- if (written != nr)
- return -EIO;
-
- return 0;
-}
-
-static int spufs_dump_align(struct file *file, char *buf, loff_t new_off,
- loff_t *foffset)
-{
- int rc, size;
-
- size = min((loff_t)PAGE_SIZE, new_off - *foffset);
- memset(buf, 0, size);
-
- rc = 0;
- while (rc == 0 && new_off > *foffset) {
- size = min((loff_t)PAGE_SIZE, new_off - *foffset);
- rc = spufs_dump_write(file, buf, size, foffset);
- }
-
- return rc;
-}
-
static int spufs_ctx_note_size(struct spu_context *ctx, int dfd)
{
int i, sz, total = 0;
@@ -165,10 +129,10 @@ int spufs_coredump_extra_notes_size(void)
}
static int spufs_arch_write_note(struct spu_context *ctx, int i,
- struct file *file, int dfd, loff_t *foffset)
+ struct coredump_params *cprm, int dfd)
{
loff_t pos = 0;
- int sz, rc, nread, total = 0;
+ int sz, rc, total = 0;
const int bufsz = PAGE_SIZE;
char *name;
char fullname[80], *buf;
@@ -186,42 +150,39 @@ static int spufs_arch_write_note(struct spu_context *ctx, int i,
en.n_descsz = sz;
en.n_type = NT_SPU;
- rc = spufs_dump_write(file, &en, sizeof(en), foffset);
- if (rc)
- goto out;
+ if (!dump_emit(cprm, &en, sizeof(en)))
+ goto Eio;
- rc = spufs_dump_write(file, fullname, en.n_namesz, foffset);
- if (rc)
- goto out;
+ if (!dump_emit(cprm, fullname, en.n_namesz))
+ goto Eio;
- rc = spufs_dump_align(file, buf, roundup(*foffset, 4), foffset);
- if (rc)
- goto out;
+ if (!dump_align(cprm, 4))
+ goto Eio;
do {
- nread = do_coredump_read(i, ctx, buf, bufsz, &pos);
- if (nread > 0) {
- rc = spufs_dump_write(file, buf, nread, foffset);
- if (rc)
- goto out;
- total += nread;
+ rc = do_coredump_read(i, ctx, buf, bufsz, &pos);
+ if (rc > 0) {
+ if (!dump_emit(cprm, buf, rc))
+ goto Eio;
+ total += rc;
}
- } while (nread == bufsz && total < sz);
+ } while (rc == bufsz && total < sz);
- if (nread < 0) {
- rc = nread;
+ if (rc < 0)
goto out;
- }
-
- rc = spufs_dump_align(file, buf, roundup(*foffset - total + sz, 4),
- foffset);
+ if (!dump_skip(cprm,
+ roundup(cprm->written - total + sz, 4) - cprm->written))
+ goto Eio;
out:
free_page((unsigned long)buf);
return rc;
+Eio:
+ free_page((unsigned long)buf);
+ return -EIO;
}
-int spufs_coredump_extra_notes_write(struct file *file, loff_t *foffset)
+int spufs_coredump_extra_notes_write(struct coredump_params *cprm)
{
struct spu_context *ctx;
int fd, j, rc;
@@ -233,7 +194,7 @@ int spufs_coredump_extra_notes_write(struct file *file, loff_t *foffset)
return rc;
for (j = 0; spufs_coredump_read[j].name != NULL; j++) {
- rc = spufs_arch_write_note(ctx, j, file, fd, foffset);
+ rc = spufs_arch_write_note(ctx, j, cprm, fd);
if (rc) {
spu_release_saved(ctx);
return rc;
@@ -247,12 +247,13 @@ extern const struct spufs_tree_descr spufs_dir_debug_contents[];
/* system call implementation */
extern struct spufs_calls spufs_calls;
+struct coredump_params;
long spufs_run_spu(struct spu_context *ctx, u32 *npc, u32 *status);
long spufs_create(struct path *nd, struct dentry *dentry, unsigned int flags,
umode_t mode, struct file *filp);
/* ELF coredump callbacks for writing SPU ELF notes */
extern int spufs_coredump_extra_notes_size(void);
-extern int spufs_coredump_extra_notes_write(struct file *file, loff_t *foffset);
+extern int spufs_coredump_extra_notes_write(struct coredump_params *cprm);
extern const struct file_operations spufs_context_fops;
@@ -49,7 +49,7 @@ typedef struct
__u32 gprs_high[NUM_GPRS];
} rt_sigframe32;
-int copy_siginfo_to_user32(compat_siginfo_t __user *to, siginfo_t *from)
+int copy_siginfo_to_user32(compat_siginfo_t __user *to, const siginfo_t *from)
{
int err;
@@ -68,7 +68,7 @@ struct rt_signal_frame32 {
/* __siginfo_rwin_t * */u32 rwin_save;
} __attribute__((aligned(8)));
-int copy_siginfo_to_user32(compat_siginfo_t __user *to, siginfo_t *from)
+int copy_siginfo_to_user32(compat_siginfo_t __user *to, const siginfo_t *from)
{
int err;
@@ -49,7 +49,7 @@ struct compat_rt_sigframe {
struct compat_ucontext uc;
};
-int copy_siginfo_to_user32(struct compat_siginfo __user *to, siginfo_t *from)
+int copy_siginfo_to_user32(struct compat_siginfo __user *to, const siginfo_t *from)
{
int err;
Oops, something went wrong.

0 comments on commit 9bc9ccd

Please sign in to comment.