Move NAME_MAX, LINK_MAX, and CHOWN_RESTRICTED out of vop_stdpathconf().

Having all filesystems fall through to default values isn't always correct
and these values can vary for different filesystem implementations.  Most
of these changes just use the existing default values with a few exceptions:
- Don't report CHOWN_RESTRICTED for ZFS since it doesn't do the exact
  permissions check this claims for chown().
- Use NANDFS_NAME_LEN for NAME_MAX for nandfs.
- Don't report a LINK_MAX of 0 on smbfs.  Now fail with EINVAL to
  indicate hard links aren't supported.

Requested by:	bde (though perhaps not this exact implementation)
Reviewed by:	kib (earlier version)
MFC after:	1 month
Sponsored by:	Chelsio Communications
This commit is contained in:
John Baldwin 2017-12-19 19:51:36 +00:00
parent 2dd51e16ca
commit 599afe53a8
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=326993
10 changed files with 61 additions and 15 deletions

View File

@ -5403,11 +5403,20 @@ zfs_freebsd_pathconf(ap)
int error;
error = zfs_pathconf(ap->a_vp, ap->a_name, &val, curthread->td_ucred, NULL);
if (error == 0)
if (error == 0) {
*ap->a_retval = val;
else if (error == EOPNOTSUPP)
error = vop_stdpathconf(ap);
return (error);
return (error);
}
if (error != EOPNOTSUPP)
return (error);
switch (ap->a_name) {
case _PC_NAME_MAX:
*ap->a_retval = NAME_MAX;
return (0);
default:
return (vop_stdpathconf(ap));
}
}
static int

View File

@ -1181,6 +1181,12 @@ devfs_pathconf(struct vop_pathconf_args *ap)
{
switch (ap->a_name) {
case _PC_NAME_MAX:
*ap->a_retval = NAME_MAX;
return (0);
case _PC_LINK_MAX:
*ap->a_retval = LINK_MAX;
return (0);
case _PC_MAX_CANON:
if (ap->a_vp->v_vflag & VV_ISTTY) {
*ap->a_retval = MAX_CANON;
@ -1210,6 +1216,9 @@ devfs_pathconf(struct vop_pathconf_args *ap)
*ap->a_retval = 0;
#endif
return (0);
case _PC_CHOWN_RESTRICTED:
*ap->a_retval = 1;
return (0);
default:
return (vop_stdpathconf(ap));
}

View File

@ -1633,6 +1633,12 @@ ext2_pathconf(struct vop_pathconf_args *ap)
else
*ap->a_retval = ext2_max_nlink(VTOI(ap->a_vp));
break;
case _PC_NAME_MAX:
*ap->a_retval = NAME_MAX;
break;
case _PC_CHOWN_RESTRICTED:
*ap->a_retval = 1;
break;
case _PC_NO_TRUNC:
*ap->a_retval = 1;
break;

View File

@ -1184,6 +1184,12 @@ fuse_vnop_pathconf(struct vop_pathconf_args *ap)
case _PC_FILESIZEBITS:
*ap->a_retval = 64;
return (0);
case _PC_NAME_MAX:
*ap->a_retval = NAME_MAX;
return (0);
case _PC_LINK_MAX:
*ap->a_retval = LINK_MAX;
return (0);
case _PC_SYMLINK_MAX:
*ap->a_retval = MAXPATHLEN;
return (0);

View File

@ -1885,6 +1885,9 @@ msdosfs_pathconf(struct vop_pathconf_args *ap)
case _PC_NAME_MAX:
*ap->a_retval = pmp->pm_flags & MSDOSFSMNT_LONGNAME ? WIN_MAXLEN : 12;
return (0);
case _PC_CHOWN_RESTRICTED:
*ap->a_retval = 1;
return (0);
case _PC_NO_TRUNC:
*ap->a_retval = 0;
return (0);

View File

@ -2238,6 +2238,15 @@ nandfs_pathconf(struct vop_pathconf_args *ap)
error = 0;
switch (ap->a_name) {
case _PC_LINK_MAX:
*ap->a_retval = LINK_MAX;
break;
case _PC_NAME_MAX:
*ap->a_retval = NANDFS_NAME_LEN;
break;
case _PC_CHOWN_RESTRICTED:
*ap->a_retval = 1;
break;
case _PC_NO_TRUNC:
*ap->a_retval = 1;
break;

View File

@ -899,8 +899,6 @@ smbfs_pathconf (ap)
int error = 0;
switch (ap->a_name) {
case _PC_LINK_MAX:
*retval = 0;
case _PC_FILESIZEBITS:
if (vcp->vc_sopt.sv_caps & (SMB_CAP_LARGE_READX |
SMB_CAP_LARGE_WRITEX))

View File

@ -1348,6 +1348,18 @@ tmpfs_pathconf(struct vop_pathconf_args *v)
error = 0;
switch (name) {
case _PC_LINK_MAX:
*retval = LINK_MAX;
break;
case _PC_NAME_MAX:
*retval = NAME_MAX;
break;
case _PC_CHOWN_RESTRICTED:
*retval = 1;
break;
case _PC_NO_TRUNC:
*retval = 1;
break;

View File

@ -479,21 +479,12 @@ vop_stdpathconf(ap)
case _PC_ASYNC_IO:
*ap->a_retval = _POSIX_ASYNCHRONOUS_IO;
return (0);
case _PC_NAME_MAX:
*ap->a_retval = NAME_MAX;
return (0);
case _PC_PATH_MAX:
*ap->a_retval = PATH_MAX;
return (0);
case _PC_LINK_MAX:
*ap->a_retval = LINK_MAX;
return (0);
case _PC_PIPE_BUF:
*ap->a_retval = PIPE_BUF;
return (0);
case _PC_CHOWN_RESTRICTED:
*ap->a_retval = 1;
return (0);
default:
return (EINVAL);
}

View File

@ -2450,6 +2450,9 @@ ufs_pathconf(ap)
case _PC_NAME_MAX:
*ap->a_retval = UFS_MAXNAMLEN;
break;
case _PC_CHOWN_RESTRICTED:
*ap->a_retval = 1;
break;
case _PC_NO_TRUNC:
*ap->a_retval = 1;
break;