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

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
...@@ -253,11 +253,12 @@ static int v9fs_show_options(struct seq_file *m, struct vfsmount *mnt) ...@@ -253,11 +253,12 @@ static int v9fs_show_options(struct seq_file *m, struct vfsmount *mnt)
} }
static void 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;
v9fs_session_cancel(v9ses); if (flags & MNT_FORCE)
v9fs_session_cancel(v9ses);
} }
static struct super_operations v9fs_super_ops = { static struct super_operations v9fs_super_ops = {
......
...@@ -402,12 +402,14 @@ static struct quotactl_ops cifs_quotactl_ops = { ...@@ -402,12 +402,14 @@ static struct quotactl_ops cifs_quotactl_ops = {
#endif #endif
#ifdef CONFIG_CIFS_EXPERIMENTAL #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 cifs_sb_info *cifs_sb;
struct cifsTconInfo * tcon; struct cifsTconInfo * tcon;
cifs_sb = CIFS_SB(sblock); if (!(flags & MNT_FORCE))
return;
cifs_sb = CIFS_SB(vfsmnt->mnt_sb);
if(cifs_sb == NULL) if(cifs_sb == NULL)
return; return;
......
...@@ -195,9 +195,10 @@ struct inode *fuse_iget(struct super_block *sb, unsigned long nodeid, ...@@ -195,9 +195,10 @@ struct inode *fuse_iget(struct super_block *sb, unsigned long nodeid,
return inode; 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) static void fuse_put_super(struct super_block *sb)
......
...@@ -576,8 +576,8 @@ static int do_umount(struct vfsmount *mnt, int flags) ...@@ -576,8 +576,8 @@ static int do_umount(struct vfsmount *mnt, int flags)
*/ */
lock_kernel(); lock_kernel();
if ((flags & MNT_FORCE) && sb->s_op->umount_begin) if (sb->s_op->umount_begin)
sb->s_op->umount_begin(sb); sb->s_op->umount_begin(mnt, flags);
unlock_kernel(); unlock_kernel();
/* /*
......
...@@ -63,7 +63,7 @@ static struct inode *nfs_alloc_inode(struct super_block *sb); ...@@ -63,7 +63,7 @@ static struct inode *nfs_alloc_inode(struct super_block *sb);
static void nfs_destroy_inode(struct inode *); static void nfs_destroy_inode(struct inode *);
static int nfs_write_inode(struct inode *,int); static int nfs_write_inode(struct inode *,int);
static void nfs_clear_inode(struct inode *); 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_statfs(struct super_block *, struct kstatfs *);
static int nfs_show_options(struct seq_file *, struct vfsmount *); static int nfs_show_options(struct seq_file *, struct vfsmount *);
static int nfs_show_stats(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) ...@@ -162,15 +162,19 @@ nfs_clear_inode(struct inode *inode)
BUG_ON(atomic_read(&nfsi->data_updates) != 0); BUG_ON(atomic_read(&nfsi->data_updates) != 0);
} }
void static void nfs_umount_begin(struct vfsmount *vfsmnt, int flags)
nfs_umount_begin(struct super_block *sb)
{ {
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 */ /* -EIO all pending I/O */
server = NFS_SB(vfsmnt->mnt_sb);
rpc = server->client;
if (!IS_ERR(rpc)) if (!IS_ERR(rpc))
rpc_killall_tasks(rpc); rpc_killall_tasks(rpc);
rpc = NFS_SB(sb)->client_acl; rpc = server->client_acl;
if (!IS_ERR(rpc)) if (!IS_ERR(rpc))
rpc_killall_tasks(rpc); rpc_killall_tasks(rpc);
} }
......
...@@ -1101,7 +1101,7 @@ struct super_operations { ...@@ -1101,7 +1101,7 @@ struct super_operations {
int (*statfs) (struct super_block *, struct kstatfs *); int (*statfs) (struct super_block *, struct kstatfs *);
int (*remount_fs) (struct super_block *, int *, char *); int (*remount_fs) (struct super_block *, int *, char *);
void (*clear_inode) (struct inode *); void (*clear_inode) (struct inode *);
void (*umount_begin) (struct super_block *); void (*umount_begin) (struct vfsmount *, int);
int (*show_options)(struct seq_file *, struct vfsmount *); int (*show_options)(struct seq_file *, struct vfsmount *);
int (*show_stats)(struct seq_file *, struct vfsmount *); int (*show_stats)(struct seq_file *, struct vfsmount *);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment