Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
linux
Commits
384263dc
Commit
384263dc
authored
Dec 23, 2004
by
Len Brown
Browse files
Options
Browse Files
Download
Plain Diff
Merge intel.com:/home/lenb/bk/26-latest-ref
into intel.com:/home/lenb/src/26-latest-dev
parents
afe244f6
002984e2
Changes
32
Show whitespace changes
Inline
Side-by-side
Showing
32 changed files
with
301 additions
and
201 deletions
+301
-201
drivers/char/mxser.c
drivers/char/mxser.c
+6
-6
fs/xfs/linux-2.6/kmem.c
fs/xfs/linux-2.6/kmem.c
+11
-4
fs/xfs/linux-2.6/kmem.h
fs/xfs/linux-2.6/kmem.h
+1
-1
fs/xfs/linux-2.6/xfs_buf.c
fs/xfs/linux-2.6/xfs_buf.c
+72
-52
fs/xfs/linux-2.6/xfs_buf.h
fs/xfs/linux-2.6/xfs_buf.h
+20
-19
fs/xfs/linux-2.6/xfs_file.c
fs/xfs/linux-2.6/xfs_file.c
+2
-2
fs/xfs/linux-2.6/xfs_globals.c
fs/xfs/linux-2.6/xfs_globals.c
+1
-0
fs/xfs/linux-2.6/xfs_ioctl.c
fs/xfs/linux-2.6/xfs_ioctl.c
+1
-1
fs/xfs/linux-2.6/xfs_linux.h
fs/xfs/linux-2.6/xfs_linux.h
+1
-0
fs/xfs/linux-2.6/xfs_super.c
fs/xfs/linux-2.6/xfs_super.c
+5
-1
fs/xfs/linux-2.6/xfs_sysctl.c
fs/xfs/linux-2.6/xfs_sysctl.c
+5
-0
fs/xfs/linux-2.6/xfs_sysctl.h
fs/xfs/linux-2.6/xfs_sysctl.h
+2
-0
fs/xfs/quota/xfs_qm.c
fs/xfs/quota/xfs_qm.c
+27
-20
fs/xfs/quota/xfs_qm.h
fs/xfs/quota/xfs_qm.h
+5
-2
fs/xfs/quota/xfs_qm_bhv.c
fs/xfs/quota/xfs_qm_bhv.c
+9
-11
fs/xfs/quota/xfs_qm_syscalls.c
fs/xfs/quota/xfs_qm_syscalls.c
+7
-5
fs/xfs/xfs_alloc.c
fs/xfs/xfs_alloc.c
+14
-4
fs/xfs/xfs_iget.c
fs/xfs/xfs_iget.c
+34
-13
fs/xfs/xfs_inode.c
fs/xfs/xfs_inode.c
+2
-1
fs/xfs/xfs_inode.h
fs/xfs/xfs_inode.h
+5
-1
fs/xfs/xfs_itable.c
fs/xfs/xfs_itable.c
+1
-1
fs/xfs/xfs_log.c
fs/xfs/xfs_log.c
+29
-26
fs/xfs/xfs_log_priv.h
fs/xfs/xfs_log_priv.h
+1
-4
fs/xfs/xfs_log_recover.c
fs/xfs/xfs_log_recover.c
+4
-3
fs/xfs/xfs_mount.c
fs/xfs/xfs_mount.c
+14
-2
fs/xfs/xfs_mount.h
fs/xfs/xfs_mount.h
+5
-3
fs/xfs/xfs_rtalloc.c
fs/xfs/xfs_rtalloc.c
+9
-9
fs/xfs/xfs_trans.h
fs/xfs/xfs_trans.h
+1
-1
fs/xfs/xfs_trans_inode.c
fs/xfs/xfs_trans_inode.c
+4
-5
fs/xfs/xfs_utils.c
fs/xfs/xfs_utils.c
+1
-1
fs/xfs/xfs_vfsops.c
fs/xfs/xfs_vfsops.c
+1
-1
kernel/exit.c
kernel/exit.c
+1
-2
No files found.
drivers/char/mxser.c
View file @
384263dc
...
...
@@ -410,9 +410,9 @@ static void mxser_start(struct tty_struct *);
static
void
mxser_hangup
(
struct
tty_struct
*
);
static
void
mxser_rs_break
(
struct
tty_struct
*
,
int
);
static
irqreturn_t
mxser_interrupt
(
int
,
void
*
,
struct
pt_regs
*
);
static
inline
void
mxser_receive_chars
(
struct
mxser_struct
*
,
int
*
);
static
inline
void
mxser_transmit_chars
(
struct
mxser_struct
*
);
static
inline
void
mxser_check_modem_status
(
struct
mxser_struct
*
,
int
);
static
void
mxser_receive_chars
(
struct
mxser_struct
*
,
int
*
);
static
void
mxser_transmit_chars
(
struct
mxser_struct
*
);
static
void
mxser_check_modem_status
(
struct
mxser_struct
*
,
int
);
static
int
mxser_block_til_ready
(
struct
tty_struct
*
,
struct
file
*
,
struct
mxser_struct
*
);
static
int
mxser_startup
(
struct
mxser_struct
*
);
static
void
mxser_shutdown
(
struct
mxser_struct
*
);
...
...
@@ -1989,7 +1989,7 @@ static irqreturn_t mxser_interrupt(int irq, void *dev_id, struct pt_regs *regs)
return
handled
;
}
static
inline
void
mxser_receive_chars
(
struct
mxser_struct
*
info
,
int
*
status
)
static
void
mxser_receive_chars
(
struct
mxser_struct
*
info
,
int
*
status
)
{
struct
tty_struct
*
tty
=
info
->
tty
;
unsigned
char
ch
,
gdl
;
...
...
@@ -2143,7 +2143,7 @@ static inline void mxser_receive_chars(struct mxser_struct *info, int *status)
}
static
inline
void
mxser_transmit_chars
(
struct
mxser_struct
*
info
)
static
void
mxser_transmit_chars
(
struct
mxser_struct
*
info
)
{
int
count
,
cnt
;
unsigned
long
flags
;
...
...
@@ -2206,7 +2206,7 @@ static inline void mxser_transmit_chars(struct mxser_struct *info)
spin_unlock_irqrestore
(
&
info
->
slock
,
flags
);
}
static
inline
void
mxser_check_modem_status
(
struct
mxser_struct
*
info
,
int
status
)
static
void
mxser_check_modem_status
(
struct
mxser_struct
*
info
,
int
status
)
{
/* update input line counters */
if
(
status
&
UART_MSR_TERI
)
...
...
fs/xfs/linux-2.6/kmem.c
View file @
384263dc
...
...
@@ -35,6 +35,7 @@
#include <linux/vmalloc.h>
#include <linux/highmem.h>
#include <linux/swap.h>
#include <linux/blkdev.h>
#include "time.h"
#include "kmem.h"
...
...
@@ -46,7 +47,8 @@
void
*
kmem_alloc
(
size_t
size
,
int
flags
)
{
int
retries
=
0
,
lflags
=
kmem_flags_convert
(
flags
);
int
retries
=
0
;
int
lflags
=
kmem_flags_convert
(
flags
);
void
*
ptr
;
do
{
...
...
@@ -57,8 +59,10 @@ kmem_alloc(size_t size, int flags)
if
(
ptr
||
(
flags
&
(
KM_MAYFAIL
|
KM_NOSLEEP
)))
return
ptr
;
if
(
!
(
++
retries
%
100
))
printk
(
KERN_ERR
"possible deadlock in %s (mode:0x%x)
\n
"
,
printk
(
KERN_ERR
"XFS: possible memory allocation "
"deadlock in %s (mode:0x%x)
\n
"
,
__FUNCTION__
,
lflags
);
blk_congestion_wait
(
WRITE
,
HZ
/
50
);
}
while
(
1
);
}
...
...
@@ -102,7 +106,8 @@ kmem_realloc(void *ptr, size_t newsize, size_t oldsize, int flags)
void
*
kmem_zone_alloc
(
kmem_zone_t
*
zone
,
int
flags
)
{
int
retries
=
0
,
lflags
=
kmem_flags_convert
(
flags
);
int
retries
=
0
;
int
lflags
=
kmem_flags_convert
(
flags
);
void
*
ptr
;
do
{
...
...
@@ -110,8 +115,10 @@ kmem_zone_alloc(kmem_zone_t *zone, int flags)
if
(
ptr
||
(
flags
&
(
KM_MAYFAIL
|
KM_NOSLEEP
)))
return
ptr
;
if
(
!
(
++
retries
%
100
))
printk
(
KERN_ERR
"possible deadlock in %s (mode:0x%x)
\n
"
,
printk
(
KERN_ERR
"XFS: possible memory allocation "
"deadlock in %s (mode:0x%x)
\n
"
,
__FUNCTION__
,
lflags
);
blk_congestion_wait
(
WRITE
,
HZ
/
50
);
}
while
(
1
);
}
...
...
fs/xfs/linux-2.6/kmem.h
View file @
384263dc
...
...
@@ -83,7 +83,7 @@ typedef unsigned long xfs_pflags_t;
static
__inline
unsigned
int
kmem_flags_convert
(
int
flags
)
{
int
lflags
;
int
lflags
=
__GFP_NOWARN
;
/* we'll report problems, if need be */
#ifdef DEBUG
if
(
unlikely
(
flags
&
~
(
KM_SLEEP
|
KM_NOSLEEP
|
KM_NOFS
|
KM_MAYFAIL
)))
{
...
...
fs/xfs/linux-2.6/xfs_buf.c
View file @
384263dc
...
...
@@ -53,13 +53,10 @@
#include <linux/workqueue.h>
#include <linux/suspend.h>
#include <linux/percpu.h>
#include <linux/blkdev.h>
#include "xfs_linux.h"
#ifndef GFP_READAHEAD
#define GFP_READAHEAD (__GFP_NOWARN|__GFP_NORETRY)
#endif
/*
* File wide globals
*/
...
...
@@ -118,8 +115,8 @@ ktrace_t *pagebuf_trace_buf;
*/
#define pb_to_gfp(flags) \
(((
flags) & PBF_READ_AHEAD) ? GFP_READAHEAD
: \
((flags) & PBF_DONT_BLOCK) ? GFP_NOFS : GFP_KERNEL
)
(((
(flags) & PBF_READ_AHEAD) ? __GFP_NORETRY
: \
((flags) & PBF_DONT_BLOCK) ? GFP_NOFS : GFP_KERNEL) | __GFP_NOWARN
)
#define pb_to_km(flags) \
(((flags) & PBF_DONT_BLOCK) ? KM_NOFS : KM_SLEEP)
...
...
@@ -387,13 +384,13 @@ _pagebuf_lookup_pages(
*/
if
(
!
(
++
retries
%
100
))
printk
(
KERN_ERR
"possible deadlock in %s (mode:0x%x)
\n
"
,
"XFS: possible memory allocation "
"deadlock in %s (mode:0x%x)
\n
"
,
__FUNCTION__
,
gfp_mask
);
XFS_STATS_INC
(
pb_page_retries
);
pagebuf_daemon_wakeup
(
0
,
gfp_mask
);
set_current_state
(
TASK_UNINTERRUPTIBLE
);
schedule_timeout
(
10
);
blk_congestion_wait
(
WRITE
,
HZ
/
50
);
goto
retry
;
}
...
...
@@ -486,7 +483,7 @@ _pagebuf_map_pages(
* which may imply that this call will block until those buffers
* are unlocked. No I/O is implied by this call.
*/
STATIC
xfs_buf_t
*
xfs_buf_t
*
_pagebuf_find
(
/* find buffer for block */
xfs_buftarg_t
*
target
,
/* target for block */
loff_t
ioff
,
/* starting offset of range */
...
...
@@ -578,39 +575,14 @@ _pagebuf_find( /* find buffer for block */
return
(
pb
);
}
/*
* pagebuf_find
*
* pagebuf_find returns a buffer matching the specified range of
* data for the specified target, if any of the relevant blocks
* are in memory. The buffer may have unallocated holes, if
* some, but not all, of the blocks are in memory. Even where
* pages are present in the buffer, not all of every page may be
* valid.
*/
xfs_buf_t
*
pagebuf_find
(
/* find buffer for block */
/* if the block is in memory */
xfs_buftarg_t
*
target
,
/* target for block */
loff_t
ioff
,
/* starting offset of range */
size_t
isize
,
/* length of range */
page_buf_flags_t
flags
)
/* PBF_TRYLOCK */
{
return
_pagebuf_find
(
target
,
ioff
,
isize
,
flags
,
NULL
);
}
/*
*
pagebuf_get
*
xfs_buf_get_flags assembles a buffer covering the specified range.
*
* pagebuf_get assembles a buffer covering the specified range.
* Some or all of the blocks in the range may be valid. Storage
* in memory for all portions of the buffer will be allocated,
* although backing storage may not be. If PBF_READ is set in
* flags, pagebuf_iostart is called also.
* Storage in memory for all portions of the buffer will be allocated,
* although backing storage may not be.
*/
xfs_buf_t
*
pagebuf_get
(
/* allocate a buffer */
xfs_buf_get_flags
(
/* allocate a buffer */
xfs_buftarg_t
*
target
,
/* target for buffer */
loff_t
ioff
,
/* starting offset of range */
size_t
isize
,
/* length of range */
...
...
@@ -640,8 +612,8 @@ pagebuf_get( /* allocate a buffer */
if
(
!
(
pb
->
pb_flags
&
PBF_MAPPED
))
{
error
=
_pagebuf_map_pages
(
pb
,
flags
);
if
(
unlikely
(
error
))
{
printk
(
KERN_WARNING
"pagebuf_get: failed to map pages
\n
"
);
printk
(
KERN_WARNING
"%s: failed to map pages
\n
"
,
__FUNCTION__
);
goto
no_buffer
;
}
}
...
...
@@ -655,30 +627,50 @@ pagebuf_get( /* allocate a buffer */
pb
->
pb_bn
=
ioff
;
pb
->
pb_count_desired
=
pb
->
pb_buffer_length
;
if
(
flags
&
PBF_READ
)
{
PB_TRACE
(
pb
,
"get"
,
(
unsigned
long
)
flags
);
return
pb
;
no_buffer:
if
(
flags
&
(
PBF_LOCK
|
PBF_TRYLOCK
))
pagebuf_unlock
(
pb
);
pagebuf_rele
(
pb
);
return
NULL
;
}
xfs_buf_t
*
xfs_buf_read_flags
(
xfs_buftarg_t
*
target
,
loff_t
ioff
,
size_t
isize
,
page_buf_flags_t
flags
)
{
xfs_buf_t
*
pb
;
flags
|=
PBF_READ
;
pb
=
xfs_buf_get_flags
(
target
,
ioff
,
isize
,
flags
);
if
(
pb
)
{
if
(
PBF_NOT_DONE
(
pb
))
{
PB_TRACE
(
pb
,
"
get_
read"
,
(
unsigned
long
)
flags
);
PB_TRACE
(
pb
,
"read"
,
(
unsigned
long
)
flags
);
XFS_STATS_INC
(
pb_get_read
);
pagebuf_iostart
(
pb
,
flags
);
}
else
if
(
flags
&
PBF_ASYNC
)
{
PB_TRACE
(
pb
,
"
get_
read_async"
,
(
unsigned
long
)
flags
);
PB_TRACE
(
pb
,
"read_async"
,
(
unsigned
long
)
flags
);
/*
* Read ahead call which is already satisfied,
* drop the buffer
*/
goto
no_buffer
;
}
else
{
PB_TRACE
(
pb
,
"
get_
read_done"
,
(
unsigned
long
)
flags
);
PB_TRACE
(
pb
,
"read_done"
,
(
unsigned
long
)
flags
);
/* We do not want read in the flags */
pb
->
pb_flags
&=
~
PBF_READ
;
}
}
else
{
PB_TRACE
(
pb
,
"get_write"
,
(
unsigned
long
)
flags
);
}
return
pb
;
no_buffer:
no_buffer:
if
(
flags
&
(
PBF_LOCK
|
PBF_TRYLOCK
))
pagebuf_unlock
(
pb
);
pagebuf_rele
(
pb
);
...
...
@@ -723,8 +715,8 @@ pagebuf_readahead(
if
(
bdi_write_congested
(
bdi
))
return
;
flags
|=
(
PBF_TRYLOCK
|
PBF_
READ
|
PBF_
ASYNC
|
PBF_READ_AHEAD
);
pagebuf_get
(
target
,
ioff
,
isize
,
flags
);
flags
|=
(
PBF_TRYLOCK
|
PBF_ASYNC
|
PBF_READ_AHEAD
);
xfs_buf_read_flags
(
target
,
ioff
,
isize
,
flags
);
}
xfs_buf_t
*
...
...
@@ -1084,7 +1076,7 @@ _pagebuf_wait_unpin(
* done with respect to that I/O. The pb_iodone routine, if
* present, will be called as a side-effect.
*/
void
STATIC
void
pagebuf_iodone_work
(
void
*
v
)
{
...
...
@@ -1263,7 +1255,7 @@ bio_end_io_pagebuf(
return
0
;
}
void
STATIC
void
_pagebuf_ioapply
(
xfs_buf_t
*
pb
)
{
...
...
@@ -1473,6 +1465,34 @@ pagebuf_iomove(
* Handling of buftargs.
*/
/*
* Wait for any bufs with callbacks that have been submitted but
* have not yet returned... walk the hash list for the target.
*/
void
xfs_wait_buftarg
(
xfs_buftarg_t
*
target
)
{
xfs_buf_t
*
pb
,
*
n
;
pb_hash_t
*
h
;
int
i
;
for
(
i
=
0
;
i
<
NHASH
;
i
++
)
{
h
=
&
pbhash
[
i
];
again:
spin_lock
(
&
h
->
pb_hash_lock
);
list_for_each_entry_safe
(
pb
,
n
,
&
h
->
pb_hash
,
pb_hash_list
)
{
if
(
pb
->
pb_target
==
target
&&
!
(
pb
->
pb_flags
&
PBF_FS_MANAGED
))
{
spin_unlock
(
&
h
->
pb_hash_lock
);
delay
(
100
);
goto
again
;
}
}
spin_unlock
(
&
h
->
pb_hash_lock
);
}
}
void
xfs_free_buftarg
(
xfs_buftarg_t
*
btp
,
...
...
fs/xfs/linux-2.6/xfs_buf.h
View file @
384263dc
...
...
@@ -168,20 +168,36 @@ typedef struct xfs_buf {
/* Finding and Reading Buffers */
extern
xfs_buf_t
*
pagebuf_find
(
/* find buffer for block if */
extern
xfs_buf_t
*
_
pagebuf_find
(
/* find buffer for block if */
/* the block is in memory */
xfs_buftarg_t
*
,
/* inode for block */
loff_t
,
/* starting offset of range */
size_t
,
/* length of range */
page_buf_flags_t
);
/* PBF_LOCK */
page_buf_flags_t
,
/* PBF_LOCK */
xfs_buf_t
*
);
/* newly allocated buffer */
extern
xfs_buf_t
*
pagebuf_get
(
/* allocate a buffer */
#define xfs_incore(buftarg,blkno,len,lockit) \
_pagebuf_find(buftarg, blkno ,len, lockit, NULL)
extern
xfs_buf_t
*
xfs_buf_get_flags
(
/* allocate a buffer */
xfs_buftarg_t
*
,
/* inode for buffer */
loff_t
,
/* starting offset of range */
size_t
,
/* length of range */
page_buf_flags_t
);
/* PBF_LOCK, PBF_READ, */
/* PBF_ASYNC */
#define xfs_buf_get(target, blkno, len, flags) \
xfs_buf_get_flags((target), (blkno), (len), PBF_LOCK | PBF_MAPPED)
extern
xfs_buf_t
*
xfs_buf_read_flags
(
/* allocate and read a buffer */
xfs_buftarg_t
*
,
/* inode for buffer */
loff_t
,
/* starting offset of range */
size_t
,
/* length of range */
page_buf_flags_t
);
/* PBF_LOCK, PBF_ASYNC */
#define xfs_buf_read(target, blkno, len, flags) \
xfs_buf_read_flags((target), (blkno), (len), PBF_LOCK | PBF_MAPPED)
extern
xfs_buf_t
*
pagebuf_lookup
(
xfs_buftarg_t
*
,
loff_t
,
/* starting offset of range */
...
...
@@ -472,18 +488,6 @@ extern inline xfs_caddr_t xfs_buf_offset(xfs_buf_t *bp, size_t offset)
#define XFS_BUF_SET_VTYPE(bp, type)
#define XFS_BUF_SET_REF(bp, ref)
#define xfs_buf_read(target, blkno, len, flags) \
pagebuf_get((target), (blkno), (len), \
PBF_LOCK | PBF_READ | PBF_MAPPED)
#define xfs_buf_get(target, blkno, len, flags) \
pagebuf_get((target), (blkno), (len), \
PBF_LOCK | PBF_MAPPED)
#define xfs_buf_read_flags(target, blkno, len, flags) \
pagebuf_get((target), (blkno), (len), PBF_READ | (flags))
#define xfs_buf_get_flags(target, blkno, len, flags) \
pagebuf_get((target), (blkno), (len), (flags))
static
inline
int
xfs_bawrite
(
void
*
mp
,
xfs_buf_t
*
bp
)
{
bp
->
pb_fspriv3
=
mp
;
...
...
@@ -508,10 +512,6 @@ static inline void xfs_buf_relse(xfs_buf_t *bp)
#define xfs_biodone(pb) \
pagebuf_iodone(pb, (pb->pb_flags & PBF_FS_DATAIOD), 0)
#define xfs_incore(buftarg,blkno,len,lockit) \
pagebuf_find(buftarg, blkno ,len, lockit)
#define xfs_biomove(pb, off, len, data, rw) \
pagebuf_iomove((pb), (off), (len), (data), \
((rw) == XFS_B_WRITE) ? PBRW_WRITE : PBRW_READ)
...
...
@@ -566,6 +566,7 @@ static inline int xfs_bdwrite(void *mp, xfs_buf_t *bp)
extern
xfs_buftarg_t
*
xfs_alloc_buftarg
(
struct
block_device
*
);
extern
void
xfs_free_buftarg
(
xfs_buftarg_t
*
,
int
);
extern
void
xfs_wait_buftarg
(
xfs_buftarg_t
*
);
extern
int
xfs_setsize_buftarg
(
xfs_buftarg_t
*
,
unsigned
int
,
unsigned
int
);
extern
void
xfs_incore_relse
(
xfs_buftarg_t
*
,
int
,
int
);
extern
int
xfs_flush_buftarg
(
xfs_buftarg_t
*
,
int
);
...
...
fs/xfs/linux-2.6/xfs_file.c
View file @
384263dc
...
...
@@ -398,7 +398,7 @@ linvfs_file_mmap(
vattr_t
va
=
{
.
va_mask
=
XFS_AT_UPDATIME
};
int
error
;
if
(
(
vp
->
v_type
==
VREG
)
&&
(
vp
->
v_vfsp
->
vfs_flag
&
VFS_DMI
)
)
{
if
(
vp
->
v_vfsp
->
vfs_flag
&
VFS_DMI
)
{
xfs_mount_t
*
mp
=
XFS_VFSTOM
(
vp
->
v_vfsp
);
error
=
-
XFS_SEND_MMAP
(
mp
,
vma
,
0
);
...
...
@@ -473,7 +473,7 @@ linvfs_mprotect(
vnode_t
*
vp
=
LINVFS_GET_VP
(
vma
->
vm_file
->
f_dentry
->
d_inode
);
int
error
=
0
;
if
(
(
vp
->
v_type
==
VREG
)
&&
(
vp
->
v_vfsp
->
vfs_flag
&
VFS_DMI
)
)
{
if
(
vp
->
v_vfsp
->
vfs_flag
&
VFS_DMI
)
{
if
((
vma
->
vm_flags
&
VM_MAYSHARE
)
&&
(
newflags
&
VM_WRITE
)
&&
!
(
vma
->
vm_flags
&
VM_WRITE
))
{
xfs_mount_t
*
mp
=
XFS_VFSTOM
(
vp
->
v_vfsp
);
...
...
fs/xfs/linux-2.6/xfs_globals.c
View file @
384263dc
...
...
@@ -64,6 +64,7 @@ xfs_param_t xfs_params = {
.
xfs_buf_timer
=
{
100
/
2
,
1
*
100
,
30
*
100
},
.
xfs_buf_age
=
{
1
*
100
,
15
*
100
,
7200
*
100
},
.
inherit_nosym
=
{
0
,
0
,
1
},
.
rotorstep
=
{
1
,
1
,
255
},
};
/*
...
...
fs/xfs/linux-2.6/xfs_ioctl.c
View file @
384263dc
...
...
@@ -270,7 +270,7 @@ xfs_vget_fsop_handlereq(
/*
* Get the XFS inode, building a vnode to go with it.
*/
error
=
xfs_iget
(
mp
,
NULL
,
ino
,
XFS_ILOCK_SHARED
,
&
ip
,
0
);
error
=
xfs_iget
(
mp
,
NULL
,
ino
,
0
,
XFS_ILOCK_SHARED
,
&
ip
,
0
);
if
(
error
)
return
error
;
if
(
ip
==
NULL
)
...
...
fs/xfs/linux-2.6/xfs_linux.h
View file @
384263dc
...
...
@@ -142,6 +142,7 @@ static inline void set_buffer_unwritten_io(struct buffer_head *bh)
#define xfs_buf_timer_centisecs xfs_params.xfs_buf_timer.val
#define xfs_buf_age_centisecs xfs_params.xfs_buf_age.val
#define xfs_inherit_nosymlinks xfs_params.inherit_nosym.val
#define xfs_rotorstep xfs_params.rotorstep.val
#define current_cpu() smp_processor_id()
#define current_pid() (current->pid)
...
...
fs/xfs/linux-2.6/xfs_super.c
View file @
384263dc
...
...
@@ -234,6 +234,10 @@ xfs_initialize_vnode(
vp
->
v_type
=
IFTOVT
(
ip
->
i_d
.
di_mode
);
xfs_revalidate_inode
(
XFS_BHVTOM
(
bdp
),
vp
,
ip
);
xfs_set_inodeops
(
inode
);
ip
->
i_flags
&=
~
XFS_INEW
;
barrier
();
unlock_new_inode
(
inode
);
}
}
...
...
@@ -284,7 +288,7 @@ linvfs_destroy_inode(
kmem_cache_free
(
linvfs_inode_zone
,
LINVFS_GET_VP
(
inode
));
}
int
STATIC
int
xfs_inode_shake
(
int
priority
,
unsigned
int
gfp_mask
)
...
...
fs/xfs/linux-2.6/xfs_sysctl.c
View file @
384263dc
...
...
@@ -134,6 +134,11 @@ STATIC ctl_table xfs_table[] = {
&
sysctl_intvec
,
NULL
,
&
xfs_params
.
inherit_nosym
.
min
,
&
xfs_params
.
inherit_nosym
.
max
},
{
XFS_ROTORSTEP
,
"rotorstep"
,
&
xfs_params
.
rotorstep
.
val
,
sizeof
(
int
),
0644
,
NULL
,
&
proc_dointvec_minmax
,
&
sysctl_intvec
,
NULL
,
&
xfs_params
.
rotorstep
.
min
,
&
xfs_params
.
rotorstep
.
max
},
/* please keep this the last entry */
#ifdef CONFIG_PROC_FS
{
XFS_STATS_CLEAR
,
"stats_clear"
,
&
xfs_params
.
stats_clear
.
val
,
...
...
fs/xfs/linux-2.6/xfs_sysctl.h
View file @
384263dc
...
...
@@ -60,6 +60,7 @@ typedef struct xfs_param {
xfs_sysctl_val_t
xfs_buf_timer
;
/* Interval between xfsbufd wakeups. */
xfs_sysctl_val_t
xfs_buf_age
;
/* Metadata buffer age before flush. */
xfs_sysctl_val_t
inherit_nosym
;
/* Inherit the "nosymlinks" flag. */
xfs_sysctl_val_t
rotorstep
;
/* inode32 AG rotoring control knob */
}
xfs_param_t
;
/*
...
...
@@ -97,6 +98,7 @@ enum {
XFS_BUF_AGE
=
17
,
/* XFS_IO_BYPASS = 18 */
XFS_INHERIT_NOSYM
=
19
,
XFS_ROTORSTEP
=
20
,
};
extern
xfs_param_t
xfs_params
;
...
...
fs/xfs/quota/xfs_qm.c
View file @
384263dc
/*
* Copyright (c) 2000-200
2
Silicon Graphics, Inc. All Rights Reserved.
* Copyright (c) 2000-200
4
Silicon Graphics, Inc. All Rights Reserved.
*
* 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
...
...
@@ -85,7 +85,6 @@ kmem_shaker_t xfs_qm_shaker;
STATIC
void
xfs_qm_list_init
(
xfs_dqlist_t
*
,
char
*
,
int
);
STATIC
void
xfs_qm_list_destroy
(
xfs_dqlist_t
*
);
STATIC
int
xfs_qm_quotacheck
(
xfs_mount_t
*
);
STATIC
int
xfs_qm_init_quotainos
(
xfs_mount_t
*
);
STATIC
int
xfs_qm_shake
(
int
,
unsigned
int
);
...
...
@@ -349,7 +348,8 @@ xfs_qm_unmount_quotadestroy(
*/
int
xfs_qm_mount_quotas
(
xfs_mount_t
*
mp
)
xfs_mount_t
*
mp
,
int
mfsi_flags
)
{
unsigned
long
s
;
int
error
=
0
;
...
...
@@ -398,22 +398,16 @@ xfs_qm_mount_quotas(
/*
* If any of the quotas are not consistent, do a quotacheck.
*/
if
(
XFS_QM_NEED_QUOTACHECK
(
mp
))
{
if
(
XFS_QM_NEED_QUOTACHECK
(
mp
)
&&
!
(
mfsi_flags
&
XFS_MFSI_NO_QUOTACHECK
))
{
#ifdef DEBUG
cmn_err
(
CE_NOTE
,
"Doing a quotacheck. Please wait."
);
#endif
if
((
error
=
xfs_qm_quotacheck
(
mp
)))
{
cmn_err
(
CE_WARN
,
"Quotacheck unsuccessful (Error %d): "
"Disabling quotas."
,
error
);
/*
* We must turn off quotas.
/* Quotacheck has failed and quotas have
* been disabled.
*/
ASSERT
(
mp
->
m_quotainfo
!=
NULL
);
ASSERT
(
xfs_Gqm
!=
NULL
);
xfs_qm_destroy_quotainfo
(
mp
);
mp
->
m_qflags
=
0
;
goto
write_changes
;
return
XFS_ERROR
(
error
);
}
#ifdef DEBUG
cmn_err
(
CE_NOTE
,
"Done quotacheck."
);
...
...
@@ -1788,7 +1782,7 @@ xfs_qm_dqusage_adjust(
* the case in all other instances. It's OK that we do this because
* quotacheck is done only at mount time.
*/
if
((
error
=
xfs_iget
(
mp
,
NULL
,
ino
,
XFS_ILOCK_EXCL
,
&
ip
,
bno
)))
{
if
((
error
=
xfs_iget
(
mp
,
NULL
,
ino
,
0
,
XFS_ILOCK_EXCL
,
&
ip
,
bno
)))
{
*
res
=
BULKSTAT_RV_NOTHING
;
return
(
error
);
}
...
...
@@ -1875,9 +1869,9 @@ xfs_qm_dqusage_adjust(
/*
* Walk thru all the filesystem inodes and construct a consistent view
* of the disk quota world.
* of the disk quota world.
If the quotacheck fails, disable quotas.
*/
STATIC
int
int
xfs_qm_quotacheck
(
xfs_mount_t
*
mp
)
{
...
...
@@ -1973,7 +1967,20 @@ xfs_qm_quotacheck(
XQM_LIST_PRINT
(
&
(
XFS_QI_MPL_LIST
(
mp
)),
MPL_NEXT
,
"++++ Mp list +++"
);
error_return:
if
(
error
)
{
cmn_err
(
CE_WARN
,
"XFS quotacheck %s: Unsuccessful (Error %d): "
"Disabling quotas."
,
mp
->
m_fsname
,
error
);
/*
* We must turn off quotas.
*/
ASSERT
(
mp
->
m_quotainfo
!=
NULL
);
ASSERT
(
xfs_Gqm
!=
NULL
);
xfs_qm_destroy_quotainfo
(
mp
);
xfs_mount_reset_sbqflags
(
mp
);
}
else
{
cmn_err
(
CE_NOTE
,
"XFS quotacheck %s: Done."
,
mp
->
m_fsname
);
}
return
(
error
);
}
...
...
@@ -2003,14 +2010,14 @@ xfs_qm_init_quotainos(
mp
->
m_sb
.
sb_uquotino
!=
NULLFSINO
)
{
ASSERT
(
mp
->
m_sb
.
sb_uquotino
>
0
);
if
((
error
=
xfs_iget
(
mp
,
NULL
,
mp
->
m_sb
.
sb_uquotino
,
0
,
&
uip
,
0
)))
0
,
0
,
&
uip
,
0
)))
return
XFS_ERROR
(
error
);
}
if
(
XFS_IS_GQUOTA_ON
(
mp
)
&&
mp
->
m_sb
.
sb_gquotino
!=
NULLFSINO
)
{
ASSERT
(
mp
->
m_sb
.
sb_gquotino
>
0
);
if
((
error
=
xfs_iget
(
mp
,
NULL
,
mp
->
m_sb
.
sb_gquotino
,
0
,
&
gip
,
0
)))
{
0
,
0
,
&
gip
,
0
)))
{
if
(
uip
)
VN_RELE
(
XFS_ITOV
(
uip
));
return
XFS_ERROR
(
error
);
...
...
fs/xfs/quota/xfs_qm.h
View file @
384263dc
/*
* Copyright (c) 2000-200
3
Silicon Graphics, Inc. All Rights Reserved.
* Copyright (c) 2000-200
4
Silicon Graphics, Inc. All Rights Reserved.
*
* 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
...
...
@@ -182,10 +182,13 @@ typedef struct xfs_dquot_acct {
#define XFS_QM_HOLD(xqm) ((xqm)->qm_nrefs++)
#define XFS_QM_RELE(xqm) ((xqm)->qm_nrefs--)
extern
void
xfs_mount_reset_sbqflags
(
xfs_mount_t
*
);
extern
int
xfs_qm_init_quotainfo
(
xfs_mount_t
*
);
extern
void
xfs_qm_destroy_quotainfo
(
xfs_mount_t
*
);
extern
int
xfs_qm_mount_quotas
(
xfs_mount_t
*
);
extern
int
xfs_qm_mount_quotas
(
xfs_mount_t
*
,
int
);
extern
void
xfs_qm_mount_quotainit
(
xfs_mount_t
*
,
uint
);
extern
int
xfs_qm_quotacheck
(
xfs_mount_t
*
);
extern
void
xfs_qm_unmount_quotadestroy
(
xfs_mount_t
*
);
extern
int
xfs_qm_unmount_quotas
(
xfs_mount_t
*
);
extern
int
xfs_qm_write_sb_changes
(
xfs_mount_t
*
,
__int64_t
);
...
...
fs/xfs/quota/xfs_qm_bhv.c
View file @
384263dc
/*
* Copyright (c) 2000-200
3
Silicon Graphics, Inc. All Rights Reserved.
* Copyright (c) 2000-200
4
Silicon Graphics, Inc. All Rights Reserved.
*
* 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
...
...
@@ -207,10 +207,9 @@ xfs_qm_syncall(
}
/*
* When xfsquotas isn't installed and the superblock had quotas, we need to
* clear the quotaflags from superblock.
* Clear the quotaflags in memory and in the superblock.
*/
STATIC
void
void
xfs_mount_reset_sbqflags
(
xfs_mount_t
*
mp
)
{
...
...
@@ -241,6 +240,8 @@ xfs_mount_reset_sbqflags(
if
(
xfs_trans_reserve
(
tp
,
0
,
mp
->
m_sb
.
sb_sectsize
+
128
,
0
,
0
,
XFS_DEFAULT_LOG_COUNT
))
{
xfs_trans_cancel
(
tp
,
0
);
xfs_fs_cmn_err
(
CE_ALERT
,
mp
,
"xfs_mount_reset_sbqflags: Superblock update failed!"
);
return
;
}
xfs_mod_sb
(
tp
,
XFS_SB_QFLAGS
);
...
...
@@ -294,15 +295,12 @@ xfs_qm_newmount(
*/
if
(
quotaondisk
&&
!
XFS_QM_NEED_QUOTACHECK
(
mp
))
{
/*
* If the xfs quota code isn't installed,
* we have to reset the quotachk'd bit.
* If an error occured, qm_mount_quotas code
* has already disabled quotas. So, just finish
* mounting, and get on with the boring life
* without disk quotas.
*/
if
(
xfs_qm_mount_quotas
(
mp
))
xfs_mount_reset_sbqflags
(
mp
);
xfs_qm_mount_quotas
(
mp
,
0
);
}
else
{
/*
* Clear the quota flags, but remember them. This
...
...
@@ -324,13 +322,13 @@ STATIC int
xfs_qm_endmount
(
xfs_mount_t
*
mp
,
uint
needquotamount
,
uint
quotaflags
)
uint
quotaflags
,
int
mfsi_flags
)
{
if
(
needquotamount
)
{
ASSERT
(
mp
->
m_qflags
==
0
);
mp
->
m_qflags
=
quotaflags
;
if
(
xfs_qm_mount_quotas
(
mp
))
xfs_mount_reset_sbqflags
(
mp
);
xfs_qm_mount_quotas
(
mp
,
mfsi_flags
);
}
#if defined(DEBUG) && defined(XFS_LOUD_RECOVERY)
...
...
fs/xfs/quota/xfs_qm_syscalls.c
View file @
384263dc
...
...
@@ -404,7 +404,7 @@ xfs_qm_scall_trunc_qfiles(
}
if
((
flags
&
XFS_DQ_USER
)
&&
mp
->
m_sb
.
sb_uquotino
!=
NULLFSINO
)
{
error
=
xfs_iget
(
mp
,
NULL
,
mp
->
m_sb
.
sb_uquotino
,
0
,
&
qip
,
0
);
error
=
xfs_iget
(
mp
,
NULL
,
mp
->
m_sb
.
sb_uquotino
,
0
,
0
,
&
qip
,
0
);
if
(
!
error
)
{
(
void
)
xfs_truncate_file
(
mp
,
qip
);
VN_RELE
(
XFS_ITOV
(
qip
));
...
...
@@ -412,7 +412,7 @@ xfs_qm_scall_trunc_qfiles(
}
if
((
flags
&
XFS_DQ_GROUP
)
&&
mp
->
m_sb
.
sb_gquotino
!=
NULLFSINO
)
{
error
=
xfs_iget
(
mp
,
NULL
,
mp
->
m_sb
.
sb_gquotino
,
0
,
&
qip
,
0
);
error
=
xfs_iget
(
mp
,
NULL
,
mp
->
m_sb
.
sb_gquotino
,
0
,
0
,
&
qip
,
0
);
if
(
!
error
)
{
(
void
)
xfs_truncate_file
(
mp
,
qip
);
VN_RELE
(
XFS_ITOV
(
qip
));
...
...
@@ -555,11 +555,13 @@ xfs_qm_scall_getqstat(
gip
=
mp
->
m_quotainfo
->
qi_gquotaip
;
}
if
(
!
uip
&&
mp
->
m_sb
.
sb_uquotino
!=
NULLFSINO
)
{
if
(
xfs_iget
(
mp
,
NULL
,
mp
->
m_sb
.
sb_uquotino
,
0
,
&
uip
,
0
)
==
0
)
if
(
xfs_iget
(
mp
,
NULL
,
mp
->
m_sb
.
sb_uquotino
,
0
,
0
,
&
uip
,
0
)
==
0
)
tempuqip
=
B_TRUE
;
}
if
(
!
gip
&&
mp
->
m_sb
.
sb_gquotino
!=
NULLFSINO
)
{
if
(
xfs_iget
(
mp
,
NULL
,
mp
->
m_sb
.
sb_gquotino
,
0
,
&
gip
,
0
)
==
0
)
if
(
xfs_iget
(
mp
,
NULL
,
mp
->
m_sb
.
sb_gquotino
,
0
,
0
,
&
gip
,
0
)
==
0
)
tempgqip
=
B_TRUE
;
}
if
(
uip
)
{
...
...
@@ -1338,7 +1340,7 @@ xfs_qm_internalqcheck_adjust(
ipreleased
=
B_FALSE
;
again:
lock_flags
=
XFS_ILOCK_SHARED
;
if
((
error
=
xfs_iget
(
mp
,
NULL
,
ino
,
lock_flags
,
&
ip
,
bno
)))
{
if
((
error
=
xfs_iget
(
mp
,
NULL
,
ino
,
0
,
lock_flags
,
&
ip
,
bno
)))
{
*
res
=
BULKSTAT_RV_NOTHING
;
return
(
error
);
}
...
...
fs/xfs/xfs_alloc.c
View file @
384263dc
...
...
@@ -2247,6 +2247,7 @@ xfs_alloc_vextent(
xfs_alloctype_t
type
;
/* input allocation type */
int
bump_rotor
=
0
;
int
no_min
=
0
;
xfs_agnumber_t
rotorstep
=
xfs_rotorstep
;
/* inode32 agf stepper */
mp
=
args
->
mp
;
type
=
args
->
otype
=
args
->
type
;
...
...
@@ -2310,7 +2311,9 @@ xfs_alloc_vextent(
*/
if
((
args
->
userdata
==
XFS_ALLOC_INITIAL_USER_DATA
)
&&
(
mp
->
m_flags
&
XFS_MOUNT_32BITINODES
))
{
args
->
fsbno
=
XFS_AGB_TO_FSB
(
mp
,
mp
->
m_agfrotor
,
0
);
args
->
fsbno
=
XFS_AGB_TO_FSB
(
mp
,
((
mp
->
m_agfrotor
/
rotorstep
)
%
mp
->
m_sb
.
sb_agcount
),
0
);
bump_rotor
=
1
;
}
args
->
agbno
=
XFS_FSB_TO_AGBNO
(
mp
,
args
->
fsbno
);
...
...
@@ -2326,7 +2329,8 @@ xfs_alloc_vextent(
/*
* Start with the last place we left off.
*/
args
->
agno
=
sagno
=
mp
->
m_agfrotor
;
args
->
agno
=
sagno
=
(
mp
->
m_agfrotor
/
rotorstep
)
%
mp
->
m_sb
.
sb_agcount
;
args
->
type
=
XFS_ALLOCTYPE_THIS_AG
;
flags
=
XFS_ALLOC_FLAG_TRYLOCK
;
}
else
if
(
type
==
XFS_ALLOCTYPE_FIRST_AG
)
{
...
...
@@ -2400,8 +2404,14 @@ xfs_alloc_vextent(
}
}
up_read
(
&
mp
->
m_peraglock
);
if
(
bump_rotor
||
(
type
==
XFS_ALLOCTYPE_ANY_AG
))
mp
->
m_agfrotor
=
(
args
->
agno
+
1
)
%
mp
->
m_sb
.
sb_agcount
;
if
(
bump_rotor
||
(
type
==
XFS_ALLOCTYPE_ANY_AG
))
{
if
(
args
->
agno
==
sagno
)
mp
->
m_agfrotor
=
(
mp
->
m_agfrotor
+
1
)
%
(
mp
->
m_sb
.
sb_agcount
*
rotorstep
);
else
mp
->
m_agfrotor
=
(
args
->
agno
*
rotorstep
+
1
)
%
(
mp
->
m_sb
.
sb_agcount
*
rotorstep
);
}
break
;
default:
ASSERT
(
0
);
...
...
fs/xfs/xfs_iget.c
View file @
384263dc
...
...
@@ -169,6 +169,7 @@ xfs_iget_core(
xfs_mount_t
*
mp
,
xfs_trans_t
*
tp
,
xfs_ino_t
ino
,
uint
flags
,
uint
lock_flags
,
xfs_inode_t
**
ipp
,
xfs_daddr_t
bno
)
...
...
@@ -180,7 +181,6 @@ xfs_iget_core(
ulong
version
;
int
error
;
/* REFERENCED */
int
newnode
;
xfs_chash_t
*
ch
;
xfs_chashlist_t
*
chl
,
*
chlnew
;
SPLDECL
(
s
);
...
...
@@ -193,11 +193,22 @@ xfs_iget_core(
for
(
ip
=
ih
->
ih_next
;
ip
!=
NULL
;
ip
=
ip
->
i_next
)
{
if
(
ip
->
i_ino
==
ino
)
{
/*
* If INEW is set this inode is being set up
* we need to pause and try again.
*/
if
(
ip
->
i_flags
&
XFS_INEW
)
{
read_unlock
(
&
ih
->
ih_lock
);
delay
(
1
);
XFS_STATS_INC
(
xs_ig_frecycle
);
inode_vp
=
XFS_ITOV_NULL
(
ip
);
goto
again
;
}
inode_vp
=
XFS_ITOV_NULL
(
ip
);
if
(
inode_vp
==
NULL
)
{
/* If IRECLAIM is set this inode is
/*
* If IRECLAIM is set this inode is
* on its way out of the system,
* we need to pause and try again.
*/
...
...
@@ -250,14 +261,15 @@ xfs_iget_core(
XFS_STATS_INC
(
xs_ig_found
);
finish_inode:
if
(
lock_flags
!=
0
)
{
xfs_ilock
(
ip
,
lock_flags
);
}
newnode
=
(
ip
->
i_d
.
di_mode
==
0
);
if
(
newnode
)
{
if
(
ip
->
i_d
.
di_mode
==
0
)
{
if
(
!
(
flags
&
IGET_CREATE
))
return
ENOENT
;
xfs_iocore_inode_reinit
(
ip
);
}
if
(
lock_flags
!=
0
)
xfs_ilock
(
ip
,
lock_flags
);
ip
->
i_flags
&=
~
XFS_ISTALE
;
vn_trace_exit
(
vp
,
"xfs_iget.found"
,
...
...
@@ -294,6 +306,11 @@ xfs_iget_core(
xfs_ilock
(
ip
,
lock_flags
);
}
if
((
ip
->
i_d
.
di_mode
==
0
)
&&
!
(
flags
&
IGET_CREATE
))
{
xfs_idestroy
(
ip
);
return
ENOENT
;
}
/*
* Put ip on its hash chain, unless someone else hashed a duplicate
* after we released the hash lock.
...
...
@@ -324,6 +341,7 @@ xfs_iget_core(
ih
->
ih_next
=
ip
;
ip
->
i_udquot
=
ip
->
i_gdquot
=
NULL
;
ih
->
ih_version
++
;
ip
->
i_flags
|=
XFS_INEW
;
write_unlock
(
&
ih
->
ih_lock
);
...
...
@@ -404,8 +422,6 @@ xfs_iget_core(
XFS_MOUNT_IUNLOCK
(
mp
);
newnode
=
1
;
return_ip:
ASSERT
(
ip
->
i_df
.
if_ext_max
==
XFS_IFORK_DSIZE
(
ip
)
/
sizeof
(
xfs_bmbt_rec_t
));
...
...
@@ -434,6 +450,7 @@ xfs_iget(
xfs_mount_t
*
mp
,
xfs_trans_t
*
tp
,
xfs_ino_t
ino
,
uint
flags
,
uint
lock_flags
,
xfs_inode_t
**
ipp
,
xfs_daddr_t
bno
)
...
...
@@ -454,7 +471,7 @@ xfs_iget(
if
(
inode
->
i_state
&
I_NEW
)
{
inode_allocate:
vn_initialize
(
inode
);
error
=
xfs_iget_core
(
vp
,
mp
,
tp
,
ino
,
error
=
xfs_iget_core
(
vp
,
mp
,
tp
,
ino
,
flags
,
lock_flags
,
ipp
,
bno
);
if
(
error
)
{
vn_mark_bad
(
vp
);
...
...
@@ -576,6 +593,10 @@ xfs_iput_new(xfs_inode_t *ip,
vn_trace_entry
(
vp
,
"xfs_iput_new"
,
(
inst_t
*
)
__return_address
);
if
((
ip
->
i_d
.
di_mode
==
0
))
{
ASSERT
(
!
(
ip
->
i_flags
&
XFS_IRECLAIMABLE
));
vn_mark_bad
(
vp
);
}
if
(
inode
->
i_state
&
I_NEW
)
unlock_new_inode
(
inode
);
if
(
lock_flags
)
...
...
fs/xfs/xfs_inode.c
View file @
384263dc
...
...
@@ -1163,7 +1163,8 @@ xfs_ialloc(
* This is because we're setting fields here we need
* to prevent others from looking at until we're done.
*/
error
=
xfs_trans_iget
(
tp
->
t_mountp
,
tp
,
ino
,
XFS_ILOCK_EXCL
,
&
ip
);
error
=
xfs_trans_iget
(
tp
->
t_mountp
,
tp
,
ino
,
IGET_CREATE
,
XFS_ILOCK_EXCL
,
&
ip
);
if
(
error
!=
0
)
{
return
error
;
}
...
...
fs/xfs/xfs_inode.h
View file @
384263dc
...
...
@@ -381,6 +381,7 @@ void xfs_ifork_next_set(xfs_inode_t *ip, int w, int n);
#define XFS_IRECLAIM 0x0008
/* we have started reclaiming this inode */
#define XFS_ISTALE 0x0010
/* inode has been staled */
#define XFS_IRECLAIMABLE 0x0020
/* inode can be reclaimed */
#define XFS_INEW 0x0040
/*
* Flags for inode locking.
...
...
@@ -465,6 +466,9 @@ xfs_inode_t *xfs_bhvtoi(struct bhv_desc *bhvp);
/*
* xfs_iget.c prototypes.
*/
#define IGET_CREATE 1
void
xfs_ihash_init
(
struct
xfs_mount
*
);
void
xfs_ihash_free
(
struct
xfs_mount
*
);
void
xfs_chash_init
(
struct
xfs_mount
*
);
...
...
@@ -473,7 +477,7 @@ xfs_inode_t *xfs_inode_incore(struct xfs_mount *, xfs_ino_t,
struct
xfs_trans
*
);
void
xfs_inode_lock_init
(
xfs_inode_t
*
,
struct
vnode
*
);
int
xfs_iget
(
struct
xfs_mount
*
,
struct
xfs_trans
*
,
xfs_ino_t
,
uint
,
xfs_inode_t
**
,
xfs_daddr_t
);
uint
,
uint
,
xfs_inode_t
**
,
xfs_daddr_t
);
void
xfs_iput
(
xfs_inode_t
*
,
uint
);
void
xfs_iput_new
(
xfs_inode_t
*
,
uint
);
void
xfs_ilock
(
xfs_inode_t
*
,
uint
);
...
...
fs/xfs/xfs_itable.c
View file @
384263dc
...
...
@@ -102,7 +102,7 @@ xfs_bulkstat_one(
/* We're not being passed a pointer to a dinode. This happens
* if BULKSTAT_FG_IGET is selected. Do the iget.
*/
error
=
xfs_iget
(
mp
,
NULL
,
ino
,
XFS_ILOCK_SHARED
,
&
ip
,
bno
);
error
=
xfs_iget
(
mp
,
NULL
,
ino
,
0
,
XFS_ILOCK_SHARED
,
&
ip
,
bno
);
if
(
error
)
{
*
stat
=
BULKSTAT_RV_NOTHING
;
return
error
;
...
...
fs/xfs/xfs_log.c
View file @
384263dc
...
...
@@ -902,20 +902,15 @@ xlog_space_left(xlog_t *log, int cycle, int bytes)
}
else
{
/*
* The reservation head is behind the tail.
* This can only happen when the AIL is empty so the tail
* is equal to the head and the l_roundoff value in the
* log structure is taking up the difference between the
* reservation head and the tail. The bytes accounted for
* by the l_roundoff field are temporarily 'lost' to the
* reservation mechanism, but they are cleaned up when the
* log buffers that created them are reused. These lost
* bytes are what allow the reservation head to fall behind
* the tail in the case that the log is 'empty'.
* In this case we just want to return the size of the
* log as the amount of space left.
*/
ASSERT
((
tail_cycle
==
(
cycle
+
1
))
||
((
bytes
+
log
->
l_roundoff
)
>=
tail_bytes
));
xfs_fs_cmn_err
(
CE_ALERT
,
log
->
l_mp
,
"xlog_space_left: head behind tail
\n
"
" tail_cycle = %d, tail_bytes = %d
\n
"
" GH cycle = %d, GH bytes = %d"
,
tail_cycle
,
tail_bytes
,
cycle
,
bytes
);
ASSERT
(
0
);
free_bytes
=
log
->
l_logsize
;
}
return
free_bytes
;
...
...
@@ -1355,8 +1350,8 @@ xlog_grant_push_ail(xfs_mount_t *mp,
/*
* Flush out the in-core log (iclog) to the on-disk log in a
synchronous or
*
asynchronous
fashion. Previously, we should have moved the current iclog
* Flush out the in-core log (iclog) to the on-disk log in a
n asynchronous
* fashion. Previously, we should have moved the current iclog
* ptr in the log to point to the next available iclog. This allows further
* write to continue while this code syncs out an iclog ready to go.
* Before an in-core log can be written out, the data section must be scanned
...
...
@@ -1388,8 +1383,11 @@ xlog_sync(xlog_t *log,
int
i
,
ops
;
uint
count
;
/* byte count of bwrite */
uint
count_init
;
/* initial count before roundup */
int
roundoff
;
/* roundoff to BB or stripe */
int
split
=
0
;
/* split write into two regions */
int
error
;
SPLDECL
(
s
);
int
v2
=
XFS_SB_VERSION_HASLOGV2
(
&
log
->
l_mp
->
m_sb
);
XFS_STATS_INC
(
xs_log_writes
);
ASSERT
(
iclog
->
ic_refcnt
==
0
);
...
...
@@ -1398,23 +1396,34 @@ xlog_sync(xlog_t *log,
count_init
=
log
->
l_iclog_hsize
+
iclog
->
ic_offset
;
/* Round out the log write size */
if
(
XFS_SB_VERSION_HASLOGV2
(
&
log
->
l_mp
->
m_sb
)
&&
log
->
l_mp
->
m_sb
.
sb_logsunit
>
1
)
{
if
(
v2
&&
log
->
l_mp
->
m_sb
.
sb_logsunit
>
1
)
{
/* we have a v2 stripe unit to use */
count
=
XLOG_LSUNITTOB
(
log
,
XLOG_BTOLSUNIT
(
log
,
count_init
));
}
else
{
count
=
BBTOB
(
BTOBB
(
count_init
));
}
iclog
->
ic_roundoff
=
count
-
count_init
;
log
->
l_roundoff
+=
iclog
->
ic_roundoff
;
roundoff
=
count
-
count_init
;
ASSERT
(
roundoff
>=
0
);
ASSERT
((
v2
&&
log
->
l_mp
->
m_sb
.
sb_logsunit
>
1
&&
roundoff
<
log
->
l_mp
->
m_sb
.
sb_logsunit
)
||
(
log
->
l_mp
->
m_sb
.
sb_logsunit
<=
1
&&
roundoff
<
BBTOB
(
1
)));
xlog_pack_data
(
log
,
iclog
);
/* put cycle number in every block */
/* move grant heads by roundoff in sync */
s
=
GRANT_LOCK
(
log
);
XLOG_GRANT_ADD_SPACE
(
log
,
roundoff
,
'w'
);
XLOG_GRANT_ADD_SPACE
(
log
,
roundoff
,
'r'
);
GRANT_UNLOCK
(
log
,
s
);
/* put cycle number in every block */
xlog_pack_data
(
log
,
iclog
,
roundoff
);
/* real byte length */
if
(
XFS_SB_VERSION_HASLOGV2
(
&
log
->
l_mp
->
m_sb
)
)
{
if
(
v2
)
{
INT_SET
(
iclog
->
ic_header
.
h_len
,
ARCH_CONVERT
,
iclog
->
ic_offset
+
iclog
->
ic_
roundoff
);
iclog
->
ic_offset
+
roundoff
);
}
else
{
INT_SET
(
iclog
->
ic_header
.
h_len
,
ARCH_CONVERT
,
iclog
->
ic_offset
);
}
...
...
@@ -2278,11 +2287,6 @@ xlog_state_get_iclog_space(xlog_t *log,
INT_SET
(
head
->
h_cycle
,
ARCH_CONVERT
,
log
->
l_curr_cycle
);
ASSIGN_LSN
(
head
->
h_lsn
,
log
,
ARCH_CONVERT
);
ASSERT
(
log
->
l_curr_block
>=
0
);
/* round off error from last write with this iclog */
ticket
->
t_curr_res
-=
iclog
->
ic_roundoff
;
log
->
l_roundoff
-=
iclog
->
ic_roundoff
;
iclog
->
ic_roundoff
=
0
;
}
/* If there is enough room to write everything, then do it. Otherwise,
...
...
@@ -2853,7 +2857,6 @@ xlog_state_sync_all(xlog_t *log, uint flags)
* has already taken care of the roundoff from
* the previous sync.
*/
ASSERT
(
iclog
->
ic_roundoff
==
0
);
iclog
->
ic_refcnt
++
;
lsn
=
INT_GET
(
iclog
->
ic_header
.
h_lsn
,
ARCH_CONVERT
);
xlog_state_switch_iclogs
(
log
,
iclog
,
0
);
...
...
fs/xfs/xfs_log_priv.h
View file @
384263dc
...
...
@@ -430,7 +430,6 @@ typedef struct xlog_iclog_fields {
int
ic_size
;
int
ic_offset
;
int
ic_refcnt
;
int
ic_roundoff
;
int
ic_bwritecnt
;
ushort_t
ic_state
;
char
*
ic_datap
;
/* pointer to iclog data */
...
...
@@ -462,7 +461,6 @@ typedef struct xlog_in_core {
#define ic_size hic_fields.ic_size
#define ic_offset hic_fields.ic_offset
#define ic_refcnt hic_fields.ic_refcnt
#define ic_roundoff hic_fields.ic_roundoff
#define ic_bwritecnt hic_fields.ic_bwritecnt
#define ic_state hic_fields.ic_state
#define ic_datap hic_fields.ic_datap
...
...
@@ -498,7 +496,6 @@ typedef struct log {
xfs_daddr_t
l_logBBstart
;
/* start block of log */
int
l_logsize
;
/* size of log in bytes */
int
l_logBBsize
;
/* size of log in BB chunks */
int
l_roundoff
;
/* round off error of iclogs */
int
l_curr_cycle
;
/* Cycle number of log writes */
int
l_prev_cycle
;
/* Cycle number before last
* block increment */
...
...
@@ -545,7 +542,7 @@ extern int xlog_find_tail(xlog_t *log,
int
readonly
);
extern
int
xlog_recover
(
xlog_t
*
log
,
int
readonly
);
extern
int
xlog_recover_finish
(
xlog_t
*
log
,
int
mfsi_flags
);
extern
void
xlog_pack_data
(
xlog_t
*
log
,
xlog_in_core_t
*
iclog
);
extern
void
xlog_pack_data
(
xlog_t
*
log
,
xlog_in_core_t
*
iclog
,
int
);
extern
void
xlog_recover_process_iunlinks
(
xlog_t
*
log
);
extern
struct
xfs_buf
*
xlog_get_bp
(
xlog_t
*
,
int
);
...
...
fs/xfs/xfs_log_recover.c
View file @
384263dc
...
...
@@ -3262,7 +3262,7 @@ xlog_recover_process_iunlinks(
xfs_buf_relse
(
agibp
);
ino
=
XFS_AGINO_TO_INO
(
mp
,
agno
,
agino
);
error
=
xfs_iget
(
mp
,
NULL
,
ino
,
0
,
&
ip
,
0
);
error
=
xfs_iget
(
mp
,
NULL
,
ino
,
0
,
0
,
&
ip
,
0
);
ASSERT
(
error
||
(
ip
!=
NULL
));
if
(
!
error
)
{
...
...
@@ -3384,10 +3384,11 @@ xlog_pack_data_checksum(
void
xlog_pack_data
(
xlog_t
*
log
,
xlog_in_core_t
*
iclog
)
xlog_in_core_t
*
iclog
,
int
roundoff
)
{
int
i
,
j
,
k
;
int
size
=
iclog
->
ic_offset
+
iclog
->
ic_
roundoff
;
int
size
=
iclog
->
ic_offset
+
roundoff
;
uint
cycle_lsn
;
xfs_caddr_t
dp
;
xlog_in_core_2_t
*
xhdr
;
...
...
fs/xfs/xfs_mount.c
View file @
384263dc
...
...
@@ -975,7 +975,7 @@ xfs_mountfs(
* Get and sanity-check the root inode.
* Save the pointer to it in the mount structure.
*/
error
=
xfs_iget
(
mp
,
NULL
,
sbp
->
sb_rootino
,
XFS_ILOCK_EXCL
,
&
rip
,
0
);
error
=
xfs_iget
(
mp
,
NULL
,
sbp
->
sb_rootino
,
0
,
XFS_ILOCK_EXCL
,
&
rip
,
0
);
if
(
error
)
{
cmn_err
(
CE_WARN
,
"XFS: failed to read root inode"
);
goto
error3
;
...
...
@@ -1036,7 +1036,7 @@ xfs_mountfs(
/*
* Complete the quota initialisation, post-log-replay component.
*/
if
((
error
=
XFS_QM_MOUNT
(
mp
,
quotamount
,
quotaflags
)))
if
((
error
=
XFS_QM_MOUNT
(
mp
,
quotamount
,
quotaflags
,
mfsi_flags
)))
goto
error4
;
return
0
;
...
...
@@ -1098,6 +1098,8 @@ xfs_unmountfs(xfs_mount_t *mp, struct cred *cr)
xfs_unmountfs_writesb
(
mp
);
xfs_unmountfs_wait
(
mp
);
/* wait for async bufs */
xfs_log_unmount
(
mp
);
/* Done! No more fs ops. */
xfs_freesb
(
mp
);
...
...
@@ -1142,6 +1144,16 @@ xfs_unmountfs_close(xfs_mount_t *mp, struct cred *cr)
xfs_free_buftarg
(
mp
->
m_ddev_targp
,
0
);
}
void
xfs_unmountfs_wait
(
xfs_mount_t
*
mp
)
{
if
(
mp
->
m_logdev_targp
!=
mp
->
m_ddev_targp
)
xfs_wait_buftarg
(
mp
->
m_logdev_targp
);
if
(
mp
->
m_rtdev_targp
)
xfs_wait_buftarg
(
mp
->
m_rtdev_targp
);
xfs_wait_buftarg
(
mp
->
m_ddev_targp
);
}
int
xfs_unmountfs_writesb
(
xfs_mount_t
*
mp
)
{
...
...
fs/xfs/xfs_mount.h
View file @
384263dc
...
...
@@ -133,7 +133,7 @@ struct xfs_dqtrxops;
struct
xfs_quotainfo
;
typedef
int
(
*
xfs_qminit_t
)(
struct
xfs_mount
*
,
uint
*
,
uint
*
);
typedef
int
(
*
xfs_qmmount_t
)(
struct
xfs_mount
*
,
uint
,
uint
);
typedef
int
(
*
xfs_qmmount_t
)(
struct
xfs_mount
*
,
uint
,
uint
,
int
);
typedef
int
(
*
xfs_qmunmount_t
)(
struct
xfs_mount
*
);
typedef
void
(
*
xfs_qmdone_t
)(
struct
xfs_mount
*
);
typedef
void
(
*
xfs_dqrele_t
)(
struct
xfs_dquot
*
);
...
...
@@ -171,8 +171,8 @@ typedef struct xfs_qmops {
#define XFS_QM_INIT(mp, mnt, fl) \
(*(mp)->m_qm_ops.xfs_qminit)(mp, mnt, fl)
#define XFS_QM_MOUNT(mp, mnt, fl) \
(*(mp)->m_qm_ops.xfs_qmmount)(mp, mnt, fl)
#define XFS_QM_MOUNT(mp, mnt, fl
, mfsi_flags
) \
(*(mp)->m_qm_ops.xfs_qmmount)(mp, mnt, fl
, mfsi_flags
)
#define XFS_QM_UNMOUNT(mp) \
(*(mp)->m_qm_ops.xfs_qmunmount)(mp)
#define XFS_QM_DONE(mp) \
...
...
@@ -466,6 +466,7 @@ typedef struct xfs_mount {
#define XFS_MFSI_CLIENT 0x02
/* Is a client -- skip lots of stuff */
#define XFS_MFSI_NOUNLINK 0x08
/* Skip unlinked inode processing in */
/* log recovery */
#define XFS_MFSI_NO_QUOTACHECK 0x10
/* Skip quotacheck processing */
/*
* Macros for getting from mount to vfs and back.
...
...
@@ -540,6 +541,7 @@ extern void xfs_mount_free(xfs_mount_t *mp, int remove_bhv);
extern
int
xfs_mountfs
(
struct
vfs
*
,
xfs_mount_t
*
mp
,
int
);
extern
int
xfs_unmountfs
(
xfs_mount_t
*
,
struct
cred
*
);
extern
void
xfs_unmountfs_wait
(
xfs_mount_t
*
);
extern
void
xfs_unmountfs_close
(
xfs_mount_t
*
,
struct
cred
*
);
extern
int
xfs_unmountfs_writesb
(
xfs_mount_t
*
);
extern
int
xfs_unmount_flush
(
xfs_mount_t
*
,
int
);
...
...
fs/xfs/xfs_rtalloc.c
View file @
384263dc
...
...
@@ -149,7 +149,7 @@ xfs_growfs_rt_alloc(
/*
* Lock the inode.
*/
if
((
error
=
xfs_trans_iget
(
mp
,
tp
,
ino
,
XFS_ILOCK_EXCL
,
&
ip
)))
if
((
error
=
xfs_trans_iget
(
mp
,
tp
,
ino
,
0
,
XFS_ILOCK_EXCL
,
&
ip
)))
goto
error_exit
;
XFS_BMAP_INIT
(
&
flist
,
&
firstblock
);
/*
...
...
@@ -189,7 +189,7 @@ xfs_growfs_rt_alloc(
/*
* Lock the bitmap inode.
*/
if
((
error
=
xfs_trans_iget
(
mp
,
tp
,
ino
,
XFS_ILOCK_EXCL
,
if
((
error
=
xfs_trans_iget
(
mp
,
tp
,
ino
,
0
,
XFS_ILOCK_EXCL
,
&
ip
)))
goto
error_exit
;
/*
...
...
@@ -2042,7 +2042,7 @@ xfs_growfs_rt(
/*
* Lock out other callers by grabbing the bitmap inode lock.
*/
if
((
error
=
xfs_trans_iget
(
mp
,
tp
,
mp
->
m_sb
.
sb_rbmino
,
if
((
error
=
xfs_trans_iget
(
mp
,
tp
,
0
,
mp
->
m_sb
.
sb_rbmino
,
XFS_ILOCK_EXCL
,
&
ip
)))
goto
error_exit
;
ASSERT
(
ip
==
mp
->
m_rbmip
);
...
...
@@ -2057,7 +2057,7 @@ xfs_growfs_rt(
* Get the summary inode into the transaction.
*/
if
((
error
=
xfs_trans_iget
(
mp
,
tp
,
mp
->
m_sb
.
sb_rsumino
,
XFS_ILOCK_EXCL
,
&
ip
)))
0
,
XFS_ILOCK_EXCL
,
&
ip
)))
goto
error_exit
;
ASSERT
(
ip
==
mp
->
m_rsumip
);
/*
...
...
@@ -2177,7 +2177,7 @@ xfs_rtallocate_extent(
/*
* Lock out other callers by grabbing the bitmap inode lock.
*/
error
=
xfs_trans_iget
(
mp
,
tp
,
mp
->
m_sb
.
sb_rbmino
,
XFS_ILOCK_EXCL
,
&
ip
);
error
=
xfs_trans_iget
(
mp
,
tp
,
mp
->
m_sb
.
sb_rbmino
,
0
,
XFS_ILOCK_EXCL
,
&
ip
);
if
(
error
)
{
return
error
;
}
...
...
@@ -2240,7 +2240,7 @@ xfs_rtfree_extent(
/*
* Synchronize by locking the bitmap inode.
*/
error
=
xfs_trans_iget
(
mp
,
tp
,
mp
->
m_sb
.
sb_rbmino
,
XFS_ILOCK_EXCL
,
&
ip
);
error
=
xfs_trans_iget
(
mp
,
tp
,
mp
->
m_sb
.
sb_rbmino
,
0
,
XFS_ILOCK_EXCL
,
&
ip
);
if
(
error
)
{
return
error
;
}
...
...
@@ -2348,12 +2348,12 @@ xfs_rtmount_inodes(
sbp
=
&
mp
->
m_sb
;
if
(
sbp
->
sb_rbmino
==
NULLFSINO
)
return
0
;
error
=
xfs_iget
(
mp
,
NULL
,
sbp
->
sb_rbmino
,
0
,
&
mp
->
m_rbmip
,
0
);
error
=
xfs_iget
(
mp
,
NULL
,
sbp
->
sb_rbmino
,
0
,
0
,
&
mp
->
m_rbmip
,
0
);
if
(
error
)
return
error
;
ASSERT
(
mp
->
m_rbmip
!=
NULL
);
ASSERT
(
sbp
->
sb_rsumino
!=
NULLFSINO
);
error
=
xfs_iget
(
mp
,
NULL
,
sbp
->
sb_rsumino
,
0
,
&
mp
->
m_rsumip
,
0
);
error
=
xfs_iget
(
mp
,
NULL
,
sbp
->
sb_rsumino
,
0
,
0
,
&
mp
->
m_rsumip
,
0
);
if
(
error
)
{
VN_RELE
(
XFS_ITOV
(
mp
->
m_rbmip
));
return
error
;
...
...
@@ -2384,7 +2384,7 @@ xfs_rtpick_extent(
__uint64_t
seq
;
/* sequence number of file creation */
__uint64_t
*
seqp
;
/* pointer to seqno in inode */
error
=
xfs_trans_iget
(
mp
,
tp
,
mp
->
m_sb
.
sb_rbmino
,
XFS_ILOCK_EXCL
,
&
ip
);
error
=
xfs_trans_iget
(
mp
,
tp
,
mp
->
m_sb
.
sb_rbmino
,
0
,
XFS_ILOCK_EXCL
,
&
ip
);
if
(
error
)
return
error
;
ASSERT
(
ip
==
mp
->
m_rbmip
);
...
...
fs/xfs/xfs_trans.h
View file @
384263dc
...
...
@@ -1007,7 +1007,7 @@ void xfs_trans_stale_inode_buf(xfs_trans_t *, struct xfs_buf *);
void
xfs_trans_dquot_buf
(
xfs_trans_t
*
,
struct
xfs_buf
*
,
uint
);
void
xfs_trans_inode_alloc_buf
(
xfs_trans_t
*
,
struct
xfs_buf
*
);
int
xfs_trans_iget
(
struct
xfs_mount
*
,
xfs_trans_t
*
,
xfs_ino_t
,
uint
,
struct
xfs_inode
**
);
xfs_ino_t
,
uint
,
uint
,
struct
xfs_inode
**
);
void
xfs_trans_ijoin
(
xfs_trans_t
*
,
struct
xfs_inode
*
,
uint
);
void
xfs_trans_ihold
(
xfs_trans_t
*
,
struct
xfs_inode
*
);
void
xfs_trans_ihold_release
(
xfs_trans_t
*
,
struct
xfs_inode
*
);
...
...
fs/xfs/xfs_trans_inode.c
View file @
384263dc
...
...
@@ -95,6 +95,7 @@ xfs_trans_iget(
xfs_mount_t
*
mp
,
xfs_trans_t
*
tp
,
xfs_ino_t
ino
,
uint
flags
,
uint
lock_flags
,
xfs_inode_t
**
ipp
)
{
...
...
@@ -106,9 +107,8 @@ xfs_trans_iget(
* If the transaction pointer is NULL, just call the normal
* xfs_iget().
*/
if
(
tp
==
NULL
)
{
return
(
xfs_iget
(
mp
,
NULL
,
ino
,
lock_flags
,
ipp
,
0
));
}
if
(
tp
==
NULL
)
return
xfs_iget
(
mp
,
NULL
,
ino
,
flags
,
lock_flags
,
ipp
,
0
);
/*
* If we find the inode in core with this transaction
...
...
@@ -148,7 +148,7 @@ xfs_trans_iget(
}
ASSERT
(
lock_flags
&
XFS_ILOCK_EXCL
);
error
=
xfs_iget
(
tp
->
t_mountp
,
tp
,
ino
,
lock_flags
,
&
ip
,
0
);
error
=
xfs_iget
(
tp
->
t_mountp
,
tp
,
ino
,
flags
,
lock_flags
,
&
ip
,
0
);
if
(
error
)
{
return
error
;
}
...
...
@@ -186,7 +186,6 @@ xfs_trans_iget(
return
0
;
}
/*
* Add the locked inode to the transaction.
* The inode must be locked, and it cannot be associated with any
...
...
fs/xfs/xfs_utils.c
View file @
384263dc
...
...
@@ -110,7 +110,7 @@ xfs_dir_lookup_int(
* reservation in the inactive routine.
*/
xfs_iunlock
(
dp
,
lock_mode
);
error
=
xfs_iget
(
dp
->
i_mount
,
NULL
,
*
inum
,
0
,
ipp
,
0
);
error
=
xfs_iget
(
dp
->
i_mount
,
NULL
,
*
inum
,
0
,
0
,
ipp
,
0
);
xfs_ilock
(
dp
,
lock_mode
);
if
(
error
)
{
...
...
fs/xfs/xfs_vfsops.c
View file @
384263dc
...
...
@@ -1610,7 +1610,7 @@ xfs_vget(
if
(
ino
==
0
)
return
XFS_ERROR
(
ESTALE
);
error
=
xfs_iget
(
mp
,
NULL
,
ino
,
XFS_ILOCK_SHARED
,
&
ip
,
0
);
error
=
xfs_iget
(
mp
,
NULL
,
ino
,
0
,
XFS_ILOCK_SHARED
,
&
ip
,
0
);
if
(
error
)
{
*
vpp
=
NULL
;
return
error
;
...
...
kernel/exit.c
View file @
384263dc
...
...
@@ -242,9 +242,8 @@ void reparent_to_init(void)
memcpy
(
current
->
signal
->
rlim
,
init_task
.
signal
->
rlim
,
sizeof
(
current
->
signal
->
rlim
));
atomic_inc
(
&
(
INIT_USER
->
__count
));
switch_uid
(
INIT_USER
);
write_unlock_irq
(
&
tasklist_lock
);
switch_uid
(
INIT_USER
);
}
void
__set_special_pids
(
pid_t
session
,
pid_t
pgrp
)
...
...
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