summaryrefslogtreecommitdiff
path: root/usr/src/uts/common/fs/vnode.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/uts/common/fs/vnode.c')
-rw-r--r--usr/src/uts/common/fs/vnode.c83
1 files changed, 83 insertions, 0 deletions
diff --git a/usr/src/uts/common/fs/vnode.c b/usr/src/uts/common/fs/vnode.c
index 5b796d6f8a..7129cfead9 100644
--- a/usr/src/uts/common/fs/vnode.c
+++ b/usr/src/uts/common/fs/vnode.c
@@ -150,6 +150,16 @@ int vopstats_enabled = 1;
}
/*
+ * If the filesystem does not support XIDs map credential
+ * If the vfsp is NULL, perhaps we should also map?
+ */
+#define VOPXID_MAP_CR(vp, cr) { \
+ vfs_t *vfsp = (vp)->v_vfsp; \
+ if (vfsp != NULL && (vfsp->vfs_flag & VFS_XID) == 0) \
+ cr = crgetmapped(cr); \
+ }
+
+/*
* Convert stat(2) formats to vnode types and vice versa. (Knows about
* numerical order of S_IFMT and vnode types.)
*/
@@ -670,6 +680,8 @@ vn_rdwr(
if (len < 0)
return (EIO);
+ VOPXID_MAP_CR(vp, cr);
+
iov.iov_base = base;
iov.iov_len = len;
uio.uio_iov = &iov;
@@ -2718,6 +2730,8 @@ fop_open(
atomic_add_32(&((*vpp)->v_wrcnt), 1);
}
+ VOPXID_MAP_CR(vp, cr);
+
ret = (*(*(vpp))->v_op->vop_open)(vpp, mode, cr);
if (ret) {
@@ -2766,6 +2780,8 @@ fop_close(
{
int err;
+ VOPXID_MAP_CR(vp, cr);
+
err = (*(vp)->v_op->vop_close)(vp, flag, count, offset, cr);
VOPSTATS_UPDATE(vp, close);
/*
@@ -2796,6 +2812,8 @@ fop_read(
int err;
ssize_t resid_start = uiop->uio_resid;
+ VOPXID_MAP_CR(vp, cr);
+
err = (*(vp)->v_op->vop_read)(vp, uiop, ioflag, cr, ct);
VOPSTATS_UPDATE_IO(vp, read,
read_bytes, (resid_start - uiop->uio_resid));
@@ -2813,6 +2831,8 @@ fop_write(
int err;
ssize_t resid_start = uiop->uio_resid;
+ VOPXID_MAP_CR(vp, cr);
+
err = (*(vp)->v_op->vop_write)(vp, uiop, ioflag, cr, ct);
VOPSTATS_UPDATE_IO(vp, write,
write_bytes, (resid_start - uiop->uio_resid));
@@ -2830,6 +2850,8 @@ fop_ioctl(
{
int err;
+ VOPXID_MAP_CR(vp, cr);
+
err = (*(vp)->v_op->vop_ioctl)(vp, cmd, arg, flag, cr, rvalp);
VOPSTATS_UPDATE(vp, ioctl);
return (err);
@@ -2844,6 +2866,8 @@ fop_setfl(
{
int err;
+ VOPXID_MAP_CR(vp, cr);
+
err = (*(vp)->v_op->vop_setfl)(vp, oflags, nflags, cr);
VOPSTATS_UPDATE(vp, setfl);
return (err);
@@ -2858,6 +2882,8 @@ fop_getattr(
{
int err;
+ VOPXID_MAP_CR(vp, cr);
+
err = (*(vp)->v_op->vop_getattr)(vp, vap, flags, cr);
VOPSTATS_UPDATE(vp, getattr);
return (err);
@@ -2873,6 +2899,8 @@ fop_setattr(
{
int err;
+ VOPXID_MAP_CR(vp, cr);
+
err = (*(vp)->v_op->vop_setattr)(vp, vap, flags, cr, ct);
VOPSTATS_UPDATE(vp, setattr);
return (err);
@@ -2887,6 +2915,8 @@ fop_access(
{
int err;
+ VOPXID_MAP_CR(vp, cr);
+
err = (*(vp)->v_op->vop_access)(vp, mode, flags, cr);
VOPSTATS_UPDATE(vp, access);
return (err);
@@ -2904,6 +2934,8 @@ fop_lookup(
{
int ret;
+ VOPXID_MAP_CR(dvp, cr);
+
ret = (*(dvp)->v_op->vop_lookup)(dvp, nm, vpp, pnp, flags, rdir, cr);
if (ret == 0 && *vpp) {
VOPSTATS_UPDATE(*vpp, lookup);
@@ -2928,6 +2960,8 @@ fop_create(
{
int ret;
+ VOPXID_MAP_CR(dvp, cr);
+
ret = (*(dvp)->v_op->vop_create)
(dvp, name, vap, excl, mode, vpp, cr, flag);
if (ret == 0 && *vpp) {
@@ -2948,6 +2982,8 @@ fop_remove(
{
int err;
+ VOPXID_MAP_CR(dvp, cr);
+
err = (*(dvp)->v_op->vop_remove)(dvp, nm, cr);
VOPSTATS_UPDATE(dvp, remove);
return (err);
@@ -2962,6 +2998,8 @@ fop_link(
{
int err;
+ VOPXID_MAP_CR(tdvp, cr);
+
err = (*(tdvp)->v_op->vop_link)(tdvp, svp, tnm, cr);
VOPSTATS_UPDATE(tdvp, link);
return (err);
@@ -2977,6 +3015,8 @@ fop_rename(
{
int err;
+ VOPXID_MAP_CR(tdvp, cr);
+
err = (*(sdvp)->v_op->vop_rename)(sdvp, snm, tdvp, tnm, cr);
VOPSTATS_UPDATE(sdvp, rename);
return (err);
@@ -2992,6 +3032,8 @@ fop_mkdir(
{
int ret;
+ VOPXID_MAP_CR(dvp, cr);
+
ret = (*(dvp)->v_op->vop_mkdir)(dvp, dirname, vap, vpp, cr);
if (ret == 0 && *vpp) {
VOPSTATS_UPDATE(*vpp, mkdir);
@@ -3013,6 +3055,8 @@ fop_rmdir(
{
int err;
+ VOPXID_MAP_CR(dvp, cr);
+
err = (*(dvp)->v_op->vop_rmdir)(dvp, nm, cdir, cr);
VOPSTATS_UPDATE(dvp, rmdir);
return (err);
@@ -3028,6 +3072,8 @@ fop_readdir(
int err;
ssize_t resid_start = uiop->uio_resid;
+ VOPXID_MAP_CR(vp, cr);
+
err = (*(vp)->v_op->vop_readdir)(vp, uiop, cr, eofp);
VOPSTATS_UPDATE_IO(vp, readdir,
readdir_bytes, (resid_start - uiop->uio_resid));
@@ -3044,6 +3090,8 @@ fop_symlink(
{
int err;
+ VOPXID_MAP_CR(dvp, cr);
+
err = (*(dvp)->v_op->vop_symlink) (dvp, linkname, vap, target, cr);
VOPSTATS_UPDATE(dvp, symlink);
return (err);
@@ -3057,6 +3105,8 @@ fop_readlink(
{
int err;
+ VOPXID_MAP_CR(vp, cr);
+
err = (*(vp)->v_op->vop_readlink)(vp, uiop, cr);
VOPSTATS_UPDATE(vp, readlink);
return (err);
@@ -3070,6 +3120,8 @@ fop_fsync(
{
int err;
+ VOPXID_MAP_CR(vp, cr);
+
err = (*(vp)->v_op->vop_fsync)(vp, syncflag, cr);
VOPSTATS_UPDATE(vp, fsync);
return (err);
@@ -3082,6 +3134,9 @@ fop_inactive(
{
/* Need to update stats before vop call since we may lose the vnode */
VOPSTATS_UPDATE(vp, inactive);
+
+ VOPXID_MAP_CR(vp, cr);
+
(*(vp)->v_op->vop_inactive)(vp, cr);
}
@@ -3157,6 +3212,8 @@ fop_frlock(
{
int err;
+ VOPXID_MAP_CR(vp, cr);
+
err = (*(vp)->v_op->vop_frlock)
(vp, cmd, bfp, flag, offset, flk_cbp, cr);
VOPSTATS_UPDATE(vp, frlock);
@@ -3175,6 +3232,8 @@ fop_space(
{
int err;
+ VOPXID_MAP_CR(vp, cr);
+
err = (*(vp)->v_op->vop_space)(vp, cmd, bfp, flag, offset, cr, ct);
VOPSTATS_UPDATE(vp, space);
return (err);
@@ -3207,6 +3266,8 @@ fop_getpage(
{
int err;
+ VOPXID_MAP_CR(vp, cr);
+
err = (*(vp)->v_op->vop_getpage)
(vp, off, len, protp, plarr, plsz, seg, addr, rw, cr);
VOPSTATS_UPDATE(vp, getpage);
@@ -3223,6 +3284,8 @@ fop_putpage(
{
int err;
+ VOPXID_MAP_CR(vp, cr);
+
err = (*(vp)->v_op->vop_putpage)(vp, off, len, flags, cr);
VOPSTATS_UPDATE(vp, putpage);
return (err);
@@ -3242,6 +3305,8 @@ fop_map(
{
int err;
+ VOPXID_MAP_CR(vp, cr);
+
err = (*(vp)->v_op->vop_map)
(vp, off, as, addrp, len, prot, maxprot, flags, cr);
VOPSTATS_UPDATE(vp, map);
@@ -3263,6 +3328,8 @@ fop_addmap(
int error;
u_longlong_t delta;
+ VOPXID_MAP_CR(vp, cr);
+
error = (*(vp)->v_op->vop_addmap)
(vp, off, as, addr, len, prot, maxprot, flags, cr);
@@ -3309,6 +3376,9 @@ fop_delmap(
{
int error;
u_longlong_t delta;
+
+ VOPXID_MAP_CR(vp, cr);
+
error = (*(vp)->v_op->vop_delmap)
(vp, off, as, addr, len, prot, maxprot, flags, cr);
@@ -3385,6 +3455,8 @@ fop_pathconf(
{
int err;
+ VOPXID_MAP_CR(vp, cr);
+
err = (*(vp)->v_op->vop_pathconf)(vp, cmd, valp, cr);
VOPSTATS_UPDATE(vp, pathconf);
return (err);
@@ -3401,6 +3473,8 @@ fop_pageio(
{
int err;
+ VOPXID_MAP_CR(vp, cr);
+
err = (*(vp)->v_op->vop_pageio)(vp, pp, io_off, io_len, flags, cr);
VOPSTATS_UPDATE(vp, pageio);
return (err);
@@ -3428,6 +3502,9 @@ fop_dispose(
{
/* Must do stats first since it's possible to lose the vnode */
VOPSTATS_UPDATE(vp, dispose);
+
+ VOPXID_MAP_CR(vp, cr);
+
(*(vp)->v_op->vop_dispose)(vp, pp, flag, dn, cr);
}
@@ -3440,6 +3517,8 @@ fop_setsecattr(
{
int err;
+ VOPXID_MAP_CR(vp, cr);
+
err = (*(vp)->v_op->vop_setsecattr) (vp, vsap, flag, cr);
VOPSTATS_UPDATE(vp, setsecattr);
return (err);
@@ -3454,6 +3533,8 @@ fop_getsecattr(
{
int err;
+ VOPXID_MAP_CR(vp, cr);
+
err = (*(vp)->v_op->vop_getsecattr) (vp, vsap, flag, cr);
VOPSTATS_UPDATE(vp, getsecattr);
return (err);
@@ -3469,6 +3550,8 @@ fop_shrlock(
{
int err;
+ VOPXID_MAP_CR(vp, cr);
+
err = (*(vp)->v_op->vop_shrlock)(vp, cmd, shr, flag, cr);
VOPSTATS_UPDATE(vp, shrlock);
return (err);