svn commit: r189971 - in stable/7/sys: . contrib/pf dev/ath/ath_hal
dev/cxgb fs/udf
John Baldwin
jhb at FreeBSD.org
Wed Mar 18 11:18:40 PDT 2009
Author: jhb
Date: Wed Mar 18 18:18:38 2009
New Revision: 189971
URL: http://svn.freebsd.org/changeset/base/189971
Log:
MFC: Add support for fifos to UDF.
Modified:
stable/7/sys/ (props changed)
stable/7/sys/contrib/pf/ (props changed)
stable/7/sys/dev/ath/ath_hal/ (props changed)
stable/7/sys/dev/cxgb/ (props changed)
stable/7/sys/fs/udf/udf.h
stable/7/sys/fs/udf/udf_vfsops.c
stable/7/sys/fs/udf/udf_vnops.c
Modified: stable/7/sys/fs/udf/udf.h
==============================================================================
--- stable/7/sys/fs/udf/udf.h Wed Mar 18 18:08:31 2009 (r189970)
+++ stable/7/sys/fs/udf/udf.h Wed Mar 18 18:18:38 2009 (r189971)
@@ -137,3 +137,5 @@ int udf_vget(struct mount *, ino_t, int,
extern uma_zone_t udf_zone_trans;
extern uma_zone_t udf_zone_node;
extern uma_zone_t udf_zone_ds;
+
+extern struct vop_vector udf_fifoops;
Modified: stable/7/sys/fs/udf/udf_vfsops.c
==============================================================================
--- stable/7/sys/fs/udf/udf_vfsops.c Wed Mar 18 18:08:31 2009 (r189970)
+++ stable/7/sys/fs/udf/udf_vfsops.c Wed Mar 18 18:18:38 2009 (r189971)
@@ -681,6 +681,7 @@ udf_vget(struct mount *mp, ino_t ino, in
break;
case 9:
vp->v_type = VFIFO;
+ vp->v_op = &udf_fifoops;
break;
case 10:
vp->v_type = VSOCK;
Modified: stable/7/sys/fs/udf/udf_vnops.c
==============================================================================
--- stable/7/sys/fs/udf/udf_vnops.c Wed Mar 18 18:08:31 2009 (r189970)
+++ stable/7/sys/fs/udf/udf_vnops.c Wed Mar 18 18:18:38 2009 (r189971)
@@ -48,6 +48,7 @@
#include <vm/uma.h>
+#include <fs/fifofs/fifo.h>
#include <fs/udf/ecma167-udf.h>
#include <fs/udf/osta.h>
#include <fs/udf/udf.h>
@@ -60,9 +61,11 @@ static vop_getattr_t udf_getattr;
static vop_open_t udf_open;
static vop_ioctl_t udf_ioctl;
static vop_pathconf_t udf_pathconf;
+static vop_print_t udf_print;
static vop_read_t udf_read;
static vop_readdir_t udf_readdir;
static vop_readlink_t udf_readlink;
+static vop_setattr_t udf_setattr;
static vop_strategy_t udf_strategy;
static vop_bmap_t udf_bmap;
static vop_cachedlookup_t udf_lookup;
@@ -84,14 +87,26 @@ static struct vop_vector udf_vnodeops =
.vop_lookup = vfs_cache_lookup,
.vop_open = udf_open,
.vop_pathconf = udf_pathconf,
+ .vop_print = udf_print,
.vop_read = udf_read,
.vop_readdir = udf_readdir,
.vop_readlink = udf_readlink,
.vop_reclaim = udf_reclaim,
+ .vop_setattr = udf_setattr,
.vop_strategy = udf_strategy,
.vop_vptofh = udf_vptofh,
};
+struct vop_vector udf_fifoops = {
+ .vop_default = &fifo_specops,
+ .vop_access = udf_access,
+ .vop_getattr = udf_getattr,
+ .vop_print = udf_print,
+ .vop_reclaim = udf_reclaim,
+ .vop_setattr = udf_setattr,
+ .vop_vptofh = udf_vptofh,
+};
+
MALLOC_DEFINE(M_UDFFID, "udf_fid", "UDF FileId structure");
MALLOC_DEFINE(M_UDFDS, "udf_ds", "UDF Dirstream structure");
@@ -305,6 +320,38 @@ udf_getattr(struct vop_getattr_args *a)
return (0);
}
+static int
+udf_setattr(struct vop_setattr_args *a)
+{
+ struct vnode *vp;
+ struct vattr *vap;
+
+ vp = a->a_vp;
+ vap = a->a_vap;
+ if (vap->va_flags != (u_long)VNOVAL || vap->va_uid != (uid_t)VNOVAL ||
+ vap->va_gid != (gid_t)VNOVAL || vap->va_atime.tv_sec != VNOVAL ||
+ vap->va_mtime.tv_sec != VNOVAL || vap->va_mode != (mode_t)VNOVAL)
+ return (EROFS);
+ if (vap->va_size != (u_quad_t)VNOVAL) {
+ switch (vp->v_type) {
+ case VDIR:
+ return (EISDIR);
+ case VLNK:
+ case VREG:
+ return (EROFS);
+ case VCHR:
+ case VBLK:
+ case VSOCK:
+ case VFIFO:
+ case VNON:
+ case VBAD:
+ case VMARKER:
+ return (0);
+ }
+ }
+ return (0);
+}
+
/*
* File specific ioctls.
*/
@@ -341,6 +388,20 @@ udf_pathconf(struct vop_pathconf_args *a
}
}
+static int
+udf_print(struct vop_print_args *ap)
+{
+ struct vnode *vp = ap->a_vp;
+ struct udf_node *node = VTON(vp);
+
+ printf(" ino %lu, on dev %s", (u_long)node->hash_id,
+ devtoname(node->udfmp->im_dev));
+ if (vp->v_type == VFIFO)
+ fifo_printinfo(vp);
+ printf("\n");
+ return (0);
+}
+
#define lblkno(udfmp, loc) ((loc) >> (udfmp)->bshift)
#define blkoff(udfmp, loc) ((loc) & (udfmp)->bmask)
#define lblktosize(imp, blk) ((blk) << (udfmp)->bshift)
More information about the svn-src-stable
mailing list