cubefs

Форк
0
/
inode.go 
111 строк · 2.5 Кб
1
// Copyright 2018 The CubeFS Authors.
2
//
3
// Licensed under the Apache License, Version 2.0 (the "License");
4
// you may not use this file except in compliance with the License.
5
// You may obtain a copy of the License at
6
//
7
//     http://www.apache.org/licenses/LICENSE-2.0
8
//
9
// Unless required by applicable law or agreed to in writing, software
10
// distributed under the License is distributed on an "AS IS" BASIS,
11
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
12
// implied. See the License for the specific language governing
13
// permissions and limitations under the License.
14

15
package fs
16

17
import (
18
	"time"
19

20
	"github.com/cubefs/cubefs/depends/bazil.org/fuse"
21

22
	"github.com/cubefs/cubefs/proto"
23
	"github.com/cubefs/cubefs/util/log"
24
)
25

26
const (
27
	LogTimeFormat = "20060102150405000"
28
)
29

30
func (s *Super) InodeGet(ino uint64) (*proto.InodeInfo, error) {
31
	info := s.ic.Get(ino)
32
	if info != nil {
33
		return info, nil
34
	}
35

36
	info, err := s.mw.InodeGet_ll(ino)
37
	if err != nil || info == nil {
38
		log.LogErrorf("InodeGet: ino(%v) err(%v) info(%v)", ino, err, info)
39
		if err != nil {
40
			return nil, ParseError(err)
41
		} else {
42
			return nil, fuse.ENOENT
43
		}
44
	}
45
	s.ic.Put(info)
46
	s.fslock.Lock()
47
	node, isFind := s.nodeCache[ino]
48
	s.fslock.Unlock()
49
	if isFind {
50
		s, ok := node.(*Dir)
51
		if ok {
52
			s.info = info
53
		} else {
54
			node.(*File).info = info
55
		}
56
	}
57
	s.ec.RefreshExtentsCache(ino)
58
	return info, nil
59
}
60

61
func setattr(info *proto.InodeInfo, req *fuse.SetattrRequest) (valid uint32) {
62
	if req.Valid.Mode() {
63
		info.Mode = proto.Mode(req.Mode)
64
		valid |= proto.AttrMode
65
	}
66

67
	if req.Valid.Uid() {
68
		info.Uid = req.Uid
69
		valid |= proto.AttrUid
70
	}
71

72
	if req.Valid.Gid() {
73
		info.Gid = req.Gid
74
		valid |= proto.AttrGid
75
	}
76

77
	if req.Valid.Atime() {
78
		info.AccessTime = req.Atime
79
		valid |= proto.AttrAccessTime
80
	}
81

82
	if req.Valid.Mtime() {
83
		info.ModifyTime = req.Mtime
84
		valid |= proto.AttrModifyTime
85
	}
86

87
	return
88
}
89

90
func fillAttr(info *proto.InodeInfo, attr *fuse.Attr) {
91
	attr.Valid = AttrValidDuration
92
	attr.Nlink = info.Nlink
93
	attr.Inode = info.Inode
94
	attr.Mode = proto.OsMode(info.Mode)
95
	attr.Size = info.Size
96
	attr.Blocks = attr.Size >> 9 // In 512 bytes
97
	attr.Atime = info.AccessTime
98
	attr.Ctime = info.CreateTime
99
	attr.Mtime = info.ModifyTime
100
	attr.BlockSize = DefaultBlksize
101
	attr.Uid = info.Uid
102
	attr.Gid = info.Gid
103
}
104

105
func inodeExpired(info *proto.InodeInfo) bool {
106
	return time.Now().UnixNano() > info.Expiration()
107
}
108

109
func inodeSetExpiration(info *proto.InodeInfo, t time.Duration) {
110
	info.SetExpiration(time.Now().Add(t).UnixNano())
111
}
112

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.