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