* [Qemu-devel] [PATCH v2 0/2] qemu-ga: Add guest-fstrim command.
@ 2012-06-13 5:41 Paolo Bonzini
2012-06-13 5:41 ` [Qemu-devel] [PATCH v2 1/2] qemu-ga: make names more generic for mount list functions Paolo Bonzini
` (3 more replies)
0 siblings, 4 replies; 7+ messages in thread
From: Paolo Bonzini @ 2012-06-13 5:41 UTC (permalink / raw)
To: qemu-devel; +Cc: mdroth, lcapitulino
FITRIM is a mounted filesystem feature to discard (or "trim") blocks which
are not in use by the filesystem. This is useful for solid-state drives
(SSDs) and thinly-provisioned storage. Provide access to the feature
from the host so that filesystems can be trimmed periodically or before
migration.
v1->v2: fix version number, define mount list functions also for CONFIG_FSTRIM
Paolo Bonzini (2):
qemu-ga: make names more generic for mount list functions
qemu-ga: add guest-fstrim command
qapi-schema-guest.json | 20 +++++++++
qga/commands-posix.c | 114 +++++++++++++++++++++++++++++++++++++++---------
qga/commands-win32.c | 11 +++++
3 files changed, 124 insertions(+), 21 deletions(-)
--
1.7.10.2
^ permalink raw reply [flat|nested] 7+ messages in thread
* [Qemu-devel] [PATCH v2 1/2] qemu-ga: make names more generic for mount list functions
2012-06-13 5:41 [Qemu-devel] [PATCH v2 0/2] qemu-ga: Add guest-fstrim command Paolo Bonzini
@ 2012-06-13 5:41 ` Paolo Bonzini
2012-06-13 8:10 ` Michal Privoznik
2012-06-13 5:41 ` [Qemu-devel] [PATCH v2 2/2] qemu-ga: add guest-fstrim command Paolo Bonzini
` (2 subsequent siblings)
3 siblings, 1 reply; 7+ messages in thread
From: Paolo Bonzini @ 2012-06-13 5:41 UTC (permalink / raw)
To: qemu-devel; +Cc: mdroth, lcapitulino
We will use these functions and types for more than FSFREEZE, so rename them.
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
qga/commands-posix.c | 36 ++++++++++++++++++------------------
1 file changed, 18 insertions(+), 18 deletions(-)
diff --git a/qga/commands-posix.c b/qga/commands-posix.c
index 00d035d..b1a7ce6 100644
--- a/qga/commands-posix.c
+++ b/qga/commands-posix.c
@@ -314,17 +314,17 @@ static void guest_file_init(void)
#if defined(CONFIG_FSFREEZE)
-typedef struct GuestFsfreezeMount {
+typedef struct FsMount {
char *dirname;
char *devtype;
- QTAILQ_ENTRY(GuestFsfreezeMount) next;
-} GuestFsfreezeMount;
+ QTAILQ_ENTRY(FsMount) next;
+} FsMount;
-typedef QTAILQ_HEAD(, GuestFsfreezeMount) GuestFsfreezeMountList;
+typedef QTAILQ_HEAD(, FsMount) FsMountList;
-static void guest_fsfreeze_free_mount_list(GuestFsfreezeMountList *mounts)
+static void free_fs_mount_list(FsMountList *mounts)
{
- GuestFsfreezeMount *mount, *temp;
+ FsMount *mount, *temp;
if (!mounts) {
return;
@@ -341,10 +341,10 @@ static void guest_fsfreeze_free_mount_list(GuestFsfreezeMountList *mounts)
/*
* Walk the mount table and build a list of local file systems
*/
-static int guest_fsfreeze_build_mount_list(GuestFsfreezeMountList *mounts)
+static int build_fs_mount_list(FsMountList *mounts)
{
struct mntent *ment;
- GuestFsfreezeMount *mount;
+ FsMount *mount;
char const *mtab = "/proc/self/mounts";
FILE *fp;
@@ -367,7 +367,7 @@ static int guest_fsfreeze_build_mount_list(GuestFsfreezeMountList *mounts)
continue;
}
- mount = g_malloc0(sizeof(GuestFsfreezeMount));
+ mount = g_malloc0(sizeof(FsMount));
mount->dirname = g_strdup(ment->mnt_dir);
mount->devtype = g_strdup(ment->mnt_type);
@@ -398,15 +398,15 @@ GuestFsfreezeStatus qmp_guest_fsfreeze_status(Error **err)
int64_t qmp_guest_fsfreeze_freeze(Error **err)
{
int ret = 0, i = 0;
- GuestFsfreezeMountList mounts;
- struct GuestFsfreezeMount *mount;
+ FsMountList mounts;
+ struct FsMount *mount;
int fd;
char err_msg[512];
slog("guest-fsfreeze called");
QTAILQ_INIT(&mounts);
- ret = guest_fsfreeze_build_mount_list(&mounts);
+ ret = build_fs_mount_list(&mounts);
if (ret < 0) {
return ret;
}
@@ -447,11 +447,11 @@ int64_t qmp_guest_fsfreeze_freeze(Error **err)
close(fd);
}
- guest_fsfreeze_free_mount_list(&mounts);
+ free_fs_mount_list(&mounts);
return i;
error:
- guest_fsfreeze_free_mount_list(&mounts);
+ free_fs_mount_list(&mounts);
qmp_guest_fsfreeze_thaw(NULL);
return 0;
}
@@ -462,12 +462,12 @@ error:
int64_t qmp_guest_fsfreeze_thaw(Error **err)
{
int ret;
- GuestFsfreezeMountList mounts;
- GuestFsfreezeMount *mount;
+ FsMountList mounts;
+ FsMount *mount;
int fd, i = 0, logged;
QTAILQ_INIT(&mounts);
- ret = guest_fsfreeze_build_mount_list(&mounts);
+ ret = build_fs_mount_list(&mounts);
if (ret) {
error_set(err, QERR_QGA_COMMAND_FAILED,
"failed to enumerate filesystems");
@@ -507,7 +507,7 @@ int64_t qmp_guest_fsfreeze_thaw(Error **err)
}
ga_unset_frozen(ga_state);
- guest_fsfreeze_free_mount_list(&mounts);
+ free_fs_mount_list(&mounts);
return i;
}
--
1.7.10.2
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [Qemu-devel] [PATCH v2 2/2] qemu-ga: add guest-fstrim command
2012-06-13 5:41 [Qemu-devel] [PATCH v2 0/2] qemu-ga: Add guest-fstrim command Paolo Bonzini
2012-06-13 5:41 ` [Qemu-devel] [PATCH v2 1/2] qemu-ga: make names more generic for mount list functions Paolo Bonzini
@ 2012-06-13 5:41 ` Paolo Bonzini
2012-06-13 8:11 ` Michal Privoznik
2012-06-13 18:26 ` [Qemu-devel] [PATCH v2 0/2] qemu-ga: Add " Luiz Capitulino
2012-06-13 20:44 ` Michael Roth
3 siblings, 1 reply; 7+ messages in thread
From: Paolo Bonzini @ 2012-06-13 5:41 UTC (permalink / raw)
To: qemu-devel; +Cc: mdroth, lcapitulino
FITRIM is a mounted filesystem feature to discard (or "trim") blocks which
are not in use by the filesystem. This is useful for solid-state drives
(SSDs) and thinly-provisioned storage. Provide access to the feature
from the host so that filesystems can be trimmed periodically or before
migration.
Here is an example using scsi_debug:
# modprobe scsi_debug lbpu=1 lbpws=1
# sg_vpd -p0xb2 /dev/sdb
Logical block provisioning VPD page (SBC):
Unmap command supported (LBPU): 1
Write same (16) with unmap bit supported (LBWS): 1
Write same (10) with unmap bit supported (LBWS10): 0
# mke2fs /dev/sdb
# cat /sys/bus/pseudo/drivers/scsi_debug/map
1-616,16257-16383
# mount /dev/sdb /run/media/pbonzini/test
# dd if=/dev/zero of=/run/media/pbonzini/test/file
# cat map
1-616,645-1588,1599-4026,4029-16383
# rm /run/media/pbonzini/test/file
# ./qemu-ga /dev/fd/0
{"execute":"guest-fstrim"}
{"return": {}}
# cat map
1-612
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
v1->v2: fix version number, define mount list functions also for CONFIG_FSTRIM
qapi-schema-guest.json | 20 +++++++++++++
qga/commands-posix.c | 78 ++++++++++++++++++++++++++++++++++++++++++++++--
qga/commands-win32.c | 11 +++++++
3 files changed, 106 insertions(+), 3 deletions(-)
diff --git a/qapi-schema-guest.json b/qapi-schema-guest.json
index d4055d2..d955cf1 100644
--- a/qapi-schema-guest.json
+++ b/qapi-schema-guest.json
@@ -351,6 +351,26 @@
'returns': 'int' }
##
+# @guest-fstrim:
+#
+# Discard (or "trim") blocks which are not in use by the filesystem.
+#
+# @minimum:
+# Minimum contiguous free range to discard, in bytes. Free ranges
+# smaller than this may be ignored (this is a hint and the guest
+# may not respect it). By increasing this value, the fstrim
+# operation will complete more quickly for filesystems with badly
+# fragmented free space, although not all blocks will be discarded.
+# The default value is zero, meaning "discard every free block".
+#
+# Returns: Nothing.
+#
+# Since: 1.2
+##
+{ 'command': 'guest-fstrim',
+ 'data': { '*minimum': 'int' } }
+
+##
# @guest-suspend-disk
#
# Suspend guest to disk.
diff --git a/qga/commands-posix.c b/qga/commands-posix.c
index b1a7ce6..5fcbef4 100644
--- a/qga/commands-posix.c
+++ b/qga/commands-posix.c
@@ -38,9 +38,12 @@ extern char **environ;
#include <sys/socket.h>
#include <net/if.h>
-#if defined(__linux__) && defined(FIFREEZE)
+#ifdef FIFREEZE
#define CONFIG_FSFREEZE
#endif
+#ifdef FITRIM
+#define CONFIG_FSTRIM
+#endif
#endif
void qmp_guest_shutdown(bool has_mode, const char *mode, Error **err)
@@ -312,8 +315,7 @@ static void guest_file_init(void)
/* linux-specific implementations. avoid this if at all possible. */
#if defined(__linux__)
-#if defined(CONFIG_FSFREEZE)
-
+#if defined(CONFIG_FSFREEZE) || defined(CONFIG_FSTRIM)
typedef struct FsMount {
char *dirname;
char *devtype;
@@ -378,6 +380,9 @@ static int build_fs_mount_list(FsMountList *mounts)
return 0;
}
+#endif
+
+#if defined(CONFIG_FSFREEZE)
/*
* Return status of freeze/thaw
@@ -525,6 +530,65 @@ static void guest_fsfreeze_cleanup(void)
}
#endif /* CONFIG_FSFREEZE */
+#if defined(CONFIG_FSTRIM)
+/*
+ * Walk list of mounted file systems in the guest, and trim them.
+ */
+void qmp_guest_fstrim(bool has_minimum, int64_t minimum, Error **err)
+{
+ int ret = 0;
+ FsMountList mounts;
+ struct FsMount *mount;
+ int fd;
+ char err_msg[512];
+ struct fstrim_range r = {
+ .start = 0,
+ .len = -1,
+ .minlen = has_minimum ? minimum : 0,
+ };
+
+ slog("guest-fstrim called");
+
+ QTAILQ_INIT(&mounts);
+ ret = build_fs_mount_list(&mounts);
+ if (ret < 0) {
+ return;
+ }
+
+ QTAILQ_FOREACH(mount, &mounts, next) {
+ fd = qemu_open(mount->dirname, O_RDONLY);
+ if (fd == -1) {
+ sprintf(err_msg, "failed to open %s, %s", mount->dirname,
+ strerror(errno));
+ error_set(err, QERR_QGA_COMMAND_FAILED, err_msg);
+ goto error;
+ }
+
+ /* We try to cull filesytems we know won't work in advance, but other
+ * filesytems may not implement fstrim for less obvious reasons. These
+ * will report EOPNOTSUPP; we simply ignore these errors. Any other
+ * error means an unexpected error, so return it in those cases. In
+ * some other cases ENOTTY will be reported (e.g. CD-ROMs).
+ */
+ ret = ioctl(fd, FITRIM, &r);
+ if (ret == -1) {
+ if (errno != ENOTTY && errno != EOPNOTSUPP) {
+ sprintf(err_msg, "failed to trim %s, %s",
+ mount->dirname, strerror(errno));
+ error_set(err, QERR_QGA_COMMAND_FAILED, err_msg);
+ close(fd);
+ goto error;
+ }
+ }
+ close(fd);
+ }
+
+error:
+ free_fs_mount_list(&mounts);
+}
+#endif /* CONFIG_FSTRIM */
+
+
#define LINUX_SYS_STATE_FILE "/sys/power/state"
#define SUSPEND_SUPPORTED 0
#define SUSPEND_NOT_SUPPORTED 1
@@ -918,7 +982,15 @@ int64_t qmp_guest_fsfreeze_thaw(Error **err)
return 0;
}
+#endif /* CONFIG_FSFREEZE */
+
+#if !defined(CONFIG_FSTRIM)
+void qmp_guest_fstrim(bool has_minimum, int64_t minimum, Error **err)
+{
+ error_set(err, QERR_UNSUPPORTED);
+ return;
+}
#endif
/* register init/cleanup routines for stateful command groups */
diff --git a/qga/commands-win32.c b/qga/commands-win32.c
index eb8d140..54bc546 100644
--- a/qga/commands-win32.c
+++ b/qga/commands-win32.c
@@ -173,6 +173,17 @@ int64_t qmp_guest_fsfreeze_thaw(Error **err)
return 0;
}
+/*
+ * Walk list of mounted file systems in the guest, and discard unused
+ * areas.
+ */
+void qmp_guest_fstrim(bool has_minimum, int64_t minimum, Error **err)
+{
+ error_set(err, QERR_UNSUPPORTED);
+
+ return;
+}
+
typedef enum {
GUEST_SUSPEND_MODE_DISK,
GUEST_SUSPEND_MODE_RAM
--
1.7.10.2
^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [Qemu-devel] [PATCH v2 1/2] qemu-ga: make names more generic for mount list functions
2012-06-13 5:41 ` [Qemu-devel] [PATCH v2 1/2] qemu-ga: make names more generic for mount list functions Paolo Bonzini
@ 2012-06-13 8:10 ` Michal Privoznik
0 siblings, 0 replies; 7+ messages in thread
From: Michal Privoznik @ 2012-06-13 8:10 UTC (permalink / raw)
To: Paolo Bonzini; +Cc: lcapitulino, qemu-devel, mdroth
On 13.06.2012 07:41, Paolo Bonzini wrote:
> We will use these functions and types for more than FSFREEZE, so rename them.
>
> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
> ---
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
> qga/commands-posix.c | 36 ++++++++++++++++++------------------
> 1 file changed, 18 insertions(+), 18 deletions(-)
>
> diff --git a/qga/commands-posix.c b/qga/commands-posix.c
> index 00d035d..b1a7ce6 100644
> --- a/qga/commands-posix.c
> +++ b/qga/commands-posix.c
> @@ -314,17 +314,17 @@ static void guest_file_init(void)
>
> #if defined(CONFIG_FSFREEZE)
>
> -typedef struct GuestFsfreezeMount {
> +typedef struct FsMount {
> char *dirname;
> char *devtype;
> - QTAILQ_ENTRY(GuestFsfreezeMount) next;
> -} GuestFsfreezeMount;
> + QTAILQ_ENTRY(FsMount) next;
> +} FsMount;
>
> -typedef QTAILQ_HEAD(, GuestFsfreezeMount) GuestFsfreezeMountList;
> +typedef QTAILQ_HEAD(, FsMount) FsMountList;
>
> -static void guest_fsfreeze_free_mount_list(GuestFsfreezeMountList *mounts)
> +static void free_fs_mount_list(FsMountList *mounts)
> {
> - GuestFsfreezeMount *mount, *temp;
> + FsMount *mount, *temp;
>
> if (!mounts) {
> return;
> @@ -341,10 +341,10 @@ static void guest_fsfreeze_free_mount_list(GuestFsfreezeMountList *mounts)
> /*
> * Walk the mount table and build a list of local file systems
> */
> -static int guest_fsfreeze_build_mount_list(GuestFsfreezeMountList *mounts)
> +static int build_fs_mount_list(FsMountList *mounts)
> {
> struct mntent *ment;
> - GuestFsfreezeMount *mount;
> + FsMount *mount;
> char const *mtab = "/proc/self/mounts";
> FILE *fp;
>
> @@ -367,7 +367,7 @@ static int guest_fsfreeze_build_mount_list(GuestFsfreezeMountList *mounts)
> continue;
> }
>
> - mount = g_malloc0(sizeof(GuestFsfreezeMount));
> + mount = g_malloc0(sizeof(FsMount));
> mount->dirname = g_strdup(ment->mnt_dir);
> mount->devtype = g_strdup(ment->mnt_type);
>
> @@ -398,15 +398,15 @@ GuestFsfreezeStatus qmp_guest_fsfreeze_status(Error **err)
> int64_t qmp_guest_fsfreeze_freeze(Error **err)
> {
> int ret = 0, i = 0;
> - GuestFsfreezeMountList mounts;
> - struct GuestFsfreezeMount *mount;
> + FsMountList mounts;
> + struct FsMount *mount;
> int fd;
> char err_msg[512];
>
> slog("guest-fsfreeze called");
>
> QTAILQ_INIT(&mounts);
> - ret = guest_fsfreeze_build_mount_list(&mounts);
> + ret = build_fs_mount_list(&mounts);
> if (ret < 0) {
> return ret;
> }
> @@ -447,11 +447,11 @@ int64_t qmp_guest_fsfreeze_freeze(Error **err)
> close(fd);
> }
>
> - guest_fsfreeze_free_mount_list(&mounts);
> + free_fs_mount_list(&mounts);
> return i;
>
> error:
> - guest_fsfreeze_free_mount_list(&mounts);
> + free_fs_mount_list(&mounts);
> qmp_guest_fsfreeze_thaw(NULL);
> return 0;
> }
> @@ -462,12 +462,12 @@ error:
> int64_t qmp_guest_fsfreeze_thaw(Error **err)
> {
> int ret;
> - GuestFsfreezeMountList mounts;
> - GuestFsfreezeMount *mount;
> + FsMountList mounts;
> + FsMount *mount;
> int fd, i = 0, logged;
>
> QTAILQ_INIT(&mounts);
> - ret = guest_fsfreeze_build_mount_list(&mounts);
> + ret = build_fs_mount_list(&mounts);
> if (ret) {
> error_set(err, QERR_QGA_COMMAND_FAILED,
> "failed to enumerate filesystems");
> @@ -507,7 +507,7 @@ int64_t qmp_guest_fsfreeze_thaw(Error **err)
> }
>
> ga_unset_frozen(ga_state);
> - guest_fsfreeze_free_mount_list(&mounts);
> + free_fs_mount_list(&mounts);
> return i;
> }
>
>
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [Qemu-devel] [PATCH v2 2/2] qemu-ga: add guest-fstrim command
2012-06-13 5:41 ` [Qemu-devel] [PATCH v2 2/2] qemu-ga: add guest-fstrim command Paolo Bonzini
@ 2012-06-13 8:11 ` Michal Privoznik
0 siblings, 0 replies; 7+ messages in thread
From: Michal Privoznik @ 2012-06-13 8:11 UTC (permalink / raw)
To: Paolo Bonzini; +Cc: lcapitulino, qemu-devel, mdroth
On 13.06.2012 07:41, Paolo Bonzini wrote:
> FITRIM is a mounted filesystem feature to discard (or "trim") blocks which
> are not in use by the filesystem. This is useful for solid-state drives
> (SSDs) and thinly-provisioned storage. Provide access to the feature
> from the host so that filesystems can be trimmed periodically or before
> migration.
>
> Here is an example using scsi_debug:
>
> # modprobe scsi_debug lbpu=1 lbpws=1
> # sg_vpd -p0xb2 /dev/sdb
> Logical block provisioning VPD page (SBC):
> Unmap command supported (LBPU): 1
> Write same (16) with unmap bit supported (LBWS): 1
> Write same (10) with unmap bit supported (LBWS10): 0
> # mke2fs /dev/sdb
> # cat /sys/bus/pseudo/drivers/scsi_debug/map
> 1-616,16257-16383
> # mount /dev/sdb /run/media/pbonzini/test
> # dd if=/dev/zero of=/run/media/pbonzini/test/file
> # cat map
> 1-616,645-1588,1599-4026,4029-16383
> # rm /run/media/pbonzini/test/file
> # ./qemu-ga /dev/fd/0
> {"execute":"guest-fstrim"}
> {"return": {}}
> # cat map
> 1-612
>
> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
> ---
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
> v1->v2: fix version number, define mount list functions also for CONFIG_FSTRIM
>
> qapi-schema-guest.json | 20 +++++++++++++
> qga/commands-posix.c | 78 ++++++++++++++++++++++++++++++++++++++++++++++--
> qga/commands-win32.c | 11 +++++++
> 3 files changed, 106 insertions(+), 3 deletions(-)
>
> diff --git a/qapi-schema-guest.json b/qapi-schema-guest.json
> index d4055d2..d955cf1 100644
> --- a/qapi-schema-guest.json
> +++ b/qapi-schema-guest.json
> @@ -351,6 +351,26 @@
> 'returns': 'int' }
>
> ##
> +# @guest-fstrim:
> +#
> +# Discard (or "trim") blocks which are not in use by the filesystem.
> +#
> +# @minimum:
> +# Minimum contiguous free range to discard, in bytes. Free ranges
> +# smaller than this may be ignored (this is a hint and the guest
> +# may not respect it). By increasing this value, the fstrim
> +# operation will complete more quickly for filesystems with badly
> +# fragmented free space, although not all blocks will be discarded.
> +# The default value is zero, meaning "discard every free block".
> +#
> +# Returns: Nothing.
> +#
> +# Since: 1.2
> +##
> +{ 'command': 'guest-fstrim',
> + 'data': { '*minimum': 'int' } }
> +
> +##
> # @guest-suspend-disk
> #
> # Suspend guest to disk.
> diff --git a/qga/commands-posix.c b/qga/commands-posix.c
> index b1a7ce6..5fcbef4 100644
> --- a/qga/commands-posix.c
> +++ b/qga/commands-posix.c
> @@ -38,9 +38,12 @@ extern char **environ;
> #include <sys/socket.h>
> #include <net/if.h>
>
> -#if defined(__linux__) && defined(FIFREEZE)
> +#ifdef FIFREEZE
> #define CONFIG_FSFREEZE
> #endif
> +#ifdef FITRIM
> +#define CONFIG_FSTRIM
> +#endif
> #endif
>
> void qmp_guest_shutdown(bool has_mode, const char *mode, Error **err)
> @@ -312,8 +315,7 @@ static void guest_file_init(void)
> /* linux-specific implementations. avoid this if at all possible. */
> #if defined(__linux__)
>
> -#if defined(CONFIG_FSFREEZE)
> -
> +#if defined(CONFIG_FSFREEZE) || defined(CONFIG_FSTRIM)
> typedef struct FsMount {
> char *dirname;
> char *devtype;
> @@ -378,6 +380,9 @@ static int build_fs_mount_list(FsMountList *mounts)
>
> return 0;
> }
> +#endif
> +
> +#if defined(CONFIG_FSFREEZE)
>
> /*
> * Return status of freeze/thaw
> @@ -525,6 +530,65 @@ static void guest_fsfreeze_cleanup(void)
> }
> #endif /* CONFIG_FSFREEZE */
>
> +#if defined(CONFIG_FSTRIM)
> +/*
> + * Walk list of mounted file systems in the guest, and trim them.
> + */
> +void qmp_guest_fstrim(bool has_minimum, int64_t minimum, Error **err)
> +{
> + int ret = 0;
> + FsMountList mounts;
> + struct FsMount *mount;
> + int fd;
> + char err_msg[512];
> + struct fstrim_range r = {
> + .start = 0,
> + .len = -1,
> + .minlen = has_minimum ? minimum : 0,
> + };
> +
> + slog("guest-fstrim called");
> +
> + QTAILQ_INIT(&mounts);
> + ret = build_fs_mount_list(&mounts);
> + if (ret < 0) {
> + return;
> + }
> +
> + QTAILQ_FOREACH(mount, &mounts, next) {
> + fd = qemu_open(mount->dirname, O_RDONLY);
> + if (fd == -1) {
> + sprintf(err_msg, "failed to open %s, %s", mount->dirname,
> + strerror(errno));
> + error_set(err, QERR_QGA_COMMAND_FAILED, err_msg);
> + goto error;
> + }
> +
> + /* We try to cull filesytems we know won't work in advance, but other
> + * filesytems may not implement fstrim for less obvious reasons. These
> + * will report EOPNOTSUPP; we simply ignore these errors. Any other
> + * error means an unexpected error, so return it in those cases. In
> + * some other cases ENOTTY will be reported (e.g. CD-ROMs).
> + */
> + ret = ioctl(fd, FITRIM, &r);
> + if (ret == -1) {
> + if (errno != ENOTTY && errno != EOPNOTSUPP) {
> + sprintf(err_msg, "failed to trim %s, %s",
> + mount->dirname, strerror(errno));
> + error_set(err, QERR_QGA_COMMAND_FAILED, err_msg);
> + close(fd);
> + goto error;
> + }
> + }
> + close(fd);
> + }
> +
> +error:
> + free_fs_mount_list(&mounts);
> +}
> +#endif /* CONFIG_FSTRIM */
> +
> +
> #define LINUX_SYS_STATE_FILE "/sys/power/state"
> #define SUSPEND_SUPPORTED 0
> #define SUSPEND_NOT_SUPPORTED 1
> @@ -918,7 +982,15 @@ int64_t qmp_guest_fsfreeze_thaw(Error **err)
>
> return 0;
> }
> +#endif /* CONFIG_FSFREEZE */
> +
> +#if !defined(CONFIG_FSTRIM)
> +void qmp_guest_fstrim(bool has_minimum, int64_t minimum, Error **err)
> +{
> + error_set(err, QERR_UNSUPPORTED);
>
> + return;
> +}
> #endif
>
> /* register init/cleanup routines for stateful command groups */
> diff --git a/qga/commands-win32.c b/qga/commands-win32.c
> index eb8d140..54bc546 100644
> --- a/qga/commands-win32.c
> +++ b/qga/commands-win32.c
> @@ -173,6 +173,17 @@ int64_t qmp_guest_fsfreeze_thaw(Error **err)
> return 0;
> }
>
> +/*
> + * Walk list of mounted file systems in the guest, and discard unused
> + * areas.
> + */
> +void qmp_guest_fstrim(bool has_minimum, int64_t minimum, Error **err)
> +{
> + error_set(err, QERR_UNSUPPORTED);
> +
> + return;
> +}
> +
> typedef enum {
> GUEST_SUSPEND_MODE_DISK,
> GUEST_SUSPEND_MODE_RAM
>
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [Qemu-devel] [PATCH v2 0/2] qemu-ga: Add guest-fstrim command.
2012-06-13 5:41 [Qemu-devel] [PATCH v2 0/2] qemu-ga: Add guest-fstrim command Paolo Bonzini
2012-06-13 5:41 ` [Qemu-devel] [PATCH v2 1/2] qemu-ga: make names more generic for mount list functions Paolo Bonzini
2012-06-13 5:41 ` [Qemu-devel] [PATCH v2 2/2] qemu-ga: add guest-fstrim command Paolo Bonzini
@ 2012-06-13 18:26 ` Luiz Capitulino
2012-06-13 20:44 ` Michael Roth
3 siblings, 0 replies; 7+ messages in thread
From: Luiz Capitulino @ 2012-06-13 18:26 UTC (permalink / raw)
To: Paolo Bonzini; +Cc: qemu-devel, mdroth
On Wed, 13 Jun 2012 07:41:26 +0200
Paolo Bonzini <pbonzini@redhat.com> wrote:
> FITRIM is a mounted filesystem feature to discard (or "trim") blocks which
> are not in use by the filesystem. This is useful for solid-state drives
> (SSDs) and thinly-provisioned storage. Provide access to the feature
> from the host so that filesystems can be trimmed periodically or before
> migration.
>
> v1->v2: fix version number, define mount list functions also for CONFIG_FSTRIM
Reviewed-by: Luiz Capitulino <lcapitulino@redhat.com>
>
> Paolo Bonzini (2):
> qemu-ga: make names more generic for mount list functions
> qemu-ga: add guest-fstrim command
>
> qapi-schema-guest.json | 20 +++++++++
> qga/commands-posix.c | 114 +++++++++++++++++++++++++++++++++++++++---------
> qga/commands-win32.c | 11 +++++
> 3 files changed, 124 insertions(+), 21 deletions(-)
>
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [Qemu-devel] [PATCH v2 0/2] qemu-ga: Add guest-fstrim command.
2012-06-13 5:41 [Qemu-devel] [PATCH v2 0/2] qemu-ga: Add guest-fstrim command Paolo Bonzini
` (2 preceding siblings ...)
2012-06-13 18:26 ` [Qemu-devel] [PATCH v2 0/2] qemu-ga: Add " Luiz Capitulino
@ 2012-06-13 20:44 ` Michael Roth
3 siblings, 0 replies; 7+ messages in thread
From: Michael Roth @ 2012-06-13 20:44 UTC (permalink / raw)
To: Paolo Bonzini; +Cc: qemu-devel, lcapitulino
On Wed, Jun 13, 2012 at 07:41:26AM +0200, Paolo Bonzini wrote:
> FITRIM is a mounted filesystem feature to discard (or "trim") blocks which
> are not in use by the filesystem. This is useful for solid-state drives
> (SSDs) and thinly-provisioned storage. Provide access to the feature
> from the host so that filesystems can be trimmed periodically or before
> migration.
>
> v1->v2: fix version number, define mount list functions also for CONFIG_FSTRIM
Thanks, applied to qga tree.
>
> Paolo Bonzini (2):
> qemu-ga: make names more generic for mount list functions
> qemu-ga: add guest-fstrim command
>
> qapi-schema-guest.json | 20 +++++++++
> qga/commands-posix.c | 114 +++++++++++++++++++++++++++++++++++++++---------
> qga/commands-win32.c | 11 +++++
> 3 files changed, 124 insertions(+), 21 deletions(-)
>
> --
> 1.7.10.2
>
>
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2012-06-13 20:44 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-06-13 5:41 [Qemu-devel] [PATCH v2 0/2] qemu-ga: Add guest-fstrim command Paolo Bonzini
2012-06-13 5:41 ` [Qemu-devel] [PATCH v2 1/2] qemu-ga: make names more generic for mount list functions Paolo Bonzini
2012-06-13 8:10 ` Michal Privoznik
2012-06-13 5:41 ` [Qemu-devel] [PATCH v2 2/2] qemu-ga: add guest-fstrim command Paolo Bonzini
2012-06-13 8:11 ` Michal Privoznik
2012-06-13 18:26 ` [Qemu-devel] [PATCH v2 0/2] qemu-ga: Add " Luiz Capitulino
2012-06-13 20:44 ` Michael Roth
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.