]> git.neil.brown.name Git - history.git/commitdiff
[PATCH] (1/4) ->kill_sb() switchover
authorAlexander Viro <viro@math.psu.edu>
Mon, 11 Mar 2002 06:21:55 +0000 (22:21 -0800)
committerLinus Torvalds <torvalds@penguin.transmeta.com>
Mon, 11 Mar 2002 06:21:55 +0000 (22:21 -0800)
New method - ->kill_sb().  It will eventually replace current
fs/super.c::shutdown_super() - i.e. it's called when fs driver
must shut the superblock down, remove it from all lists, etc.

fs/super.c
include/linux/fs.h
kernel/ksyms.c

index 50397687ca7e39ab4d874719f9b20414c3f4c0fa..e70ad866d42d93f9dfcda340e0fb1e4dd9c7e604 100644 (file)
@@ -459,7 +459,10 @@ void kill_super(struct super_block *sb)
                return;
 
        down_write(&sb->s_umount);
-       shutdown_super(sb);
+       if (fs->kill_sb)
+               fs->kill_sb(sb);
+       else
+               shutdown_super(sb);
        put_filesystem(fs);
 }
 
@@ -682,6 +685,22 @@ retry:
        insert_super(s, type);
        return s;
 }
+void kill_anon_super(struct super_block *sb)
+{
+       int slot = minor(sb->s_dev);
+       generic_shutdown_super(sb);
+       spin_lock(&unnamed_dev_lock);
+       clear_bit(slot, unnamed_dev_in_use);
+       spin_unlock(&unnamed_dev_lock);
+}
+
+void kill_litter_super(struct super_block *sb)
+{
+       if (sb->s_root)
+               d_genocide(sb->s_root);
+       kill_anon_super(sb);
+}
 
 struct super_block *get_sb_bdev(struct file_system_type *fs_type,
        int flags, char *dev_name, void * data,
@@ -783,6 +802,14 @@ out:
        return ERR_PTR(error);
 }
 
+void kill_block_super(struct super_block *sb)
+{
+       struct block_device *bdev = sb->s_bdev;
+       generic_shutdown_super(sb);
+       bd_release(bdev);
+       blkdev_put(bdev, BDEV_FS);
+}
+
 struct super_block *get_sb_nodev(struct file_system_type *fs_type,
        int flags, void *data,
        int (*fill_super)(struct super_block *, void *, int))
index 2bd8608d00c46a6501e219d0acc3d1107227f923..a98513fc754f04187c9b36c792241443da16bc0b 100644 (file)
@@ -944,6 +944,7 @@ struct file_system_type {
        const char *name;
        int fs_flags;
        struct super_block *(*get_sb) (struct file_system_type *, int, char *, void *);
+       void (*kill_sb) (struct super_block *);
        struct module *owner;
        struct file_system_type * next;
        struct list_head fs_supers;
@@ -958,6 +959,9 @@ struct super_block *get_sb_single(struct file_system_type *fs_type,
 struct super_block *get_sb_nodev(struct file_system_type *fs_type,
        int flags, void *data,
        int (*fill_super)(struct super_block *, void *, int));
+void kill_block_super(struct super_block *sb);
+void kill_anon_super(struct super_block *sb);
+void kill_litter_super(struct super_block *sb);
 
 /* Alas, no aliases. Too much hassle with bringing module.h everywhere */
 #define fops_get(fops) \
index 7980cc5836a3f38e3474e3628adf40b4ce30f930..fef69bf4e32db3c63198c359945c52c026d3e960 100644 (file)
@@ -286,8 +286,11 @@ EXPORT_SYMBOL(dcache_readdir);
 EXPORT_SYMBOL(fd_install);
 EXPORT_SYMBOL(put_unused_fd);
 EXPORT_SYMBOL(get_sb_bdev);
+EXPORT_SYMBOL(kill_block_super);
 EXPORT_SYMBOL(get_sb_nodev);
 EXPORT_SYMBOL(get_sb_single);
+EXPORT_SYMBOL(kill_anon_super);
+EXPORT_SYMBOL(kill_litter_super);
 
 /* for stackable file systems (lofs, wrapfs, cryptfs, etc.) */
 EXPORT_SYMBOL(default_llseek);