// adds an inode persistent store, setting its inode ID to the generated ID, and returning // the generated id and error func (nd *NameData) AddInode(i *maggiefs.Inode) (uint64, error) { newNodeId, err := nd.GetIncrCounter(COUNTER_INODE, 1) if err != nil { return 0, err } i.Inodeid = newNodeId err = nd.SetInode(i) return i.Inodeid, err }
func (m *MaggieFuse) Mkdir(out *raw.EntryOut, header *raw.InHeader, input *raw.MkdirIn, name string) (code fuse.Status) { // make new child currTime := time.Now().Unix() i := maggiefs.Inode{ 0, // id 0 to start, we get id when inserting 0, maggiefs.FTYPE_DIR, 0, 07777 & input.Mode, currTime, currTime, 0, header.Uid, header.Gid, "", make([]maggiefs.Block, 0, 0), make(map[string]maggiefs.Dentry), make(map[string][]byte), } // save id, err := m.names.AddInode(&i) if err != nil { return fuse.EROFS } i.Inodeid = id // link parent err = m.names.Link(header.NodeId, id, name, false) if err != nil { // garbage collector will clean up our 0 reference node if err == maggiefs.E_EXISTS { return fuse.Status(syscall.EEXIST) } if err == maggiefs.E_NOTDIR { return fuse.ENOTDIR } return fuse.EROFS } // send entry back to child fillEntryOut(out, &i) return fuse.OK }
func (m *MaggieFuse) Mknod(out *raw.EntryOut, header *raw.InHeader, input *raw.MknodIn, name string) (code fuse.Status) { //build node currTime := time.Now().Unix() i := maggiefs.Inode{ 0, // id 0 to start 0, // gen 0 maggiefs.FTYPE_REG, 0, input.Mode & 07777, currTime, currTime, 1, header.Uid, header.Gid, "", make([]maggiefs.Block, 0, 0), make(map[string]maggiefs.Dentry), make(map[string][]byte), } // save new node id, err := m.names.AddInode(&i) if err != nil { return fuse.EROFS } i.Inodeid = id // link parent err = m.names.Link(header.NodeId, i.Inodeid, name, false) if err != nil { if err == maggiefs.E_EXISTS { return fuse.Status(syscall.EEXIST) } else { return fuse.EROFS } } // output fillEntryOut(out, &i) return fuse.OK }
func (m *MaggieFuse) Symlink(out *raw.EntryOut, header *raw.InHeader, pointedTo string, linkName string) (code fuse.Status) { // new inode type symlink currTime := time.Now().Unix() i := maggiefs.Inode{ 0, // id 0 to start, we get id when inserting 0, maggiefs.FTYPE_LNK, 0, 0777, currTime, currTime, 0, header.Uid, header.Gid, pointedTo, make([]maggiefs.Block, 0, 0), make(map[string]maggiefs.Dentry), make(map[string][]byte), } // save id, err := m.names.AddInode(&i) if err != nil { return fuse.EROFS } i.Inodeid = id // link parent err = m.names.Link(header.NodeId, i.Inodeid, linkName, false) if err != nil { if err == maggiefs.E_EXISTS { return fuse.Status(syscall.EEXIST) } else if err == maggiefs.E_NOTDIR { return fuse.ENOTDIR } return fuse.EROFS } // send entry back to child fillEntryOut(out, &i) return fuse.OK }