fs: add fcntl() interface for setting/getting write life time hints
authorJens Axboe <axboe@kernel.dk>
Fri, 16 Jun 2017 17:13:28 +0000 (11:13 -0600)
committerJens Axboe <axboe@fb.com>
Sat, 17 Jun 2017 19:54:22 +0000 (13:54 -0600)
commitf3d8911e36b289a9330125c27b05bd4838d62cb6
tree05c8a5f1d0accd72671e09e40574bc0c6b0010eb
parentb610abd212c30234156bce75ea66d2b9efbbb440
fs: add fcntl() interface for setting/getting write life time hints

We have a pwritev2(2) interface based on passing in flags. Add an
fcntl interface for querying these flags, and also for setting them
as well:

F_GET_RW_HINT Returns the read/write hint set. Right now it
will be one of the WRITE_LIFE_* values.

F_SET_RW_HINT Pass in rw_hint type to set the read/write hint.
Only WRITE_LIFE_* hints are currently supported.
Returns 0 on succes, -1 otherwise.

Sample program testing/implementing basic setting/getting of write
hints is below.

/*
 * writehint.c: check or set a file/inode write hint
 */

static char *str[] = { "WRITE_LIFE_NONE", "WRITE_LIFE_SHORT",
"WRITE_LIFE_MEDIUM", "WRITE_LIFE_LONG",
"WRITE_LIFE_EXTREME" };

int main(int argc, char *argv[])
{
int hint = -1, fd, ret;

if (argc < 2) {
fprintf(stderr, "%s: dev <hint>\n", argv[0]);
return 1;
}

fd = open(argv[1], O_RDONLY);
if (fd < 0) {
perror("open");
return 2;
}

if (argc > 2)
hint = atoi(argv[2]);

if (hint == -1) {
ret = fcntl(fd, F_GET_RW_HINT);
if (ret < 0) {
perror("fcntl: F_GET_RW_HINT");
return 3;
}
hint = ret;
} else {
ret = fcntl(fd, F_SET_RW_HINT, hint);
if (ret < 0) {
perror("fcntl: F_SET_RW_HINT");
return 4;
}
}

printf("%s: %shint %s\n", argv[1], hint != -1 ? "set " : "", str[hint]);
close(fd);
return 0;
}

Signed-off-by: Jens Axboe <axboe@kernel.dk>
fs/fcntl.c
include/uapi/linux/fcntl.h