fs/afs/dir.c

Source file repositories/reference/linux-study-clean/fs/afs/dir.c

File Facts

System
Linux kernel
Corpus path
fs/afs/dir.c
Extension
.c
Size
60952 bytes
Lines
2231
Domain
Core OS
Bucket
VFS And Filesystem Core
Inferred role
Core OS: operation-table or driver-model contract
Status
pattern 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

const struct file_operations afs_dir_file_operations = {
	.open		= afs_dir_open,
	.release	= afs_release,
	.iterate_shared	= afs_readdir,
	.lock		= afs_lock,
	.llseek		= generic_file_llseek,
};

const struct inode_operations afs_dir_inode_operations = {
	.create		= afs_create,
	.lookup		= afs_lookup,
	.link		= afs_link,
	.unlink		= afs_unlink,
	.symlink	= afs_symlink,
	.mkdir		= afs_mkdir,
	.rmdir		= afs_rmdir,
	.rename		= afs_rename,
	.permission	= afs_permission,
	.getattr	= afs_getattr,
	.setattr	= afs_setattr,
};

const struct address_space_operations afs_dir_aops = {
	.writepages	= afs_dir_writepages,
};

const struct dentry_operations afs_fs_dentry_operations = {
	.d_revalidate	= afs_d_revalidate,
	.d_delete	= afs_d_delete,
	.d_release	= afs_d_release,
	.d_automount	= afs_d_automount,
	.d_iput		= afs_d_iput,
};

struct afs_lookup_one_cookie {
	struct dir_context	ctx;
	struct qstr		name;
	bool			found;
	struct afs_fid		fid;
};

struct afs_lookup_cookie {
	struct dir_context	ctx;
	struct qstr		name;
	unsigned short		nr_fids;
	struct afs_fid		fids[50];
};

static void afs_dir_unuse_cookie(struct afs_vnode *dvnode, int ret)
{
	if (ret == 0) {
		struct afs_vnode_cache_aux aux;
		loff_t i_size = i_size_read(&dvnode->netfs.inode);

		afs_set_cache_aux(dvnode, &aux);
		fscache_unuse_cookie(afs_vnode_cache(dvnode), &aux, &i_size);
	} else {
		fscache_unuse_cookie(afs_vnode_cache(dvnode), NULL, NULL);
	}
}

/*
 * Iterate through a kmapped directory segment, dumping a summary of
 * the contents.
 */
static size_t afs_dir_dump_step(void *iter_base, size_t progress, size_t len,
				void *priv, void *priv2)
{
	do {
		union afs_xdr_dir_block *block = iter_base;

		pr_warn("[%05zx] %32phN\n", progress, block);
		iter_base += AFS_DIR_BLOCK_SIZE;
		progress += AFS_DIR_BLOCK_SIZE;
		len -= AFS_DIR_BLOCK_SIZE;
	} while (len > 0);

	return len;
}

/*
 * Dump the contents of a directory.
 */
static void afs_dir_dump(struct afs_vnode *dvnode)
{
	struct iov_iter iter;
	unsigned long long i_size = i_size_read(&dvnode->netfs.inode);

	pr_warn("DIR %llx:%llx is=%llx\n",
		dvnode->fid.vid, dvnode->fid.vnode, i_size);

Annotation

Implementation Notes