mirror of
https://github.com/followmsi/android_kernel_google_msm.git
synced 2024-11-06 23:17:41 +00:00
Merge branch 'lineage-18.1' into followmsi-11
This commit is contained in:
commit
51290e763f
28 changed files with 276 additions and 178 deletions
|
@ -19,6 +19,7 @@ CONFIG_NAMESPACES=y
|
|||
CONFIG_BLK_DEV_INITRD=y
|
||||
CONFIG_RD_BZIP2=y
|
||||
CONFIG_RD_LZMA=y
|
||||
CONFIG_RD_XZ=y
|
||||
CONFIG_PANIC_TIMEOUT=5
|
||||
CONFIG_KALLSYMS_ALL=y
|
||||
CONFIG_EMBEDDED=y
|
||||
|
|
|
@ -58,14 +58,18 @@
|
|||
# define VFP_ABI_FRAME 0
|
||||
# define BSAES_ASM_EXTENDED_KEY
|
||||
# define XTS_CHAIN_TWEAK
|
||||
# define __ARM_ARCH__ 7
|
||||
# define __ARM_ARCH__ __LINUX_ARM_ARCH__
|
||||
# define __ARM_MAX_ARCH__ 7
|
||||
#endif
|
||||
|
||||
#ifdef __thumb__
|
||||
# define adrl adr
|
||||
#endif
|
||||
|
||||
#if __ARM_ARCH__>=7
|
||||
#if __ARM_MAX_ARCH__>=7
|
||||
.arch armv7-a
|
||||
.fpu neon
|
||||
|
||||
.text
|
||||
.syntax unified @ ARMv7-capable assembler is expected to handle this
|
||||
#ifdef __thumb2__
|
||||
|
@ -74,8 +78,6 @@
|
|||
.code 32
|
||||
#endif
|
||||
|
||||
.fpu neon
|
||||
|
||||
.type _bsaes_decrypt8,%function
|
||||
.align 4
|
||||
_bsaes_decrypt8:
|
||||
|
@ -2095,9 +2097,11 @@ bsaes_xts_decrypt:
|
|||
vld1.8 {q8}, [r0] @ initial tweak
|
||||
adr r2, .Lxts_magic
|
||||
|
||||
#ifndef XTS_CHAIN_TWEAK
|
||||
tst r9, #0xf @ if not multiple of 16
|
||||
it ne @ Thumb2 thing, sanity check in ARM
|
||||
subne r9, #0x10 @ subtract another 16 bytes
|
||||
#endif
|
||||
subs r9, #0x80
|
||||
|
||||
blo .Lxts_dec_short
|
||||
|
|
|
@ -701,14 +701,18 @@ $code.=<<___;
|
|||
# define VFP_ABI_FRAME 0
|
||||
# define BSAES_ASM_EXTENDED_KEY
|
||||
# define XTS_CHAIN_TWEAK
|
||||
# define __ARM_ARCH__ 7
|
||||
# define __ARM_ARCH__ __LINUX_ARM_ARCH__
|
||||
# define __ARM_MAX_ARCH__ 7
|
||||
#endif
|
||||
|
||||
#ifdef __thumb__
|
||||
# define adrl adr
|
||||
#endif
|
||||
|
||||
#if __ARM_ARCH__>=7
|
||||
#if __ARM_MAX_ARCH__>=7
|
||||
.arch armv7-a
|
||||
.fpu neon
|
||||
|
||||
.text
|
||||
.syntax unified @ ARMv7-capable assembler is expected to handle this
|
||||
#ifdef __thumb2__
|
||||
|
@ -717,8 +721,6 @@ $code.=<<___;
|
|||
.code 32
|
||||
#endif
|
||||
|
||||
.fpu neon
|
||||
|
||||
.type _bsaes_decrypt8,%function
|
||||
.align 4
|
||||
_bsaes_decrypt8:
|
||||
|
@ -2076,9 +2078,11 @@ bsaes_xts_decrypt:
|
|||
vld1.8 {@XMM[8]}, [r0] @ initial tweak
|
||||
adr $magic, .Lxts_magic
|
||||
|
||||
#ifndef XTS_CHAIN_TWEAK
|
||||
tst $len, #0xf @ if not multiple of 16
|
||||
it ne @ Thumb2 thing, sanity check in ARM
|
||||
subne $len, #0x10 @ subtract another 16 bytes
|
||||
#endif
|
||||
subs $len, #0x80
|
||||
|
||||
blo .Lxts_dec_short
|
||||
|
|
|
@ -232,6 +232,9 @@ asmlinkage long sys_oabi_fcntl64(unsigned int fd, unsigned int cmd,
|
|||
unsigned long arg)
|
||||
{
|
||||
switch (cmd) {
|
||||
case F_OFD_GETLK:
|
||||
case F_OFD_SETLK:
|
||||
case F_OFD_SETLKW:
|
||||
case F_GETLK64:
|
||||
case F_SETLK64:
|
||||
case F_SETLKW64:
|
||||
|
|
35
fs/compat.c
35
fs/compat.c
|
@ -401,12 +401,28 @@ static int put_compat_flock64(struct flock *kfl, struct compat_flock64 __user *u
|
|||
}
|
||||
#endif
|
||||
|
||||
static unsigned int
|
||||
convert_fcntl_cmd(unsigned int cmd)
|
||||
{
|
||||
switch (cmd) {
|
||||
case F_GETLK64:
|
||||
return F_GETLK;
|
||||
case F_SETLK64:
|
||||
return F_SETLK;
|
||||
case F_SETLKW64:
|
||||
return F_SETLKW;
|
||||
}
|
||||
|
||||
return cmd;
|
||||
}
|
||||
|
||||
asmlinkage long compat_sys_fcntl64(unsigned int fd, unsigned int cmd,
|
||||
unsigned long arg)
|
||||
{
|
||||
mm_segment_t old_fs;
|
||||
struct flock f;
|
||||
long ret;
|
||||
unsigned int conv_cmd;
|
||||
|
||||
switch (cmd) {
|
||||
case F_GETLK:
|
||||
|
@ -443,16 +459,18 @@ asmlinkage long compat_sys_fcntl64(unsigned int fd, unsigned int cmd,
|
|||
case F_GETLK64:
|
||||
case F_SETLK64:
|
||||
case F_SETLKW64:
|
||||
case F_OFD_GETLK:
|
||||
case F_OFD_SETLK:
|
||||
case F_OFD_SETLKW:
|
||||
ret = get_compat_flock64(&f, compat_ptr(arg));
|
||||
if (ret != 0)
|
||||
break;
|
||||
old_fs = get_fs();
|
||||
set_fs(KERNEL_DS);
|
||||
ret = sys_fcntl(fd, (cmd == F_GETLK64) ? F_GETLK :
|
||||
((cmd == F_SETLK64) ? F_SETLK : F_SETLKW),
|
||||
(unsigned long)&f);
|
||||
conv_cmd = convert_fcntl_cmd(cmd);
|
||||
ret = sys_fcntl(fd, conv_cmd, (unsigned long)&f);
|
||||
set_fs(old_fs);
|
||||
if (cmd == F_GETLK64 && ret == 0) {
|
||||
if ((conv_cmd == F_GETLK || conv_cmd == F_OFD_GETLK) && ret == 0) {
|
||||
/* need to return lock information - see above for commentary */
|
||||
if (f.l_start > COMPAT_LOFF_T_MAX)
|
||||
ret = -EOVERFLOW;
|
||||
|
@ -473,8 +491,15 @@ asmlinkage long compat_sys_fcntl64(unsigned int fd, unsigned int cmd,
|
|||
asmlinkage long compat_sys_fcntl(unsigned int fd, unsigned int cmd,
|
||||
unsigned long arg)
|
||||
{
|
||||
if ((cmd == F_GETLK64) || (cmd == F_SETLK64) || (cmd == F_SETLKW64))
|
||||
switch (cmd) {
|
||||
case F_GETLK64:
|
||||
case F_SETLK64:
|
||||
case F_SETLKW64:
|
||||
case F_OFD_GETLK:
|
||||
case F_OFD_SETLK:
|
||||
case F_OFD_SETLKW:
|
||||
return -EINVAL;
|
||||
}
|
||||
return compat_sys_fcntl64(fd, cmd, arg);
|
||||
}
|
||||
|
||||
|
|
37
fs/fcntl.c
37
fs/fcntl.c
|
@ -370,9 +370,19 @@ static long do_fcntl(int fd, unsigned int cmd, unsigned long arg,
|
|||
case F_SETFL:
|
||||
err = setfl(fd, filp, arg);
|
||||
break;
|
||||
#if BITS_PER_LONG != 32
|
||||
/* 32-bit arches must use fcntl64() */
|
||||
case F_OFD_GETLK:
|
||||
#endif
|
||||
case F_GETLK:
|
||||
err = fcntl_getlk(filp, (struct flock __user *) arg);
|
||||
err = fcntl_getlk(filp, cmd, (struct flock __user *) arg);
|
||||
break;
|
||||
#if BITS_PER_LONG != 32
|
||||
/* 32-bit arches must use fcntl64() */
|
||||
case F_OFD_SETLK:
|
||||
case F_OFD_SETLKW:
|
||||
#endif
|
||||
/* Fallthrough */
|
||||
case F_SETLK:
|
||||
case F_SETLKW:
|
||||
err = fcntl_setlk(fd, filp, cmd, (struct flock __user *) arg);
|
||||
|
@ -500,17 +510,20 @@ SYSCALL_DEFINE3(fcntl64, unsigned int, fd, unsigned int, cmd,
|
|||
err = -EBADF;
|
||||
|
||||
switch (cmd) {
|
||||
case F_GETLK64:
|
||||
err = fcntl_getlk64(filp, (struct flock64 __user *) arg);
|
||||
break;
|
||||
case F_SETLK64:
|
||||
case F_SETLKW64:
|
||||
err = fcntl_setlk64(fd, filp, cmd,
|
||||
(struct flock64 __user *) arg);
|
||||
break;
|
||||
default:
|
||||
err = do_fcntl(fd, cmd, arg, filp);
|
||||
break;
|
||||
case F_GETLK64:
|
||||
case F_OFD_GETLK:
|
||||
err = fcntl_getlk64(filp, cmd, (struct flock64 __user *) arg);
|
||||
break;
|
||||
case F_SETLK64:
|
||||
case F_SETLKW64:
|
||||
case F_OFD_SETLK:
|
||||
case F_OFD_SETLKW:
|
||||
err = fcntl_setlk64(fd, filp, cmd,
|
||||
(struct flock64 __user *) arg);
|
||||
break;
|
||||
default:
|
||||
err = do_fcntl(fd, cmd, arg, filp);
|
||||
break;
|
||||
}
|
||||
fput(filp);
|
||||
out:
|
||||
|
|
|
@ -232,7 +232,7 @@ static void __fput(struct file *file)
|
|||
* in the file cleanup chain.
|
||||
*/
|
||||
eventpoll_release(file);
|
||||
locks_remove_flock(file);
|
||||
locks_remove_file(file);
|
||||
|
||||
if (unlikely(file->f_flags & FASYNC)) {
|
||||
if (file->f_op && file->f_op->fasync)
|
||||
|
|
77
fs/locks.c
77
fs/locks.c
|
@ -132,6 +132,7 @@
|
|||
#define IS_POSIX(fl) (fl->fl_flags & FL_POSIX)
|
||||
#define IS_FLOCK(fl) (fl->fl_flags & FL_FLOCK)
|
||||
#define IS_LEASE(fl) (fl->fl_flags & FL_LEASE)
|
||||
#define IS_OFDLCK(fl) (fl->fl_flags & FL_OFDLCK)
|
||||
|
||||
static bool lease_breaking(struct file_lock *fl)
|
||||
{
|
||||
|
@ -1697,7 +1698,7 @@ EXPORT_SYMBOL_GPL(vfs_test_lock);
|
|||
|
||||
static int posix_lock_to_flock(struct flock *flock, struct file_lock *fl)
|
||||
{
|
||||
flock->l_pid = fl->fl_pid;
|
||||
flock->l_pid = IS_OFDLCK(fl) ? -1 : fl->fl_pid;
|
||||
#if BITS_PER_LONG == 32
|
||||
/*
|
||||
* Make sure we can represent the posix lock via
|
||||
|
@ -1719,7 +1720,7 @@ static int posix_lock_to_flock(struct flock *flock, struct file_lock *fl)
|
|||
#if BITS_PER_LONG == 32
|
||||
static void posix_lock_to_flock64(struct flock64 *flock, struct file_lock *fl)
|
||||
{
|
||||
flock->l_pid = fl->fl_pid;
|
||||
flock->l_pid = IS_OFDLCK(fl) ? -1 : fl->fl_pid;
|
||||
flock->l_start = fl->fl_start;
|
||||
flock->l_len = fl->fl_end == OFFSET_MAX ? 0 :
|
||||
fl->fl_end - fl->fl_start + 1;
|
||||
|
@ -1731,7 +1732,7 @@ static void posix_lock_to_flock64(struct flock64 *flock, struct file_lock *fl)
|
|||
/* Report the first existing lock that would conflict with l.
|
||||
* This implements the F_GETLK command of fcntl().
|
||||
*/
|
||||
int fcntl_getlk(struct file *filp, struct flock __user *l)
|
||||
int fcntl_getlk(struct file *filp, unsigned int cmd, struct flock __user *l)
|
||||
{
|
||||
struct file_lock file_lock;
|
||||
struct flock flock;
|
||||
|
@ -1748,6 +1749,12 @@ int fcntl_getlk(struct file *filp, struct flock __user *l)
|
|||
if (error)
|
||||
goto out;
|
||||
|
||||
if (cmd == F_OFD_GETLK) {
|
||||
cmd = F_GETLK;
|
||||
file_lock.fl_flags |= FL_OFDLCK;
|
||||
file_lock.fl_owner = (fl_owner_t)filp;
|
||||
}
|
||||
|
||||
error = vfs_test_lock(filp, &file_lock);
|
||||
if (error)
|
||||
goto out;
|
||||
|
@ -1867,10 +1874,26 @@ again:
|
|||
error = flock_to_posix_lock(filp, file_lock, &flock);
|
||||
if (error)
|
||||
goto out;
|
||||
if (cmd == F_SETLKW) {
|
||||
|
||||
/*
|
||||
* If the cmd is requesting file-private locks, then set the
|
||||
* FL_OFDLCK flag and override the owner.
|
||||
*/
|
||||
switch (cmd) {
|
||||
case F_OFD_SETLK:
|
||||
cmd = F_SETLK;
|
||||
file_lock->fl_flags |= FL_OFDLCK;
|
||||
file_lock->fl_owner = (fl_owner_t)filp;
|
||||
break;
|
||||
case F_OFD_SETLKW:
|
||||
cmd = F_SETLKW;
|
||||
file_lock->fl_flags |= FL_OFDLCK;
|
||||
file_lock->fl_owner = (fl_owner_t)filp;
|
||||
/* Fallthrough */
|
||||
case F_SETLKW:
|
||||
file_lock->fl_flags |= FL_SLEEP;
|
||||
}
|
||||
|
||||
|
||||
error = -EBADF;
|
||||
switch (flock.l_type) {
|
||||
case F_RDLCK:
|
||||
|
@ -1916,7 +1939,7 @@ out:
|
|||
/* Report the first existing lock that would conflict with l.
|
||||
* This implements the F_GETLK command of fcntl().
|
||||
*/
|
||||
int fcntl_getlk64(struct file *filp, struct flock64 __user *l)
|
||||
int fcntl_getlk64(struct file *filp, unsigned int cmd, struct flock64 __user *l)
|
||||
{
|
||||
struct file_lock file_lock;
|
||||
struct flock64 flock;
|
||||
|
@ -1933,6 +1956,12 @@ int fcntl_getlk64(struct file *filp, struct flock64 __user *l)
|
|||
if (error)
|
||||
goto out;
|
||||
|
||||
if (cmd == F_OFD_GETLK) {
|
||||
cmd = F_GETLK64;
|
||||
file_lock.fl_flags |= FL_OFDLCK;
|
||||
file_lock.fl_owner = (fl_owner_t)filp;
|
||||
}
|
||||
|
||||
error = vfs_test_lock(filp, &file_lock);
|
||||
if (error)
|
||||
goto out;
|
||||
|
@ -1985,10 +2014,26 @@ again:
|
|||
error = flock64_to_posix_lock(filp, file_lock, &flock);
|
||||
if (error)
|
||||
goto out;
|
||||
if (cmd == F_SETLKW64) {
|
||||
|
||||
/*
|
||||
* If the cmd is requesting file-private locks, then set the
|
||||
* FL_OFDLCK flag and override the owner.
|
||||
*/
|
||||
switch (cmd) {
|
||||
case F_OFD_SETLK:
|
||||
cmd = F_SETLK64;
|
||||
file_lock->fl_flags |= FL_OFDLCK;
|
||||
file_lock->fl_owner = (fl_owner_t)filp;
|
||||
break;
|
||||
case F_OFD_SETLKW:
|
||||
cmd = F_SETLKW64;
|
||||
file_lock->fl_flags |= FL_OFDLCK;
|
||||
file_lock->fl_owner = (fl_owner_t)filp;
|
||||
/* Fallthrough */
|
||||
case F_SETLKW64:
|
||||
file_lock->fl_flags |= FL_SLEEP;
|
||||
}
|
||||
|
||||
|
||||
error = -EBADF;
|
||||
switch (flock.l_type) {
|
||||
case F_RDLCK:
|
||||
|
@ -2064,7 +2109,7 @@ EXPORT_SYMBOL(locks_remove_posix);
|
|||
/*
|
||||
* This function is called on the last close of an open file.
|
||||
*/
|
||||
void locks_remove_flock(struct file *filp)
|
||||
void locks_remove_file(struct file *filp)
|
||||
{
|
||||
struct inode * inode = filp->f_path.dentry->d_inode;
|
||||
struct file_lock *fl;
|
||||
|
@ -2073,6 +2118,8 @@ void locks_remove_flock(struct file *filp)
|
|||
if (!inode->i_flock)
|
||||
return;
|
||||
|
||||
locks_remove_posix(filp, (fl_owner_t)filp);
|
||||
|
||||
if (filp->f_op && filp->f_op->flock) {
|
||||
struct file_lock fl = {
|
||||
.fl_pid = current->tgid,
|
||||
|
@ -2166,8 +2213,14 @@ static void lock_get_status(struct seq_file *f, struct file_lock *fl,
|
|||
|
||||
seq_printf(f, "%lld:%s ", id, pfx);
|
||||
if (IS_POSIX(fl)) {
|
||||
seq_printf(f, "%6s %s ",
|
||||
(fl->fl_flags & FL_ACCESS) ? "ACCESS" : "POSIX ",
|
||||
if (fl->fl_flags & FL_ACCESS)
|
||||
seq_printf(f, "ACCESS");
|
||||
else if (IS_OFDLCK(fl))
|
||||
seq_printf(f, "FLPVT ");
|
||||
else
|
||||
seq_printf(f, "POSIX ");
|
||||
|
||||
seq_printf(f, " %s ",
|
||||
(inode == NULL) ? "*NOINODE*" :
|
||||
mandatory_lock(inode) ? "MANDATORY" : "ADVISORY ");
|
||||
} else if (IS_FLOCK(fl)) {
|
||||
|
@ -2204,7 +2257,7 @@ static void lock_get_status(struct seq_file *f, struct file_lock *fl,
|
|||
inode->i_sb->s_id, inode->i_ino);
|
||||
#else
|
||||
/* userspace relies on this representation of dev_t ;-( */
|
||||
seq_printf(f, "%d %02x:%02x:%ld ", fl_pid,
|
||||
seq_printf(f, "%d %02x:%02x:%lu ", fl_pid,
|
||||
MAJOR(inode->i_sb->s_dev),
|
||||
MINOR(inode->i_sb->s_dev), inode->i_ino);
|
||||
#endif
|
||||
|
|
|
@ -351,7 +351,8 @@ int need_graft_path(struct dentry *dentry)
|
|||
struct sdcardfs_sb_info *sbi = SDCARDFS_SB(dentry->d_sb);
|
||||
struct qstr obb = QSTR_LITERAL("obb");
|
||||
|
||||
if (parent_info->data->perm == PERM_ANDROID &&
|
||||
if (!sbi->options.unshared_obb &&
|
||||
parent_info->data->perm == PERM_ANDROID &&
|
||||
qstr_case_eq(&dentry->d_name, &obb)) {
|
||||
|
||||
/* /Android/obb is the base obbpath of DERIVED_UNIFIED */
|
||||
|
|
|
@ -34,6 +34,7 @@ enum {
|
|||
Opt_reserved_mb,
|
||||
Opt_gid_derivation,
|
||||
Opt_default_normal,
|
||||
Opt_unshared_obb,
|
||||
Opt_err,
|
||||
};
|
||||
|
||||
|
@ -47,6 +48,7 @@ static const match_table_t sdcardfs_tokens = {
|
|||
{Opt_multiuser, "multiuser"},
|
||||
{Opt_gid_derivation, "derive_gid"},
|
||||
{Opt_default_normal, "default_normal"},
|
||||
{Opt_unshared_obb, "unshared_obb"},
|
||||
{Opt_reserved_mb, "reserved_mb=%u"},
|
||||
{Opt_err, NULL}
|
||||
};
|
||||
|
@ -128,6 +130,9 @@ static int parse_options(struct super_block *sb, char *options, int silent,
|
|||
case Opt_default_normal:
|
||||
vfsopts->default_normal = true;
|
||||
break;
|
||||
case Opt_unshared_obb:
|
||||
opts->unshared_obb = true;
|
||||
break;
|
||||
/* unknown option */
|
||||
default:
|
||||
if (!silent)
|
||||
|
@ -181,13 +186,16 @@ int parse_options_remount(struct super_block *sb, char *options, int silent,
|
|||
return 0;
|
||||
vfsopts->mask = option;
|
||||
break;
|
||||
case Opt_unshared_obb:
|
||||
case Opt_default_normal:
|
||||
case Opt_multiuser:
|
||||
case Opt_userid:
|
||||
case Opt_fsuid:
|
||||
case Opt_fsgid:
|
||||
case Opt_reserved_mb:
|
||||
pr_warn("Option \"%s\" can't be changed during remount\n", p);
|
||||
case Opt_gid_derivation:
|
||||
if (!silent)
|
||||
pr_warn("Option \"%s\" can't be changed during remount\n", p);
|
||||
break;
|
||||
/* unknown option */
|
||||
default:
|
||||
|
|
|
@ -219,6 +219,7 @@ struct sdcardfs_mount_options {
|
|||
userid_t fs_user_id;
|
||||
bool multiuser;
|
||||
bool gid_derivation;
|
||||
bool unshared_obb;
|
||||
unsigned int reserved_mb;
|
||||
};
|
||||
|
||||
|
|
|
@ -308,6 +308,8 @@ static int sdcardfs_show_options(struct vfsmount *mnt, struct seq_file *m,
|
|||
seq_puts(m, ",default_normal");
|
||||
if (opts->reserved_mb != 0)
|
||||
seq_printf(m, ",reserved=%uMB", opts->reserved_mb);
|
||||
if (opts->unshared_obb)
|
||||
seq_printf(m, ",unshared_obb");
|
||||
|
||||
return 0;
|
||||
};
|
||||
|
|
|
@ -128,6 +128,22 @@
|
|||
#define F_GETOWN_EX 16
|
||||
#endif
|
||||
|
||||
/*
|
||||
* fd "private" POSIX locks.
|
||||
*
|
||||
* Usually POSIX locks held by a process are released on *any* close and are
|
||||
* not inherited across a fork().
|
||||
*
|
||||
* These cmd values will set locks that conflict with normal POSIX locks, but
|
||||
* are "owned" by the opened file, not the process. This means that they are
|
||||
* inherited across fork() like BSD (flock) locks, and they are only released
|
||||
* automatically when the last reference to the the open file against which
|
||||
* they were acquired is put.
|
||||
*/
|
||||
#define F_OFD_GETLK 36
|
||||
#define F_OFD_SETLK 37
|
||||
#define F_OFD_SETLKW 38
|
||||
|
||||
#define F_OWNER_TID 0
|
||||
#define F_OWNER_PID 1
|
||||
#define F_OWNER_PGRP 2
|
||||
|
|
|
@ -1155,6 +1155,7 @@ static inline int file_check_writeable(struct file *filp)
|
|||
#define FL_SLEEP 128 /* A blocking lock */
|
||||
#define FL_DOWNGRADE_PENDING 256 /* Lease is being downgraded */
|
||||
#define FL_UNLOCK_PENDING 512 /* Lease is being broken */
|
||||
#define FL_OFDLCK 1024 /* lock is "owned" by struct file */
|
||||
|
||||
/*
|
||||
* Special return value from posix_lock_file() and vfs_lock_file() for
|
||||
|
@ -1239,12 +1240,12 @@ struct file_lock {
|
|||
extern void send_sigio(struct fown_struct *fown, int fd, int band);
|
||||
|
||||
#ifdef CONFIG_FILE_LOCKING
|
||||
extern int fcntl_getlk(struct file *, struct flock __user *);
|
||||
extern int fcntl_getlk(struct file *, unsigned int, struct flock __user *);
|
||||
extern int fcntl_setlk(unsigned int, struct file *, unsigned int,
|
||||
struct flock __user *);
|
||||
|
||||
#if BITS_PER_LONG == 32
|
||||
extern int fcntl_getlk64(struct file *, struct flock64 __user *);
|
||||
extern int fcntl_getlk64(struct file *, unsigned int, struct flock64 __user *);
|
||||
extern int fcntl_setlk64(unsigned int, struct file *, unsigned int,
|
||||
struct flock64 __user *);
|
||||
#endif
|
||||
|
@ -1259,7 +1260,7 @@ extern struct file_lock * locks_alloc_lock(void);
|
|||
extern void locks_copy_lock(struct file_lock *, struct file_lock *);
|
||||
extern void __locks_copy_lock(struct file_lock *, const struct file_lock *);
|
||||
extern void locks_remove_posix(struct file *, fl_owner_t);
|
||||
extern void locks_remove_flock(struct file *);
|
||||
extern void locks_remove_file(struct file *);
|
||||
extern void locks_release_private(struct file_lock *);
|
||||
extern void posix_test_lock(struct file *, struct file_lock *);
|
||||
extern int posix_lock_file(struct file *, struct file_lock *, struct file_lock *);
|
||||
|
@ -1280,7 +1281,8 @@ extern void locks_delete_block(struct file_lock *waiter);
|
|||
extern void lock_flocks(void);
|
||||
extern void unlock_flocks(void);
|
||||
#else /* !CONFIG_FILE_LOCKING */
|
||||
static inline int fcntl_getlk(struct file *file, struct flock __user *user)
|
||||
static inline int fcntl_getlk(struct file *file, unsigned int cmd,
|
||||
struct flock __user *user)
|
||||
{
|
||||
return -EINVAL;
|
||||
}
|
||||
|
@ -1292,7 +1294,8 @@ static inline int fcntl_setlk(unsigned int fd, struct file *file,
|
|||
}
|
||||
|
||||
#if BITS_PER_LONG == 32
|
||||
static inline int fcntl_getlk64(struct file *file, struct flock64 __user *user)
|
||||
static inline int fcntl_getlk64(struct file *file, unsigned int cmd,
|
||||
struct flock64 __user *user)
|
||||
{
|
||||
return -EINVAL;
|
||||
}
|
||||
|
@ -1333,7 +1336,7 @@ static inline void locks_remove_posix(struct file *filp, fl_owner_t owner)
|
|||
return;
|
||||
}
|
||||
|
||||
static inline void locks_remove_flock(struct file *filp)
|
||||
static inline void locks_remove_file(struct file *filp)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
|
|
@ -136,10 +136,10 @@ extern void rt6_redirect(const struct in6_addr *dest,
|
|||
u8 *lladdr,
|
||||
int on_link);
|
||||
|
||||
extern void rt6_pmtu_discovery(const struct in6_addr *daddr,
|
||||
const struct in6_addr *saddr,
|
||||
struct net_device *dev,
|
||||
u32 pmtu);
|
||||
extern void ip6_update_pmtu(struct sk_buff *skb, struct net *net, __be32 mtu,
|
||||
int oif, u32 mark);
|
||||
extern void ip6_sk_update_pmtu(struct sk_buff *skb, struct sock *sk,
|
||||
__be32 mtu);
|
||||
|
||||
struct netlink_callback;
|
||||
|
||||
|
|
|
@ -66,6 +66,7 @@
|
|||
#include <linux/atomic.h>
|
||||
#include <net/dst.h>
|
||||
#include <net/checksum.h>
|
||||
#include <net/tcp_states.h>
|
||||
|
||||
struct cgroup;
|
||||
struct cgroup_subsys;
|
||||
|
@ -2152,6 +2153,15 @@ static inline struct sock *skb_steal_sock(struct sk_buff *skb)
|
|||
return NULL;
|
||||
}
|
||||
|
||||
/* This helper checks if a socket is a full socket,
|
||||
* ie _not_ a timewait or request socket.
|
||||
* TODO: Check for TCPF_NEW_SYN_RECV when that starts to exist.
|
||||
*/
|
||||
static inline bool sk_fullsock(const struct sock *sk)
|
||||
{
|
||||
return (1 << sk->sk_state) & ~(TCPF_TIME_WAIT);
|
||||
}
|
||||
|
||||
extern void sock_enable_timestamp(struct sock *sk, int flag);
|
||||
extern int sock_get_timestamp(struct sock *, struct timeval __user *);
|
||||
extern int sock_get_timestampns(struct sock *, struct timespec __user *);
|
||||
|
|
17
mm/shmem.c
17
mm/shmem.c
|
@ -150,6 +150,19 @@ static inline void shmem_unacct_size(unsigned long flags, loff_t size)
|
|||
vm_unacct_memory(VM_ACCT(size));
|
||||
}
|
||||
|
||||
static inline int shmem_reacct_size(unsigned long flags,
|
||||
loff_t oldsize, loff_t newsize)
|
||||
{
|
||||
if (!(flags & VM_NORESERVE)) {
|
||||
if (VM_ACCT(newsize) > VM_ACCT(oldsize))
|
||||
return security_vm_enough_memory_mm(current->mm,
|
||||
VM_ACCT(newsize) - VM_ACCT(oldsize));
|
||||
else if (VM_ACCT(newsize) < VM_ACCT(oldsize))
|
||||
vm_unacct_memory(VM_ACCT(oldsize) - VM_ACCT(newsize));
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* ... whereas tmpfs objects are accounted incrementally as
|
||||
* pages are allocated, in order to allow huge sparse files.
|
||||
|
@ -621,6 +634,10 @@ static int shmem_setattr(struct dentry *dentry, struct iattr *attr)
|
|||
return -EPERM;
|
||||
|
||||
if (newsize != oldsize) {
|
||||
error = shmem_reacct_size(SHMEM_I(inode)->flags,
|
||||
oldsize, newsize);
|
||||
if (error)
|
||||
return error;
|
||||
i_size_write(inode, newsize);
|
||||
inode->i_ctime = inode->i_mtime = CURRENT_TIME;
|
||||
}
|
||||
|
|
|
@ -165,6 +165,8 @@ static void dccp_v6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
|
|||
} else
|
||||
dst_hold(dst);
|
||||
|
||||
dst->ops->update_pmtu(dst, ntohl(info));
|
||||
|
||||
if (inet_csk(sk)->icsk_pmtu_cookie > dst_mtu(dst)) {
|
||||
dccp_sync_mss(sk, dst_mtu(dst));
|
||||
} /* else let the usual retransmit timer handle it */
|
||||
|
|
|
@ -630,6 +630,7 @@ static void tcp_v4_send_reset(struct sock *sk, struct sk_buff *skb)
|
|||
arg.iov[0].iov_base = (unsigned char *)&rep;
|
||||
arg.iov[0].iov_len = sizeof(rep.th);
|
||||
|
||||
net = sk ? sock_net(sk) : dev_net(skb_dst(skb)->dev);
|
||||
#ifdef CONFIG_TCP_MD5SIG
|
||||
hash_location = tcp_parse_md5sig_option(th);
|
||||
if (!sk && hash_location) {
|
||||
|
@ -640,7 +641,7 @@ static void tcp_v4_send_reset(struct sock *sk, struct sk_buff *skb)
|
|||
* Incoming packet is checked with md5 hash with finding key,
|
||||
* no RST generated if md5 hash doesn't match.
|
||||
*/
|
||||
sk1 = __inet_lookup_listener(dev_net(skb_dst(skb)->dev),
|
||||
sk1 = __inet_lookup_listener(net,
|
||||
&tcp_hashinfo, ip_hdr(skb)->daddr,
|
||||
ntohs(th->source), inet_iif(skb));
|
||||
/* don't send rst if it can't find key */
|
||||
|
@ -687,7 +688,6 @@ static void tcp_v4_send_reset(struct sock *sk, struct sk_buff *skb)
|
|||
if (sk)
|
||||
arg.bound_dev_if = sk->sk_bound_dev_if;
|
||||
|
||||
net = dev_net(skb_dst(skb)->dev);
|
||||
arg.tos = ip_hdr(skb)->tos;
|
||||
ip_send_reply(net->ipv4.tcp_sock, skb, ip_hdr(skb)->saddr,
|
||||
&arg, arg.iov[0].iov_len);
|
||||
|
|
|
@ -33,6 +33,7 @@
|
|||
#include <linux/pfkeyv2.h>
|
||||
#include <linux/string.h>
|
||||
#include <linux/scatterlist.h>
|
||||
#include <net/ip6_route.h>
|
||||
#include <net/icmp.h>
|
||||
#include <net/ipv6.h>
|
||||
#include <net/protocol.h>
|
||||
|
@ -619,7 +620,7 @@ static void ah6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
|
|||
|
||||
NETDEBUG(KERN_DEBUG "pmtu discovery on SA AH/%08x/%pI6\n",
|
||||
ntohl(ah->spi), &iph->daddr);
|
||||
|
||||
ip6_update_pmtu(skb, net, info, 0, 0);
|
||||
xfrm_state_put(x);
|
||||
}
|
||||
|
||||
|
|
|
@ -37,6 +37,7 @@
|
|||
#include <linux/random.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/spinlock.h>
|
||||
#include <net/ip6_route.h>
|
||||
#include <net/icmp.h>
|
||||
#include <net/ipv6.h>
|
||||
#include <net/protocol.h>
|
||||
|
@ -440,6 +441,7 @@ static void esp6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
|
|||
return;
|
||||
printk(KERN_DEBUG "pmtu discovery on SA ESP/%08x/%pI6\n",
|
||||
ntohl(esph->spi), &iph->daddr);
|
||||
ip6_update_pmtu(skb, net, info, 0, 0);
|
||||
xfrm_state_put(x);
|
||||
}
|
||||
|
||||
|
|
|
@ -667,7 +667,6 @@ static int icmpv6_rcv(struct sk_buff *skb)
|
|||
struct net_device *dev = skb->dev;
|
||||
struct inet6_dev *idev = __in6_dev_get(dev);
|
||||
const struct in6_addr *saddr, *daddr;
|
||||
const struct ipv6hdr *orig_hdr;
|
||||
struct icmp6hdr *hdr;
|
||||
u8 type;
|
||||
|
||||
|
@ -679,7 +678,7 @@ static int icmpv6_rcv(struct sk_buff *skb)
|
|||
XFRM_STATE_ICMP))
|
||||
goto drop_no_count;
|
||||
|
||||
if (!pskb_may_pull(skb, sizeof(*hdr) + sizeof(*orig_hdr)))
|
||||
if (!pskb_may_pull(skb, sizeof(*hdr) + sizeof(struct ipv6hdr)))
|
||||
goto drop_no_count;
|
||||
|
||||
nh = skb_network_offset(skb);
|
||||
|
@ -741,9 +740,6 @@ static int icmpv6_rcv(struct sk_buff *skb)
|
|||
if (!pskb_may_pull(skb, sizeof(struct ipv6hdr)))
|
||||
goto discard_it;
|
||||
hdr = icmp6_hdr(skb);
|
||||
orig_hdr = (struct ipv6hdr *) (hdr + 1);
|
||||
rt6_pmtu_discovery(&orig_hdr->daddr, &orig_hdr->saddr, dev,
|
||||
ntohl(hdr->icmp6_mtu));
|
||||
|
||||
/*
|
||||
* Drop through to notify
|
||||
|
|
|
@ -43,6 +43,7 @@
|
|||
#include <linux/list.h>
|
||||
#include <linux/vmalloc.h>
|
||||
#include <linux/rtnetlink.h>
|
||||
#include <net/ip6_route.h>
|
||||
#include <net/icmp.h>
|
||||
#include <net/ipv6.h>
|
||||
#include <net/protocol.h>
|
||||
|
@ -71,6 +72,7 @@ static void ipcomp6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
|
|||
|
||||
printk(KERN_DEBUG "pmtu discovery on SA IPCOMP/%08x/%pI6\n",
|
||||
spi, &iph->daddr);
|
||||
ip6_update_pmtu(skb, net, info, 0, 0);
|
||||
xfrm_state_put(x);
|
||||
}
|
||||
|
||||
|
|
|
@ -327,9 +327,10 @@ static void rawv6_err(struct sock *sk, struct sk_buff *skb,
|
|||
return;
|
||||
|
||||
harderr = icmpv6_err_convert(type, code, &err);
|
||||
if (type == ICMPV6_PKT_TOOBIG)
|
||||
if (type == ICMPV6_PKT_TOOBIG) {
|
||||
ip6_sk_update_pmtu(skb, sk, info);
|
||||
harderr = (np->pmtudisc == IPV6_PMTUDISC_DO);
|
||||
|
||||
}
|
||||
if (np->recverr) {
|
||||
u8 *payload = skb->data;
|
||||
if (!inet->hdrincl)
|
||||
|
|
143
net/ipv6/route.c
143
net/ipv6/route.c
|
@ -1077,7 +1077,10 @@ static void ip6_rt_update_pmtu(struct dst_entry *dst, u32 mtu)
|
|||
{
|
||||
struct rt6_info *rt6 = (struct rt6_info*)dst;
|
||||
|
||||
dst_confirm(dst);
|
||||
if (mtu < dst_mtu(dst) && rt6->rt6i_dst.plen == 128) {
|
||||
struct net *net = dev_net(dst->dev);
|
||||
|
||||
rt6->rt6i_flags |= RTF_MODIFIED;
|
||||
if (mtu < IPV6_MIN_MTU) {
|
||||
u32 features = dst_metric(dst, RTAX_FEATURES);
|
||||
|
@ -1086,9 +1089,39 @@ static void ip6_rt_update_pmtu(struct dst_entry *dst, u32 mtu)
|
|||
dst_metric_set(dst, RTAX_FEATURES, features);
|
||||
}
|
||||
dst_metric_set(dst, RTAX_MTU, mtu);
|
||||
rt6_update_expires(rt6, net->ipv6.sysctl.ip6_rt_mtu_expires);
|
||||
}
|
||||
}
|
||||
|
||||
void ip6_update_pmtu(struct sk_buff *skb, struct net *net, __be32 mtu,
|
||||
int oif, u32 mark)
|
||||
{
|
||||
const struct ipv6hdr *iph = (struct ipv6hdr *) skb->data;
|
||||
struct dst_entry *dst;
|
||||
struct flowi6 fl6;
|
||||
|
||||
memset(&fl6, 0, sizeof(fl6));
|
||||
fl6.flowi6_oif = oif;
|
||||
fl6.flowi6_mark = mark;
|
||||
fl6.flowi6_flags = FLOWI_FLAG_PRECOW_METRICS;
|
||||
fl6.daddr = iph->daddr;
|
||||
fl6.saddr = iph->saddr;
|
||||
fl6.flowlabel = (*(__be32 *) iph) & IPV6_FLOWINFO_MASK;
|
||||
|
||||
dst = ip6_route_output(net, NULL, &fl6);
|
||||
if (!dst->error)
|
||||
ip6_rt_update_pmtu(dst, ntohl(mtu));
|
||||
dst_release(dst);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ip6_update_pmtu);
|
||||
|
||||
void ip6_sk_update_pmtu(struct sk_buff *skb, struct sock *sk, __be32 mtu)
|
||||
{
|
||||
ip6_update_pmtu(skb, sock_net(sk), mtu,
|
||||
sk->sk_bound_dev_if, sk->sk_mark);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ip6_sk_update_pmtu);
|
||||
|
||||
static unsigned int ip6_default_advmss(const struct dst_entry *dst)
|
||||
{
|
||||
struct net_device *dev = dst->dev;
|
||||
|
@ -1754,116 +1787,6 @@ out:
|
|||
dst_release(&rt->dst);
|
||||
}
|
||||
|
||||
/*
|
||||
* Handle ICMP "packet too big" messages
|
||||
* i.e. Path MTU discovery
|
||||
*/
|
||||
|
||||
static void rt6_do_pmtu_disc(const struct in6_addr *daddr, const struct in6_addr *saddr,
|
||||
struct net *net, u32 pmtu, int ifindex)
|
||||
{
|
||||
struct rt6_info *rt, *nrt;
|
||||
int allfrag = 0;
|
||||
again:
|
||||
rt = rt6_lookup(net, daddr, saddr, ifindex, 0);
|
||||
if (!rt)
|
||||
return;
|
||||
|
||||
if (rt6_check_expired(rt)) {
|
||||
ip6_del_rt(rt);
|
||||
goto again;
|
||||
}
|
||||
|
||||
if (pmtu >= dst_mtu(&rt->dst))
|
||||
goto out;
|
||||
|
||||
if (pmtu < IPV6_MIN_MTU) {
|
||||
/*
|
||||
* According to RFC2460, PMTU is set to the IPv6 Minimum Link
|
||||
* MTU (1280) and a fragment header should always be included
|
||||
* after a node receiving Too Big message reporting PMTU is
|
||||
* less than the IPv6 Minimum Link MTU.
|
||||
*/
|
||||
pmtu = IPV6_MIN_MTU;
|
||||
allfrag = 1;
|
||||
}
|
||||
|
||||
/* New mtu received -> path was valid.
|
||||
They are sent only in response to data packets,
|
||||
so that this nexthop apparently is reachable. --ANK
|
||||
*/
|
||||
dst_confirm(&rt->dst);
|
||||
|
||||
/* Host route. If it is static, it would be better
|
||||
not to override it, but add new one, so that
|
||||
when cache entry will expire old pmtu
|
||||
would return automatically.
|
||||
*/
|
||||
if (rt->rt6i_flags & RTF_CACHE) {
|
||||
dst_metric_set(&rt->dst, RTAX_MTU, pmtu);
|
||||
if (allfrag) {
|
||||
u32 features = dst_metric(&rt->dst, RTAX_FEATURES);
|
||||
features |= RTAX_FEATURE_ALLFRAG;
|
||||
dst_metric_set(&rt->dst, RTAX_FEATURES, features);
|
||||
}
|
||||
rt6_update_expires(rt, net->ipv6.sysctl.ip6_rt_mtu_expires);
|
||||
rt->rt6i_flags |= RTF_MODIFIED;
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* Network route.
|
||||
Two cases are possible:
|
||||
1. It is connected route. Action: COW
|
||||
2. It is gatewayed route or NONEXTHOP route. Action: clone it.
|
||||
*/
|
||||
if (!dst_get_neighbour_noref_raw(&rt->dst) && !(rt->rt6i_flags & RTF_NONEXTHOP))
|
||||
nrt = rt6_alloc_cow(rt, daddr, saddr);
|
||||
else
|
||||
nrt = rt6_alloc_clone(rt, daddr);
|
||||
|
||||
if (nrt) {
|
||||
dst_metric_set(&nrt->dst, RTAX_MTU, pmtu);
|
||||
if (allfrag) {
|
||||
u32 features = dst_metric(&nrt->dst, RTAX_FEATURES);
|
||||
features |= RTAX_FEATURE_ALLFRAG;
|
||||
dst_metric_set(&nrt->dst, RTAX_FEATURES, features);
|
||||
}
|
||||
|
||||
/* According to RFC 1981, detecting PMTU increase shouldn't be
|
||||
* happened within 5 mins, the recommended timer is 10 mins.
|
||||
* Here this route expiration time is set to ip6_rt_mtu_expires
|
||||
* which is 10 mins. After 10 mins the decreased pmtu is expired
|
||||
* and detecting PMTU increase will be automatically happened.
|
||||
*/
|
||||
rt6_update_expires(nrt, net->ipv6.sysctl.ip6_rt_mtu_expires);
|
||||
nrt->rt6i_flags |= RTF_DYNAMIC;
|
||||
ip6_ins_rt(nrt);
|
||||
}
|
||||
out:
|
||||
dst_release(&rt->dst);
|
||||
}
|
||||
|
||||
void rt6_pmtu_discovery(const struct in6_addr *daddr, const struct in6_addr *saddr,
|
||||
struct net_device *dev, u32 pmtu)
|
||||
{
|
||||
struct net *net = dev_net(dev);
|
||||
|
||||
/*
|
||||
* RFC 1981 states that a node "MUST reduce the size of the packets it
|
||||
* is sending along the path" that caused the Packet Too Big message.
|
||||
* Since it's not possible in the general case to determine which
|
||||
* interface was used to send the original packet, we update the MTU
|
||||
* on the interface that will be used to send future packets. We also
|
||||
* update the MTU on the interface that received the Packet Too Big in
|
||||
* case the original packet was forced out that interface with
|
||||
* SO_BINDTODEVICE or similar. This is the next best thing to the
|
||||
* correct behaviour, which would be to update the MTU on all
|
||||
* interfaces.
|
||||
*/
|
||||
rt6_do_pmtu_disc(daddr, saddr, net, pmtu, 0);
|
||||
rt6_do_pmtu_disc(daddr, saddr, net, pmtu, dev->ifindex);
|
||||
}
|
||||
|
||||
/*
|
||||
* Misc support functions
|
||||
*/
|
||||
|
|
|
@ -417,6 +417,8 @@ static void tcp_v6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
|
|||
} else
|
||||
dst_hold(dst);
|
||||
|
||||
dst->ops->update_pmtu(dst, ntohl(info));
|
||||
|
||||
if (inet_csk(sk)->icsk_pmtu_cookie > dst_mtu(dst)) {
|
||||
tcp_sync_mss(sk, dst_mtu(dst));
|
||||
tcp_simple_retransmit(sk);
|
||||
|
@ -829,14 +831,15 @@ static int tcp6_gro_complete(struct sk_buff *skb)
|
|||
return tcp_gro_complete(skb);
|
||||
}
|
||||
|
||||
static void tcp_v6_send_response(struct sk_buff *skb, u32 seq, u32 ack, u32 win,
|
||||
u32 ts, struct tcp_md5sig_key *key, int rst, u8 tclass)
|
||||
static void tcp_v6_send_response(struct sock *sk, struct sk_buff *skb, u32 seq,
|
||||
u32 ack, u32 win, u32 ts,
|
||||
struct tcp_md5sig_key *key, int rst, u8 tclass)
|
||||
{
|
||||
const struct tcphdr *th = tcp_hdr(skb);
|
||||
struct tcphdr *t1;
|
||||
struct sk_buff *buff;
|
||||
struct flowi6 fl6;
|
||||
struct net *net = dev_net(skb_dst(skb)->dev);
|
||||
struct net *net = sk ? sock_net(sk) : dev_net(skb_dst(skb)->dev);
|
||||
struct sock *ctl_sk = net->ipv6.tcp_sk;
|
||||
unsigned int tot_len = sizeof(struct tcphdr);
|
||||
struct dst_entry *dst;
|
||||
|
@ -980,7 +983,7 @@ static void tcp_v6_send_reset(struct sock *sk, struct sk_buff *skb)
|
|||
ack_seq = ntohl(th->seq) + th->syn + th->fin + skb->len -
|
||||
(th->doff << 2);
|
||||
|
||||
tcp_v6_send_response(skb, seq, ack_seq, 0, 0, key, 1, 0);
|
||||
tcp_v6_send_response(sk, skb, seq, ack_seq, 0, 0, key, 1, 0);
|
||||
|
||||
#ifdef CONFIG_TCP_MD5SIG
|
||||
release_sk1:
|
||||
|
@ -991,10 +994,11 @@ release_sk1:
|
|||
#endif
|
||||
}
|
||||
|
||||
static void tcp_v6_send_ack(struct sk_buff *skb, u32 seq, u32 ack, u32 win, u32 ts,
|
||||
static void tcp_v6_send_ack(struct sock *sk, struct sk_buff *skb,
|
||||
u32 seq, u32 ack, u32 win, u32 ts,
|
||||
struct tcp_md5sig_key *key, u8 tclass)
|
||||
{
|
||||
tcp_v6_send_response(skb, seq, ack, win, ts, key, 0, tclass);
|
||||
tcp_v6_send_response(sk, skb, seq, ack, win, ts, key, 0, tclass);
|
||||
}
|
||||
|
||||
static void tcp_v6_timewait_ack(struct sock *sk, struct sk_buff *skb)
|
||||
|
@ -1002,7 +1006,7 @@ static void tcp_v6_timewait_ack(struct sock *sk, struct sk_buff *skb)
|
|||
struct inet_timewait_sock *tw = inet_twsk(sk);
|
||||
struct tcp_timewait_sock *tcptw = tcp_twsk(sk);
|
||||
|
||||
tcp_v6_send_ack(skb, tcptw->tw_snd_nxt, tcptw->tw_rcv_nxt,
|
||||
tcp_v6_send_ack(sk, skb, tcptw->tw_snd_nxt, tcptw->tw_rcv_nxt,
|
||||
tcptw->tw_rcv_wnd >> tw->tw_rcv_wscale,
|
||||
tcptw->tw_ts_recent, tcp_twsk_md5_key(tcptw),
|
||||
tw->tw_tclass);
|
||||
|
@ -1013,7 +1017,7 @@ static void tcp_v6_timewait_ack(struct sock *sk, struct sk_buff *skb)
|
|||
static void tcp_v6_reqsk_send_ack(struct sock *sk, struct sk_buff *skb,
|
||||
struct request_sock *req)
|
||||
{
|
||||
tcp_v6_send_ack(skb, tcp_rsk(req)->snt_isn + 1, tcp_rsk(req)->rcv_isn + 1, req->rcv_wnd, req->ts_recent,
|
||||
tcp_v6_send_ack(sk, skb, tcp_rsk(req)->snt_isn + 1, tcp_rsk(req)->rcv_isn + 1, req->rcv_wnd, req->ts_recent,
|
||||
tcp_v6_md5_do_lookup(sk, &ipv6_hdr(skb)->daddr), 0);
|
||||
}
|
||||
|
||||
|
|
|
@ -477,6 +477,9 @@ void __udp6_lib_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
|
|||
if (sk == NULL)
|
||||
return;
|
||||
|
||||
if (type == ICMPV6_PKT_TOOBIG)
|
||||
ip6_sk_update_pmtu(skb, sk, info);
|
||||
|
||||
np = inet6_sk(sk);
|
||||
|
||||
if (!icmpv6_err_convert(type, code, &err) && !np->recverr)
|
||||
|
|
|
@ -3323,6 +3323,9 @@ static int selinux_file_fcntl(struct file *file, unsigned int cmd,
|
|||
case F_GETLK:
|
||||
case F_SETLK:
|
||||
case F_SETLKW:
|
||||
case F_OFD_GETLK:
|
||||
case F_OFD_SETLK:
|
||||
case F_OFD_SETLKW:
|
||||
#if BITS_PER_LONG == 32
|
||||
case F_GETLK64:
|
||||
case F_SETLK64:
|
||||
|
|
Loading…
Reference in a new issue