// Decrement the supplied inode's lookup count, destroying it if the inode says // that it has hit zero. // // We require the file system lock to exclude concurrent lookups, which might // otherwise find an inode whose lookup count has gone to zero. // // UNLOCK_FUNCTION(fs.mu) // UNLOCK_FUNCTION(in) func (fs *fileSystem) unlockAndDecrementLookupCount( in inode.Inode, N uint64) { name := in.Name() // Decrement the lookup count. shouldDestroy := in.DecrementLookupCount(N) // Update file system state, orphaning the inode if we're going to destroy it // below. if shouldDestroy { delete(fs.inodes, in.ID()) // Update indexes if necessary. if fs.generationBackedInodes[name] == in { delete(fs.generationBackedInodes, name) } if fs.implicitDirInodes[name] == in { delete(fs.implicitDirInodes, name) } } // We are done with the file system. fs.mu.Unlock() // Now we can destroy the inode if necessary. if shouldDestroy { destroyErr := in.Destroy() if destroyErr != nil { log.Printf("Error destroying inode %q: %v", name, destroyErr) } } in.Unlock() }