+int
+vn_getpath_ext_with_mntlen(struct vnode *vp, struct vnode *dvp, char *pathbuf, size_t *len, size_t *mntlen, int flags)
+{
+ int bpflags = (flags & VN_GETPATH_FSENTER) ? 0 : BUILDPATH_NO_FS_ENTER;
+ int local_len;
+ int error;
+
+ if (*len > INT_MAX) {
+ return EINVAL;
+ }
+
+ local_len = *len;
+
+ if (flags && (flags != VN_GETPATH_FSENTER)) {
+ if (flags & VN_GETPATH_NO_FIRMLINK) {
+ bpflags |= BUILDPATH_NO_FIRMLINK;;
+ }
+ if (flags & VN_GETPATH_VOLUME_RELATIVE) {
+ bpflags |= (BUILDPATH_VOLUME_RELATIVE | BUILDPATH_NO_FIRMLINK);
+ }
+ if (flags & VN_GETPATH_NO_PROCROOT) {
+ bpflags |= BUILDPATH_NO_PROCROOT;
+ }
+ }
+
+ error = build_path_with_parent(vp, dvp, pathbuf, local_len, &local_len, mntlen, bpflags, vfs_context_current());
+
+ if (local_len >= 0 && local_len <= (int)*len) {
+ *len = (size_t)local_len;
+ }
+
+ return error;
+}
+