mirror of
https://github.com/Mathewnd/Astral.git
synced 2026-11-01 23:18:21 +00:00
fs: return device filesystem is mounted on
This commit is contained in:
+13
-1
@@ -142,6 +142,8 @@ typedef struct {
|
|||||||
vfs_t vfs;
|
vfs_t vfs;
|
||||||
ext2superblock_t superblock;
|
ext2superblock_t superblock;
|
||||||
vnode_t *backing;
|
vnode_t *backing;
|
||||||
|
int backingmajor;
|
||||||
|
int backingminor;
|
||||||
size_t blocksize;
|
size_t blocksize;
|
||||||
size_t bgcount;
|
size_t bgcount;
|
||||||
ext2node_t *root;
|
ext2node_t *root;
|
||||||
@@ -1043,6 +1045,8 @@ static int ext2_getattr(vnode_t *vnode, vattr_t *attr, cred_t *cred) {
|
|||||||
|
|
||||||
attr->rdevmajor = 0;
|
attr->rdevmajor = 0;
|
||||||
attr->rdevminor = 0;
|
attr->rdevminor = 0;
|
||||||
|
attr->devmajor = ((ext2fs_t *)vnode->vfs)->backingmajor;
|
||||||
|
attr->devminor = ((ext2fs_t *)vnode->vfs)->backingminor;
|
||||||
attr->uid = node->inode.uid;
|
attr->uid = node->inode.uid;
|
||||||
attr->gid = node->inode.gid;
|
attr->gid = node->inode.gid;
|
||||||
attr->inode = node->id;
|
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->inodewritelock);
|
||||||
MUTEX_INIT(&fs->descriptorlock);
|
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
|
// read superblock
|
||||||
|
|
||||||
size_t readcount;
|
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)
|
if (err)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
|
|||||||
@@ -17,7 +17,8 @@
|
|||||||
static scache_t *nodecache;
|
static scache_t *nodecache;
|
||||||
static tmpfsnode_t *newnode(vfs_t *vfs, int type);
|
static tmpfsnode_t *newnode(vfs_t *vfs, int type);
|
||||||
static void freenode(tmpfsnode_t *node);
|
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) {
|
static int tmpfs_mount(vfs_t **vfs, vnode_t *mountpoint, vnode_t *backing, void *data) {
|
||||||
tmpfs_t *tmpfs = alloc(sizeof(tmpfs_t));
|
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;
|
*vfs = (vfs_t *)tmpfs;
|
||||||
tmpfs->vfs.ops = &vfsops;
|
tmpfs->vfs.ops = &vfsops;
|
||||||
|
tmpfs->id = __atomic_fetch_add(&currid, 1, __ATOMIC_SEQ_CST);
|
||||||
|
|
||||||
return 0;
|
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;
|
tmpfsnode_t *tmpnode = (tmpfsnode_t *)node;
|
||||||
*attr = tmpnode->attr;
|
*attr = tmpnode->attr;
|
||||||
attr->blocksused = ROUND_UP(attr->size, PAGE_SIZE) / PAGE_SIZE;
|
attr->blocksused = ROUND_UP(attr->size, PAGE_SIZE) / PAGE_SIZE;
|
||||||
|
attr->devmajor = 0;
|
||||||
|
attr->devminor = ((tmpfs_t *)node->vfs)->id;
|
||||||
VOP_UNLOCK(node);
|
VOP_UNLOCK(node);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -310,7 +314,7 @@ static int tmpfs_rename(vnode_t *source, char *oldname, vnode_t *target, char *n
|
|||||||
goto cleanup;
|
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)
|
if (sourcedir == targetdir && strcmp(oldname, newname) == 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
|
|||||||
@@ -9,6 +9,7 @@
|
|||||||
typedef struct tmpfs_t {
|
typedef struct tmpfs_t {
|
||||||
vfs_t vfs;
|
vfs_t vfs;
|
||||||
uintmax_t inodenumber;
|
uintmax_t inodenumber;
|
||||||
|
uintmax_t id;
|
||||||
} tmpfs_t;
|
} tmpfs_t;
|
||||||
|
|
||||||
typedef struct tmpfsnode_t {
|
typedef struct tmpfsnode_t {
|
||||||
|
|||||||
@@ -38,6 +38,8 @@ typedef struct {
|
|||||||
timespec_t ctime;
|
timespec_t ctime;
|
||||||
int rdevmajor;
|
int rdevmajor;
|
||||||
int rdevminor;
|
int rdevminor;
|
||||||
|
int devmajor;
|
||||||
|
int devminor;
|
||||||
size_t blocksused;
|
size_t blocksused;
|
||||||
} vattr_t;
|
} vattr_t;
|
||||||
|
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ static int dostat(vnode_t *vnode, stat_t *stat) {
|
|||||||
if (e)
|
if (e)
|
||||||
return 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->rdev = TODEV(attr.rdevmajor, attr.rdevminor);
|
||||||
stat->ino = attr.inode;
|
stat->ino = attr.inode;
|
||||||
stat->nlink = attr.nlinks;
|
stat->nlink = attr.nlinks;
|
||||||
|
|||||||
Reference in New Issue
Block a user