mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-04 00:03:54 -06:00
9pfs: Don't use file descriptors in core code
v9fs_getattr() currently peeks into V9fsFidOpenState to know if a fid has a valid file descriptor or directory stream. Even though the fields are accessible, this is an implementation detail of the local backend that should not be manipulated directly by the server code. Abstract that with a new has_valid_file_handle() backend operation. Signed-off-by: Greg Kurz <groug@kaod.org> Reviewed-by: Christian Schoenebeck <qemu_oss@crudebyte.com> Message-Id: <20250312152933.383967-3-groug@kaod.org> Signed-off-by: Christian Schoenebeck <qemu_oss@crudebyte.com>
This commit is contained in:
parent
4f82ce8cd9
commit
f2bb367d2b
4 changed files with 21 additions and 3 deletions
|
@ -164,6 +164,7 @@ struct FileOperations {
|
|||
int (*renameat)(FsContext *ctx, V9fsPath *olddir, const char *old_name,
|
||||
V9fsPath *newdir, const char *new_name);
|
||||
int (*unlinkat)(FsContext *ctx, V9fsPath *dir, const char *name, int flags);
|
||||
bool (*has_valid_file_handle)(int fid_type, V9fsFidOpenState *fs);
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
|
@ -1572,6 +1572,13 @@ static int local_parse_opts(QemuOpts *opts, FsDriverEntry *fse, Error **errp)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static bool local_has_valid_file_handle(int fid_type, V9fsFidOpenState *fs)
|
||||
{
|
||||
return
|
||||
(fid_type == P9_FID_FILE && fs->fd != -1) ||
|
||||
(fid_type == P9_FID_DIR && fs->dir.stream != NULL);
|
||||
}
|
||||
|
||||
FileOperations local_ops = {
|
||||
.parse_opts = local_parse_opts,
|
||||
.init = local_init,
|
||||
|
@ -1609,4 +1616,5 @@ FileOperations local_ops = {
|
|||
.name_to_path = local_name_to_path,
|
||||
.renameat = local_renameat,
|
||||
.unlinkat = local_unlinkat,
|
||||
.has_valid_file_handle = local_has_valid_file_handle,
|
||||
};
|
||||
|
|
|
@ -615,6 +615,11 @@ static int synth_init(FsContext *ctx, Error **errp)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static bool synth_has_valid_file_handle(int fid_type, V9fsFidOpenState *fs)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
FileOperations synth_ops = {
|
||||
.init = synth_init,
|
||||
.lstat = synth_lstat,
|
||||
|
@ -650,4 +655,5 @@ FileOperations synth_ops = {
|
|||
.name_to_path = synth_name_to_path,
|
||||
.renameat = synth_renameat,
|
||||
.unlinkat = synth_unlinkat,
|
||||
.has_valid_file_handle = synth_has_valid_file_handle,
|
||||
};
|
||||
|
|
|
@ -1593,6 +1593,11 @@ out_nofid:
|
|||
pdu_complete(pdu, err);
|
||||
}
|
||||
|
||||
static bool fid_has_valid_file_handle(V9fsState *s, V9fsFidState *fidp)
|
||||
{
|
||||
return s->ops->has_valid_file_handle(fidp->fid_type, &fidp->fs);
|
||||
}
|
||||
|
||||
static void coroutine_fn v9fs_getattr(void *opaque)
|
||||
{
|
||||
int32_t fid;
|
||||
|
@ -1615,9 +1620,7 @@ static void coroutine_fn v9fs_getattr(void *opaque)
|
|||
retval = -ENOENT;
|
||||
goto out_nofid;
|
||||
}
|
||||
if ((fidp->fid_type == P9_FID_FILE && fidp->fs.fd != -1) ||
|
||||
(fidp->fid_type == P9_FID_DIR && fidp->fs.dir.stream))
|
||||
{
|
||||
if (fid_has_valid_file_handle(pdu->s, fidp)) {
|
||||
retval = v9fs_co_fstat(pdu, fidp, &stbuf);
|
||||
} else {
|
||||
retval = v9fs_co_lstat(pdu, &fidp->path, &stbuf);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue