1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221
|
/*
* Definitions for diskquota-operations. When diskquota is configured these
* macros expand to the right source-code.
*
* Author: Marco van Wieringen <mvw@planets.elm.net>
*
* Version: $Id: quotaops.h,v 1.2 1998/01/15 16:22:26 ecd Exp $
*
*/
#ifndef _LINUX_QUOTAOPS_
#define _LINUX_QUOTAOPS_
#include <linux/config.h>
#include <linux/smp_lock.h>
#if defined(CONFIG_QUOTA)
#include <linux/fs.h>
/*
* declaration of quota_function calls in kernel.
*/
extern void dquot_initialize(struct inode *inode, short type);
extern void dquot_drop(struct inode *inode);
extern int quota_off(struct super_block *sb, short type);
extern int sync_dquots(kdev_t dev, short type);
extern int dquot_alloc_block(struct inode *inode, unsigned long number, char prealloc);
extern int dquot_alloc_inode(const struct inode *inode, unsigned long number);
extern void dquot_free_block(struct inode *inode, unsigned long number);
extern void dquot_free_inode(const struct inode *inode, unsigned long number);
extern int dquot_transfer(struct inode *inode, struct iattr *iattr);
/*
* Operations supported for diskquotas.
*/
#define sb_any_quota_enabled(sb) ((sb)->s_dquot.flags & (DQUOT_USR_ENABLED | DQUOT_GRP_ENABLED))
static __inline__ void DQUOT_INIT(struct inode *inode)
{
if (!inode->i_sb)
BUG();
lock_kernel();
if (sb_any_quota_enabled(inode->i_sb) && !IS_NOQUOTA(inode))
inode->i_sb->dq_op->initialize(inode, -1);
unlock_kernel();
}
static __inline__ void DQUOT_DROP(struct inode *inode)
{
lock_kernel();
if (IS_QUOTAINIT(inode)) {
if (!inode->i_sb)
BUG();
inode->i_sb->dq_op->drop(inode); /* Ops must be set when there's any quota... */
}
unlock_kernel();
}
static __inline__ int DQUOT_PREALLOC_BLOCK_NODIRTY(struct inode *inode, int nr)
{
lock_kernel();
if (sb_any_quota_enabled(inode->i_sb)) {
/* Number of used blocks is updated in alloc_block() */
if (inode->i_sb->dq_op->alloc_block(inode, fs_to_dq_blocks(nr, inode->i_sb->s_blocksize), 1) == NO_QUOTA) {
unlock_kernel();
return 1;
}
}
else
inode->i_blocks += nr << (inode->i_sb->s_blocksize_bits - 9);
unlock_kernel();
return 0;
}
static __inline__ int DQUOT_PREALLOC_BLOCK(struct inode *inode, int nr)
{
int ret;
if (!(ret = DQUOT_PREALLOC_BLOCK_NODIRTY(inode, nr)))
mark_inode_dirty(inode);
return ret;
}
static __inline__ int DQUOT_ALLOC_BLOCK_NODIRTY(struct inode *inode, int nr)
{
lock_kernel();
if (sb_any_quota_enabled(inode->i_sb)) {
/* Number of used blocks is updated in alloc_block() */
if (inode->i_sb->dq_op->alloc_block(inode, fs_to_dq_blocks(nr, inode->i_sb->s_blocksize), 0) == NO_QUOTA) {
unlock_kernel();
return 1;
}
}
else
inode->i_blocks += nr << (inode->i_sb->s_blocksize_bits - 9);
unlock_kernel();
return 0;
}
static __inline__ int DQUOT_ALLOC_BLOCK(struct inode *inode, int nr)
{
int ret;
if (!(ret = DQUOT_ALLOC_BLOCK_NODIRTY(inode, nr)))
mark_inode_dirty(inode);
return ret;
}
static __inline__ int DQUOT_ALLOC_INODE(struct inode *inode)
{
lock_kernel();
if (sb_any_quota_enabled(inode->i_sb)) {
DQUOT_INIT(inode);
if (inode->i_sb->dq_op->alloc_inode(inode, 1) == NO_QUOTA) {
unlock_kernel();
return 1;
}
}
unlock_kernel();
return 0;
}
static __inline__ void DQUOT_FREE_BLOCK_NODIRTY(struct inode *inode, int nr)
{
lock_kernel();
if (sb_any_quota_enabled(inode->i_sb))
inode->i_sb->dq_op->free_block(inode, fs_to_dq_blocks(nr, inode->i_sb->s_blocksize));
else
inode->i_blocks -= nr << (inode->i_sb->s_blocksize_bits - 9);
unlock_kernel();
}
static __inline__ void DQUOT_FREE_BLOCK(struct inode *inode, int nr)
{
DQUOT_FREE_BLOCK_NODIRTY(inode, nr);
mark_inode_dirty(inode);
}
static __inline__ void DQUOT_FREE_INODE(struct inode *inode)
{
lock_kernel();
if (sb_any_quota_enabled(inode->i_sb))
inode->i_sb->dq_op->free_inode(inode, 1);
unlock_kernel();
}
static __inline__ int DQUOT_TRANSFER(struct inode *inode, struct iattr *iattr)
{
lock_kernel();
if (sb_any_quota_enabled(inode->i_sb) && !IS_NOQUOTA(inode)) {
DQUOT_INIT(inode);
if (inode->i_sb->dq_op->transfer(inode, iattr) == NO_QUOTA) {
unlock_kernel();
return 1;
}
}
unlock_kernel();
return 0;
}
#define DQUOT_SYNC(dev) sync_dquots(dev, -1)
#define DQUOT_OFF(sb) quota_off(sb, -1)
#else
/*
* NO-OP when quota not configured.
*/
#define DQUOT_INIT(inode) do { } while(0)
#define DQUOT_DROP(inode) do { } while(0)
#define DQUOT_ALLOC_INODE(inode) (0)
#define DQUOT_FREE_INODE(inode) do { } while(0)
#define DQUOT_SYNC(dev) do { } while(0)
#define DQUOT_OFF(sb) do { } while(0)
#define DQUOT_TRANSFER(inode, iattr) (0)
extern __inline__ int DQUOT_PREALLOC_BLOCK_NODIRTY(struct inode *inode, int nr)
{
lock_kernel();
inode->i_blocks += nr << (inode->i_sb->s_blocksize_bits - 9);
unlock_kernel();
return 0;
}
extern __inline__ int DQUOT_PREALLOC_BLOCK(struct inode *inode, int nr)
{
DQUOT_PREALLOC_BLOCK_NODIRTY(inode, nr);
mark_inode_dirty(inode);
return 0;
}
extern __inline__ int DQUOT_ALLOC_BLOCK_NODIRTY(struct inode *inode, int nr)
{
lock_kernel();
inode->i_blocks += nr << (inode->i_sb->s_blocksize_bits - 9);
unlock_kernel();
return 0;
}
extern __inline__ int DQUOT_ALLOC_BLOCK(struct inode *inode, int nr)
{
DQUOT_ALLOC_BLOCK_NODIRTY(inode, nr);
mark_inode_dirty(inode);
return 0;
}
extern __inline__ void DQUOT_FREE_BLOCK_NODIRTY(struct inode *inode, int nr)
{
lock_kernel();
inode->i_blocks -= nr << (inode->i_sb->s_blocksize_bits - 9);
unlock_kernel();
}
extern __inline__ void DQUOT_FREE_BLOCK(struct inode *inode, int nr)
{
DQUOT_FREE_BLOCK_NODIRTY(inode, nr);
mark_inode_dirty(inode);
}
#endif /* CONFIG_QUOTA */
#endif /* _LINUX_QUOTAOPS_ */
|