Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9763f7a4 authored by Al Viro's avatar Al Viro
Browse files

Merge branch 'work.autofs' into for-linus



Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parents 3c55d6bc 1c4344a5
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -20,7 +20,7 @@ prototypes:
	void (*d_iput)(struct dentry *, struct inode *);
	char *(*d_dname)((struct dentry *dentry, char *buffer, int buflen);
	struct vfsmount *(*d_automount)(struct path *path);
	int (*d_manage)(struct dentry *, bool);
	int (*d_manage)(const struct path *, bool);
	struct dentry *(*d_real)(struct dentry *, const struct inode *,
				 unsigned int);

+1 −1
Original line number Diff line number Diff line
@@ -948,7 +948,7 @@ struct dentry_operations {
	void (*d_iput)(struct dentry *, struct inode *);
	char *(*d_dname)(struct dentry *, char *, int);
	struct vfsmount *(*d_automount)(struct path *);
	int (*d_manage)(struct dentry *, bool);
	int (*d_manage)(const struct path *, bool);
	struct dentry *(*d_real)(struct dentry *, const struct inode *,
				 unsigned int);
};
+3 −2
Original line number Diff line number Diff line
@@ -145,7 +145,7 @@ void autofs4_free_ino(struct autofs_info *);

/* Expiration */
int is_autofs4_dentry(struct dentry *);
int autofs4_expire_wait(struct dentry *dentry, int rcu_walk);
int autofs4_expire_wait(const struct path *path, int rcu_walk);
int autofs4_expire_run(struct super_block *, struct vfsmount *,
		       struct autofs_sb_info *,
		       struct autofs_packet_expire __user *);
@@ -217,7 +217,8 @@ static inline int autofs_prepare_pipe(struct file *pipe)

/* Queue management functions */

int autofs4_wait(struct autofs_sb_info *, struct dentry *, enum autofs_notify);
int autofs4_wait(struct autofs_sb_info *,
		 const struct path *, enum autofs_notify);
int autofs4_wait_release(struct autofs_sb_info *, autofs_wqt_t, int);
void autofs4_catatonic_mode(struct autofs_sb_info *);

+2 −2
Original line number Diff line number Diff line
@@ -468,7 +468,7 @@ static int autofs_dev_ioctl_requester(struct file *fp,
	ino = autofs4_dentry_ino(path.dentry);
	if (ino) {
		err = 0;
		autofs4_expire_wait(path.dentry, 0);
		autofs4_expire_wait(&path, 0);
		spin_lock(&sbi->fs_lock);
		param->requester.uid =
			from_kuid_munged(current_user_ns(), ino->uid);
@@ -575,7 +575,7 @@ static int autofs_dev_ioctl_ismountpoint(struct file *fp,

		devid = new_encode_dev(dev);

		err = have_submounts(path.dentry);
		err = path_has_submounts(&path);

		if (follow_down_one(&path))
			magic = path.dentry->d_sb->s_magic;
+15 −10
Original line number Diff line number Diff line
@@ -310,26 +310,29 @@ struct dentry *autofs4_expire_direct(struct super_block *sb,
	now = jiffies;
	timeout = sbi->exp_timeout;

	if (!autofs4_direct_busy(mnt, root, timeout, do_now)) {
		spin_lock(&sbi->fs_lock);
		ino = autofs4_dentry_ino(root);
		/* No point expiring a pending mount */
	if (ino->flags & AUTOFS_INF_PENDING)
		if (ino->flags & AUTOFS_INF_PENDING) {
			spin_unlock(&sbi->fs_lock);
			goto out;
	if (!autofs4_direct_busy(mnt, root, timeout, do_now)) {
		}
		ino->flags |= AUTOFS_INF_WANT_EXPIRE;
		spin_unlock(&sbi->fs_lock);
		synchronize_rcu();
		spin_lock(&sbi->fs_lock);
		if (!autofs4_direct_busy(mnt, root, timeout, do_now)) {
			spin_lock(&sbi->fs_lock);
			ino->flags |= AUTOFS_INF_EXPIRING;
			init_completion(&ino->expire_complete);
			spin_unlock(&sbi->fs_lock);
			return root;
		}
		spin_lock(&sbi->fs_lock);
		ino->flags &= ~AUTOFS_INF_WANT_EXPIRE;
		spin_unlock(&sbi->fs_lock);
	}
out:
	spin_unlock(&sbi->fs_lock);
	dput(root);

	return NULL;
@@ -495,8 +498,9 @@ struct dentry *autofs4_expire_indirect(struct super_block *sb,
	return expired;
}

int autofs4_expire_wait(struct dentry *dentry, int rcu_walk)
int autofs4_expire_wait(const struct path *path, int rcu_walk)
{
	struct dentry *dentry = path->dentry;
	struct autofs_sb_info *sbi = autofs4_sbi(dentry->d_sb);
	struct autofs_info *ino = autofs4_dentry_ino(dentry);
	int status;
@@ -525,7 +529,7 @@ int autofs4_expire_wait(struct dentry *dentry, int rcu_walk)

		pr_debug("waiting for expire %p name=%pd\n", dentry, dentry);

		status = autofs4_wait(sbi, dentry, NFY_NONE);
		status = autofs4_wait(sbi, path, NFY_NONE);
		wait_for_completion(&ino->expire_complete);

		pr_debug("expire done status=%d\n", status);
@@ -592,11 +596,12 @@ int autofs4_do_expire_multi(struct super_block *sb, struct vfsmount *mnt,

	if (dentry) {
		struct autofs_info *ino = autofs4_dentry_ino(dentry);
		const struct path path = { .mnt = mnt, .dentry = dentry };

		/* This is synchronous because it makes the daemon a
		 * little easier
		 */
		ret = autofs4_wait(sbi, dentry, NFY_EXPIRE);
		ret = autofs4_wait(sbi, &path, NFY_EXPIRE);

		spin_lock(&sbi->fs_lock);
		/* avoid rapid-fire expire attempts if expiry fails */
Loading