ubifs: fix sget races
authorAl Viro <viro@zeniv.linux.org.uk>
Sun, 12 Jun 2011 14:24:33 +0000 (10:24 -0400)
committerAl Viro <viro@zeniv.linux.org.uk>
Sun, 12 Jun 2011 21:45:34 +0000 (17:45 -0400)
commitd251ed271d528afb407cc2ede30923e34cb209a5
treeb77e0133453057821ee50956c560013acb467c4c
parentb1c27ab3f93daede979f804afc38b189c2f17c60
ubifs: fix sget races

* allocate ubifs_info in ->mount(), fill it enough for sb_test() and
set ->s_fs_info to it in set() callback passed to sget().
* do *not* free it in ->put_super(); do that in ->kill_sb() after we'd
done kill_anon_super().
* don't free it in ubifs_fill_super() either - deactivate_locked_super()
done by caller when ubifs_fill_super() returns an error will take care
of that sucker.
* get rid of kludge with passing ubi to ubifs_fill_super() in ->s_fs_info;
we only need it in alloc_ubifs_info(), so ubifs_fill_super() will need
only ubifs_info.  Which it will find in ->s_fs_info just fine, no need to
reassign anything...

As the result, sb_test() becomes safe to apply to all superblocks that
can be found by sget() (and a kludge with temporary use of ->s_fs_info
to store a pointer to very different structure goes away).

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
fs/ubifs/super.c