static int jffs2_set_acl(struct inode *inode, int type, struct posix_acl *acl) { struct jffs2_inode_info *f = JFFS2_INODE_INFO(inode); int rc, xprefix; if (S_ISLNK(inode->i_mode)) return -EOPNOTSUPP; switch (type) { case ACL_TYPE_ACCESS: xprefix = JFFS2_XPREFIX_ACL_ACCESS; if (acl) { mode_t mode = inode->i_mode; rc = posix_acl_equiv_mode(acl, &mode); if (rc < 0) return rc; if (inode->i_mode != mode) { struct iattr attr; attr.ia_valid = ATTR_MODE; attr.ia_mode = mode; rc = jffs2_do_setattr(inode, &attr); if (rc < 0) return rc; } if (rc == 0) acl = NULL; } break; case ACL_TYPE_DEFAULT: xprefix = JFFS2_XPREFIX_ACL_DEFAULT; if (!S_ISDIR(inode->i_mode)) return acl ? -EACCES : 0; break; default: return -EINVAL; } rc = __jffs2_set_acl(inode, xprefix, acl); if (!rc) { switch(type) { case ACL_TYPE_ACCESS: jffs2_iset_acl(inode, &f->i_acl_access, acl); break; case ACL_TYPE_DEFAULT: jffs2_iset_acl(inode, &f->i_acl_default, acl); break; } } return rc; }
static int rtems_jffs2_fchmod( const rtems_filesystem_location_info_t *loc, mode_t mode ) { struct _inode *inode = rtems_jffs2_get_inode_by_location(loc); struct iattr iattr; int eno; iattr.ia_valid = ATTR_MODE | ATTR_CTIME; iattr.ia_mode = mode; iattr.ia_ctime = get_seconds(); eno = -jffs2_do_setattr(inode, &iattr); return rtems_jffs2_eno_to_rv_and_errno(eno); }
static int rtems_jffs2_chown( const rtems_filesystem_location_info_t *loc, uid_t owner, gid_t group ) { struct _inode *inode = rtems_jffs2_get_inode_by_location(loc); struct iattr iattr; int eno; iattr.ia_valid = ATTR_UID | ATTR_GID | ATTR_CTIME; iattr.ia_uid = owner; iattr.ia_gid = group; iattr.ia_ctime = get_seconds(); eno = -jffs2_do_setattr(inode, &iattr); return rtems_jffs2_eno_to_rv_and_errno(eno); }
static int rtems_jffs2_file_ftruncate(rtems_libio_t *iop, off_t length) { struct _inode *inode = rtems_jffs2_get_inode_by_iop(iop); struct iattr iattr; int eno; iattr.ia_valid = ATTR_SIZE | ATTR_MTIME | ATTR_CTIME; iattr.ia_size = length; iattr.ia_mtime = get_seconds(); iattr.ia_ctime = iattr.ia_mtime; rtems_jffs2_do_lock(inode->i_sb); eno = -jffs2_do_setattr(inode, &iattr); rtems_jffs2_do_unlock(inode->i_sb); return rtems_jffs2_eno_to_rv_and_errno(eno); }
static int jffs2_set_acl(struct inode *inode, int type, struct posix_acl *acl) { int rc, xprefix; if (S_ISLNK(inode->i_mode)) return -EOPNOTSUPP; switch (type) { case ACL_TYPE_ACCESS: xprefix = JFFS2_XPREFIX_ACL_ACCESS; if (acl) { mode_t mode = inode->i_mode; rc = posix_acl_equiv_mode(acl, &mode); if (rc < 0) return rc; if (inode->i_mode != mode) { struct iattr attr; attr.ia_valid = ATTR_MODE | ATTR_CTIME; attr.ia_mode = mode; attr.ia_ctime = CURRENT_TIME_SEC; rc = jffs2_do_setattr(inode, &attr); if (rc < 0) return rc; } if (rc == 0) acl = NULL; } break; case ACL_TYPE_DEFAULT: xprefix = JFFS2_XPREFIX_ACL_DEFAULT; if (!S_ISDIR(inode->i_mode)) return acl ? -EACCES : 0; break; default: return -EINVAL; } rc = __jffs2_set_acl(inode, xprefix, acl); if (!rc) set_cached_acl(inode, type, acl); return rc; }
void jffs2_dirty_inode(struct inode *inode) { struct iattr iattr; if (!(inode->i_state & I_DIRTY_DATASYNC)) { D2(printk(KERN_DEBUG "jffs2_dirty_inode() not calling setattr() for ino #%lu\n", inode->i_ino)); return; } D1(printk(KERN_DEBUG "jffs2_dirty_inode() calling setattr() for ino #%lu\n", inode->i_ino)); iattr.ia_valid = ATTR_MODE|ATTR_UID|ATTR_GID|ATTR_ATIME|ATTR_MTIME|ATTR_CTIME; iattr.ia_mode = inode->i_mode; iattr.ia_uid = inode->i_uid; iattr.ia_gid = inode->i_gid; iattr.ia_atime = inode->i_atime; iattr.ia_mtime = inode->i_mtime; iattr.ia_ctime = inode->i_ctime; jffs2_do_setattr(inode, &iattr); }
int jffs2_set_acl(struct inode *inode, struct posix_acl *acl, int type) { int rc, xprefix; switch (type) { case ACL_TYPE_ACCESS: xprefix = JFFS2_XPREFIX_ACL_ACCESS; if (acl) { umode_t mode; rc = posix_acl_update_mode(inode, &mode, &acl); if (rc) return rc; if (inode->i_mode != mode) { struct iattr attr; attr.ia_valid = ATTR_MODE | ATTR_CTIME; attr.ia_mode = mode; attr.ia_ctime = current_time(inode); rc = jffs2_do_setattr(inode, &attr); if (rc < 0) return rc; } } break; case ACL_TYPE_DEFAULT: xprefix = JFFS2_XPREFIX_ACL_DEFAULT; if (!S_ISDIR(inode->i_mode)) return acl ? -EACCES : 0; break; default: return -EINVAL; } rc = __jffs2_set_acl(inode, xprefix, acl); if (!rc) set_cached_acl(inode, type, acl); return rc; }
int jffs2_setattr(struct dentry *dentry, struct iattr *iattr) { return jffs2_do_setattr(dentry->d_inode, iattr); }