bdev filesystems switched. Changes documented in Locking and porting.
--------------------------- file_system_type ---------------------------
prototypes:
- struct super_block *(*read_super) (struct super_block *, void *, int);
+ struct super_block *(*get_sb) (struct file_system_type *, int, char *, void *);
+ void (*kill_sb) (struct super_block *);
locking rules:
-may block BKL ->s_lock mount_sem
-yes yes yes maybe
+ may block BKL
+get_sb yes yes
+kill_sb yes yes
+
+->get_sb() returns error or a locked superblock (exclusive on ->s_umount).
+->kill_sb() takes a locked superblock, does all shutdown work on it,
+unlocks and drops the reference.
--------------------------- address_space_operations --------------------------
prototypes:
->link() callers hold ->i_sem on the object we are linking to. Some of your
problems might be over...
+
+---
+[mandatory]
+
+new file_system_type method - kill_sb(superblock). If you are converting
+an existing filesystem, set it according to ->fs_flags:
+ FS_REQUIRES_DEV - kill_block_super
+ FS_LITTER - kill_litter_super
+ neither - kill_anon_super
+FS_LITTER is gone - just remove it from fs_flags.
+
+---
+[mandatory]
+
+ FS_SINGLE is gone (actually, that had happened back when ->get_sb()
+went in - and hadn't been documented ;-/). Just remove it from fs_flags
+(and see ->get_sb() entry for other actions).
owner: THIS_MODULE,
name: "adfs",
get_sb: adfs_get_sb,
+ kill_sb: kill_block_super,
fs_flags: FS_REQUIRES_DEV,
};
owner: THIS_MODULE,
name: "affs",
get_sb: affs_get_sb,
+ kill_sb: kill_block_super,
fs_flags: FS_REQUIRES_DEV,
};
owner: THIS_MODULE,
name: "bfs",
get_sb: bfs_get_sb,
+ kill_sb: kill_block_super,
fs_flags: FS_REQUIRES_DEV,
};
owner: THIS_MODULE,
name: "cramfs",
get_sb: cramfs_get_sb,
+ kill_sb: kill_block_super,
fs_flags: FS_REQUIRES_DEV,
};
owner: THIS_MODULE,
name: "efs",
get_sb: efs_get_sb,
+ kill_sb: kill_block_super,
fs_flags: FS_REQUIRES_DEV,
};
owner: THIS_MODULE,
name: "ext2",
get_sb: ext2_get_sb,
+ kill_sb: kill_block_super,
fs_flags: FS_REQUIRES_DEV,
};
owner: THIS_MODULE,
name: "ext3",
get_sb: ext3_get_sb,
+ kill_sb: kill_block_super,
fs_flags: FS_REQUIRES_DEV,
};
owner: THIS_MODULE,
name: "vxfs",
get_sb: vxfs_get_sb,
+ kill_sb: kill_block_super,
fs_flags: FS_REQUIRES_DEV,
};
owner: THIS_MODULE,
name: "hfs",
get_sb: hfs_get_sb,
+ kill_sb: kill_block_super,
fs_flags: FS_REQUIRES_DEV,
};
owner: THIS_MODULE,
name: "hpfs",
get_sb: hpfs_get_sb,
+ kill_sb: kill_block_super,
fs_flags: FS_REQUIRES_DEV,
};
owner: THIS_MODULE,
name: "iso9660",
get_sb: isofs_get_sb,
+ kill_sb: kill_block_super,
fs_flags: FS_REQUIRES_DEV,
};
owner: THIS_MODULE,
name: "jffs",
get_sb: jffs_get_sb,
+ kill_sb: kill_block_super,
fs_flags: FS_REQUIRES_DEV,
};
owner: THIS_MODULE,
name: "jffs2",
get_sb: jffs2_get_sb,
+ kill_sb: kill_block_super,
fs_flags: FS_REQUIRES_DEV,
};
owner: THIS_MODULE,
name: "jfs",
get_sb: jfs_get_sb,
+ kill_sb: kill_block_super,
fs_flags: FS_REQUIRES_DEV,
};
owner: THIS_MODULE,
name: "minix",
get_sb: minix_get_sb,
+ kill_sb: kill_block_super,
fs_flags: FS_REQUIRES_DEV,
};
owner: THIS_MODULE,
name: "msdos",
get_sb: msdos_get_sb,
+ kill_sb: kill_block_super,
fs_flags: FS_REQUIRES_DEV,
};
owner: THIS_MODULE,
name: "ntfs",
get_sb: ntfs_get_sb,
+ kill_sb: kill_block_super,
fs_flags: FS_REQUIRES_DEV,
};
owner: THIS_MODULE,
name: "qnx4",
get_sb: qnx4_get_sb,
+ kill_sb: kill_block_super,
fs_flags: FS_REQUIRES_DEV,
};
owner: THIS_MODULE,
name: "reiserfs",
get_sb: reiserfs_get_sb,
+ kill_sb: kill_block_super,
fs_flags: FS_REQUIRES_DEV,
};
owner: THIS_MODULE,
name: "romfs",
get_sb: romfs_get_sb,
+ kill_sb: kill_block_super,
fs_flags: FS_REQUIRES_DEV,
};
remove_super(sb);
}
-static void shutdown_super(struct super_block *sb)
-{
- struct file_system_type *fs = sb->s_type;
- struct block_device *bdev = sb->s_bdev;
-
- generic_shutdown_super(sb);
- bd_release(bdev);
- blkdev_put(bdev, BDEV_FS);
-}
-
void kill_super(struct super_block *sb)
{
struct file_system_type *fs = sb->s_type;
return;
down_write(&sb->s_umount);
- if (fs->kill_sb)
- fs->kill_sb(sb);
- else
- shutdown_super(sb);
+ fs->kill_sb(sb);
put_filesystem(fs);
}
owner: THIS_MODULE,
name: "sysv",
get_sb: sysv_get_sb,
+ kill_sb: kill_block_super,
fs_flags: FS_REQUIRES_DEV,
};
owner: THIS_MODULE,
name: "v7",
get_sb: v7_get_sb,
+ kill_sb: kill_block_super,
fs_flags: FS_REQUIRES_DEV,
};
owner: THIS_MODULE,
name: "udf",
get_sb: udf_get_sb,
+ kill_sb: kill_block_super,
fs_flags: FS_REQUIRES_DEV,
};
owner: THIS_MODULE,
name: "ufs",
get_sb: ufs_get_sb,
+ kill_sb: kill_block_super,
fs_flags: FS_REQUIRES_DEV,
};
owner: THIS_MODULE,
name: "vfat",
get_sb: vfat_get_sb,
+ kill_sb: kill_block_super,
fs_flags: FS_REQUIRES_DEV,
};