Skip to content

Commit

Permalink
fuse,meta: support GETFLAGS/SETFLAGS ioctl
Browse files Browse the repository at this point in the history
  • Loading branch information
qingyunha committed Jul 10, 2022
1 parent 0c29c63 commit 019fa98
Show file tree
Hide file tree
Showing 6 changed files with 66 additions and 29 deletions.
25 changes: 1 addition & 24 deletions pkg/meta/base.go
Original file line number Diff line number Diff line change
Expand Up @@ -740,13 +740,6 @@ func (m *baseMeta) Link(ctx Context, inode, parent Ino, name string, attr *Attr)
if name == "" {
return syscall.ENOENT
}
err := m.GetAttr(ctx, inode, attr)
if err != 0 {
return err
}
if (attr.Flags&FlagAppend) != 0 || (attr.Flags&FlagImmutable) != 0 {
return syscall.EPERM
}

defer m.timeit(time.Now())
parent = m.checkRoot(parent)
Expand Down Expand Up @@ -779,14 +772,6 @@ func (m *baseMeta) Unlink(ctx Context, parent Ino, name string) syscall.Errno {
if m.conf.ReadOnly {
return syscall.EROFS
}
var attr Attr
err := m.GetAttr(ctx, parent, &attr)
if err != 0 {
return err
}
if (attr.Flags&FlagAppend) != 0 || (attr.Flags&FlagImmutable) != 0 {
return syscall.EPERM
}

defer m.timeit(time.Now())
return m.en.doUnlink(ctx, m.checkRoot(parent), name)
Expand All @@ -805,14 +790,6 @@ func (m *baseMeta) Rmdir(ctx Context, parent Ino, name string) syscall.Errno {
if m.conf.ReadOnly {
return syscall.EROFS
}
var attr Attr
err := m.GetAttr(ctx, parent, &attr)
if err != 0 {
return err
}
if attr.Flags&FlagImmutable != 0 || attr.Flags&FlagAppend != 0 {
return syscall.EPERM
}

defer m.timeit(time.Now())
return m.en.doRmdir(ctx, m.checkRoot(parent), name)
Expand Down Expand Up @@ -861,7 +838,7 @@ func (m *baseMeta) Open(ctx Context, inode Ino, flags uint32, attr *Attr) syscal
}
}
if attr.Flags&FlagAppend != 0 {
if (flags&syscall.O_ACCMODE) != syscall.O_RDONLY && (flags&syscall.O_APPEND) == 0 {
if (flags&(syscall.O_WRONLY|syscall.O_RDWR)) != 0 && (flags&syscall.O_APPEND) == 0 {
return syscall.EPERM
}
if flags&syscall.O_TRUNC != 0 {
Expand Down
31 changes: 26 additions & 5 deletions pkg/meta/base_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -1435,25 +1435,46 @@ func testAttrFlags(t *testing.T, m Meta) {
if st := m.Create(ctx, 1, "f", 0644, 022, 0, &inode, attr); st != 0 {
t.Fatalf("create f: %s", st)
}
defer m.Unlink(ctx, 1, "f")
attr.Flags = FlagAppend
if st := m.SetAttr(ctx, inode, SetAttrFlag, 0, attr); st != 0 {
t.Fatalf("setattr f: %s", st)
}
if st := m.Open(ctx, inode, syscall.O_RDWR, attr); st != syscall.EPERM {
if st := m.Open(ctx, inode, syscall.O_WRONLY, attr); st != syscall.EPERM {
t.Fatalf("open f: %s", st)
}
if st := m.Open(ctx, inode, syscall.O_RDWR|syscall.O_APPEND, attr); st != 0 {
if st := m.Open(ctx, inode, syscall.O_WRONLY|syscall.O_APPEND, attr); st != 0 {
t.Fatalf("open f: %s", st)
}
attr.Flags = FlagAppend | FlagImmutable
if st := m.SetAttr(ctx, inode, SetAttrFlag, 0, attr); st != 0 {
t.Fatalf("setattr f: %s", st)
}
if st := m.Open(ctx, inode, syscall.O_RDWR, attr); st != syscall.EPERM {
if st := m.Open(ctx, inode, syscall.O_WRONLY, attr); st != syscall.EPERM {
t.Fatalf("open f: %s", st)
}
if st := m.Open(ctx, inode, syscall.O_RDWR|syscall.O_APPEND, attr); st != syscall.EPERM {
if st := m.Open(ctx, inode, syscall.O_WRONLY|syscall.O_APPEND, attr); st != syscall.EPERM {
t.Fatalf("open f: %s", st)
}

var d Ino
if st := m.Mkdir(ctx, 1, "d", 0640, 022, 0, &d, attr); st != 0 {
t.Fatalf("mkdir d: %s", st)
}
attr.Flags = FlagAppend
if st := m.SetAttr(ctx, d, SetAttrFlag, 0, attr); st != 0 {
t.Fatalf("setattr d: %s", st)
}
if st := m.Create(ctx, d, "f", 0644, 022, 0, &inode, attr); st != 0 {
t.Fatalf("create f: %s", st)
}
if st := m.Unlink(ctx, d, "f"); st != syscall.EPERM {
t.Fatalf("unlink f : %s", st)
}
attr.Flags = FlagAppend | FlagImmutable
if st := m.SetAttr(ctx, inode, SetAttrFlag, 0, attr); st != 0 {
t.Fatalf("setattr d: %s", st)
}
if st := m.Create(ctx, d, "f2", 0644, 022, 0, &inode, attr); st != syscall.EPERM {
t.Fatalf("create f2: %s", st)
}
}
12 changes: 12 additions & 0 deletions pkg/meta/redis.go
Original file line number Diff line number Diff line change
Expand Up @@ -1228,6 +1228,9 @@ func (m *redisMeta) doUnlink(ctx Context, parent Ino, name string) syscall.Errno
if pattr.Typ != TypeDirectory {
return syscall.ENOTDIR
}
if (pattr.Flags&FlagAppend) != 0 || (pattr.Flags&FlagImmutable) != 0 {
return syscall.EPERM
}
var updateParent bool
now := time.Now()
if !isTrash(parent) && now.Sub(time.Unix(pattr.Mtime, int64(pattr.Mtimensec))) >= minUpdateTime {
Expand Down Expand Up @@ -1352,6 +1355,9 @@ func (m *redisMeta) doRmdir(ctx Context, parent Ino, name string) syscall.Errno
if pattr.Typ != TypeDirectory {
return syscall.ENOTDIR
}
if (pattr.Flags&FlagAppend) != 0 || (pattr.Flags&FlagImmutable) != 0 {
return syscall.EPERM
}
now := time.Now()
pattr.Nlink--
pattr.Mtime = now.Unix()
Expand Down Expand Up @@ -1669,6 +1675,9 @@ func (m *redisMeta) doLink(ctx Context, inode, parent Ino, name string, attr *At
if pattr.Typ != TypeDirectory {
return syscall.ENOTDIR
}
if pattr.Flags&FlagImmutable != 0 {
return syscall.EPERM
}
var updateParent bool
now := time.Now()
if now.Sub(time.Unix(pattr.Mtime, int64(pattr.Mtimensec))) >= minUpdateTime {
Expand All @@ -1682,6 +1691,9 @@ func (m *redisMeta) doLink(ctx Context, inode, parent Ino, name string, attr *At
if iattr.Typ == TypeDirectory {
return syscall.EPERM
}
if (iattr.Flags&FlagAppend) != 0 || (iattr.Flags&FlagImmutable) != 0 {
return syscall.EPERM
}
oldParent := iattr.Parent
iattr.Parent = 0
iattr.Ctime = now.Unix()
Expand Down
12 changes: 12 additions & 0 deletions pkg/meta/sql.go
Original file line number Diff line number Diff line change
Expand Up @@ -1214,6 +1214,9 @@ func (m *dbMeta) doUnlink(ctx Context, parent Ino, name string) syscall.Errno {
if pn.Type != TypeDirectory {
return syscall.ENOTDIR
}
if (pn.Flags&FlagAppend) != 0 || (pn.Flags&FlagImmutable) != 0 {
return syscall.EPERM
}
var e = edge{Parent: parent, Name: []byte(name)}
ok, err = s.ForUpdate().Get(&e)
if err != nil {
Expand Down Expand Up @@ -1346,6 +1349,9 @@ func (m *dbMeta) doRmdir(ctx Context, parent Ino, name string) syscall.Errno {
if pn.Type != TypeDirectory {
return syscall.ENOTDIR
}
if pn.Flags&FlagImmutable != 0 || pn.Flags&FlagAppend != 0 {
return syscall.EPERM
}
var e = edge{Parent: parent, Name: []byte(name)}
ok, err = s.ForUpdate().Get(&e)
if err != nil {
Expand Down Expand Up @@ -1703,6 +1709,9 @@ func (m *dbMeta) doLink(ctx Context, inode, parent Ino, name string, attr *Attr)
if pn.Type != TypeDirectory {
return syscall.ENOTDIR
}
if pn.Flags&FlagImmutable != 0 {
return syscall.EPERM
}
var e = edge{Parent: parent, Name: []byte(name)}
ok, err = s.ForUpdate().Get(&e)
if err != nil {
Expand All @@ -1723,6 +1732,9 @@ func (m *dbMeta) doLink(ctx Context, inode, parent Ino, name string, attr *Attr)
if n.Type == TypeDirectory {
return syscall.EPERM
}
if (n.Flags&FlagAppend) != 0 || (n.Flags&FlagImmutable) != 0 {
return syscall.EPERM
}

var updateParent bool
now := time.Now().UnixNano() / 1e3
Expand Down
12 changes: 12 additions & 0 deletions pkg/meta/tkv.go
Original file line number Diff line number Diff line change
Expand Up @@ -1112,6 +1112,9 @@ func (m *kvMeta) doUnlink(ctx Context, parent Ino, name string) syscall.Errno {
if pattr.Typ != TypeDirectory {
return syscall.ENOTDIR
}
if (pattr.Flags&FlagAppend) != 0 || (pattr.Flags&FlagImmutable) != 0 {
return syscall.EPERM
}
attr = Attr{}
opened = false
now := time.Now()
Expand Down Expand Up @@ -1223,6 +1226,9 @@ func (m *kvMeta) doRmdir(ctx Context, parent Ino, name string) syscall.Errno {
if pattr.Typ != TypeDirectory {
return syscall.ENOTDIR
}
if (pattr.Flags&FlagAppend) != 0 || (pattr.Flags&FlagImmutable) != 0 {
return syscall.EPERM
}
if tx.exist(m.entryKey(inode, "")) {
return syscall.ENOTEMPTY
}
Expand Down Expand Up @@ -1496,10 +1502,16 @@ func (m *kvMeta) doLink(ctx Context, inode, parent Ino, name string, attr *Attr)
if pattr.Typ != TypeDirectory {
return syscall.ENOTDIR
}
if pattr.Flags&FlagImmutable != 0 {
return syscall.EPERM
}
m.parseAttr(rs[1], &iattr)
if iattr.Typ == TypeDirectory {
return syscall.EPERM
}
if (iattr.Flags&FlagAppend) != 0 || (iattr.Flags&FlagImmutable) != 0 {
return syscall.EPERM
}
buf := tx.get(m.entryKey(parent, name))
if buf != nil || buf == nil && m.conf.CaseInsensi && m.resolveCase(ctx, parent, name) != nil {
return syscall.EEXIST
Expand Down
3 changes: 3 additions & 0 deletions pkg/vfs/vfs_unix.go
Original file line number Diff line number Diff line change
Expand Up @@ -301,6 +301,9 @@ func (v *VFS) Ioctl(ctx Context, ino Ino, cmd uint32, arg uint64, data []byte) (
if cmd != FS_IOC_GETFLAGS && cmd != FS_IOC_SETFLAGS && len(data) != 8 {
return syscall.ENOTTY
}
if IsSpecialNode(ino) {
return syscall.EPERM
}
var attr = &Attr{}
if cmd == FS_IOC_GETFLAGS {
err = v.Meta.GetAttr(ctx, ino, attr)
Expand Down

0 comments on commit 019fa98

Please sign in to comment.