fs/ntfs/inode.c

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

File Facts

System
Linux kernel
Corpus path
fs/ntfs/inode.c
Extension
.c
Size
111902 bytes
Lines
3807
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(rl)) {
				err = PTR_ERR(rl);
				ntfs_error(sb,
					   "Failed to decompress runlist. Leaving inconsistent metadata.\n");
				continue;
			}

			err = ntfs_cluster_free_from_rl(ni->vol, rl);
			if (err)
				ntfs_error(sb,
					   "Failed to free attribute clusters. Leaving inconsistent metadata.\n");
			kvfree(rl);
		}
	}

	ntfs_release_dirty_clusters(ni->vol, ni->i_dealloc_clusters);
	ntfs_attr_put_search_ctx(actx);
	return err;
}

int ntfs_drop_big_inode(struct inode *inode)
{
	struct ntfs_inode *ni = NTFS_I(inode);

	if (!inode_unhashed(inode) && inode_state_read_once(inode) & I_SYNC) {
		if (ni->type == AT_DATA || ni->type == AT_INDEX_ALLOCATION) {
			if (!inode->i_nlink) {
				struct ntfs_inode *ni = NTFS_I(inode);

				if (ni->data_size == 0)
					return 0;

				/* To avoid evict_inode call simultaneously */
				atomic_inc(&inode->i_count);
				spin_unlock(&inode->i_lock);

				truncate_setsize(VFS_I(ni), 0);
				ntfs_truncate_vfs(VFS_I(ni), 0, 1);

				sb_start_intwrite(inode->i_sb);
				i_size_write(inode, 0);
				ni->allocated_size = ni->initialized_size = ni->data_size = 0;

				truncate_inode_pages_final(inode->i_mapping);
				sb_end_intwrite(inode->i_sb);

				spin_lock(&inode->i_lock);
				atomic_dec(&inode->i_count);
			}
		}
		return 0;
	}

	return inode_generic_drop(inode);
}

static inline struct ntfs_inode *ntfs_alloc_extent_inode(void)
{
	struct ntfs_inode *ni;

	ntfs_debug("Entering.");
	ni = kmem_cache_alloc(ntfs_inode_cache, GFP_NOFS);
	if (likely(ni != NULL)) {
		ni->state = 0;
		return ni;
	}
	ntfs_error(NULL, "Allocation of NTFS inode structure failed.");
	return NULL;
}

static void ntfs_destroy_extent_inode(struct ntfs_inode *ni)
{
	ntfs_debug("Entering.");

	if (!atomic_dec_and_test(&ni->count))
		WARN_ON(1);
	if (ni->folio)
		folio_put(ni->folio);
	kfree(ni->mrec);
	kmem_cache_free(ntfs_inode_cache, ni);
}

static struct lock_class_key attr_inode_mrec_lock_class;
static struct lock_class_key attr_list_inode_mrec_lock_class;

/*
 * The attribute runlist lock has separate locking rules from the
 * normal runlist lock, so split the two lock-classes:
 */
static struct lock_class_key attr_list_rl_lock_class;

Annotation

Implementation Notes