Module Name: src Committed By: pooka Date: Fri May 21 10:52:17 UTC 2010
Modified Files: src/lib/libp2k: p2k.c Log Message: support extended attributes To generate a diff of this commit: cvs rdiff -u -r1.37 -r1.38 src/lib/libp2k/p2k.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/lib/libp2k/p2k.c diff -u src/lib/libp2k/p2k.c:1.37 src/lib/libp2k/p2k.c:1.38 --- src/lib/libp2k/p2k.c:1.37 Thu May 20 00:13:02 2010 +++ src/lib/libp2k/p2k.c Fri May 21 10:52:17 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: p2k.c,v 1.37 2010/05/20 00:13:02 pooka Exp $ */ +/* $NetBSD: p2k.c,v 1.38 2010/05/21 10:52:17 pooka Exp $ */ /* * Copyright (c) 2007, 2008, 2009 Antti Kantee. All Rights Reserved. @@ -283,6 +283,7 @@ PUFFSOP_SET(pops, p2k, fs, sync); PUFFSOP_SET(pops, p2k, fs, fhtonode); PUFFSOP_SET(pops, p2k, fs, nodetofh); + PUFFSOP_SET(pops, p2k, fs, extattrctl); PUFFSOP_SET(pops, p2k, node, lookup); PUFFSOP_SET(pops, p2k, node, create); @@ -313,6 +314,11 @@ PUFFSOP_SET(pops, p2k, node, reclaim); PUFFSOP_SET(pops, p2k, node, abortop); + PUFFSOP_SET(pops, p2k, node, getextattr); + PUFFSOP_SET(pops, p2k, node, setextattr); + PUFFSOP_SET(pops, p2k, node, listextattr); + PUFFSOP_SET(pops, p2k, node, deleteextattr); + dodaemon = true; hasdebug = false; @@ -642,6 +648,26 @@ return rump_pub_vfs_vptofh(vp, fid, fidsize); } +int +p2k_fs_extattrctl(struct puffs_usermount *pu, int cmd, + puffs_cookie_t cookie, int flags, + int attrnamespace, const char *attrname) +{ + struct p2k_mount *p2m = puffs_getspecific(pu); + struct mount *mp = p2m->p2m_mp; + struct vnode *vp; + + if (flags & PUFFS_EXTATTRCTL_HASNODE) { + vp = OPC2VP(cookie); + RUMP_VOP_LOCK(vp, LK_EXCLUSIVE | LK_RETRY); + } else { + vp = NULL; + } + + /* vfsop unlocks (but doesn't release) vnode, so we're done here */ + return rump_pub_vfs_extattrctl(mp, cmd, vp, attrnamespace, attrname); +} + /*ARGSUSED*/ int p2k_node_lookup(struct puffs_usermount *pu, puffs_cookie_t opc, @@ -1276,6 +1302,109 @@ return rv; } +/*ARGSUSED*/ +int +p2k_node_getextattr(struct puffs_usermount *pu, puffs_cookie_t opc, + int attrnamespace, const char *attrname, size_t *attrsize, + uint8_t *attr, size_t *resid, const struct puffs_cred *pcr) +{ + struct vnode *vp = OPC2VP(opc); + struct kauth_cred *cred; + struct uio *uio; + int rv; + + if (attr) + uio = rump_pub_uio_setup(attr, *resid, 0, RUMPUIO_READ); + else + uio = NULL; + + cred = cred_create(pcr); + RUMP_VOP_LOCK(vp, LK_EXCLUSIVE); + rv = RUMP_VOP_GETEXTATTR(vp, attrnamespace, attrname, uio, + attrsize, cred); + RUMP_VOP_UNLOCK(vp, 0); + cred_destroy(cred); + + if (uio) + *resid = rump_pub_uio_free(uio); + + return rv; +} + +/*ARGSUSED*/ +int +p2k_node_setextattr(struct puffs_usermount *pu, puffs_cookie_t opc, + int attrnamespace, const char *attrname, + uint8_t *attr, size_t *resid, const struct puffs_cred *pcr) +{ + struct vnode *vp = OPC2VP(opc); + struct kauth_cred *cred; + struct uio *uio; + int rv; + + if (attr) + uio = rump_pub_uio_setup(attr, *resid, 0, RUMPUIO_READ); + else + uio = NULL; + + cred = cred_create(pcr); + RUMP_VOP_LOCK(vp, LK_EXCLUSIVE); + rv = RUMP_VOP_SETEXTATTR(vp, attrnamespace, attrname, uio, cred); + RUMP_VOP_UNLOCK(vp, 0); + cred_destroy(cred); + + if (uio) + *resid = rump_pub_uio_free(uio); + + return rv; +} + +/*ARGSUSED*/ +int +p2k_node_listextattr(struct puffs_usermount *pu, puffs_cookie_t opc, + int attrnamespace, size_t *attrsize, + uint8_t *attrs, size_t *resid, const struct puffs_cred *pcr) +{ + struct vnode *vp = OPC2VP(opc); + struct kauth_cred *cred; + struct uio *uio; + int rv; + + if (attrs) + uio = rump_pub_uio_setup(attrs, *resid, 0, RUMPUIO_READ); + else + uio = NULL; + + cred = cred_create(pcr); + RUMP_VOP_LOCK(vp, LK_EXCLUSIVE); + rv = RUMP_VOP_LISTEXTATTR(vp, attrnamespace, uio, attrsize, cred); + RUMP_VOP_UNLOCK(vp, 0); + cred_destroy(cred); + + if (uio) + *resid = rump_pub_uio_free(uio); + + return rv; +} + +/*ARGSUSED*/ +int +p2k_node_deleteextattr(struct puffs_usermount *pu, puffs_cookie_t opc, + int attrnamespace, const char *attrname, const struct puffs_cred *pcr) +{ + struct vnode *vp = OPC2VP(opc); + struct kauth_cred *cred; + int rv; + + cred = cred_create(pcr); + RUMP_VOP_LOCK(vp, LK_EXCLUSIVE); + rv = RUMP_VOP_DELETEEXTATTR(vp, attrnamespace, attrname, cred); + RUMP_VOP_UNLOCK(vp, 0); + cred_destroy(cred); + + return rv; +} + /* the kernel releases its last reference here */ int p2k_node_inactive(struct puffs_usermount *pu, puffs_cookie_t opc)