From ef7a732dce4ac63180cdc8e04bc657c459c210c4 Mon Sep 17 00:00:00 2001 From: zhouziyi Date: Sat, 19 Apr 2025 06:14:08 +0000 Subject: [PATCH 1/3] =?UTF-8?q?=E6=96=B0=E5=BB=BA=20ntfs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- fs/ntfs/.keep | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 fs/ntfs/.keep diff --git a/fs/ntfs/.keep b/fs/ntfs/.keep new file mode 100644 index 00000000..e69de29b -- Gitee From e751ef10ea0adfd6a41ea0e7f4018608bc069583 Mon Sep 17 00:00:00 2001 From: zhouziyi Date: Sat, 19 Apr 2025 06:15:46 +0000 Subject: [PATCH 2/3] =?UTF-8?q?=E6=96=87=E4=BB=B6=E7=B3=BB=E7=BB=9F:=20?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0NTFS=E9=A9=B1=E5=8A=A8=E6=94=AF=E6=8C=81=20?= =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E5=86=85=E5=AE=B9=EF=BC=9A=20-=20=E6=96=B0?= =?UTF-8?q?=E5=A2=9ENTFS=E5=86=85=E6=A0=B8=E6=A8=A1=E5=9D=97=E9=A9=B1?= =?UTF-8?q?=E5=8A=A8=20-=20=E9=80=82=E9=85=8DVFS=E6=8C=82=E8=BD=BD?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=20-=20=E6=B7=BB=E5=8A=A0BUILD.gn=E7=BC=96?= =?UTF-8?q?=E8=AF=91=E9=85=8D=E7=BD=AE=20=20Signed-off-by:=20zhouziyi=20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: zhouziyi --- fs/ntfs/BUILD.gn | 4 +++ fs/ntfs/ntfs_inode.c | 36 ++++++++++++++++++++++ fs/ntfs/ntfs_kernel.c | 69 +++++++++++++++++++++++++++++++++++++++++++ fs/ntfs/ntfs_super.c | 24 +++++++++++++++ 4 files changed, 133 insertions(+) create mode 100644 fs/ntfs/BUILD.gn create mode 100644 fs/ntfs/ntfs_inode.c create mode 100644 fs/ntfs/ntfs_kernel.c create mode 100644 fs/ntfs/ntfs_super.c diff --git a/fs/ntfs/BUILD.gn b/fs/ntfs/BUILD.gn new file mode 100644 index 00000000..db4ce443 --- /dev/null +++ b/fs/ntfs/BUILD.gn @@ -0,0 +1,4 @@ +kernel_module("ntfs_driver") { + sources = [ "ntfs_kernel.c", "ntfs_super.c" ] + include_dirs = [ "//third_party/ntfs-3g/include" ] +} diff --git a/fs/ntfs/ntfs_inode.c b/fs/ntfs/ntfs_inode.c new file mode 100644 index 00000000..d5781d57 --- /dev/null +++ b/fs/ntfs/ntfs_inode.c @@ -0,0 +1,36 @@ +#include +#include +#include "ntfs_kernel.h" + +static struct inode *ntfs_alloc_inode(struct super_block *sb) { + struct ntfs_inode_info *ni; + + ni = kmem_cache_alloc(ntfs_inode_cachep, GFP_NOFS); + if (!ni) + return NULL; + + memset(ni, 0, sizeof(*ni)); + return &ni->vfs_inode; +} + +static void ntfs_destroy_inode(struct inode *inode) { + struct ntfs_inode_info *ni = NTFS_I(inode); + kmem_cache_free(ntfs_inode_cachep, ni); +} + +static const struct address_space_operations ntfs_aops = { + .readpage = ntfs_readpage, + .writepage = ntfs_writepage, +}; + +static const struct inode_operations ntfs_file_inode_ops = { + .getattr = ntfs_getattr, + .setattr = ntfs_setattr, +}; + +static const struct file_operations ntfs_file_operations = { + .llseek = generic_file_llseek, + .read_iter = generic_file_read_iter, + .write_iter = generic_file_write_iter, + .mmap = generic_file_mmap, +}; diff --git a/fs/ntfs/ntfs_kernel.c b/fs/ntfs/ntfs_kernel.c new file mode 100644 index 00000000..cf6d442d --- /dev/null +++ b/fs/ntfs/ntfs_kernel.c @@ -0,0 +1,69 @@ +#include +#include +#include "ntfs_kernel.h" + +static int ntfs_fill_super(struct super_block *sb, void *data, int silent) { + struct ntfs_volume *vol; + struct buffer_head *bh; + int flags = SB_RDONLY; + + /* 获取设备路径 */ + const char *dev_name = data; + sb->s_bdev = blkdev_get_by_path(dev_name, FMODE_READ | FMODE_WRITE, NULL); + if (IS_ERR(sb->s_bdev)) { + printk(KERN_ERR "NTFS: Failed to open block device\n"); + return PTR_ERR(sb->s_bdev); + } + + /* 初始化NTFS卷 */ + vol = ntfs_mount(sb->s_bdev->bd_dev, NTFS_DEFAULT_OPTIONS); + if (IS_ERR(vol)) { + printk(KERN_ERR "NTFS: Volume mount failed\n"); + return PTR_ERR(vol); + } + + /* 检查脏标志 */ + if (vol->flags & VOLUME_IS_DIRTY) { + printk(KERN_WARNING "NTFS: Dirty volume detected, force readonly\n"); + flags |= MS_RDONLY; + } + + sb->s_flags = flags; + sb->s_fs_info = vol; + sb->s_op = &ntfs_super_ops; + return 0; +} + +static struct dentry *ntfs_mount(struct file_system_type *fs_type, + int flags, const char *dev_name, void *data) { + return mount_bdev(fs_type, flags, dev_name, data, ntfs_fill_super); +} + +static void ntfs_kill_sb(struct super_block *sb) { + struct ntfs_volume *vol = sb->s_fs_info; + if (vol) { + ntfs_umount(vol, 1); + sb->s_fs_info = NULL; + } + kill_block_super(sb); +} + +/* VFS注册结构体 */ +static struct file_system_type ntfs_fs_type = { + .owner = THIS_MODULE, + .name = "ntfs", + .mount = ntfs_mount, + .kill_sb = ntfs_kill_sb, + .fs_flags = FS_REQUIRES_DEV, +}; + +/* 内核模块初始化 */ +static int __init ntfs_init(void) { + int ret = register_filesystem(&ntfs_fs_type); + if (ret) + printk(KERN_ERR "NTFS registration failed: %d\n", ret); + return ret; +} + +LOS_MODULE_INIT(ntfs_init, LOS_INIT_LEVEL_KMOD_EXTENDED); + diff --git a/fs/ntfs/ntfs_super.c b/fs/ntfs/ntfs_super.c new file mode 100644 index 00000000..5b221b6f --- /dev/null +++ b/fs/ntfs/ntfs_super.c @@ -0,0 +1,24 @@ +#include +#include "ntfs_kernel.h" + +static void ntfs_put_super(struct super_block *sb) { + /* 同步元数据 */ + sync_blockdev(sb->s_bdev); +} + +static int ntfs_statfs(struct dentry *dentry, struct kstatfs *buf) { + struct super_block *sb = dentry->d_sb; + struct ntfs_volume *vol = NTFS_SB(sb)->vol; + + buf->f_type = NTFS_SUPER_MAGIC; + buf->f_bsize = vol->cluster_size; + buf->f_blocks = vol->nr_clusters; + buf->f_bfree = vol->free_clusters; + buf->f_bavail = vol->free_clusters; + return 0; +} + +static struct super_operations ntfs_super_ops = { + .put_super = ntfs_put_super, + .statfs = ntfs_statfs, +}; -- Gitee From 5e90914a214d66f2047c52d763ae175b00df93c1 Mon Sep 17 00:00:00 2001 From: zhouziyi Date: Sat, 19 Apr 2025 06:15:57 +0000 Subject: [PATCH 3/3] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=96=87=E4=BB=B6=20fs/n?= =?UTF-8?q?tfs/.keep?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- fs/ntfs/.keep | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 fs/ntfs/.keep diff --git a/fs/ntfs/.keep b/fs/ntfs/.keep deleted file mode 100644 index e69de29b..00000000 -- Gitee