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
130b6627
Commit
130b6627
authored
Aug 13, 2003
by
Stephen Lord
Browse files
Options
Browse Files
Download
Plain Diff
Merge
ssh://lord@kernel.bkbits.net/xfs-2.5
into jen.americas.sgi.com:/src/lord/bitkeeper/xfs-2.5
parents
4e9779ba
87f3eb7a
Changes
10
Hide whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
137 additions
and
131 deletions
+137
-131
fs/xfs/linux/xfs_iops.c
fs/xfs/linux/xfs_iops.c
+38
-22
fs/xfs/pagebuf/page_buf.c
fs/xfs/pagebuf/page_buf.c
+36
-25
fs/xfs/pagebuf/page_buf.h
fs/xfs/pagebuf/page_buf.h
+29
-42
fs/xfs/pagebuf/page_buf_locking.c
fs/xfs/pagebuf/page_buf_locking.c
+2
-1
fs/xfs/xfs_attr.c
fs/xfs/xfs_attr.c
+1
-0
fs/xfs/xfs_bmap.c
fs/xfs/xfs_bmap.c
+1
-1
fs/xfs/xfs_buf.h
fs/xfs/xfs_buf.h
+8
-17
fs/xfs/xfs_da_btree.c
fs/xfs/xfs_da_btree.c
+15
-12
fs/xfs/xfs_da_btree.h
fs/xfs/xfs_da_btree.h
+5
-4
fs/xfs/xfs_vnodeops.c
fs/xfs/xfs_vnodeops.c
+2
-7
No files found.
fs/xfs/linux/xfs_iops.c
View file @
130b6627
...
@@ -109,14 +109,20 @@ linvfs_mknod(
...
@@ -109,14 +109,20 @@ linvfs_mknod(
struct
inode
*
ip
;
struct
inode
*
ip
;
vattr_t
va
;
vattr_t
va
;
vnode_t
*
vp
=
NULL
,
*
dvp
=
LINVFS_GET_VP
(
dir
);
vnode_t
*
vp
=
NULL
,
*
dvp
=
LINVFS_GET_VP
(
dir
);
xfs_acl_t
*
default_acl
=
NULL
;
xattr_exists_t
test_default_acl
=
_ACL_DEFAULT_EXISTS
;
xattr_exists_t
test_default_acl
=
_ACL_DEFAULT_EXISTS
;
int
have_default_acl
=
0
;
int
error
;
int
error
=
EINVAL
;
if
(
test_default_acl
)
if
(
test_default_acl
&&
test_default_acl
(
dvp
))
{
have_default_acl
=
test_default_acl
(
dvp
);
if
(
!
_ACL_ALLOC
(
default_acl
))
return
-
ENOMEM
;
if
(
!
_ACL_GET_DEFAULT
(
dvp
,
default_acl
))
{
_ACL_FREE
(
default_acl
);
default_acl
=
NULL
;
}
}
if
(
IS_POSIXACL
(
dir
)
&&
!
have_
default_acl
&&
has_fs_struct
(
current
))
if
(
IS_POSIXACL
(
dir
)
&&
!
default_acl
&&
has_fs_struct
(
current
))
mode
&=
~
current
->
fs
->
umask
;
mode
&=
~
current
->
fs
->
umask
;
memset
(
&
va
,
0
,
sizeof
(
va
));
memset
(
&
va
,
0
,
sizeof
(
va
));
...
@@ -140,13 +146,36 @@ linvfs_mknod(
...
@@ -140,13 +146,36 @@ linvfs_mknod(
break
;
break
;
}
}
if
(
default_acl
)
{
if
(
!
error
)
{
error
=
_ACL_INHERIT
(
vp
,
&
va
,
default_acl
);
if
(
!
error
)
{
VMODIFY
(
vp
);
}
else
{
struct
dentry
teardown
=
{};
int
err2
;
/* Oh, the horror.
* If we can't add the ACL we must back out.
* ENOSPC can hit here, among other things.
*/
teardown
.
d_inode
=
ip
=
LINVFS_GET_IP
(
vp
);
teardown
.
d_name
=
dentry
->
d_name
;
remove_inode_hash
(
ip
);
make_bad_inode
(
ip
);
if
(
S_ISDIR
(
mode
))
VOP_RMDIR
(
dvp
,
&
teardown
,
NULL
,
err2
);
else
VOP_REMOVE
(
dvp
,
&
teardown
,
NULL
,
err2
);
VN_RELE
(
vp
);
}
}
_ACL_FREE
(
default_acl
);
}
if
(
!
error
)
{
if
(
!
error
)
{
ASSERT
(
vp
);
ASSERT
(
vp
);
ip
=
LINVFS_GET_IP
(
vp
);
ip
=
LINVFS_GET_IP
(
vp
);
if
(
!
ip
)
{
VN_RELE
(
vp
);
return
-
ENOMEM
;
}
if
(
S_ISCHR
(
mode
)
||
S_ISBLK
(
mode
))
if
(
S_ISCHR
(
mode
)
||
S_ISBLK
(
mode
))
ip
->
i_rdev
=
to_kdev_t
(
rdev
);
ip
->
i_rdev
=
to_kdev_t
(
rdev
);
...
@@ -155,19 +184,6 @@ linvfs_mknod(
...
@@ -155,19 +184,6 @@ linvfs_mknod(
d_instantiate
(
dentry
,
ip
);
d_instantiate
(
dentry
,
ip
);
validate_fields
(
dir
);
validate_fields
(
dir
);
}
}
if
(
!
error
&&
have_default_acl
)
{
_ACL_DECL
(
pdacl
);
if
(
!
_ACL_ALLOC
(
pdacl
))
{
error
=
-
ENOMEM
;
}
else
{
if
(
_ACL_GET_DEFAULT
(
dvp
,
pdacl
))
error
=
_ACL_INHERIT
(
vp
,
&
va
,
pdacl
);
VMODIFY
(
vp
);
_ACL_FREE
(
pdacl
);
}
}
return
-
error
;
return
-
error
;
}
}
...
...
fs/xfs/pagebuf/page_buf.c
View file @
130b6627
...
@@ -1114,10 +1114,10 @@ _pagebuf_wait_unpin(
...
@@ -1114,10 +1114,10 @@ _pagebuf_wait_unpin(
add_wait_queue
(
&
pb
->
pb_waiters
,
&
wait
);
add_wait_queue
(
&
pb
->
pb_waiters
,
&
wait
);
for
(;;)
{
for
(;;)
{
current
->
state
=
TASK_UNINTERRUPTIBLE
;
current
->
state
=
TASK_UNINTERRUPTIBLE
;
if
(
atomic_read
(
&
pb
->
pb_pin_count
)
==
0
)
{
if
(
atomic_read
(
&
pb
->
pb_pin_count
)
==
0
)
break
;
break
;
}
if
(
atomic_read
(
&
pb
->
pb_io_remaining
))
pagebuf_run_queues
(
pb
);
blk_run_queues
(
);
schedule
();
schedule
();
}
}
remove_wait_queue
(
&
pb
->
pb_waiters
,
&
wait
);
remove_wait_queue
(
&
pb
->
pb_waiters
,
&
wait
);
...
@@ -1224,26 +1224,27 @@ pagebuf_iostart( /* start I/O on a buffer */
...
@@ -1224,26 +1224,27 @@ pagebuf_iostart( /* start I/O on a buffer */
return
status
;
return
status
;
}
}
pb
->
pb_flags
&=
pb
->
pb_flags
&=
~
(
PBF_READ
|
PBF_WRITE
|
PBF_ASYNC
|
\
~
(
PBF_READ
|
PBF_WRITE
|
PBF_ASYNC
|
PBF_DELWRI
|
PBF_READ_AHEAD
);
PBF_DELWRI
|
PBF_READ_AHEAD
|
PBF_RUN_QUEUES
);
pb
->
pb_flags
|=
flags
&
pb
->
pb_flags
|=
flags
&
(
PBF_READ
|
PBF_WRITE
|
PBF_ASYNC
|
\
(
PBF_READ
|
PBF_WRITE
|
PBF_ASYNC
|
PBF_SYNC
|
PBF_READ_AHEAD
);
PBF_SYNC
|
PBF_READ_AHEAD
|
PBF_RUN_QUEUES
);
BUG_ON
(
pb
->
pb_bn
==
PAGE_BUF_DADDR_NULL
);
BUG_ON
(
pb
->
pb_bn
==
PAGE_BUF_DADDR_NULL
);
/* For writes call internal function which checks for
/* For writes allow an alternate strategy routine to precede
* filesystem specific callout function and execute it.
* the actual I/O request (which may not be issued at all in
* a shutdown situation, for example).
*/
*/
if
(
flags
&
PBF_WRITE
)
{
status
=
(
flags
&
PBF_WRITE
)
?
status
=
__pagebuf_iorequest
(
pb
);
pagebuf_iostrategy
(
pb
)
:
pagebuf_iorequest
(
pb
);
}
else
{
status
=
pagebuf_iorequest
(
pb
);
}
/* Wait for I/O if we are not an async request */
/* Wait for I/O if we are not an async request.
if
((
status
==
0
)
&&
(
flags
&
PBF_ASYNC
)
==
0
)
{
* Note: async I/O request completion will release the buffer,
* and that can already be done by this point. So using the
* buffer pointer from here on, after async I/O, is invalid.
*/
if
(
!
status
&&
!
(
flags
&
PBF_ASYNC
))
status
=
pagebuf_iowait
(
pb
);
status
=
pagebuf_iowait
(
pb
);
}
return
status
;
return
status
;
}
}
...
@@ -1381,8 +1382,6 @@ _pagebuf_ioapply(
...
@@ -1381,8 +1382,6 @@ _pagebuf_ioapply(
nr_pages
=
total_nr_pages
;
nr_pages
=
total_nr_pages
;
bio
=
bio_alloc
(
GFP_NOIO
,
nr_pages
);
bio
=
bio_alloc
(
GFP_NOIO
,
nr_pages
);
BUG_ON
(
bio
==
NULL
);
bio
->
bi_bdev
=
pb
->
pb_target
->
pbr_bdev
;
bio
->
bi_bdev
=
pb
->
pb_target
->
pbr_bdev
;
bio
->
bi_sector
=
sector
;
bio
->
bi_sector
=
sector
;
bio
->
bi_end_io
=
bio_end_io_pagebuf
;
bio
->
bi_end_io
=
bio_end_io_pagebuf
;
...
@@ -1418,6 +1417,12 @@ _pagebuf_ioapply(
...
@@ -1418,6 +1417,12 @@ _pagebuf_ioapply(
}
else
{
}
else
{
pagebuf_ioerror
(
pb
,
EIO
);
pagebuf_ioerror
(
pb
,
EIO
);
}
}
if
(
pb
->
pb_flags
&
PBF_RUN_QUEUES
)
{
pb
->
pb_flags
&=
~
PBF_RUN_QUEUES
;
if
(
atomic_read
(
&
pb
->
pb_io_remaining
)
>
1
)
blk_run_queues
();
}
}
}
/*
/*
...
@@ -1453,6 +1458,8 @@ pagebuf_iorequest( /* start real I/O */
...
@@ -1453,6 +1458,8 @@ pagebuf_iorequest( /* start real I/O */
_pagebuf_wait_unpin
(
pb
);
_pagebuf_wait_unpin
(
pb
);
}
}
pagebuf_hold
(
pb
);
/* Set the count to 1 initially, this will stop an I/O
/* Set the count to 1 initially, this will stop an I/O
* completion callout which happens before we have started
* completion callout which happens before we have started
* all the I/O from calling pagebuf_iodone too early.
* all the I/O from calling pagebuf_iodone too early.
...
@@ -1460,6 +1467,8 @@ pagebuf_iorequest( /* start real I/O */
...
@@ -1460,6 +1467,8 @@ pagebuf_iorequest( /* start real I/O */
atomic_set
(
&
pb
->
pb_io_remaining
,
1
);
atomic_set
(
&
pb
->
pb_io_remaining
,
1
);
_pagebuf_ioapply
(
pb
);
_pagebuf_ioapply
(
pb
);
_pagebuf_iodone
(
pb
,
0
);
_pagebuf_iodone
(
pb
,
0
);
pagebuf_rele
(
pb
);
return
0
;
return
0
;
}
}
...
@@ -1475,7 +1484,8 @@ pagebuf_iowait(
...
@@ -1475,7 +1484,8 @@ pagebuf_iowait(
page_buf_t
*
pb
)
page_buf_t
*
pb
)
{
{
PB_TRACE
(
pb
,
PB_TRACE_REC
(
iowait
),
0
);
PB_TRACE
(
pb
,
PB_TRACE_REC
(
iowait
),
0
);
pagebuf_run_queues
(
pb
);
if
(
atomic_read
(
&
pb
->
pb_io_remaining
))
blk_run_queues
();
down
(
&
pb
->
pb_iodonesema
);
down
(
&
pb
->
pb_iodonesema
);
PB_TRACE
(
pb
,
PB_TRACE_REC
(
iowaited
),
(
int
)
pb
->
pb_error
);
PB_TRACE
(
pb
,
PB_TRACE_REC
(
iowaited
),
(
int
)
pb
->
pb_error
);
return
pb
->
pb_error
;
return
pb
->
pb_error
;
...
@@ -1554,6 +1564,7 @@ pagebuf_iomove(
...
@@ -1554,6 +1564,7 @@ pagebuf_iomove(
}
}
}
}
/*
/*
* Pagebuf delayed write buffer handling
* Pagebuf delayed write buffer handling
*/
*/
...
@@ -1683,13 +1694,13 @@ pagebuf_daemon(
...
@@ -1683,13 +1694,13 @@ pagebuf_daemon(
pb
->
pb_flags
&=
~
PBF_DELWRI
;
pb
->
pb_flags
&=
~
PBF_DELWRI
;
pb
->
pb_flags
|=
PBF_WRITE
;
pb
->
pb_flags
|=
PBF_WRITE
;
__pagebuf_iorequest
(
pb
);
pagebuf_iostrategy
(
pb
);
}
}
if
(
as_list_len
>
0
)
if
(
as_list_len
>
0
)
purge_addresses
();
purge_addresses
();
if
(
count
)
if
(
count
)
pagebuf_run_queues
(
NULL
);
blk_run_queues
(
);
force_flush
=
0
;
force_flush
=
0
;
}
while
(
pbd_active
==
1
);
}
while
(
pbd_active
==
1
);
...
@@ -1756,9 +1767,9 @@ pagebuf_delwri_flush(
...
@@ -1756,9 +1767,9 @@ pagebuf_delwri_flush(
pb
->
pb_flags
&=
~
PBF_DELWRI
;
pb
->
pb_flags
&=
~
PBF_DELWRI
;
pb
->
pb_flags
|=
PBF_WRITE
;
pb
->
pb_flags
|=
PBF_WRITE
;
__pagebuf_iorequest
(
pb
);
pagebuf_iostrategy
(
pb
);
if
(
++
flush_cnt
>
32
)
{
if
(
++
flush_cnt
>
32
)
{
pagebuf_run_queues
(
NULL
);
blk_run_queues
(
);
flush_cnt
=
0
;
flush_cnt
=
0
;
}
}
...
@@ -1767,7 +1778,7 @@ pagebuf_delwri_flush(
...
@@ -1767,7 +1778,7 @@ pagebuf_delwri_flush(
spin_unlock
(
&
pbd_delwrite_lock
);
spin_unlock
(
&
pbd_delwrite_lock
);
pagebuf_run_queues
(
NULL
);
blk_run_queues
(
);
if
(
pinptr
)
if
(
pinptr
)
*
pinptr
=
pincount
;
*
pinptr
=
pincount
;
...
...
fs/xfs/pagebuf/page_buf.h
View file @
130b6627
...
@@ -128,6 +128,7 @@ typedef enum page_buf_flags_e { /* pb_flags values */
...
@@ -128,6 +128,7 @@ typedef enum page_buf_flags_e { /* pb_flags values */
PBF_FORCEIO
=
(
1
<<
21
),
PBF_FORCEIO
=
(
1
<<
21
),
PBF_FLUSH
=
(
1
<<
22
),
/* flush disk write cache */
PBF_FLUSH
=
(
1
<<
22
),
/* flush disk write cache */
PBF_READ_AHEAD
=
(
1
<<
23
),
PBF_READ_AHEAD
=
(
1
<<
23
),
PBF_RUN_QUEUES
=
(
1
<<
24
),
/* run block device task queue */
}
page_buf_flags_t
;
}
page_buf_flags_t
;
...
@@ -239,10 +240,6 @@ typedef struct page_buf_s {
...
@@ -239,10 +240,6 @@ typedef struct page_buf_s {
}
page_buf_t
;
}
page_buf_t
;
/*
* page_buf module entry points
*/
/* Finding and Reading Buffers */
/* Finding and Reading Buffers */
extern
page_buf_t
*
pagebuf_find
(
/* find buffer for block if */
extern
page_buf_t
*
pagebuf_find
(
/* find buffer for block if */
...
@@ -276,12 +273,11 @@ extern page_buf_t *pagebuf_get_no_daddr(/* allocate pagebuf struct */
...
@@ -276,12 +273,11 @@ extern page_buf_t *pagebuf_get_no_daddr(/* allocate pagebuf struct */
size_t
len
,
size_t
len
,
struct
pb_target
*
);
/* mount point "fake" inode */
struct
pb_target
*
);
/* mount point "fake" inode */
extern
int
pagebuf_associate_memory
(
extern
int
pagebuf_associate_memory
(
page_buf_t
*
,
page_buf_t
*
,
void
*
,
void
*
,
size_t
);
size_t
);
extern
void
pagebuf_hold
(
/* increment reference count */
extern
void
pagebuf_hold
(
/* increment reference count */
page_buf_t
*
);
/* buffer to hold */
page_buf_t
*
);
/* buffer to hold */
...
@@ -291,7 +287,7 @@ extern void pagebuf_readahead( /* read ahead into cache */
...
@@ -291,7 +287,7 @@ extern void pagebuf_readahead( /* read ahead into cache */
size_t
,
/* length of range */
size_t
,
/* length of range */
page_buf_flags_t
);
/* additional read flags */
page_buf_flags_t
);
/* additional read flags */
/*
Writing and
Releasing Buffers */
/* Releasing Buffers */
extern
void
pagebuf_free
(
/* deallocate a buffer */
extern
void
pagebuf_free
(
/* deallocate a buffer */
page_buf_t
*
);
/* buffer to deallocate */
page_buf_t
*
);
/* buffer to deallocate */
...
@@ -314,11 +310,7 @@ extern int pagebuf_lock( /* lock buffer */
...
@@ -314,11 +310,7 @@ extern int pagebuf_lock( /* lock buffer */
extern
void
pagebuf_unlock
(
/* unlock buffer */
extern
void
pagebuf_unlock
(
/* unlock buffer */
page_buf_t
*
);
/* buffer to unlock */
page_buf_t
*
);
/* buffer to unlock */
/* Buffer Utility Routines */
/* Buffer Read and Write Routines */
static
inline
int
pagebuf_geterror
(
page_buf_t
*
pb
)
{
return
(
pb
?
pb
->
pb_error
:
ENOMEM
);
}
extern
void
pagebuf_iodone
(
/* mark buffer I/O complete */
extern
void
pagebuf_iodone
(
/* mark buffer I/O complete */
page_buf_t
*
,
/* buffer to mark */
page_buf_t
*
,
/* buffer to mark */
...
@@ -339,21 +331,9 @@ extern int pagebuf_iostart( /* start I/O on a buffer */
...
@@ -339,21 +331,9 @@ extern int pagebuf_iostart( /* start I/O on a buffer */
extern
int
pagebuf_iorequest
(
/* start real I/O */
extern
int
pagebuf_iorequest
(
/* start real I/O */
page_buf_t
*
);
/* buffer to convey to device */
page_buf_t
*
);
/* buffer to convey to device */
/*
* pagebuf_iorequest is the core I/O request routine.
* It assumes that the buffer is well-formed and
* mapped and ready for physical I/O, unlike
* pagebuf_iostart() and pagebuf_iophysio(). Those
* routines call the inode pagebuf_ioinitiate routine to start I/O,
* if it is present, or else call pagebuf_iorequest()
* directly if the inode pagebuf_ioinitiate routine is not present.
*/
extern
int
pagebuf_iowait
(
/* wait for buffer I/O done */
extern
int
pagebuf_iowait
(
/* wait for buffer I/O done */
page_buf_t
*
);
/* buffer to wait on */
page_buf_t
*
);
/* buffer to wait on */
extern
caddr_t
pagebuf_offset
(
page_buf_t
*
,
size_t
);
extern
void
pagebuf_iomove
(
/* move data in/out of pagebuf */
extern
void
pagebuf_iomove
(
/* move data in/out of pagebuf */
page_buf_t
*
,
/* buffer to manipulate */
page_buf_t
*
,
/* buffer to manipulate */
size_t
,
/* starting buffer offset */
size_t
,
/* starting buffer offset */
...
@@ -361,6 +341,22 @@ extern void pagebuf_iomove( /* move data in/out of pagebuf */
...
@@ -361,6 +341,22 @@ extern void pagebuf_iomove( /* move data in/out of pagebuf */
caddr_t
,
/* data pointer */
caddr_t
,
/* data pointer */
page_buf_rw_t
);
/* direction */
page_buf_rw_t
);
/* direction */
static
inline
int
pagebuf_iostrategy
(
page_buf_t
*
pb
)
{
return
pb
->
pb_strat
?
pb
->
pb_strat
(
pb
)
:
pagebuf_iorequest
(
pb
);
}
static
inline
int
pagebuf_geterror
(
page_buf_t
*
pb
)
{
return
pb
?
pb
->
pb_error
:
ENOMEM
;
}
/* Buffer Utility Routines */
extern
caddr_t
pagebuf_offset
(
/* pointer at offset in buffer */
page_buf_t
*
,
/* buffer to offset into */
size_t
);
/* offset */
/* Pinning Buffer Storage in Memory */
/* Pinning Buffer Storage in Memory */
extern
void
pagebuf_pin
(
/* pin buffer in memory */
extern
void
pagebuf_pin
(
/* pin buffer in memory */
...
@@ -369,33 +365,24 @@ extern void pagebuf_pin( /* pin buffer in memory */
...
@@ -369,33 +365,24 @@ extern void pagebuf_pin( /* pin buffer in memory */
extern
void
pagebuf_unpin
(
/* unpin buffered data */
extern
void
pagebuf_unpin
(
/* unpin buffered data */
page_buf_t
*
);
/* buffer to unpin */
page_buf_t
*
);
/* buffer to unpin */
extern
int
pagebuf_ispin
(
page_buf_t
*
);
/* check if pagebuf is pinned */
extern
int
pagebuf_ispin
(
/* check if buffer is pinned */
page_buf_t
*
);
/* buffer to check */
/* Reading and writing pages */
extern
void
pagebuf_delwri_dequeue
(
page_buf_t
*
);
/* Delayed Write Buffer Routines */
#define PBDF_WAIT 0x01
#define PBDF_WAIT 0x01
#define PBDF_TRYLOCK 0x02
#define PBDF_TRYLOCK 0x02
extern
void
pagebuf_delwri_flush
(
extern
void
pagebuf_delwri_flush
(
struct
pb_targe
t
*
,
pb_target_
t
*
,
unsigned
long
,
unsigned
long
,
int
*
);
int
*
);
extern
int
pagebuf_init
(
void
);
extern
void
pagebuf_delwri_dequeue
(
extern
void
pagebuf_terminate
(
void
);
page_buf_t
*
);
static
__inline__
int
__pagebuf_iorequest
(
page_buf_t
*
pb
)
/* Buffer Daemon Setup Routines */
{
if
(
pb
->
pb_strat
)
return
pb
->
pb_strat
(
pb
);
return
pagebuf_iorequest
(
pb
);
}
static
__inline__
void
pagebuf_run_queues
(
page_buf_t
*
pb
)
extern
int
pagebuf_init
(
void
);
{
extern
void
pagebuf_terminate
(
void
);
if
(
!
pb
||
atomic_read
(
&
pb
->
pb_io_remaining
))
blk_run_queues
();
}
#endif
/* __PAGE_BUF_H__ */
#endif
/* __PAGE_BUF_H__ */
fs/xfs/pagebuf/page_buf_locking.c
View file @
130b6627
...
@@ -113,7 +113,8 @@ pagebuf_lock(
...
@@ -113,7 +113,8 @@ pagebuf_lock(
ASSERT
(
pb
->
pb_flags
&
_PBF_LOCKABLE
);
ASSERT
(
pb
->
pb_flags
&
_PBF_LOCKABLE
);
PB_TRACE
(
pb
,
PB_TRACE_REC
(
lock
),
0
);
PB_TRACE
(
pb
,
PB_TRACE_REC
(
lock
),
0
);
pagebuf_run_queues
(
pb
);
if
(
atomic_read
(
&
pb
->
pb_io_remaining
))
blk_run_queues
();
down
(
&
pb
->
pb_sema
);
down
(
&
pb
->
pb_sema
);
PB_SET_OWNER
(
pb
);
PB_SET_OWNER
(
pb
);
PB_TRACE
(
pb
,
PB_TRACE_REC
(
locked
),
0
);
PB_TRACE
(
pb
,
PB_TRACE_REC
(
locked
),
0
);
...
...
fs/xfs/xfs_attr.c
View file @
130b6627
...
@@ -1718,6 +1718,7 @@ xfs_attr_node_get(xfs_da_args_t *args)
...
@@ -1718,6 +1718,7 @@ xfs_attr_node_get(xfs_da_args_t *args)
int
i
;
int
i
;
state
=
xfs_da_state_alloc
();
state
=
xfs_da_state_alloc
();
state
->
holeok
=
1
;
state
->
args
=
args
;
state
->
args
=
args
;
state
->
mp
=
args
->
dp
->
i_mount
;
state
->
mp
=
args
->
dp
->
i_mount
;
state
->
blocksize
=
state
->
mp
->
m_sb
.
sb_blocksize
;
state
->
blocksize
=
state
->
mp
->
m_sb
.
sb_blocksize
;
...
...
fs/xfs/xfs_bmap.c
View file @
130b6627
...
@@ -3810,7 +3810,7 @@ xfs_bmap_add_attrfork(
...
@@ -3810,7 +3810,7 @@ xfs_bmap_add_attrfork(
xfs_trans_log_inode
(
tp
,
ip
,
XFS_ILOG_CORE
);
xfs_trans_log_inode
(
tp
,
ip
,
XFS_ILOG_CORE
);
switch
(
ip
->
i_d
.
di_format
)
{
switch
(
ip
->
i_d
.
di_format
)
{
case
XFS_DINODE_FMT_DEV
:
case
XFS_DINODE_FMT_DEV
:
ip
->
i_d
.
di_forkoff
=
roundup
(
sizeof
(
dev_t
),
8
)
>>
3
;
ip
->
i_d
.
di_forkoff
=
roundup
(
sizeof
(
xfs_
dev_t
),
8
)
>>
3
;
break
;
break
;
case
XFS_DINODE_FMT_UUID
:
case
XFS_DINODE_FMT_UUID
:
ip
->
i_d
.
di_forkoff
=
roundup
(
sizeof
(
uuid_t
),
8
)
>>
3
;
ip
->
i_d
.
di_forkoff
=
roundup
(
sizeof
(
uuid_t
),
8
)
>>
3
;
...
...
fs/xfs/xfs_buf.h
View file @
130b6627
...
@@ -215,21 +215,16 @@ extern inline xfs_caddr_t xfs_buf_offset(page_buf_t *bp, size_t offset)
...
@@ -215,21 +215,16 @@ extern inline xfs_caddr_t xfs_buf_offset(page_buf_t *bp, size_t offset)
static
inline
int
xfs_bawrite
(
void
*
mp
,
page_buf_t
*
bp
)
static
inline
int
xfs_bawrite
(
void
*
mp
,
page_buf_t
*
bp
)
{
{
int
ret
;
bp
->
pb_fspriv3
=
mp
;
bp
->
pb_fspriv3
=
mp
;
bp
->
pb_strat
=
xfs_bdstrat_cb
;
bp
->
pb_strat
=
xfs_bdstrat_cb
;
xfs_buf_undelay
(
bp
);
xfs_buf_undelay
(
bp
);
if
((
ret
=
pagebuf_iostart
(
bp
,
PBF_WRITE
|
PBF_ASYNC
))
==
0
)
return
pagebuf_iostart
(
bp
,
PBF_WRITE
|
PBF_ASYNC
|
PBF_RUN_QUEUES
);
pagebuf_run_queues
(
bp
);
return
ret
;
}
}
static
inline
void
xfs_buf_relse
(
page_buf_t
*
bp
)
static
inline
void
xfs_buf_relse
(
page_buf_t
*
bp
)
{
{
if
((
bp
->
pb_flags
&
_PBF_LOCKABLE
)
&&
!
bp
->
pb_relse
)
if
((
bp
->
pb_flags
&
_PBF_LOCKABLE
)
&&
!
bp
->
pb_relse
)
pagebuf_unlock
(
bp
);
pagebuf_unlock
(
bp
);
pagebuf_rele
(
bp
);
pagebuf_rele
(
bp
);
}
}
...
@@ -263,23 +258,19 @@ static inline void xfs_buf_relse(page_buf_t *bp)
...
@@ -263,23 +258,19 @@ static inline void xfs_buf_relse(page_buf_t *bp)
static
inline
int
XFS_bwrite
(
page_buf_t
*
pb
)
static
inline
int
XFS_bwrite
(
page_buf_t
*
pb
)
{
{
int
sync
=
(
pb
->
pb_flags
&
PBF_ASYNC
)
==
0
;
int
iowait
=
(
pb
->
pb_flags
&
PBF_ASYNC
)
==
0
;
int
error
;
int
error
=
0
;
pb
->
pb_flags
|=
PBF_SYNC
;
pb
->
pb_flags
|=
PBF_SYNC
;
if
(
!
iowait
)
pb
->
pb_flags
|=
PBF_RUN_QUEUES
;
xfs_buf_undelay
(
pb
);
xfs_buf_undelay
(
pb
);
pagebuf_iostrategy
(
pb
);
__pagebuf_iorequest
(
pb
);
if
(
iowait
)
{
if
(
sync
)
{
error
=
pagebuf_iowait
(
pb
);
error
=
pagebuf_iowait
(
pb
);
xfs_buf_relse
(
pb
);
xfs_buf_relse
(
pb
);
}
else
{
pagebuf_run_queues
(
pb
);
error
=
0
;
}
}
return
error
;
return
error
;
}
}
...
@@ -320,4 +311,4 @@ static inline int xfs_bdwrite(void *mp, page_buf_t *bp)
...
@@ -320,4 +311,4 @@ static inline int xfs_bdwrite(void *mp, page_buf_t *bp)
#define xfs_buf_get_noaddr(len, target) pagebuf_get_no_daddr((len), (target))
#define xfs_buf_get_noaddr(len, target) pagebuf_get_no_daddr((len), (target))
#define xfs_buf_free(bp) pagebuf_free(bp)
#define xfs_buf_free(bp) pagebuf_free(bp)
#endif
#endif
/* __XFS_BUF_H__ */
fs/xfs/xfs_da_btree.c
View file @
130b6627
/*
/*
* Copyright (c) 2000-200
2
Silicon Graphics, Inc. All Rights Reserved.
* Copyright (c) 2000-200
3
Silicon Graphics, Inc. All Rights Reserved.
*
*
* This program is free software; you can redistribute it and/or modify it
* This program is free software; you can redistribute it and/or modify it
* under the terms of version 2 of the GNU General Public License as
* under the terms of version 2 of the GNU General Public License as
...
@@ -1141,10 +1141,13 @@ xfs_da_node_lookup_int(xfs_da_state_t *state, int *result)
...
@@ -1141,10 +1141,13 @@ xfs_da_node_lookup_int(xfs_da_state_t *state, int *result)
xfs_da_node_entry_t
*
btree
;
xfs_da_node_entry_t
*
btree
;
xfs_dablk_t
blkno
;
xfs_dablk_t
blkno
;
int
probe
,
span
,
max
,
error
,
retval
;
int
probe
,
span
,
max
,
error
,
retval
;
xfs_daddr_t
mappedbno
;
xfs_dahash_t
hashval
;
xfs_dahash_t
hashval
;
xfs_da_args_t
*
args
;
xfs_da_args_t
*
args
;
args
=
state
->
args
;
args
=
state
->
args
;
mappedbno
=
state
->
holeok
?
-
2
:
-
1
;
/*
/*
* Descend thru the B-tree searching each level for the right
* Descend thru the B-tree searching each level for the right
* node to use, until the right hashval is found.
* node to use, until the right hashval is found.
...
@@ -1160,15 +1163,15 @@ xfs_da_node_lookup_int(xfs_da_state_t *state, int *result)
...
@@ -1160,15 +1163,15 @@ xfs_da_node_lookup_int(xfs_da_state_t *state, int *result)
* Read the next node down in the tree.
* Read the next node down in the tree.
*/
*/
blk
->
blkno
=
blkno
;
blk
->
blkno
=
blkno
;
error
=
xfs_da_read_buf
(
state
->
args
->
trans
,
state
->
args
->
dp
,
error
=
xfs_da_read_buf
(
args
->
trans
,
args
->
dp
,
blkno
,
blkno
,
-
1
,
&
blk
->
bp
,
mappedbno
,
&
blk
->
bp
,
args
->
whichfork
);
state
->
args
->
whichfork
);
if
(
!
error
&&
unlikely
(
state
->
holeok
&&
!
blk
->
bp
))
error
=
XFS_ERROR
(
ENOATTR
);
/* always attr here */
if
(
error
)
{
if
(
error
)
{
blk
->
blkno
=
0
;
blk
->
blkno
=
0
;
state
->
path
.
active
--
;
state
->
path
.
active
--
;
return
(
error
);
return
(
error
);
}
}
ASSERT
(
blk
->
bp
!=
NULL
);
curr
=
blk
->
bp
->
data
;
curr
=
blk
->
bp
->
data
;
ASSERT
(
INT_GET
(
curr
->
magic
,
ARCH_CONVERT
)
==
XFS_DA_NODE_MAGIC
||
ASSERT
(
INT_GET
(
curr
->
magic
,
ARCH_CONVERT
)
==
XFS_DA_NODE_MAGIC
||
INT_GET
(
curr
->
magic
,
ARCH_CONVERT
)
==
XFS_DIRX_LEAF_MAGIC
(
state
->
mp
)
||
INT_GET
(
curr
->
magic
,
ARCH_CONVERT
)
==
XFS_DIRX_LEAF_MAGIC
(
state
->
mp
)
||
...
@@ -1187,7 +1190,7 @@ xfs_da_node_lookup_int(xfs_da_state_t *state, int *result)
...
@@ -1187,7 +1190,7 @@ xfs_da_node_lookup_int(xfs_da_state_t *state, int *result)
*/
*/
max
=
INT_GET
(
node
->
hdr
.
count
,
ARCH_CONVERT
);
max
=
INT_GET
(
node
->
hdr
.
count
,
ARCH_CONVERT
);
probe
=
span
=
max
/
2
;
probe
=
span
=
max
/
2
;
hashval
=
state
->
args
->
hashval
;
hashval
=
args
->
hashval
;
for
(
btree
=
&
node
->
btree
[
probe
];
span
>
4
;
for
(
btree
=
&
node
->
btree
[
probe
];
span
>
4
;
btree
=
&
node
->
btree
[
probe
])
{
btree
=
&
node
->
btree
[
probe
])
{
span
/=
2
;
span
/=
2
;
...
@@ -1250,22 +1253,22 @@ xfs_da_node_lookup_int(xfs_da_state_t *state, int *result)
...
@@ -1250,22 +1253,22 @@ xfs_da_node_lookup_int(xfs_da_state_t *state, int *result)
for
(;;)
{
for
(;;)
{
if
(
blk
->
magic
==
XFS_DIR_LEAF_MAGIC
)
{
if
(
blk
->
magic
==
XFS_DIR_LEAF_MAGIC
)
{
ASSERT
(
XFS_DIR_IS_V1
(
state
->
mp
));
ASSERT
(
XFS_DIR_IS_V1
(
state
->
mp
));
retval
=
xfs_dir_leaf_lookup_int
(
blk
->
bp
,
state
->
args
,
retval
=
xfs_dir_leaf_lookup_int
(
blk
->
bp
,
args
,
&
blk
->
index
);
&
blk
->
index
);
}
else
if
(
blk
->
magic
==
XFS_DIR2_LEAFN_MAGIC
)
{
}
else
if
(
blk
->
magic
==
XFS_DIR2_LEAFN_MAGIC
)
{
ASSERT
(
XFS_DIR_IS_V2
(
state
->
mp
));
ASSERT
(
XFS_DIR_IS_V2
(
state
->
mp
));
retval
=
xfs_dir2_leafn_lookup_int
(
blk
->
bp
,
state
->
args
,
retval
=
xfs_dir2_leafn_lookup_int
(
blk
->
bp
,
args
,
&
blk
->
index
,
state
);
&
blk
->
index
,
state
);
}
}
#ifdef __KERNEL__
#ifdef __KERNEL__
else
if
(
blk
->
magic
==
XFS_ATTR_LEAF_MAGIC
)
{
else
if
(
blk
->
magic
==
XFS_ATTR_LEAF_MAGIC
)
{
retval
=
xfs_attr_leaf_lookup_int
(
blk
->
bp
,
state
->
args
);
retval
=
xfs_attr_leaf_lookup_int
(
blk
->
bp
,
args
);
blk
->
index
=
state
->
args
->
index
;
blk
->
index
=
args
->
index
;
state
->
args
->
blkno
=
blk
->
blkno
;
args
->
blkno
=
blk
->
blkno
;
}
}
#endif
#endif
if
(((
retval
==
ENOENT
)
||
(
retval
==
ENOATTR
))
&&
if
(((
retval
==
ENOENT
)
||
(
retval
==
ENOATTR
))
&&
(
blk
->
hashval
==
state
->
args
->
hashval
))
{
(
blk
->
hashval
==
args
->
hashval
))
{
error
=
xfs_da_path_shift
(
state
,
&
state
->
path
,
1
,
1
,
error
=
xfs_da_path_shift
(
state
,
&
state
->
path
,
1
,
1
,
&
retval
);
&
retval
);
if
(
error
)
if
(
error
)
...
...
fs/xfs/xfs_da_btree.h
View file @
130b6627
...
@@ -185,14 +185,14 @@ typedef struct xfs_da_args {
...
@@ -185,14 +185,14 @@ typedef struct xfs_da_args {
int
index
;
/* index of attr of interest in blk */
int
index
;
/* index of attr of interest in blk */
xfs_dablk_t
rmtblkno
;
/* remote attr value starting blkno */
xfs_dablk_t
rmtblkno
;
/* remote attr value starting blkno */
int
rmtblkcnt
;
/* remote attr value block count */
int
rmtblkcnt
;
/* remote attr value block count */
int
rename
;
/* T/F: this is an atomic rename op */
xfs_dablk_t
blkno2
;
/* blkno of 2nd attr leaf of interest */
xfs_dablk_t
blkno2
;
/* blkno of 2nd attr leaf of interest */
int
index2
;
/* index of 2nd attr in blk */
int
index2
;
/* index of 2nd attr in blk */
xfs_dablk_t
rmtblkno2
;
/* remote attr value starting blkno */
xfs_dablk_t
rmtblkno2
;
/* remote attr value starting blkno */
int
rmtblkcnt2
;
/* remote attr value block count */
int
rmtblkcnt2
;
/* remote attr value block count */
int
justcheck
;
/* check for ok with no space */
int
justcheck
:
1
;
/* T/F: check for ok with no space */
int
addname
;
/* T/F: this is an add operation */
int
rename
:
1
;
/* T/F: this is an atomic rename op */
int
oknoent
;
/* T/F: ok to return ENOENT, else die */
int
addname
:
1
;
/* T/F: this is an add operation */
int
oknoent
:
1
;
/* T/F: ok to return ENOENT, else die */
}
xfs_da_args_t
;
}
xfs_da_args_t
;
/*
/*
...
@@ -253,6 +253,7 @@ typedef struct xfs_da_state {
...
@@ -253,6 +253,7 @@ typedef struct xfs_da_state {
xfs_da_state_path_t
path
;
/* search/split paths */
xfs_da_state_path_t
path
;
/* search/split paths */
xfs_da_state_path_t
altpath
;
/* alternate path for join */
xfs_da_state_path_t
altpath
;
/* alternate path for join */
unsigned
int
inleaf
:
1
;
/* insert into 1->lf, 0->splf */
unsigned
int
inleaf
:
1
;
/* insert into 1->lf, 0->splf */
unsigned
int
holeok
:
1
;
/* T/F: can deal with a hole */
unsigned
int
extravalid
:
1
;
/* T/F: extrablk is in use */
unsigned
int
extravalid
:
1
;
/* T/F: extrablk is in use */
unsigned
int
extraafter
:
1
;
/* T/F: extrablk is after new */
unsigned
int
extraafter
:
1
;
/* T/F: extrablk is after new */
xfs_da_state_blk_t
extrablk
;
/* for double-splits on leafs */
xfs_da_state_blk_t
extrablk
;
/* for double-splits on leafs */
...
...
fs/xfs/xfs_vnodeops.c
View file @
130b6627
...
@@ -2813,7 +2813,6 @@ xfs_mkdir(
...
@@ -2813,7 +2813,6 @@ xfs_mkdir(
xfs_inode_t
*
cdp
;
/* inode of created dir */
xfs_inode_t
*
cdp
;
/* inode of created dir */
vnode_t
*
cvp
;
/* vnode of created dir */
vnode_t
*
cvp
;
/* vnode of created dir */
xfs_trans_t
*
tp
;
xfs_trans_t
*
tp
;
xfs_dev_t
rdev
;
xfs_mount_t
*
mp
;
xfs_mount_t
*
mp
;
int
cancel_flags
;
int
cancel_flags
;
int
error
;
int
error
;
...
@@ -2912,10 +2911,9 @@ xfs_mkdir(
...
@@ -2912,10 +2911,9 @@ xfs_mkdir(
/*
/*
* create the directory inode.
* create the directory inode.
*/
*/
rdev
=
(
vap
->
va_mask
&
XFS_AT_RDEV
)
?
vap
->
va_rdev
:
0
;
error
=
xfs_dir_ialloc
(
&
tp
,
dp
,
error
=
xfs_dir_ialloc
(
&
tp
,
dp
,
MAKEIMODE
(
vap
->
va_type
,
vap
->
va_mode
),
2
,
MAKEIMODE
(
vap
->
va_type
,
vap
->
va_mode
),
2
,
rdev
,
credp
,
prid
,
resblks
>
0
,
0
,
credp
,
prid
,
resblks
>
0
,
&
cdp
,
NULL
);
&
cdp
,
NULL
);
if
(
error
)
{
if
(
error
)
{
if
(
error
==
ENOSPC
)
if
(
error
==
ENOSPC
)
...
@@ -3336,7 +3334,6 @@ xfs_symlink(
...
@@ -3336,7 +3334,6 @@ xfs_symlink(
xfs_inode_t
*
ip
;
xfs_inode_t
*
ip
;
int
error
;
int
error
;
int
pathlen
;
int
pathlen
;
xfs_dev_t
rdev
;
xfs_bmap_free_t
free_list
;
xfs_bmap_free_t
free_list
;
xfs_fsblock_t
first_block
;
xfs_fsblock_t
first_block
;
boolean_t
dp_joined_to_trans
;
boolean_t
dp_joined_to_trans
;
...
@@ -3479,10 +3476,8 @@ xfs_symlink(
...
@@ -3479,10 +3476,8 @@ xfs_symlink(
/*
/*
* Allocate an inode for the symlink.
* Allocate an inode for the symlink.
*/
*/
rdev
=
(
vap
->
va_mask
&
XFS_AT_RDEV
)
?
vap
->
va_rdev
:
0
;
error
=
xfs_dir_ialloc
(
&
tp
,
dp
,
IFLNK
|
(
vap
->
va_mode
&~
IFMT
),
error
=
xfs_dir_ialloc
(
&
tp
,
dp
,
IFLNK
|
(
vap
->
va_mode
&~
IFMT
),
1
,
rdev
,
credp
,
prid
,
resblks
>
0
,
&
ip
,
NULL
);
1
,
0
,
credp
,
prid
,
resblks
>
0
,
&
ip
,
NULL
);
if
(
error
)
{
if
(
error
)
{
if
(
error
==
ENOSPC
)
if
(
error
==
ENOSPC
)
goto
error_return
;
goto
error_return
;
...
...
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