Merge the extattr VOPs from ffs.

As these do nothing besides dispatch to ulfs_extattr.c it wasn't
exactly hard.

This might just make extended attributes work on lfs...
This commit is contained in:
dholland 2013-07-28 01:27:02 +00:00
parent 1c11495e64
commit ba91b8b1fa
1 changed files with 195 additions and 2 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: lfs_vnops.c,v 1.253 2013/07/28 01:10:49 dholland Exp $ */
/* $NetBSD: lfs_vnops.c,v 1.254 2013/07/28 01:27:02 dholland Exp $ */
/*-
* Copyright (c) 1999, 2000, 2001, 2002, 2003 The NetBSD Foundation, Inc.
@ -60,7 +60,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: lfs_vnops.c,v 1.253 2013/07/28 01:10:49 dholland Exp $");
__KERNEL_RCSID(0, "$NetBSD: lfs_vnops.c,v 1.254 2013/07/28 01:27:02 dholland Exp $");
#ifdef _KERNEL_OPT
#include "opt_compat_netbsd.h"
@ -105,6 +105,13 @@ __KERNEL_RCSID(0, "$NetBSD: lfs_vnops.c,v 1.253 2013/07/28 01:10:49 dholland Exp
extern pid_t lfs_writer_daemon;
int lfs_ignore_lazy_sync = 1;
static int lfs_openextattr(void *v);
static int lfs_closeextattr(void *v);
static int lfs_getextattr(void *v);
static int lfs_setextattr(void *v);
static int lfs_listextattr(void *v);
static int lfs_deleteextattr(void *v);
/* Global vfs data structures for lfs. */
int (**lfs_vnodeop_p)(void *);
const struct vnodeopv_entry_desc lfs_vnodeop_entries[] = {
@ -150,6 +157,12 @@ const struct vnodeopv_entry_desc lfs_vnodeop_entries[] = {
{ &vop_bwrite_desc, lfs_bwrite }, /* bwrite */
{ &vop_getpages_desc, lfs_getpages }, /* getpages */
{ &vop_putpages_desc, lfs_putpages }, /* putpages */
{ &vop_openextattr_desc, lfs_openextattr }, /* openextattr */
{ &vop_closeextattr_desc, lfs_closeextattr }, /* closeextattr */
{ &vop_getextattr_desc, lfs_getextattr }, /* getextattr */
{ &vop_setextattr_desc, lfs_setextattr }, /* setextattr */
{ &vop_listextattr_desc, lfs_listextattr }, /* listextattr */
{ &vop_deleteextattr_desc, lfs_deleteextattr }, /* deleteextattr */
{ NULL, NULL }
};
const struct vnodeopv_desc lfs_vnodeop_opv_desc =
@ -198,6 +211,12 @@ const struct vnodeopv_entry_desc lfs_specop_entries[] = {
{ &vop_bwrite_desc, vn_bwrite }, /* bwrite */
{ &vop_getpages_desc, spec_getpages }, /* getpages */
{ &vop_putpages_desc, spec_putpages }, /* putpages */
{ &vop_openextattr_desc, lfs_openextattr }, /* openextattr */
{ &vop_closeextattr_desc, lfs_closeextattr }, /* closeextattr */
{ &vop_getextattr_desc, lfs_getextattr }, /* getextattr */
{ &vop_setextattr_desc, lfs_setextattr }, /* setextattr */
{ &vop_listextattr_desc, lfs_listextattr }, /* listextattr */
{ &vop_deleteextattr_desc, lfs_deleteextattr }, /* deleteextattr */
{ NULL, NULL }
};
const struct vnodeopv_desc lfs_specop_opv_desc =
@ -245,6 +264,12 @@ const struct vnodeopv_entry_desc lfs_fifoop_entries[] = {
{ &vop_advlock_desc, vn_fifo_bypass }, /* advlock */
{ &vop_bwrite_desc, lfs_bwrite }, /* bwrite */
{ &vop_putpages_desc, vn_fifo_bypass }, /* putpages */
{ &vop_openextattr_desc, lfs_openextattr }, /* openextattr */
{ &vop_closeextattr_desc, lfs_closeextattr }, /* closeextattr */
{ &vop_getextattr_desc, lfs_getextattr }, /* getextattr */
{ &vop_setextattr_desc, lfs_setextattr }, /* setextattr */
{ &vop_listextattr_desc, lfs_listextattr }, /* listextattr */
{ &vop_deleteextattr_desc, lfs_deleteextattr }, /* deleteextattr */
{ NULL, NULL }
};
const struct vnodeopv_desc lfs_fifoop_opv_desc =
@ -2456,3 +2481,171 @@ lfs_mmap(void *v)
return EOPNOTSUPP;
return ulfs_mmap(v);
}
static int
lfs_openextattr(void *v)
{
struct vop_openextattr_args /* {
struct vnode *a_vp;
kauth_cred_t a_cred;
struct proc *a_p;
} */ *ap = v;
struct inode *ip = VTOI(ap->a_vp);
struct ulfsmount *ump = ip->i_ump;
//struct lfs *fs = ip->i_lfs;
/* Not supported for ULFS1 file systems. */
if (ump->um_fstype == ULFS1)
return (EOPNOTSUPP);
/* XXX Not implemented for ULFS2 file systems. */
return (EOPNOTSUPP);
}
static int
lfs_closeextattr(void *v)
{
struct vop_closeextattr_args /* {
struct vnode *a_vp;
int a_commit;
kauth_cred_t a_cred;
struct proc *a_p;
} */ *ap = v;
struct inode *ip = VTOI(ap->a_vp);
struct ulfsmount *ump = ip->i_ump;
//struct lfs *fs = ip->i_lfs;
/* Not supported for ULFS1 file systems. */
if (ump->um_fstype == ULFS1)
return (EOPNOTSUPP);
/* XXX Not implemented for ULFS2 file systems. */
return (EOPNOTSUPP);
}
static int
lfs_getextattr(void *v)
{
struct vop_getextattr_args /* {
struct vnode *a_vp;
int a_attrnamespace;
const char *a_name;
struct uio *a_uio;
size_t *a_size;
kauth_cred_t a_cred;
struct proc *a_p;
} */ *ap = v;
struct vnode *vp = ap->a_vp;
struct inode *ip = VTOI(vp);
struct ulfsmount *ump = ip->i_ump;
//struct lfs *fs = ip->i_lfs;
int error;
if (ump->um_fstype == ULFS1) {
#ifdef LFS_EXTATTR
fstrans_start(vp->v_mount, FSTRANS_SHARED);
error = ulfs_getextattr(ap);
fstrans_done(vp->v_mount);
#else
error = EOPNOTSUPP;
#endif
return error;
}
/* XXX Not implemented for ULFS2 file systems. */
return (EOPNOTSUPP);
}
static int
lfs_setextattr(void *v)
{
struct vop_setextattr_args /* {
struct vnode *a_vp;
int a_attrnamespace;
const char *a_name;
struct uio *a_uio;
kauth_cred_t a_cred;
struct proc *a_p;
} */ *ap = v;
struct vnode *vp = ap->a_vp;
struct inode *ip = VTOI(vp);
struct ulfsmount *ump = ip->i_ump;
//struct lfs *fs = ip->i_lfs;
int error;
if (ump->um_fstype == ULFS1) {
#ifdef LFS_EXTATTR
fstrans_start(vp->v_mount, FSTRANS_SHARED);
error = ulfs_setextattr(ap);
fstrans_done(vp->v_mount);
#else
error = EOPNOTSUPP;
#endif
return error;
}
/* XXX Not implemented for ULFS2 file systems. */
return (EOPNOTSUPP);
}
static int
lfs_listextattr(void *v)
{
struct vop_listextattr_args /* {
struct vnode *a_vp;
int a_attrnamespace;
struct uio *a_uio;
size_t *a_size;
kauth_cred_t a_cred;
struct proc *a_p;
} */ *ap = v;
struct vnode *vp = ap->a_vp;
struct inode *ip = VTOI(vp);
struct ulfsmount *ump = ip->i_ump;
//struct lfs *fs = ip->i_lfs;
int error;
if (ump->um_fstype == ULFS1) {
#ifdef LFS_EXTATTR
fstrans_start(vp->v_mount, FSTRANS_SHARED);
error = ulfs_listextattr(ap);
fstrans_done(vp->v_mount);
#else
error = EOPNOTSUPP;
#endif
return error;
}
/* XXX Not implemented for ULFS2 file systems. */
return (EOPNOTSUPP);
}
static int
lfs_deleteextattr(void *v)
{
struct vop_deleteextattr_args /* {
struct vnode *a_vp;
int a_attrnamespace;
kauth_cred_t a_cred;
struct proc *a_p;
} */ *ap = v;
struct vnode *vp = ap->a_vp;
struct inode *ip = VTOI(vp);
struct ulfsmount *ump = ip->i_ump;
//struct fs *fs = ip->i_lfs;
int error;
if (ump->um_fstype == ULFS1) {
#ifdef LFS_EXTATTR
fstrans_start(vp->v_mount, FSTRANS_SHARED);
error = ulfs_deleteextattr(ap);
fstrans_done(vp->v_mount);
#else
error = EOPNOTSUPP;
#endif
return error;
}
/* XXX Not implemented for ULFS2 file systems. */
return (EOPNOTSUPP);
}