All of lore.kernel.org
 help / color / mirror / Atom feed
From: Christian Schoenebeck <qemu_oss@crudebyte.com>
To: qemu-devel@nongnu.org
Cc: Greg Kurz <groug@kaod.org>
Subject: Re: [PATCH 3/4] 9pfs: Introduce ftruncate file op
Date: Tue, 11 Mar 2025 12:19:10 +0100	[thread overview]
Message-ID: <2585592.NyoZre6gin@silver> (raw)
In-Reply-To: <20250310171101.138380-4-groug@kaod.org>

On Monday, March 10, 2025 6:11:00 PM CET Greg Kurz wrote:
> Add an ftruncate operation to the fs driver and use if when a fid has
> a valid file descriptor. This is required to support more cases where
> the client wants to do an action on an unlinked file which it still
> has an open file decriptor for.
> 
> Only 9P2000.L was considered.
> 
> Signed-off-by: Greg Kurz <groug@kaod.org>
> ---
>  fsdev/file-op-9p.h |  2 ++
>  hw/9pfs/9p-local.c |  9 +++++++++
>  hw/9pfs/9p-synth.c |  8 ++++++++
>  hw/9pfs/9p.c       |  6 +++++-
>  hw/9pfs/cofs.c     | 18 ++++++++++++++++++
>  hw/9pfs/coth.h     |  2 ++
>  6 files changed, 44 insertions(+), 1 deletion(-)
> 
> diff --git a/fsdev/file-op-9p.h b/fsdev/file-op-9p.h
> index 39fee185f4ce..40a40f7d8af8 100644
> --- a/fsdev/file-op-9p.h
> +++ b/fsdev/file-op-9p.h
> @@ -165,6 +165,8 @@ struct FileOperations {
>                      V9fsPath *newdir, const char *new_name);
>      int (*unlinkat)(FsContext *ctx, V9fsPath *dir, const char *name, int flags);
>      bool (*has_valid_handle)(int fid_type, V9fsFidOpenState *fs);
> +    int (*ftruncate)(FsContext *ctx, int fid_type, V9fsFidOpenState *fs,
> +                     off_t size);
>  };
>  
>  #endif
> diff --git a/hw/9pfs/9p-local.c b/hw/9pfs/9p-local.c
> index 03e5304ef888..fa763b0662f5 100644
> --- a/hw/9pfs/9p-local.c
> +++ b/hw/9pfs/9p-local.c
> @@ -1046,6 +1046,14 @@ static int local_truncate(FsContext *ctx, V9fsPath *fs_path, off_t size)
>      return ret;
>  }
>  
> +static int local_ftruncate(FsContext *ctx, int fid_type, V9fsFidOpenState *fs,
> +                           off_t size)
> +{
> +    int fd = local_fid_fd(fid_type, fs);
> +
> +    return ftruncate(fd, size);
> +}
> +
>  static int local_chown(FsContext *fs_ctx, V9fsPath *fs_path, FsCred *credp)
>  {
>      char *dirpath = g_path_get_dirname(fs_path->data);
> @@ -1619,4 +1627,5 @@ FileOperations local_ops = {
>      .renameat  = local_renameat,
>      .unlinkat = local_unlinkat,
>      .has_valid_handle = local_has_valid_handle,
> +    .ftruncate = local_ftruncate,
>  };
> diff --git a/hw/9pfs/9p-synth.c b/hw/9pfs/9p-synth.c
> index fa0b187a1b80..7f0e13f0ddd8 100644
> --- a/hw/9pfs/9p-synth.c
> +++ b/hw/9pfs/9p-synth.c
> @@ -356,6 +356,13 @@ static int synth_truncate(FsContext *ctx, V9fsPath *path, off_t offset)
>      return -1;
>  }
>  
> +static int synth_ftruncate(FsContext *ctx, int fid_type, V9fsFidOpenState *fs,
> +                           off_t size)
> +{
> +    errno = ENOSYS;
> +    return -1;
> +}
> +
>  static int synth_chmod(FsContext *fs_ctx, V9fsPath *path, FsCred *credp)
>  {
>      errno = EPERM;
> @@ -656,4 +663,5 @@ FileOperations synth_ops = {
>      .renameat     = synth_renameat,
>      .unlinkat     = synth_unlinkat,
>      .has_valid_handle = synth_has_valid_handle,
> +    .ftruncate    = synth_ftruncate,
>  };
> diff --git a/hw/9pfs/9p.c b/hw/9pfs/9p.c
> index 969fb2f8c494..35b2ed900a01 100644
> --- a/hw/9pfs/9p.c
> +++ b/hw/9pfs/9p.c
> @@ -1733,7 +1733,11 @@ static void coroutine_fn v9fs_setattr(void *opaque)
>          }
>      }
>      if (v9iattr.valid & (P9_ATTR_SIZE)) {
> -        err = v9fs_co_truncate(pdu, &fidp->path, v9iattr.size);
> +        if (fid_has_valid_handle(pdu->s, fidp)) {
> +            err = v9fs_co_ftruncate(pdu, fidp, v9iattr.size);
> +        } else {
> +            err = v9fs_co_truncate(pdu, &fidp->path, v9iattr.size);
> +        }
>          if (err < 0) {
>              goto out;
>          }
> diff --git a/hw/9pfs/cofs.c b/hw/9pfs/cofs.c
> index 67e3ae5c5ccd..893466fb1a44 100644
> --- a/hw/9pfs/cofs.c
> +++ b/hw/9pfs/cofs.c
> @@ -184,6 +184,24 @@ int coroutine_fn v9fs_co_truncate(V9fsPDU *pdu, V9fsPath *path, off_t size)
>      return err;
>  }
>  
> +int coroutine_fn v9fs_co_ftruncate(V9fsPDU *pdu, V9fsFidState *fidp, off_t size)
> +{
> +    int err;
> +    V9fsState *s = pdu->s;
> +
> +    if (v9fs_request_cancelled(pdu)) {
> +        return -EINTR;
> +    }
> +    v9fs_co_run_in_worker(
> +        {
> +            err = s->ops->ftruncate(&s->ctx, fidp->fid_type, &fidp->fs, size);
> +            if (err < 0) {
> +                err = -errno;
> +            }
> +        });
> +    return err;
> +}
> +
>  int coroutine_fn v9fs_co_mknod(V9fsPDU *pdu, V9fsFidState *fidp,
>                                 V9fsString *name, uid_t uid, gid_t gid,
>                                 dev_t dev, mode_t mode, struct stat *stbuf)
> diff --git a/hw/9pfs/coth.h b/hw/9pfs/coth.h
> index 2c54249b3577..0b8ee4c56495 100644
> --- a/hw/9pfs/coth.h
> +++ b/hw/9pfs/coth.h
> @@ -109,5 +109,7 @@ int coroutine_fn v9fs_co_name_to_path(V9fsPDU *, V9fsPath *,
>                                        const char *, V9fsPath *);
>  int coroutine_fn v9fs_co_st_gen(V9fsPDU *pdu, V9fsPath *path, mode_t,
>                                  V9fsStatDotl *v9stat);
> +int coroutine_fn v9fs_co_ftruncate(V9fsPDU *pdu, V9fsFidState *fidp,
> +                                   off_t size);
>  
>  #endif

Nit: I would move v9fs_co_ftruncate() close to v9fs_co_truncate() to make it
easier preserving the overview on this header file.

Rest looks fine:

Reviewed-by: Christian Schoenebeck <qemu_oss@crudebyte.com>

/Christian




  reply	other threads:[~2025-03-11 11:20 UTC|newest]

Thread overview: 14+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-03-10 17:10 [PATCH 0/4] 9pfs: Fix ftruncate-after-unlink Greg Kurz
2025-03-10 17:10 ` [PATCH 1/4] 9pfs: local : Introduce local_fid_fd() helper Greg Kurz
2025-03-11 10:58   ` Christian Schoenebeck
2025-03-11 14:01     ` Greg Kurz
2025-03-10 17:10 ` [PATCH 2/4] 9pfs: Don't use file descriptors in core code Greg Kurz
2025-03-11 11:13   ` Christian Schoenebeck
2025-03-11 14:03     ` Greg Kurz
2025-03-11 14:13       ` Greg Kurz
2025-03-11 14:18       ` Christian Schoenebeck
2025-03-10 17:11 ` [PATCH 3/4] 9pfs: Introduce ftruncate file op Greg Kurz
2025-03-11 11:19   ` Christian Schoenebeck [this message]
2025-03-10 17:11 ` [PATCH 4/4] 9pfs: Introduce futimens " Greg Kurz
2025-03-11 11:25   ` Christian Schoenebeck
2025-03-11 10:51 ` [PATCH 0/4] 9pfs: Fix ftruncate-after-unlink Christian Schoenebeck

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=2585592.NyoZre6gin@silver \
    --to=qemu_oss@crudebyte.com \
    --cc=groug@kaod.org \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.