switch (type) { case ACL_TYPE_ACCESS:
name = XATTR_NAME_POSIX_ACL_ACCESS; break; case ACL_TYPE_DEFAULT:
name = XATTR_NAME_POSIX_ACL_DEFAULT; break; default:
BUG();
}
retry:
size = __ceph_getxattr(inode, name, "", 0); if (size > 0) {
value = kzalloc(size, GFP_NOFS); if (!value) return ERR_PTR(-ENOMEM);
size = __ceph_getxattr(inode, name, value, size);
}
if (size == -ERANGE && retry_cnt < 10) {
retry_cnt++;
kfree(value);
value = NULL; goto retry;
}
if (ceph_snap(inode) != CEPH_NOSNAP) {
ret = -EROFS; goto out;
}
switch (type) { case ACL_TYPE_ACCESS:
name = XATTR_NAME_POSIX_ACL_ACCESS; if (acl) {
ret = posix_acl_update_mode(idmap, inode,
&new_mode, &acl); if (ret) goto out;
} break; case ACL_TYPE_DEFAULT: if (!S_ISDIR(inode->i_mode)) {
ret = acl ? -EINVAL : 0; goto out;
}
name = XATTR_NAME_POSIX_ACL_DEFAULT; break; default:
ret = -EINVAL; goto out;
}
if (acl) {
size = posix_acl_xattr_size(acl->a_count);
value = kmalloc(size, GFP_NOFS); if (!value) {
ret = -ENOMEM; goto out;
}
ret = posix_acl_to_xattr(&init_user_ns, acl, value, size); if (ret < 0) goto out_free;
}
if (new_mode != old_mode) {
newattrs.ia_ctime = current_time(inode);
newattrs.ia_mode = new_mode;
newattrs.ia_valid = ATTR_MODE | ATTR_CTIME;
ret = __ceph_setattr(idmap, inode, &newattrs, NULL); if (ret) goto out_free;
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.