On Thu, Oct 30, 2008 at 07:41:41PM +0800, Tiger Yang wrote:
> +static int ocfs2_set_acl_handle(handle_t *handle,
> +                             struct inode *inode,
> +                             struct buffer_head *di_bh,
> +                             int type,
> +                             struct posix_acl *acl,
> +                             struct ocfs2_alloc_context *meta_ac,
> +                             struct ocfs2_alloc_context *data_ac)
> +{
> +     int name_index;
> +     void *value = NULL;
> +     size_t size = 0;
> +     int ret;
> +
> +     if (S_ISLNK(inode->i_mode))
> +             return -EOPNOTSUPP;
> +
> +     switch (type) {
> +     case ACL_TYPE_ACCESS:
> +             name_index = OCFS2_XATTR_INDEX_POSIX_ACL_ACCESS;
> +             if (acl) {
> +                     mode_t mode = inode->i_mode;
> +                     ret = posix_acl_equiv_mode(acl, &mode);
> +                     if (ret < 0)
> +                             return ret;
> +                     else {
> +                             inode->i_mode = mode;
> +                             if (ret == 0)
> +                                     acl = NULL;
> +                     }
> +             }
> +             break;
> +     case ACL_TYPE_DEFAULT:
> +             name_index = OCFS2_XATTR_INDEX_POSIX_ACL_DEFAULT;
> +             if (!S_ISDIR(inode->i_mode))
> +                     return acl ? -EACCES : 0;
> +             break;
> +     default:
> +             return -EINVAL;
> +     }
> +
> +     if (acl) {
> +             value = ocfs2_acl_to_xattr(acl, &size);
> +             if (IS_ERR(value))
> +                     return (int)PTR_ERR(value);
> +     }
> +
> +     ret = ocfs2_xattr_set_handle(handle, inode, di_bh, name_index,
> +                                  "", value, size, 0, meta_ac, data_ac);
> +
> +     kfree(value);
> +
> +     return ret;
> +}
> +
> +/*
> + * Set the access or default ACL of an inode.
> + */
> +static int ocfs2_set_acl(struct inode *inode, int type, struct posix_acl 
> *acl)
> +{
> +     int name_index;
> +     void *value = NULL;
> +     size_t size = 0;
> +     int ret;
> +
> +     if (S_ISLNK(inode->i_mode))
> +             return -EOPNOTSUPP;
> +
> +     switch (type) {
> +     case ACL_TYPE_ACCESS:
> +             name_index = OCFS2_XATTR_INDEX_POSIX_ACL_ACCESS;
> +             if (acl) {
> +                     mode_t mode = inode->i_mode;
> +                     ret = posix_acl_equiv_mode(acl, &mode);
> +                     if (ret < 0)
> +                             return ret;
> +                     else {
> +                             inode->i_mode = mode;
> +                             if (ret == 0)
> +                                     acl = NULL;
> +                     }
> +             }
> +             break;
> +     case ACL_TYPE_DEFAULT:
> +             name_index = OCFS2_XATTR_INDEX_POSIX_ACL_DEFAULT;
> +             if (!S_ISDIR(inode->i_mode))
> +                     return acl ? -EACCES : 0;
> +             break;
> +     default:
> +             return -EINVAL;
> +     }
> +
> +     if (acl) {
> +             value = ocfs2_acl_to_xattr(acl, &size);
> +             if (IS_ERR(value))
> +                     return (int)PTR_ERR(value);
> +     }
> +
> +     ret = ocfs2_xattr_set(inode, name_index, "", value, size, 0);
> +
> +     kfree(value);
> +
> +     return ret;
> +}

Why don't you combine these two into one function which just calls
ocfs2_xattr_set() when handle == NULL and otherwise calls
ocfs2_xattr_set_handle()?

Otherwise, we could take the common part and make it it's own function which
they both call.
        --Mark

--
Mark Fasheh

_______________________________________________
Ocfs2-devel mailing list
[email protected]
http://oss.oracle.com/mailman/listinfo/ocfs2-devel

Reply via email to