X-Git-Url: https://git.liburcu.org/?a=blobdiff_plain;f=src%2Flttng-statedump-impl.c;h=2b42783a2c0617ae93b74a894c488a3f0f16fe80;hb=HEAD;hp=22e3628ba459c9d0b56db7d2e9b90417ce71fed8;hpb=7724cf27c1e739099c7907ba5b3b8bc86f904595;p=lttng-modules.git diff --git a/src/lttng-statedump-impl.c b/src/lttng-statedump-impl.c index 22e3628b..5ea790f5 100644 --- a/src/lttng-statedump-impl.c +++ b/src/lttng-statedump-impl.c @@ -36,12 +36,12 @@ #include #include +#include #include #include #include #include #include -#include #include /* Define the tracepoints, but do not build the probes */ @@ -191,7 +191,8 @@ enum lttng_process_status { }; -#if (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(6,0,0)) +#if (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(6,0,0) || \ + LTTNG_RHEL_KERNEL_RANGE(5,14,0,163,0,0, 5,15,0,0,0,0)) #define LTTNG_PART_STRUCT_TYPE struct block_device @@ -385,6 +386,20 @@ void lttng_enumerate_device(struct lttng_kernel_session *session, } } +#if (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(6,9,0)) +static +int lttng_enumerate_network_ip_interface(struct lttng_kernel_session *session) +{ + struct net_device *dev; + + rtnl_lock(); + for_each_netdev(&init_net, dev) + lttng_enumerate_device(session, dev); + rtnl_unlock(); + + return 0; +} +#else static int lttng_enumerate_network_ip_interface(struct lttng_kernel_session *session) { @@ -397,6 +412,7 @@ int lttng_enumerate_network_ip_interface(struct lttng_kernel_session *session) return 0; } +#endif /* (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(6,9,0)) */ #else /* CONFIG_INET */ static inline int lttng_enumerate_network_ip_interface(struct lttng_kernel_session *session) @@ -419,17 +435,22 @@ int lttng_dump_one_fd(const void *p, struct file *file, unsigned int fd) */ flags &= ~FMODE_NONOTIFY; fdt = files_fdtable(ctx->files); + /* - * We need to check here again whether fd is within the fdt - * max_fds range, because we might be seeing a different - * files_fdtable() than iterate_fd(), assuming only RCU is - * protecting the read. In reality, iterate_fd() holds - * file_lock, which should ensure the fdt does not change while - * the lock is taken, but we are not aware whether this is - * guaranteed or not, so play safe. + * The fdt should only grow and iterate_fd() holds file_lock, which + * should ensure the fdt does not change while the lock is taken but be + * cautious and check anyway. */ - if (fd < fdt->max_fds && close_on_exec(fd, fdt)) + if (WARN_ON_ONCE(fd >= fdt->max_fds)) + return 0; + + if (lttng_close_on_exec(fd, ctx->files)) flags |= O_CLOEXEC; + + /* + * If d_path() failed to get a full path for the file, use the dentry + * name instead to at least get a filename. + */ if (IS_ERR(s)) { struct dentry *dentry = file->f_path.dentry;