VFS: Remove dependency of ->umount_begin() call on MNT_FORCE
Trond Myklebust [Fri, 9 Jun 2006 13:34:18 +0000 (09:34 -0400)]
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>

fs/9p/vfs_super.c
fs/cifs/cifsfs.c
fs/fuse/inode.c
fs/namespace.c
fs/nfs/inode.c
include/linux/fs.h

index 61c599b..00c1f6b 100644 (file)
@@ -253,11 +253,12 @@ 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;
 
-       v9fs_session_cancel(v9ses);
+       if (flags & MNT_FORCE)
+               v9fs_session_cancel(v9ses);
 }
 
 static struct super_operations v9fs_super_ops = {
index c262d88..3fdc225 100644 (file)
@@ -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;
 
index 7627022..13ebe57 100644 (file)
@@ -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)
index b22e469..6bb0b85 100644 (file)
@@ -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();
 
        /*
index 9ff039f..fda2b49 100644 (file)
@@ -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);
 }
index eca70cf..1d80ba7 100644 (file)
@@ -1101,7 +1101,7 @@ struct super_operations {
        int (*statfs) (struct super_block *, struct kstatfs *);
        int (*remount_fs) (struct super_block *, int *, char *);
        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_stats)(struct seq_file *, struct vfsmount *);