Viewing: libcfs.h

/* SPDX-License-Identifier: GPL-2.0 */

/*
 * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
 * Use is subject to license terms.
 *
 * Copyright (c) 2011, 2017, Intel Corporation.
 */

/*
 * This file is part of Lustre, http://www.lustre.org/
 */

#ifndef __LIBCFS_LIBCFS_H__
#define __LIBCFS_LIBCFS_H__

#include <linux/kernel.h>
#include <uapi/linux/lnet/libcfs_ioctl.h>
#include <linux/libcfs/libcfs_debug.h>
#include <linux/libcfs/libcfs_private.h>

#define LIBCFS_VERSION LUSTRE_VERSION_STRING

typedef s32 timeout_t;

int libcfs_setup(void);

static inline unsigned long cfs_time_seconds(time64_t seconds)
{
	return nsecs_to_jiffies64(seconds * NSEC_PER_SEC);
}

/* Describes one libcfs/LNet debugfs file.  Never registered with the sysctl
 * core, so the handler takes the __user pointer it is really given.
 */
struct lnet_debugfs_table {
	const char	*procname;
	void		*data;
	int		maxlen;
	umode_t		mode;
	void		*extra1;
	void		*extra2;
	int		(*proc_handler)(const struct lnet_debugfs_table *table,
					int write, void __user *buffer,
					size_t *lenp, loff_t *ppos);
};

void lnet_insert_debugfs(const struct lnet_debugfs_table *table,
			 struct module *mod, void **statep);
void lnet_remove_debugfs(const struct lnet_debugfs_table *table);
void lnet_debugfs_fini(void **statep);

int debugfs_doint(const struct lnet_debugfs_table *table, int write,
		  void __user *buffer, size_t *lenp, loff_t *ppos);

#define wait_var_event_warning(var, condition, format, ...)		\
do {									\
	int counter = 4;						\
	might_sleep();							\
	if (condition)							\
		break;							\
	___wait_var_event(var, condition, TASK_UNINTERRUPTIBLE, 0, 0,	\
			  if (schedule_timeout(cfs_time_seconds(1)) == 0)\
				  CDEBUG(is_power_of_2(counter++) ?	\
					 D_WARNING : D_NET,		\
					 format, ## __VA_ARGS__)	\
		);							\
} while (0)

#ifndef container_of_safe
/**
 * container_of_safe - cast a member of a structure out to the containing structure
 * @ptr:        the pointer to the member.
 * @type:       the type of the container struct this is embedded in.
 * @member:     the name of the member within the struct.
 *
 * If IS_ERR_OR_NULL(ptr), ptr is returned unchanged.
 *
 * Note: Copied from Linux 5.6, with BUILD_BUG_ON_MSG section removed.
 */
#define container_of_safe(ptr, type, member) ({				\
	void *__mptr = (void *)(ptr);					\
	IS_ERR_OR_NULL(__mptr) ? ERR_CAST(__mptr) :			\
		((type *)(__mptr - offsetof(type, member))); })
#endif

#define FLEXIBLE_OBJECT \
	"Struct contains a flexible member, the size of object is checked" \
	"and can be safely copied in a single memcpy()"

/* Linux commit v6.18-rc2-1-g70e0a80a1f358
 *   treewide: Remove in_irq()
 */
#ifndef in_hardirq
#define in_hardirq()	in_irq()
#endif

#endif /* _LIBCFS_LIBCFS_H_ */