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