github.com/swiftstack/ProxyFS@v0.0.0-20210203235616-4017c267d62f/inode/symlink.go (about) 1 // Copyright (c) 2015-2021, NVIDIA CORPORATION. 2 // SPDX-License-Identifier: Apache-2.0 3 4 package inode 5 6 import ( 7 "fmt" 8 9 "github.com/swiftstack/ProxyFS/logger" 10 "github.com/swiftstack/ProxyFS/stats" 11 ) 12 13 func (vS *volumeStruct) CreateSymlink(target string, filePerm InodeMode, userID InodeUserID, groupID InodeGroupID) (symlinkInodeNumber InodeNumber, err error) { 14 err = enforceRWMode(false) 15 if nil != err { 16 return 17 } 18 19 // Create file mode out of file permissions plus inode type 20 fileMode, err := determineMode(filePerm, SymlinkType) 21 if err != nil { 22 return 23 } 24 25 symlinkInode, err := vS.makeInMemoryInode(SymlinkType, fileMode, userID, groupID) 26 if err != nil { 27 return 28 } 29 30 symlinkInode.dirty = true 31 32 symlinkInode.SymlinkTarget = target 33 symlinkInodeNumber = symlinkInode.InodeNumber 34 35 ok, err := vS.inodeCacheInsert(symlinkInode) 36 if nil != err { 37 return 38 } 39 if !ok { 40 err = fmt.Errorf("inodeCacheInsert(symlinkInode) failed") 41 return 42 } 43 44 err = vS.flushInode(symlinkInode) 45 if err != nil { 46 logger.ErrorWithError(err) 47 return 48 } 49 50 stats.IncrementOperations(&stats.SymlinkCreateOps) 51 52 return 53 } 54 55 func (vS *volumeStruct) GetSymlink(symlinkInodeNumber InodeNumber) (target string, err error) { 56 symlinkInode, err := vS.fetchInodeType(symlinkInodeNumber, SymlinkType) 57 if err != nil { 58 logger.ErrorWithError(err) 59 return 60 } 61 62 target = symlinkInode.SymlinkTarget 63 64 stats.IncrementOperations(&stats.SymlinkReadOps) 65 66 return 67 }