Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
linux
Commits
dbd1a7bf
Commit
dbd1a7bf
authored
Jul 13, 2004
by
Dave Kleikamp
Browse files
Options
Browse Files
Download
Plain Diff
Merge
bk://linux.bkbits.net/linux-2.5
into hostme.bitkeeper.com:/repos/j/jfs/linux-2.5
parents
1ade820c
6e50a7fe
Changes
9
Hide whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
141 additions
and
22 deletions
+141
-22
fs/jfs/file.c
fs/jfs/file.c
+4
-0
fs/jfs/jfs_dmap.c
fs/jfs/jfs_dmap.c
+36
-1
fs/jfs/jfs_extent.c
fs/jfs/jfs_extent.c
+2
-0
fs/jfs/jfs_imap.c
fs/jfs/jfs_imap.c
+6
-0
fs/jfs/jfs_incore.h
fs/jfs/jfs_incore.h
+1
-0
fs/jfs/jfs_metapage.c
fs/jfs/jfs_metapage.c
+9
-1
fs/jfs/jfs_xtree.c
fs/jfs/jfs_xtree.c
+19
-18
fs/jfs/namei.c
fs/jfs/namei.c
+55
-2
fs/jfs/super.c
fs/jfs/super.c
+9
-0
No files found.
fs/jfs/file.c
View file @
dbd1a7bf
...
...
@@ -65,11 +65,13 @@ static int jfs_open(struct inode *inode, struct file *file)
if
(
S_ISREG
(
inode
->
i_mode
)
&&
file
->
f_mode
&
FMODE_WRITE
&&
(
inode
->
i_size
==
0
))
{
struct
jfs_inode_info
*
ji
=
JFS_IP
(
inode
);
spin_lock_irq
(
&
ji
->
ag_lock
);
if
(
ji
->
active_ag
==
-
1
)
{
ji
->
active_ag
=
ji
->
agno
;
atomic_inc
(
&
JFS_SBI
(
inode
->
i_sb
)
->
bmap
->
db_active
[
ji
->
agno
]);
}
spin_unlock_irq
(
&
ji
->
ag_lock
);
}
return
0
;
...
...
@@ -78,11 +80,13 @@ static int jfs_release(struct inode *inode, struct file *file)
{
struct
jfs_inode_info
*
ji
=
JFS_IP
(
inode
);
spin_lock_irq
(
&
ji
->
ag_lock
);
if
(
ji
->
active_ag
!=
-
1
)
{
struct
bmap
*
bmap
=
JFS_SBI
(
inode
->
i_sb
)
->
bmap
;
atomic_dec
(
&
bmap
->
db_active
[
ji
->
active_ag
]);
ji
->
active_ag
=
-
1
;
}
spin_unlock_irq
(
&
ji
->
ag_lock
);
return
0
;
}
...
...
fs/jfs/jfs_dmap.c
View file @
dbd1a7bf
...
...
@@ -1204,6 +1204,12 @@ static int dbAllocNext(struct bmap * bmp, struct dmap * dp, s64 blkno,
s8
*
leaf
;
u32
mask
;
if
(
dp
->
tree
.
leafidx
!=
cpu_to_le32
(
LEAFIND
))
{
jfs_error
(
bmp
->
db_ipbmap
->
i_sb
,
"dbAllocNext: Corrupt dmap page"
);
return
-
EIO
;
}
/* pick up a pointer to the leaves of the dmap tree.
*/
leaf
=
dp
->
tree
.
stree
+
le32_to_cpu
(
dp
->
tree
.
leafidx
);
...
...
@@ -1327,7 +1333,15 @@ dbAllocNear(struct bmap * bmp,
struct
dmap
*
dp
,
s64
blkno
,
int
nblocks
,
int
l2nb
,
s64
*
results
)
{
int
word
,
lword
,
rc
;
s8
*
leaf
=
dp
->
tree
.
stree
+
le32_to_cpu
(
dp
->
tree
.
leafidx
);
s8
*
leaf
;
if
(
dp
->
tree
.
leafidx
!=
cpu_to_le32
(
LEAFIND
))
{
jfs_error
(
bmp
->
db_ipbmap
->
i_sb
,
"dbAllocNear: Corrupt dmap page"
);
return
-
EIO
;
}
leaf
=
dp
->
tree
.
stree
+
le32_to_cpu
(
dp
->
tree
.
leafidx
);
/* determine the word within the dmap that holds the hint
* (i.e. blkno). also, determine the last word in the dmap
...
...
@@ -1489,6 +1503,13 @@ dbAllocAG(struct bmap * bmp, int agno, s64 nblocks, int l2nb, s64 * results)
dcp
=
(
struct
dmapctl
*
)
mp
->
data
;
budmin
=
dcp
->
budmin
;
if
(
dcp
->
leafidx
!=
cpu_to_le32
(
CTLLEAFIND
))
{
jfs_error
(
bmp
->
db_ipbmap
->
i_sb
,
"dbAllocAG: Corrupt dmapctl page"
);
release_metapage
(
mp
);
return
-
EIO
;
}
/* search the subtree(s) of the dmap control page that describes
* the allocation group, looking for sufficient free space. to begin,
* determine how many allocation groups are represented in a dmap
...
...
@@ -1697,6 +1718,13 @@ static int dbFindCtl(struct bmap * bmp, int l2nb, int level, s64 * blkno)
dcp
=
(
struct
dmapctl
*
)
mp
->
data
;
budmin
=
dcp
->
budmin
;
if
(
dcp
->
leafidx
!=
cpu_to_le32
(
CTLLEAFIND
))
{
jfs_error
(
bmp
->
db_ipbmap
->
i_sb
,
"dbFindCtl: Corrupt dmapctl page"
);
release_metapage
(
mp
);
return
-
EIO
;
}
/* search the tree within the dmap control page for
* sufficent free space. if sufficient free space is found,
* dbFindLeaf() returns the index of the leaf at which
...
...
@@ -2459,6 +2487,13 @@ dbAdjCtl(struct bmap * bmp, s64 blkno, int newval, int alloc, int level)
return
-
EIO
;
dcp
=
(
struct
dmapctl
*
)
mp
->
data
;
if
(
dcp
->
leafidx
!=
cpu_to_le32
(
CTLLEAFIND
))
{
jfs_error
(
bmp
->
db_ipbmap
->
i_sb
,
"dbAdjCtl: Corrupt dmapctl page"
);
release_metapage
(
mp
);
return
-
EIO
;
}
/* determine the leaf number corresponding to the block and
* the index within the dmap control tree.
*/
...
...
fs/jfs/jfs_extent.c
View file @
dbd1a7bf
...
...
@@ -553,6 +553,7 @@ extBalloc(struct inode *ip, s64 hint, s64 * nblocks, s64 * blkno)
if
(
S_ISREG
(
ip
->
i_mode
)
&&
(
ji
->
fileset
==
FILESYSTEM_I
))
{
ag
=
BLKTOAG
(
daddr
,
sbi
);
spin_lock_irq
(
&
ji
->
ag_lock
);
if
(
ji
->
active_ag
==
-
1
)
{
atomic_inc
(
&
bmp
->
db_active
[
ag
]);
ji
->
active_ag
=
ag
;
...
...
@@ -561,6 +562,7 @@ extBalloc(struct inode *ip, s64 hint, s64 * nblocks, s64 * blkno)
atomic_inc
(
&
bmp
->
db_active
[
ag
]);
ji
->
active_ag
=
ag
;
}
spin_unlock_irq
(
&
ji
->
ag_lock
);
}
return
(
0
);
...
...
fs/jfs/jfs_imap.c
View file @
dbd1a7bf
...
...
@@ -1280,6 +1280,7 @@ int diFree(struct inode *ip)
* to be freed by the transaction;
*/
tid
=
txBegin
(
ipimap
->
i_sb
,
COMMIT_FORCE
);
down
(
&
JFS_IP
(
ipimap
)
->
commit_sem
);
/* acquire tlock of the iag page of the freed ixad
* to force the page NOHOMEOK (even though no data is
...
...
@@ -1312,6 +1313,7 @@ int diFree(struct inode *ip)
rc
=
txCommit
(
tid
,
1
,
&
iplist
[
0
],
COMMIT_FORCE
);
txEnd
(
tid
);
up
(
&
JFS_IP
(
ipimap
)
->
commit_sem
);
/* unlock the AG inode map information */
AG_UNLOCK
(
imap
,
agno
);
...
...
@@ -2622,10 +2624,13 @@ diNewIAG(struct inomap * imap, int *iagnop, int agno, struct metapage ** mpp)
*/
#endif
/* _STILL_TO_PORT */
tid
=
txBegin
(
sb
,
COMMIT_FORCE
);
down
(
&
JFS_IP
(
ipimap
)
->
commit_sem
);
/* update the inode map addressing structure to point to it */
if
((
rc
=
xtInsert
(
tid
,
ipimap
,
0
,
blkno
,
xlen
,
&
xaddr
,
0
)))
{
txEnd
(
tid
);
up
(
&
JFS_IP
(
ipimap
)
->
commit_sem
);
/* Free the blocks allocated for the iag since it was
* not successfully added to the inode map
*/
...
...
@@ -2650,6 +2655,7 @@ diNewIAG(struct inomap * imap, int *iagnop, int agno, struct metapage ** mpp)
rc
=
txCommit
(
tid
,
1
,
&
iplist
[
0
],
COMMIT_FORCE
);
txEnd
(
tid
);
up
(
&
JFS_IP
(
ipimap
)
->
commit_sem
);
duplicateIXtree
(
sb
,
blkno
,
xlen
,
&
xaddr
);
...
...
fs/jfs/jfs_incore.h
View file @
dbd1a7bf
...
...
@@ -53,6 +53,7 @@ struct jfs_inode_info {
lid_t
blid
;
/* lid of pseudo buffer? */
lid_t
atlhead
;
/* anonymous tlock list head */
lid_t
atltail
;
/* anonymous tlock list tail */
spinlock_t
ag_lock
;
/* protects active_ag */
struct
list_head
anon_inode_list
;
/* inodes having anonymous txns */
/*
* rdwrlock serializes xtree between reads & writes and synchronizes
...
...
fs/jfs/jfs_metapage.c
View file @
dbd1a7bf
...
...
@@ -225,8 +225,16 @@ struct metapage *__get_metapage(struct inode *inode, unsigned long lblock,
if
(
absolute
)
mapping
=
inode
->
i_sb
->
s_bdev
->
bd_inode
->
i_mapping
;
else
else
{
/*
* If an nfs client tries to read an inode that is larger
* than any existing inodes, we may try to read past the
* end of the inode map
*/
if
((
lblock
<<
inode
->
i_blkbits
)
>=
inode
->
i_size
)
return
NULL
;
mapping
=
inode
->
i_mapping
;
}
hash_ptr
=
meta_hash
(
mapping
,
lblock
);
again:
...
...
fs/jfs/jfs_xtree.c
View file @
dbd1a7bf
...
...
@@ -1071,8 +1071,10 @@ xtSplitUp(tid_t tid,
*/
/* get/pin the parent page <sp> */
XT_GETPAGE
(
ip
,
parent
->
bn
,
smp
,
PSIZE
,
sp
,
rc
);
if
(
rc
)
goto
errout2
;
if
(
rc
)
{
XT_PUTPAGE
(
rcmp
);
return
rc
;
}
/*
* The new key entry goes ONE AFTER the index of parent entry,
...
...
@@ -1106,8 +1108,10 @@ xtSplitUp(tid_t tid,
rc
=
(
sp
->
header
.
flag
&
BT_ROOT
)
?
xtSplitRoot
(
tid
,
ip
,
split
,
&
rmp
)
:
xtSplitPage
(
tid
,
ip
,
split
,
&
rmp
,
&
rbn
);
if
(
rc
)
goto
errout1
;
if
(
rc
)
{
XT_PUTPAGE
(
smp
);
return
rc
;
}
XT_PUTPAGE
(
smp
);
/* keep new child page <rp> pinned */
...
...
@@ -1170,19 +1174,6 @@ xtSplitUp(tid_t tid,
XT_PUTPAGE
(
rmp
);
return
0
;
/*
* If something fails in the above loop we were already walking back
* up the tree and the tree is now inconsistent.
* release all pages we're holding.
*/
errout1:
XT_PUTPAGE
(
smp
);
errout2:
XT_PUTPAGE
(
rcmp
);
return
rc
;
}
...
...
@@ -3504,7 +3495,17 @@ s64 xtTruncate(tid_t tid, struct inode *ip, s64 newsize, int flag)
* a page that was formerly to the right, let's make sure that the
* next pointer is zero.
*/
p
->
header
.
next
=
0
;
if
(
p
->
header
.
next
)
{
if
(
log
)
/*
* Make sure this change to the header is logged.
* If we really truncate this leaf, the flag
* will be changed to tlckTRUNCATE
*/
tlck
=
txLock
(
tid
,
ip
,
mp
,
tlckXTREE
|
tlckGROW
);
BT_MARK_DIRTY
(
mp
,
ip
);
p
->
header
.
next
=
0
;
}
freed
=
0
;
...
...
fs/jfs/namei.c
View file @
dbd1a7bf
/*
* Copyright (C) International Business Machines Corp., 2000-200
3
* Copyright (C) International Business Machines Corp., 2000-200
4
* Portions Copyright (C) Christoph Hellwig, 2001-2002
*
* This program is free software; you can redistribute it and/or modify
...
...
@@ -18,6 +18,7 @@
*/
#include <linux/fs.h>
#include <linux/ctype.h>
#include "jfs_incore.h"
#include "jfs_superblock.h"
#include "jfs_inode.h"
...
...
@@ -43,6 +44,7 @@ extern int jfs_init_acl(struct inode *, struct inode *);
*/
struct
inode_operations
jfs_dir_inode_operations
;
struct
file_operations
jfs_dir_operations
;
struct
dentry_operations
jfs_ci_dentry_operations
;
static
s64
commitZeroLink
(
tid_t
,
struct
inode
*
);
...
...
@@ -1422,7 +1424,15 @@ static struct dentry *jfs_lookup(struct inode *dip, struct dentry *dentry, struc
return
ERR_PTR
(
-
EACCES
);
}
return
d_splice_alias
(
ip
,
dentry
);
if
(
JFS_SBI
(
dip
->
i_sb
)
->
mntflag
&
JFS_OS2
)
dentry
->
d_op
=
&
jfs_ci_dentry_operations
;
dentry
=
d_splice_alias
(
ip
,
dentry
);
if
(
dentry
&&
(
JFS_SBI
(
dip
->
i_sb
)
->
mntflag
&
JFS_OS2
))
dentry
->
d_op
=
&
jfs_ci_dentry_operations
;
return
dentry
;
}
struct
dentry
*
jfs_get_parent
(
struct
dentry
*
dentry
)
...
...
@@ -1476,3 +1486,46 @@ struct file_operations jfs_dir_operations = {
.
readdir
=
jfs_readdir
,
.
fsync
=
jfs_fsync
,
};
static
int
jfs_ci_hash
(
struct
dentry
*
dir
,
struct
qstr
*
this
)
{
unsigned
long
hash
;
int
i
;
hash
=
init_name_hash
();
for
(
i
=
0
;
i
<
this
->
len
;
i
++
)
hash
=
partial_name_hash
(
tolower
(
this
->
name
[
i
]),
hash
);
this
->
hash
=
end_name_hash
(
hash
);
return
0
;
}
static
int
jfs_ci_compare
(
struct
dentry
*
dir
,
struct
qstr
*
a
,
struct
qstr
*
b
)
{
int
i
,
result
=
1
;
if
(
a
->
len
!=
b
->
len
)
goto
out
;
for
(
i
=
0
;
i
<
a
->
len
;
i
++
)
{
if
(
tolower
(
a
->
name
[
i
])
!=
tolower
(
b
->
name
[
i
]))
goto
out
;
}
result
=
0
;
/*
* We want creates to preserve case. A negative dentry, a, that
* has a different case than b may cause a new entry to be created
* with the wrong case. Since we can't tell if a comes from a negative
* dentry, we blindly replace it with b. This should be harmless if
* a is not a negative dentry.
*/
memcpy
((
unsigned
char
*
)
a
->
name
,
b
->
name
,
a
->
len
);
out:
return
result
;
}
struct
dentry_operations
jfs_ci_dentry_operations
=
{
.
d_hash
=
jfs_ci_hash
,
.
d_compare
=
jfs_ci_compare
,
};
fs/jfs/super.c
View file @
dbd1a7bf
...
...
@@ -82,6 +82,8 @@ extern void jfs_write_inode(struct inode *inode, int wait);
extern
struct
dentry
*
jfs_get_parent
(
struct
dentry
*
dentry
);
extern
int
jfs_extendfs
(
struct
super_block
*
,
s64
,
int
);
extern
struct
dentry_operations
jfs_ci_dentry_operations
;
#ifdef PROC_FS_JFS
/* see jfs_debug.h */
extern
void
jfs_proc_init
(
void
);
extern
void
jfs_proc_clean
(
void
);
...
...
@@ -141,10 +143,13 @@ static void jfs_destroy_inode(struct inode *inode)
{
struct
jfs_inode_info
*
ji
=
JFS_IP
(
inode
);
spin_lock_irq
(
&
ji
->
ag_lock
);
if
(
ji
->
active_ag
!=
-
1
)
{
struct
bmap
*
bmap
=
JFS_SBI
(
inode
->
i_sb
)
->
bmap
;
atomic_dec
(
&
bmap
->
db_active
[
ji
->
active_ag
]);
ji
->
active_ag
=
-
1
;
}
spin_unlock_irq
(
&
ji
->
ag_lock
);
#ifdef CONFIG_JFS_POSIX_ACL
if
(
ji
->
i_acl
!=
JFS_ACL_NOT_CACHED
)
{
...
...
@@ -443,6 +448,9 @@ static int jfs_fill_super(struct super_block *sb, void *data, int silent)
if
(
!
sb
->
s_root
)
goto
out_no_root
;
if
(
sbi
->
mntflag
&
JFS_OS2
)
sb
->
s_root
->
d_op
=
&
jfs_ci_dentry_operations
;
/* logical blocks are represented by 40 bits in pxd_t, etc. */
sb
->
s_maxbytes
=
((
u64
)
sb
->
s_blocksize
)
<<
40
;
#if BITS_PER_LONG == 32
...
...
@@ -559,6 +567,7 @@ static void init_once(void *foo, kmem_cache_t * cachep, unsigned long flags)
init_rwsem
(
&
jfs_ip
->
rdwrlock
);
init_MUTEX
(
&
jfs_ip
->
commit_sem
);
init_rwsem
(
&
jfs_ip
->
xattr_sem
);
spin_lock_init
(
&
jfs_ip
->
ag_lock
);
jfs_ip
->
active_ag
=
-
1
;
#ifdef CONFIG_JFS_POSIX_ACL
jfs_ip
->
i_acl
=
JFS_ACL_NOT_CACHED
;
...
...
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