From 3e9c91afa1ffb8055d758444375e61e1e6ea0217 Mon Sep 17 00:00:00 2001 From: Xiubo Li Date: Mon, 28 Mar 2022 13:51:53 +0800 Subject: [PATCH] client: remove expect_null and cleanup the code get_or_create() The expect_null is never used and it will make the code more complex. Just remove it and simplify the related code. Signed-off-by: Xiubo Li --- src/client/Client.cc | 142 +++++++++++++------------------------------ src/client/Client.h | 3 +- 2 files changed, 44 insertions(+), 101 deletions(-) diff --git a/src/client/Client.cc b/src/client/Client.cc index 988a62e66d6..986612faabe 100644 --- a/src/client/Client.cc +++ b/src/client/Client.cc @@ -7019,26 +7019,15 @@ relookup: return r; } -int Client::get_or_create(Inode *dir, const char* name, - Dentry **pdn, bool expect_null) +Dentry *Client::get_or_create(Inode *dir, const char* name) { // lookup ldout(cct, 20) << __func__ << " " << *dir << " name " << name << dendl; dir->open_dir(); - if (dir->dir->dentries.count(name)) { - Dentry *dn = dir->dir->dentries[name]; - if (_dentry_valid(dn)) { - if (expect_null) - return -CEPHFS_EEXIST; - } - *pdn = dn; - } else { - // otherwise link up a new one - *pdn = link(dir->dir, name, NULL, NULL); - } - - // success - return 0; + if (dir->dir->dentries.count(name)) + return dir->dir->dentries[name]; + else // otherwise link up a new one + return link(dir->dir, name, NULL, NULL); } int Client::walk(std::string_view path, walk_dentry_result* wdr, const UserPerm& perms, bool followsym) @@ -13396,16 +13385,15 @@ int Client::_mknod(Inode *dir, const char *name, mode_t mode, dev_t rdev, bufferlist xattrs_bl; int res = _posix_acl_create(dir, &mode, xattrs_bl, perms); - if (res < 0) - goto fail; + if (res < 0) { + put_request(req); + return res; + } req->head.args.mknod.mode = mode; if (xattrs_bl.length() > 0) req->set_data(xattrs_bl); - Dentry *de; - res = get_or_create(dir, name, &de); - if (res < 0) - goto fail; + Dentry *de = get_or_create(dir, name); req->set_dentry(de); res = make_request(req, perms, inp); @@ -13414,10 +13402,6 @@ int Client::_mknod(Inode *dir, const char *name, mode_t mode, dev_t rdev, ldout(cct, 8) << "mknod(" << path << ", 0" << oct << mode << dec << ") = " << res << dendl; return res; - - fail: - put_request(req); - return res; } int Client::ll_mknod(Inode *parent, const char *name, mode_t mode, @@ -13556,16 +13540,15 @@ int Client::_create(Inode *dir, const char *name, int flags, mode_t mode, mode |= S_IFREG; bufferlist xattrs_bl; int res = _posix_acl_create(dir, &mode, xattrs_bl, perms); - if (res < 0) - goto fail; + if (res < 0) { + put_request(req); + return res; + } req->head.args.open.mode = mode; if (xattrs_bl.length() > 0) req->set_data(xattrs_bl); - Dentry *de; - res = get_or_create(dir, name, &de); - if (res < 0) - goto fail; + Dentry *de = get_or_create(dir, name); req->set_dentry(de); res = make_request(req, perms, inp, created); @@ -13588,10 +13571,6 @@ int Client::_create(Inode *dir, const char *name, int flags, mode_t mode, << ' ' << object_size <<") = " << res << dendl; return res; - - fail: - put_request(req); - return res; } int Client::_mkdir(Inode *dir, const char *name, mode_t mode, const UserPerm& perm, @@ -13628,8 +13607,10 @@ int Client::_mkdir(Inode *dir, const char *name, mode_t mode, const UserPerm& pe mode |= S_IFDIR; bufferlist bl; int res = _posix_acl_create(dir, &mode, bl, perm); - if (res < 0) - goto fail; + if (res < 0) { + put_request(req); + return res; + } req->head.args.mkdir.mode = mode; if (is_snap_op) { SnapPayload payload; @@ -13644,12 +13625,9 @@ int Client::_mkdir(Inode *dir, const char *name, mode_t mode, const UserPerm& pe req->set_data(bl); } - Dentry *de; - res = get_or_create(dir, name, &de); - if (res < 0) - goto fail; + Dentry *de = get_or_create(dir, name); req->set_dentry(de); - + ldout(cct, 10) << "_mkdir: making request" << dendl; res = make_request(req, perm, inp); ldout(cct, 10) << "_mkdir result is " << res << dendl; @@ -13658,10 +13636,6 @@ int Client::_mkdir(Inode *dir, const char *name, mode_t mode, const UserPerm& pe ldout(cct, 8) << "_mkdir(" << path << ", 0" << oct << mode << dec << ") = " << res << dendl; return res; - - fail: - put_request(req); - return res; } int Client::ll_mkdir(Inode *parent, const char *name, mode_t mode, @@ -13769,22 +13743,15 @@ int Client::_symlink(Inode *dir, const char *name, const char *target, req->dentry_drop = CEPH_CAP_FILE_SHARED; req->dentry_unless = CEPH_CAP_FILE_EXCL; - Dentry *de; - int res = get_or_create(dir, name, &de); - if (res < 0) - goto fail; + Dentry *de = get_or_create(dir, name); req->set_dentry(de); - res = make_request(req, perms, inp); + int res = make_request(req, perms, inp); trim_cache(); ldout(cct, 8) << "_symlink(\"" << path << "\", \"" << target << "\") = " << res << dendl; return res; - - fail: - put_request(req); - return res; } int Client::ll_symlink(Inode *parent, const char *name, const char *value, @@ -13881,18 +13848,16 @@ int Client::_unlink(Inode *dir, const char *name, const UserPerm& perm) InodeRef otherin; Inode *in; - Dentry *de; - - int res = get_or_create(dir, name, &de); - if (res < 0) - goto fail; + Dentry *de = get_or_create(dir, name); req->set_dentry(de); req->dentry_drop = CEPH_CAP_FILE_SHARED; req->dentry_unless = CEPH_CAP_FILE_EXCL; - res = _lookup(dir, name, 0, &otherin, perm); - if (res < 0) - goto fail; + int res = _lookup(dir, name, 0, &otherin, perm); + if (res < 0) { + put_request(req); + return res; + } in = otherin.get(); req->set_other_inode(in); @@ -13906,10 +13871,6 @@ int Client::_unlink(Inode *dir, const char *name, const UserPerm& perm) trim_cache(); ldout(cct, 8) << "unlink(" << path << ") = " << res << dendl; return res; - - fail: - put_request(req); - return res; } int Client::ll_unlink(Inode *in, const char *name, const UserPerm& perm) @@ -13943,7 +13904,7 @@ int Client::_rmdir(Inode *dir, const char *name, const UserPerm& perms) if (dir->snapid != CEPH_NOSNAP && dir->snapid != CEPH_SNAPDIR) { return -CEPHFS_EROFS; } - + int op = dir->snapid == CEPH_SNAPDIR ? CEPH_MDS_OP_RMSNAP : CEPH_MDS_OP_RMDIR; MetaRequest *req = new MetaRequest(op); filepath path; @@ -13958,18 +13919,17 @@ int Client::_rmdir(Inode *dir, const char *name, const UserPerm& perms) InodeRef in; - Dentry *de; - int res = get_or_create(dir, name, &de); - if (res < 0) - goto fail; - if (op == CEPH_MDS_OP_RMDIR) + Dentry *de = get_or_create(dir, name); + if (op == CEPH_MDS_OP_RMDIR) req->set_dentry(de); else de->get(); - res = _lookup(dir, name, 0, &in, perms); - if (res < 0) - goto fail; + int res = _lookup(dir, name, 0, &in, perms); + if (res < 0) { + put_request(req); + return res; + } if (op == CEPH_MDS_OP_RMSNAP) { unlink(de, true, true); @@ -13982,10 +13942,6 @@ int Client::_rmdir(Inode *dir, const char *name, const UserPerm& perms) trim_cache(); ldout(cct, 8) << "rmdir(" << path << ") = " << res << dendl; return res; - - fail: - put_request(req); - return res; } int Client::ll_rmdir(Inode *in, const char *name, const UserPerm& perms) @@ -14052,15 +14008,10 @@ int Client::_rename(Inode *fromdir, const char *fromname, Inode *todir, const ch req->set_filepath2(from); req->set_alternate_name(std::move(alternate_name)); - Dentry *oldde; - int res = get_or_create(fromdir, fromname, &oldde); - if (res < 0) - goto fail; - Dentry *de; - res = get_or_create(todir, toname, &de); - if (res < 0) - goto fail; + Dentry *oldde = get_or_create(fromdir, fromname); + Dentry *de = get_or_create(todir, toname); + int res; if (op == CEPH_MDS_OP_RENAME) { req->set_old_dentry(oldde); req->old_dentry_drop = CEPH_CAP_FILE_SHARED; @@ -14180,22 +14131,15 @@ int Client::_link(Inode *in, Inode *dir, const char *newname, const UserPerm& pe req->inode_drop = CEPH_CAP_FILE_SHARED; req->inode_unless = CEPH_CAP_FILE_EXCL; - Dentry *de; - int res = get_or_create(dir, newname, &de); - if (res < 0) - goto fail; + Dentry *de = get_or_create(dir, newname); req->set_dentry(de); - - res = make_request(req, perm, inp); + + int res = make_request(req, perm, inp); ldout(cct, 10) << "link result is " << res << dendl; trim_cache(); ldout(cct, 8) << "link(" << existing << ", " << path << ") = " << res << dendl; return res; - - fail: - put_request(req); - return res; } int Client::ll_link(Inode *in, Inode *newparent, const char *newname, diff --git a/src/client/Client.h b/src/client/Client.h index 7fe5252ae52..85e5c5be984 100644 --- a/src/client/Client.h +++ b/src/client/Client.h @@ -1389,8 +1389,7 @@ private: int _flock(Fh *fh, int cmd, uint64_t owner); int _lazyio(Fh *fh, int enable); - int get_or_create(Inode *dir, const char* name, - Dentry **pdn, bool expect_null=false); + Dentry *get_or_create(Inode *dir, const char* name); int xattr_permission(Inode *in, const char *name, unsigned want, const UserPerm& perms); -- 2.39.5