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: Trond Myklebust <Trond.Myklebust@netapp.com>
This commit is contained in:
@@ -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 = {
|
|||||||
#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,
|
|||||||
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)
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
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);
|
|||||||
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)
|
|||||||
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 {
|
|||||||
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 *);
|
||||||
|
Reference in New Issue
Block a user