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

Commit 8b512d9a authored by Trond Myklebust's avatar Trond Myklebust
Browse files

VFS: Remove dependency of ->umount_begin() call on MNT_FORCE



Allow filesystems to decide to perform pre-umount processing whether or not
MNT_FORCE is set.

Signed-off-by: default avatarTrond Myklebust <Trond.Myklebust@netapp.com>
parent 5528f911
Loading
Loading
Loading
Loading
+4 −3
Original line number Diff line number Diff line
@@ -253,10 +253,11 @@ static int v9fs_show_options(struct seq_file *m, struct vfsmount *mnt)
}

static void
v9fs_umount_begin(struct super_block *sb)
v9fs_umount_begin(struct vfsmount *vfsmnt, int flags)
{
	struct v9fs_session_info *v9ses = sb->s_fs_info;
	struct v9fs_session_info *v9ses = vfsmnt->mnt_sb->s_fs_info;

	if (flags & MNT_FORCE)
		v9fs_session_cancel(v9ses);
}

+4 −2
Original line number Diff line number Diff line
@@ -402,12 +402,14 @@ static struct quotactl_ops cifs_quotactl_ops = {
#endif

#ifdef CONFIG_CIFS_EXPERIMENTAL
static void cifs_umount_begin(struct super_block * sblock)
static void cifs_umount_begin(struct vfsmount * vfsmnt, int flags)
{
	struct cifs_sb_info *cifs_sb;
	struct cifsTconInfo * tcon;

	cifs_sb = CIFS_SB(sblock);
	if (!(flags & MNT_FORCE))
		return;
	cifs_sb = CIFS_SB(vfsmnt->mnt_sb);
	if(cifs_sb == NULL)
		return;

+3 −2
Original line number Diff line number Diff line
@@ -195,9 +195,10 @@ struct inode *fuse_iget(struct super_block *sb, unsigned long nodeid,
	return inode;
}

static void fuse_umount_begin(struct super_block *sb)
static void fuse_umount_begin(struct vfsmount *vfsmnt, int flags)
{
	fuse_abort_conn(get_fuse_conn_super(sb));
	if (flags & MNT_FORCE)
		fuse_abort_conn(get_fuse_conn_super(vfsmnt->mnt_sb));
}

static void fuse_put_super(struct super_block *sb)
+2 −2
Original line number Diff line number Diff line
@@ -576,8 +576,8 @@ static int do_umount(struct vfsmount *mnt, int flags)
	 */

	lock_kernel();
	if ((flags & MNT_FORCE) && sb->s_op->umount_begin)
		sb->s_op->umount_begin(sb);
	if (sb->s_op->umount_begin)
		sb->s_op->umount_begin(mnt, flags);
	unlock_kernel();

	/*
+9 −5
Original line number Diff line number Diff line
@@ -63,7 +63,7 @@ static struct inode *nfs_alloc_inode(struct super_block *sb);
static void nfs_destroy_inode(struct inode *);
static int nfs_write_inode(struct inode *,int);
static void nfs_clear_inode(struct inode *);
static void nfs_umount_begin(struct super_block *);
static void nfs_umount_begin(struct vfsmount *, int);
static int  nfs_statfs(struct super_block *, struct kstatfs *);
static int  nfs_show_options(struct seq_file *, struct vfsmount *);
static int  nfs_show_stats(struct seq_file *, struct vfsmount *);
@@ -162,15 +162,19 @@ nfs_clear_inode(struct inode *inode)
	BUG_ON(atomic_read(&nfsi->data_updates) != 0);
}

void
nfs_umount_begin(struct super_block *sb)
static void nfs_umount_begin(struct vfsmount *vfsmnt, int flags)
{
	struct rpc_clnt	*rpc = NFS_SB(sb)->client;
	struct nfs_server *server;
	struct rpc_clnt	*rpc;

	if (!(flags & MNT_FORCE))
		return;
	/* -EIO all pending I/O */
	server = NFS_SB(vfsmnt->mnt_sb);
	rpc = server->client;
	if (!IS_ERR(rpc))
		rpc_killall_tasks(rpc);
	rpc = NFS_SB(sb)->client_acl;
	rpc = server->client_acl;
	if (!IS_ERR(rpc))
		rpc_killall_tasks(rpc);
}
Loading