int xfs_check_acl(struct inode *inode, int mask, unsigned int flags) { struct xfs_inode *ip; struct posix_acl *acl; int error = -EAGAIN; ip = XFS_I(inode); trace_xfs_check_acl(ip); /* * If there is no attribute fork no ACL exists on this inode and * we can skip the whole exercise. */ if (!XFS_IFORK_Q(ip)) return -EAGAIN; if (flags & IPERM_FLAG_RCU) { if (!negative_cached_acl(inode, ACL_TYPE_ACCESS)) return -ECHILD; return -EAGAIN; } acl = xfs_get_acl(inode, ACL_TYPE_ACCESS); if (IS_ERR(acl)) return PTR_ERR(acl); if (acl) { error = posix_acl_permission(inode, acl, mask); posix_acl_release(acl); } return error; }
int xfs_check_acl(struct inode *inode, int mask) { struct xfs_inode *ip = XFS_I(inode); struct posix_acl *acl; int error = -EAGAIN; xfs_itrace_entry(ip); /* * If there is no attribute fork no ACL exists on this inode and * we can skip the whole exercise. */ if (!XFS_IFORK_Q(ip)) return -EAGAIN; acl = xfs_get_acl(inode, ACL_TYPE_ACCESS); if (IS_ERR(acl)) return PTR_ERR(acl); if (acl) { error = posix_acl_permission(inode, acl, mask); posix_acl_release(acl); } return error; }
int v9fs_check_acl(struct inode *inode, int mask, unsigned int flags) { struct posix_acl *acl; struct v9fs_session_info *v9ses; if (flags & IPERM_FLAG_RCU) return -ECHILD; v9ses = v9fs_inode2v9ses(inode); if (((v9ses->flags & V9FS_ACCESS_MASK) != V9FS_ACCESS_CLIENT) || ((v9ses->flags & V9FS_ACL_MASK) != V9FS_POSIX_ACL)) { /* * On access = client and acl = on mode get the acl * values from the server */ return 0; } acl = v9fs_get_cached_acl(inode, ACL_TYPE_ACCESS); if (IS_ERR(acl)) return PTR_ERR(acl); if (acl) { int error = posix_acl_permission(inode, acl, mask); posix_acl_release(acl); return error; } return -EAGAIN; }
static int pvfs2_check_acl(struct inode *inode, int mask) { struct posix_acl *acl = NULL; gossip_debug(GOSSIP_ACL_DEBUG, "pvfs2_check_acl: called on inode %llu\n", llu(get_handle_from_ino(inode))); acl = pvfs2_get_acl(inode, ACL_TYPE_ACCESS); if (IS_ERR(acl)) { int error = PTR_ERR(acl); gossip_debug(GOSSIP_ACL_DEBUG, "pvfs2_check_acl: pvfs2_get_acl returned error %d\n", error); return error; } if (acl) { int error = posix_acl_permission(inode, acl, mask); posix_acl_release(acl); gossip_debug(GOSSIP_ACL_DEBUG, "pvfs2_check_acl: posix_acl_permission " " (inode %llu, acl %p, mask %x) returned %d\n", llu(get_handle_from_ino(inode)), acl, mask, error); return error; } gossip_debug(GOSSIP_ACL_DEBUG, "pvfs2_check_acl returning EAGAIN\n"); return -EAGAIN; }
int ocfs2_check_acl(struct inode *inode, int mask) { struct ocfs2_super *osb = OCFS2_SB(inode->i_sb); struct buffer_head *di_bh = NULL; struct posix_acl *acl; int ret = -EAGAIN; if (!(osb->s_mount_opt & OCFS2_MOUNT_POSIX_ACL)) return ret; ret = ocfs2_read_inode_block(inode, &di_bh); if (ret < 0) { mlog_errno(ret); return ret; } acl = ocfs2_get_acl_nolock(inode, ACL_TYPE_ACCESS, di_bh); brelse(di_bh); if (IS_ERR(acl)) { mlog_errno(PTR_ERR(acl)); return PTR_ERR(acl); } if (acl) { ret = posix_acl_permission(inode, acl, mask); posix_acl_release(acl); return ret; } return -EAGAIN; }
int generic_check_acl(struct inode *inode, int mask) { struct posix_acl *acl = get_cached_acl(inode, ACL_TYPE_ACCESS); if (acl) { int error = posix_acl_permission(inode, acl, mask); posix_acl_release(acl); return error; } return -EAGAIN; }
/** * shmem_check_acl - check_acl() callback for generic_permission() */ static int shmem_check_acl(struct inode *inode, int mask) { struct posix_acl *acl = shmem_get_acl(inode, ACL_TYPE_ACCESS); if (acl) { int error = posix_acl_permission(inode, acl, mask); posix_acl_release(acl); return error; } return -EAGAIN; }
int jfs_check_acl(struct inode *inode, int mask) { struct posix_acl *acl = jfs_get_acl(inode, ACL_TYPE_ACCESS); if (IS_ERR(acl)) return PTR_ERR(acl); if (acl) { int error = posix_acl_permission(inode, acl, mask); posix_acl_release(acl); return error; } return -EAGAIN; }
int ocfs2_check_acl(struct inode *inode, int mask) { struct posix_acl *acl = ocfs2_get_acl(inode, ACL_TYPE_ACCESS); if (IS_ERR(acl)) return PTR_ERR(acl); if (acl) { int ret = posix_acl_permission(inode, acl, mask); posix_acl_release(acl); return ret; } return -EAGAIN; }
static int jffs2_check_acl(struct inode *inode, int mask) { struct posix_acl *acl; int rc; acl = jffs2_get_acl(inode, ACL_TYPE_ACCESS); if (IS_ERR(acl)) return PTR_ERR(acl); if (acl) { rc = posix_acl_permission(inode, acl, mask); posix_acl_release(acl); return rc; } return -EAGAIN; }
static int jfs_check_acl(struct inode *inode, int mask) { struct jfs_inode_info *ji = JFS_IP(inode); if (ji->i_acl == JFS_ACL_NOT_CACHED) { struct posix_acl *acl = jfs_get_acl(inode, ACL_TYPE_ACCESS); if (IS_ERR(acl)) return PTR_ERR(acl); posix_acl_release(acl); } if (ji->i_acl) return posix_acl_permission(inode, ji->i_acl, mask); return -EAGAIN; }
int gfs2_check_acl(struct inode *inode, int mask) { struct posix_acl *acl; int error; acl = gfs2_acl_get(GFS2_I(inode), ACL_TYPE_ACCESS); if (IS_ERR(acl)) return PTR_ERR(acl); if (acl) { error = posix_acl_permission(inode, acl, mask); posix_acl_release(acl); return error; } return -EAGAIN; }
static int __zpl_check_acl(struct inode *ip, int mask) { struct posix_acl *acl; int error; acl = zpl_get_acl(ip, ACL_TYPE_ACCESS); if (IS_ERR(acl)) return (PTR_ERR(acl)); if (acl) { error = posix_acl_permission(ip, acl, mask); zpl_posix_acl_release(acl); return (error); } return (-EAGAIN); }
int jffs2_check_acl(struct inode *inode, int mask, unsigned int flags) { struct posix_acl *acl; int rc; if (flags & IPERM_FLAG_RCU) return -ECHILD; acl = jffs2_get_acl(inode, ACL_TYPE_ACCESS); if (IS_ERR(acl)) return PTR_ERR(acl); if (acl) { rc = posix_acl_permission(inode, acl, mask); posix_acl_release(acl); return rc; } return -EAGAIN; }
int generic_check_acl(struct inode *inode, int mask, unsigned int flags) { if (flags & IPERM_FLAG_RCU) { if (!negative_cached_acl(inode, ACL_TYPE_ACCESS)) return -ECHILD; } else { struct posix_acl *acl; acl = get_cached_acl(inode, ACL_TYPE_ACCESS); if (acl) { int error = posix_acl_permission(inode, acl, mask); posix_acl_release(acl); return error; } } return -EAGAIN; }
int ext3_check_acl(struct inode *inode, int mask, unsigned int flags) { struct posix_acl *acl; if (flags & IPERM_FLAG_RCU) { if (!negative_cached_acl(inode, ACL_TYPE_ACCESS)) return -ECHILD; return -EAGAIN; } acl = ext3_get_acl(inode, ACL_TYPE_ACCESS); if (IS_ERR(acl)) return PTR_ERR(acl); if (acl) { int error = posix_acl_permission(inode, acl, mask); posix_acl_release(acl); return error; } return -EAGAIN; }
/* * Inode operation listxattr() * * We totally ignore the generic listxattr here because it would be stupid * not to. Since the xattrs are organized in a directory, we can just * readdir to find them. */ ssize_t reiserfs_listxattr(struct dentry * dentry, char *buffer, size_t size) { struct dentry *dir; int err = 0; loff_t pos = 0; struct listxattr_buf buf = { .dentry = dentry, .buf = buffer, .size = buffer ? size : 0, }; if (!dentry->d_inode) return -EINVAL; if (!dentry->d_sb->s_xattr || get_inode_sd_version(dentry->d_inode) == STAT_DATA_V1) return -EOPNOTSUPP; dir = open_xa_dir(dentry->d_inode, XATTR_REPLACE); if (IS_ERR(dir)) { err = PTR_ERR(dir); if (err == -ENODATA) err = 0; /* Not an error if there aren't any xattrs */ goto out; } mutex_lock_nested(&dir->d_inode->i_mutex, I_MUTEX_XATTR); err = reiserfs_readdir_dentry(dir, &buf, listxattr_filler, &pos); mutex_unlock(&dir->d_inode->i_mutex); if (!err) err = buf.pos; dput(dir); out: return err; } static int reiserfs_check_acl(struct inode *inode, int mask, unsigned int flags) { struct posix_acl *acl; int error = -EAGAIN; /* do regular unix permission checks by default */ if (flags & IPERM_FLAG_RCU) return -ECHILD; acl = reiserfs_get_acl(inode, ACL_TYPE_ACCESS); if (acl) { if (!IS_ERR(acl)) { error = posix_acl_permission(inode, acl, mask); posix_acl_release(acl); } else if (PTR_ERR(acl) != -ENODATA) error = PTR_ERR(acl); } return error; } static int create_privroot(struct dentry *dentry) { int err; struct inode *inode = dentry->d_parent->d_inode; WARN_ON_ONCE(!mutex_is_locked(&inode->i_mutex)); err = xattr_mkdir(inode, dentry, 0700); if (err || !dentry->d_inode) { reiserfs_warning(dentry->d_sb, "jdm-20006", "xattrs/ACLs enabled and couldn't " "find/create .reiserfs_priv. " "Failing mount."); return -EOPNOTSUPP; } dentry->d_inode->i_flags |= S_PRIVATE; reiserfs_info(dentry->d_sb, "Created %s - reserved for xattr " "storage.\n", PRIVROOT_NAME); return 0; }