diff options
author | Björn-Egil Dahlberg <[email protected]> | 2013-01-11 16:17:57 +0100 |
---|---|---|
committer | Björn-Egil Dahlberg <[email protected]> | 2013-01-11 16:17:57 +0100 |
commit | 8df9bc2fc2336245d26bdcf386fee43904d2b34b (patch) | |
tree | c37f14e3de7884a9e537dee9b0be6dfdba86d9a3 /erts/emulator/drivers/common/efile_drv.c | |
parent | 1897e315ee2d8417a6e32f5fae00e9a124a45d83 (diff) | |
parent | 918d7a3f1ee1f0b10fa3ead21f79166328fd2dfe (diff) | |
download | otp-8df9bc2fc2336245d26bdcf386fee43904d2b34b.tar.gz otp-8df9bc2fc2336245d26bdcf386fee43904d2b34b.tar.bz2 otp-8df9bc2fc2336245d26bdcf386fee43904d2b34b.zip |
Merge branch 'fdm/file-allocate/OTP-10680'
* fdm/file-allocate/OTP-10680:
Update preloaded prim_file.beam
erts: Fix xcomp configure for fallocate
Add file:allocate/3 operation
Diffstat (limited to 'erts/emulator/drivers/common/efile_drv.c')
-rw-r--r-- | erts/emulator/drivers/common/efile_drv.c | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/erts/emulator/drivers/common/efile_drv.c b/erts/emulator/drivers/common/efile_drv.c index 2ac7f169af..25b02db2c9 100644 --- a/erts/emulator/drivers/common/efile_drv.c +++ b/erts/emulator/drivers/common/efile_drv.c @@ -56,6 +56,7 @@ #define FILE_FDATASYNC 30 #define FILE_FADVISE 31 #define FILE_SENDFILE 32 +#define FILE_FALLOCATE 33 /* Return codes */ @@ -504,6 +505,10 @@ struct t_data Uint64 written; } sendfile; #endif /* HAVE_SENDFILE */ + struct { + Sint64 offset; + Sint64 length; + } fallocate; } c; char b[1]; }; @@ -1963,6 +1968,17 @@ static int flush_sendfile(file_descriptor *desc,void *_) { #endif /* HAVE_SENDFILE */ +static void invoke_fallocate(void *data) +{ + struct t_data *d = (struct t_data *) data; + int fd = (int) d->fd; + Sint64 offset = d->c.fallocate.offset; + Sint64 length = d->c.fallocate.length; + + d->again = 0; + d->result_ok = efile_fallocate(&d->errInfo, fd, offset, length); +} + static void free_readdir(void *data) { struct t_data *d = (struct t_data *) data; @@ -2358,6 +2374,7 @@ file_async_ready(ErlDrvData e, ErlDrvThreadData data) case FILE_RENAME: case FILE_WRITE_INFO: case FILE_FADVISE: + case FILE_FALLOCATE: reply(desc, d->result_ok, &d->errInfo); free_data(data); break; @@ -2971,6 +2988,20 @@ file_output(ErlDrvData e, char* buf, ErlDrvSizeT count) goto done; } + case FILE_FALLOCATE: + { + d = EF_SAFE_ALLOC(sizeof(struct t_data)); + + d->fd = fd; + d->command = command; + d->invoke = invoke_fallocate; + d->free = free_data; + d->level = 2; + d->c.fallocate.offset = get_int64((uchar*) buf); + d->c.fallocate.length = get_int64(((uchar*) buf) + sizeof(Sint64)); + goto done; + } + } /* |