summaryrefslogtreecommitdiffstats
path: root/api
diff options
context:
space:
mode:
authorBrian Foster <bfoster@redhat.com>2013-05-23 12:19:42 -0400
committerAnand Avati <avati@redhat.com>2013-06-13 14:37:43 -0700
commit17f287172413dc04244781aa5302a0e4f10e2777 (patch)
tree2acfc7097c92de32b19e82140befd8dc9fb2dad2 /api
parentd1ccc4e400728d90f2ef7904661f53deb7199123 (diff)
glusterfs: discard (hole punch) support
Add support for the DISCARD file operation. Discard punches a hole in a file in the provided range. Block de-allocation is implemented via fallocate() (as requested via fuse and passed on to the brick fs) but a separate fop is created within gluster to emphasize the fact that discard changes file data (the discarded region is replaced with zeroes) and must invalidate caches where appropriate. BUG: 963678 Change-Id: I34633a0bfff2187afeab4292a15f3cc9adf261af Signed-off-by: Brian Foster <bfoster@redhat.com> Reviewed-on: http://review.gluster.org/5090 Tested-by: Gluster Build System <jenkins@build.gluster.com> Reviewed-by: Anand Avati <avati@redhat.com>
Diffstat (limited to 'api')
-rwxr-xr-xapi/examples/gfapi.py9
-rw-r--r--api/src/glfs-fops.c34
-rw-r--r--api/src/glfs.h2
3 files changed, 43 insertions, 2 deletions
diff --git a/api/examples/gfapi.py b/api/examples/gfapi.py
index 8dfe2791d0c..8d9ed732947 100755
--- a/api/examples/gfapi.py
+++ b/api/examples/gfapi.py
@@ -100,6 +100,8 @@ class File(object):
def fallocate (self, mode, offset, len):
return api.glfs_fallocate(self.fd, mode, offset, len)
+ def discard (self, offset, len):
+ return api.glfs_discard(self.fd, offset, len)
class Dir(object):
@@ -357,10 +359,13 @@ if __name__ == "__main__":
fd = vol.creat(mypath,os.O_WRONLY|os.O_EXCL,0644)
if not fd:
return False, "creat error"
- rc = fd.fallocate(0, 0, 1024)
+ rc = fd.fallocate(0, 0, 1024*1024)
if rc != 0:
return False, "fallocate error"
- return True, "fallocate worked"
+ rc = fd.discard(4096, 4096)
+ if rc != 0:
+ return False, "discard error"
+ return True, "fallocate/discard worked"
test_list = (
test_create_write,
diff --git a/api/src/glfs-fops.c b/api/src/glfs-fops.c
index 4bc0bb1b6d3..fbc9f4b49e4 100644
--- a/api/src/glfs-fops.c
+++ b/api/src/glfs-fops.c
@@ -2666,6 +2666,40 @@ out:
int
+glfs_discard (struct glfs_fd *glfd, off_t offset, size_t len)
+{
+ int ret = -1;
+ xlator_t *subvol = NULL;
+ fd_t *fd = NULL;
+
+ __glfs_entry_fd (glfd);
+
+ subvol = glfs_active_subvol (glfd->fs);
+ if (!subvol) {
+ ret = -1;
+ errno = EIO;
+ goto out;
+ }
+
+ fd = glfs_resolve_fd (glfd->fs, subvol, glfd);
+ if (!fd) {
+ ret = -1;
+ errno = EBADFD;
+ goto out;
+ }
+
+ ret = syncop_discard (subvol, fd, offset, len);
+out:
+ if (fd)
+ fd_unref(fd);
+
+ glfs_subvol_done (glfd->fs, subvol);
+
+ return ret;
+}
+
+
+int
glfs_chdir (struct glfs *fs, const char *path)
{
int ret = -1;
diff --git a/api/src/glfs.h b/api/src/glfs.h
index 3888a103eb9..700e10f17c9 100644
--- a/api/src/glfs.h
+++ b/api/src/glfs.h
@@ -450,6 +450,8 @@ int glfs_fremovexattr (glfs_fd_t *fd, const char *name);
int glfs_fallocate(glfs_fd_t *fd, int keep_size, off_t offset, size_t len);
+int glfs_discard(glfs_fd_t *fd, off_t offset, size_t len);
+
char *glfs_getcwd (glfs_t *fs, char *buf, size_t size);
int glfs_chdir (glfs_t *fs, const char *path);