如何写一个简易的文件系统(4):umount
Jun 13, 2016 am 08:43 AM如何写一个简易的文件系统(4):umount
哈哈,时隔几年,又从磁盘深处找出了原始代码myfs.zip。-----------------------------------------无敌分割线------------------------------
最近准备从新写一个基于block设备的小文件系统来完成这个系列的博客。 这次是基于3.10的kernel来写的。可能跟前3篇稍有差异。
umount就是将文件系统卸载掉。那么卸载文件系统需要做什么事情呢?需要将所有的数据全部更新的设备上(不管是文件数据 ,还是文件系统数据)
以后我会将文件数据称为media data,而将文件系统数据(inode,superblock等等)称为meta data。
前一篇的mount的fill super中看到下面一行代码:
sb->s_op = &dfs_sops;
就是给sb一个super block的操作结构体。当然如果你不给的话,暂时不影响umount操作,但是所有的数据都不会更新设备上去。
const struct super_operations dfs_sops = {
.alloc_inode = dfs_alloc_inode,
.put_super = dfs_put_super,
.sync_fs = dfs_sync_fs,
};
除了mount过程中要用到的alloc_inode之外,这边又添加了两个函数,一个叫put_super,另外一个叫sync_fs.
其中put_super用于更新设备上的super block,而sync_fs用于同步文件系统,也就是将所有的dirty文件全部更新到设备上去。
暂时我们还没有做好创建/更新文件的准备,所以这边只实现了put_super函数。
static void dfs_put_super(struct super_block *sb)
{
struct dfs_sb_info *sbi = DFS_SB(sb);
dfs_trace("%s\n", __func__);
if (sbi->dirty)
return dfs_write_super(sb);
kfree(sbi);
}
static int dfs_sync_fs(struct super_block *sb, int wait)
{
dfs_trace("%s\n", __func__);
dfs_put_super(sb);
/* todo: sync files as well*/
return 0;
}
static void dfs_write_super(struct super_block *sb)
{
struct dfs_sb_info *sbi = DFS_SB(sb);
struct buffer_head *bh;
struct dfs_super_block ds;
dfs_trace("%s\n", __func__);
#defineDFS_SB_BLOCK 0
if (!(bh = sb_bread(sb, DFS_SB_BLOCK)))
return;
/* update super block */
ds.inode_count = sbi->inode_count;
ds.block_size = sbi->block_size;
ds.total_blocks = sbi->total_blocks;
ds.free_blocks = sbi->free_blocks;
ds.used_blocks = sbi->used_blocks;
ds.bad_blocks = sbi->bad_blocks;
ds.inode_size = sbi->inode_size;
ds.magic = sbi->magic;
ds.max_inode_no = sbi->max_inode_no;
memcpy((void*)(bh->b_data), &ds, sizeof(struct dfs_super_block));
mark_buffer_dirty(bh);
sync_dirty_buffer(bh);
return brelse(bh);
}
root:/ # mount -t dfs /dev/block/bootdevice/by-name/oem /oem
mount -t dfs /dev/block/bootdevice/by-name/oem /oem
root/ # mount
rootfs / rootfs ro,seclabel 0 0
tmpfs /dev tmpfs rw,seclabel,nosuid,relatime,mode=755 0 0
devpts /dev/pts devpts rw,seclabel,relatime,mode=600 0 0
proc /proc proc rw,relatime 0 0
sysfs /sys sysfs rw,seclabel,relatime 0 0
selinuxfs /sys/fs/selinux selinuxfs rw,relatime 0 0
debugfs /sys/kernel/debug debugfs rw,seclabel,relatime 0 0
none /acct cgroup rw,relatime,cpuacct 0 0
none /sys/fs/cgroup tmpfs rw,seclabel,relatime,mode=750,gid=1000 0 0
tmpfs /mnt tmpfs rw,seclabel,relatime,mode=755,gid=1000 0 0
none /dev/cpuctl cgroup rw,relatime,cpu 0 0
adb /dev/usb-ffs/adb functionfs rw,relatime 0 0
/dev/block/dm-0 /system ext4 ro,seclabel,relatime,discard,data=ordered 0 0
/dev/block/bootdevice/by-name/cache /cache ext4 rw,seclabel,nosuid,nodev,relatime,data=ordered 0 0
/dev/block/bootdevice/by-name/persist /persist ext4 rw,seclabel,nosuid,nodev,relatime,data=ordered 0 0
/dev/block/bootdevice/by-name/dsp /dsp ext4 rw,seclabel,nosuid,nodev,relatime,data=ordered 0 0
/dev/block/bootdevice/by-name/modem /firmware vfat ro,context=u:object_r:firmware_file:s0,relatime,uid=1000,gid=1000,fmask=0337,dmask=0227,codepage=437,iocharset=iso8859-1,shortname=lower,errors=remount-ro 0 0
tmpfs /storage tmpfs rw,seclabel,relatime,mode=755,gid=1000 0 0
/dev/block/dm-1 /data ext4 rw,seclabel,nosuid,nodev,relatime,discard,noauto_da_alloc,data=ordered 0 0
/dev/fuse /mnt/runtime/default/emulated fuse rw,nosuid,nodev,noexec,noatime,user_id=1023,group_id=1023,default_permissions,allow_other 0 0
/dev/fuse /storage/emulated fuse rw,nosuid,nodev,noexec,noatime,user_id=1023,group_id=1023,default_permissions,allow_other 0 0
/dev/fuse /mnt/runtime/read/emulated fuse rw,nosuid,nodev,noexec,noatime,user_id=1023,group_id=1023,default_permissions,allow_other 0 0
/dev/fuse /mnt/runtime/write/emulated fuse rw,nosuid,nodev,noexec,noatime,user_id=1023,group_id=1023,default_permissions,allow_other 0 0
/dev/block/bootdevice/by-name/oem /oem dfs rw,relatime 0 0
root:/ # umount /oem
umount /oem
尝试cd /oem的时候发现一个问题。
root/ # cd oem
cd oem
/system/bin/sh: cd: /oem: Not a directory
原来内核没有实现lookup功能,添加如下
static struct dentry *dfs_lookup(struct inode *dir, struct dentry *dentry, unsigned int flags)
{
return NULL;//暂时为空,没啥好找的。
}
const struct inode_operations dfs_inode_operations = {
.getattr = dfs_getattr,
.lookup = dfs_lookup,
};

Heißer Artikel

Hot-Tools-Tags

Heißer Artikel

Heiße Artikel -Tags

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen

Neuer Bericht liefert eine vernichtende Einschätzung der angeblichen Kamera-Upgrades für das Samsung Galaxy S25, Galaxy S25 Plus und Galaxy S25 Ultra

Beim Samsung Galaxy S25 Ultra sind erste Renderbilder durchgesickert und Gerüchte über Designänderungen wurden enthüllt

IFA 2024 | Das NXTPAPER 14 von TCL wird in der Leistung nicht mit dem Galaxy Tab S10 Ultra mithalten können, in der Größe aber fast

Das Vivo Y300 Pro bietet einen 6.500-mAh-Akku in einem schlanken 7,69-mm-Gehäuse

Neuer Bericht liefert eine vernichtende Einschätzung der angeblichen Kamera-Upgrades für das Samsung Galaxy S25, Galaxy S25 Plus und Galaxy S25 Ultra

Das Samsung Galaxy S24 FE soll in vier Farben und zwei Speicheroptionen für weniger als erwartet auf den Markt kommen

Das Motorola Razr 50s zeigt sich in einem frühen Leak als mögliches neues preisgünstiges faltbares Gerät

Xiaomi Redmi Note 14 Pro Plus erscheint als erstes Qualcomm Snapdragon 7s Gen 3 Smartphone mit Light Hunter 800 Kamera
