diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2010-05-21 13:50:28 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2010-05-21 13:50:28 -0400 |
commit | 7ce1418f95e918cfc5ad36e3ec3431145c768cd0 (patch) | |
tree | 10fd5bf66a5d0cb71cbf0ffb17b354969a7cc4c4 /include | |
parent | a6f039869ff87e0a8d621e31d14bbb120c1dfa93 (diff) | |
parent | 1907131bbeabb33db313bad34f3ec1a5faedbd64 (diff) |
Merge branch 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jack/linux-fs-2.6
* 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jack/linux-fs-2.6: (31 commits)
dquot: Detect partial write error to quota file in write_blk() and add printk_ratelimit for quota error messages
ocfs2: Fix lock inversion in quotas during umount
ocfs2: Use __dquot_transfer to avoid lock inversion
ocfs2: Fix NULL pointer deref when writing local dquot
ocfs2: Fix estimate of credits needed for quota allocation
ocfs2: Fix quota locking
ocfs2: Avoid unnecessary block mapping when refreshing quota info
ocfs2: Do not map blocks from local quota file on each write
quota: Refactor dquot_transfer code so that OCFS2 can pass in its references
quota: unify quota init condition in setattr
quota: remove sb_has_quota_active in get/set_info
quota: unify ->set_dqblk
quota: unify ->get_dqblk
ext3: make barrier options consistent with ext4
quota: Make quota stat accounting lockless.
suppress warning: "quotatypes" defined but not used
ext3: Fix waiting on transaction during fsync
jbd: Provide function to check whether transaction will issue data barrier
ufs: add ufs speciffic ->setattr call
BKL: Remove BKL from ext2 filesystem
...
Diffstat (limited to 'include')
-rw-r--r-- | include/linux/dqblk_xfs.h | 9 | ||||
-rw-r--r-- | include/linux/ext2_fs_sb.h | 9 | ||||
-rw-r--r-- | include/linux/jbd.h | 3 | ||||
-rw-r--r-- | include/linux/quota.h | 48 | ||||
-rw-r--r-- | include/linux/quotaops.h | 15 |
5 files changed, 69 insertions, 15 deletions
diff --git a/include/linux/dqblk_xfs.h b/include/linux/dqblk_xfs.h index 527504c11c5e..4389ae72024e 100644 --- a/include/linux/dqblk_xfs.h +++ b/include/linux/dqblk_xfs.h | |||
@@ -110,6 +110,15 @@ typedef struct fs_disk_quota { | |||
110 | #define FS_DQ_WARNS_MASK (FS_DQ_BWARNS | FS_DQ_IWARNS | FS_DQ_RTBWARNS) | 110 | #define FS_DQ_WARNS_MASK (FS_DQ_BWARNS | FS_DQ_IWARNS | FS_DQ_RTBWARNS) |
111 | 111 | ||
112 | /* | 112 | /* |
113 | * Accounting values. These can only be set for filesystem with | ||
114 | * non-transactional quotas that require quotacheck(8) in userspace. | ||
115 | */ | ||
116 | #define FS_DQ_BCOUNT (1<<12) | ||
117 | #define FS_DQ_ICOUNT (1<<13) | ||
118 | #define FS_DQ_RTBCOUNT (1<<14) | ||
119 | #define FS_DQ_ACCT_MASK (FS_DQ_BCOUNT | FS_DQ_ICOUNT | FS_DQ_RTBCOUNT) | ||
120 | |||
121 | /* | ||
113 | * Various flags related to quotactl(2). Only relevant to XFS filesystems. | 122 | * Various flags related to quotactl(2). Only relevant to XFS filesystems. |
114 | */ | 123 | */ |
115 | #define XFS_QUOTA_UDQ_ACCT (1<<0) /* user quota accounting */ | 124 | #define XFS_QUOTA_UDQ_ACCT (1<<0) /* user quota accounting */ |
diff --git a/include/linux/ext2_fs_sb.h b/include/linux/ext2_fs_sb.h index 1cdb66367c98..db4d9f586bb6 100644 --- a/include/linux/ext2_fs_sb.h +++ b/include/linux/ext2_fs_sb.h | |||
@@ -106,6 +106,15 @@ struct ext2_sb_info { | |||
106 | spinlock_t s_rsv_window_lock; | 106 | spinlock_t s_rsv_window_lock; |
107 | struct rb_root s_rsv_window_root; | 107 | struct rb_root s_rsv_window_root; |
108 | struct ext2_reserve_window_node s_rsv_window_head; | 108 | struct ext2_reserve_window_node s_rsv_window_head; |
109 | /* | ||
110 | * s_lock protects against concurrent modifications of s_mount_state, | ||
111 | * s_blocks_last, s_overhead_last and the content of superblock's | ||
112 | * buffer pointed to by sbi->s_es. | ||
113 | * | ||
114 | * Note: It is used in ext2_show_options() to provide a consistent view | ||
115 | * of the mount options. | ||
116 | */ | ||
117 | spinlock_t s_lock; | ||
109 | }; | 118 | }; |
110 | 119 | ||
111 | static inline spinlock_t * | 120 | static inline spinlock_t * |
diff --git a/include/linux/jbd.h b/include/linux/jbd.h index 516a2a27e87a..e06965081ba5 100644 --- a/include/linux/jbd.h +++ b/include/linux/jbd.h | |||
@@ -427,9 +427,9 @@ struct transaction_s | |||
427 | enum { | 427 | enum { |
428 | T_RUNNING, | 428 | T_RUNNING, |
429 | T_LOCKED, | 429 | T_LOCKED, |
430 | T_RUNDOWN, | ||
431 | T_FLUSH, | 430 | T_FLUSH, |
432 | T_COMMIT, | 431 | T_COMMIT, |
432 | T_COMMIT_RECORD, | ||
433 | T_FINISHED | 433 | T_FINISHED |
434 | } t_state; | 434 | } t_state; |
435 | 435 | ||
@@ -991,6 +991,7 @@ int journal_start_commit(journal_t *journal, tid_t *tid); | |||
991 | int journal_force_commit_nested(journal_t *journal); | 991 | int journal_force_commit_nested(journal_t *journal); |
992 | int log_wait_commit(journal_t *journal, tid_t tid); | 992 | int log_wait_commit(journal_t *journal, tid_t tid); |
993 | int log_do_checkpoint(journal_t *journal); | 993 | int log_do_checkpoint(journal_t *journal); |
994 | int journal_trans_will_send_data_barrier(journal_t *journal, tid_t tid); | ||
994 | 995 | ||
995 | void __log_wait_for_space(journal_t *journal); | 996 | void __log_wait_for_space(journal_t *journal); |
996 | extern void __journal_drop_transaction(journal_t *, transaction_t *); | 997 | extern void __journal_drop_transaction(journal_t *, transaction_t *); |
diff --git a/include/linux/quota.h b/include/linux/quota.h index b462916b2a0a..7126a15467f1 100644 --- a/include/linux/quota.h +++ b/include/linux/quota.h | |||
@@ -174,6 +174,8 @@ enum { | |||
174 | #include <linux/rwsem.h> | 174 | #include <linux/rwsem.h> |
175 | #include <linux/spinlock.h> | 175 | #include <linux/spinlock.h> |
176 | #include <linux/wait.h> | 176 | #include <linux/wait.h> |
177 | #include <linux/percpu.h> | ||
178 | #include <linux/smp.h> | ||
177 | 179 | ||
178 | #include <linux/dqblk_xfs.h> | 180 | #include <linux/dqblk_xfs.h> |
179 | #include <linux/dqblk_v1.h> | 181 | #include <linux/dqblk_v1.h> |
@@ -238,19 +240,43 @@ static inline int info_dirty(struct mem_dqinfo *info) | |||
238 | return test_bit(DQF_INFO_DIRTY_B, &info->dqi_flags); | 240 | return test_bit(DQF_INFO_DIRTY_B, &info->dqi_flags); |
239 | } | 241 | } |
240 | 242 | ||
243 | enum { | ||
244 | DQST_LOOKUPS, | ||
245 | DQST_DROPS, | ||
246 | DQST_READS, | ||
247 | DQST_WRITES, | ||
248 | DQST_CACHE_HITS, | ||
249 | DQST_ALLOC_DQUOTS, | ||
250 | DQST_FREE_DQUOTS, | ||
251 | DQST_SYNCS, | ||
252 | _DQST_DQSTAT_LAST | ||
253 | }; | ||
254 | |||
241 | struct dqstats { | 255 | struct dqstats { |
242 | int lookups; | 256 | int stat[_DQST_DQSTAT_LAST]; |
243 | int drops; | ||
244 | int reads; | ||
245 | int writes; | ||
246 | int cache_hits; | ||
247 | int allocated_dquots; | ||
248 | int free_dquots; | ||
249 | int syncs; | ||
250 | }; | 257 | }; |
251 | 258 | ||
259 | extern struct dqstats *dqstats_pcpu; | ||
252 | extern struct dqstats dqstats; | 260 | extern struct dqstats dqstats; |
253 | 261 | ||
262 | static inline void dqstats_inc(unsigned int type) | ||
263 | { | ||
264 | #ifdef CONFIG_SMP | ||
265 | per_cpu_ptr(dqstats_pcpu, smp_processor_id())->stat[type]++; | ||
266 | #else | ||
267 | dqstats.stat[type]++; | ||
268 | #endif | ||
269 | } | ||
270 | |||
271 | static inline void dqstats_dec(unsigned int type) | ||
272 | { | ||
273 | #ifdef CONFIG_SMP | ||
274 | per_cpu_ptr(dqstats_pcpu, smp_processor_id())->stat[type]--; | ||
275 | #else | ||
276 | dqstats.stat[type]--; | ||
277 | #endif | ||
278 | } | ||
279 | |||
254 | #define DQ_MOD_B 0 /* dquot modified since read */ | 280 | #define DQ_MOD_B 0 /* dquot modified since read */ |
255 | #define DQ_BLKS_B 1 /* uid/gid has been warned about blk limit */ | 281 | #define DQ_BLKS_B 1 /* uid/gid has been warned about blk limit */ |
256 | #define DQ_INODES_B 2 /* uid/gid has been warned about inode limit */ | 282 | #define DQ_INODES_B 2 /* uid/gid has been warned about inode limit */ |
@@ -311,12 +337,10 @@ struct quotactl_ops { | |||
311 | int (*quota_sync)(struct super_block *, int, int); | 337 | int (*quota_sync)(struct super_block *, int, int); |
312 | int (*get_info)(struct super_block *, int, struct if_dqinfo *); | 338 | int (*get_info)(struct super_block *, int, struct if_dqinfo *); |
313 | int (*set_info)(struct super_block *, int, struct if_dqinfo *); | 339 | int (*set_info)(struct super_block *, int, struct if_dqinfo *); |
314 | int (*get_dqblk)(struct super_block *, int, qid_t, struct if_dqblk *); | 340 | int (*get_dqblk)(struct super_block *, int, qid_t, struct fs_disk_quota *); |
315 | int (*set_dqblk)(struct super_block *, int, qid_t, struct if_dqblk *); | 341 | int (*set_dqblk)(struct super_block *, int, qid_t, struct fs_disk_quota *); |
316 | int (*get_xstate)(struct super_block *, struct fs_quota_stat *); | 342 | int (*get_xstate)(struct super_block *, struct fs_quota_stat *); |
317 | int (*set_xstate)(struct super_block *, unsigned int, int); | 343 | int (*set_xstate)(struct super_block *, unsigned int, int); |
318 | int (*get_xquota)(struct super_block *, int, qid_t, struct fs_disk_quota *); | ||
319 | int (*set_xquota)(struct super_block *, int, qid_t, struct fs_disk_quota *); | ||
320 | }; | 344 | }; |
321 | 345 | ||
322 | struct quota_format_type { | 346 | struct quota_format_type { |
diff --git a/include/linux/quotaops.h b/include/linux/quotaops.h index e6fa7acce290..370abb1e99cb 100644 --- a/include/linux/quotaops.h +++ b/include/linux/quotaops.h | |||
@@ -14,6 +14,14 @@ static inline struct quota_info *sb_dqopt(struct super_block *sb) | |||
14 | return &sb->s_dquot; | 14 | return &sb->s_dquot; |
15 | } | 15 | } |
16 | 16 | ||
17 | /* i_mutex must being held */ | ||
18 | static inline bool is_quota_modification(struct inode *inode, struct iattr *ia) | ||
19 | { | ||
20 | return (ia->ia_valid & ATTR_SIZE && ia->ia_size != inode->i_size) || | ||
21 | (ia->ia_valid & ATTR_UID && ia->ia_uid != inode->i_uid) || | ||
22 | (ia->ia_valid & ATTR_GID && ia->ia_gid != inode->i_gid); | ||
23 | } | ||
24 | |||
17 | #if defined(CONFIG_QUOTA) | 25 | #if defined(CONFIG_QUOTA) |
18 | 26 | ||
19 | /* | 27 | /* |
@@ -63,9 +71,12 @@ int vfs_quota_disable(struct super_block *sb, int type, unsigned int flags); | |||
63 | int vfs_quota_sync(struct super_block *sb, int type, int wait); | 71 | int vfs_quota_sync(struct super_block *sb, int type, int wait); |
64 | int vfs_get_dqinfo(struct super_block *sb, int type, struct if_dqinfo *ii); | 72 | int vfs_get_dqinfo(struct super_block *sb, int type, struct if_dqinfo *ii); |
65 | int vfs_set_dqinfo(struct super_block *sb, int type, struct if_dqinfo *ii); | 73 | int vfs_set_dqinfo(struct super_block *sb, int type, struct if_dqinfo *ii); |
66 | int vfs_get_dqblk(struct super_block *sb, int type, qid_t id, struct if_dqblk *di); | 74 | int vfs_get_dqblk(struct super_block *sb, int type, qid_t id, |
67 | int vfs_set_dqblk(struct super_block *sb, int type, qid_t id, struct if_dqblk *di); | 75 | struct fs_disk_quota *di); |
76 | int vfs_set_dqblk(struct super_block *sb, int type, qid_t id, | ||
77 | struct fs_disk_quota *di); | ||
68 | 78 | ||
79 | int __dquot_transfer(struct inode *inode, struct dquot **transfer_to); | ||
69 | int dquot_transfer(struct inode *inode, struct iattr *iattr); | 80 | int dquot_transfer(struct inode *inode, struct iattr *iattr); |
70 | int vfs_dq_quota_on_remount(struct super_block *sb); | 81 | int vfs_dq_quota_on_remount(struct super_block *sb); |
71 | 82 | ||