#endif
{
CephFuse::Handle *cfuse = fuse_ll_req_prepare(req);
- cfuse->client->ll_forget(cfuse->iget(ino), nlookup+1);
+ Inode *in = cfuse->iget(ino);
+ if (in)
+ cfuse->client->ll_forget(in, nlookup+1);
fuse_reply_none(req);
}
{
CephFuse::Handle *cfuse = fuse_ll_req_prepare(req);
const struct fuse_ctx *ctx = fuse_req_ctx(req);
- Inode *in = cfuse->iget(ino);
struct stat stbuf;
UserPerm perms(ctx->uid, ctx->gid);
+ Inode *in = cfuse->iget(ino);
+ if (!in) {
+ fuse_reply_err(req, get_sys_errno(CEPHFS_EINVAL));
+ return;
+ }
+
get_fuse_groups(perms, req);
-
+
(void) fi; // XXX
if (cfuse->client->ll_getattr(in, &stbuf, perms)
{
CephFuse::Handle *cfuse = fuse_ll_req_prepare(req);
const struct fuse_ctx *ctx = fuse_req_ctx(req);
- Inode *in = cfuse->iget(ino);
UserPerm perms(ctx->uid, ctx->gid);
+ Inode *in = cfuse->iget(ino);
+ if (!in) {
+ fuse_reply_err(req, get_sys_errno(CEPHFS_EINVAL));
+ return;
+ }
+
get_fuse_groups(perms, req);
int mask = 0;
{
CephFuse::Handle *cfuse = fuse_ll_req_prepare(req);
const struct fuse_ctx *ctx = fuse_req_ctx(req);
- Inode *in = cfuse->iget(ino);
UserPerm perms(ctx->uid, ctx->gid);
+ Inode *in = cfuse->iget(ino);
+ if (!in) {
+ fuse_reply_err(req, get_sys_errno(CEPHFS_EINVAL));
+ return;
+ }
+
get_fuse_groups(perms, req);
int r = cfuse->client->ll_setxattr(in, name, value, size, flags, perms);
{
CephFuse::Handle *cfuse = fuse_ll_req_prepare(req);
const struct fuse_ctx *ctx = fuse_req_ctx(req);
- Inode *in = cfuse->iget(ino);
char buf[size];
UserPerm perms(ctx->uid, ctx->gid);
+ Inode *in = cfuse->iget(ino);
+ if (!in) {
+ fuse_reply_err(req, get_sys_errno(CEPHFS_EINVAL));
+ return;
+ }
+
get_fuse_groups(perms, req);
int r = cfuse->client->ll_listxattr(in, buf, size, perms);
{
CephFuse::Handle *cfuse = fuse_ll_req_prepare(req);
const struct fuse_ctx *ctx = fuse_req_ctx(req);
- Inode *in = cfuse->iget(ino);
char buf[size];
UserPerm perms(ctx->uid, ctx->gid);
+ Inode *in = cfuse->iget(ino);
+ if (!in) {
+ fuse_reply_err(req, get_sys_errno(CEPHFS_EINVAL));
+ return;
+ }
+
get_fuse_groups(perms, req);
int r = cfuse->client->ll_getxattr(in, name, buf, size, perms);
{
CephFuse::Handle *cfuse = fuse_ll_req_prepare(req);
const struct fuse_ctx *ctx = fuse_req_ctx(req);
- Inode *in = cfuse->iget(ino);
UserPerm perms(ctx->uid, ctx->gid);
+ Inode *in = cfuse->iget(ino);
+ if (!in) {
+ fuse_reply_err(req, get_sys_errno(CEPHFS_EINVAL));
+ return;
+ }
+
get_fuse_groups(perms, req);
int r = cfuse->client->ll_removexattr(in, name, perms);
{
CephFuse::Handle *cfuse = fuse_ll_req_prepare(req);
const struct fuse_ctx *ctx = fuse_req_ctx(req);
- Inode *in = cfuse->iget(ino);
+ UserPerm perms(ctx->uid, ctx->gid);
void *dirp;
+ Inode *in = cfuse->iget(ino);
+ if (!in) {
+ fuse_reply_err(req, get_sys_errno(CEPHFS_EINVAL));
+ return;
+ }
- UserPerm perms(ctx->uid, ctx->gid);
get_fuse_groups(perms, req);
int r = cfuse->client->ll_opendir(in, fi->flags, (dir_result_t **)&dirp,
{
CephFuse::Handle *cfuse = fuse_ll_req_prepare(req);
const struct fuse_ctx *ctx = fuse_req_ctx(req);
- Inode *in = cfuse->iget(ino);
char buf[PATH_MAX + 1]; // leave room for a null terminator
UserPerm perms(ctx->uid, ctx->gid);
- get_fuse_groups(perms, req);
+ Inode *in = cfuse->iget(ino);
+ if (!in) {
+ fuse_reply_err(req, get_sys_errno(CEPHFS_EINVAL));
+ return;
+ }
+ get_fuse_groups(perms, req);
int r = cfuse->client->ll_readlink(in, buf, sizeof(buf) - 1, perms);
if (r >= 0) {
buf[r] = '\0';
{
CephFuse::Handle *cfuse = fuse_ll_req_prepare(req);
const struct fuse_ctx *ctx = fuse_req_ctx(req);
- Inode *i2, *i1 = cfuse->iget(parent);
struct fuse_entry_param fe;
UserPerm perms(ctx->uid, ctx->gid);
+ Inode *i2, *i1 = cfuse->iget(parent);
+ if (!i1) {
+ fuse_reply_err(req, get_sys_errno(CEPHFS_EINVAL));
+ return;
+ }
+
get_fuse_groups(perms, req);
memset(&fe, 0, sizeof(fe));
#endif
i1 = cfuse->iget(parent);
+ if (!i1) {
+ fuse_reply_err(req, get_sys_errno(CEPHFS_EINVAL));
+ return;
+ }
+
int r = cfuse->client->ll_mkdir(i1, name, mode, &fe.attr, &i2, perm);
if (r == 0) {
fe.ino = cfuse->make_fake_ino(fe.attr.st_ino, fe.attr.st_dev);
{
CephFuse::Handle *cfuse = fuse_ll_req_prepare(req);
const struct fuse_ctx *ctx = fuse_req_ctx(req);
- Inode *in = cfuse->iget(parent);
UserPerm perm(ctx->uid, ctx->gid);
+ Inode *in = cfuse->iget(parent);
+ if (!in) {
+ fuse_reply_err(req, get_sys_errno(CEPHFS_EINVAL));
+ return;
+ }
+
get_fuse_groups(perm, req);
int r = cfuse->client->ll_unlink(in, name, perm);
{
CephFuse::Handle *cfuse = fuse_ll_req_prepare(req);
const struct fuse_ctx *ctx = fuse_req_ctx(req);
- Inode *in = cfuse->iget(parent);
UserPerm perms(ctx->uid, ctx->gid);
+ Inode *in = cfuse->iget(parent);
+ if (!in) {
+ fuse_reply_err(req, get_sys_errno(CEPHFS_EINVAL));
+ return;
+ }
+
get_fuse_groups(perms, req);
int r = cfuse->client->ll_rmdir(in, name, perms);
{
CephFuse::Handle *cfuse = fuse_ll_req_prepare(req);
const struct fuse_ctx *ctx = fuse_req_ctx(req);
- Inode *i2, *i1 = cfuse->iget(parent);
struct fuse_entry_param fe;
UserPerm perms(ctx->uid, ctx->gid);
+ Inode *i2, *i1 = cfuse->iget(parent);
+ if (!i1) {
+ fuse_reply_err(req, get_sys_errno(CEPHFS_EINVAL));
+ return;
+ }
+
get_fuse_groups(perms, req);
memset(&fe, 0, sizeof(fe));
{
CephFuse::Handle *cfuse = fuse_ll_req_prepare(req);
const struct fuse_ctx *ctx = fuse_req_ctx(req);
+ UserPerm perm(ctx->uid, ctx->gid);
Inode *in = cfuse->iget(parent);
Inode *nin = cfuse->iget(newparent);
- UserPerm perm(ctx->uid, ctx->gid);
+ if (!in || !nin) {
+ fuse_reply_err(req, get_sys_errno(CEPHFS_EINVAL));
+ return;
+ }
+
get_fuse_groups(perm, req);
int r = cfuse->client->ll_rename(in, name, nin, newname, perm);
{
CephFuse::Handle *cfuse = fuse_ll_req_prepare(req);
const struct fuse_ctx *ctx = fuse_req_ctx(req);
+ struct fuse_entry_param fe;
Inode *in = cfuse->iget(ino);
Inode *nin = cfuse->iget(newparent);
- struct fuse_entry_param fe;
+ if (!in || !nin) {
+ fuse_reply_err(req, get_sys_errno(CEPHFS_EINVAL));
+ return;
+ }
memset(&fe, 0, sizeof(fe));
UserPerm perm(ctx->uid, ctx->gid);
get_fuse_groups(perm, req);
-
+
/*
* Note that we could successfully link, but then fail the subsequent
* getattr and return an error. Perhaps we should ignore getattr errors,
{
CephFuse::Handle *cfuse = fuse_ll_req_prepare(req);
const struct fuse_ctx *ctx = fuse_req_ctx(req);
- Inode *in = cfuse->iget(ino);
Fh *fh = NULL;
UserPerm perms(ctx->uid, ctx->gid);
+ Inode *in = cfuse->iget(ino);
+ if (!in) {
+ fuse_reply_err(req, get_sys_errno(CEPHFS_EINVAL));
+ return;
+ }
+
get_fuse_groups(perms, req);
int r = cfuse->client->ll_open(in, fi->flags, &fh, perms);
struct readdir_context rc;
rc.req = req;
+ rc.snap = cfuse->fino_snap(ino);
+ if (rc.snap == CEPH_MAXSNAP) {
+ fuse_reply_err(req, get_sys_errno(CEPHFS_EINVAL));
+ return;
+ }
rc.buf = new char[size];
rc.size = size;
rc.pos = 0;
- rc.snap = cfuse->fino_snap(ino);
int r = cfuse->client->readdir_r_cb(dirp, fuse_ll_add_dirent, &rc);
if (r == 0 || r == -CEPHFS_ENOSPC) /* ignore ENOSPC from our callback */
{
CephFuse::Handle *cfuse = fuse_ll_req_prepare(req);
const struct fuse_ctx *ctx = fuse_req_ctx(req);
- Inode *in = cfuse->iget(ino);
UserPerm perms(ctx->uid, ctx->gid);
+ Inode *in = cfuse->iget(ino);
+ if (!in) {
+ fuse_reply_err(req, get_sys_errno(CEPHFS_EINVAL));
+ return;
+ }
+
get_fuse_groups(perms, req);
int r = cfuse->client->inode_permission(in, perms, mask);
{
CephFuse::Handle *cfuse = fuse_ll_req_prepare(req);
const struct fuse_ctx *ctx = fuse_req_ctx(req);
- Inode *i1 = cfuse->iget(parent), *i2;
struct fuse_entry_param fe;
Fh *fh = NULL;
UserPerm perms(ctx->uid, ctx->gid);
+ Inode *i1 = cfuse->iget(parent), *i2;
+ if (!i1) {
+ fuse_reply_err(req, get_sys_errno(CEPHFS_EINVAL));
+ return;
+ }
+
get_fuse_groups(perms, req);
memset(&fe, 0, sizeof(fe));
{
struct statvfs stbuf;
CephFuse::Handle *cfuse = fuse_ll_req_prepare(req);
- Inode *in = cfuse->iget(ino);
const struct fuse_ctx *ctx = fuse_req_ctx(req);
UserPerm perms(ctx->uid, ctx->gid);
+ Inode *in = cfuse->iget(ino);
+ if (!in) {
+ fuse_reply_err(req, get_sys_errno(CEPHFS_EINVAL));
+ return;
+ }
+
get_fuse_groups(perms, req);
int r = cfuse->client->ll_statfs(in, &stbuf, perms);
} else {
std::lock_guard l(stag_lock);
uint64_t stag = FINO_STAG(fino);
- ceph_assert(stag_snap_map.count(stag));
+ if (!stag_snap_map.count(stag))
+ return CEPH_MAXSNAP;
return stag_snap_map[stag];
}
}
if (client->use_faked_inos()) {
return client->ll_get_inode((ino_t)fino);
} else {
- vinodeno_t vino(FINO_INO(fino), fino_snap(fino));
+ uint64_t snap = fino_snap(fino);
+ if (snap == CEPH_MAXSNAP)
+ return NULL;
+ vinodeno_t vino(FINO_INO(fino), snap);
return client->ll_get_inode(vino);
}
}