* [RFC] [PATCH 0/2] libaal: add device "discard" operation.
@ 2014-05-08 19:13 Ivan Shapovalov
2014-05-08 19:13 ` [RFC] [PATCH 1/2] configure.in: check for fallocate() and related headers Ivan Shapovalov
` (2 more replies)
0 siblings, 3 replies; 4+ messages in thread
From: Ivan Shapovalov @ 2014-05-08 19:13 UTC (permalink / raw)
To: reiserfs-devel; +Cc: Ivan Shapovalov
This implements device discard functionality in libaal to be used
by mkfs and friends.
Note that the build system is _not_ regenerated, so the direct result of
applying these patches won't build.
Ivan Shapovalov (2):
configure.in: check for fallocate() and related headers.
Add aal_device_discard() function and implement it for file-based
device.
configure.in | 4 +--
include/aal/device.h | 4 +++
include/aal/types.h | 3 +++
src/device.c | 15 +++++++++++
src/file.c | 74 ++++++++++++++++++++++++++++++++++++++++++++++++++++
5 files changed, 98 insertions(+), 2 deletions(-)
--
1.9.2
^ permalink raw reply [flat|nested] 4+ messages in thread
* [RFC] [PATCH 1/2] configure.in: check for fallocate() and related headers.
2014-05-08 19:13 [RFC] [PATCH 0/2] libaal: add device "discard" operation Ivan Shapovalov
@ 2014-05-08 19:13 ` Ivan Shapovalov
2014-05-08 19:13 ` [RFC] [PATCH 2/2] Add aal_device_discard() function and implement it for file-based device Ivan Shapovalov
2014-05-08 22:03 ` [RFC] [PATCH 0/2] libaal: add device "discard" operation Edward Shishkin
2 siblings, 0 replies; 4+ messages in thread
From: Ivan Shapovalov @ 2014-05-08 19:13 UTC (permalink / raw)
To: reiserfs-devel; +Cc: Ivan Shapovalov
Signed-off-by: Ivan Shapovalov <intelfx100@gmail.com>
---
configure.in | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/configure.in b/configure.in
index 69bc954..470c728 100644
--- a/configure.in
+++ b/configure.in
@@ -72,7 +72,7 @@ AC_PROG_CC
# Checks for header files.
AC_HEADER_STDC
-AC_CHECK_HEADERS([errno.h fcntl.h stdlib.h string.h sys/ioctl.h unistd.h])
+AC_CHECK_HEADERS([errno.h fcntl.h stdlib.h string.h sys/ioctl.h unistd.h linux/falloc.h linux/types.h])
AC_C_BIGENDIAN
@@ -86,7 +86,7 @@ AC_STRUCT_TM
AC_PROG_GCC_TRADITIONAL
AC_FUNC_MEMCMP
AC_HEADER_STDC
-AC_CHECK_FUNCS([memmove memset strchr strerror strpbrk strrchr])
+AC_CHECK_FUNCS([memmove memset strchr strerror strpbrk strrchr fallocate])
# The options -falign-* are supported by gcc 3.0 or later.
# Probably it is sufficient to only check for -falign-loops.
--
1.9.2
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [RFC] [PATCH 2/2] Add aal_device_discard() function and implement it for file-based device.
2014-05-08 19:13 [RFC] [PATCH 0/2] libaal: add device "discard" operation Ivan Shapovalov
2014-05-08 19:13 ` [RFC] [PATCH 1/2] configure.in: check for fallocate() and related headers Ivan Shapovalov
@ 2014-05-08 19:13 ` Ivan Shapovalov
2014-05-08 22:03 ` [RFC] [PATCH 0/2] libaal: add device "discard" operation Edward Shishkin
2 siblings, 0 replies; 4+ messages in thread
From: Ivan Shapovalov @ 2014-05-08 19:13 UTC (permalink / raw)
To: reiserfs-devel; +Cc: Ivan Shapovalov
Internally, ioctl(BLKDISCARD) or fallocate(FALLOC_FL_PUNCH_HOLE) is used
depending on whether the file is actually a block device.
Signed-off-by: Ivan Shapovalov <intelfx100@gmail.com>
---
include/aal/device.h | 4 +++
include/aal/types.h | 3 +++
src/device.c | 15 +++++++++++
src/file.c | 74 ++++++++++++++++++++++++++++++++++++++++++++++++++++
4 files changed, 96 insertions(+)
diff --git a/include/aal/device.h b/include/aal/device.h
index 535fb79..c1ea19d 100644
--- a/include/aal/device.h
+++ b/include/aal/device.h
@@ -22,6 +22,10 @@ extern errno_t aal_device_reopen(aal_device_t *device,
uint32_t blksize,
int flags);
+extern errno_t aal_device_discard(aal_device_t *device,
+ blk_t block,
+ count_t count);
+
extern errno_t aal_device_write(aal_device_t *device,
void *buff, blk_t block,
count_t count);
diff --git a/include/aal/types.h b/include/aal/types.h
index e26edda..1dd8fce 100644
--- a/include/aal/types.h
+++ b/include/aal/types.h
@@ -203,6 +203,9 @@ struct aal_device_ops {
errno_t (*write) (aal_device_t *,
void *, blk_t, count_t);
+ errno_t (*discard) (aal_device_t *,
+ blk_t, count_t);
+
errno_t (*sync) (aal_device_t *);
errno_t (*equals) (aal_device_t *,
diff --git a/src/device.c b/src/device.c
index fe0a539..43edd1d 100644
--- a/src/device.c
+++ b/src/device.c
@@ -114,6 +114,21 @@ errno_t aal_device_write(
return device->ops->write(device, buff, block, count);
}
+/* Performs discard operation on specified device. Actualqy it calls corresponding
+ operation (discard) from assosiated with device operations. Returns error code,
+ see types.h for more detailed description of errno_t. */
+errno_t aal_device_discard(
+ aal_device_t *device, /* device instance we will discard */
+ blk_t block, /* block we will begin discarding from */
+ count_t count) /* number of blocks to be discarded */
+{
+ aal_assert("intelfx-1", device != NULL);
+ aal_assert("intelfx-2", buff != NULL);
+
+ aal_device_check_routine(device, discard, return -EINVAL);
+ return device->ops->discard(device, block, count);
+}
+
/* Performs sync operation on specified device. Actualy it calls corresponding
operation (sync) from assosiated with device operations. Returns error code,
see types.h for more detailed description of errno_t. */
diff --git a/src/file.c b/src/file.c
index 451c5d4..dd36e3a 100644
--- a/src/file.c
+++ b/src/file.c
@@ -6,6 +6,10 @@
#ifndef ENABLE_MINIMAL
+#ifndef _GNU_SOURCE
+# define _GNU_SOURCE
+#endif
+
#ifdef HAVE_CONFIG_H
# include <config.h>
#endif
@@ -18,9 +22,22 @@
#include <sys/stat.h>
#include <sys/ioctl.h>
+#ifdef HAVE_LINUX_FALLOC_H
+# include <linux/falloc.h>
+#endif
+
+#ifdef HAVE_LINUX_TYPES_H
+# include <linux/types.h>
+#endif
+
/* BLKGETSIZE & BLKGETSIZE64 defines: */
#include <sys/mount.h>
+/* BLKDISCARD define: */
+#if defined(__linux__) && !defined(BLKDISCARD)
+# define BLKDISCARD _IO(0x12,119)
+#endif
+
#include <aal/libaal.h>
/* Function for saving last error message into device assosiated buffer */
@@ -160,6 +177,62 @@ static errno_t file_write(
return 0;
}
+/* Handler for "discard" operation for use with file device. See below for
+ understanding where it is used. */
+static errno_t file_discard(
+ aal_device_t *device, /* file device to discard */
+ blk_t block, /* start position for discarding */
+ count_t count) /* number of blocks to be discarded */
+{
+ struct stat st;
+ int ret;
+
+ if (!device)
+ return -EINVAL;
+
+ /* Stat the file */
+ if(stat(device->name, &st) != 0) {
+ file_error(device);
+ return errno;
+ }
+
+ /* Discard or punch hole depending on whether this is a block device */
+ if (S_ISBLK(st.st_mode)) {
+#ifdef BLKDISCARD
+ __u64 range[2];
+
+ range[0] = (__u64)block * device->blksize;
+ range[1] = (__u64)count * device->blksize;
+
+ ret = ioctl(*((int *)device->entity), BLKDISCARD, &range);
+#else
+ errno = EOPNOTSUPP;
+ ret = -1;
+#endif
+ } else {
+#if defined(HAVE_FALLOCATE) && defined(FALLOC_FL_PUNCH_HOLE)
+ off_t blk, len;
+
+ blk = (off_t)block * device->blksize;
+ len = (off_t)count * device->blksize;
+
+ ret = fallocate(*((int *)device->entity),
+ FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE,
+ blk, len);
+#else
+ errno = EOPNOTSUPP;
+ ret = -1;
+#endif
+ }
+
+ if (ret != 0) {
+ file_error(device);
+ return errno;
+ }
+
+ return 0;
+}
+
/* Handler for "sync" operation for use with file device. See bellow for
understanding where it is used. */
static errno_t file_sync(
@@ -245,6 +318,7 @@ struct aal_device_ops file_ops = {
.close = file_close, /* handler for "create" operation */
.read = file_read, /* handler for "read" operation */
.write = file_write, /* handler for "write" operation */
+ .discard = file_discard, /* handler for "discard" operation */
.sync = file_sync, /* handler for "sync" operation */
.equals = file_equals, /* handler for comparing two devices */
.len = file_len /* handler for length obtaining */
--
1.9.2
^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [RFC] [PATCH 0/2] libaal: add device "discard" operation.
2014-05-08 19:13 [RFC] [PATCH 0/2] libaal: add device "discard" operation Ivan Shapovalov
2014-05-08 19:13 ` [RFC] [PATCH 1/2] configure.in: check for fallocate() and related headers Ivan Shapovalov
2014-05-08 19:13 ` [RFC] [PATCH 2/2] Add aal_device_discard() function and implement it for file-based device Ivan Shapovalov
@ 2014-05-08 22:03 ` Edward Shishkin
2 siblings, 0 replies; 4+ messages in thread
From: Edward Shishkin @ 2014-05-08 22:03 UTC (permalink / raw)
To: Ivan Shapovalov; +Cc: reiserfs-devel
Great, thank you!
To our shame, reiser4 neither preallocates, nor punches holes.
TBH, too lazy ;) I prefer to concentrate on features, which are
either unique, or perform better in reiser4 (like discard)...
Thanks,
Edward.
On 05/08/2014 09:13 PM, Ivan Shapovalov wrote:
> This implements device discard functionality in libaal to be used
> by mkfs and friends.
>
> Note that the build system is _not_ regenerated, so the direct result of
> applying these patches won't build.
>
> Ivan Shapovalov (2):
> configure.in: check for fallocate() and related headers.
> Add aal_device_discard() function and implement it for file-based
> device.
>
> configure.in | 4 +--
> include/aal/device.h | 4 +++
> include/aal/types.h | 3 +++
> src/device.c | 15 +++++++++++
> src/file.c | 74 ++++++++++++++++++++++++++++++++++++++++++++++++++++
> 5 files changed, 98 insertions(+), 2 deletions(-)
>
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2014-05-08 22:03 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-05-08 19:13 [RFC] [PATCH 0/2] libaal: add device "discard" operation Ivan Shapovalov
2014-05-08 19:13 ` [RFC] [PATCH 1/2] configure.in: check for fallocate() and related headers Ivan Shapovalov
2014-05-08 19:13 ` [RFC] [PATCH 2/2] Add aal_device_discard() function and implement it for file-based device Ivan Shapovalov
2014-05-08 22:03 ` [RFC] [PATCH 0/2] libaal: add device "discard" operation Edward Shishkin
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.