1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * Copyright (C) International Business Machines Corp., 2002-2004
4 * Copyright (C) Andreas Gruenbacher, 2001
5 * Copyright (C) Linus Torvalds, 1991, 1992
8 #include <linux/sched.h>
9 #include <linux/slab.h>
11 #include <linux/posix_acl_xattr.h>
12 #include "jfs_incore.h"
13 #include "jfs_txnmgr.h"
14 #include "jfs_xattr.h"
17 struct posix_acl
*jfs_get_acl(struct inode
*inode
, int type
)
19 struct posix_acl
*acl
;
26 ea_name
= XATTR_NAME_POSIX_ACL_ACCESS
;
28 case ACL_TYPE_DEFAULT
:
29 ea_name
= XATTR_NAME_POSIX_ACL_DEFAULT
;
32 return ERR_PTR(-EINVAL
);
35 size
= __jfs_getxattr(inode
, ea_name
, NULL
, 0);
38 value
= kmalloc(size
, GFP_KERNEL
);
40 return ERR_PTR(-ENOMEM
);
41 size
= __jfs_getxattr(inode
, ea_name
, value
, size
);
50 acl
= posix_acl_from_xattr(&init_user_ns
, value
, size
);
56 static int __jfs_set_acl(tid_t tid
, struct inode
*inode
, int type
,
57 struct posix_acl
*acl
)
66 ea_name
= XATTR_NAME_POSIX_ACL_ACCESS
;
68 case ACL_TYPE_DEFAULT
:
69 ea_name
= XATTR_NAME_POSIX_ACL_DEFAULT
;
76 size
= posix_acl_xattr_size(acl
->a_count
);
77 value
= kmalloc(size
, GFP_KERNEL
);
80 rc
= posix_acl_to_xattr(&init_user_ns
, acl
, value
, size
);
84 rc
= __jfs_setxattr(tid
, inode
, ea_name
, value
, size
, 0);
89 set_cached_acl(inode
, type
, acl
);
94 int jfs_set_acl(struct inode
*inode
, struct posix_acl
*acl
, int type
)
99 umode_t mode
= inode
->i_mode
;
101 tid
= txBegin(inode
->i_sb
, 0);
102 mutex_lock(&JFS_IP(inode
)->commit_mutex
);
103 if (type
== ACL_TYPE_ACCESS
&& acl
) {
104 rc
= posix_acl_update_mode(inode
, &mode
, &acl
);
107 if (mode
!= inode
->i_mode
)
110 rc
= __jfs_set_acl(tid
, inode
, type
, acl
);
113 inode
->i_mode
= mode
;
114 inode
->i_ctime
= current_time(inode
);
115 mark_inode_dirty(inode
);
117 rc
= txCommit(tid
, 1, &inode
, 0);
121 mutex_unlock(&JFS_IP(inode
)->commit_mutex
);
125 int jfs_init_acl(tid_t tid
, struct inode
*inode
, struct inode
*dir
)
127 struct posix_acl
*default_acl
, *acl
;
130 rc
= posix_acl_create(dir
, &inode
->i_mode
, &default_acl
, &acl
);
135 rc
= __jfs_set_acl(tid
, inode
, ACL_TYPE_DEFAULT
, default_acl
);
136 posix_acl_release(default_acl
);
138 inode
->i_default_acl
= NULL
;
143 rc
= __jfs_set_acl(tid
, inode
, ACL_TYPE_ACCESS
, acl
);
144 posix_acl_release(acl
);
149 JFS_IP(inode
)->mode2
= (JFS_IP(inode
)->mode2
& 0xffff0000) |