From 87cec5ff9a2f516321543076f536fcfff433c03b Mon Sep 17 00:00:00 2001 From: Gui Hecheng Date: Tue, 13 Jun 2017 14:39:14 +0800 Subject: [PATCH] rgw_file: prevent conflict of mkdir between restarts Fixes: http://tracker.ceph.com/issues/20275 Signed-off-by: Gui Hecheng --- src/rgw/rgw_file.cc | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/rgw/rgw_file.cc b/src/rgw/rgw_file.cc index da7b26b69ac..e5032d0a510 100644 --- a/src/rgw/rgw_file.cc +++ b/src/rgw/rgw_file.cc @@ -486,9 +486,18 @@ namespace rgw { MkObjResult RGWLibFS::mkdir(RGWFileHandle* parent, const char *name, struct stat *st, uint32_t mask, uint32_t flags) { - MkObjResult mkr{nullptr, -EINVAL}; int rc, rc2; + rgw_file_handle *lfh; + rc = rgw_lookup(get_fs(), parent->get_fh(), name, &lfh, + RGW_LOOKUP_FLAG_NONE); + if (! rc) { + /* conflict! */ + rc = rgw_fh_rele(get_fs(), lfh, RGW_FH_RELE_FLAG_NONE); + return MkObjResult{nullptr, -EEXIST}; + } + + MkObjResult mkr{nullptr, -EINVAL}; LookupFHResult fhr; RGWFileHandle* rgw_fh = nullptr; buffer::list ux_key, ux_attrs; -- 2.39.5