Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why do inode numbers start from 1 and not 0?

Tags:

The C language convention counts array indices from 0. Why do inode numbers start from 1 and not 0?

If inode 0 is reserved is for some special use, then what is the significance of inode 0?

like image 399
manav m-n Avatar asked Jan 20 '10 04:01

manav m-n


People also ask

What is the root inode number?

The first inode number is 1. 0 is used as a NULL value, to indicate that there is no inode. Inode 1 is used to keep track of any bad blocks on the disk; it is essentially a hidden file containing the bad blocks, so that they will not be used by another file. The bad blocks can be recorded using e2fsck -c .

What determines number of inodes?

The number of bytes per inode determines the total number of inodes that are created when the file system is made: the total size of the file system divided by the number of bytes per inode. Once the inodes are allocated, you cannot change the number without re-creating the file system.

What is the purpose of an inode?

By definition, an inode is an index node. It serves as a unique identifier for a specific piece of metadata on a given filesystem. Each piece of metadata describes what we think of as a file. That's right, inodes operate on each filesystem, independent of the others.

What does the I in inode stand for?

The inode (index node) is a data structure in a Unix-style file system that describes a file-system object such as a file or a directory. Each inode stores the attributes and disk block locations of the object's data.


2 Answers

0 is used as a sentinel value to indicate null or no inode. similar to how pointers can be NULL in C. without a sentinel, you'd need an extra bit to test if an inode in a struct was set or not.

more info here:

All block and inode addresses start at 1. The first block on the disk is block 1. 0 is used to indicate no block. (Sparse files can have these inside them)

http://uranus.chrysocome.net/explore2fs/es2fs.htm

for instance, in old filesystems where directories were represented as a fixed array of file entries, deleting a file would result in setting that entry's inode val to 0. when traversing the directory, any entry with an inode of 0 would be ignored.

like image 94
jspcal Avatar answered Oct 18 '22 03:10

jspcal


Usually, the inode 0 is reserved because a return value of 0 usually signals an error. Multiple method in the Linux kernel -- especially in the VFS layer shared by all file systems -- return an ino_t, e.g. find_inode_number.

There are more reserved inode numbers. For example in ext2:

#define EXT2_BAD_INO             1      /* Bad blocks inode */ #define EXT2_ROOT_INO            2      /* Root inode */ #define EXT2_BOOT_LOADER_INO     5      /* Boot loader inode */ #define EXT2_UNDEL_DIR_INO       6      /* Undelete directory inode */ 

and ext3 has:

#define EXT3_BAD_INO             1      /* Bad blocks inode */ #define EXT3_ROOT_INO            2      /* Root inode */ #define EXT3_BOOT_LOADER_INO     5      /* Boot loader inode */ #define EXT3_UNDEL_DIR_INO       6      /* Undelete directory inode */ #define EXT3_RESIZE_INO          7      /* Reserved group descriptors inode */ #define EXT3_JOURNAL_INO         8      /* Journal inode */ 

and ext4 has:

#define EXT4_BAD_INO             1      /* Bad blocks inode */ #define EXT4_ROOT_INO            2      /* Root inode */ #define EXT4_USR_QUOTA_INO       3      /* User quota inode */ #define EXT4_GRP_QUOTA_INO       4      /* Group quota inode */ #define EXT4_BOOT_LOADER_INO     5      /* Boot loader inode */ #define EXT4_UNDEL_DIR_INO       6      /* Undelete directory inode */ #define EXT4_RESIZE_INO          7      /* Reserved group descriptors inode */ #define EXT4_JOURNAL_INO         8      /* Journal inode */ 

Other fileystems use the ino 1 as root inode number. In general, a file system is free to choose its inode numbers and its reserved ino values (with the exception of 0).

like image 29
dmeister Avatar answered Oct 18 '22 03:10

dmeister