/* Scans the superblock list and finds the superblock of the file system mounted on the device given. Returns the superblock with an active reference and s_umount held exclusively or NULL if none was found.  */
struct super_block* get_active_super(struct block_device *bdev)
/* Scans the superblock list and finds the superblock of the file system mounted on the device given. Returns the superblock with an active reference and s_umount held exclusively or NULL if none was found.  */
struct super_block* get_active_super(struct block_device *bdev)
{
	struct super_block *sb;
	if (!bdev)
		return NULL;
	spin_lock(&sb_lock);
	list_for_each_entry(sb, &super_blocks, s_list) {
		if (sb->s_bdev != bdev)
			continue;
		sb->s_count++;
		spin_unlock(&sb_lock);
		down_write(&sb->s_umount);
		if (sb->s_root) {
			spin_lock(&sb_lock);
			if (sb->s_count > S_BIAS) {
				atomic_inc(&sb->s_active);
				sb->s_count--;
				spin_unlock(&sb_lock);
				return sb;
			}
			spin_unlock(&sb_lock);
		}
		up_write(&sb->s_umount);
		put_super(sb);
		yield();
		spin_lock(&sb_lock);
	}
	spin_unlock(&sb_lock);
	return NULL;
}