fs/ntfs/object_id.c

Source file repositories/reference/linux-study-clean/fs/ntfs/object_id.c

File Facts

System
Linux kernel
Corpus path
fs/ntfs/object_id.c
Extension
.c
Size
3881 bytes
Lines
159
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

struct object_id_index_key {
	union {
		u32 alignment;
		struct guid guid;
	} object_id;
} __packed;

struct object_id_index_data {
	__le64 file_id;
	struct guid birth_volume_id;
	struct guid birth_object_id;
	struct guid domain_id;
} __packed;

/* Index entry in $Extend/$ObjId */
struct object_id_index {
	struct index_entry_header header;
	struct object_id_index_key key;
	struct object_id_index_data data;
} __packed;

__le16 objid_index_name[] = {cpu_to_le16('$'), cpu_to_le16('O'), 0};

/*
 * open_object_id_index - Open the $Extend/$ObjId file and its index
 * @vol: NTFS volume structure
 *
 * Opens the $ObjId system file and retrieves its index context.
 *
 * Return: The index context if opened successfully, or NULL if an error
 *	   occurred.
 */
static struct ntfs_index_context *open_object_id_index(struct ntfs_volume *vol)
{
	struct inode *dir_vi, *vi;
	struct ntfs_inode *dir_ni;
	struct ntfs_index_context *xo = NULL;
	struct ntfs_name *name = NULL;
	u64 mref;
	int uname_len;
	__le16 *uname;

	uname_len = ntfs_nlstoucs(vol, "$ObjId", 6, &uname,
			NTFS_MAX_NAME_LEN);
	if (uname_len < 0)
		return NULL;

	/* do not use path_name_to inode - could reopen root */
	dir_vi = ntfs_iget(vol->sb, FILE_Extend);
	if (IS_ERR(dir_vi)) {
		kmem_cache_free(ntfs_name_cache, uname);
		return NULL;
	}
	dir_ni = NTFS_I(dir_vi);

	mutex_lock_nested(&dir_ni->mrec_lock, NTFS_EXTEND_MUTEX_PARENT);
	mref = ntfs_lookup_inode_by_name(dir_ni, uname, uname_len, &name);
	mutex_unlock(&dir_ni->mrec_lock);
	kfree(name);
	kmem_cache_free(ntfs_name_cache, uname);
	if (IS_ERR_MREF(mref))
		goto put_dir_vi;

	vi = ntfs_iget(vol->sb, MREF(mref));
	if (IS_ERR(vi))
		goto put_dir_vi;

	xo = ntfs_index_ctx_get(NTFS_I(vi), objid_index_name, 2);
	if (!xo)
		iput(vi);
put_dir_vi:
	iput(dir_vi);
	return xo;
}


/*
 * remove_object_id_index - Remove an object id index entry if attribute present
 * @ni: NTFS inode structure containing the attribute
 * @xo:	Index context for the object id index
 *
 * Reads the existing object ID attribute and removes it from the index.
 *
 * Return: 0 on success, or a negative error code on failure.
 */
static int remove_object_id_index(struct ntfs_inode *ni, struct ntfs_index_context *xo)
{
	struct object_id_index_key key = {0};
	s64 size;

Annotation

Implementation Notes