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)
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);
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,
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);
<< ' ' << 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,
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;
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;
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,
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,
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);
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)
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;
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);
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)
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;
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,