This changes the superblock creation routines that call new_inode to take steps to avoid later collisions with other inodes that get created. I took the approach here of not hashing things unless is was strictly necessary, though that does mean that filesystem authors need to be careful to avoid collisions by calling iunique properly. Signed-off-by: Jeff Layton <jlayton@xxxxxxxxxx> diff --git a/fs/libfs.c b/fs/libfs.c index 503898d..5bdaf00 100644 --- a/fs/libfs.c +++ b/fs/libfs.c @@ -217,6 +217,12 @@ int get_sb_pseudo(struct file_system_type *fs_type, char *name, root = new_inode(s); if (!root) goto Enomem; + /* + * since this is the first inode, make it number 1. New inodes created + * after this must take care not to collide with it (by passing + * max_reserved of 1 to iunique). + */ + root->i_ino = 1; root->i_mode = S_IFDIR | S_IRUSR | S_IWUSR; root->i_uid = root->i_gid = 0; root->i_atime = root->i_mtime = root->i_ctime = CURRENT_TIME; @@ -373,6 +379,9 @@ int simple_fill_super(struct super_block *s, int magic, struct tree_descr *files inode = new_inode(s); if (!inode) return -ENOMEM; + /* set to high value to try and avoid collisions with loop below */ + inode->i_ino = 0xffffffff; + insert_inode_hash(inode); inode->i_mode = S_IFDIR | 0755; inode->i_uid = inode->i_gid = 0; inode->i_blocks = 0; @@ -399,6 +408,11 @@ int simple_fill_super(struct super_block *s, int magic, struct tree_descr *files inode->i_blocks = 0; inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME; inode->i_fop = files->ops; + /* + * no need to hash these, but you need to make sure that any + * calls to iunique on this mount call it with a max_reserved + * value high enough to avoid collisions with these inodes. + */ inode->i_ino = i; d_add(dentry, inode); } - To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html