[ONE Q&A, Help & Troubleshooting] animefans:
Welp...

Since it's Android, it's running linux, and I can use fsck to fix this error

However, I still have no idea how the filesystem got corrupted in the first place

So I hook up my phone to PC, so I can adb into it...

I then reboot recovery

I then adb shell into the phone

I now use PhilZ to mount /data so I know the device name to data

I switch back to adb shell and run e2fsck

~ # /sbin/e2fsck -f /dev/block/platform/msm_sdcc.1/by-name/userdata
/sbin/e2fsck -f /dev/block/platform/msm_sdcc.1/by-name/userdata
e2fsck 1.41.14 (22-Dec-2010)
Pass 1: Checking inodes, blocks, and sizes
Inodes that were part of a corrupted orphan linked list found. Fix<y>? y
y
yes

Inode 214760 was part of the orphaned inode list. FIXED.
Inode 215662 was part of the orphaned inode list. FIXED.
Inode 263256 was part of the orphaned inode list. FIXED.
Inode 524292 was part of the orphaned inode list. FIXED.
Inode 524293 was part of the orphaned inode list. FIXED.
Inode 524294 was part of the orphaned inode list. FIXED.
Inode 534273 is in use, but has dtime set. Fix<y>? yes
...
Inode 534275 has INDEX_FL flag set but is not a directory.
Clear HTree index<y>? yes

Inode 534275 should not have EOFBLOCKS_FL set (size 2750915995060022687, lblk -1)
Clear<y>? y
y
yes

Inode 534275, i_size is 2750915995060022687, should be 0. Fix<y>? yes

Inode 534275, i_blocks is 1606023128, should be 0. Fix<y>? y
y
yes

Restarting e2fsck from the beginning...
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Inode 534273 (/data/com.nubelacorp.javelin/app_webview/Local Storage/http_download.paranoidandroid.co_0.localstorage-journal) has invalid mode (0176337).
Clear<y>? yes

Inode 534274 (/data/com.nubelacorp.javelin/app_webview/Local Storage/http_android.stackexchange.com_0.localstorage) is an illegal socket.
Clear<y>? y
y
yes

Inode 534275 (/data/com.nubelacorp.javelin/app_webview/Local Storage/http_android.stackexchange.com_0.localstorage-journal) has invalid mode (0131667).
Clear<y>? yes

Inode 534276 (/data/com.nubelacorp.javelin/app_webview/Local Storage/https_support.mozilla.org_0.localstorage) has invalid mode (0113763).
Clear<y>? y
y
yes

Inode 534277 (/data/com.nubelacorp.javelin/app_webview/Local Storage/https_support.mozilla.org_0.localstorage-journal) has invalid mode (0130770).
Clear<y>? yes

Entry 'databases' in /data/com.nubelacorp.javelin (533973) has deleted/unused inode 534278. Clear<y>? y
y
yes

Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Inode 533973 ref count is 4, should be 3. Fix<y>? yes

Inode 534279 (...) has invalid mode (0113741).
Clear<y>? y
y
yes

Unattached inode 534280
Connect to /lost+found<y>? yes

Inode 534280 ref count is 57602, should be 1. Fix<y>? y
y
yes

Unattached inode 534281
Connect to /lost+found<y>? yes

Inode 534281 ref count is 2, should be 1. Fix<y>? y
y
yes
...
Pass 5: Checking group summary information
Block bitmap differences: -2130956 -(2131936--2131942) -(2142616--2142620)
Fix<y>? yes

Free blocks count wrong for group #65 (11321, counted=11334).
Fix<y>? y
y
yes

Free blocks count wrong (12163563, counted=12163576).
Fix<y>? yes

Inode bitmap differences: -534278
Fix<y>? y
y
yes

Free inodes count wrong for group #65 (6036, counted=6037).
Fix<y>? yes

Directories count wrong for group #65 (100, counted=99).
Fix<y>? y
y
yes

Free inodes count wrong (3645496, counted=3645497).
Fix<y>? yes

/dev/block/platform/msm_sdcc.1/by-name/userdata: ***** FILE SYSTEM WAS MODIFIED
*****
/dev/block/platform/msm_sdcc.1/by-name/userdata: 16327/3661824 files (5.1% non-contiguous), 2464055/14627631 blocks
~ #

Now I go back to PhilZ and mount /data again

this time IO error is gone

and I can remove directory without error

/data/data # pwd
pwd
/data/data
/data/data # ls com.nubelacorp.javelin
ls com.nubelacorp.javelin
app_webview
/data/data # busybox ls -al com.nubelacorp.javelin
busybox ls -al com.nubelacorp.javelin
__bionic_open_tzdata: couldn't find any tzdata when looking for localtime!
__bionic_open_tzdata: couldn't find any tzdata when looking for GMT!
__bionic_open_tzdata: couldn't find any tzdata when looking for posixrules!
drwxr-x--x 3 u0_a137 u0_a137 4096 Aug 31 11:08 .
drwxrwx--x 188 system system 8192 Aug 31 11:01 ..
drwxrwx--x 3 u0_a137 u0_a137 4096 Aug 31 11:07 app_webview
/data/data #

/data/data/com.nubelacorp.javelin/app_webview/Local Storage # pwd
pwd
/data/data/com.nubelacorp.javelin/app_webview/Local Storage
/data/data/com.nubelacorp.javelin/app_webview/Local Storage # cd ..
cd ..
/data/data/com.nubelacorp.javelin/app_webview # rmdir 'Local Storage'
rmdir 'Local Storage'
/data/data/com.nubelacorp.javelin/app_webview # cd ..
cd ..
/data/data/com.nubelacorp.javelin # rmdir app_webview
rmdir app_webview
/data/data/com.nubelacorp.javelin # cd ..
cd ..
/data/data # rmdir com.nubelacorp.javelin
rmdir com.nubelacorp.javelin
/data/data #

and now I can nandroid without error!