Revision 916f6efae62305796e012e7c3a7884a267cbacbf authored by Florian Westphal on 17 April 2019, 00:17:23 UTC, committed by Pablo Neira Ayuso on 22 April 2019, 08:34:30 UTC
setting net.netfilter.nf_conntrack_timestamp=1 breaks xmit with fq scheduler. skb->tstamp might be "refreshed" using ktime_get_real(), but fq expects CLOCK_MONOTONIC. This patch removes all places in netfilter that check/set skb->tstamp: 1. To fix the bogus "start" time seen with conntrack timestamping for outgoing packets, never use skb->tstamp and always use current time. 2. In nfqueue and nflog, only use skb->tstamp for incoming packets, as determined by current hook (prerouting, input, forward). 3. xt_time has to use system clock as well rather than skb->tstamp. We could still use skb->tstamp for prerouting/input/foward, but I see no advantage to make this conditional. Fixes: fb420d5d91c1 ("tcp/fq: move back to CLOCK_MONOTONIC") Cc: Eric Dumazet <edumazet@google.com> Reported-by: Michal Soltys <soltys@ziu.info> Signed-off-by: Florian Westphal <fw@strlen.de> Acked-by: Eric Dumazet <edumazet@google.com> Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
1 parent 7caa56f
fs_types.c
// SPDX-License-Identifier: GPL-2.0
#include <linux/fs.h>
#include <linux/export.h>
/*
* fs on-disk file type to dirent file type conversion
*/
static const unsigned char fs_dtype_by_ftype[FT_MAX] = {
[FT_UNKNOWN] = DT_UNKNOWN,
[FT_REG_FILE] = DT_REG,
[FT_DIR] = DT_DIR,
[FT_CHRDEV] = DT_CHR,
[FT_BLKDEV] = DT_BLK,
[FT_FIFO] = DT_FIFO,
[FT_SOCK] = DT_SOCK,
[FT_SYMLINK] = DT_LNK
};
/**
* fs_ftype_to_dtype() - fs on-disk file type to dirent type.
* @filetype: The on-disk file type to convert.
*
* This function converts the on-disk file type value (FT_*) to the directory
* entry type (DT_*).
*
* Context: Any context.
* Return:
* * DT_UNKNOWN - Unknown type
* * DT_FIFO - FIFO
* * DT_CHR - Character device
* * DT_DIR - Directory
* * DT_BLK - Block device
* * DT_REG - Regular file
* * DT_LNK - Symbolic link
* * DT_SOCK - Local-domain socket
*/
unsigned char fs_ftype_to_dtype(unsigned int filetype)
{
if (filetype >= FT_MAX)
return DT_UNKNOWN;
return fs_dtype_by_ftype[filetype];
}
EXPORT_SYMBOL_GPL(fs_ftype_to_dtype);
/*
* dirent file type to fs on-disk file type conversion
* Values not initialized explicitly are FT_UNKNOWN (0).
*/
static const unsigned char fs_ftype_by_dtype[DT_MAX] = {
[DT_REG] = FT_REG_FILE,
[DT_DIR] = FT_DIR,
[DT_LNK] = FT_SYMLINK,
[DT_CHR] = FT_CHRDEV,
[DT_BLK] = FT_BLKDEV,
[DT_FIFO] = FT_FIFO,
[DT_SOCK] = FT_SOCK,
};
/**
* fs_umode_to_ftype() - file mode to on-disk file type.
* @mode: The file mode to convert.
*
* This function converts the file mode value to the on-disk file type (FT_*).
*
* Context: Any context.
* Return:
* * FT_UNKNOWN - Unknown type
* * FT_REG_FILE - Regular file
* * FT_DIR - Directory
* * FT_CHRDEV - Character device
* * FT_BLKDEV - Block device
* * FT_FIFO - FIFO
* * FT_SOCK - Local-domain socket
* * FT_SYMLINK - Symbolic link
*/
unsigned char fs_umode_to_ftype(umode_t mode)
{
return fs_ftype_by_dtype[S_DT(mode)];
}
EXPORT_SYMBOL_GPL(fs_umode_to_ftype);
/**
* fs_umode_to_dtype() - file mode to dirent file type.
* @mode: The file mode to convert.
*
* This function converts the file mode value to the directory
* entry type (DT_*).
*
* Context: Any context.
* Return:
* * DT_UNKNOWN - Unknown type
* * DT_FIFO - FIFO
* * DT_CHR - Character device
* * DT_DIR - Directory
* * DT_BLK - Block device
* * DT_REG - Regular file
* * DT_LNK - Symbolic link
* * DT_SOCK - Local-domain socket
*/
unsigned char fs_umode_to_dtype(umode_t mode)
{
return fs_ftype_to_dtype(fs_umode_to_ftype(mode));
}
EXPORT_SYMBOL_GPL(fs_umode_to_dtype);
![swh spinner](/static/img/swh-spinner.gif)
Computing file changes ...