162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */
262306a36Sopenharmony_ci/* Internal definitions for network filesystem support
362306a36Sopenharmony_ci *
462306a36Sopenharmony_ci * Copyright (C) 2021 Red Hat, Inc. All Rights Reserved.
562306a36Sopenharmony_ci * Written by David Howells (dhowells@redhat.com)
662306a36Sopenharmony_ci */
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci#include <linux/netfs.h>
962306a36Sopenharmony_ci#include <linux/fscache.h>
1062306a36Sopenharmony_ci#include <trace/events/netfs.h>
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_ci#ifdef pr_fmt
1362306a36Sopenharmony_ci#undef pr_fmt
1462306a36Sopenharmony_ci#endif
1562306a36Sopenharmony_ci
1662306a36Sopenharmony_ci#define pr_fmt(fmt) "netfs: " fmt
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_ci/*
1962306a36Sopenharmony_ci * buffered_read.c
2062306a36Sopenharmony_ci */
2162306a36Sopenharmony_civoid netfs_rreq_unlock_folios(struct netfs_io_request *rreq);
2262306a36Sopenharmony_ci
2362306a36Sopenharmony_ci/*
2462306a36Sopenharmony_ci * io.c
2562306a36Sopenharmony_ci */
2662306a36Sopenharmony_ciint netfs_begin_read(struct netfs_io_request *rreq, bool sync);
2762306a36Sopenharmony_ci
2862306a36Sopenharmony_ci/*
2962306a36Sopenharmony_ci * main.c
3062306a36Sopenharmony_ci */
3162306a36Sopenharmony_ciextern unsigned int netfs_debug;
3262306a36Sopenharmony_ci
3362306a36Sopenharmony_ci/*
3462306a36Sopenharmony_ci * objects.c
3562306a36Sopenharmony_ci */
3662306a36Sopenharmony_cistruct netfs_io_request *netfs_alloc_request(struct address_space *mapping,
3762306a36Sopenharmony_ci					     struct file *file,
3862306a36Sopenharmony_ci					     loff_t start, size_t len,
3962306a36Sopenharmony_ci					     enum netfs_io_origin origin);
4062306a36Sopenharmony_civoid netfs_get_request(struct netfs_io_request *rreq, enum netfs_rreq_ref_trace what);
4162306a36Sopenharmony_civoid netfs_clear_subrequests(struct netfs_io_request *rreq, bool was_async);
4262306a36Sopenharmony_civoid netfs_put_request(struct netfs_io_request *rreq, bool was_async,
4362306a36Sopenharmony_ci		       enum netfs_rreq_ref_trace what);
4462306a36Sopenharmony_cistruct netfs_io_subrequest *netfs_alloc_subrequest(struct netfs_io_request *rreq);
4562306a36Sopenharmony_ci
4662306a36Sopenharmony_cistatic inline void netfs_see_request(struct netfs_io_request *rreq,
4762306a36Sopenharmony_ci				     enum netfs_rreq_ref_trace what)
4862306a36Sopenharmony_ci{
4962306a36Sopenharmony_ci	trace_netfs_rreq_ref(rreq->debug_id, refcount_read(&rreq->ref), what);
5062306a36Sopenharmony_ci}
5162306a36Sopenharmony_ci
5262306a36Sopenharmony_ci/*
5362306a36Sopenharmony_ci * stats.c
5462306a36Sopenharmony_ci */
5562306a36Sopenharmony_ci#ifdef CONFIG_NETFS_STATS
5662306a36Sopenharmony_ciextern atomic_t netfs_n_rh_readahead;
5762306a36Sopenharmony_ciextern atomic_t netfs_n_rh_readpage;
5862306a36Sopenharmony_ciextern atomic_t netfs_n_rh_rreq;
5962306a36Sopenharmony_ciextern atomic_t netfs_n_rh_sreq;
6062306a36Sopenharmony_ciextern atomic_t netfs_n_rh_download;
6162306a36Sopenharmony_ciextern atomic_t netfs_n_rh_download_done;
6262306a36Sopenharmony_ciextern atomic_t netfs_n_rh_download_failed;
6362306a36Sopenharmony_ciextern atomic_t netfs_n_rh_download_instead;
6462306a36Sopenharmony_ciextern atomic_t netfs_n_rh_read;
6562306a36Sopenharmony_ciextern atomic_t netfs_n_rh_read_done;
6662306a36Sopenharmony_ciextern atomic_t netfs_n_rh_read_failed;
6762306a36Sopenharmony_ciextern atomic_t netfs_n_rh_zero;
6862306a36Sopenharmony_ciextern atomic_t netfs_n_rh_short_read;
6962306a36Sopenharmony_ciextern atomic_t netfs_n_rh_write;
7062306a36Sopenharmony_ciextern atomic_t netfs_n_rh_write_begin;
7162306a36Sopenharmony_ciextern atomic_t netfs_n_rh_write_done;
7262306a36Sopenharmony_ciextern atomic_t netfs_n_rh_write_failed;
7362306a36Sopenharmony_ciextern atomic_t netfs_n_rh_write_zskip;
7462306a36Sopenharmony_ci
7562306a36Sopenharmony_ci
7662306a36Sopenharmony_cistatic inline void netfs_stat(atomic_t *stat)
7762306a36Sopenharmony_ci{
7862306a36Sopenharmony_ci	atomic_inc(stat);
7962306a36Sopenharmony_ci}
8062306a36Sopenharmony_ci
8162306a36Sopenharmony_cistatic inline void netfs_stat_d(atomic_t *stat)
8262306a36Sopenharmony_ci{
8362306a36Sopenharmony_ci	atomic_dec(stat);
8462306a36Sopenharmony_ci}
8562306a36Sopenharmony_ci
8662306a36Sopenharmony_ci#else
8762306a36Sopenharmony_ci#define netfs_stat(x) do {} while(0)
8862306a36Sopenharmony_ci#define netfs_stat_d(x) do {} while(0)
8962306a36Sopenharmony_ci#endif
9062306a36Sopenharmony_ci
9162306a36Sopenharmony_ci/*
9262306a36Sopenharmony_ci * Miscellaneous functions.
9362306a36Sopenharmony_ci */
9462306a36Sopenharmony_cistatic inline bool netfs_is_cache_enabled(struct netfs_inode *ctx)
9562306a36Sopenharmony_ci{
9662306a36Sopenharmony_ci#if IS_ENABLED(CONFIG_FSCACHE)
9762306a36Sopenharmony_ci	struct fscache_cookie *cookie = ctx->cache;
9862306a36Sopenharmony_ci
9962306a36Sopenharmony_ci	return fscache_cookie_valid(cookie) && cookie->cache_priv &&
10062306a36Sopenharmony_ci		fscache_cookie_enabled(cookie);
10162306a36Sopenharmony_ci#else
10262306a36Sopenharmony_ci	return false;
10362306a36Sopenharmony_ci#endif
10462306a36Sopenharmony_ci}
10562306a36Sopenharmony_ci
10662306a36Sopenharmony_ci/*****************************************************************************/
10762306a36Sopenharmony_ci/*
10862306a36Sopenharmony_ci * debug tracing
10962306a36Sopenharmony_ci */
11062306a36Sopenharmony_ci#define dbgprintk(FMT, ...) \
11162306a36Sopenharmony_ci	printk("[%-6.6s] "FMT"\n", current->comm, ##__VA_ARGS__)
11262306a36Sopenharmony_ci
11362306a36Sopenharmony_ci#define kenter(FMT, ...) dbgprintk("==> %s("FMT")", __func__, ##__VA_ARGS__)
11462306a36Sopenharmony_ci#define kleave(FMT, ...) dbgprintk("<== %s()"FMT"", __func__, ##__VA_ARGS__)
11562306a36Sopenharmony_ci#define kdebug(FMT, ...) dbgprintk(FMT, ##__VA_ARGS__)
11662306a36Sopenharmony_ci
11762306a36Sopenharmony_ci#ifdef __KDEBUG
11862306a36Sopenharmony_ci#define _enter(FMT, ...) kenter(FMT, ##__VA_ARGS__)
11962306a36Sopenharmony_ci#define _leave(FMT, ...) kleave(FMT, ##__VA_ARGS__)
12062306a36Sopenharmony_ci#define _debug(FMT, ...) kdebug(FMT, ##__VA_ARGS__)
12162306a36Sopenharmony_ci
12262306a36Sopenharmony_ci#elif defined(CONFIG_NETFS_DEBUG)
12362306a36Sopenharmony_ci#define _enter(FMT, ...)			\
12462306a36Sopenharmony_cido {						\
12562306a36Sopenharmony_ci	if (netfs_debug)			\
12662306a36Sopenharmony_ci		kenter(FMT, ##__VA_ARGS__);	\
12762306a36Sopenharmony_ci} while (0)
12862306a36Sopenharmony_ci
12962306a36Sopenharmony_ci#define _leave(FMT, ...)			\
13062306a36Sopenharmony_cido {						\
13162306a36Sopenharmony_ci	if (netfs_debug)			\
13262306a36Sopenharmony_ci		kleave(FMT, ##__VA_ARGS__);	\
13362306a36Sopenharmony_ci} while (0)
13462306a36Sopenharmony_ci
13562306a36Sopenharmony_ci#define _debug(FMT, ...)			\
13662306a36Sopenharmony_cido {						\
13762306a36Sopenharmony_ci	if (netfs_debug)			\
13862306a36Sopenharmony_ci		kdebug(FMT, ##__VA_ARGS__);	\
13962306a36Sopenharmony_ci} while (0)
14062306a36Sopenharmony_ci
14162306a36Sopenharmony_ci#else
14262306a36Sopenharmony_ci#define _enter(FMT, ...) no_printk("==> %s("FMT")", __func__, ##__VA_ARGS__)
14362306a36Sopenharmony_ci#define _leave(FMT, ...) no_printk("<== %s()"FMT"", __func__, ##__VA_ARGS__)
14462306a36Sopenharmony_ci#define _debug(FMT, ...) no_printk(FMT, ##__VA_ARGS__)
14562306a36Sopenharmony_ci#endif
146