|
@@ -220,6 +220,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;
|
|
@@ -360,6 +366,11 @@ int simple_commit_write(struct file *file, struct page *page,
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+/*
|
|
|
+ * the inodes created here are not hashed. If you use iunique to generate
|
|
|
+ * unique inode values later for this filesystem, then you must take care
|
|
|
+ * to pass it an appropriate max_reserved value to avoid collisions.
|
|
|
+ */
|
|
|
int simple_fill_super(struct super_block *s, int magic, struct tree_descr *files)
|
|
|
{
|
|
|
struct inode *inode;
|
|
@@ -376,6 +387,11 @@ int simple_fill_super(struct super_block *s, int magic, struct tree_descr *files
|
|
|
inode = new_inode(s);
|
|
|
if (!inode)
|
|
|
return -ENOMEM;
|
|
|
+ /*
|
|
|
+ * because the root inode is 1, the files array must not contain an
|
|
|
+ * entry at index 1
|
|
|
+ */
|
|
|
+ inode->i_ino = 1;
|
|
|
inode->i_mode = S_IFDIR | 0755;
|
|
|
inode->i_uid = inode->i_gid = 0;
|
|
|
inode->i_blocks = 0;
|
|
@@ -391,6 +407,13 @@ int simple_fill_super(struct super_block *s, int magic, struct tree_descr *files
|
|
|
for (i = 0; !files->name || files->name[0]; i++, files++) {
|
|
|
if (!files->name)
|
|
|
continue;
|
|
|
+
|
|
|
+ /* warn if it tries to conflict with the root inode */
|
|
|
+ if (unlikely(i == 1))
|
|
|
+ printk(KERN_WARNING "%s: %s passed in a files array"
|
|
|
+ "with an index of 1!\n", __func__,
|
|
|
+ s->s_type->name);
|
|
|
+
|
|
|
dentry = d_alloc_name(root, files->name);
|
|
|
if (!dentry)
|
|
|
goto out;
|