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
xfs
xfs_dquot.h
Go to the documentation of this file.
1
/*
2
* Copyright (c) 2000-2005 Silicon Graphics, Inc.
3
* All Rights Reserved.
4
*
5
* This program is free software; you can redistribute it and/or
6
* modify it under the terms of the GNU General Public License as
7
* published by the Free Software Foundation.
8
*
9
* This program is distributed in the hope that it would be useful,
10
* but WITHOUT ANY WARRANTY; without even the implied warranty of
11
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
* GNU General Public License for more details.
13
*
14
* You should have received a copy of the GNU General Public License
15
* along with this program; if not, write the Free Software Foundation,
16
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
17
*/
18
#ifndef __XFS_DQUOT_H__
19
#define __XFS_DQUOT_H__
20
21
/*
22
* Dquots are structures that hold quota information about a user or a group,
23
* much like inodes are for files. In fact, dquots share many characteristics
24
* with inodes. However, dquots can also be a centralized resource, relative
25
* to a collection of inodes. In this respect, dquots share some characteristics
26
* of the superblock.
27
* XFS dquots exploit both those in its algorithms. They make every attempt
28
* to not be a bottleneck when quotas are on and have minimal impact, if any,
29
* when quotas are off.
30
*/
31
32
struct
xfs_mount;
33
struct
xfs_trans;
34
35
/*
36
* The incore dquot structure
37
*/
38
typedef
struct
xfs_dquot
{
39
uint
dq_flags
;
/* various flags (XFS_DQ_*) */
40
struct
list_head
q_lru
;
/* global free list of dquots */
41
struct
xfs_mount*
q_mount
;
/* filesystem this relates to */
42
struct
xfs_trans*
q_transp
;
/* trans this belongs to currently */
43
uint
q_nrefs
;
/* # active refs from inodes */
44
xfs_daddr_t
q_blkno
;
/* blkno of dquot buffer */
45
int
q_bufoffset
;
/* off of dq in buffer (# dquots) */
46
xfs_fileoff_t
q_fileoffset
;
/* offset in quotas file */
47
48
struct
xfs_dquot
*
q_gdquot
;
/* group dquot, hint only */
49
xfs_disk_dquot_t
q_core
;
/* actual usage & quotas */
50
xfs_dq_logitem_t
q_logitem
;
/* dquot log item */
51
xfs_qcnt_t
q_res_bcount
;
/* total regular nblks used+reserved */
52
xfs_qcnt_t
q_res_icount
;
/* total inos allocd+reserved */
53
xfs_qcnt_t
q_res_rtbcount
;
/* total realtime blks used+reserved */
54
struct
mutex
q_qlock
;
/* quota lock */
55
struct
completion
q_flush
;
/* flush completion queue */
56
atomic_t
q_pincount
;
/* dquot pin count */
57
wait_queue_head_t
q_pinwait
;
/* dquot pinning wait queue */
58
}
xfs_dquot_t
;
59
60
/*
61
* Lock hierarchy for q_qlock:
62
* XFS_QLOCK_NORMAL is the implicit default,
63
* XFS_QLOCK_NESTED is the dquot with the higher id in xfs_dqlock2
64
*/
65
enum
{
66
XFS_QLOCK_NORMAL
= 0,
67
XFS_QLOCK_NESTED
,
68
};
69
70
/*
71
* Manage the q_flush completion queue embedded in the dquot. This completion
72
* queue synchronizes processes attempting to flush the in-core dquot back to
73
* disk.
74
*/
75
static
inline
void
xfs_dqflock(
xfs_dquot_t
*dqp)
76
{
77
wait_for_completion
(&dqp->
q_flush
);
78
}
79
80
static
inline
int
xfs_dqflock_nowait(
xfs_dquot_t
*dqp)
81
{
82
return
try_wait_for_completion
(&dqp->
q_flush
);
83
}
84
85
static
inline
void
xfs_dqfunlock(
xfs_dquot_t
*dqp)
86
{
87
complete
(&dqp->
q_flush
);
88
}
89
90
static
inline
int
xfs_dqlock_nowait(
struct
xfs_dquot
*dqp)
91
{
92
return
mutex_trylock
(&dqp->
q_qlock
);
93
}
94
95
static
inline
void
xfs_dqlock(
struct
xfs_dquot
*dqp)
96
{
97
mutex_lock
(&dqp->
q_qlock
);
98
}
99
100
static
inline
void
xfs_dqunlock(
struct
xfs_dquot
*dqp)
101
{
102
mutex_unlock
(&dqp->
q_qlock
);
103
}
104
105
static
inline
int
xfs_this_quota_on(
struct
xfs_mount *
mp
,
int
type
)
106
{
107
switch
(type &
XFS_DQ_ALLTYPES
) {
108
case
XFS_DQ_USER
:
109
return
XFS_IS_UQUOTA_ON
(mp);
110
case
XFS_DQ_GROUP
:
111
case
XFS_DQ_PROJ
:
112
return
XFS_IS_OQUOTA_ON
(mp);
113
default
:
114
return
0;
115
}
116
}
117
118
static
inline
xfs_dquot_t
*xfs_inode_dquot(
struct
xfs_inode *
ip
,
int
type)
119
{
120
switch
(type &
XFS_DQ_ALLTYPES
) {
121
case
XFS_DQ_USER
:
122
return
ip->i_udquot;
123
case
XFS_DQ_GROUP
:
124
case
XFS_DQ_PROJ
:
125
return
ip->i_gdquot;
126
default
:
127
return
NULL
;
128
}
129
}
130
131
#define XFS_DQ_IS_LOCKED(dqp) (mutex_is_locked(&((dqp)->q_qlock)))
132
#define XFS_DQ_IS_DIRTY(dqp) ((dqp)->dq_flags & XFS_DQ_DIRTY)
133
#define XFS_QM_ISUDQ(dqp) ((dqp)->dq_flags & XFS_DQ_USER)
134
#define XFS_QM_ISPDQ(dqp) ((dqp)->dq_flags & XFS_DQ_PROJ)
135
#define XFS_QM_ISGDQ(dqp) ((dqp)->dq_flags & XFS_DQ_GROUP)
136
#define XFS_DQ_TO_QINF(dqp) ((dqp)->q_mount->m_quotainfo)
137
#define XFS_DQ_TO_QIP(dqp) (XFS_QM_ISUDQ(dqp) ? \
138
XFS_DQ_TO_QINF(dqp)->qi_uquotaip : \
139
XFS_DQ_TO_QINF(dqp)->qi_gquotaip)
140
141
extern
int
xfs_qm_dqread
(
struct
xfs_mount *,
xfs_dqid_t
,
uint
,
142
uint
,
struct
xfs_dquot
**);
143
extern
void
xfs_qm_dqdestroy
(
xfs_dquot_t
*);
144
extern
int
xfs_qm_dqflush
(
struct
xfs_dquot
*,
struct
xfs_buf
**);
145
extern
void
xfs_qm_dqunpin_wait
(
xfs_dquot_t
*);
146
extern
void
xfs_qm_adjust_dqtimers
(xfs_mount_t *,
147
xfs_disk_dquot_t
*);
148
extern
void
xfs_qm_adjust_dqlimits
(xfs_mount_t *,
149
xfs_disk_dquot_t
*);
150
extern
int
xfs_qm_dqget
(xfs_mount_t *, xfs_inode_t *,
151
xfs_dqid_t
,
uint
,
uint
,
xfs_dquot_t
**);
152
extern
void
xfs_qm_dqput
(
xfs_dquot_t
*);
153
154
extern
void
xfs_dqlock2
(
struct
xfs_dquot
*,
struct
xfs_dquot
*);
155
156
static
inline
struct
xfs_dquot
*xfs_qm_dqhold(
struct
xfs_dquot
*dqp)
157
{
158
xfs_dqlock(dqp);
159
dqp->
q_nrefs
++;
160
xfs_dqunlock(dqp);
161
return
dqp;
162
}
163
164
#endif
/* __XFS_DQUOT_H__ */
Generated on Thu Jan 10 2013 14:50:25 for Linux Kernel by
1.8.2