cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

vfs_dentry.c (2527B)


      1// SPDX-License-Identifier: GPL-2.0-only
      2/*
      3 * This file contians vfs dentry ops for the 9P2000 protocol.
      4 *
      5 *  Copyright (C) 2004 by Eric Van Hensbergen <ericvh@gmail.com>
      6 *  Copyright (C) 2002 by Ron Minnich <rminnich@lanl.gov>
      7 */
      8
      9#include <linux/module.h>
     10#include <linux/errno.h>
     11#include <linux/fs.h>
     12#include <linux/file.h>
     13#include <linux/pagemap.h>
     14#include <linux/stat.h>
     15#include <linux/string.h>
     16#include <linux/inet.h>
     17#include <linux/namei.h>
     18#include <linux/idr.h>
     19#include <linux/sched.h>
     20#include <linux/slab.h>
     21#include <net/9p/9p.h>
     22#include <net/9p/client.h>
     23
     24#include "v9fs.h"
     25#include "v9fs_vfs.h"
     26#include "fid.h"
     27
     28/**
     29 * v9fs_cached_dentry_delete - called when dentry refcount equals 0
     30 * @dentry:  dentry in question
     31 *
     32 */
     33static int v9fs_cached_dentry_delete(const struct dentry *dentry)
     34{
     35	p9_debug(P9_DEBUG_VFS, " dentry: %pd (%p)\n",
     36		 dentry, dentry);
     37
     38	/* Don't cache negative dentries */
     39	if (d_really_is_negative(dentry))
     40		return 1;
     41	return 0;
     42}
     43
     44/**
     45 * v9fs_dentry_release - called when dentry is going to be freed
     46 * @dentry:  dentry that is being release
     47 *
     48 */
     49
     50static void v9fs_dentry_release(struct dentry *dentry)
     51{
     52	struct hlist_node *p, *n;
     53
     54	p9_debug(P9_DEBUG_VFS, " dentry: %pd (%p)\n",
     55		 dentry, dentry);
     56	hlist_for_each_safe(p, n, (struct hlist_head *)&dentry->d_fsdata)
     57		p9_client_clunk(hlist_entry(p, struct p9_fid, dlist));
     58	dentry->d_fsdata = NULL;
     59}
     60
     61static int v9fs_lookup_revalidate(struct dentry *dentry, unsigned int flags)
     62{
     63	struct p9_fid *fid;
     64	struct inode *inode;
     65	struct v9fs_inode *v9inode;
     66
     67	if (flags & LOOKUP_RCU)
     68		return -ECHILD;
     69
     70	inode = d_inode(dentry);
     71	if (!inode)
     72		goto out_valid;
     73
     74	v9inode = V9FS_I(inode);
     75	if (v9inode->cache_validity & V9FS_INO_INVALID_ATTR) {
     76		int retval;
     77		struct v9fs_session_info *v9ses;
     78
     79		fid = v9fs_fid_lookup(dentry);
     80		if (IS_ERR(fid))
     81			return PTR_ERR(fid);
     82
     83		v9ses = v9fs_inode2v9ses(inode);
     84		if (v9fs_proto_dotl(v9ses))
     85			retval = v9fs_refresh_inode_dotl(fid, inode);
     86		else
     87			retval = v9fs_refresh_inode(fid, inode);
     88		p9_client_clunk(fid);
     89
     90		if (retval == -ENOENT)
     91			return 0;
     92		if (retval < 0)
     93			return retval;
     94	}
     95out_valid:
     96	return 1;
     97}
     98
     99const struct dentry_operations v9fs_cached_dentry_operations = {
    100	.d_revalidate = v9fs_lookup_revalidate,
    101	.d_weak_revalidate = v9fs_lookup_revalidate,
    102	.d_delete = v9fs_cached_dentry_delete,
    103	.d_release = v9fs_dentry_release,
    104};
    105
    106const struct dentry_operations v9fs_dentry_operations = {
    107	.d_delete = always_delete_dentry,
    108	.d_release = v9fs_dentry_release,
    109};