virtiofsd: Add support for extended setxattr
Add the bits to enable support for setxattr_ext if fuse offers it. Do not enable it by default yet. Let passthrough_ll opt-in. Enabling it by deafult kind of automatically means that you are taking responsibility of clearing SGID if ACL is set. Signed-off-by: Vivek Goyal <vgoyal@redhat.com> Message-Id: <20210622150852.1507204-4-vgoyal@redhat.com> Reviewed-by: Dr. David Alan Gilbert <dgilbert@redhat.com> Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com> Fixed up double def in fuse_common.h
This commit is contained in:
parent
5290fb625d
commit
c46ef954fa
@ -1445,7 +1445,9 @@ static void do_setxattr(fuse_req_t req, fuse_ino_t nodeid,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (req->se->op.setxattr) {
|
if (req->se->op.setxattr) {
|
||||||
req->se->op.setxattr(req, nodeid, name, value, arg->size, arg->flags);
|
uint32_t setxattr_flags = setxattr_ext ? arg->setxattr_flags : 0;
|
||||||
|
req->se->op.setxattr(req, nodeid, name, value, arg->size, arg->flags,
|
||||||
|
setxattr_flags);
|
||||||
} else {
|
} else {
|
||||||
fuse_reply_err(req, ENOSYS);
|
fuse_reply_err(req, ENOSYS);
|
||||||
}
|
}
|
||||||
@ -1992,6 +1994,9 @@ static void do_init(fuse_req_t req, fuse_ino_t nodeid,
|
|||||||
if (arg->flags & FUSE_HANDLE_KILLPRIV_V2) {
|
if (arg->flags & FUSE_HANDLE_KILLPRIV_V2) {
|
||||||
se->conn.capable |= FUSE_CAP_HANDLE_KILLPRIV_V2;
|
se->conn.capable |= FUSE_CAP_HANDLE_KILLPRIV_V2;
|
||||||
}
|
}
|
||||||
|
if (arg->flags & FUSE_SETXATTR_EXT) {
|
||||||
|
se->conn.capable |= FUSE_CAP_SETXATTR_EXT;
|
||||||
|
}
|
||||||
#ifdef HAVE_SPLICE
|
#ifdef HAVE_SPLICE
|
||||||
#ifdef HAVE_VMSPLICE
|
#ifdef HAVE_VMSPLICE
|
||||||
se->conn.capable |= FUSE_CAP_SPLICE_WRITE | FUSE_CAP_SPLICE_MOVE;
|
se->conn.capable |= FUSE_CAP_SPLICE_WRITE | FUSE_CAP_SPLICE_MOVE;
|
||||||
@ -2127,6 +2132,10 @@ static void do_init(fuse_req_t req, fuse_ino_t nodeid,
|
|||||||
outarg.flags |= FUSE_HANDLE_KILLPRIV_V2;
|
outarg.flags |= FUSE_HANDLE_KILLPRIV_V2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (se->conn.want & FUSE_CAP_SETXATTR_EXT) {
|
||||||
|
outarg.flags |= FUSE_SETXATTR_EXT;
|
||||||
|
}
|
||||||
|
|
||||||
fuse_log(FUSE_LOG_DEBUG, " INIT: %u.%u\n", outarg.major, outarg.minor);
|
fuse_log(FUSE_LOG_DEBUG, " INIT: %u.%u\n", outarg.major, outarg.minor);
|
||||||
fuse_log(FUSE_LOG_DEBUG, " flags=0x%08x\n", outarg.flags);
|
fuse_log(FUSE_LOG_DEBUG, " flags=0x%08x\n", outarg.flags);
|
||||||
fuse_log(FUSE_LOG_DEBUG, " max_readahead=0x%08x\n", outarg.max_readahead);
|
fuse_log(FUSE_LOG_DEBUG, " max_readahead=0x%08x\n", outarg.max_readahead);
|
||||||
|
@ -798,7 +798,8 @@ struct fuse_lowlevel_ops {
|
|||||||
* fuse_reply_err
|
* fuse_reply_err
|
||||||
*/
|
*/
|
||||||
void (*setxattr)(fuse_req_t req, fuse_ino_t ino, const char *name,
|
void (*setxattr)(fuse_req_t req, fuse_ino_t ino, const char *name,
|
||||||
const char *value, size_t size, int flags);
|
const char *value, size_t size, int flags,
|
||||||
|
uint32_t setxattr_flags);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get an extended attribute
|
* Get an extended attribute
|
||||||
|
@ -2955,7 +2955,8 @@ out:
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void lo_setxattr(fuse_req_t req, fuse_ino_t ino, const char *in_name,
|
static void lo_setxattr(fuse_req_t req, fuse_ino_t ino, const char *in_name,
|
||||||
const char *value, size_t size, int flags)
|
const char *value, size_t size, int flags,
|
||||||
|
uint32_t extra_flags)
|
||||||
{
|
{
|
||||||
char procname[64];
|
char procname[64];
|
||||||
const char *name;
|
const char *name;
|
||||||
|
Loading…
Reference in New Issue
Block a user