rem: int vnode_to_path(struct vnode *v, char *buf, int buflen)
add: vnode_to_path(struct vnode *v, char *buf, int buflen)
context: int vnode_to_path(struct vnode *v, char *buf, int buflen){	int rc;  // return code	if ((v == NULL) || (buf == NULL) || (buflen <= 0))		return EINVAL;		//	// ask the filesystem containing the given vnode to fetch	// its local vnode structure for us (returned in v->priv_vnode).	// this fs vnode contains the leaf name and parent link required	//	rc = v->mount->	     fs->calls->         fs_getvnode(v->mount->cookie, v->vnid, &v->priv_vnode, true);	if (rc < 0)		return rc;		else {		//		// construct the full path, which is:		// {mount_point}/{relative_path}		//		// the mount point has already been stored,		// but the relative path has to be generated on-the-fly		//		generic_vnode *g = (generic_vnode *) v->priv_vnode;		char *mpoint     = v->mount->mount_point;		int   mpointlen  = strlen (mpoint);				char rpath[SYS_MAX_NAME_LEN];  // buffer to hold relative path		int  i = sizeof rpath;         // current insertion point		int  rpathlen = 0;		int  len;		//		// generate relative path:		// start with given leaf vnode and back up to mount point,		// copying leaf names into buffer (right to left) as we go		//		rpath[--i] = '\0';				for (; g; g = g->parent) {			// 			if (g->name[0]) {				len = strlen (g->name);				i -= len;				memcpy (rpath+i, g->name, len);				rpathlen += len;			}			if (g->parent) {				if (g->parent->id == g->id)					// hit mount point					break;								rpath[--i] = '/';				++rpathlen;			}		}				if ((mpointlen + rpathlen) > buflen)			return ENOBUFS;				//		// copy results to output buffer		//		strcpy (buf, mpoint);		if (rpathlen > 0)			strcat (buf, rpath+i);				return B_OK;	}}