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  }