return;
down_write(&sb->s_umount);
- shutdown_super(sb);
+ if (fs->kill_sb)
+ fs->kill_sb(sb);
+ else
+ shutdown_super(sb);
put_filesystem(fs);
}
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,
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))
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;
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) \
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);