Add missing headers
Rework vnodes to be based on the slab cache, just like on Solaris. git-svn-id: https://outreach.scidac.gov/svn/spl/trunk@45 7e1ea52c-4ff2-0310-8f11-9dd32ca42a1c
This commit is contained in:
parent
ea19fbed05
commit
af828292e5
2
FIXME
2
FIXME
|
@ -6,8 +6,6 @@ sys/dkio.h - All borrowed from libsolcompat
|
||||||
sys/dklabel.h - All borrowed from libsolcompat
|
sys/dklabel.h - All borrowed from libsolcompat
|
||||||
sys/types32.h - All borrowed from libsolcompat
|
sys/types32.h - All borrowed from libsolcompat
|
||||||
sys/isa_defs.h - AlL borrowed from libsolcompat
|
sys/isa_defs.h - AlL borrowed from libsolcompat
|
||||||
sys/u8_textprep.h - AlL borrowed from libsolcompat
|
|
||||||
sys/u8_textprep_data - AlL borrowed from libsolcompat
|
|
||||||
sys/acl.h _ All borrowed from libsolcompat
|
sys/acl.h _ All borrowed from libsolcompat
|
||||||
sys/acl_impl.h _ All borrowed from libsolcompat
|
sys/acl_impl.h _ All borrowed from libsolcompat
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,4 @@
|
||||||
|
#ifndef _SPL_FS_FS_SUBR_H
|
||||||
|
#define _SPL_FS_FS_SUBR_H
|
||||||
|
|
||||||
|
#endif /* SPL_FS_FS_SUBR_H */
|
|
@ -0,0 +1,4 @@
|
||||||
|
#ifndef _SPL_FILE_H
|
||||||
|
#define _SPL_FILE_H
|
||||||
|
|
||||||
|
#endif /* SPL_FILE_H */
|
|
@ -0,0 +1,4 @@
|
||||||
|
#ifndef _SPL_MKDEV_H
|
||||||
|
#define _SPL_MKDEV_H
|
||||||
|
|
||||||
|
#endif /* SPL_MKDEV_H */
|
|
@ -0,0 +1,4 @@
|
||||||
|
#ifndef _SPL_MNTENT_H
|
||||||
|
#define _SPL_MNTENT_H
|
||||||
|
|
||||||
|
#endif /* SPL_MNTENT_H */
|
|
@ -0,0 +1,4 @@
|
||||||
|
#ifndef _SPL_MODE_H
|
||||||
|
#define _SPL_MODE_H
|
||||||
|
|
||||||
|
#endif /* SPL_MODE_H */
|
|
@ -0,0 +1,11 @@
|
||||||
|
#ifndef _SPL_PATHNAME_H
|
||||||
|
#define _SPL_PATHNAME_H
|
||||||
|
|
||||||
|
typedef struct pathname {
|
||||||
|
char *pn_buf; /* underlying storage */
|
||||||
|
char *pn_path; /* remaining pathname */
|
||||||
|
size_t pn_pathlen; /* remaining length */
|
||||||
|
size_t pn_bufsize; /* total size of pn_buf */
|
||||||
|
} pathname_t;
|
||||||
|
|
||||||
|
#endif /* SPL_PATHNAME_H */
|
|
@ -0,0 +1,4 @@
|
||||||
|
#ifndef _SPL_UNISTD_H
|
||||||
|
#define _SPL_UNISTD_H
|
||||||
|
|
||||||
|
#endif /* SPL_UNISTD_H */
|
|
@ -0,0 +1,4 @@
|
||||||
|
#ifndef _SPL_OPREG_H
|
||||||
|
#define _SPL_OPREG_H
|
||||||
|
|
||||||
|
#endif /* SPL_OPREG_H */
|
|
@ -2,6 +2,9 @@
|
||||||
#define _SPL_VMSYSTM_H
|
#define _SPL_VMSYSTM_H
|
||||||
|
|
||||||
#include <linux/mm.h>
|
#include <linux/mm.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
|
||||||
|
extern vmem_t *zio_alloc_arena; /* arena for zio caches */
|
||||||
|
|
||||||
#define physmem num_physpages
|
#define physmem num_physpages
|
||||||
#define ptob(pages) (pages * PAGE_SIZE)
|
#define ptob(pages) (pages * PAGE_SIZE)
|
||||||
|
|
|
@ -9,6 +9,8 @@
|
||||||
#include <linux/dcache.h>
|
#include <linux/dcache.h>
|
||||||
#include <linux/namei.h>
|
#include <linux/namei.h>
|
||||||
#include <linux/fs.h>
|
#include <linux/fs.h>
|
||||||
|
#include <sys/kmem.h>
|
||||||
|
#include <sys/mutex.h>
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <sys/time.h>
|
#include <sys/time.h>
|
||||||
#include <sys/uio.h>
|
#include <sys/uio.h>
|
||||||
|
@ -72,11 +74,6 @@ typedef enum vtype {
|
||||||
VBAD = 11
|
VBAD = 11
|
||||||
} vtype_t;
|
} vtype_t;
|
||||||
|
|
||||||
typedef struct vnode {
|
|
||||||
struct file *v_fp;
|
|
||||||
vtype_t v_type;
|
|
||||||
} vnode_t;
|
|
||||||
|
|
||||||
typedef struct vattr {
|
typedef struct vattr {
|
||||||
enum vtype va_type; /* vnode type */
|
enum vtype va_type; /* vnode type */
|
||||||
u_int va_mask; /* attribute bit-mask */
|
u_int va_mask; /* attribute bit-mask */
|
||||||
|
@ -130,6 +127,20 @@ typedef struct vsecattr {
|
||||||
size_t vsa_aclentsz; /* ACE size in bytes of vsa_aclentp */
|
size_t vsa_aclentsz; /* ACE size in bytes of vsa_aclentp */
|
||||||
} vsecattr_t;
|
} vsecattr_t;
|
||||||
|
|
||||||
|
typedef struct vnode {
|
||||||
|
struct file *v_fp;
|
||||||
|
kmutex_t v_lock; /* protects vnode fields */
|
||||||
|
uint_t v_flag; /* vnode flags (see below) */
|
||||||
|
uint_t v_count; /* reference count */
|
||||||
|
void *v_data; /* private data for fs */
|
||||||
|
struct vfs *v_vfsp; /* ptr to containing VFS */
|
||||||
|
struct stdata *v_stream; /* associated stream */
|
||||||
|
enum vtype v_type; /* vnode type */
|
||||||
|
dev_t v_rdev; /* device (VCHR, VBLK) */
|
||||||
|
} vnode_t;
|
||||||
|
|
||||||
|
extern vnode_t *vn_alloc(int flag);
|
||||||
|
void vn_free(vnode_t *vp);
|
||||||
extern int vn_open(const char *path, uio_seg_t seg, int flags, int mode,
|
extern int vn_open(const char *path, uio_seg_t seg, int flags, int mode,
|
||||||
vnode_t **vpp, int x1, void *x2);
|
vnode_t **vpp, int x1, void *x2);
|
||||||
extern int vn_openat(const char *path, uio_seg_t seg, int flags, int mode,
|
extern int vn_openat(const char *path, uio_seg_t seg, int flags, int mode,
|
||||||
|
@ -143,6 +154,9 @@ extern int vn_rename(const char *path1, const char *path2, int x1);
|
||||||
extern int vn_getattr(vnode_t *vp, vattr_t *vap, int flags, void *x3, void *x4);
|
extern int vn_getattr(vnode_t *vp, vattr_t *vap, int flags, void *x3, void *x4);
|
||||||
extern int vn_fsync(vnode_t *vp, int flags, void *x3, void *x4);
|
extern int vn_fsync(vnode_t *vp, int flags, void *x3, void *x4);
|
||||||
|
|
||||||
|
int vn_init(void);
|
||||||
|
void vn_fini(void);
|
||||||
|
|
||||||
static __inline__ int
|
static __inline__ int
|
||||||
vn_rele(vnode_t *vp)
|
vn_rele(vnode_t *vp)
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
#ifndef _SPL_ANON_H
|
#ifndef _SPL_VM_ANON_H
|
||||||
#define _SPL_ANON_H
|
#define _SPL_VM_ANON_H
|
||||||
|
|
||||||
#endif /* SPL_ANON_H */
|
#endif /* SPL_VM_ANON_H */
|
||||||
|
|
|
@ -0,0 +1,4 @@
|
||||||
|
#ifndef _SPL_VM_PVN_H
|
||||||
|
#define _SPL_VM_PVN_H
|
||||||
|
|
||||||
|
#endif /* SPL_VM_PVN_H */
|
|
@ -1,4 +1,6 @@
|
||||||
#include <sys/sysmacros.h>
|
#include <sys/sysmacros.h>
|
||||||
|
#include <sys/vmsystm.h>
|
||||||
|
#include <sys/vnode.h>
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -11,6 +13,9 @@ EXPORT_SYMBOL(p0);
|
||||||
char hw_serial[11];
|
char hw_serial[11];
|
||||||
EXPORT_SYMBOL(hw_serial);
|
EXPORT_SYMBOL(hw_serial);
|
||||||
|
|
||||||
|
vmem_t *zio_alloc_arena = NULL;
|
||||||
|
EXPORT_SYMBOL(zio_alloc_arena);
|
||||||
|
|
||||||
int
|
int
|
||||||
highbit(unsigned long i)
|
highbit(unsigned long i)
|
||||||
{
|
{
|
||||||
|
@ -52,13 +57,21 @@ EXPORT_SYMBOL(ddi_strtoul);
|
||||||
|
|
||||||
static int __init spl_init(void)
|
static int __init spl_init(void)
|
||||||
{
|
{
|
||||||
|
int rc;
|
||||||
|
|
||||||
|
rc = vn_init();
|
||||||
|
if (rc)
|
||||||
|
return rc;
|
||||||
|
|
||||||
strcpy(hw_serial, "007f0100"); /* loopback */
|
strcpy(hw_serial, "007f0100"); /* loopback */
|
||||||
printk(KERN_INFO "spl: Loaded Solaris Porting Layer v%s\n", VERSION);
|
printk(KERN_INFO "spl: Loaded Solaris Porting Layer v%s\n", VERSION);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void spl_fini(void)
|
static void spl_fini(void)
|
||||||
{
|
{
|
||||||
|
vn_fini();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -5,6 +5,8 @@
|
||||||
void *rootdir = NULL;
|
void *rootdir = NULL;
|
||||||
EXPORT_SYMBOL(rootdir);
|
EXPORT_SYMBOL(rootdir);
|
||||||
|
|
||||||
|
kmem_cache_t *vn_cache;
|
||||||
|
|
||||||
static vtype_t
|
static vtype_t
|
||||||
vn_get_sol_type(umode_t mode)
|
vn_get_sol_type(umode_t mode)
|
||||||
{
|
{
|
||||||
|
@ -35,8 +37,31 @@ vn_get_sol_type(umode_t mode)
|
||||||
return VNON;
|
return VNON;
|
||||||
} /* vn_get_sol_type() */
|
} /* vn_get_sol_type() */
|
||||||
|
|
||||||
|
vnode_t *
|
||||||
|
vn_alloc(int flag)
|
||||||
|
{
|
||||||
|
vnode_t *vp;
|
||||||
|
|
||||||
|
vp = kmem_cache_alloc(vn_cache, flag);
|
||||||
|
|
||||||
|
if (vp != NULL) {
|
||||||
|
vp->v_fp = NULL;
|
||||||
|
vp->v_type = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (vp);
|
||||||
|
} /* vn_alloc() */
|
||||||
|
EXPORT_SYMBOL(vn_alloc);
|
||||||
|
|
||||||
|
void
|
||||||
|
vn_free(vnode_t *vp)
|
||||||
|
{
|
||||||
|
kmem_cache_free(vn_cache, vp);
|
||||||
|
} /* vn_free() */
|
||||||
|
EXPORT_SYMBOL(vn_free);
|
||||||
|
|
||||||
int
|
int
|
||||||
vn_open(const char *path, int seg, int flags, int mode,
|
vn_open(const char *path, uio_seg_t seg, int flags, int mode,
|
||||||
vnode_t **vpp, int x1, void *x2)
|
vnode_t **vpp, int x1, void *x2)
|
||||||
{
|
{
|
||||||
struct file *fp;
|
struct file *fp;
|
||||||
|
@ -76,7 +101,7 @@ vn_open(const char *path, int seg, int flags, int mode,
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
vp = kmalloc(sizeof(vnode_t), GFP_ATOMIC);
|
vp = vn_alloc(KM_SLEEP);
|
||||||
if (!vp) {
|
if (!vp) {
|
||||||
filp_close(fp, 0);
|
filp_close(fp, 0);
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
@ -91,7 +116,7 @@ vn_open(const char *path, int seg, int flags, int mode,
|
||||||
EXPORT_SYMBOL(vn_open);
|
EXPORT_SYMBOL(vn_open);
|
||||||
|
|
||||||
int
|
int
|
||||||
vn_openat(const char *path, int seg, int flags, int mode,
|
vn_openat(const char *path, uio_seg_t seg, int flags, int mode,
|
||||||
vnode_t **vpp, int x1, void *x2, vnode_t *vp, int fd)
|
vnode_t **vpp, int x1, void *x2, vnode_t *vp, int fd)
|
||||||
{
|
{
|
||||||
char *realpath;
|
char *realpath;
|
||||||
|
@ -114,7 +139,7 @@ EXPORT_SYMBOL(vn_openat);
|
||||||
|
|
||||||
int
|
int
|
||||||
vn_rdwr(uio_rw_t uio, vnode_t *vp, void *addr, ssize_t len, offset_t off,
|
vn_rdwr(uio_rw_t uio, vnode_t *vp, void *addr, ssize_t len, offset_t off,
|
||||||
int seg, int x1, rlim64_t x2, void *x3, ssize_t *residp)
|
uio_seg_t seg, int x1, rlim64_t x2, void *x3, ssize_t *residp)
|
||||||
{
|
{
|
||||||
loff_t offset;
|
loff_t offset;
|
||||||
mm_segment_t saved_fs;
|
mm_segment_t saved_fs;
|
||||||
|
@ -167,7 +192,7 @@ vn_close(vnode_t *vp, int flags, int x1, int x2, void *x3, void *x4)
|
||||||
BUG_ON(!vp->v_fp);
|
BUG_ON(!vp->v_fp);
|
||||||
|
|
||||||
rc = filp_close(vp->v_fp, 0);
|
rc = filp_close(vp->v_fp, 0);
|
||||||
kfree(vp);
|
vn_free(vp);
|
||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
} /* vn_close() */
|
} /* vn_close() */
|
||||||
|
@ -180,7 +205,7 @@ static struct dentry *lookup_hash(struct nameidata *nd)
|
||||||
|
|
||||||
/* Modified do_unlinkat() from linux/fs/namei.c, only uses exported symbols */
|
/* Modified do_unlinkat() from linux/fs/namei.c, only uses exported symbols */
|
||||||
int
|
int
|
||||||
vn_remove(const char *path, int seg, int flags)
|
vn_remove(const char *path, uio_seg_t seg, int flags)
|
||||||
{
|
{
|
||||||
struct dentry *dentry;
|
struct dentry *dentry;
|
||||||
struct nameidata nd;
|
struct nameidata nd;
|
||||||
|
@ -364,3 +389,36 @@ int vn_fsync(vnode_t *vp, int flags, void *x3, void *x4)
|
||||||
return file_fsync(vp->v_fp, vp->v_fp->f_dentry, datasync);
|
return file_fsync(vp->v_fp, vp->v_fp->f_dentry, datasync);
|
||||||
} /* vn_fsync() */
|
} /* vn_fsync() */
|
||||||
EXPORT_SYMBOL(vn_fsync);
|
EXPORT_SYMBOL(vn_fsync);
|
||||||
|
|
||||||
|
static int
|
||||||
|
vn_cache_constructor(void *buf, void *cdrarg, int kmflags)
|
||||||
|
{
|
||||||
|
struct vnode *vp = buf;
|
||||||
|
|
||||||
|
mutex_init(&vp->v_lock, NULL, MUTEX_DEFAULT, NULL);
|
||||||
|
|
||||||
|
return (0);
|
||||||
|
} /* vn_cache_constructor() */
|
||||||
|
|
||||||
|
static void
|
||||||
|
vn_cache_destructor(void *buf, void *cdrarg)
|
||||||
|
{
|
||||||
|
struct vnode *vp = buf;
|
||||||
|
|
||||||
|
mutex_destroy(&vp->v_lock);
|
||||||
|
} /* vn_cache_destructor() */
|
||||||
|
|
||||||
|
int
|
||||||
|
vn_init(void)
|
||||||
|
{
|
||||||
|
vn_cache = kmem_cache_create("vn_cache", sizeof(struct vnode), 64,
|
||||||
|
vn_cache_constructor, vn_cache_destructor,
|
||||||
|
NULL, NULL, NULL, 0);
|
||||||
|
return 0;
|
||||||
|
} /* vn_init() */
|
||||||
|
|
||||||
|
void
|
||||||
|
vn_fini(void)
|
||||||
|
{
|
||||||
|
kmem_cache_destroy(vn_cache);
|
||||||
|
} /* vn_fini() */
|
||||||
|
|
Loading…
Reference in New Issue