fs/9p/vfs_dentry.c

Source file repositories/reference/linux-study-clean/fs/9p/vfs_dentry.c

File Facts

System
Linux kernel
Corpus path
fs/9p/vfs_dentry.c
Extension
.c
Size
5794 bytes
Lines
229
Domain
Core OS
Bucket
VFS And Filesystem Core
Inferred role
Core OS: implementation source
Status
source implementation candidate

Why This File Exists

Core operating-system implementation surface: boot, tasks, memory, VFS, syscall-facing interfaces, synchronization, credentials, and isolation.

Dependency Surface

Detected Declarations

Annotated Snippet

if (IS_ERR(fid)) {
			p9_debug(
				P9_DEBUG_VFS,
				"v9fs_fid_lookup: dentry = %pd (%p), got error %pe\n",
				dentry, dentry, fid);
			return PTR_ERR(fid);
		}

		v9ses = v9fs_inode2v9ses(inode);
		if (v9fs_proto_dotl(v9ses))
			retval = v9fs_refresh_inode_dotl(fid, inode);
		else
			retval = v9fs_refresh_inode(fid, inode);
		p9_fid_put(fid);

		if (retval == -ENOENT) {
			p9_debug(P9_DEBUG_VFS, "dentry: %pd (%p) invalidated due to ENOENT\n",
				 dentry, dentry);
			return 0;
		}
		if (v9inode->cache_validity & V9FS_INO_INVALID_ATTR) {
			p9_debug(P9_DEBUG_VFS, "dentry: %pd (%p) invalidated due to type change\n",
				 dentry, dentry);
			return 0;
		}
		if (retval < 0) {
			p9_debug(P9_DEBUG_VFS,
				"refresh inode: dentry = %pd (%p), got error %pe\n",
				dentry, dentry, ERR_PTR(retval));
			return retval;
		}
	}
	p9_debug(P9_DEBUG_VFS, "dentry: %pd (%p) is valid\n", dentry, dentry);
	return 1;
}

static int v9fs_lookup_revalidate(struct inode *dir, const struct qstr *name,
				  struct dentry *dentry, unsigned int flags)
{
	return __v9fs_lookup_revalidate(dentry, flags);
}

static bool v9fs_dentry_unalias_trylock(const struct dentry *dentry)
{
	struct v9fs_session_info *v9ses = v9fs_dentry2v9ses(dentry);
	return down_write_trylock(&v9ses->rename_sem);
}

static void v9fs_dentry_unalias_unlock(const struct dentry *dentry)
{
	struct v9fs_session_info *v9ses = v9fs_dentry2v9ses(dentry);
	up_write(&v9ses->rename_sem);
}

const struct dentry_operations v9fs_cached_dentry_operations = {
	.d_revalidate = v9fs_lookup_revalidate,
	.d_weak_revalidate = __v9fs_lookup_revalidate,
	.d_delete = v9fs_cached_dentry_delete,
	.d_init = v9fs_dentry_init,
	.d_release = v9fs_dentry_release,
	.d_unalias_trylock = v9fs_dentry_unalias_trylock,
	.d_unalias_unlock = v9fs_dentry_unalias_unlock,
};

const struct dentry_operations v9fs_dentry_operations = {
	.d_init = v9fs_dentry_init,
	.d_release = v9fs_dentry_release,
	.d_unalias_trylock = v9fs_dentry_unalias_trylock,
	.d_unalias_unlock = v9fs_dentry_unalias_unlock,
};

Annotation

Implementation Notes