Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
fs
stack.c
Go to the documentation of this file.
1
#include <linux/export.h>
2
#include <linux/fs.h>
3
#include <
linux/fs_stack.h
>
4
5
/* does _NOT_ require i_mutex to be held.
6
*
7
* This function cannot be inlined since i_size_{read,write} is rather
8
* heavy-weight on 32-bit systems
9
*/
10
void
fsstack_copy_inode_size
(
struct
inode
*
dst
,
struct
inode
*
src
)
11
{
12
loff_t i_size;
13
blkcnt_t
i_blocks;
14
15
/*
16
* i_size_read() includes its own seqlocking and protection from
17
* preemption (see include/linux/fs.h): we need nothing extra for
18
* that here, and prefer to avoid nesting locks than attempt to keep
19
* i_size and i_blocks in sync together.
20
*/
21
i_size = i_size_read(src);
22
23
/*
24
* But if CONFIG_LBDAF (on 32-bit), we ought to make an effort to
25
* keep the two halves of i_blocks in sync despite SMP or PREEMPT -
26
* though stat's generic_fillattr() doesn't bother, and we won't be
27
* applying quotas (where i_blocks does become important) at the
28
* upper level.
29
*
30
* We don't actually know what locking is used at the lower level;
31
* but if it's a filesystem that supports quotas, it will be using
32
* i_lock as in inode_add_bytes().
33
*/
34
if
(
sizeof
(i_blocks) >
sizeof
(
long
))
35
spin_lock(&src->
i_lock
);
36
i_blocks = src->
i_blocks
;
37
if
(
sizeof
(i_blocks) >
sizeof
(
long
))
38
spin_unlock(&src->
i_lock
);
39
40
/*
41
* If CONFIG_SMP or CONFIG_PREEMPT on 32-bit, it's vital for
42
* fsstack_copy_inode_size() to hold some lock around
43
* i_size_write(), otherwise i_size_read() may spin forever (see
44
* include/linux/fs.h). We don't necessarily hold i_mutex when this
45
* is called, so take i_lock for that case.
46
*
47
* And if CONFIG_LBADF (on 32-bit), continue our effort to keep the
48
* two halves of i_blocks in sync despite SMP or PREEMPT: use i_lock
49
* for that case too, and do both at once by combining the tests.
50
*
51
* There is none of this locking overhead in the 64-bit case.
52
*/
53
if
(
sizeof
(i_size) >
sizeof
(
long
) ||
sizeof
(i_blocks) >
sizeof
(
long
))
54
spin_lock(&dst->
i_lock
);
55
i_size_write(dst, i_size);
56
dst->
i_blocks
= i_blocks;
57
if
(
sizeof
(i_size) >
sizeof
(
long
) ||
sizeof
(i_blocks) >
sizeof
(
long
))
58
spin_unlock(&dst->
i_lock
);
59
}
60
EXPORT_SYMBOL_GPL
(
fsstack_copy_inode_size
);
61
62
/* copy all attributes */
63
void
fsstack_copy_attr_all
(
struct
inode
*
dest
,
const
struct
inode
*
src
)
64
{
65
dest->
i_mode
= src->
i_mode
;
66
dest->
i_uid
= src->
i_uid
;
67
dest->
i_gid
= src->
i_gid
;
68
dest->
i_rdev
= src->
i_rdev
;
69
dest->
i_atime
= src->
i_atime
;
70
dest->
i_mtime
= src->
i_mtime
;
71
dest->
i_ctime
= src->
i_ctime
;
72
dest->
i_blkbits
= src->
i_blkbits
;
73
dest->
i_flags
= src->
i_flags
;
74
set_nlink
(dest, src->
i_nlink
);
75
}
76
EXPORT_SYMBOL_GPL
(
fsstack_copy_attr_all
);
Generated on Thu Jan 10 2013 13:19:07 for Linux Kernel by
1.8.2