|
@@ -457,6 +457,40 @@ int autofs4_wait(struct autofs_sb_info *sbi, struct dentry *dentry,
|
|
|
|
|
|
status = wq->status;
|
|
|
|
|
|
+ /*
|
|
|
+ * For direct and offset mounts we need to track the requester's
|
|
|
+ * uid and gid in the dentry info struct. This is so it can be
|
|
|
+ * supplied, on request, by the misc device ioctl interface.
|
|
|
+ * This is needed during daemon resatart when reconnecting
|
|
|
+ * to existing, active, autofs mounts. The uid and gid (and
|
|
|
+ * related string values) may be used for macro substitution
|
|
|
+ * in autofs mount maps.
|
|
|
+ */
|
|
|
+ if (!status) {
|
|
|
+ struct autofs_info *ino;
|
|
|
+ struct dentry *de = NULL;
|
|
|
+
|
|
|
+ /* direct mount or browsable map */
|
|
|
+ ino = autofs4_dentry_ino(dentry);
|
|
|
+ if (!ino) {
|
|
|
+ /* If not lookup actual dentry used */
|
|
|
+ de = d_lookup(dentry->d_parent, &dentry->d_name);
|
|
|
+ if (de)
|
|
|
+ ino = autofs4_dentry_ino(de);
|
|
|
+ }
|
|
|
+
|
|
|
+ /* Set mount requester */
|
|
|
+ if (ino) {
|
|
|
+ spin_lock(&sbi->fs_lock);
|
|
|
+ ino->uid = wq->uid;
|
|
|
+ ino->gid = wq->gid;
|
|
|
+ spin_unlock(&sbi->fs_lock);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (de)
|
|
|
+ dput(de);
|
|
|
+ }
|
|
|
+
|
|
|
/* Are we the last process to need status? */
|
|
|
mutex_lock(&sbi->wq_mutex);
|
|
|
if (!--wq->wait_ctr)
|