Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
L
linux-davinci-2.6.23
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Redmine
Redmine
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Metrics
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
linux
linux-davinci-2.6.23
Commits
4f4b401b
Commit
4f4b401b
authored
Sep 01, 2005
by
Dave Kleikamp
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
JFS: allow extended attributes to be set within a existing transaction
Signed-off-by:
Dave Kleikamp
<
shaggy@austin.ibm.com
>
parent
b1b5d7f9
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
112 additions
and
49 deletions
+112
-49
fs/jfs/acl.c
fs/jfs/acl.c
+17
-7
fs/jfs/jfs_acl.h
fs/jfs/jfs_acl.h
+10
-2
fs/jfs/jfs_xattr.h
fs/jfs/jfs_xattr.h
+2
-2
fs/jfs/namei.c
fs/jfs/namei.c
+42
-21
fs/jfs/xattr.c
fs/jfs/xattr.c
+41
-17
No files found.
fs/jfs/acl.c
View file @
4f4b401b
...
...
@@ -23,6 +23,7 @@
#include <linux/quotaops.h>
#include <linux/posix_acl_xattr.h>
#include "jfs_incore.h"
#include "jfs_txnmgr.h"
#include "jfs_xattr.h"
#include "jfs_acl.h"
...
...
@@ -75,7 +76,8 @@ static struct posix_acl *jfs_get_acl(struct inode *inode, int type)
return
acl
;
}
static
int
jfs_set_acl
(
struct
inode
*
inode
,
int
type
,
struct
posix_acl
*
acl
)
static
int
jfs_set_acl
(
tid_t
tid
,
struct
inode
*
inode
,
int
type
,
struct
posix_acl
*
acl
)
{
char
*
ea_name
;
struct
jfs_inode_info
*
ji
=
JFS_IP
(
inode
);
...
...
@@ -110,7 +112,7 @@ static int jfs_set_acl(struct inode *inode, int type, struct posix_acl *acl)
if
(
rc
<
0
)
goto
out
;
}
rc
=
__jfs_setxattr
(
inode
,
ea_name
,
value
,
size
,
0
);
rc
=
__jfs_setxattr
(
tid
,
inode
,
ea_name
,
value
,
size
,
0
);
out:
kfree
(
value
);
...
...
@@ -143,7 +145,7 @@ int jfs_permission(struct inode *inode, int mask, struct nameidata *nd)
return
generic_permission
(
inode
,
mask
,
jfs_check_acl
);
}
int
jfs_init_acl
(
struct
inode
*
inode
,
struct
inode
*
dir
)
int
jfs_init_acl
(
tid_t
tid
,
struct
inode
*
inode
,
struct
inode
*
dir
)
{
struct
posix_acl
*
acl
=
NULL
;
struct
posix_acl
*
clone
;
...
...
@@ -159,7 +161,7 @@ int jfs_init_acl(struct inode *inode, struct inode *dir)
if
(
acl
)
{
if
(
S_ISDIR
(
inode
->
i_mode
))
{
rc
=
jfs_set_acl
(
inode
,
ACL_TYPE_DEFAULT
,
acl
);
rc
=
jfs_set_acl
(
tid
,
inode
,
ACL_TYPE_DEFAULT
,
acl
);
if
(
rc
)
goto
cleanup
;
}
...
...
@@ -173,7 +175,8 @@ int jfs_init_acl(struct inode *inode, struct inode *dir)
if
(
rc
>=
0
)
{
inode
->
i_mode
=
mode
;
if
(
rc
>
0
)
rc
=
jfs_set_acl
(
inode
,
ACL_TYPE_ACCESS
,
clone
);
rc
=
jfs_set_acl
(
tid
,
inode
,
ACL_TYPE_ACCESS
,
clone
);
}
posix_acl_release
(
clone
);
cleanup:
...
...
@@ -202,8 +205,15 @@ static int jfs_acl_chmod(struct inode *inode)
return
-
ENOMEM
;
rc
=
posix_acl_chmod_masq
(
clone
,
inode
->
i_mode
);
if
(
!
rc
)
rc
=
jfs_set_acl
(
inode
,
ACL_TYPE_ACCESS
,
clone
);
if
(
!
rc
)
{
tid_t
tid
=
txBegin
(
inode
->
i_sb
,
0
);
down
(
&
JFS_IP
(
inode
)
->
commit_sem
);
rc
=
jfs_set_acl
(
tid
,
inode
,
ACL_TYPE_ACCESS
,
clone
);
if
(
!
rc
)
rc
=
txCommit
(
tid
,
1
,
&
inode
,
0
);
txEnd
(
tid
);
up
(
&
JFS_IP
(
inode
)
->
commit_sem
);
}
posix_acl_release
(
clone
);
return
rc
;
...
...
fs/jfs/jfs_acl.h
View file @
4f4b401b
...
...
@@ -21,8 +21,16 @@
#ifdef CONFIG_JFS_POSIX_ACL
int
jfs_permission
(
struct
inode
*
,
int
,
struct
nameidata
*
);
int
jfs_init_acl
(
struct
inode
*
,
struct
inode
*
);
int
jfs_init_acl
(
tid_t
,
struct
inode
*
,
struct
inode
*
);
int
jfs_setattr
(
struct
dentry
*
,
struct
iattr
*
);
#endif
/* CONFIG_JFS_POSIX_ACL */
#else
static
inline
int
jfs_init_acl
(
tid_t
tid
,
struct
inode
*
inode
,
struct
inode
*
dir
)
{
return
0
;
}
#endif
#endif
/* _H_JFS_ACL */
fs/jfs/jfs_xattr.h
View file @
4f4b401b
...
...
@@ -52,8 +52,8 @@ struct jfs_ea_list {
#define END_EALIST(ealist) \
((struct jfs_ea *) (((char *) (ealist)) + EALIST_SIZE(ealist)))
extern
int
__jfs_setxattr
(
struct
inode
*
,
const
char
*
,
const
void
*
,
size_t
,
int
);
extern
int
__jfs_setxattr
(
tid_t
,
struct
inode
*
,
const
char
*
,
const
void
*
,
size_t
,
int
);
extern
int
jfs_setxattr
(
struct
dentry
*
,
const
char
*
,
const
void
*
,
size_t
,
int
);
extern
ssize_t
__jfs_getxattr
(
struct
inode
*
,
const
char
*
,
void
*
,
size_t
);
...
...
fs/jfs/namei.c
View file @
4f4b401b
...
...
@@ -38,6 +38,24 @@ struct dentry_operations jfs_ci_dentry_operations;
static
s64
commitZeroLink
(
tid_t
,
struct
inode
*
);
/*
* NAME: free_ea_wmap(inode)
*
* FUNCTION: free uncommitted extended attributes from working map
*
*/
static
inline
void
free_ea_wmap
(
struct
inode
*
inode
)
{
dxd_t
*
ea
=
&
JFS_IP
(
inode
)
->
ea
;
if
(
ea
->
flag
&
DXD_EXTENT
)
{
/* free EA pages from cache */
invalidate_dxd_metapages
(
inode
,
*
ea
);
dbFree
(
inode
,
addressDXD
(
ea
),
lengthDXD
(
ea
));
}
ea
->
flag
=
0
;
}
/*
* NAME: jfs_create(dip, dentry, mode)
*
...
...
@@ -89,8 +107,13 @@ static int jfs_create(struct inode *dip, struct dentry *dentry, int mode,
down
(
&
JFS_IP
(
dip
)
->
commit_sem
);
down
(
&
JFS_IP
(
ip
)
->
commit_sem
);
rc
=
jfs_init_acl
(
tid
,
ip
,
dip
);
if
(
rc
)
goto
out3
;
if
((
rc
=
dtSearch
(
dip
,
&
dname
,
&
ino
,
&
btstack
,
JFS_CREATE
)))
{
jfs_err
(
"jfs_create: dtSearch returned %d"
,
rc
);
txAbort
(
tid
,
0
);
goto
out3
;
}
...
...
@@ -139,6 +162,7 @@ static int jfs_create(struct inode *dip, struct dentry *dentry, int mode,
up
(
&
JFS_IP
(
dip
)
->
commit_sem
);
up
(
&
JFS_IP
(
ip
)
->
commit_sem
);
if
(
rc
)
{
free_ea_wmap
(
ip
);
ip
->
i_nlink
=
0
;
iput
(
ip
);
}
else
...
...
@@ -147,11 +171,6 @@ static int jfs_create(struct inode *dip, struct dentry *dentry, int mode,
out2:
free_UCSname
(
&
dname
);
#ifdef CONFIG_JFS_POSIX_ACL
if
(
rc
==
0
)
jfs_init_acl
(
ip
,
dip
);
#endif
out1:
jfs_info
(
"jfs_create: rc:%d"
,
rc
);
...
...
@@ -216,8 +235,13 @@ static int jfs_mkdir(struct inode *dip, struct dentry *dentry, int mode)
down
(
&
JFS_IP
(
dip
)
->
commit_sem
);
down
(
&
JFS_IP
(
ip
)
->
commit_sem
);
rc
=
jfs_init_acl
(
tid
,
ip
,
dip
);
if
(
rc
)
goto
out3
;
if
((
rc
=
dtSearch
(
dip
,
&
dname
,
&
ino
,
&
btstack
,
JFS_CREATE
)))
{
jfs_err
(
"jfs_mkdir: dtSearch returned %d"
,
rc
);
txAbort
(
tid
,
0
);
goto
out3
;
}
...
...
@@ -267,6 +291,7 @@ static int jfs_mkdir(struct inode *dip, struct dentry *dentry, int mode)
up
(
&
JFS_IP
(
dip
)
->
commit_sem
);
up
(
&
JFS_IP
(
ip
)
->
commit_sem
);
if
(
rc
)
{
free_ea_wmap
(
ip
);
ip
->
i_nlink
=
0
;
iput
(
ip
);
}
else
...
...
@@ -275,10 +300,6 @@ static int jfs_mkdir(struct inode *dip, struct dentry *dentry, int mode)
out2:
free_UCSname
(
&
dname
);
#ifdef CONFIG_JFS_POSIX_ACL
if
(
rc
==
0
)
jfs_init_acl
(
ip
,
dip
);
#endif
out1:
...
...
@@ -1000,6 +1021,7 @@ static int jfs_symlink(struct inode *dip, struct dentry *dentry,
up
(
&
JFS_IP
(
dip
)
->
commit_sem
);
up
(
&
JFS_IP
(
ip
)
->
commit_sem
);
if
(
rc
)
{
free_ea_wmap
(
ip
);
ip
->
i_nlink
=
0
;
iput
(
ip
);
}
else
...
...
@@ -1008,11 +1030,6 @@ static int jfs_symlink(struct inode *dip, struct dentry *dentry,
out2:
free_UCSname
(
&
dname
);
#ifdef CONFIG_JFS_POSIX_ACL
if
(
rc
==
0
)
jfs_init_acl
(
ip
,
dip
);
#endif
out1:
jfs_info
(
"jfs_symlink: rc:%d"
,
rc
);
return
rc
;
...
...
@@ -1328,17 +1345,25 @@ static int jfs_mknod(struct inode *dir, struct dentry *dentry,
down
(
&
JFS_IP
(
dir
)
->
commit_sem
);
down
(
&
JFS_IP
(
ip
)
->
commit_sem
);
if
((
rc
=
dtSearch
(
dir
,
&
dname
,
&
ino
,
&
btstack
,
JFS_CREATE
)))
rc
=
jfs_init_acl
(
tid
,
ip
,
dir
);
if
(
rc
)
goto
out3
;
if
((
rc
=
dtSearch
(
dir
,
&
dname
,
&
ino
,
&
btstack
,
JFS_CREATE
)))
{
txAbort
(
tid
,
0
);
goto
out3
;
}
tblk
=
tid_to_tblock
(
tid
);
tblk
->
xflag
|=
COMMIT_CREATE
;
tblk
->
ino
=
ip
->
i_ino
;
tblk
->
u
.
ixpxd
=
JFS_IP
(
ip
)
->
ixpxd
;
ino
=
ip
->
i_ino
;
if
((
rc
=
dtInsert
(
tid
,
dir
,
&
dname
,
&
ino
,
&
btstack
)))
if
((
rc
=
dtInsert
(
tid
,
dir
,
&
dname
,
&
ino
,
&
btstack
)))
{
txAbort
(
tid
,
0
);
goto
out3
;
}
ip
->
i_op
=
&
jfs_file_inode_operations
;
jfs_ip
->
dev
=
new_encode_dev
(
rdev
);
...
...
@@ -1360,6 +1385,7 @@ static int jfs_mknod(struct inode *dir, struct dentry *dentry,
up
(
&
JFS_IP
(
ip
)
->
commit_sem
);
up
(
&
JFS_IP
(
dir
)
->
commit_sem
);
if
(
rc
)
{
free_ea_wmap
(
ip
);
ip
->
i_nlink
=
0
;
iput
(
ip
);
}
else
...
...
@@ -1368,11 +1394,6 @@ static int jfs_mknod(struct inode *dir, struct dentry *dentry,
out1:
free_UCSname
(
&
dname
);
#ifdef CONFIG_JFS_POSIX_ACL
if
(
rc
==
0
)
jfs_init_acl
(
ip
,
dir
);
#endif
out:
jfs_info
(
"jfs_mknod: returning %d"
,
rc
);
return
rc
;
...
...
fs/jfs/xattr.c
View file @
4f4b401b
...
...
@@ -633,12 +633,12 @@ static void ea_release(struct inode *inode, struct ea_buffer *ea_buf)
}
}
static
int
ea_put
(
struct
inode
*
inode
,
struct
ea_buffer
*
ea_buf
,
int
new_size
)
static
int
ea_put
(
tid_t
tid
,
struct
inode
*
inode
,
struct
ea_buffer
*
ea_buf
,
int
new_size
)
{
struct
jfs_inode_info
*
ji
=
JFS_IP
(
inode
);
unsigned
long
old_blocks
,
new_blocks
;
int
rc
=
0
;
tid_t
tid
;
if
(
new_size
==
0
)
{
ea_release
(
inode
,
ea_buf
);
...
...
@@ -664,9 +664,6 @@ static int ea_put(struct inode *inode, struct ea_buffer *ea_buf, int new_size)
if
(
rc
)
return
rc
;
tid
=
txBegin
(
inode
->
i_sb
,
0
);
down
(
&
ji
->
commit_sem
);
old_blocks
=
new_blocks
=
0
;
if
(
ji
->
ea
.
flag
&
DXD_EXTENT
)
{
...
...
@@ -695,11 +692,8 @@ static int ea_put(struct inode *inode, struct ea_buffer *ea_buf, int new_size)
DQUOT_FREE_BLOCK
(
inode
,
old_blocks
);
inode
->
i_ctime
=
CURRENT_TIME
;
rc
=
txCommit
(
tid
,
1
,
&
inode
,
0
);
txEnd
(
tid
);
up
(
&
ji
->
commit_sem
);
return
rc
;
return
0
;
}
/*
...
...
@@ -810,8 +804,8 @@ static int can_set_xattr(struct inode *inode, const char *name,
return
permission
(
inode
,
MAY_WRITE
,
NULL
);
}
int
__jfs_setxattr
(
struct
inode
*
inode
,
const
char
*
name
,
const
void
*
valu
e
,
size_t
value_len
,
int
flags
)
int
__jfs_setxattr
(
tid_t
tid
,
struct
inode
*
inode
,
const
char
*
nam
e
,
const
void
*
value
,
size_t
value_len
,
int
flags
)
{
struct
jfs_ea_list
*
ealist
;
struct
jfs_ea
*
ea
,
*
old_ea
=
NULL
,
*
next_ea
=
NULL
;
...
...
@@ -825,9 +819,6 @@ int __jfs_setxattr(struct inode *inode, const char *name, const void *value,
int
rc
;
int
length
;
if
((
rc
=
can_set_xattr
(
inode
,
name
,
value
,
value_len
)))
return
rc
;
if
(
strncmp
(
name
,
XATTR_OS2_PREFIX
,
XATTR_OS2_PREFIX_LEN
)
==
0
)
{
os2name
=
kmalloc
(
namelen
-
XATTR_OS2_PREFIX_LEN
+
1
,
GFP_KERNEL
);
...
...
@@ -939,7 +930,7 @@ int __jfs_setxattr(struct inode *inode, const char *name, const void *value,
ealist
->
size
=
cpu_to_le32
(
new_size
);
rc
=
ea_put
(
inode
,
&
ea_buf
,
new_size
);
rc
=
ea_put
(
tid
,
inode
,
&
ea_buf
,
new_size
);
goto
out
;
release:
...
...
@@ -955,12 +946,29 @@ int __jfs_setxattr(struct inode *inode, const char *name, const void *value,
int
jfs_setxattr
(
struct
dentry
*
dentry
,
const
char
*
name
,
const
void
*
value
,
size_t
value_len
,
int
flags
)
{
struct
inode
*
inode
=
dentry
->
d_inode
;
struct
jfs_inode_info
*
ji
=
JFS_IP
(
inode
);
int
rc
;
tid_t
tid
;
if
((
rc
=
can_set_xattr
(
inode
,
name
,
value
,
value_len
)))
return
rc
;
if
(
value
==
NULL
)
{
/* empty EA, do not remove */
value
=
""
;
value_len
=
0
;
}
return
__jfs_setxattr
(
dentry
->
d_inode
,
name
,
value
,
value_len
,
flags
);
tid
=
txBegin
(
inode
->
i_sb
,
0
);
down
(
&
ji
->
commit_sem
);
rc
=
__jfs_setxattr
(
tid
,
dentry
->
d_inode
,
name
,
value
,
value_len
,
flags
);
if
(
!
rc
)
rc
=
txCommit
(
tid
,
1
,
&
inode
,
0
);
txEnd
(
tid
);
up
(
&
ji
->
commit_sem
);
return
rc
;
}
static
int
can_get_xattr
(
struct
inode
*
inode
,
const
char
*
name
)
...
...
@@ -1122,5 +1130,21 @@ ssize_t jfs_listxattr(struct dentry * dentry, char *data, size_t buf_size)
int
jfs_removexattr
(
struct
dentry
*
dentry
,
const
char
*
name
)
{
return
__jfs_setxattr
(
dentry
->
d_inode
,
name
,
NULL
,
0
,
XATTR_REPLACE
);
struct
inode
*
inode
=
dentry
->
d_inode
;
struct
jfs_inode_info
*
ji
=
JFS_IP
(
inode
);
int
rc
;
tid_t
tid
;
if
((
rc
=
can_set_xattr
(
inode
,
name
,
NULL
,
0
)))
return
rc
;
tid
=
txBegin
(
inode
->
i_sb
,
0
);
down
(
&
ji
->
commit_sem
);
rc
=
__jfs_setxattr
(
tid
,
dentry
->
d_inode
,
name
,
NULL
,
0
,
XATTR_REPLACE
);
if
(
!
rc
)
rc
=
txCommit
(
tid
,
1
,
&
inode
,
0
);
txEnd
(
tid
);
up
(
&
ji
->
commit_sem
);
return
rc
;
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment