From fe6b70f3f2bfef6f30ea2b0c15da18486bd17de1 Mon Sep 17 00:00:00 2001 From: Sandy Xu Date: Sun, 26 Sep 2021 17:05:31 +0800 Subject: [PATCH] meta: don't return EINVAL when encountering unknown flags (#862) * meta: don't return EINVAL when encountering unknown flags * fix tests --- pkg/meta/redis.go | 7 +++---- pkg/meta/redis_test.go | 2 +- pkg/meta/sql.go | 18 ++++++++---------- pkg/meta/tkv.go | 3 --- 4 files changed, 12 insertions(+), 18 deletions(-) diff --git a/pkg/meta/redis.go b/pkg/meta/redis.go index bb4a2dce..d42193db 100644 --- a/pkg/meta/redis.go +++ b/pkg/meta/redis.go @@ -2913,9 +2913,6 @@ func (r *redisMeta) SetXattr(ctx Context, inode Ino, name string, value []byte, key := r.xattrKey(inode) return r.txn(ctx, func(tx *redis.Tx) error { switch flags { - case XattrCreateOrReplace: - _, err := r.rdb.HSet(ctx, key, name, value).Result() - return err case XattrCreate: ok, err := tx.HSetNX(c, key, name, value).Result() if err != nil { @@ -2933,8 +2930,10 @@ func (r *redisMeta) SetXattr(ctx Context, inode Ino, name string, value []byte, } _, err := r.rdb.HSet(ctx, key, name, value).Result() return err + default: // XattrCreateOrReplace + _, err := r.rdb.HSet(ctx, key, name, value).Result() + return err } - return syscall.EINVAL }, key) } diff --git a/pkg/meta/redis_test.go b/pkg/meta/redis_test.go index 848c9866..eb37c6ed 100644 --- a/pkg/meta/redis_test.go +++ b/pkg/meta/redis_test.go @@ -337,7 +337,7 @@ func testMetaClient(t *testing.T, m Meta) { if st := m.SetXattr(ctx, inode, "a", []byte("v4"), XattrReplace); st != 0 { t.Fatalf("setxattr: %s", st) } - if st := m.SetXattr(ctx, inode, "a", []byte("v5"), 5); st != syscall.EINVAL { + if st := m.SetXattr(ctx, inode, "a", []byte("v5"), 5); st != 0 { // unknown flag is ignored t.Fatalf("setxattr: %s", st) } diff --git a/pkg/meta/sql.go b/pkg/meta/sql.go index 795c8bd8..94d827e5 100644 --- a/pkg/meta/sql.go +++ b/pkg/meta/sql.go @@ -2547,15 +2547,6 @@ func (m *dbMeta) SetXattr(ctx Context, inode Ino, name string, value []byte, fla var err error var n int64 switch flags { - case XattrCreateOrReplace: - n, err = s.Insert(&x) - if err != nil || n == 0 { - if m.engine.DriverName() == "postgres" { - // cleanup failed session - _ = s.Rollback() - } - _, err = s.Update(&x, &xattr{inode, name, nil}) - } case XattrCreate: n, err = s.Insert(&x) if err != nil || n == 0 { @@ -2567,7 +2558,14 @@ func (m *dbMeta) SetXattr(ctx Context, inode Ino, name string, value []byte, fla err = ENOATTR } default: - return syscall.EINVAL + n, err = s.Insert(&x) + if err != nil || n == 0 { + if m.engine.DriverName() == "postgres" { + // cleanup failed session + _ = s.Rollback() + } + _, err = s.Update(&x, &xattr{inode, name, nil}) + } } return err })) diff --git a/pkg/meta/tkv.go b/pkg/meta/tkv.go index 71cdd7c6..33160d5e 100644 --- a/pkg/meta/tkv.go +++ b/pkg/meta/tkv.go @@ -2394,7 +2394,6 @@ func (m *kvMeta) SetXattr(ctx Context, inode Ino, name string, value []byte, fla key := m.xattrKey(inode, name) err := m.txn(func(tx kvTxn) error { switch flags { - case XattrCreateOrReplace: case XattrCreate: v := tx.get(key) if v != nil { @@ -2405,8 +2404,6 @@ func (m *kvMeta) SetXattr(ctx Context, inode Ino, name string, value []byte, fla if v == nil { return ENOATTR } - default: - return syscall.EINVAL } tx.set(key, value) return nil -- GitLab