summaryrefslogtreecommitdiffstats
path: root/sys/fs/pseudofs
diff options
context:
space:
mode:
authordes <des@FreeBSD.org>2001-09-25 13:25:30 +0000
committerdes <des@FreeBSD.org>2001-09-25 13:25:30 +0000
commit2462e13fc46de3099c72f5003f4270cbb1200188 (patch)
tree1fb57cc737e49cd15cd9ed9e46194e87d6c420ea /sys/fs/pseudofs
parent38da189563b232d6dfd4566f74cf8a744904098b (diff)
downloadFreeBSD-src-2462e13fc46de3099c72f5003f4270cbb1200188.zip
FreeBSD-src-2462e13fc46de3099c72f5003f4270cbb1200188.tar.gz
Clean up my source tree to avoid getting hit too badly by the next KSE or
whatever mega-commit. This goes some way towards adding support for writeable files (needed by procfs).
Diffstat (limited to 'sys/fs/pseudofs')
-rw-r--r--sys/fs/pseudofs/pseudofs.h15
-rw-r--r--sys/fs/pseudofs/pseudofs_vnops.c58
2 files changed, 67 insertions, 6 deletions
diff --git a/sys/fs/pseudofs/pseudofs.h b/sys/fs/pseudofs/pseudofs.h
index 474f442..a3e92863 100644
--- a/sys/fs/pseudofs/pseudofs.h
+++ b/sys/fs/pseudofs/pseudofs.h
@@ -49,6 +49,15 @@ typedef enum {
} pfs_type_t;
/*
+ * Flags
+ */
+#define PFS_RDONLY 0x0000 /* read-only (default) */
+#define PFS_WRONLY 0x0001 /* write-only */
+#define PFS_RDWR 0x0002 /* read-write */
+#define PFS_RAWRD 0x0004 /* raw reader */
+#define PFS_RAWWR 0x0008 /* raw writer */
+
+/*
* Data structures
*/
struct pfs_info;
@@ -56,7 +65,8 @@ struct pfs_node;
struct pfs_bitmap;
#define PFS_FILL_ARGS \
- struct thread *td, struct proc *p, struct pfs_node *pn, struct sbuf *sb
+ struct thread *td, struct proc *p, struct pfs_node *pn, \
+ struct sbuf *sb, struct uio *uio
#define PFS_FILL_PROTO(name) \
int name(PFS_FILL_ARGS);
typedef int (*pfs_fill_t)(PFS_FILL_ARGS);
@@ -134,7 +144,7 @@ int pfs_uninit (struct pfs_info *pi, struct vfsconf *vfc);
/*
* Now for some initialization magic...
*/
-#define PSEUDOFS(name, root) \
+#define PSEUDOFS(name, root, version) \
\
static struct pfs_info name##_info = { \
#name, \
@@ -174,6 +184,7 @@ static struct vfsops name##_vfsops = { \
vfs_stdextattrctl, \
}; \
VFS_SET(name##_vfsops, name, VFCF_SYNTHETIC); \
+MODULE_VERSION(name, version); \
MODULE_DEPEND(name, pseudofs, 1, 1, 1);
#endif
diff --git a/sys/fs/pseudofs/pseudofs_vnops.c b/sys/fs/pseudofs/pseudofs_vnops.c
index db62cbd..a5fd6c9 100644
--- a/sys/fs/pseudofs/pseudofs_vnops.c
+++ b/sys/fs/pseudofs/pseudofs_vnops.c
@@ -216,12 +216,22 @@ pfs_read(struct vop_read_args *va)
if (vn->v_type != VREG)
return (EINVAL);
+ if (pn->pn_flags & PFS_WRONLY)
+ return (EBADF);
+
if (pvd->pvd_pid != NO_PID) {
if ((proc = pfind(pvd->pvd_pid)) == NULL)
return (EIO);
_PHOLD(proc);
PROC_UNLOCK(proc);
}
+
+ if (pn->pn_flags & PFS_RAWRD) {
+ error = (pn->pn_func)(curproc, proc, pn, NULL, uio);
+ if (proc != NULL)
+ PRELE(proc);
+ return (error);
+ }
sb = sbuf_new(sb, NULL, uio->uio_offset + uio->uio_resid, 0);
if (sb == NULL) {
@@ -230,7 +240,7 @@ pfs_read(struct vop_read_args *va)
return (EIO);
}
- error = (pn->pn_func)(curthread, proc, pn, sb);
+ error = (pn->pn_func)(curthread, proc, pn, sb, uio);
if (proc != NULL)
PRELE(proc);
@@ -392,7 +402,7 @@ pfs_readlink(struct vop_readlink_args *va)
/* sbuf_new() can't fail with a static buffer */
sbuf_new(&sb, buf, sizeof buf, 0);
- error = (pn->pn_func)(curthread, proc, pn, &sb);
+ error = (pn->pn_func)(curthread, proc, pn, &sb, NULL);
if (proc != NULL)
PRELE(proc);
@@ -434,8 +444,48 @@ pfs_setattr(struct vop_setattr_args *va)
}
/*
- * Dummy operations
+ * Read from a file
*/
+static int
+pfs_write(struct vop_read_args *va)
+{
+ struct vnode *vn = va->a_vp;
+ struct pfs_vdata *pvd = (struct pfs_vdata *)vn->v_data;
+ struct pfs_node *pn = pvd->pvd_pn;
+ struct uio *uio = va->a_uio;
+ struct proc *proc = NULL;
+ int error;
+
+ if (vn->v_type != VREG)
+ return (EINVAL);
+
+ if (pn->pn_flags & PFS_RDONLY)
+ return (EBADF);
+
+ if (pvd->pvd_pid != NO_PID) {
+ if ((proc = pfind(pvd->pvd_pid)) == NULL)
+ return (EIO);
+ _PHOLD(proc);
+ PROC_UNLOCK(proc);
+ }
+
+ if (pn->pn_flags & PFS_RAWWR) {
+ error = (pn->pn_func)(curproc, proc, pn, NULL, uio);
+ if (proc != NULL)
+ PRELE(proc);
+ return (error);
+ }
+
+ /*
+ * We currently don't support non-raw writers. It's not very
+ * hard to do, but it probably requires further changes to the
+ * sbuf API.
+ */
+ return (EIO);
+}
+
+/*
+ * Dummy operations */
static int pfs_erofs(void *va) { return (EROFS); }
#if 0
static int pfs_null(void *va) { return (0); }
@@ -464,7 +514,7 @@ static struct vnodeopv_entry_desc pfs_vnodeop_entries[] = {
{ &vop_rmdir_desc, (vop_t *)pfs_erofs },
{ &vop_setattr_desc, (vop_t *)pfs_setattr },
{ &vop_symlink_desc, (vop_t *)pfs_erofs },
- { &vop_write_desc, (vop_t *)pfs_erofs },
+ { &vop_write_desc, (vop_t *)pfs_write },
/* XXX I've probably forgotten a few that need pfs_erofs */
{ NULL, (vop_t *)NULL }
};
OpenPOWER on IntegriCloud