*/
#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
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);
if (! rgw_fh->is_file())
return -EISDIR;
- // convert flags
- uint32_t oflags = 0;
- return rgw_fh->open(oflags);
+ return rgw_fh->open(flags);
}
/*
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))
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;
}
}
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);
}
}
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);
}
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;
}
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 */
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 */
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());
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