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 Aug 22, 2022
1 parent 287cb1a commit 900551a
Show file tree
Hide file tree
Showing 4 changed files with 26 additions and 28 deletions.
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -231,7 +231,7 @@ require (

replace github.com/minio/minio v0.0.0-20210206053228-97fe57bba92c => github.com/juicedata/minio v0.0.0-20220613143934-cee0571a1b03

replace github.com/hanwen/go-fuse/v2 v2.1.1-0.20210611132105-24a1dfe6b4f8 => github.com/qingyunha/go-fuse/v2 v2.1.1-0.20220710020838-753b234a08c0
replace github.com/hanwen/go-fuse/v2 v2.1.1-0.20210611132105-24a1dfe6b4f8 => github.com/juicedata/go-fuse/v2 v2.1.1-0.20220822092405-ece777deb343

replace github.com/dgrijalva/jwt-go v3.2.0+incompatible => github.com/golang-jwt/jwt v3.2.1+incompatible

Expand Down
4 changes: 2 additions & 2 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -603,6 +603,8 @@ github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7
github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
github.com/juicedata/go-fuse/v2 v2.1.1-0.20210926080226-cfe1ec802a7f h1:EhufxJV98Bxn/o30aEZZ4qSc+sxQH8ohfEE5K2hHKtQ=
github.com/juicedata/go-fuse/v2 v2.1.1-0.20210926080226-cfe1ec802a7f/go.mod h1:oRyA5eK+pvJyv5otpO/DgccS8y/RvYMaO00GgRLGryc=
github.com/juicedata/go-fuse/v2 v2.1.1-0.20220822092405-ece777deb343 h1:fbMz7gSlX5eYwuWNB3Z1+dK2q2Ekg5tw6uSYYTOdZrw=
github.com/juicedata/go-fuse/v2 v2.1.1-0.20220822092405-ece777deb343/go.mod h1:oRyA5eK+pvJyv5otpO/DgccS8y/RvYMaO00GgRLGryc=
github.com/juicedata/godaemon v0.0.0-20210629045518-3da5144a127d h1:kpQMvNZJKGY3PTt7OSoahYc4nM0HY67SvK0YyS0GLwA=
github.com/juicedata/godaemon v0.0.0-20210629045518-3da5144a127d/go.mod h1:dlxKkLh3qAIPtgr2U/RVzsZJDuXA1ffg+Njikfmhvgw=
github.com/juicedata/minio v0.0.0-20220613143934-cee0571a1b03 h1:+0jiEkr6qE5Zm2+LilAv5pV/+V+V1XZ5KUv0pmXZHhQ=
Expand Down Expand Up @@ -865,8 +867,6 @@ github.com/pyroscope-io/client v0.2.1 h1:GUyrncANOCuFhnmgURnpJ90o9z/uwZMx+1l9RMJ
github.com/pyroscope-io/client v0.2.1/go.mod h1:zRdQXIGxy0H2QbKEkCmZBR6KOLLIFYLWsdzVI0MRm2E=
github.com/qingstor/qingstor-sdk-go/v4 v4.4.0 h1:tbItWtGB1TDfYzqK8dtm6tV+xWU5iYMwL37C6AL5dDs=
github.com/qingstor/qingstor-sdk-go/v4 v4.4.0/go.mod h1:mDVFtA7+bXQ5xoELTWkoFy1Ad13wtp8jtlnl/RU+zzM=
github.com/qingyunha/go-fuse/v2 v2.1.1-0.20220710020838-753b234a08c0 h1:jTcKLca0yup6UnuOn8iy9/0wUM3KSwbvgB/Ie7rPicM=
github.com/qingyunha/go-fuse/v2 v2.1.1-0.20220710020838-753b234a08c0/go.mod h1:oRyA5eK+pvJyv5otpO/DgccS8y/RvYMaO00GgRLGryc=
github.com/qiniu/dyn v1.3.0/go.mod h1:E8oERcm8TtwJiZvkQPbcAh0RL8jO1G0VXJMW3FAWdkk=
github.com/qiniu/go-sdk/v7 v7.11.1 h1:/LZ9rvFS4p6SnszhGv11FNB1+n4OZvBCwFg7opH5Ovs=
github.com/qiniu/go-sdk/v7 v7.11.1/go.mod h1:btsaOc8CA3hdVloULfFdDgDc+g4f3TDZEFsDY0BLE+w=
Expand Down
6 changes: 3 additions & 3 deletions pkg/fuse/fuse.go
Original file line number Diff line number Diff line change
Expand Up @@ -427,11 +427,11 @@ func (fs *fileSystem) StatFs(cancel <-chan struct{}, in *fuse.InHeader, out *fus
return 0
}

func (fs *fileSystem) Ioctl(cancel <-chan struct{}, in *fuse.IoctlIn, data []byte) (status fuse.Status) {
func (fs *fileSystem) Ioctl(cancel <-chan struct{}, in *fuse.IoctlIn, out *fuse.IoctlOut, bufIn, bufOut []byte) (status fuse.Status) {
ctx := newContext(cancel, &in.InHeader)
defer releaseContext(ctx)
err := fs.v.Ioctl(ctx, Ino(in.NodeId), in.Cmd, in.Arg, data)
return fuse.Status(err)
out.Result = int32(fs.v.Ioctl(ctx, Ino(in.NodeId), in.Cmd, in.Arg, bufIn, bufOut))
return 0
}

// Serve starts a server to serve requests from FUSE.
Expand Down
42 changes: 20 additions & 22 deletions pkg/vfs/vfs_unix.go
Original file line number Diff line number Diff line change
Expand Up @@ -292,7 +292,7 @@ func (v *VFS) Flock(ctx Context, ino Ino, fh uint64, owner uint64, typ uint32, b
return
}

func (v *VFS) Ioctl(ctx Context, ino Ino, cmd uint32, arg uint64, data []byte) (err syscall.Errno) {
func (v *VFS) Ioctl(ctx Context, ino Ino, cmd uint32, arg uint64, bufIn, bufOut []byte) (err syscall.Errno) {
const (
FS_IOC_GETFLAGS = 0x80086601
FS_IOC_SETFLAGS = 0x40086602
Expand All @@ -303,37 +303,28 @@ func (v *VFS) Ioctl(ctx Context, ino Ino, cmd uint32, arg uint64, data []byte) (
FS_IMMUTABLE_FL = 0x00000010
FS_APPEND_FL = 0x00000020
)
defer func() { logit(ctx, "ioctl (%d,0x%X,0x%X,%v): %s", ino, cmd, arg, data, strerr(err)) }()
var getiflag func() uint64
var setiflag func(uint64)
defer func() { logit(ctx, "ioctl (%d,0x%X,0x%X,%v,%v): %s", ino, cmd, arg, bufIn, bufOut, strerr(err)) }()
switch cmd {
default:
err = syscall.ENOTTY
return
case FS_IOC_SETFLAGS:
getiflag = func() uint64 {
return utils.NativeEndian.Uint64(data)
}
case FS_IOC_GETFLAGS:
setiflag = func(flag uint64) {
utils.NativeEndian.PutUint64(data, flag)
}
case FS_IOC_SETFLAGS_32:
getiflag = func() uint64 {
return uint64(utils.NativeEndian.Uint32(data))
}
case FS_IOC_GETFLAGS_32:
setiflag = func(flag uint64) {
utils.NativeEndian.PutUint32(data, uint32(flag))
}
case FS_IOC_SETFLAGS, FS_IOC_GETFLAGS, FS_IOC_SETFLAGS_32, FS_IOC_GETFLAGS_32:
}
if IsSpecialNode(ino) {
err = syscall.EPERM
return
}
var attr = &Attr{}
if cmd>>30 == 1 { // set
iflag := getiflag()
var iflag uint64
if len(bufIn) == 8 {
iflag = utils.NativeEndian.Uint64(bufIn)
} else if len(bufIn) == 4 {
iflag = uint64(utils.NativeEndian.Uint32(bufOut))
} else {
err = syscall.EINVAL
return
}
if (iflag & FS_IMMUTABLE_FL) != 0 {
attr.Flags |= meta.FlagImmutable
}
Expand All @@ -350,7 +341,14 @@ func (v *VFS) Ioctl(ctx Context, ino Ino, cmd uint32, arg uint64, data []byte) (
if (attr.Flags & meta.FlagAppend) != 0 {
iflag |= FS_APPEND_FL
}
setiflag(iflag)
if len(bufOut) == 8 {
utils.NativeEndian.PutUint64(bufOut, iflag)
} else if len(bufOut) == 4 {
utils.NativeEndian.PutUint32(bufOut, uint32(iflag))
} else {
err = syscall.EINVAL
return
}
}
return
}

0 comments on commit 900551a

Please sign in to comment.