|
@@ -33,6 +33,7 @@ int nfs_mountpoint_expiry_timeout = 500 * HZ;
|
|
|
* @dentry - pointer to dentry
|
|
|
* @buffer - result buffer
|
|
|
* @buflen - length of buffer
|
|
|
+ * @flags - options (see below)
|
|
|
*
|
|
|
* Helper function for constructing the server pathname
|
|
|
* by arbitrary hashed dentry.
|
|
@@ -40,8 +41,14 @@ int nfs_mountpoint_expiry_timeout = 500 * HZ;
|
|
|
* This is mainly for use in figuring out the path on the
|
|
|
* server side when automounting on top of an existing partition
|
|
|
* and in generating /proc/mounts and friends.
|
|
|
+ *
|
|
|
+ * Supported flags:
|
|
|
+ * NFS_PATH_CANONICAL: ensure there is exactly one slash after
|
|
|
+ * the original device (export) name
|
|
|
+ * (if unset, the original name is returned verbatim)
|
|
|
*/
|
|
|
-char *nfs_path(char **p, struct dentry *dentry, char *buffer, ssize_t buflen)
|
|
|
+char *nfs_path(char **p, struct dentry *dentry, char *buffer, ssize_t buflen,
|
|
|
+ unsigned flags)
|
|
|
{
|
|
|
char *end;
|
|
|
int namelen;
|
|
@@ -74,7 +81,7 @@ rename_retry:
|
|
|
rcu_read_unlock();
|
|
|
goto rename_retry;
|
|
|
}
|
|
|
- if (*end != '/') {
|
|
|
+ if ((flags & NFS_PATH_CANONICAL) && *end != '/') {
|
|
|
if (--buflen < 0) {
|
|
|
spin_unlock(&dentry->d_lock);
|
|
|
rcu_read_unlock();
|
|
@@ -91,9 +98,11 @@ rename_retry:
|
|
|
return end;
|
|
|
}
|
|
|
namelen = strlen(base);
|
|
|
- /* Strip off excess slashes in base string */
|
|
|
- while (namelen > 0 && base[namelen - 1] == '/')
|
|
|
- namelen--;
|
|
|
+ if (flags & NFS_PATH_CANONICAL) {
|
|
|
+ /* Strip off excess slashes in base string */
|
|
|
+ while (namelen > 0 && base[namelen - 1] == '/')
|
|
|
+ namelen--;
|
|
|
+ }
|
|
|
buflen -= namelen;
|
|
|
if (buflen < 0) {
|
|
|
spin_unlock(&dentry->d_lock);
|