From: Matt Benjamin Date: Fri, 12 Aug 2016 14:39:21 +0000 (-0400) Subject: rgw_file: fix/update rgw_open flag arguments X-Git-Tag: v11.0.1~354^2~8 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=ada29f7f8323be2301588941bcd5c60190b32a4b;p=ceph.git rgw_file: fix/update rgw_open flag arguments Allow passing POSIX open flags as well as api call flags. Needed for NFS3 support. Signed-off-by: Matt Benjamin --- diff --git a/src/include/rados/rgw_file.h b/src/include/rados/rgw_file.h index 4bb8a939d10..d3dba290c52 100644 --- a/src/include/rados/rgw_file.h +++ b/src/include/rados/rgw_file.h @@ -220,9 +220,10 @@ int rgw_truncate(struct rgw_fs *rgw_fs, */ #define RGW_OPEN_FLAG_NONE 0x0000 #define RGW_OPEN_FLAG_CREATE 0x0001 +#define RGW_OPEN_FLAG_V3 0x0002 /* ops have v3 semantics */ int rgw_open(struct rgw_fs *rgw_fs, struct rgw_file_handle *parent_fh, - uint32_t flags); + uint32_t posix_flags, uint32_t flags); /* close file diff --git a/src/rgw/rgw_file.cc b/src/rgw/rgw_file.cc index 3ecd565145f..2925e43dcc1 100644 --- a/src/rgw/rgw_file.cc +++ b/src/rgw/rgw_file.cc @@ -1319,7 +1319,7 @@ int rgw_truncate(struct rgw_fs *rgw_fs, open file */ int rgw_open(struct rgw_fs *rgw_fs, - struct rgw_file_handle *fh, uint32_t flags) + struct rgw_file_handle *fh, uint32_t posix_flags, uint32_t flags) { RGWFileHandle* rgw_fh = get_rgwfh(fh); @@ -1334,9 +1334,7 @@ int rgw_open(struct rgw_fs *rgw_fs, if (! rgw_fh->is_file()) return -EISDIR; - // convert flags - uint32_t oflags = 0; - return rgw_fh->open(oflags); + return rgw_fh->open(flags); } /* diff --git a/src/rgw/rgw_file.h b/src/rgw/rgw_file.h index 5f871eee433..76a0649b4be 100644 --- a/src/rgw/rgw_file.h +++ b/src/rgw/rgw_file.h @@ -234,6 +234,7 @@ namespace rgw { static constexpr uint32_t FLAG_DELETED = 0x0080; static constexpr uint32_t FLAG_UNLINK_THIS = 0x0100; static constexpr uint32_t FLAG_LOCKED = 0x0200; + static constexpr uint32_t FLAG_STATELESS_OPEN = 0x0400; #define CREATE_FLAGS(x) \ ((x) & ~(RGWFileHandle::FLAG_CREATE|RGWFileHandle::FLAG_LOCK)) @@ -501,6 +502,9 @@ namespace rgw { uint32_t open(uint32_t gsh_flags) { lock_guard guard(mtx); if (! (flags & FLAG_OPEN)) { + if (gsh_flags & RGW_OPEN_FLAG_V3) { + flags |= FLAG_STATELESS_OPEN; + } flags |= FLAG_OPEN; return 0; } diff --git a/src/test/librgw_file_aw.cc b/src/test/librgw_file_aw.cc index 2c047a325a4..9e03d409597 100644 --- a/src/test/librgw_file_aw.cc +++ b/src/test/librgw_file_aw.cc @@ -207,7 +207,7 @@ TEST(LibRGW, LOOKUP_OBJECT) { } TEST(LibRGW, OPEN1) { - int ret = rgw_open(fs, object_fh, RGW_OPEN_FLAG_NONE); + int ret = rgw_open(fs, object_fh, 0 /* posix flags */, RGW_OPEN_FLAG_NONE); ASSERT_EQ(ret, 0); } @@ -234,7 +234,7 @@ TEST(LibRGW, CLOSE1) { } TEST(LibRGW, OPEN2) { - int ret = rgw_open(fs, object_fh, RGW_OPEN_FLAG_NONE); + int ret = rgw_open(fs, object_fh, 0 /* posix flags */, RGW_OPEN_FLAG_NONE); ASSERT_EQ(ret, 0); } diff --git a/src/test/librgw_file_gp.cc b/src/test/librgw_file_gp.cc index ec70b5da65c..eba0e386ca3 100644 --- a/src/test/librgw_file_gp.cc +++ b/src/test/librgw_file_gp.cc @@ -227,7 +227,7 @@ TEST(LibRGW, LOOKUP_OBJECT) { TEST(LibRGW, OBJ_OPEN) { if (do_get || do_put || do_readv || do_writev) { - int ret = rgw_open(fs, object_fh, 0 /* flags */); + int ret = rgw_open(fs, object_fh, 0 /* posix flags */, 0 /* flags */); ASSERT_EQ(ret, 0); object_open = true; } diff --git a/src/test/librgw_file_nfsns.cc b/src/test/librgw_file_nfsns.cc index d040d18c167..6fee01d9d64 100644 --- a/src/test/librgw_file_nfsns.cc +++ b/src/test/librgw_file_nfsns.cc @@ -353,7 +353,7 @@ TEST(LibRGW, SETUP_DIRS1) { sf.rgw_fh->create_stat(&st, create_mask); /* open handle */ - rc = rgw_open(fs, sf.fh, 0 /* flags */); + rc = rgw_open(fs, sf.fh, 0 /* posix flags */, 0 /* flags */); ASSERT_EQ(rc, 0); ASSERT_TRUE(sf.rgw_fh->is_open()); /* stage seq write */ @@ -425,7 +425,7 @@ TEST(LibRGW, SETATTR) { sf.rgw_fh->create_stat(&st, create_mask); /* open handle */ - rc = rgw_open(fs, sf.fh, 0 /* flags */); + rc = rgw_open(fs, sf.fh, 0 /* posix flags */, 0 /* flags */); ASSERT_EQ(rc, 0); ASSERT_TRUE(sf.rgw_fh->is_open()); /* stage seq write */ @@ -782,7 +782,7 @@ TEST(LibRGW, WRITEF_DIRS1) { fobj.sync(); /* begin write transaction */ - rc = rgw_open(fs, fobj.fh, 0 /* flags */); + rc = rgw_open(fs, fobj.fh, 0 /* posix flags */, 0 /* flags */); ASSERT_EQ(rc, 0); ASSERT_TRUE(fobj.rgw_fh->is_open()); @@ -987,7 +987,7 @@ TEST(LibRGW, MARKER1_SETUP_OBJECTS) ASSERT_EQ(ret, 0); obj.rgw_fh = get_rgwfh(obj.fh); // open object--open transaction - ret = rgw_open(fs, obj.fh, RGW_OPEN_FLAG_NONE); + ret = rgw_open(fs, obj.fh, 0 /* posix flags */, RGW_OPEN_FLAG_NONE); ASSERT_EQ(ret, 0); ASSERT_TRUE(obj.rgw_fh->is_open()); // unstable write data