1392
1393 static const fs_operation_def_t xattr_dir_tops[] = {
1394 { VOPNAME_OPEN, { .vop_open = xattr_dir_open } },
1395 { VOPNAME_CLOSE, { .vop_close = xattr_dir_close } },
1396 { VOPNAME_IOCTL, { .error = fs_inval } },
1397 { VOPNAME_GETATTR, { .vop_getattr = xattr_dir_getattr } },
1398 { VOPNAME_SETATTR, { .vop_setattr = xattr_dir_setattr } },
1399 { VOPNAME_ACCESS, { .vop_access = xattr_dir_access } },
1400 { VOPNAME_READDIR, { .vop_readdir = xattr_dir_readdir } },
1401 { VOPNAME_LOOKUP, { .vop_lookup = gfs_vop_lookup } },
1402 { VOPNAME_CREATE, { .vop_create = xattr_dir_create } },
1403 { VOPNAME_REMOVE, { .vop_remove = xattr_dir_remove } },
1404 { VOPNAME_LINK, { .vop_link = xattr_dir_link } },
1405 { VOPNAME_RENAME, { .vop_rename = xattr_dir_rename } },
1406 { VOPNAME_MKDIR, { .error = fs_inval } },
1407 { VOPNAME_SEEK, { .vop_seek = fs_seek } },
1408 { VOPNAME_INACTIVE, { .vop_inactive = xattr_dir_inactive } },
1409 { VOPNAME_FID, { .vop_fid = xattr_common_fid } },
1410 { VOPNAME_PATHCONF, { .vop_pathconf = xattr_dir_pathconf } },
1411 { VOPNAME_REALVP, { .vop_realvp = xattr_dir_realvp } },
1412 { NULL, NULL }
1413 };
1414
1415 static gfs_opsvec_t xattr_opsvec[] = {
1416 { "xattr dir", xattr_dir_tops, &xattr_dir_ops },
1417 { "system attributes", xattr_file_tops, &xattr_file_ops },
1418 { NULL, NULL, NULL }
1419 };
1420
1421 static int
1422 xattr_lookup_cb(vnode_t *vp, const char *nm, vnode_t **vpp, ino64_t *inop,
1423 cred_t *cr, int flags, int *deflags, pathname_t *rpnp)
1424 {
1425 vnode_t *pvp;
1426 struct pathname pn;
1427 int error;
1428
1429 *vpp = NULL;
1430 *inop = 0;
1431
1432 error = xattr_dir_realdir(vp, &pvp, LOOKUP_XATTR|CREATE_XATTR_DIR,
|
1392
1393 static const fs_operation_def_t xattr_dir_tops[] = {
1394 { VOPNAME_OPEN, { .vop_open = xattr_dir_open } },
1395 { VOPNAME_CLOSE, { .vop_close = xattr_dir_close } },
1396 { VOPNAME_IOCTL, { .error = fs_inval } },
1397 { VOPNAME_GETATTR, { .vop_getattr = xattr_dir_getattr } },
1398 { VOPNAME_SETATTR, { .vop_setattr = xattr_dir_setattr } },
1399 { VOPNAME_ACCESS, { .vop_access = xattr_dir_access } },
1400 { VOPNAME_READDIR, { .vop_readdir = xattr_dir_readdir } },
1401 { VOPNAME_LOOKUP, { .vop_lookup = gfs_vop_lookup } },
1402 { VOPNAME_CREATE, { .vop_create = xattr_dir_create } },
1403 { VOPNAME_REMOVE, { .vop_remove = xattr_dir_remove } },
1404 { VOPNAME_LINK, { .vop_link = xattr_dir_link } },
1405 { VOPNAME_RENAME, { .vop_rename = xattr_dir_rename } },
1406 { VOPNAME_MKDIR, { .error = fs_inval } },
1407 { VOPNAME_SEEK, { .vop_seek = fs_seek } },
1408 { VOPNAME_INACTIVE, { .vop_inactive = xattr_dir_inactive } },
1409 { VOPNAME_FID, { .vop_fid = xattr_common_fid } },
1410 { VOPNAME_PATHCONF, { .vop_pathconf = xattr_dir_pathconf } },
1411 { VOPNAME_REALVP, { .vop_realvp = xattr_dir_realvp } },
1412 { NULL, { NULL } }
1413 };
1414
1415 static gfs_opsvec_t xattr_opsvec[] = {
1416 { "xattr dir", xattr_dir_tops, &xattr_dir_ops },
1417 { "system attributes", xattr_file_tops, &xattr_file_ops },
1418 { NULL, NULL, NULL }
1419 };
1420
1421 static int
1422 xattr_lookup_cb(vnode_t *vp, const char *nm, vnode_t **vpp, ino64_t *inop,
1423 cred_t *cr, int flags, int *deflags, pathname_t *rpnp)
1424 {
1425 vnode_t *pvp;
1426 struct pathname pn;
1427 int error;
1428
1429 *vpp = NULL;
1430 *inop = 0;
1431
1432 error = xattr_dir_realdir(vp, &pvp, LOOKUP_XATTR|CREATE_XATTR_DIR,
|