Skip to content

Commit 003719c

Browse files
committed
feat: return method not allowed when uploading to read only fs
Instead of an internal server error, we should be returning method not allowed when trying to upload to a read only filesystem or make other modifications that are expected to fail. This will give clearer feedback to the clients that this is not expected to work. Fixes #1062
1 parent 9550043 commit 003719c

File tree

4 files changed

+30
-2
lines changed

4 files changed

+30
-2
lines changed

backend/meta/xattr.go

+14-2
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import (
2323
"syscall"
2424

2525
"github.com/pkg/xattr"
26+
"github.com/versity/versitygw/s3err"
2627
)
2728

2829
const (
@@ -56,10 +57,18 @@ func (x XattrMeta) RetrieveAttribute(f *os.File, bucket, object, attribute strin
5657
// StoreAttribute stores the value of a specific attribute for an object in a bucket.
5758
func (x XattrMeta) StoreAttribute(f *os.File, bucket, object, attribute string, value []byte) error {
5859
if f != nil {
59-
return xattr.FSet(f, xattrPrefix+attribute, value)
60+
err := xattr.FSet(f, xattrPrefix+attribute, value)
61+
if errors.Is(err, syscall.EROFS) {
62+
return s3err.GetAPIError(s3err.ErrMethodNotAllowed)
63+
}
64+
return err
6065
}
6166

62-
return xattr.Set(filepath.Join(bucket, object), xattrPrefix+attribute, value)
67+
err := xattr.Set(filepath.Join(bucket, object), xattrPrefix+attribute, value)
68+
if errors.Is(err, syscall.EROFS) {
69+
return s3err.GetAPIError(s3err.ErrMethodNotAllowed)
70+
}
71+
return err
6372
}
6473

6574
// DeleteAttribute removes the value of a specific attribute for an object in a bucket.
@@ -68,6 +77,9 @@ func (x XattrMeta) DeleteAttribute(bucket, object, attribute string) error {
6877
if errors.Is(err, xattr.ENOATTR) {
6978
return ErrNoSuchKey
7079
}
80+
if errors.Is(err, syscall.EROFS) {
81+
return s3err.GetAPIError(s3err.ErrMethodNotAllowed)
82+
}
7183
return err
7284
}
7385

backend/posix/posix.go

+3
Original file line numberDiff line numberDiff line change
@@ -362,6 +362,9 @@ func (p *Posix) CreateBucket(ctx context.Context, input *s3.CreateBucketInput, a
362362
return s3err.GetAPIError(s3err.ErrBucketAlreadyExists)
363363
}
364364
if err != nil {
365+
if errors.Is(err, syscall.EROFS) {
366+
return s3err.GetAPIError(s3err.ErrMethodNotAllowed)
367+
}
365368
return fmt.Errorf("mkdir bucket: %w", err)
366369
}
367370

backend/posix/with_otmpfile.go

+5
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ import (
2929

3030
"github.com/versity/versitygw/auth"
3131
"github.com/versity/versitygw/backend"
32+
"github.com/versity/versitygw/s3err"
3233
"golang.org/x/sys/unix"
3334
)
3435

@@ -62,6 +63,10 @@ func (p *Posix) openTmpFile(dir, bucket, obj string, size int64, acct auth.Accou
6263
// this is not supported.
6364
fd, err := unix.Open(dir, unix.O_RDWR|unix.O_TMPFILE|unix.O_CLOEXEC, defaultFilePerm)
6465
if err != nil {
66+
if errors.Is(err, syscall.EROFS) {
67+
return nil, s3err.GetAPIError(s3err.ErrMethodNotAllowed)
68+
}
69+
6570
// O_TMPFILE not supported, try fallback
6671
err = backend.MkdirAll(dir, uid, gid, doChown, p.newDirPerm)
6772
if err != nil {

backend/posix/without_otmpfile.go

+8
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,11 @@ import (
2424
"io/fs"
2525
"os"
2626
"path/filepath"
27+
"syscall"
2728

2829
"github.com/versity/versitygw/auth"
2930
"github.com/versity/versitygw/backend"
31+
"github.com/versity/versitygw/s3err"
3032
)
3133

3234
type tmpfile struct {
@@ -43,11 +45,17 @@ func (p *Posix) openTmpFile(dir, bucket, obj string, size int64, acct auth.Accou
4345
var err error
4446
err = backend.MkdirAll(dir, uid, gid, doChown, p.newDirPerm)
4547
if err != nil {
48+
if errors.Is(err, syscall.EROFS) {
49+
return nil, s3err.GetAPIError(s3err.ErrMethodNotAllowed)
50+
}
4651
return nil, fmt.Errorf("make temp dir: %w", err)
4752
}
4853
f, err := os.CreateTemp(dir,
4954
fmt.Sprintf("%x.", sha256.Sum256([]byte(obj))))
5055
if err != nil {
56+
if errors.Is(err, syscall.EROFS) {
57+
return nil, s3err.GetAPIError(s3err.ErrMethodNotAllowed)
58+
}
5159
return nil, fmt.Errorf("create temp file: %w", err)
5260
}
5361

0 commit comments

Comments
 (0)