mirror of
https://github.com/Mathewnd/Astral.git
synced 2026-10-30 05:58:22 +00:00
vfs: make setattr take in which attributes to change
This commit is contained in:
+15
-9
@@ -130,21 +130,27 @@ int devfs_getattr(vnode_t *node, vattr_t *attr, cred_t *cred) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
int devfs_setattr(vnode_t *node, vattr_t *attr, cred_t *cred) {
|
||||
int devfs_setattr(vnode_t *node, vattr_t *attr, int which, cred_t *cred) {
|
||||
devnode_t *devnode = (devnode_t *)node;
|
||||
|
||||
if (devnode->physical && devnode->physical != node) {
|
||||
int err = VOP_SETATTR(devnode->physical, attr, cred);
|
||||
int err = VOP_SETATTR(devnode->physical, attr, which, cred);
|
||||
return err;
|
||||
}
|
||||
|
||||
VOP_LOCK(node);
|
||||
devnode->attr.gid = attr->gid;
|
||||
devnode->attr.uid = attr->uid;
|
||||
devnode->attr.mode = attr->mode;
|
||||
devnode->attr.atime = attr->atime;
|
||||
devnode->attr.mtime = attr->mtime;
|
||||
devnode->attr.ctime = attr->ctime;
|
||||
if (which & V_ATTR_GID)
|
||||
devnode->attr.gid = attr->gid;
|
||||
if (which & V_ATTR_UID)
|
||||
devnode->attr.uid = attr->uid;
|
||||
if (which & V_ATTR_MODE)
|
||||
devnode->attr.mode = attr->mode;
|
||||
if (which & V_ATTR_ATIME)
|
||||
devnode->attr.atime = attr->atime;
|
||||
if (which & V_ATTR_MTIME)
|
||||
devnode->attr.mtime = attr->mtime;
|
||||
if (which & V_ATTR_CTIME)
|
||||
devnode->attr.ctime = attr->ctime;
|
||||
VOP_UNLOCK(node);
|
||||
return 0;
|
||||
}
|
||||
@@ -254,7 +260,7 @@ int devfs_create(vnode_t *parent, char *name, vattr_t *attr, int type, vnode_t *
|
||||
tmpattr.ctime = time;
|
||||
tmpattr.mtime = time;
|
||||
tmpattr.size = 0;
|
||||
__assert(devfs_setattr(&node->vnode, &tmpattr, cred) == 0);
|
||||
__assert(devfs_setattr(&node->vnode, &tmpattr, V_ATTR_ALL, cred) == 0);
|
||||
node->attr.nlinks = 1;
|
||||
node->attr.rdevmajor = tmpattr.rdevmajor;
|
||||
node->attr.rdevminor = tmpattr.rdevminor;
|
||||
|
||||
+15
-7
@@ -1063,14 +1063,22 @@ static int ext2_getattr(vnode_t *vnode, vattr_t *attr, cred_t *cred) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ext2_setattr(vnode_t *vnode, vattr_t *attr, cred_t *cred) {
|
||||
static int ext2_setattr(vnode_t *vnode, vattr_t *attr, int which, cred_t *cred) {
|
||||
ext2node_t *node = (ext2node_t *)vnode;
|
||||
VOP_LOCK(vnode);
|
||||
|
||||
INODE_TYPEPERM_SETPERM(node->inode.typeperm, attr->mode);
|
||||
node->inode.gid = attr->gid;
|
||||
node->inode.uid = attr->uid;
|
||||
|
||||
if (which & V_ATTR_MODE)
|
||||
INODE_TYPEPERM_SETPERM(node->inode.typeperm, attr->mode);
|
||||
if (which & V_ATTR_GID)
|
||||
node->inode.gid = attr->gid;
|
||||
if (which & V_ATTR_UID)
|
||||
node->inode.uid = attr->uid;
|
||||
if (which & V_ATTR_MTIME)
|
||||
node->inode.mtime = attr->mtime.s;
|
||||
if (which & V_ATTR_CTIME)
|
||||
node->inode.ctime = attr->ctime.s;
|
||||
if (which & V_ATTR_ATIME)
|
||||
node->inode.atime = attr->atime.s;
|
||||
int e = writeinode((ext2fs_t *)vnode->vfs, &node->inode, node->id);
|
||||
VOP_UNLOCK(vnode);
|
||||
|
||||
@@ -1283,8 +1291,8 @@ int ext2_write(vnode_t *vnode, void *buffer, size_t size, uintmax_t offset, int
|
||||
if (err)
|
||||
goto cleanup;
|
||||
|
||||
node->inode.mtime = timekeeper_time().s;
|
||||
ASSERT_UNCLEAN(fs, writeinode(fs, &node->inode, node->id) == 0);
|
||||
//node->inode.mtime = timekeeper_time().s;
|
||||
//ASSERT_UNCLEAN(fs, writeinode(fs, &node->inode, node->id) == 0);
|
||||
|
||||
cleanup:
|
||||
VOP_UNLOCK(vnode);
|
||||
|
||||
+13
-7
@@ -211,16 +211,22 @@ int pipefs_getattr(vnode_t *node, vattr_t *attr, cred_t *cred) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
int pipefs_setattr(vnode_t *node, vattr_t *attr, cred_t *cred) {
|
||||
int pipefs_setattr(vnode_t *node, vattr_t *attr, int which, cred_t *cred) {
|
||||
pipenode_t *pipenode = (pipenode_t *)node;
|
||||
|
||||
VOP_LOCK(node);
|
||||
pipenode->attr.gid = attr->gid;
|
||||
pipenode->attr.uid = attr->uid;
|
||||
pipenode->attr.mode = attr->mode;
|
||||
pipenode->attr.atime = attr->atime;
|
||||
pipenode->attr.mtime = attr->mtime;
|
||||
pipenode->attr.ctime = attr->ctime;
|
||||
if (which & V_ATTR_GID)
|
||||
pipenode->attr.gid = attr->gid;
|
||||
if (which & V_ATTR_UID)
|
||||
pipenode->attr.uid = attr->uid;
|
||||
if (which & V_ATTR_MODE)
|
||||
pipenode->attr.mode = attr->mode;
|
||||
if (which & V_ATTR_ATIME)
|
||||
pipenode->attr.atime = attr->atime;
|
||||
if (which & V_ATTR_MTIME)
|
||||
pipenode->attr.mtime = attr->mtime;
|
||||
if (which & V_ATTR_CTIME)
|
||||
pipenode->attr.ctime = attr->ctime;
|
||||
VOP_UNLOCK(node);
|
||||
return 0;
|
||||
}
|
||||
|
||||
+13
-7
@@ -46,16 +46,22 @@ int sockfs_getattr(vnode_t *node, vattr_t *attr, cred_t *cred) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
int sockfs_setattr(vnode_t *node, vattr_t *attr, cred_t *cred) {
|
||||
int sockfs_setattr(vnode_t *node, vattr_t *attr, int which, cred_t *cred) {
|
||||
socketnode_t *socketnode = (socketnode_t *)node;
|
||||
VOP_LOCK(node);
|
||||
|
||||
socketnode->attr.gid = attr->gid;
|
||||
socketnode->attr.uid = attr->uid;
|
||||
socketnode->attr.mode = attr->mode;
|
||||
socketnode->attr.atime = attr->atime;
|
||||
socketnode->attr.mtime = attr->mtime;
|
||||
socketnode->attr.ctime = attr->ctime;
|
||||
if (which & V_ATTR_GID)
|
||||
socketnode->attr.gid = attr->gid;
|
||||
if (which & V_ATTR_UID)
|
||||
socketnode->attr.uid = attr->uid;
|
||||
if (which & V_ATTR_MODE)
|
||||
socketnode->attr.mode = attr->mode;
|
||||
if (which & V_ATTR_ATIME)
|
||||
socketnode->attr.atime = attr->atime;
|
||||
if (which & V_ATTR_MTIME)
|
||||
socketnode->attr.mtime = attr->mtime;
|
||||
if (which & V_ATTR_CTIME)
|
||||
socketnode->attr.ctime = attr->ctime;
|
||||
|
||||
VOP_UNLOCK(node);
|
||||
return 0;
|
||||
|
||||
+15
-8
@@ -41,16 +41,23 @@ static int tmpfs_getattr(vnode_t *node, vattr_t *attr, cred_t *cred) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int tmpfs_setattr(vnode_t *node, vattr_t *attr, cred_t *cred) {
|
||||
static int tmpfs_setattr(vnode_t *node, vattr_t *attr, int which, cred_t *cred) {
|
||||
VOP_LOCK(node);
|
||||
tmpfsnode_t *tmpnode = (tmpfsnode_t *)node;
|
||||
|
||||
tmpnode->attr.gid = attr->gid;
|
||||
tmpnode->attr.uid = attr->uid;
|
||||
tmpnode->attr.mode = attr->mode;
|
||||
tmpnode->attr.atime = attr->atime;
|
||||
tmpnode->attr.mtime = attr->mtime;
|
||||
tmpnode->attr.ctime = attr->ctime;
|
||||
if (which & V_ATTR_GID)
|
||||
tmpnode->attr.gid = attr->gid;
|
||||
if (which & V_ATTR_UID)
|
||||
tmpnode->attr.uid = attr->uid;
|
||||
if (which & V_ATTR_MODE)
|
||||
tmpnode->attr.mode = attr->mode;
|
||||
if (which & V_ATTR_ATIME)
|
||||
tmpnode->attr.atime = attr->atime;
|
||||
if (which & V_ATTR_MTIME)
|
||||
tmpnode->attr.mtime = attr->mtime;
|
||||
if (which & V_ATTR_CTIME)
|
||||
tmpnode->attr.ctime = attr->ctime;
|
||||
|
||||
VOP_UNLOCK(node);
|
||||
return 0;
|
||||
}
|
||||
@@ -105,7 +112,7 @@ static int tmpfs_create(vnode_t *parent, char *name, vattr_t *attr, int type, vn
|
||||
tmpattr.mtime = time;
|
||||
tmpattr.size = 0;
|
||||
tmpattr.type = type;
|
||||
int error = tmpfs_setattr(node, &tmpattr, cred);
|
||||
int error = tmpfs_setattr(node, &tmpattr, V_ATTR_ALL, cred);
|
||||
tmpnode->attr.nlinks = 1;
|
||||
|
||||
if (error) {
|
||||
|
||||
Reference in New Issue
Block a user