A laundry list of things that need looking at, most of which will
require more work than the average checkpatch cleanup...

Note that some of these entries may not be bugs - they're things
that need to be looked at, and *possibly* fixed.

Clean up the ffsCamelCase function names.

Fix (thing)->flags to not use magic numbers - multiple offenders

Sort out all the s32/u32/u8 nonsense - most of these should be plain int.

exfat_core.c - ffsReadFile - the goto err_out seem to leak a brelse().
same for ffsWriteFile.

All the calls to fs_sync() need to be looked at, particularly in the
context of EXFAT_DELAYED_SYNC. Currently, if that's defined, we only
flush to disk when sync() gets called.  We should be doing at least
metadata flushes at appropriate times.

ffsTruncateFile -  if (old_size <= new_size) {
That doesn't look right. How did it ever work? Are they relying on lazy
block allocation when actual writes happen? If nothing else, it never
does the 'fid->size = new_size' and do the inode update....

ffsSetAttr() is just dangling in the breeze, not wired up at all...

Convert global mutexes to a per-superblock mutex.

Right now, we load exactly one UTF-8 table. Check to see
if that plays nice with different codepage and iocharset values
for simultanous mounts of different devices

exfat_rmdir() checks for -EBUSY but ffsRemoveDir() doesn't return it.
In fact, there's a complete lack of -EBUSY testing anywhere.

There's probably a few missing checks for -EEXIST

check return codes of sync_dirty_buffer()

Why is remove_file doing a num_entries++??

Double check a lot of can't-happen parameter checks (for null pointers for
things that have only one call site and can't pass a null, etc).

All the DEBUG stuff can probably be tossed, including the ioctl(). Either
that, or convert to a proper fault-injection system.

exfat_remount does exactly one thing.  Fix to actually deal with remount
options, particularly handling R/O correctly.  For that matter, allow
R/O mounts in the first place.

Figure out why the VFAT code used multi_sector_(read|write) but the
exfat code doesn't use it. The difference matters on SSDs with wear leveling.

exfat_fat_sync(), exfat_buf_sync(), and sync_alloc_bitmap()
aren't called anyplace....

Create helper function for exfat_set_entry_time() and exfat_set_entry_type()
because it's sort of ugly to be calling the same functionn directly and
other code calling through the fs_func struc ponters...

clean up the remaining vol_type checks, which are of two types:
some are ?: operators with magic numbers, and the rest are places
where we're doing stuff with '.' and '..'.

Patches to:
	Greg Kroah-Hartman <gregkh@linuxfoundation.org>
	Valdis Kletnieks <valdis.kletnieks@vt.edu>
