Module Name: src Committed By: manu Date: Fri Oct 31 15:12:15 UTC 2014
Modified Files: src/lib/libperfuse: fuse.h ops.c perfuse.c perfuse_priv.h Log Message: FUSE fallocate support There seems to be no fdiscard FUSE operation at the moment, hence that one is left unused. To generate a diff of this commit: cvs rdiff -u -r1.5 -r1.6 src/lib/libperfuse/fuse.h cvs rdiff -u -r1.77 -r1.78 src/lib/libperfuse/ops.c cvs rdiff -u -r1.34 -r1.35 src/lib/libperfuse/perfuse.c cvs rdiff -u -r1.35 -r1.36 src/lib/libperfuse/perfuse_priv.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/lib/libperfuse/fuse.h diff -u src/lib/libperfuse/fuse.h:1.5 src/lib/libperfuse/fuse.h:1.6 --- src/lib/libperfuse/fuse.h:1.5 Wed Dec 28 17:33:53 2011 +++ src/lib/libperfuse/fuse.h Fri Oct 31 15:12:15 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: fuse.h,v 1.5 2011/12/28 17:33:53 manu Exp $ */ +/* $NetBSD: fuse.h,v 1.6 2014/10/31 15:12:15 manu Exp $ */ /*- * Copyright (c) 2010 Emmanuel Dreyfus. All rights reserved. @@ -169,6 +169,9 @@ enum fuse_opcode { FUSE_DESTROY = 38, FUSE_IOCTL = 39, FUSE_POLL = 40, + FUSE_NOTIFY_REPLY = 41, + FUSE_BATCH_FORGET = 42, + FUSE_FALLOCATE = 43, FUSE_OPCODE_MAX, FUSE_CUSE_INIT = 4096 @@ -441,6 +444,14 @@ struct fuse_notify_poll_wakeup_out { uint64_t kh; }; +struct fuse_fallocate_in { + uint64_t fh; + uint64_t offset; + uint64_t length; + uint32_t mode; + uint32_t padding; +}; + #if 0 /* Duplicated in perfuse.h to avoid making fuse.h public */ /* Send from kernel to proces */ struct fuse_in_header { Index: src/lib/libperfuse/ops.c diff -u src/lib/libperfuse/ops.c:1.77 src/lib/libperfuse/ops.c:1.78 --- src/lib/libperfuse/ops.c:1.77 Tue Oct 28 16:54:11 2014 +++ src/lib/libperfuse/ops.c Fri Oct 31 15:12:15 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: ops.c,v 1.77 2014/10/28 16:54:11 manu Exp $ */ +/* $NetBSD: ops.c,v 1.78 2014/10/31 15:12:15 manu Exp $ */ /*- * Copyright (c) 2010-2011 Emmanuel Dreyfus. All rights reserved. @@ -3635,8 +3635,47 @@ perfuse_node_deleteextattr(struct puffs_ error = xchg_msg(pu, opc, pm, NO_PAYLOAD_REPLY_LEN, wait_reply); if (error != 0) goto out; + + ps->ps_destroy_msg(pm); + +out: + node_rele(opc); + return error; +} + +int +perfuse_node_fallocate(struct puffs_usermount *pu, puffs_cookie_t opc, + off_t off, off_t len) +{ + struct perfuse_state *ps; + perfuse_msg_t *pm; + struct fuse_fallocate_in *fai; + int error; + ps = puffs_getspecific(pu); + if (ps->ps_flags & PS_NO_FALLOCATE) + return EOPNOTSUPP; + + node_ref(opc); + + pm = ps->ps_new_msg(pu, opc, FUSE_FALLOCATE, sizeof(*fai), NULL); + + fai = GET_INPAYLOAD(ps, pm, fuse_fallocate_in); + fai->fh = perfuse_get_fh(opc, FWRITE); + fai->offset = off; + fai->length = len; + fai->mode = 0; + + error = xchg_msg(pu, opc, pm, NO_PAYLOAD_REPLY_LEN, wait_reply); + if (error == EOPNOTSUPP || error == ENOSYS) { + ps->ps_flags |= PS_NO_FALLOCATE; + error = EOPNOTSUPP; + } + if (error != 0) + goto out; + ps->ps_destroy_msg(pm); + out: node_rele(opc); return error; Index: src/lib/libperfuse/perfuse.c diff -u src/lib/libperfuse/perfuse.c:1.34 src/lib/libperfuse/perfuse.c:1.35 --- src/lib/libperfuse/perfuse.c:1.34 Wed Sep 3 16:01:45 2014 +++ src/lib/libperfuse/perfuse.c Fri Oct 31 15:12:15 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: perfuse.c,v 1.34 2014/09/03 16:01:45 manu Exp $ */ +/* $NetBSD: perfuse.c,v 1.35 2014/10/31 15:12:15 manu Exp $ */ /*- * Copyright (c) 2010-2011 Emmanuel Dreyfus. All rights reserved. @@ -503,6 +503,9 @@ perfuse_init(struct perfuse_callbacks *p #ifdef PUFFS_OPEN_IO_DIRECT PUFFSOP_SET(pops, perfuse, node, open2); #endif /* PUFFS_OPEN_IO_DIRECT */ +#ifdef PUFFS_HAVE_FALLOCATE + PUFFSOP_SET(pops, perfuse, node, fallocate); +#endif /* PUFFS_HAVE_FALLOCATE */ /* * PUFFS_KFLAG_NOCACHE_NAME is required so that we can see changes Index: src/lib/libperfuse/perfuse_priv.h diff -u src/lib/libperfuse/perfuse_priv.h:1.35 src/lib/libperfuse/perfuse_priv.h:1.36 --- src/lib/libperfuse/perfuse_priv.h:1.35 Wed Sep 3 23:59:58 2014 +++ src/lib/libperfuse/perfuse_priv.h Fri Oct 31 15:12:15 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: perfuse_priv.h,v 1.35 2014/09/03 23:59:58 enami Exp $ */ +/* $NetBSD: perfuse_priv.h,v 1.36 2014/10/31 15:12:15 manu Exp $ */ /*- * Copyright (c) 2010-2011 Emmanuel Dreyfus. All rights reserved. @@ -67,6 +67,7 @@ struct perfuse_state { #define PS_NO_ACCESS 0x0001 /* access is unimplemented; */ #define PS_NO_CREAT 0x0004 /* create is unimplemented */ #define PS_INLOOP 0x0008 /* puffs mainloop started */ +#define PS_NO_FALLOCATE 0x0010 /* fallocate is unimplemented */ uint64_t ps_fsid; uint32_t ps_max_readahead; uint32_t ps_max_write; @@ -277,6 +278,8 @@ int perfuse_node_getattr_ttl(struct puff int perfuse_node_setattr_ttl(struct puffs_usermount *, puffs_cookie_t, struct vattr *, const struct puffs_cred *, struct timespec *, int); +int perfuse_node_fallocate(struct puffs_usermount *, + puffs_cookie_t, off_t, off_t); struct perfuse_trace *perfuse_trace_begin(struct perfuse_state *, puffs_cookie_t, perfuse_msg_t *);