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
nexedi
linux
Commits
a49520cb
Commit
a49520cb
authored
Aug 19, 2002
by
James Simmons
Browse files
Options
Browse Files
Download
Plain Diff
Merge maxwell.earthlink.net:/usr/src/linus-2.5
into maxwell.earthlink.net:/usr/src/fbdev-2.5
parents
beecec57
29ceefc7
Changes
20
Show whitespace changes
Inline
Side-by-side
Showing
20 changed files
with
487 additions
and
309 deletions
+487
-309
fs/nfs/nfs2xdr.c
fs/nfs/nfs2xdr.c
+35
-12
fs/nfs/nfs3xdr.c
fs/nfs/nfs3xdr.c
+27
-9
fs/nfs/read.c
fs/nfs/read.c
+7
-2
fs/romfs/inode.c
fs/romfs/inode.c
+13
-8
fs/ufs/balloc.c
fs/ufs/balloc.c
+24
-24
fs/ufs/cylinder.c
fs/ufs/cylinder.c
+38
-35
fs/ufs/dir.c
fs/ufs/dir.c
+4
-4
fs/ufs/ialloc.c
fs/ufs/ialloc.c
+11
-9
fs/ufs/inode.c
fs/ufs/inode.c
+9
-9
fs/ufs/namei.c
fs/ufs/namei.c
+1
-1
fs/ufs/super.c
fs/ufs/super.c
+78
-60
fs/ufs/swab.h
fs/ufs/swab.h
+12
-12
fs/ufs/truncate.c
fs/ufs/truncate.c
+5
-5
fs/ufs/util.h
fs/ufs/util.h
+13
-13
include/linux/fs.h
include/linux/fs.h
+0
-4
include/linux/preempt.h
include/linux/preempt.h
+11
-7
include/linux/romfs_fs_sb.h
include/linux/romfs_fs_sb.h
+0
-10
include/linux/spinlock.h
include/linux/spinlock.h
+190
-82
include/linux/ufs_fs.h
include/linux/ufs_fs.h
+8
-2
kernel/exit.c
kernel/exit.c
+1
-1
No files found.
fs/nfs/nfs2xdr.c
View file @
a49520cb
...
...
@@ -233,6 +233,7 @@ nfs_xdr_readargs(struct rpc_rqst *req, u32 *p, struct nfs_readargs *args)
static
int
nfs_xdr_readres
(
struct
rpc_rqst
*
req
,
u32
*
p
,
struct
nfs_readres
*
res
)
{
struct
xdr_buf
*
rcvbuf
=
&
req
->
rq_rcv_buf
;
struct
iovec
*
iov
=
req
->
rq_rvec
;
int
status
,
count
,
recvd
,
hdrlen
;
...
...
@@ -241,25 +242,33 @@ nfs_xdr_readres(struct rpc_rqst *req, u32 *p, struct nfs_readres *res)
p
=
xdr_decode_fattr
(
p
,
res
->
fattr
);
count
=
ntohl
(
*
p
++
);
res
->
eof
=
0
;
if
(
rcvbuf
->
page_len
)
{
u32
end
=
page_offset
(
rcvbuf
->
pages
[
0
])
+
rcvbuf
->
page_base
+
count
;
if
(
end
>=
res
->
fattr
->
size
)
res
->
eof
=
1
;
}
hdrlen
=
(
u8
*
)
p
-
(
u8
*
)
iov
->
iov_base
;
if
(
iov
->
iov_len
>
hdrlen
)
{
if
(
iov
->
iov_len
<
hdrlen
)
{
printk
(
KERN_WARNING
"NFS: READ reply header overflowed:"
"length %d > %d
\n
"
,
hdrlen
,
iov
->
iov_len
);
return
-
errno_NFSERR_IO
;
}
else
if
(
iov
->
iov_len
!=
hdrlen
)
{
dprintk
(
"NFS: READ header is short. iovec will be shifted.
\n
"
);
xdr_shift_buf
(
&
req
->
rq_rcv_buf
,
iov
->
iov_len
-
hdrlen
);
}
recvd
=
req
->
rq_r
len
-
hdrlen
;
recvd
=
req
->
rq_r
eceived
-
hdrlen
;
if
(
count
>
recvd
)
{
printk
(
KERN_WARNING
"NFS: server cheating in read reply: "
"count %d > recvd %d
\n
"
,
count
,
recvd
);
count
=
recvd
;
res
->
eof
=
0
;
}
dprintk
(
"RPC: readres OK count %d
\n
"
,
count
);
if
(
count
<
res
->
count
)
{
if
(
count
<
res
->
count
)
res
->
count
=
count
;
res
->
eof
=
1
;
/* Silly NFSv3ism which can't be helped */
}
else
res
->
eof
=
0
;
return
count
;
}
...
...
@@ -384,7 +393,7 @@ nfs_xdr_readdirres(struct rpc_rqst *req, u32 *p, void *dummy)
struct
xdr_buf
*
rcvbuf
=
&
req
->
rq_rcv_buf
;
struct
iovec
*
iov
=
rcvbuf
->
head
;
struct
page
**
page
;
int
hdrlen
;
int
hdrlen
,
recvd
;
int
status
,
nr
;
unsigned
int
len
,
pglen
;
u32
*
end
,
*
entry
;
...
...
@@ -393,17 +402,24 @@ nfs_xdr_readdirres(struct rpc_rqst *req, u32 *p, void *dummy)
return
-
nfs_stat_to_errno
(
status
);
hdrlen
=
(
u8
*
)
p
-
(
u8
*
)
iov
->
iov_base
;
if
(
iov
->
iov_len
>
hdrlen
)
{
if
(
iov
->
iov_len
<
hdrlen
)
{
printk
(
KERN_WARNING
"NFS: READDIR reply header overflowed:"
"length %d > %d
\n
"
,
hdrlen
,
iov
->
iov_len
);
return
-
errno_NFSERR_IO
;
}
else
if
(
iov
->
iov_len
!=
hdrlen
)
{
dprintk
(
"NFS: READDIR header is short. iovec will be shifted.
\n
"
);
xdr_shift_buf
(
rcvbuf
,
iov
->
iov_len
-
hdrlen
);
}
pglen
=
rcvbuf
->
page_len
;
recvd
=
req
->
rq_received
-
hdrlen
;
if
(
pglen
>
recvd
)
pglen
=
recvd
;
page
=
rcvbuf
->
pages
;
p
=
kmap
(
*
page
);
end
=
(
u32
*
)((
char
*
)
p
+
pglen
);
entry
=
p
;
for
(
nr
=
0
;
*
p
++
;
nr
++
)
{
entry
=
p
-
1
;
if
(
p
+
2
>
end
)
goto
short_pkt
;
p
++
;
/* fileid */
...
...
@@ -416,14 +432,21 @@ nfs_xdr_readdirres(struct rpc_rqst *req, u32 *p, void *dummy)
}
if
(
p
+
2
>
end
)
goto
short_pkt
;
entry
=
p
;
}
if
(
!
nr
)
goto
short_pkt
;
out:
kunmap
(
*
page
);
return
nr
;
short_pkt:
printk
(
KERN_NOTICE
"NFS: short packet in readdir reply!
\n
"
);
entry
[
0
]
=
entry
[
1
]
=
0
;
kunmap
(
*
page
);
return
nr
;
/* truncate listing ? */
if
(
!
nr
)
{
printk
(
KERN_NOTICE
"NFS: readdir reply truncated!
\n
"
);
entry
[
1
]
=
1
;
}
goto
out
;
err_unmap:
kunmap
(
*
page
);
return
-
errno_NFSERR_IO
;
...
...
fs/nfs/nfs3xdr.c
View file @
a49520cb
...
...
@@ -504,7 +504,7 @@ nfs3_xdr_readdirres(struct rpc_rqst *req, u32 *p, struct nfs3_readdirres *res)
struct
xdr_buf
*
rcvbuf
=
&
req
->
rq_rcv_buf
;
struct
iovec
*
iov
=
rcvbuf
->
head
;
struct
page
**
page
;
int
hdrlen
;
int
hdrlen
,
recvd
;
int
status
,
nr
;
unsigned
int
len
,
pglen
;
u32
*
entry
,
*
end
;
...
...
@@ -523,17 +523,24 @@ nfs3_xdr_readdirres(struct rpc_rqst *req, u32 *p, struct nfs3_readdirres *res)
}
hdrlen
=
(
u8
*
)
p
-
(
u8
*
)
iov
->
iov_base
;
if
(
iov
->
iov_len
>
hdrlen
)
{
if
(
iov
->
iov_len
<
hdrlen
)
{
printk
(
KERN_WARNING
"NFS: READDIR reply header overflowed:"
"length %d > %d
\n
"
,
hdrlen
,
iov
->
iov_len
);
return
-
errno_NFSERR_IO
;
}
else
if
(
iov
->
iov_len
!=
hdrlen
)
{
dprintk
(
"NFS: READDIR header is short. iovec will be shifted.
\n
"
);
xdr_shift_buf
(
rcvbuf
,
iov
->
iov_len
-
hdrlen
);
}
pglen
=
rcvbuf
->
page_len
;
recvd
=
req
->
rq_received
-
hdrlen
;
if
(
pglen
>
recvd
)
pglen
=
recvd
;
page
=
rcvbuf
->
pages
;
p
=
kmap
(
*
page
);
end
=
(
u32
*
)((
char
*
)
p
+
pglen
);
entry
=
p
;
for
(
nr
=
0
;
*
p
++
;
nr
++
)
{
entry
=
p
-
1
;
if
(
p
+
3
>
end
)
goto
short_pkt
;
p
+=
2
;
/* inode # */
...
...
@@ -570,15 +577,21 @@ nfs3_xdr_readdirres(struct rpc_rqst *req, u32 *p, struct nfs3_readdirres *res)
if
(
p
+
2
>
end
)
goto
short_pkt
;
entry
=
p
;
}
if
(
!
nr
)
goto
short_pkt
;
out:
kunmap
(
*
page
);
return
nr
;
short_pkt:
printk
(
KERN_NOTICE
"NFS: short packet in readdir reply!
\n
"
);
/* truncate listing */
entry
[
0
]
=
entry
[
1
]
=
0
;
kunmap
(
*
page
);
return
nr
;
/* truncate listing ? */
if
(
!
nr
)
{
printk
(
KERN_NOTICE
"NFS: readdir reply truncated!
\n
"
);
entry
[
1
]
=
1
;
}
goto
out
;
err_unmap:
kunmap
(
*
page
);
return
-
errno_NFSERR_IO
;
...
...
@@ -793,16 +806,21 @@ nfs3_xdr_readres(struct rpc_rqst *req, u32 *p, struct nfs_readres *res)
}
hdrlen
=
(
u8
*
)
p
-
(
u8
*
)
iov
->
iov_base
;
if
(
iov
->
iov_len
>
hdrlen
)
{
if
(
iov
->
iov_len
<
hdrlen
)
{
printk
(
KERN_WARNING
"NFS: READ reply header overflowed:"
"length %d > %d
\n
"
,
hdrlen
,
iov
->
iov_len
);
return
-
errno_NFSERR_IO
;
}
else
if
(
iov
->
iov_len
!=
hdrlen
)
{
dprintk
(
"NFS: READ header is short. iovec will be shifted.
\n
"
);
xdr_shift_buf
(
&
req
->
rq_rcv_buf
,
iov
->
iov_len
-
hdrlen
);
}
recvd
=
req
->
rq_r
len
-
hdrlen
;
recvd
=
req
->
rq_r
eceived
-
hdrlen
;
if
(
count
>
recvd
)
{
printk
(
KERN_WARNING
"NFS: server cheating in read reply: "
"count %d > recvd %d
\n
"
,
count
,
recvd
);
count
=
recvd
;
res
->
eof
=
0
;
}
if
(
count
<
res
->
count
)
...
...
fs/nfs/read.c
View file @
a49520cb
...
...
@@ -424,9 +424,14 @@ nfs_readpage_result(struct rpc_task *task)
memset
(
p
+
count
,
0
,
PAGE_CACHE_SIZE
-
count
);
kunmap
(
page
);
count
=
0
;
}
else
if
(
data
->
res
.
eof
)
SetPageUptodate
(
page
);
else
SetPageError
(
page
);
}
else
{
count
-=
PAGE_CACHE_SIZE
;
SetPageUptodate
(
page
);
}
}
else
SetPageError
(
page
);
flush_dcache_page
(
page
);
...
...
fs/romfs/inode.c
View file @
a49520cb
...
...
@@ -83,6 +83,12 @@ struct romfs_inode_info {
struct
inode
vfs_inode
;
};
/* instead of private superblock data */
static
inline
unsigned
long
romfs_maxsize
(
struct
super_block
*
sb
)
{
return
(
unsigned
long
)
sb
->
u
.
generic_sbp
;
}
static
inline
struct
romfs_inode_info
*
ROMFS_I
(
struct
inode
*
inode
)
{
return
list_entry
(
inode
,
struct
romfs_inode_info
,
vfs_inode
);
...
...
@@ -113,7 +119,6 @@ static int romfs_fill_super(struct super_block *s, void *data, int silent)
/* I would parse the options here, but there are none.. :) */
sb_set_blocksize
(
s
,
ROMBSIZE
);
s
->
u
.
generic_sbp
=
(
void
*
)
0
;
s
->
s_maxbytes
=
0xFFFFFFFF
;
bh
=
sb_bread
(
s
,
0
);
...
...
@@ -139,7 +144,7 @@ static int romfs_fill_super(struct super_block *s, void *data, int silent)
}
s
->
s_magic
=
ROMFS_MAGIC
;
s
->
u
.
romfs_sb
.
s_maxsize
=
sz
;
s
->
u
.
generic_sbp
=
(
void
*
)
sz
;
s
->
s_flags
|=
MS_RDONLY
;
...
...
@@ -175,7 +180,7 @@ romfs_statfs(struct super_block *sb, struct statfs *buf)
buf
->
f_type
=
ROMFS_MAGIC
;
buf
->
f_bsize
=
ROMBSIZE
;
buf
->
f_bfree
=
buf
->
f_bavail
=
buf
->
f_ffree
;
buf
->
f_blocks
=
(
sb
->
u
.
romfs_sb
.
s_maxsize
+
ROMBSIZE
-
1
)
>>
ROMBSBITS
;
buf
->
f_blocks
=
(
romfs_maxsize
(
sb
)
+
ROMBSIZE
-
1
)
>>
ROMBSBITS
;
buf
->
f_namelen
=
ROMFS_MAXFN
;
return
0
;
}
...
...
@@ -188,7 +193,7 @@ romfs_strnlen(struct inode *i, unsigned long offset, unsigned long count)
struct
buffer_head
*
bh
;
unsigned
long
avail
,
maxsize
,
res
;
maxsize
=
i
->
i_sb
->
u
.
romfs_sb
.
s_maxsize
;
maxsize
=
romfs_maxsize
(
i
->
i_sb
)
;
if
(
offset
>=
maxsize
)
return
-
1
;
...
...
@@ -230,7 +235,7 @@ romfs_copyfrom(struct inode *i, void *dest, unsigned long offset, unsigned long
struct
buffer_head
*
bh
;
unsigned
long
avail
,
maxsize
,
res
;
maxsize
=
i
->
i_sb
->
u
.
romfs_sb
.
s_maxsize
;
maxsize
=
romfs_maxsize
(
i
->
i_sb
)
;
if
(
offset
>=
maxsize
||
count
>
maxsize
||
offset
+
count
>
maxsize
)
return
-
1
;
...
...
@@ -276,7 +281,7 @@ romfs_readdir(struct file *filp, void *dirent, filldir_t filldir)
lock_kernel
();
maxoff
=
i
->
i_sb
->
u
.
romfs_sb
.
s_maxsize
;
maxoff
=
romfs_maxsize
(
i
->
i_sb
)
;
offset
=
filp
->
f_pos
;
if
(
!
offset
)
{
...
...
@@ -339,7 +344,7 @@ romfs_lookup(struct inode *dir, struct dentry *dentry)
if
(
romfs_copyfrom
(
dir
,
&
ri
,
offset
,
ROMFH_SIZE
)
<=
0
)
goto
out
;
maxoff
=
dir
->
i_sb
->
u
.
romfs_sb
.
s_maxsize
;
maxoff
=
romfs_maxsize
(
dir
->
i_sb
)
;
offset
=
ntohl
(
ri
.
spec
)
&
ROMFH_MASK
;
/* OK, now find the file whose name is in "dentry" in the
...
...
fs/ufs/balloc.c
View file @
a49520cb
...
...
@@ -47,7 +47,7 @@ void ufs_free_fragments (struct inode * inode, unsigned fragment, unsigned count
unsigned
cgno
,
bit
,
end_bit
,
bbase
,
blkmap
,
i
,
blkno
,
cylno
;
sb
=
inode
->
i_sb
;
uspi
=
sb
->
u
.
ufs_sb
.
s_uspi
;
uspi
=
UFS_SB
(
sb
)
->
s_uspi
;
usb1
=
ubh_get_usb_first
(
USPI_UBH
);
UFSD
((
"ENTER, fragment %u, count %u
\n
"
,
fragment
,
count
))
...
...
@@ -89,7 +89,7 @@ void ufs_free_fragments (struct inode * inode, unsigned fragment, unsigned count
fs32_add
(
sb
,
&
ucg
->
cg_cs
.
cs_nffree
,
count
);
fs32_add
(
sb
,
&
usb1
->
fs_cstotal
.
cs_nffree
,
count
);
fs32_add
(
sb
,
&
sb
->
fs_cs
(
cgno
).
cs_nffree
,
count
);
fs32_add
(
sb
,
&
UFS_SB
(
sb
)
->
fs_cs
(
cgno
).
cs_nffree
,
count
);
blkmap
=
ubh_blkmap
(
UCPI_UBH
,
ucpi
->
c_freeoff
,
bbase
);
ufs_fragacct
(
sb
,
blkmap
,
ucg
->
cg_frsum
,
1
);
...
...
@@ -100,12 +100,12 @@ void ufs_free_fragments (struct inode * inode, unsigned fragment, unsigned count
if
(
ubh_isblockset
(
UCPI_UBH
,
ucpi
->
c_freeoff
,
blkno
))
{
fs32_sub
(
sb
,
&
ucg
->
cg_cs
.
cs_nffree
,
uspi
->
s_fpb
);
fs32_sub
(
sb
,
&
usb1
->
fs_cstotal
.
cs_nffree
,
uspi
->
s_fpb
);
fs32_sub
(
sb
,
&
sb
->
fs_cs
(
cgno
).
cs_nffree
,
uspi
->
s_fpb
);
if
((
sb
->
u
.
ufs_sb
.
s_flags
&
UFS_CG_MASK
)
==
UFS_CG_44BSD
)
fs32_sub
(
sb
,
&
UFS_SB
(
sb
)
->
fs_cs
(
cgno
).
cs_nffree
,
uspi
->
s_fpb
);
if
((
UFS_SB
(
sb
)
->
s_flags
&
UFS_CG_MASK
)
==
UFS_CG_44BSD
)
ufs_clusteracct
(
sb
,
ucpi
,
blkno
,
1
);
fs32_add
(
sb
,
&
ucg
->
cg_cs
.
cs_nbfree
,
1
);
fs32_add
(
sb
,
&
usb1
->
fs_cstotal
.
cs_nbfree
,
1
);
fs32_add
(
sb
,
&
sb
->
fs_cs
(
cgno
).
cs_nbfree
,
1
);
fs32_add
(
sb
,
&
UFS_SB
(
sb
)
->
fs_cs
(
cgno
).
cs_nbfree
,
1
);
cylno
=
ufs_cbtocylno
(
bbase
);
fs16_add
(
sb
,
&
ubh_cg_blks
(
ucpi
,
cylno
,
ufs_cbtorpos
(
bbase
)),
1
);
fs32_add
(
sb
,
&
ubh_cg_blktot
(
ucpi
,
cylno
),
1
);
...
...
@@ -141,7 +141,7 @@ void ufs_free_blocks (struct inode * inode, unsigned fragment, unsigned count) {
unsigned
overflow
,
cgno
,
bit
,
end_bit
,
blkno
,
i
,
cylno
;
sb
=
inode
->
i_sb
;
uspi
=
sb
->
u
.
ufs_sb
.
s_uspi
;
uspi
=
UFS_SB
(
sb
)
->
s_uspi
;
usb1
=
ubh_get_usb_first
(
USPI_UBH
);
UFSD
((
"ENTER, fragment %u, count %u
\n
"
,
fragment
,
count
))
...
...
@@ -184,13 +184,13 @@ void ufs_free_blocks (struct inode * inode, unsigned fragment, unsigned count) {
ufs_error
(
sb
,
"ufs_free_blocks"
,
"freeing free fragment"
);
}
ubh_setblock
(
UCPI_UBH
,
ucpi
->
c_freeoff
,
blkno
);
if
((
sb
->
u
.
ufs_sb
.
s_flags
&
UFS_CG_MASK
)
==
UFS_CG_44BSD
)
if
((
UFS_SB
(
sb
)
->
s_flags
&
UFS_CG_MASK
)
==
UFS_CG_44BSD
)
ufs_clusteracct
(
sb
,
ucpi
,
blkno
,
1
);
DQUOT_FREE_BLOCK
(
inode
,
uspi
->
s_fpb
);
fs32_add
(
sb
,
&
ucg
->
cg_cs
.
cs_nbfree
,
1
);
fs32_add
(
sb
,
&
usb1
->
fs_cstotal
.
cs_nbfree
,
1
);
fs32_add
(
sb
,
&
sb
->
fs_cs
(
cgno
).
cs_nbfree
,
1
);
fs32_add
(
sb
,
&
UFS_SB
(
sb
)
->
fs_cs
(
cgno
).
cs_nbfree
,
1
);
cylno
=
ufs_cbtocylno
(
i
);
fs16_add
(
sb
,
&
ubh_cg_blks
(
ucpi
,
cylno
,
ufs_cbtorpos
(
i
)),
1
);
fs32_add
(
sb
,
&
ubh_cg_blktot
(
ucpi
,
cylno
),
1
);
...
...
@@ -247,7 +247,7 @@ unsigned ufs_new_fragments (struct inode * inode, u32 * p, unsigned fragment,
UFSD
((
"ENTER, ino %lu, fragment %u, goal %u, count %u
\n
"
,
inode
->
i_ino
,
fragment
,
goal
,
count
))
sb
=
inode
->
i_sb
;
uspi
=
sb
->
u
.
ufs_sb
.
s_uspi
;
uspi
=
UFS_SB
(
sb
)
->
s_uspi
;
usb1
=
ubh_get_usb_first
(
USPI_UBH
);
*
err
=
-
ENOSPC
;
...
...
@@ -407,12 +407,12 @@ unsigned ufs_add_fragments (struct inode * inode, unsigned fragment,
UFSD
((
"ENTER, fragment %u, oldcount %u, newcount %u
\n
"
,
fragment
,
oldcount
,
newcount
))
sb
=
inode
->
i_sb
;
uspi
=
sb
->
u
.
ufs_sb
.
s_uspi
;
uspi
=
UFS_SB
(
sb
)
->
s_uspi
;
usb1
=
ubh_get_usb_first
(
USPI_UBH
);
count
=
newcount
-
oldcount
;
cgno
=
ufs_dtog
(
fragment
);
if
(
sb
->
fs_cs
(
cgno
).
cs_nffree
<
count
)
if
(
UFS_SB
(
sb
)
->
fs_cs
(
cgno
).
cs_nffree
<
count
)
return
0
;
if
((
ufs_fragnum
(
fragment
)
+
newcount
)
>
uspi
->
s_fpb
)
return
0
;
...
...
@@ -453,7 +453,7 @@ unsigned ufs_add_fragments (struct inode * inode, unsigned fragment,
}
fs32_sub
(
sb
,
&
ucg
->
cg_cs
.
cs_nffree
,
count
);
fs32_sub
(
sb
,
&
sb
->
fs_cs
(
cgno
).
cs_nffree
,
count
);
fs32_sub
(
sb
,
&
UFS_SB
(
sb
)
->
fs_cs
(
cgno
).
cs_nffree
,
count
);
fs32_sub
(
sb
,
&
usb1
->
fs_cstotal
.
cs_nffree
,
count
);
ubh_mark_buffer_dirty
(
USPI_UBH
);
...
...
@@ -470,7 +470,7 @@ unsigned ufs_add_fragments (struct inode * inode, unsigned fragment,
}
#define UFS_TEST_FREE_SPACE_CG \
ucg = (struct ufs_cylinder_group *)
sb->u.ufs_sb.
s_ucg[cgno]->b_data; \
ucg = (struct ufs_cylinder_group *)
UFS_SB(sb)->
s_ucg[cgno]->b_data; \
if (fs32_to_cpu(sb, ucg->cg_cs.cs_nbfree)) \
goto cg_found; \
for (k = count; k < uspi->s_fpb; k++) \
...
...
@@ -490,7 +490,7 @@ unsigned ufs_alloc_fragments (struct inode * inode, unsigned cgno,
UFSD
((
"ENTER, ino %lu, cgno %u, goal %u, count %u
\n
"
,
inode
->
i_ino
,
cgno
,
goal
,
count
))
sb
=
inode
->
i_sb
;
uspi
=
sb
->
u
.
ufs_sb
.
s_uspi
;
uspi
=
UFS_SB
(
sb
)
->
s_uspi
;
usb1
=
ubh_get_usb_first
(
USPI_UBH
);
oldcg
=
cgno
;
...
...
@@ -557,7 +557,7 @@ unsigned ufs_alloc_fragments (struct inode * inode, unsigned cgno,
fs32_add
(
sb
,
&
ucg
->
cg_cs
.
cs_nffree
,
i
);
fs32_add
(
sb
,
&
usb1
->
fs_cstotal
.
cs_nffree
,
i
);
fs32_add
(
sb
,
&
sb
->
fs_cs
(
cgno
).
cs_nffree
,
i
);
fs32_add
(
sb
,
&
UFS_SB
(
sb
)
->
fs_cs
(
cgno
).
cs_nffree
,
i
);
fs32_add
(
sb
,
&
ucg
->
cg_frsum
[
i
],
1
);
goto
succed
;
}
...
...
@@ -574,7 +574,7 @@ unsigned ufs_alloc_fragments (struct inode * inode, unsigned cgno,
fs32_sub
(
sb
,
&
ucg
->
cg_cs
.
cs_nffree
,
count
);
fs32_sub
(
sb
,
&
usb1
->
fs_cstotal
.
cs_nffree
,
count
);
fs32_sub
(
sb
,
&
sb
->
fs_cs
(
cgno
).
cs_nffree
,
count
);
fs32_sub
(
sb
,
&
UFS_SB
(
sb
)
->
fs_cs
(
cgno
).
cs_nffree
,
count
);
fs32_sub
(
sb
,
&
ucg
->
cg_frsum
[
allocsize
],
1
);
if
(
count
!=
allocsize
)
...
...
@@ -606,7 +606,7 @@ unsigned ufs_alloccg_block (struct inode * inode,
UFSD
((
"ENTER, goal %u
\n
"
,
goal
))
sb
=
inode
->
i_sb
;
uspi
=
sb
->
u
.
ufs_sb
.
s_uspi
;
uspi
=
UFS_SB
(
sb
)
->
s_uspi
;
usb1
=
ubh_get_usb_first
(
USPI_UBH
);
ucg
=
ubh_get_ucg
(
UCPI_UBH
);
...
...
@@ -633,7 +633,7 @@ unsigned ufs_alloccg_block (struct inode * inode,
gotit:
blkno
=
ufs_fragstoblks
(
result
);
ubh_clrblock
(
UCPI_UBH
,
ucpi
->
c_freeoff
,
blkno
);
if
((
sb
->
u
.
ufs_sb
.
s_flags
&
UFS_CG_MASK
)
==
UFS_CG_44BSD
)
if
((
UFS_SB
(
sb
)
->
s_flags
&
UFS_CG_MASK
)
==
UFS_CG_44BSD
)
ufs_clusteracct
(
sb
,
ucpi
,
blkno
,
-
1
);
if
(
DQUOT_ALLOC_BLOCK
(
inode
,
uspi
->
s_fpb
))
{
*
err
=
-
EDQUOT
;
...
...
@@ -642,7 +642,7 @@ unsigned ufs_alloccg_block (struct inode * inode,
fs32_sub
(
sb
,
&
ucg
->
cg_cs
.
cs_nbfree
,
1
);
fs32_sub
(
sb
,
&
usb1
->
fs_cstotal
.
cs_nbfree
,
1
);
fs32_sub
(
sb
,
&
sb
->
fs_cs
(
ucpi
->
c_cgx
).
cs_nbfree
,
1
);
fs32_sub
(
sb
,
&
UFS_SB
(
sb
)
->
fs_cs
(
ucpi
->
c_cgx
).
cs_nbfree
,
1
);
cylno
=
ufs_cbtocylno
(
result
);
fs16_sub
(
sb
,
&
ubh_cg_blks
(
ucpi
,
cylno
,
ufs_cbtorpos
(
result
)),
1
);
fs32_sub
(
sb
,
&
ubh_cg_blktot
(
ucpi
,
cylno
),
1
);
...
...
@@ -663,7 +663,7 @@ unsigned ufs_bitmap_search (struct super_block * sb,
UFSD
((
"ENTER, cg %u, goal %u, count %u
\n
"
,
ucpi
->
c_cgx
,
goal
,
count
))
uspi
=
sb
->
u
.
ufs_sb
.
s_uspi
;
uspi
=
UFS_SB
(
sb
)
->
s_uspi
;
usb1
=
ubh_get_usb_first
(
USPI_UBH
);
ucg
=
ubh_get_ucg
(
UCPI_UBH
);
...
...
@@ -729,7 +729,7 @@ void ufs_clusteracct(struct super_block * sb,
struct
ufs_sb_private_info
*
uspi
;
int
i
,
start
,
end
,
forw
,
back
;
uspi
=
sb
->
u
.
ufs_sb
.
s_uspi
;
uspi
=
UFS_SB
(
sb
)
->
s_uspi
;
if
(
uspi
->
s_contigsumsize
<=
0
)
return
;
...
...
fs/ufs/cylinder.c
View file @
a49520cb
...
...
@@ -36,26 +36,27 @@
static
void
ufs_read_cylinder
(
struct
super_block
*
sb
,
unsigned
cgno
,
unsigned
bitmap_nr
)
{
struct
ufs_sb_info
*
sbi
=
UFS_SB
(
sb
);
struct
ufs_sb_private_info
*
uspi
;
struct
ufs_cg_private_info
*
ucpi
;
struct
ufs_cylinder_group
*
ucg
;
unsigned
i
,
j
;
UFSD
((
"ENTER, cgno %u, bitmap_nr %u
\n
"
,
cgno
,
bitmap_nr
))
uspi
=
sb
->
u
.
ufs_sb
.
s_uspi
;
ucpi
=
sb
->
u
.
ufs_sb
.
s_ucpi
[
bitmap_nr
];
ucg
=
(
struct
ufs_cylinder_group
*
)
sb
->
u
.
ufs_sb
.
s_ucg
[
cgno
]
->
b_data
;
uspi
=
sb
i
->
s_uspi
;
ucpi
=
sb
i
->
s_ucpi
[
bitmap_nr
];
ucg
=
(
struct
ufs_cylinder_group
*
)
sb
i
->
s_ucg
[
cgno
]
->
b_data
;
UCPI_UBH
->
fragment
=
ufs_cgcmin
(
cgno
);
UCPI_UBH
->
count
=
uspi
->
s_cgsize
>>
sb
->
s_blocksize_bits
;
/*
* We have already the first fragment of cylinder group block in buffer
*/
UCPI_UBH
->
bh
[
0
]
=
sb
->
u
.
ufs_sb
.
s_ucg
[
cgno
];
UCPI_UBH
->
bh
[
0
]
=
sb
i
->
s_ucg
[
cgno
];
for
(
i
=
1
;
i
<
UCPI_UBH
->
count
;
i
++
)
if
(
!
(
UCPI_UBH
->
bh
[
i
]
=
sb_bread
(
sb
,
UCPI_UBH
->
fragment
+
i
)))
goto
failed
;
sb
->
u
.
ufs_sb
.
s_cgno
[
bitmap_nr
]
=
cgno
;
sb
i
->
s_cgno
[
bitmap_nr
]
=
cgno
;
ucpi
->
c_cgx
=
fs32_to_cpu
(
sb
,
ucg
->
cg_cgx
);
ucpi
->
c_ncyl
=
fs16_to_cpu
(
sb
,
ucg
->
cg_ncyl
);
...
...
@@ -77,8 +78,8 @@ static void ufs_read_cylinder (struct super_block * sb,
failed:
for
(
j
=
1
;
j
<
i
;
j
++
)
brelse
(
sb
->
u
.
ufs_sb
.
s_ucg
[
j
]);
sb
->
u
.
ufs_sb
.
s_cgno
[
bitmap_nr
]
=
UFS_CGNO_EMPTY
;
brelse
(
sb
i
->
s_ucg
[
j
]);
sb
i
->
s_cgno
[
bitmap_nr
]
=
UFS_CGNO_EMPTY
;
ufs_error
(
sb
,
"ufs_read_cylinder"
,
"can't read cylinder group block %u"
,
cgno
);
}
...
...
@@ -88,6 +89,7 @@ static void ufs_read_cylinder (struct super_block * sb,
*/
void
ufs_put_cylinder
(
struct
super_block
*
sb
,
unsigned
bitmap_nr
)
{
struct
ufs_sb_info
*
sbi
=
UFS_SB
(
sb
);
struct
ufs_sb_private_info
*
uspi
;
struct
ufs_cg_private_info
*
ucpi
;
struct
ufs_cylinder_group
*
ucg
;
...
...
@@ -95,15 +97,15 @@ void ufs_put_cylinder (struct super_block * sb, unsigned bitmap_nr)
UFSD
((
"ENTER, bitmap_nr %u
\n
"
,
bitmap_nr
))
uspi
=
sb
->
u
.
ufs_sb
.
s_uspi
;
if
(
sb
->
u
.
ufs_sb
.
s_cgno
[
bitmap_nr
]
==
UFS_CGNO_EMPTY
)
{
uspi
=
sb
i
->
s_uspi
;
if
(
sb
i
->
s_cgno
[
bitmap_nr
]
==
UFS_CGNO_EMPTY
)
{
UFSD
((
"EXIT
\n
"
))
return
;
}
ucpi
=
sb
->
u
.
ufs_sb
.
s_ucpi
[
bitmap_nr
];
ucpi
=
sb
i
->
s_ucpi
[
bitmap_nr
];
ucg
=
ubh_get_ucg
(
UCPI_UBH
);
if
(
uspi
->
s_ncg
>
UFS_MAX_GROUP_LOADED
&&
bitmap_nr
>=
sb
->
u
.
ufs_sb
.
s_cg_loaded
)
{
if
(
uspi
->
s_ncg
>
UFS_MAX_GROUP_LOADED
&&
bitmap_nr
>=
sb
i
->
s_cg_loaded
)
{
ufs_panic
(
sb
,
"ufs_put_cylinder"
,
"internal error"
);
return
;
}
...
...
@@ -119,7 +121,7 @@ void ufs_put_cylinder (struct super_block * sb, unsigned bitmap_nr)
brelse
(
UCPI_UBH
->
bh
[
i
]);
}
sb
->
u
.
ufs_sb
.
s_cgno
[
bitmap_nr
]
=
UFS_CGNO_EMPTY
;
sb
i
->
s_cgno
[
bitmap_nr
]
=
UFS_CGNO_EMPTY
;
UFSD
((
"EXIT
\n
"
))
}
...
...
@@ -132,13 +134,14 @@ void ufs_put_cylinder (struct super_block * sb, unsigned bitmap_nr)
struct
ufs_cg_private_info
*
ufs_load_cylinder
(
struct
super_block
*
sb
,
unsigned
cgno
)
{
struct
ufs_sb_info
*
sbi
=
UFS_SB
(
sb
);
struct
ufs_sb_private_info
*
uspi
;
struct
ufs_cg_private_info
*
ucpi
;
unsigned
cg
,
i
,
j
;
UFSD
((
"ENTER, cgno %u
\n
"
,
cgno
))
uspi
=
sb
->
u
.
ufs_sb
.
s_uspi
;
uspi
=
sb
i
->
s_uspi
;
if
(
cgno
>=
uspi
->
s_ncg
)
{
ufs_panic
(
sb
,
"ufs_load_cylinder"
,
"internal error, high number of cg"
);
return
NULL
;
...
...
@@ -146,61 +149,61 @@ struct ufs_cg_private_info * ufs_load_cylinder (
/*
* Cylinder group number cg it in cache and it was last used
*/
if
(
sb
->
u
.
ufs_sb
.
s_cgno
[
0
]
==
cgno
)
{
if
(
sb
i
->
s_cgno
[
0
]
==
cgno
)
{
UFSD
((
"EXIT
\n
"
))
return
sb
->
u
.
ufs_sb
.
s_ucpi
[
0
];
return
sb
i
->
s_ucpi
[
0
];
}
/*
* Number of cylinder groups is not higher than UFS_MAX_GROUP_LOADED
*/
if
(
uspi
->
s_ncg
<=
UFS_MAX_GROUP_LOADED
)
{
if
(
sb
->
u
.
ufs_sb
.
s_cgno
[
cgno
]
!=
UFS_CGNO_EMPTY
)
{
if
(
sb
->
u
.
ufs_sb
.
s_cgno
[
cgno
]
!=
cgno
)
{
if
(
sb
i
->
s_cgno
[
cgno
]
!=
UFS_CGNO_EMPTY
)
{
if
(
sb
i
->
s_cgno
[
cgno
]
!=
cgno
)
{
ufs_panic
(
sb
,
"ufs_load_cylinder"
,
"internal error, wrong number of cg in cache"
);
UFSD
((
"EXIT (FAILED)
\n
"
))
return
NULL
;
}
else
{
UFSD
((
"EXIT
\n
"
))
return
sb
->
u
.
ufs_sb
.
s_ucpi
[
cgno
];
return
sb
i
->
s_ucpi
[
cgno
];
}
}
else
{
ufs_read_cylinder
(
sb
,
cgno
,
cgno
);
UFSD
((
"EXIT
\n
"
))
return
sb
->
u
.
ufs_sb
.
s_ucpi
[
cgno
];
return
sb
i
->
s_ucpi
[
cgno
];
}
}
/*
* Cylinder group number cg is in cache but it was not last used,
* we will move to the first position
*/
for
(
i
=
0
;
i
<
sb
->
u
.
ufs_sb
.
s_cg_loaded
&&
sb
->
u
.
ufs_sb
.
s_cgno
[
i
]
!=
cgno
;
i
++
);
if
(
i
<
sb
->
u
.
ufs_sb
.
s_cg_loaded
&&
sb
->
u
.
ufs_sb
.
s_cgno
[
i
]
==
cgno
)
{
cg
=
sb
->
u
.
ufs_sb
.
s_cgno
[
i
];
ucpi
=
sb
->
u
.
ufs_sb
.
s_ucpi
[
i
];
for
(
i
=
0
;
i
<
sb
i
->
s_cg_loaded
&&
sbi
->
s_cgno
[
i
]
!=
cgno
;
i
++
);
if
(
i
<
sb
i
->
s_cg_loaded
&&
sbi
->
s_cgno
[
i
]
==
cgno
)
{
cg
=
sb
i
->
s_cgno
[
i
];
ucpi
=
sb
i
->
s_ucpi
[
i
];
for
(
j
=
i
;
j
>
0
;
j
--
)
{
sb
->
u
.
ufs_sb
.
s_cgno
[
j
]
=
sb
->
u
.
ufs_sb
.
s_cgno
[
j
-
1
];
sb
->
u
.
ufs_sb
.
s_ucpi
[
j
]
=
sb
->
u
.
ufs_sb
.
s_ucpi
[
j
-
1
];
sb
i
->
s_cgno
[
j
]
=
sbi
->
s_cgno
[
j
-
1
];
sb
i
->
s_ucpi
[
j
]
=
sbi
->
s_ucpi
[
j
-
1
];
}
sb
->
u
.
ufs_sb
.
s_cgno
[
0
]
=
cg
;
sb
->
u
.
ufs_sb
.
s_ucpi
[
0
]
=
ucpi
;
sb
i
->
s_cgno
[
0
]
=
cg
;
sb
i
->
s_ucpi
[
0
]
=
ucpi
;
/*
* Cylinder group number cg is not in cache, we will read it from disk
* and put it to the first position
*/
}
else
{
if
(
sb
->
u
.
ufs_sb
.
s_cg_loaded
<
UFS_MAX_GROUP_LOADED
)
sb
->
u
.
ufs_sb
.
s_cg_loaded
++
;
if
(
sb
i
->
s_cg_loaded
<
UFS_MAX_GROUP_LOADED
)
sb
i
->
s_cg_loaded
++
;
else
ufs_put_cylinder
(
sb
,
UFS_MAX_GROUP_LOADED
-
1
);
ucpi
=
sb
->
u
.
ufs_sb
.
s_ucpi
[
sb
->
u
.
ufs_sb
.
s_cg_loaded
-
1
];
for
(
j
=
sb
->
u
.
ufs_sb
.
s_cg_loaded
-
1
;
j
>
0
;
j
--
)
{
sb
->
u
.
ufs_sb
.
s_cgno
[
j
]
=
sb
->
u
.
ufs_sb
.
s_cgno
[
j
-
1
];
sb
->
u
.
ufs_sb
.
s_ucpi
[
j
]
=
sb
->
u
.
ufs_sb
.
s_ucpi
[
j
-
1
];
ucpi
=
sb
i
->
s_ucpi
[
sbi
->
s_cg_loaded
-
1
];
for
(
j
=
sb
i
->
s_cg_loaded
-
1
;
j
>
0
;
j
--
)
{
sb
i
->
s_cgno
[
j
]
=
sbi
->
s_cgno
[
j
-
1
];
sb
i
->
s_ucpi
[
j
]
=
sbi
->
s_ucpi
[
j
-
1
];
}
sb
->
u
.
ufs_sb
.
s_ucpi
[
0
]
=
ucpi
;
sb
i
->
s_ucpi
[
0
]
=
ucpi
;
ufs_read_cylinder
(
sb
,
cgno
,
0
);
}
UFSD
((
"EXIT
\n
"
))
return
sb
->
u
.
ufs_sb
.
s_ucpi
[
0
];
return
sb
i
->
s_ucpi
[
0
];
}
fs/ufs/dir.c
View file @
a49520cb
...
...
@@ -67,7 +67,7 @@ ufs_readdir (struct file * filp, void * dirent, filldir_t filldir)
lock_kernel
();
sb
=
inode
->
i_sb
;
flags
=
sb
->
u
.
ufs_sb
.
s_flags
;
flags
=
UFS_SB
(
sb
)
->
s_flags
;
UFSD
((
"ENTER, ino %lu f_pos %lu
\n
"
,
inode
->
i_ino
,
(
unsigned
long
)
filp
->
f_pos
))
...
...
@@ -308,8 +308,8 @@ int ufs_check_dir_entry (const char * function, struct inode * dir,
error_msg
=
"reclen is too small for namlen"
;
else
if
(((
char
*
)
de
-
bh
->
b_data
)
+
rlen
>
dir
->
i_sb
->
s_blocksize
)
error_msg
=
"directory entry across blocks"
;
else
if
(
fs32_to_cpu
(
sb
,
de
->
d_ino
)
>
(
sb
->
u
.
ufs_sb
.
s_uspi
->
s_ipg
*
sb
->
u
.
ufs_sb
.
s_uspi
->
s_ncg
))
else
if
(
fs32_to_cpu
(
sb
,
de
->
d_ino
)
>
(
UFS_SB
(
sb
)
->
s_uspi
->
s_ipg
*
UFS_SB
(
sb
)
->
s_uspi
->
s_ncg
))
error_msg
=
"inode out of bounds"
;
if
(
error_msg
!=
NULL
)
...
...
@@ -386,7 +386,7 @@ int ufs_add_link(struct dentry *dentry, struct inode *inode)
UFSD
((
"ENTER, name %s, namelen %u
\n
"
,
name
,
namelen
))
sb
=
dir
->
i_sb
;
uspi
=
sb
->
u
.
ufs_sb
.
s_uspi
;
uspi
=
UFS_SB
(
sb
)
->
s_uspi
;
if
(
!
namelen
)
return
-
EINVAL
;
...
...
fs/ufs/ialloc.c
View file @
a49520cb
...
...
@@ -71,7 +71,7 @@ void ufs_free_inode (struct inode * inode)
UFSD
((
"ENTER, ino %lu
\n
"
,
inode
->
i_ino
))
sb
=
inode
->
i_sb
;
uspi
=
sb
->
u
.
ufs_sb
.
s_uspi
;
uspi
=
UFS_SB
(
sb
)
->
s_uspi
;
usb1
=
ubh_get_usb_first
(
USPI_UBH
);
ino
=
inode
->
i_ino
;
...
...
@@ -112,12 +112,12 @@ void ufs_free_inode (struct inode * inode)
ucpi
->
c_irotor
=
ino
;
fs32_add
(
sb
,
&
ucg
->
cg_cs
.
cs_nifree
,
1
);
fs32_add
(
sb
,
&
usb1
->
fs_cstotal
.
cs_nifree
,
1
);
fs32_add
(
sb
,
&
sb
->
fs_cs
(
cg
).
cs_nifree
,
1
);
fs32_add
(
sb
,
&
UFS_SB
(
sb
)
->
fs_cs
(
cg
).
cs_nifree
,
1
);
if
(
is_directory
)
{
fs32_sub
(
sb
,
&
ucg
->
cg_cs
.
cs_ndir
,
1
);
fs32_sub
(
sb
,
&
usb1
->
fs_cstotal
.
cs_ndir
,
1
);
fs32_sub
(
sb
,
&
sb
->
fs_cs
(
cg
).
cs_ndir
,
1
);
fs32_sub
(
sb
,
&
UFS_SB
(
sb
)
->
fs_cs
(
cg
).
cs_ndir
,
1
);
}
}
...
...
@@ -146,6 +146,7 @@ void ufs_free_inode (struct inode * inode)
struct
inode
*
ufs_new_inode
(
struct
inode
*
dir
,
int
mode
)
{
struct
super_block
*
sb
;
struct
ufs_sb_info
*
sbi
;
struct
ufs_sb_private_info
*
uspi
;
struct
ufs_super_block_first
*
usb1
;
struct
ufs_cg_private_info
*
ucpi
;
...
...
@@ -164,7 +165,8 @@ struct inode * ufs_new_inode(struct inode * dir, int mode)
if
(
!
inode
)
return
ERR_PTR
(
-
ENOMEM
);
ufsi
=
UFS_I
(
inode
);
uspi
=
sb
->
u
.
ufs_sb
.
s_uspi
;
sbi
=
UFS_SB
(
sb
);
uspi
=
sbi
->
s_uspi
;
usb1
=
ubh_get_usb_first
(
USPI_UBH
);
lock_super
(
sb
);
...
...
@@ -173,7 +175,7 @@ struct inode * ufs_new_inode(struct inode * dir, int mode)
* Try to place the inode in its parent directory
*/
i
=
ufs_inotocg
(
dir
->
i_ino
);
if
(
sb
->
fs_cs
(
i
).
cs_nifree
)
{
if
(
sb
i
->
fs_cs
(
i
).
cs_nifree
)
{
cg
=
i
;
goto
cg_found
;
}
...
...
@@ -185,7 +187,7 @@ struct inode * ufs_new_inode(struct inode * dir, int mode)
i
+=
j
;
if
(
i
>=
uspi
->
s_ncg
)
i
-=
uspi
->
s_ncg
;
if
(
sb
->
fs_cs
(
i
).
cs_nifree
)
{
if
(
sb
i
->
fs_cs
(
i
).
cs_nifree
)
{
cg
=
i
;
goto
cg_found
;
}
...
...
@@ -199,7 +201,7 @@ struct inode * ufs_new_inode(struct inode * dir, int mode)
i
++
;
if
(
i
>=
uspi
->
s_ncg
)
i
=
0
;
if
(
sb
->
fs_cs
(
i
).
cs_nifree
)
{
if
(
sb
i
->
fs_cs
(
i
).
cs_nifree
)
{
cg
=
i
;
goto
cg_found
;
}
...
...
@@ -235,12 +237,12 @@ struct inode * ufs_new_inode(struct inode * dir, int mode)
fs32_sub
(
sb
,
&
ucg
->
cg_cs
.
cs_nifree
,
1
);
fs32_sub
(
sb
,
&
usb1
->
fs_cstotal
.
cs_nifree
,
1
);
fs32_sub
(
sb
,
&
sb
->
fs_cs
(
cg
).
cs_nifree
,
1
);
fs32_sub
(
sb
,
&
sb
i
->
fs_cs
(
cg
).
cs_nifree
,
1
);
if
(
S_ISDIR
(
mode
))
{
fs32_add
(
sb
,
&
ucg
->
cg_cs
.
cs_ndir
,
1
);
fs32_add
(
sb
,
&
usb1
->
fs_cstotal
.
cs_ndir
,
1
);
fs32_add
(
sb
,
&
sb
->
fs_cs
(
cg
).
cs_ndir
,
1
);
fs32_add
(
sb
,
&
sb
i
->
fs_cs
(
cg
).
cs_ndir
,
1
);
}
ubh_mark_buffer_dirty
(
USPI_UBH
);
...
...
fs/ufs/inode.c
View file @
a49520cb
...
...
@@ -52,7 +52,7 @@
static
int
ufs_block_to_path
(
struct
inode
*
inode
,
long
i_block
,
int
offsets
[
4
])
{
struct
ufs_sb_private_info
*
uspi
=
inode
->
i_sb
->
u
.
ufs_sb
.
s_uspi
;
struct
ufs_sb_private_info
*
uspi
=
UFS_SB
(
inode
->
i_sb
)
->
s_uspi
;
int
ptrs
=
uspi
->
s_apb
;
int
ptrs_bits
=
uspi
->
s_apbshift
;
const
long
direct_blocks
=
UFS_NDADDR
,
...
...
@@ -86,7 +86,7 @@ int ufs_frag_map(struct inode *inode, int frag)
{
struct
ufs_inode_info
*
ufsi
=
UFS_I
(
inode
);
struct
super_block
*
sb
=
inode
->
i_sb
;
struct
ufs_sb_private_info
*
uspi
=
sb
->
u
.
ufs_sb
.
s_uspi
;
struct
ufs_sb_private_info
*
uspi
=
UFS_SB
(
sb
)
->
s_uspi
;
int
mask
=
uspi
->
s_apbmask
>>
uspi
->
s_fpbshift
;
int
shift
=
uspi
->
s_apbshift
-
uspi
->
s_fpbshift
;
int
offsets
[
4
],
*
p
;
...
...
@@ -137,7 +137,7 @@ static struct buffer_head * ufs_inode_getfrag (struct inode *inode,
inode
->
i_ino
,
fragment
,
new_fragment
,
required
))
sb
=
inode
->
i_sb
;
uspi
=
sb
->
u
.
ufs_sb
.
s_uspi
;
uspi
=
UFS_SB
(
sb
)
->
s_uspi
;
block
=
ufs_fragstoblks
(
fragment
);
blockoff
=
ufs_fragnum
(
fragment
);
p
=
ufsi
->
i_u1
.
i_data
+
block
;
...
...
@@ -243,7 +243,7 @@ static struct buffer_head * ufs_block_getfrag (struct inode *inode,
u32
*
p
;
sb
=
inode
->
i_sb
;
uspi
=
sb
->
u
.
ufs_sb
.
s_uspi
;
uspi
=
UFS_SB
(
sb
)
->
s_uspi
;
block
=
ufs_fragstoblks
(
fragment
);
blockoff
=
ufs_fragnum
(
fragment
);
...
...
@@ -313,7 +313,7 @@ static struct buffer_head * ufs_block_getfrag (struct inode *inode,
static
int
ufs_getfrag_block
(
struct
inode
*
inode
,
sector_t
fragment
,
struct
buffer_head
*
bh_result
,
int
create
)
{
struct
super_block
*
sb
=
inode
->
i_sb
;
struct
ufs_sb_private_info
*
uspi
=
sb
->
u
.
ufs_sb
.
s_uspi
;
struct
ufs_sb_private_info
*
uspi
=
UFS_SB
(
sb
)
->
s_uspi
;
struct
buffer_head
*
bh
;
int
ret
,
err
,
new
;
unsigned
long
ptr
,
phys
;
...
...
@@ -483,8 +483,8 @@ void ufs_read_inode (struct inode * inode)
UFSD
((
"ENTER, ino %lu
\n
"
,
inode
->
i_ino
))
sb
=
inode
->
i_sb
;
uspi
=
sb
->
u
.
ufs_sb
.
s_uspi
;
flags
=
sb
->
u
.
ufs_sb
.
s_flags
;
uspi
=
UFS_SB
(
sb
)
->
s_uspi
;
flags
=
UFS_SB
(
sb
)
->
s_flags
;
if
(
inode
->
i_ino
<
UFS_ROOTINO
||
inode
->
i_ino
>
(
uspi
->
s_ncg
*
uspi
->
s_ipg
))
{
...
...
@@ -579,8 +579,8 @@ static int ufs_update_inode(struct inode * inode, int do_sync)
UFSD
((
"ENTER, ino %lu
\n
"
,
inode
->
i_ino
))
sb
=
inode
->
i_sb
;
uspi
=
sb
->
u
.
ufs_sb
.
s_uspi
;
flags
=
sb
->
u
.
ufs_sb
.
s_flags
;
uspi
=
UFS_SB
(
sb
)
->
s_uspi
;
flags
=
UFS_SB
(
sb
)
->
s_flags
;
if
(
inode
->
i_ino
<
UFS_ROOTINO
||
inode
->
i_ino
>
(
uspi
->
s_ncg
*
uspi
->
s_ipg
))
{
...
...
fs/ufs/namei.c
View file @
a49520cb
...
...
@@ -139,7 +139,7 @@ static int ufs_symlink (struct inode * dir, struct dentry * dentry,
if
(
IS_ERR
(
inode
))
goto
out
;
if
(
l
>
sb
->
u
.
ufs_sb
.
s_uspi
->
s_maxsymlinklen
)
{
if
(
l
>
UFS_SB
(
sb
)
->
s_uspi
->
s_maxsymlinklen
)
{
/* slow symlink */
inode
->
i_op
=
&
page_symlink_inode_operations
;
inode
->
i_mapping
->
a_ops
=
&
ufs_aops
;
...
...
fs/ufs/super.c
View file @
a49520cb
...
...
@@ -189,7 +189,7 @@ void ufs_error (struct super_block * sb, const char * function,
struct
ufs_super_block_first
*
usb1
;
va_list
args
;
uspi
=
sb
->
u
.
ufs_sb
.
s_uspi
;
uspi
=
UFS_SB
(
sb
)
->
s_uspi
;
usb1
=
ubh_get_usb_first
(
USPI_UBH
);
if
(
!
(
sb
->
s_flags
&
MS_RDONLY
))
{
...
...
@@ -201,7 +201,7 @@ void ufs_error (struct super_block * sb, const char * function,
va_start
(
args
,
fmt
);
vsprintf
(
error_buf
,
fmt
,
args
);
va_end
(
args
);
switch
(
sb
->
u
.
ufs_sb
.
s_mount_opt
&
UFS_MOUNT_ONERROR
)
{
switch
(
UFS_SB
(
sb
)
->
s_mount_opt
&
UFS_MOUNT_ONERROR
)
{
case
UFS_MOUNT_ONERROR_PANIC
:
panic
(
"UFS-fs panic (device %s): %s: %s
\n
"
,
sb
->
s_id
,
function
,
error_buf
);
...
...
@@ -221,7 +221,7 @@ void ufs_panic (struct super_block * sb, const char * function,
struct
ufs_super_block_first
*
usb1
;
va_list
args
;
uspi
=
sb
->
u
.
ufs_sb
.
s_uspi
;
uspi
=
UFS_SB
(
sb
)
->
s_uspi
;
usb1
=
ubh_get_usb_first
(
USPI_UBH
);
if
(
!
(
sb
->
s_flags
&
MS_RDONLY
))
{
...
...
@@ -317,6 +317,7 @@ static int ufs_parse_options (char * options, unsigned * mount_options)
* Read on-disk structures associated with cylinder groups
*/
int
ufs_read_cylinder_structures
(
struct
super_block
*
sb
)
{
struct
ufs_sb_info
*
sbi
=
UFS_SB
(
sb
);
struct
ufs_sb_private_info
*
uspi
;
struct
ufs_buffer_head
*
ubh
;
unsigned
char
*
base
,
*
space
;
...
...
@@ -324,7 +325,7 @@ int ufs_read_cylinder_structures (struct super_block * sb) {
UFSD
((
"ENTER
\n
"
))
uspi
=
sb
->
u
.
ufs_sb
.
s_uspi
;
uspi
=
sb
i
->
s_uspi
;
/*
* Read cs structures from (usually) first data block
...
...
@@ -343,7 +344,7 @@ int ufs_read_cylinder_structures (struct super_block * sb) {
if
(
!
ubh
)
goto
failed
;
ubh_ubhcpymem
(
space
,
ubh
,
size
);
sb
->
u
.
ufs_sb
.
s_csp
[
ufs_fragstoblks
(
i
)]
=
(
struct
ufs_csum
*
)
space
;
sb
i
->
s_csp
[
ufs_fragstoblks
(
i
)]
=
(
struct
ufs_csum
*
)
space
;
space
+=
size
;
ubh_brelse
(
ubh
);
ubh
=
NULL
;
...
...
@@ -353,41 +354,41 @@ int ufs_read_cylinder_structures (struct super_block * sb) {
* Read cylinder group (we read only first fragment from block
* at this time) and prepare internal data structures for cg caching.
*/
if
(
!
(
sb
->
u
.
ufs_sb
.
s_ucg
=
kmalloc
(
sizeof
(
struct
buffer_head
*
)
*
uspi
->
s_ncg
,
GFP_KERNEL
)))
if
(
!
(
sb
i
->
s_ucg
=
kmalloc
(
sizeof
(
struct
buffer_head
*
)
*
uspi
->
s_ncg
,
GFP_KERNEL
)))
goto
failed
;
for
(
i
=
0
;
i
<
uspi
->
s_ncg
;
i
++
)
sb
->
u
.
ufs_sb
.
s_ucg
[
i
]
=
NULL
;
sb
i
->
s_ucg
[
i
]
=
NULL
;
for
(
i
=
0
;
i
<
UFS_MAX_GROUP_LOADED
;
i
++
)
{
sb
->
u
.
ufs_sb
.
s_ucpi
[
i
]
=
NULL
;
sb
->
u
.
ufs_sb
.
s_cgno
[
i
]
=
UFS_CGNO_EMPTY
;
sb
i
->
s_ucpi
[
i
]
=
NULL
;
sb
i
->
s_cgno
[
i
]
=
UFS_CGNO_EMPTY
;
}
for
(
i
=
0
;
i
<
uspi
->
s_ncg
;
i
++
)
{
UFSD
((
"read cg %u
\n
"
,
i
))
if
(
!
(
sb
->
u
.
ufs_sb
.
s_ucg
[
i
]
=
sb_bread
(
sb
,
ufs_cgcmin
(
i
))))
if
(
!
(
sb
i
->
s_ucg
[
i
]
=
sb_bread
(
sb
,
ufs_cgcmin
(
i
))))
goto
failed
;
if
(
!
ufs_cg_chkmagic
(
sb
,
(
struct
ufs_cylinder_group
*
)
sb
->
u
.
ufs_sb
.
s_ucg
[
i
]
->
b_data
))
if
(
!
ufs_cg_chkmagic
(
sb
,
(
struct
ufs_cylinder_group
*
)
sb
i
->
s_ucg
[
i
]
->
b_data
))
goto
failed
;
#ifdef UFS_SUPER_DEBUG_MORE
ufs_print_cylinder_stuff
(
sb
,
(
struct
ufs_cylinder_group
*
)
sb
->
u
.
ufs_sb
.
s_ucg
[
i
]
->
b_data
);
ufs_print_cylinder_stuff
(
sb
,
(
struct
ufs_cylinder_group
*
)
sb
i
->
s_ucg
[
i
]
->
b_data
);
#endif
}
for
(
i
=
0
;
i
<
UFS_MAX_GROUP_LOADED
;
i
++
)
{
if
(
!
(
sb
->
u
.
ufs_sb
.
s_ucpi
[
i
]
=
kmalloc
(
sizeof
(
struct
ufs_cg_private_info
),
GFP_KERNEL
)))
if
(
!
(
sb
i
->
s_ucpi
[
i
]
=
kmalloc
(
sizeof
(
struct
ufs_cg_private_info
),
GFP_KERNEL
)))
goto
failed
;
sb
->
u
.
ufs_sb
.
s_cgno
[
i
]
=
UFS_CGNO_EMPTY
;
sb
i
->
s_cgno
[
i
]
=
UFS_CGNO_EMPTY
;
}
sb
->
u
.
ufs_sb
.
s_cg_loaded
=
0
;
sb
i
->
s_cg_loaded
=
0
;
UFSD
((
"EXIT
\n
"
))
return
1
;
failed:
if
(
base
)
kfree
(
base
);
if
(
sb
->
u
.
ufs_sb
.
s_ucg
)
{
if
(
sb
i
->
s_ucg
)
{
for
(
i
=
0
;
i
<
uspi
->
s_ncg
;
i
++
)
if
(
sb
->
u
.
ufs_sb
.
s_ucg
[
i
])
brelse
(
sb
->
u
.
ufs_sb
.
s_ucg
[
i
]);
kfree
(
sb
->
u
.
ufs_sb
.
s_ucg
);
if
(
sb
i
->
s_ucg
[
i
])
brelse
(
sbi
->
s_ucg
[
i
]);
kfree
(
sb
i
->
s_ucg
);
for
(
i
=
0
;
i
<
UFS_MAX_GROUP_LOADED
;
i
++
)
if
(
sb
->
u
.
ufs_sb
.
s_ucpi
[
i
])
kfree
(
sb
->
u
.
ufs_sb
.
s_ucpi
[
i
]);
if
(
sb
i
->
s_ucpi
[
i
])
kfree
(
sbi
->
s_ucpi
[
i
]);
}
UFSD
((
"EXIT (FAILED)
\n
"
))
return
0
;
...
...
@@ -398,6 +399,7 @@ int ufs_read_cylinder_structures (struct super_block * sb) {
* write them back to disk
*/
void
ufs_put_cylinder_structures
(
struct
super_block
*
sb
)
{
struct
ufs_sb_info
*
sbi
=
UFS_SB
(
sb
);
struct
ufs_sb_private_info
*
uspi
;
struct
ufs_buffer_head
*
ubh
;
unsigned
char
*
base
,
*
space
;
...
...
@@ -405,11 +407,11 @@ void ufs_put_cylinder_structures (struct super_block * sb) {
UFSD
((
"ENTER
\n
"
))
uspi
=
sb
->
u
.
ufs_sb
.
s_uspi
;
uspi
=
sb
i
->
s_uspi
;
size
=
uspi
->
s_cssize
;
blks
=
(
size
+
uspi
->
s_fsize
-
1
)
>>
uspi
->
s_fshift
;
base
=
space
=
(
char
*
)
sb
->
u
.
ufs_sb
.
s_csp
[
0
];
base
=
space
=
(
char
*
)
sb
i
->
s_csp
[
0
];
for
(
i
=
0
;
i
<
blks
;
i
+=
uspi
->
s_fpb
)
{
size
=
uspi
->
s_bsize
;
if
(
i
+
uspi
->
s_fpb
>
blks
)
...
...
@@ -421,21 +423,22 @@ void ufs_put_cylinder_structures (struct super_block * sb) {
ubh_mark_buffer_dirty
(
ubh
);
ubh_brelse
(
ubh
);
}
for
(
i
=
0
;
i
<
sb
->
u
.
ufs_sb
.
s_cg_loaded
;
i
++
)
{
for
(
i
=
0
;
i
<
sb
i
->
s_cg_loaded
;
i
++
)
{
ufs_put_cylinder
(
sb
,
i
);
kfree
(
sb
->
u
.
ufs_sb
.
s_ucpi
[
i
]);
kfree
(
sb
i
->
s_ucpi
[
i
]);
}
for
(;
i
<
UFS_MAX_GROUP_LOADED
;
i
++
)
kfree
(
sb
->
u
.
ufs_sb
.
s_ucpi
[
i
]);
kfree
(
sb
i
->
s_ucpi
[
i
]);
for
(
i
=
0
;
i
<
uspi
->
s_ncg
;
i
++
)
brelse
(
sb
->
u
.
ufs_sb
.
s_ucg
[
i
]);
kfree
(
sb
->
u
.
ufs_sb
.
s_ucg
);
brelse
(
sb
i
->
s_ucg
[
i
]);
kfree
(
sb
i
->
s_ucg
);
kfree
(
base
);
UFSD
((
"EXIT
\n
"
))
}
static
int
ufs_fill_super
(
struct
super_block
*
sb
,
void
*
data
,
int
silent
)
{
struct
ufs_sb_info
*
sbi
;
struct
ufs_sb_private_info
*
uspi
;
struct
ufs_super_block_first
*
usb1
;
struct
ufs_super_block_second
*
usb2
;
...
...
@@ -451,6 +454,12 @@ static int ufs_fill_super(struct super_block *sb, void *data, int silent)
UFSD
((
"ENTER
\n
"
))
sbi
=
kmalloc
(
sizeof
(
struct
ufs_sb_info
),
GFP_KERNEL
);
if
(
!
sbi
)
goto
failed_nomem
;
sb
->
u
.
generic_sbp
=
sbi
;
memset
(
sbi
,
0
,
sizeof
(
struct
ufs_sb_info
));
UFSD
((
"flag %u
\n
"
,
(
int
)(
sb
->
s_flags
&
MS_RDONLY
)))
#ifndef CONFIG_UFS_FS_WRITE
...
...
@@ -464,22 +473,22 @@ static int ufs_fill_super(struct super_block *sb, void *data, int silent)
* Set default mount options
* Parse mount options
*/
sb
->
u
.
ufs_sb
.
s_mount_opt
=
0
;
ufs_set_opt
(
sb
->
u
.
ufs_sb
.
s_mount_opt
,
ONERROR_LOCK
);
if
(
!
ufs_parse_options
((
char
*
)
data
,
&
sb
->
u
.
ufs_sb
.
s_mount_opt
))
{
sb
i
->
s_mount_opt
=
0
;
ufs_set_opt
(
sb
i
->
s_mount_opt
,
ONERROR_LOCK
);
if
(
!
ufs_parse_options
((
char
*
)
data
,
&
sb
i
->
s_mount_opt
))
{
printk
(
"wrong mount options
\n
"
);
goto
failed
;
}
if
(
!
(
sb
->
u
.
ufs_sb
.
s_mount_opt
&
UFS_MOUNT_UFSTYPE
))
{
if
(
!
(
sb
i
->
s_mount_opt
&
UFS_MOUNT_UFSTYPE
))
{
printk
(
"You didn't specify the type of your ufs filesystem
\n\n
"
"mount -t ufs -o ufstype="
"sun|sunx86|44bsd|old|hp|nextstep|netxstep-cd|openstep ...
\n\n
"
">>>WARNING<<< Wrong ufstype may corrupt your filesystem, "
"default is ufstype=old
\n
"
);
ufs_set_opt
(
sb
->
u
.
ufs_sb
.
s_mount_opt
,
UFSTYPE_OLD
);
ufs_set_opt
(
sb
i
->
s_mount_opt
,
UFSTYPE_OLD
);
}
sb
->
u
.
ufs_sb
.
s_uspi
=
uspi
=
sb
i
->
s_uspi
=
uspi
=
kmalloc
(
sizeof
(
struct
ufs_sb_private_info
),
GFP_KERNEL
);
if
(
!
uspi
)
goto
failed
;
...
...
@@ -488,7 +497,7 @@ static int ufs_fill_super(struct super_block *sb, void *data, int silent)
this but as I don't know which I'll let those in the know loosen
the rules */
switch
(
sb
->
u
.
ufs_sb
.
s_mount_opt
&
UFS_MOUNT_UFSTYPE
)
{
switch
(
sb
i
->
s_mount_opt
&
UFS_MOUNT_UFSTYPE
)
{
case
UFS_MOUNT_UFSTYPE_44BSD
:
UFSD
((
"ufstype=44bsd
\n
"
))
uspi
->
s_fsize
=
block_size
=
512
;
...
...
@@ -596,7 +605,10 @@ static int ufs_fill_super(struct super_block *sb, void *data, int silent)
}
again:
sb_set_blocksize
(
sb
,
block_size
);
if
(
sb_set_blocksize
(
sb
,
block_size
))
{
printk
(
KERN_ERR
"UFS: failed to set blocksize
\n
"
);
goto
failed
;
}
/*
* read ufs super block from device
...
...
@@ -617,7 +629,7 @@ static int ufs_fill_super(struct super_block *sb, void *data, int silent)
case
UFS_MAGIC_LFN
:
case
UFS_MAGIC_FEA
:
case
UFS_MAGIC_4GB
:
sb
->
u
.
ufs_sb
.
s_bytesex
=
BYTESEX_LE
;
sb
i
->
s_bytesex
=
BYTESEX_LE
;
goto
magic_found
;
}
switch
(
__constant_be32_to_cpu
(
usb3
->
fs_magic
))
{
...
...
@@ -625,13 +637,13 @@ static int ufs_fill_super(struct super_block *sb, void *data, int silent)
case
UFS_MAGIC_LFN
:
case
UFS_MAGIC_FEA
:
case
UFS_MAGIC_4GB
:
sb
->
u
.
ufs_sb
.
s_bytesex
=
BYTESEX_BE
;
sb
i
->
s_bytesex
=
BYTESEX_BE
;
goto
magic_found
;
}
if
((((
sb
->
u
.
ufs_sb
.
s_mount_opt
&
UFS_MOUNT_UFSTYPE
)
==
UFS_MOUNT_UFSTYPE_NEXTSTEP
)
||
((
sb
->
u
.
ufs_sb
.
s_mount_opt
&
UFS_MOUNT_UFSTYPE
)
==
UFS_MOUNT_UFSTYPE_NEXTSTEP_CD
)
||
((
sb
->
u
.
ufs_sb
.
s_mount_opt
&
UFS_MOUNT_UFSTYPE
)
==
UFS_MOUNT_UFSTYPE_OPENSTEP
))
if
((((
sb
i
->
s_mount_opt
&
UFS_MOUNT_UFSTYPE
)
==
UFS_MOUNT_UFSTYPE_NEXTSTEP
)
||
((
sb
i
->
s_mount_opt
&
UFS_MOUNT_UFSTYPE
)
==
UFS_MOUNT_UFSTYPE_NEXTSTEP_CD
)
||
((
sb
i
->
s_mount_opt
&
UFS_MOUNT_UFSTYPE
)
==
UFS_MOUNT_UFSTYPE_OPENSTEP
))
&&
uspi
->
s_sbbase
<
256
)
{
ubh_brelse_uspi
(
uspi
);
ubh
=
NULL
;
...
...
@@ -652,32 +664,32 @@ static int ufs_fill_super(struct super_block *sb, void *data, int silent)
uspi
->
s_fshift
=
fs32_to_cpu
(
sb
,
usb1
->
fs_fshift
);
if
(
uspi
->
s_fsize
&
(
uspi
->
s_fsize
-
1
))
{
printk
(
"ufs_read_super: fragment size %u is not a power of 2
\n
"
,
printk
(
KERN_ERR
"ufs_read_super: fragment size %u is not a power of 2
\n
"
,
uspi
->
s_fsize
);
goto
failed
;
}
if
(
uspi
->
s_fsize
<
512
)
{
printk
(
"ufs_read_super: fragment size %u is too small
\n
"
,
printk
(
KERN_ERR
"ufs_read_super: fragment size %u is too small
\n
"
,
uspi
->
s_fsize
);
goto
failed
;
}
if
(
uspi
->
s_fsize
>
4096
)
{
printk
(
"ufs_read_super: fragment size %u is too large
\n
"
,
printk
(
KERN_ERR
"ufs_read_super: fragment size %u is too large
\n
"
,
uspi
->
s_fsize
);
goto
failed
;
}
if
(
uspi
->
s_bsize
&
(
uspi
->
s_bsize
-
1
))
{
printk
(
"ufs_read_super: block size %u is not a power of 2
\n
"
,
printk
(
KERN_ERR
"ufs_read_super: block size %u is not a power of 2
\n
"
,
uspi
->
s_bsize
);
goto
failed
;
}
if
(
uspi
->
s_bsize
<
4096
)
{
printk
(
"ufs_read_super: block size %u is too small
\n
"
,
printk
(
KERN_ERR
"ufs_read_super: block size %u is too small
\n
"
,
uspi
->
s_bsize
);
goto
failed
;
}
if
(
uspi
->
s_bsize
/
uspi
->
s_fsize
>
8
)
{
printk
(
"ufs_read_super: too many fragments per block (%u)
\n
"
,
printk
(
KERN_ERR
"ufs_read_super: too many fragments per block (%u)
\n
"
,
uspi
->
s_bsize
/
uspi
->
s_fsize
);
goto
failed
;
}
...
...
@@ -801,12 +813,12 @@ static int ufs_fill_super(struct super_block *sb, void *data, int silent)
uspi
->
s_bpf
=
uspi
->
s_fsize
<<
3
;
uspi
->
s_bpfshift
=
uspi
->
s_fshift
+
3
;
uspi
->
s_bpfmask
=
uspi
->
s_bpf
-
1
;
if
((
sb
->
u
.
ufs_sb
.
s_mount_opt
&
UFS_MOUNT_UFSTYPE
)
==
if
((
sb
i
->
s_mount_opt
&
UFS_MOUNT_UFSTYPE
)
==
UFS_MOUNT_UFSTYPE_44BSD
)
uspi
->
s_maxsymlinklen
=
fs32_to_cpu
(
sb
,
usb3
->
fs_u2
.
fs_44
.
fs_maxsymlinklen
);
sb
->
u
.
ufs_sb
.
s_flags
=
flags
;
sb
i
->
s_flags
=
flags
;
inode
=
iget
(
sb
,
UFS_ROOTINO
);
if
(
!
inode
||
is_bad_inode
(
inode
))
...
...
@@ -831,8 +843,14 @@ static int ufs_fill_super(struct super_block *sb, void *data, int silent)
failed:
if
(
ubh
)
ubh_brelse_uspi
(
uspi
);
if
(
uspi
)
kfree
(
uspi
);
if
(
sbi
)
kfree
(
sbi
);
sb
->
u
.
generic_sbp
=
NULL
;
UFSD
((
"EXIT (FAILED)
\n
"
))
return
-
EINVAL
;
failed_nomem:
UFSD
((
"EXIT (NOMEM)
\n
"
))
return
-
ENOMEM
;
}
void
ufs_write_super
(
struct
super_block
*
sb
)
{
...
...
@@ -844,8 +862,8 @@ void ufs_write_super (struct super_block * sb) {
lock_kernel
();
UFSD
((
"ENTER
\n
"
))
flags
=
sb
->
u
.
ufs_sb
.
s_flags
;
uspi
=
sb
->
u
.
ufs_sb
.
s_uspi
;
flags
=
UFS_SB
(
sb
)
->
s_flags
;
uspi
=
UFS_SB
(
sb
)
->
s_uspi
;
usb1
=
ubh_get_usb_first
(
USPI_UBH
);
usb3
=
ubh_get_usb_third
(
USPI_UBH
);
...
...
@@ -864,17 +882,17 @@ void ufs_write_super (struct super_block * sb) {
void
ufs_put_super
(
struct
super_block
*
sb
)
{
struct
ufs_sb_
private_info
*
uspi
;
struct
ufs_sb_
info
*
sbi
=
UFS_SB
(
sb
)
;
UFSD
((
"ENTER
\n
"
))
uspi
=
sb
->
u
.
ufs_sb
.
s_uspi
;
if
(
!
(
sb
->
s_flags
&
MS_RDONLY
))
ufs_put_cylinder_structures
(
sb
);
ubh_brelse_uspi
(
uspi
);
kfree
(
sb
->
u
.
ufs_sb
.
s_uspi
);
ubh_brelse_uspi
(
sbi
->
s_uspi
);
kfree
(
sbi
->
s_uspi
);
kfree
(
sbi
);
sb
->
u
.
generic_sbp
=
NULL
;
return
;
}
...
...
@@ -887,8 +905,8 @@ int ufs_remount (struct super_block * sb, int * mount_flags, char * data)
unsigned
new_mount_opt
,
ufstype
;
unsigned
flags
;
uspi
=
sb
->
u
.
ufs_sb
.
s_uspi
;
flags
=
sb
->
u
.
ufs_sb
.
s_flags
;
uspi
=
UFS_SB
(
sb
)
->
s_uspi
;
flags
=
UFS_SB
(
sb
)
->
s_flags
;
usb1
=
ubh_get_usb_first
(
USPI_UBH
);
usb3
=
ubh_get_usb_third
(
USPI_UBH
);
...
...
@@ -896,7 +914,7 @@ int ufs_remount (struct super_block * sb, int * mount_flags, char * data)
* Allow the "check" option to be passed as a remount option.
* It is not possible to change ufstype option during remount
*/
ufstype
=
sb
->
u
.
ufs_sb
.
s_mount_opt
&
UFS_MOUNT_UFSTYPE
;
ufstype
=
UFS_SB
(
sb
)
->
s_mount_opt
&
UFS_MOUNT_UFSTYPE
;
new_mount_opt
=
0
;
ufs_set_opt
(
new_mount_opt
,
ONERROR_LOCK
);
if
(
!
ufs_parse_options
(
data
,
&
new_mount_opt
))
...
...
@@ -910,7 +928,7 @@ int ufs_remount (struct super_block * sb, int * mount_flags, char * data)
}
if
((
*
mount_flags
&
MS_RDONLY
)
==
(
sb
->
s_flags
&
MS_RDONLY
))
{
sb
->
u
.
ufs_sb
.
s_mount_opt
=
new_mount_opt
;
UFS_SB
(
sb
)
->
s_mount_opt
=
new_mount_opt
;
return
0
;
}
...
...
@@ -950,7 +968,7 @@ int ufs_remount (struct super_block * sb, int * mount_flags, char * data)
sb
->
s_flags
&=
~
MS_RDONLY
;
#endif
}
sb
->
u
.
ufs_sb
.
s_mount_opt
=
new_mount_opt
;
UFS_SB
(
sb
)
->
s_mount_opt
=
new_mount_opt
;
return
0
;
}
...
...
@@ -961,7 +979,7 @@ int ufs_statfs (struct super_block * sb, struct statfs * buf)
lock_kernel
();
uspi
=
sb
->
u
.
ufs_sb
.
s_uspi
;
uspi
=
UFS_SB
(
sb
)
->
s_uspi
;
usb1
=
ubh_get_usb_first
(
USPI_UBH
);
buf
->
f_type
=
UFS_MAGIC
;
...
...
fs/ufs/swab.h
View file @
a49520cb
...
...
@@ -25,7 +25,7 @@ enum {
static
__inline
u64
fs64_to_cpu
(
struct
super_block
*
sbp
,
u64
n
)
{
if
(
sbp
->
u
.
ufs_sb
.
s_bytesex
==
BYTESEX_LE
)
if
(
UFS_SB
(
sbp
)
->
s_bytesex
==
BYTESEX_LE
)
return
le64_to_cpu
(
n
);
else
return
be64_to_cpu
(
n
);
...
...
@@ -34,7 +34,7 @@ fs64_to_cpu(struct super_block *sbp, u64 n)
static
__inline
u64
cpu_to_fs64
(
struct
super_block
*
sbp
,
u64
n
)
{
if
(
sbp
->
u
.
ufs_sb
.
s_bytesex
==
BYTESEX_LE
)
if
(
UFS_SB
(
sbp
)
->
s_bytesex
==
BYTESEX_LE
)
return
cpu_to_le64
(
n
);
else
return
cpu_to_be64
(
n
);
...
...
@@ -43,7 +43,7 @@ cpu_to_fs64(struct super_block *sbp, u64 n)
static
__inline
u32
fs64_add
(
struct
super_block
*
sbp
,
u32
*
n
,
int
d
)
{
if
(
sbp
->
u
.
ufs_sb
.
s_bytesex
==
BYTESEX_LE
)
if
(
UFS_SB
(
sbp
)
->
s_bytesex
==
BYTESEX_LE
)
return
*
n
=
cpu_to_le64
(
le64_to_cpu
(
*
n
)
+
d
);
else
return
*
n
=
cpu_to_be64
(
be64_to_cpu
(
*
n
)
+
d
);
...
...
@@ -52,7 +52,7 @@ fs64_add(struct super_block *sbp, u32 *n, int d)
static
__inline
u32
fs64_sub
(
struct
super_block
*
sbp
,
u32
*
n
,
int
d
)
{
if
(
sbp
->
u
.
ufs_sb
.
s_bytesex
==
BYTESEX_LE
)
if
(
UFS_SB
(
sbp
)
->
s_bytesex
==
BYTESEX_LE
)
return
*
n
=
cpu_to_le64
(
le64_to_cpu
(
*
n
)
-
d
);
else
return
*
n
=
cpu_to_be64
(
be64_to_cpu
(
*
n
)
-
d
);
...
...
@@ -61,7 +61,7 @@ fs64_sub(struct super_block *sbp, u32 *n, int d)
static
__inline
u32
fs32_to_cpu
(
struct
super_block
*
sbp
,
u32
n
)
{
if
(
sbp
->
u
.
ufs_sb
.
s_bytesex
==
BYTESEX_LE
)
if
(
UFS_SB
(
sbp
)
->
s_bytesex
==
BYTESEX_LE
)
return
le32_to_cpu
(
n
);
else
return
be32_to_cpu
(
n
);
...
...
@@ -70,7 +70,7 @@ fs32_to_cpu(struct super_block *sbp, u32 n)
static
__inline
u32
cpu_to_fs32
(
struct
super_block
*
sbp
,
u32
n
)
{
if
(
sbp
->
u
.
ufs_sb
.
s_bytesex
==
BYTESEX_LE
)
if
(
UFS_SB
(
sbp
)
->
s_bytesex
==
BYTESEX_LE
)
return
cpu_to_le32
(
n
);
else
return
cpu_to_be32
(
n
);
...
...
@@ -79,7 +79,7 @@ cpu_to_fs32(struct super_block *sbp, u32 n)
static
__inline
u32
fs32_add
(
struct
super_block
*
sbp
,
u32
*
n
,
int
d
)
{
if
(
sbp
->
u
.
ufs_sb
.
s_bytesex
==
BYTESEX_LE
)
if
(
UFS_SB
(
sbp
)
->
s_bytesex
==
BYTESEX_LE
)
return
*
n
=
cpu_to_le32
(
le32_to_cpu
(
*
n
)
+
d
);
else
return
*
n
=
cpu_to_be32
(
be32_to_cpu
(
*
n
)
+
d
);
...
...
@@ -88,7 +88,7 @@ fs32_add(struct super_block *sbp, u32 *n, int d)
static
__inline
u32
fs32_sub
(
struct
super_block
*
sbp
,
u32
*
n
,
int
d
)
{
if
(
sbp
->
u
.
ufs_sb
.
s_bytesex
==
BYTESEX_LE
)
if
(
UFS_SB
(
sbp
)
->
s_bytesex
==
BYTESEX_LE
)
return
*
n
=
cpu_to_le32
(
le32_to_cpu
(
*
n
)
-
d
);
else
return
*
n
=
cpu_to_be32
(
be32_to_cpu
(
*
n
)
-
d
);
...
...
@@ -97,7 +97,7 @@ fs32_sub(struct super_block *sbp, u32 *n, int d)
static
__inline
u16
fs16_to_cpu
(
struct
super_block
*
sbp
,
u16
n
)
{
if
(
sbp
->
u
.
ufs_sb
.
s_bytesex
==
BYTESEX_LE
)
if
(
UFS_SB
(
sbp
)
->
s_bytesex
==
BYTESEX_LE
)
return
le16_to_cpu
(
n
);
else
return
be16_to_cpu
(
n
);
...
...
@@ -106,7 +106,7 @@ fs16_to_cpu(struct super_block *sbp, u16 n)
static
__inline
u16
cpu_to_fs16
(
struct
super_block
*
sbp
,
u16
n
)
{
if
(
sbp
->
u
.
ufs_sb
.
s_bytesex
==
BYTESEX_LE
)
if
(
UFS_SB
(
sbp
)
->
s_bytesex
==
BYTESEX_LE
)
return
cpu_to_le16
(
n
);
else
return
cpu_to_be16
(
n
);
...
...
@@ -115,7 +115,7 @@ cpu_to_fs16(struct super_block *sbp, u16 n)
static
__inline
u16
fs16_add
(
struct
super_block
*
sbp
,
u16
*
n
,
int
d
)
{
if
(
sbp
->
u
.
ufs_sb
.
s_bytesex
==
BYTESEX_LE
)
if
(
UFS_SB
(
sbp
)
->
s_bytesex
==
BYTESEX_LE
)
return
*
n
=
cpu_to_le16
(
le16_to_cpu
(
*
n
)
+
d
);
else
return
*
n
=
cpu_to_be16
(
be16_to_cpu
(
*
n
)
+
d
);
...
...
@@ -124,7 +124,7 @@ fs16_add(struct super_block *sbp, u16 *n, int d)
static
__inline
u16
fs16_sub
(
struct
super_block
*
sbp
,
u16
*
n
,
int
d
)
{
if
(
sbp
->
u
.
ufs_sb
.
s_bytesex
==
BYTESEX_LE
)
if
(
UFS_SB
(
sbp
)
->
s_bytesex
==
BYTESEX_LE
)
return
*
n
=
cpu_to_le16
(
le16_to_cpu
(
*
n
)
-
d
);
else
return
*
n
=
cpu_to_be16
(
be16_to_cpu
(
*
n
)
-
d
);
...
...
fs/ufs/truncate.c
View file @
a49520cb
...
...
@@ -82,7 +82,7 @@ static int ufs_trunc_direct (struct inode * inode)
UFSD
((
"ENTER
\n
"
))
sb
=
inode
->
i_sb
;
uspi
=
sb
->
u
.
ufs_sb
.
s_uspi
;
uspi
=
UFS_SB
(
sb
)
->
s_uspi
;
frag_to_free
=
0
;
free_count
=
0
;
...
...
@@ -212,7 +212,7 @@ static int ufs_trunc_indirect (struct inode * inode, unsigned offset, u32 * p)
UFSD
((
"ENTER
\n
"
))
sb
=
inode
->
i_sb
;
uspi
=
sb
->
u
.
ufs_sb
.
s_uspi
;
uspi
=
UFS_SB
(
sb
)
->
s_uspi
;
frag_to_free
=
0
;
free_count
=
0
;
...
...
@@ -306,7 +306,7 @@ static int ufs_trunc_dindirect (struct inode * inode, unsigned offset, u32 * p)
UFSD
((
"ENTER
\n
"
))
sb
=
inode
->
i_sb
;
uspi
=
sb
->
u
.
ufs_sb
.
s_uspi
;
uspi
=
UFS_SB
(
sb
)
->
s_uspi
;
dindirect_block
=
(
DIRECT_BLOCK
>
offset
)
?
((
DIRECT_BLOCK
-
offset
)
>>
uspi
->
s_apbshift
)
:
0
;
...
...
@@ -374,7 +374,7 @@ static int ufs_trunc_tindirect (struct inode * inode)
UFSD
((
"ENTER
\n
"
))
sb
=
inode
->
i_sb
;
uspi
=
sb
->
u
.
ufs_sb
.
s_uspi
;
uspi
=
UFS_SB
(
sb
)
->
s_uspi
;
retry
=
0
;
tindirect_block
=
(
DIRECT_BLOCK
>
(
UFS_NDADDR
+
uspi
->
s_apb
+
uspi
->
s_2apb
))
...
...
@@ -435,7 +435,7 @@ void ufs_truncate (struct inode * inode)
UFSD
((
"ENTER
\n
"
))
sb
=
inode
->
i_sb
;
uspi
=
sb
->
u
.
ufs_sb
.
s_uspi
;
uspi
=
UFS_SB
(
sb
)
->
s_uspi
;
if
(
!
(
S_ISREG
(
inode
->
i_mode
)
||
S_ISDIR
(
inode
->
i_mode
)
||
S_ISLNK
(
inode
->
i_mode
)))
return
;
...
...
fs/ufs/util.h
View file @
a49520cb
...
...
@@ -31,7 +31,7 @@ static inline s32
ufs_get_fs_state
(
struct
super_block
*
sb
,
struct
ufs_super_block_first
*
usb1
,
struct
ufs_super_block_third
*
usb3
)
{
switch
(
sb
->
u
.
ufs_sb
.
s_flags
&
UFS_ST_MASK
)
{
switch
(
UFS_SB
(
sb
)
->
s_flags
&
UFS_ST_MASK
)
{
case
UFS_ST_SUN
:
return
fs32_to_cpu
(
sb
,
usb3
->
fs_u2
.
fs_sun
.
fs_state
);
case
UFS_ST_SUNx86
:
...
...
@@ -46,7 +46,7 @@ static inline void
ufs_set_fs_state
(
struct
super_block
*
sb
,
struct
ufs_super_block_first
*
usb1
,
struct
ufs_super_block_third
*
usb3
,
s32
value
)
{
switch
(
sb
->
u
.
ufs_sb
.
s_flags
&
UFS_ST_MASK
)
{
switch
(
UFS_SB
(
sb
)
->
s_flags
&
UFS_ST_MASK
)
{
case
UFS_ST_SUN
:
usb3
->
fs_u2
.
fs_sun
.
fs_state
=
cpu_to_fs32
(
sb
,
value
);
break
;
...
...
@@ -63,7 +63,7 @@ static inline u32
ufs_get_fs_npsect
(
struct
super_block
*
sb
,
struct
ufs_super_block_first
*
usb1
,
struct
ufs_super_block_third
*
usb3
)
{
if
((
sb
->
u
.
ufs_sb
.
s_flags
&
UFS_ST_MASK
)
==
UFS_ST_SUNx86
)
if
((
UFS_SB
(
sb
)
->
s_flags
&
UFS_ST_MASK
)
==
UFS_ST_SUNx86
)
return
fs32_to_cpu
(
sb
,
usb3
->
fs_u2
.
fs_sunx86
.
fs_npsect
);
else
return
fs32_to_cpu
(
sb
,
usb1
->
fs_u1
.
fs_sun
.
fs_npsect
);
...
...
@@ -74,7 +74,7 @@ ufs_get_fs_qbmask(struct super_block *sb, struct ufs_super_block_third *usb3)
{
u64
tmp
;
switch
(
sb
->
u
.
ufs_sb
.
s_flags
&
UFS_ST_MASK
)
{
switch
(
UFS_SB
(
sb
)
->
s_flags
&
UFS_ST_MASK
)
{
case
UFS_ST_SUN
:
((
u32
*
)
&
tmp
)[
0
]
=
usb3
->
fs_u2
.
fs_sun
.
fs_qbmask
[
0
];
((
u32
*
)
&
tmp
)[
1
]
=
usb3
->
fs_u2
.
fs_sun
.
fs_qbmask
[
1
];
...
...
@@ -97,7 +97,7 @@ ufs_get_fs_qfmask(struct super_block *sb, struct ufs_super_block_third *usb3)
{
u64
tmp
;
switch
(
sb
->
u
.
ufs_sb
.
s_flags
&
UFS_ST_MASK
)
{
switch
(
UFS_SB
(
sb
)
->
s_flags
&
UFS_ST_MASK
)
{
case
UFS_ST_SUN
:
((
u32
*
)
&
tmp
)[
0
]
=
usb3
->
fs_u2
.
fs_sun
.
fs_qfmask
[
0
];
((
u32
*
)
&
tmp
)[
1
]
=
usb3
->
fs_u2
.
fs_sun
.
fs_qfmask
[
1
];
...
...
@@ -118,7 +118,7 @@ ufs_get_fs_qfmask(struct super_block *sb, struct ufs_super_block_third *usb3)
static
inline
u16
ufs_get_de_namlen
(
struct
super_block
*
sb
,
struct
ufs_dir_entry
*
de
)
{
if
((
sb
->
u
.
ufs_sb
.
s_flags
&
UFS_DE_MASK
)
==
UFS_DE_OLD
)
if
((
UFS_SB
(
sb
)
->
s_flags
&
UFS_DE_MASK
)
==
UFS_DE_OLD
)
return
fs16_to_cpu
(
sb
,
de
->
d_u
.
d_namlen
);
else
return
de
->
d_u
.
d_44
.
d_namlen
;
/* XXX this seems wrong */
...
...
@@ -127,7 +127,7 @@ ufs_get_de_namlen(struct super_block *sb, struct ufs_dir_entry *de)
static
inline
void
ufs_set_de_namlen
(
struct
super_block
*
sb
,
struct
ufs_dir_entry
*
de
,
u16
value
)
{
if
((
sb
->
u
.
ufs_sb
.
s_flags
&
UFS_DE_MASK
)
==
UFS_DE_OLD
)
if
((
UFS_SB
(
sb
)
->
s_flags
&
UFS_DE_MASK
)
==
UFS_DE_OLD
)
de
->
d_u
.
d_namlen
=
cpu_to_fs16
(
sb
,
value
);
else
de
->
d_u
.
d_44
.
d_namlen
=
value
;
/* XXX this seems wrong */
...
...
@@ -136,7 +136,7 @@ ufs_set_de_namlen(struct super_block *sb, struct ufs_dir_entry *de, u16 value)
static
inline
void
ufs_set_de_type
(
struct
super_block
*
sb
,
struct
ufs_dir_entry
*
de
,
int
mode
)
{
if
((
sb
->
u
.
ufs_sb
.
s_flags
&
UFS_DE_MASK
)
!=
UFS_DE_44BSD
)
if
((
UFS_SB
(
sb
)
->
s_flags
&
UFS_DE_MASK
)
!=
UFS_DE_44BSD
)
return
;
/*
...
...
@@ -172,7 +172,7 @@ ufs_set_de_type(struct super_block *sb, struct ufs_dir_entry *de, int mode)
static
inline
u32
ufs_get_inode_uid
(
struct
super_block
*
sb
,
struct
ufs_inode
*
inode
)
{
switch
(
sb
->
u
.
ufs_sb
.
s_flags
&
UFS_UID_MASK
)
{
switch
(
UFS_SB
(
sb
)
->
s_flags
&
UFS_UID_MASK
)
{
case
UFS_UID_EFT
:
return
fs32_to_cpu
(
sb
,
inode
->
ui_u3
.
ui_sun
.
ui_uid
);
case
UFS_UID_44BSD
:
...
...
@@ -185,7 +185,7 @@ ufs_get_inode_uid(struct super_block *sb, struct ufs_inode *inode)
static
inline
void
ufs_set_inode_uid
(
struct
super_block
*
sb
,
struct
ufs_inode
*
inode
,
u32
value
)
{
switch
(
sb
->
u
.
ufs_sb
.
s_flags
&
UFS_UID_MASK
)
{
switch
(
UFS_SB
(
sb
)
->
s_flags
&
UFS_UID_MASK
)
{
case
UFS_UID_EFT
:
inode
->
ui_u3
.
ui_sun
.
ui_uid
=
cpu_to_fs32
(
sb
,
value
);
break
;
...
...
@@ -199,7 +199,7 @@ ufs_set_inode_uid(struct super_block *sb, struct ufs_inode *inode, u32 value)
static
inline
u32
ufs_get_inode_gid
(
struct
super_block
*
sb
,
struct
ufs_inode
*
inode
)
{
switch
(
sb
->
u
.
ufs_sb
.
s_flags
&
UFS_UID_MASK
)
{
switch
(
UFS_SB
(
sb
)
->
s_flags
&
UFS_UID_MASK
)
{
case
UFS_UID_EFT
:
return
fs32_to_cpu
(
sb
,
inode
->
ui_u3
.
ui_sun
.
ui_gid
);
case
UFS_UID_44BSD
:
...
...
@@ -212,7 +212,7 @@ ufs_get_inode_gid(struct super_block *sb, struct ufs_inode *inode)
static
inline
void
ufs_set_inode_gid
(
struct
super_block
*
sb
,
struct
ufs_inode
*
inode
,
u32
value
)
{
switch
(
sb
->
u
.
ufs_sb
.
s_flags
&
UFS_UID_MASK
)
{
switch
(
UFS_SB
(
sb
)
->
s_flags
&
UFS_UID_MASK
)
{
case
UFS_UID_EFT
:
inode
->
ui_u3
.
ui_sun
.
ui_gid
=
cpu_to_fs32
(
sb
,
value
);
break
;
...
...
@@ -481,7 +481,7 @@ static inline void ufs_fragacct (struct super_block * sb, unsigned blockmap,
struct
ufs_sb_private_info
*
uspi
;
unsigned
fragsize
,
pos
;
uspi
=
sb
->
u
.
ufs_sb
.
s_uspi
;
uspi
=
UFS_SB
(
sb
)
->
s_uspi
;
fragsize
=
0
;
for
(
pos
=
0
;
pos
<
uspi
->
s_fpb
;
pos
++
)
{
...
...
include/linux/fs.h
View file @
a49520cb
...
...
@@ -624,8 +624,6 @@ extern void __kill_fasync(struct fasync_struct *, int, int);
#include <linux/ext3_fs_sb.h>
#include <linux/hpfs_fs_sb.h>
#include <linux/ufs_fs_sb.h>
#include <linux/romfs_fs_sb.h>
extern
struct
list_head
super_blocks
;
extern
spinlock_t
sb_lock
;
...
...
@@ -670,8 +668,6 @@ struct super_block {
union
{
struct
ext3_sb_info
ext3_sb
;
struct
hpfs_sb_info
hpfs_sb
;
struct
ufs_sb_info
ufs_sb
;
struct
romfs_sb_info
romfs_sb
;
void
*
generic_sbp
;
}
u
;
/*
...
...
include/linux/preempt.h
View file @
a49520cb
#ifndef __LINUX_PREEMPT_H
#define __LINUX_PREEMPT_H
/*
* include/linux/preempt.h - macros for accessing and manipulating
* preempt_count (used for kernel preemption, interrupt count, etc.)
*/
#include <linux/config.h>
#define preempt_count() (current_thread_info()->preempt_count)
...
...
@@ -31,17 +36,16 @@ do { \
barrier(); \
} while (0)
#define preempt_
enable
() \
#define preempt_
check_resched
() \
do { \
preempt_enable_no_resched(); \
if (unlikely(test_thread_flag(TIF_NEED_RESCHED))) \
preempt_schedule(); \
} while (0)
#define preempt_
check_resched
() \
#define preempt_
enable
() \
do { \
if (unlikely(test_thread_flag(TIF_NEED_RESCHED)))
\
preempt_schedule
(); \
preempt_enable_no_resched();
\
preempt_check_resched
(); \
} while (0)
#define inc_preempt_count_non_preempt() do { } while (0)
...
...
@@ -50,7 +54,7 @@ do { \
#else
#define preempt_disable() do { } while (0)
#define preempt_enable_no_resched() do {
} while
(0)
#define preempt_enable_no_resched() do {
} while
(0)
#define preempt_enable() do { } while (0)
#define preempt_check_resched() do { } while (0)
...
...
include/linux/romfs_fs_sb.h
deleted
100644 → 0
View file @
beecec57
#ifndef __ROMFS_FS_SB
#define __ROMFS_FS_SB
/* romfs superblock in-core data */
struct
romfs_sb_info
{
unsigned
long
s_maxsize
;
};
#endif
include/linux/spinlock.h
View file @
a49520cb
#ifndef __LINUX_SPINLOCK_H
#define __LINUX_SPINLOCK_H
/*
* include/linux/spinlock.h - generic locking declarations
*/
#include <linux/config.h>
#include <linux/preempt.h>
#include <linux/linkage.h>
#include <linux/compiler.h>
#include <linux/thread_info.h>
#include <linux/kernel.h>
#include <linux/stringify.h>
#include <asm/system.h>
/*
* These are the generic versions of the spinlocks and read-write
* locks..
* Must define these before including other files, inline functions need them
*/
#define spin_lock_irqsave(lock, flags) do { local_irq_save(flags); spin_lock(lock); } while (0)
#define spin_lock_irq(lock) do { local_irq_disable(); spin_lock(lock); } while (0)
#define spin_lock_bh(lock) do { local_bh_disable(); spin_lock(lock); } while (0)
#define read_lock_irqsave(lock, flags) do { local_irq_save(flags); read_lock(lock); } while (0)
#define read_lock_irq(lock) do { local_irq_disable(); read_lock(lock); } while (0)
#define read_lock_bh(lock) do { local_bh_disable(); read_lock(lock); } while (0)
#define write_lock_irqsave(lock, flags) do { local_irq_save(flags); write_lock(lock); } while (0)
#define write_lock_irq(lock) do { local_irq_disable(); write_lock(lock); } while (0)
#define write_lock_bh(lock) do { local_bh_disable(); write_lock(lock); } while (0)
#define spin_unlock_irqrestore(lock, flags) do { _raw_spin_unlock(lock); local_irq_restore(flags); preempt_enable(); } while (0)
#define _raw_spin_unlock_irqrestore(lock, flags) do { _raw_spin_unlock(lock); local_irq_restore(flags); } while (0)
#define spin_unlock_irq(lock) do { _raw_spin_unlock(lock); local_irq_enable(); preempt_enable(); } while (0)
#define spin_unlock_bh(lock) do { spin_unlock(lock); local_bh_enable(); } while (0)
#define read_unlock_irqrestore(lock, flags) do { _raw_read_unlock(lock); local_irq_restore(flags); preempt_enable(); } while (0)
#define read_unlock_irq(lock) do { _raw_read_unlock(lock); local_irq_enable(); preempt_enable(); } while (0)
#define read_unlock_bh(lock) do { read_unlock(lock); local_bh_enable(); } while (0)
#define write_unlock_irqrestore(lock, flags) do { _raw_write_unlock(lock); local_irq_restore(flags); preempt_enable(); } while (0)
#define write_unlock_irq(lock) do { _raw_write_unlock(lock); local_irq_enable(); preempt_enable(); } while (0)
#define write_unlock_bh(lock) do { write_unlock(lock); local_bh_enable(); } while (0)
#define spin_trylock_bh(lock) ({ int __r; local_bh_disable();\
__r = spin_trylock(lock); \
if (!__r) local_bh_enable(); \
__r; })
/* Must define these before including other files, inline functions need them */
#include <linux/stringify.h>
#define LOCK_SECTION_NAME \
".text.lock." __stringify(KBUILD_BASENAME)
...
...
@@ -60,11 +31,17 @@
#define LOCK_SECTION_END \
".previous\n\t"
/*
* If CONFIG_SMP is set, pull in the _raw_* definitions
*/
#ifdef CONFIG_SMP
#include <asm/spinlock.h>
#elif !defined(spin_lock_init)
/* !SMP and spin_lock_init not previously
defined (e.g. by including asm/spinlock.h */
/*
* !CONFIG_SMP and spin_lock_init not previously defined
* (e.g. by including include/asm/spinlock.h)
*/
#elif !defined(spin_lock_init)
#ifndef CONFIG_PREEMPT
# define atomic_dec_and_lock(atomic,lock) atomic_dec_and_test(atomic)
...
...
@@ -72,55 +49,42 @@
#endif
/*
* Your basic spinlocks, allowing only a single CPU anywhere
*
* Most gcc versions have a nasty bug with empty initializers.
* gcc versions before ~2.95 have a nasty bug with empty initializers.
*/
#if (__GNUC__ > 2)
typedef
struct
{
}
spinlock_t
;
# define SPIN_LOCK_UNLOCKED (spinlock_t) { }
typedef
struct
{
}
rwlock_t
;
#define SPIN_LOCK_UNLOCKED (spinlock_t) { }
#define RW_LOCK_UNLOCKED (rwlock_t) { }
#else
typedef
struct
{
int
gcc_is_buggy
;
}
spinlock_t
;
# define SPIN_LOCK_UNLOCKED (spinlock_t) { 0 }
typedef
struct
{
int
gcc_is_buggy
;
}
rwlock_t
;
#define SPIN_LOCK_UNLOCKED (spinlock_t) { 0 }
#define RW_LOCK_UNLOCKED (rwlock_t) { 0 }
#endif
/*
* If CONFIG_SMP is unset, declare the _raw_* definitions as nops
*/
#define spin_lock_init(lock) do { (void)(lock); } while(0)
#define _raw_spin_lock(lock) (void)(lock)
/* Not "unused variable". */
#define _raw_spin_lock(lock) (void)(lock)
#define spin_is_locked(lock) ((void)(lock), 0)
#define _raw_spin_trylock(lock) ((void)(lock), 1)
#define spin_unlock_wait(lock) do { (void)(lock); } while(0)
#define _raw_spin_unlock(lock) do { (void)(lock); } while(0)
/*
* Read-write spinlocks, allowing multiple readers
* but only one writer.
*
* NOTE! it is quite common to have readers in interrupts
* but no interrupt writers. For those circumstances we
* can "mix" irq-safe locks - any writer needs to get a
* irq-safe write-lock, but readers can get non-irqsafe
* read-locks.
*
* Most gcc versions have a nasty bug with empty initializers.
*/
#if (__GNUC__ > 2)
typedef
struct
{
}
rwlock_t
;
#define RW_LOCK_UNLOCKED (rwlock_t) { }
#else
typedef
struct
{
int
gcc_is_buggy
;
}
rwlock_t
;
#define RW_LOCK_UNLOCKED (rwlock_t) { 0 }
#endif
#define rwlock_init(lock) do { } while(0)
#define _raw_read_lock(lock) (void)(lock)
/* Not "unused variable". */
#define _raw_read_lock(lock) (void)(lock)
#define _raw_read_unlock(lock) do { } while(0)
#define _raw_write_lock(lock) (void)(lock)
/* Not "unused variable". */
#define _raw_write_lock(lock) (void)(lock)
#define _raw_write_unlock(lock) do { } while(0)
#endif
/* !SMP */
#ifdef CONFIG_PREEMPT
/*
* Define the various spin_lock and rw_lock methods. Note we define these
* regardless of whether CONFIG_SMP or CONFIG_PREEMPT are set. The various
* methods are defined as nops in the case they are not required.
*/
#define spin_lock(lock) \
do { \
preempt_disable(); \
...
...
@@ -129,31 +93,175 @@ do { \
#define spin_trylock(lock) ({preempt_disable(); _raw_spin_trylock(lock) ? \
1 : ({preempt_enable(); 0;});})
#define spin_unlock(lock) \
do { \
_raw_spin_unlock(lock); \
preempt_enable(); \
} while (0)
#define read_lock(lock) ({preempt_disable(); _raw_read_lock(lock);})
#define read_unlock(lock) ({_raw_read_unlock(lock); preempt_enable();})
#define write_lock(lock) ({preempt_disable(); _raw_write_lock(lock);})
#define write_unlock(lock) ({_raw_write_unlock(lock); preempt_enable();})
#define read_lock(lock) \
do { \
preempt_disable(); \
_raw_read_lock(lock); \
} while(0)
#define read_unlock(lock) \
do { \
_raw_read_unlock(lock); \
preempt_enable(); \
} while(0)
#define write_lock(lock) \
do { \
preempt_disable(); \
_raw_write_lock(lock); \
} while(0)
#define write_unlock(lock) \
do { \
_raw_write_unlock(lock); \
preempt_enable(); \
} while(0)
#define write_trylock(lock) ({preempt_disable();_raw_write_trylock(lock) ? \
1 : ({preempt_enable(); 0;});})
#else
#define spin_lock_irqsave(lock, flags) \
do { \
local_irq_save(flags); \
preempt_disable(); \
_raw_spin_lock(lock); \
} while (0)
#define spin_lock(lock) _raw_spin_lock(lock)
#define spin_trylock(lock) _raw_spin_trylock(lock)
#define spin_unlock(lock) _raw_spin_unlock(lock)
#define spin_lock_irq(lock) \
do { \
local_irq_disable(); \
preempt_disable(); \
_raw_spin_lock(lock); \
} while (0)
#define read_lock(lock) _raw_read_lock(lock)
#define read_unlock(lock) _raw_read_unlock(lock)
#define write_lock(lock) _raw_write_lock(lock)
#define write_unlock(lock) _raw_write_unlock(lock)
#define write_trylock(lock) _raw_write_trylock(lock)
#endif
#define spin_lock_bh(lock) \
do { \
local_bh_disable(); \
preempt_disable(); \
_raw_spin_lock(lock); \
} while (0)
#define read_lock_irqsave(lock, flags) \
do { \
local_irq_save(flags); \
preempt_disable(); \
_raw_read_lock(lock); \
} while (0)
#define read_lock_irq(lock) \
do { \
local_irq_disable(); \
preempt_disable(); \
_raw_read_lock(lock); \
} while (0)
#define read_lock_bh(lock) \
do { \
local_bh_disable(); \
preempt_disable(); \
_raw_read_lock(lock); \
} while (0)
#define write_lock_irqsave(lock, flags) \
do { \
local_irq_save(flags); \
preempt_disable(); \
_raw_write_lock(lock); \
} while (0)
#define write_lock_irq(lock) \
do { \
local_irq_disable(); \
preempt_disable(); \
_raw_write_lock(lock); \
} while (0)
#define write_lock_bh(lock) \
do { \
local_bh_disable(); \
preempt_disable(); \
_raw_write_lock(lock); \
} while (0)
#define spin_unlock_irqrestore(lock, flags) \
do { \
_raw_spin_unlock(lock); \
local_irq_restore(flags); \
preempt_enable(); \
} while (0)
#define _raw_spin_unlock_irqrestore(lock, flags) \
do { \
_raw_spin_unlock(lock); \
local_irq_restore(flags); \
} while (0)
#define spin_unlock_irq(lock) \
do { \
_raw_spin_unlock(lock); \
local_irq_enable(); \
preempt_enable(); \
} while (0)
#define spin_unlock_bh(lock) \
do { \
_raw_spin_unlock(lock); \
preempt_enable(); \
local_bh_enable(); \
} while (0)
#define read_unlock_irqrestore(lock, flags) \
do { \
_raw_read_unlock(lock); \
local_irq_restore(flags); \
preempt_enable(); \
} while (0)
#define read_unlock_irq(lock) \
do { \
_raw_read_unlock(lock); \
local_irq_enable(); \
preempt_enable(); \
} while (0)
#define read_unlock_bh(lock) \
do { \
_raw_read_unlock(lock); \
preempt_enable(); \
local_bh_enable(); \
} while (0)
#define write_unlock_irqrestore(lock, flags) \
do { \
_raw_write_unlock(lock); \
local_irq_restore(flags); \
preempt_enable(); \
} while (0)
#define write_unlock_irq(lock) \
do { \
_raw_write_unlock(lock); \
local_irq_enable(); \
preempt_enable(); \
} while (0)
#define write_unlock_bh(lock) \
do { \
_raw_write_unlock(lock); \
preempt_enable(); \
local_bh_enable(); \
} while (0)
#define spin_trylock_bh(lock) ({ local_bh_disable(); preempt_disable(); \
_raw_spin_trylock(lock) ? 1 : \
({preempt_enable(); local_bh_enable(); 0;});})
/* "lock on reference count zero" */
#ifndef ATOMIC_DEC_AND_LOCK
...
...
include/linux/ufs_fs.h
View file @
a49520cb
...
...
@@ -33,6 +33,9 @@
#include <linux/stat.h>
#include <linux/fs.h>
#include <linux/ufs_fs_i.h>
#include <linux/ufs_fs_sb.h>
#define UFS_BBLOCK 0
#define UFS_BBSIZE 8192
#define UFS_SBLOCK 8192
...
...
@@ -398,7 +401,7 @@ struct ufs_super_block {
* Convert cylinder group to base address of its global summary info.
*/
#define fs_cs(indx) \
u.ufs_sb.
s_csp[(indx) >> uspi->s_csshift][(indx) & ~uspi->s_csmask]
s_csp[(indx) >> uspi->s_csshift][(indx) & ~uspi->s_csmask]
/*
* Cylinder group block for a file system.
...
...
@@ -780,7 +783,10 @@ extern struct inode_operations ufs_fast_symlink_inode_operations;
/* truncate.c */
extern
void
ufs_truncate
(
struct
inode
*
);
#include <linux/ufs_fs_i.h>
static
inline
struct
ufs_sb_info
*
UFS_SB
(
struct
super_block
*
sb
)
{
return
sb
->
u
.
generic_sbp
;
}
static
inline
struct
ufs_inode_info
*
UFS_I
(
struct
inode
*
inode
)
{
...
...
kernel/exit.c
View file @
a49520cb
...
...
@@ -731,7 +731,7 @@ asmlinkage long sys_wait4(pid_t pid,unsigned int * stat_addr, int options, struc
tsk
=
next_thread
(
tsk
);
}
while
(
tsk
!=
current
);
read_unlock
(
&
tasklist_lock
);
if
(
flag
)
{
if
(
flag
||
!
list_empty
(
&
current
->
ptrace_children
)
)
{
retval
=
0
;
if
(
options
&
WNOHANG
)
goto
end_wait4
;
...
...
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