summaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
Diffstat (limited to 'sys')
-rw-r--r--sys/include/sys/vnode.h19
-rw-r--r--sys/kern/vfs_subr.c13
2 files changed, 32 insertions, 0 deletions
diff --git a/sys/include/sys/vnode.h b/sys/include/sys/vnode.h
index 1caf2cb..545fa2f 100644
--- a/sys/include/sys/vnode.h
+++ b/sys/include/sys/vnode.h
@@ -30,6 +30,7 @@
#ifndef _SYS_VNODE_H_
#define _SYS_VNODE_H_
+#include <sys/types.h>
#include <sys/sio.h>
#if defined(_KERNEL)
@@ -50,14 +51,31 @@ struct vnode {
#define VCHR 0x03 /* Character device */
#define VBLK 0x04 /* Block device */
+#define VNOVAL -1
+
struct vop_lookup_args {
const char *name; /* Current path component */
struct vnode *dirvp; /* Directory vnode */
struct vnode **vpp; /* Result vnode */
};
+/*
+ * A field in this structure is unavailable
+ * if it has a value of VNOVAL.
+ */
+struct vattr {
+ mode_t mode;
+ size_t size;
+};
+
+struct vop_getattr_args {
+ struct vnode *vp;
+ struct vattr *res;
+};
+
struct vops {
int(*lookup)(struct vop_lookup_args *args);
+ int(*getattr)(struct vop_getattr_args *args);
int(*read)(struct vnode *vp, struct sio_txn *sio);
int(*reclaim)(struct vnode *vp);
};
@@ -69,6 +87,7 @@ int vfs_release_vnode(struct vnode *vp);
int vfs_vop_lookup(struct vnode *vp, struct vop_lookup_args *args);
int vfs_vop_read(struct vnode *vp, struct sio_txn *sio);
+int vfs_vop_getattr(struct vnode *vp, struct vop_getattr_args *args);
#endif /* _KERNEL */
#endif /* !_SYS_VNODE_H_ */
diff --git a/sys/kern/vfs_subr.c b/sys/kern/vfs_subr.c
index e1eefaa..850961e 100644
--- a/sys/kern/vfs_subr.c
+++ b/sys/kern/vfs_subr.c
@@ -115,3 +115,16 @@ vfs_vop_read(struct vnode *vp, struct sio_txn *sio)
return vops->read(vp, sio);
}
+
+int
+vfs_vop_getattr(struct vnode *vp, struct vop_getattr_args *args)
+{
+ const struct vops *vops = vp->vops;
+
+ if (vops == NULL)
+ return -EIO;
+ if (vops->getattr == NULL)
+ return -EIO;
+
+ return vops->getattr(args);
+}