diff --git a/kernel-src/fs/ext2.c b/kernel-src/fs/ext2.c index 77b34b7c..53ebd6eb 100644 --- a/kernel-src/fs/ext2.c +++ b/kernel-src/fs/ext2.c @@ -142,6 +142,8 @@ typedef struct { vfs_t vfs; ext2superblock_t superblock; vnode_t *backing; + int backingmajor; + int backingminor; size_t blocksize; size_t bgcount; ext2node_t *root; @@ -1043,6 +1045,8 @@ static int ext2_getattr(vnode_t *vnode, vattr_t *attr, cred_t *cred) { attr->rdevmajor = 0; attr->rdevminor = 0; + attr->devmajor = ((ext2fs_t *)vnode->vfs)->backingmajor; + attr->devminor = ((ext2fs_t *)vnode->vfs)->backingminor; attr->uid = node->inode.uid; attr->gid = node->inode.gid; attr->inode = node->id; @@ -1748,10 +1752,18 @@ static int ext2_mount(vfs_t **vfs, vnode_t *mountpoint, vnode_t *backing, void * MUTEX_INIT(&fs->inodewritelock); MUTEX_INIT(&fs->descriptorlock); + vattr_t vattr; + int err = VOP_GETATTR(backing, &vattr, NULL); + if (err) + goto cleanup; + + fs->backingmajor = vattr.rdevmajor; + fs->backingminor = vattr.rdevminor; + // read superblock size_t readcount; - int err = vfs_read(backing, &fs->superblock, sizeof(ext2superblock_t), SUPERBLOCK_OFFSET, &readcount, 0); + err = vfs_read(backing, &fs->superblock, sizeof(ext2superblock_t), SUPERBLOCK_OFFSET, &readcount, 0); if (err) goto cleanup; diff --git a/kernel-src/fs/tmpfs.c b/kernel-src/fs/tmpfs.c index c3fd9c52..20428b58 100644 --- a/kernel-src/fs/tmpfs.c +++ b/kernel-src/fs/tmpfs.c @@ -17,7 +17,8 @@ static scache_t *nodecache; static tmpfsnode_t *newnode(vfs_t *vfs, int type); static void freenode(tmpfsnode_t *node); -static vfsops_t vfsops; +static vfsops_t vfsops; +static uintmax_t currid = 1; static int tmpfs_mount(vfs_t **vfs, vnode_t *mountpoint, vnode_t *backing, void *data) { tmpfs_t *tmpfs = alloc(sizeof(tmpfs_t)); @@ -26,6 +27,7 @@ static int tmpfs_mount(vfs_t **vfs, vnode_t *mountpoint, vnode_t *backing, void *vfs = (vfs_t *)tmpfs; tmpfs->vfs.ops = &vfsops; + tmpfs->id = __atomic_fetch_add(&currid, 1, __ATOMIC_SEQ_CST); return 0; } @@ -37,6 +39,8 @@ static int tmpfs_getattr(vnode_t *node, vattr_t *attr, cred_t *cred) { tmpfsnode_t *tmpnode = (tmpfsnode_t *)node; *attr = tmpnode->attr; attr->blocksused = ROUND_UP(attr->size, PAGE_SIZE) / PAGE_SIZE; + attr->devmajor = 0; + attr->devminor = ((tmpfs_t *)node->vfs)->id; VOP_UNLOCK(node); return 0; } @@ -310,7 +314,7 @@ static int tmpfs_rename(vnode_t *source, char *oldname, vnode_t *target, char *n goto cleanup; } - // same link, rename is a no-op TODO still gotta unlink it though + // same link, rename is a no-op if (sourcedir == targetdir && strcmp(oldname, newname) == 0) goto cleanup; diff --git a/kernel-src/include/kernel/tmpfs.h b/kernel-src/include/kernel/tmpfs.h index 6e25ae3b..c055680a 100644 --- a/kernel-src/include/kernel/tmpfs.h +++ b/kernel-src/include/kernel/tmpfs.h @@ -9,6 +9,7 @@ typedef struct tmpfs_t { vfs_t vfs; uintmax_t inodenumber; + uintmax_t id; } tmpfs_t; typedef struct tmpfsnode_t { diff --git a/kernel-src/include/kernel/vfs.h b/kernel-src/include/kernel/vfs.h index db2fa950..96fd9b74 100644 --- a/kernel-src/include/kernel/vfs.h +++ b/kernel-src/include/kernel/vfs.h @@ -38,6 +38,8 @@ typedef struct { timespec_t ctime; int rdevmajor; int rdevminor; + int devmajor; + int devminor; size_t blocksused; } vattr_t; diff --git a/kernel-src/sys/syscalls/stat.c b/kernel-src/sys/syscalls/stat.c index a23d494d..078bb7a4 100644 --- a/kernel-src/sys/syscalls/stat.c +++ b/kernel-src/sys/syscalls/stat.c @@ -12,7 +12,7 @@ static int dostat(vnode_t *vnode, stat_t *stat) { if (e) return e; - stat->dev = 0; // TODO properly return this + stat->dev = TODEV(attr.devmajor, attr.devminor); stat->rdev = TODEV(attr.rdevmajor, attr.rdevminor); stat->ino = attr.inode; stat->nlink = attr.nlinks;