463 error = EROFS;
464 return (error);
465 }
466
467 if (excl == EXCL)
468 error = EEXIST;
469 else if (vp->v_type == VDIR && (mode & VWRITE))
470 error = EISDIR;
471 else
472 error = VOP_ACCESS(vp, mode, 0, cred, ct);
473
474 if (error) {
475 VN_RELE(vp);
476 } else
477 *vpp = vp;
478
479 return (error);
480 }
481
482 const fs_operation_def_t devvt_vnodeops_tbl[] = {
483 VOPNAME_READDIR, { .vop_readdir = devvt_readdir },
484 VOPNAME_LOOKUP, { .vop_lookup = devvt_lookup },
485 VOPNAME_CREATE, { .vop_create = devvt_create },
486 VOPNAME_REMOVE, { .error = fs_nosys },
487 VOPNAME_MKDIR, { .error = fs_nosys },
488 VOPNAME_RMDIR, { .error = fs_nosys },
489 VOPNAME_SYMLINK, { .error = fs_nosys },
490 VOPNAME_SETSECATTR, { .error = fs_nosys },
491 NULL, NULL
492 };
|
463 error = EROFS;
464 return (error);
465 }
466
467 if (excl == EXCL)
468 error = EEXIST;
469 else if (vp->v_type == VDIR && (mode & VWRITE))
470 error = EISDIR;
471 else
472 error = VOP_ACCESS(vp, mode, 0, cred, ct);
473
474 if (error) {
475 VN_RELE(vp);
476 } else
477 *vpp = vp;
478
479 return (error);
480 }
481
482 const fs_operation_def_t devvt_vnodeops_tbl[] = {
483 { VOPNAME_READDIR, { .vop_readdir = devvt_readdir } },
484 { VOPNAME_LOOKUP, { .vop_lookup = devvt_lookup } },
485 { VOPNAME_CREATE, { .vop_create = devvt_create } },
486 { VOPNAME_REMOVE, { .error = fs_nosys } },
487 { VOPNAME_MKDIR, { .error = fs_nosys } },
488 { VOPNAME_RMDIR, { .error = fs_nosys } },
489 { VOPNAME_SYMLINK, { .error = fs_nosys } },
490 { VOPNAME_SETSECATTR, { .error = fs_nosys } },
491 { NULL, { NULL } }
492 };
|