in internal/fs/fs.go [752:823]
func (fs *fileSystem) mintInode(ic inode.Core) (in inode.Inode) {
// Choose an ID.
id := fs.nextInodeID
fs.nextInodeID++
// Create the inode.
switch {
// Explicit directories or folders in hierarchical bucket.
case (ic.MinObject != nil && ic.FullName.IsDir()), ic.Folder != nil:
in = fs.createExplicitDirInode(id, ic)
// Implicit directories
case ic.FullName.IsDir():
in = inode.NewDirInode(
id,
ic.FullName,
fuseops.InodeAttributes{
Uid: fs.uid,
Gid: fs.gid,
Mode: fs.dirMode,
// We guarantee only that directory times be "reasonable".
Atime: fs.mtimeClock.Now(),
Ctime: fs.mtimeClock.Now(),
Mtime: fs.mtimeClock.Now(),
},
fs.implicitDirs,
fs.newConfig.List.EnableEmptyManagedFolders,
fs.enableNonexistentTypeCache,
fs.dirTypeCacheTTL,
ic.Bucket,
fs.mtimeClock,
fs.cacheClock,
fs.newConfig.MetadataCache.TypeCacheMaxSizeMb,
fs.newConfig.EnableHns,
)
case inode.IsSymlink(ic.MinObject):
in = inode.NewSymlinkInode(
id,
ic.FullName,
ic.MinObject,
fuseops.InodeAttributes{
Uid: fs.uid,
Gid: fs.gid,
Mode: fs.fileMode | os.ModeSymlink,
})
default:
in = inode.NewFileInode(
id,
ic.FullName,
ic.MinObject,
fuseops.InodeAttributes{
Uid: fs.uid,
Gid: fs.gid,
Mode: fs.fileMode,
},
ic.Bucket,
fs.localFileCache,
fs.contentCache,
fs.mtimeClock,
ic.Local,
fs.newConfig,
fs.globalMaxWriteBlocksSem)
}
// Place it in our map of IDs to inodes.
fs.inodes[in.ID()] = in
return
}