/* Scans the superblock list and finds the superblock of the file system mounted on the device given. NULL is returned if no match is found.  */
struct super_block* get_super(struct block_device *bdev)
/* Scans the superblock list and finds the superblock of the file system mounted on the device given. NULL is returned if no match is found.  */
struct super_block* get_super(struct block_device *bdev)
{
	struct super_block *sb;
	if (!bdev)
		return NULL;
	spin_lock(&sb_lock);
rescan:
	list_for_each_entry(sb, &super_blocks, s_list) {
		if (sb->s_bdev == bdev) {
			sb->s_count++;
			spin_unlock(&sb_lock);
			down_read(&sb->s_umount);
			if (sb->s_root)
				return sb;
			up_read(&sb->s_umount);
			spin_lock(&sb_lock);
			if (__put_super_and_need_restart(sb))
				goto rescan;
		}
	}
	spin_unlock(&sb_lock);
	return NULL;
}