From: Gui Hecheng Date: Tue, 13 Jun 2017 06:39:14 +0000 (+0800) Subject: rgw_file: prevent conflict of mkdir between restarts X-Git-Tag: v12.1.0~166^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=refs%2Fpull%2F15655%2Fhead;p=ceph.git rgw_file: prevent conflict of mkdir between restarts Fixes: http://tracker.ceph.com/issues/20275 Signed-off-by: Gui Hecheng --- diff --git a/src/rgw/rgw_file.cc b/src/rgw/rgw_file.cc index da7b26b69ace..e5032d0a5104 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;