]> bbs.cooldavid.org Git - net-next-2.6.git/commitdiff
Merge branch 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jack/linux...
authorLinus Torvalds <torvalds@linux-foundation.org>
Sat, 7 Aug 2010 19:57:07 +0000 (12:57 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Sat, 7 Aug 2010 19:57:07 +0000 (12:57 -0700)
* 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jack/linux-fs-2.6:
  ext3: Fix dirtying of journalled buffers in data=journal mode
  ext3: default to ordered mode
  quota: Use mark_inode_dirty_sync instead of mark_inode_dirty
  quota: Change quota error message to print out disk and function name
  MAINTAINERS: Update entries of ext2 and ext3
  MAINTAINERS: Update address of Andreas Dilger
  ext3: Avoid filesystem corruption after a crash under heavy delete load
  ext3: remove vestiges of nobh support
  ext3: Fix set but unused variables
  quota: clean up quota active checks
  quota: Clean up the namespace in dqblk_xfs.h
  quota: check quota reservation on remove_dquot_ref

19 files changed:
MAINTAINERS
fs/ext3/Kconfig
fs/ext3/inode.c
fs/ext3/namei.c
fs/ext3/resize.c
fs/ext3/super.c
fs/gfs2/quota.c
fs/jbd/journal.c
fs/jbd/recovery.c
fs/quota/dquot.c
fs/quota/quota_tree.c
fs/quota/quota_tree.h
fs/quota/quota_v1.c
fs/quota/quota_v2.c
fs/xfs/linux-2.6/xfs_quotaops.c
fs/xfs/quota/xfs_qm_syscalls.c
include/linux/dqblk_xfs.h
include/linux/ext3_fs.h
include/linux/quotaops.h

index 100a3f535c9f579be993d6833b1a5939cc158b91..1349d1cb5aca49570271e3eb2dd77df8a9902f4c 100644 (file)
@@ -2237,6 +2237,7 @@ S:        Maintained
 F:     drivers/net/eth16i.c
 
 EXT2 FILE SYSTEM
+M:     Jan Kara <jack@suse.cz>
 L:     linux-ext4@vger.kernel.org
 S:     Maintained
 F:     Documentation/filesystems/ext2.txt
@@ -2244,8 +2245,9 @@ F:        fs/ext2/
 F:     include/linux/ext2*
 
 EXT3 FILE SYSTEM
+M:     Jan Kara <jack@suse.cz>
 M:     Andrew Morton <akpm@linux-foundation.org>
-M:     Andreas Dilger <adilger@sun.com>
+M:     Andreas Dilger <adilger.kernel@dilger.ca>
 L:     linux-ext4@vger.kernel.org
 S:     Maintained
 F:     Documentation/filesystems/ext3.txt
@@ -2254,7 +2256,7 @@ F:        include/linux/ext3*
 
 EXT4 FILE SYSTEM
 M:     "Theodore Ts'o" <tytso@mit.edu>
-M:     Andreas Dilger <adilger@sun.com>
+M:     Andreas Dilger <adilger.kernel@dilger.ca>
 L:     linux-ext4@vger.kernel.org
 W:     http://ext4.wiki.kernel.org
 Q:     http://patchwork.ozlabs.org/project/linux-ext4/list/
index 522b15498f459da163b2318348108569f1f34a92..e8c6ba0e4a3ea6969335fa2346cf3c7739c9f8b3 100644 (file)
@@ -31,6 +31,7 @@ config EXT3_FS
 config EXT3_DEFAULTS_TO_ORDERED
        bool "Default to 'data=ordered' in ext3"
        depends on EXT3_FS
+       default y
        help
          The journal mode options for ext3 have different tradeoffs
          between when data is guaranteed to be on disk and
index 735f0190ec2abe8dd68320cf5dc0a188f67af9c9..001eb0e2d48e2e051936e57eba6c3e173e19dff9 100644 (file)
@@ -1149,9 +1149,25 @@ static int walk_page_buffers(    handle_t *handle,
 static int do_journal_get_write_access(handle_t *handle,
                                        struct buffer_head *bh)
 {
+       int dirty = buffer_dirty(bh);
+       int ret;
+
        if (!buffer_mapped(bh) || buffer_freed(bh))
                return 0;
-       return ext3_journal_get_write_access(handle, bh);
+       /*
+        * __block_prepare_write() could have dirtied some buffers. Clean
+        * the dirty bit as jbd2_journal_get_write_access() could complain
+        * otherwise about fs integrity issues. Setting of the dirty bit
+        * by __block_prepare_write() isn't a real problem here as we clear
+        * the bit before releasing a page lock and thus writeback cannot
+        * ever write the buffer.
+        */
+       if (dirty)
+               clear_buffer_dirty(bh);
+       ret = ext3_journal_get_write_access(handle, bh);
+       if (!ret && dirty)
+               ret = ext3_journal_dirty_metadata(handle, bh);
+       return ret;
 }
 
 /*
@@ -1625,10 +1641,7 @@ static int ext3_writeback_writepage(struct page *page,
                goto out_fail;
        }
 
-       if (test_opt(inode->i_sb, NOBH) && ext3_should_writeback_data(inode))
-               ret = nobh_writepage(page, ext3_get_block, wbc);
-       else
-               ret = block_write_full_page(page, ext3_get_block, wbc);
+       ret = block_write_full_page(page, ext3_get_block, wbc);
 
        err = ext3_journal_stop(handle);
        if (!ret)
@@ -1922,17 +1935,6 @@ static int ext3_block_truncate_page(handle_t *handle, struct page *page,
        length = blocksize - (offset & (blocksize - 1));
        iblock = index << (PAGE_CACHE_SHIFT - inode->i_sb->s_blocksize_bits);
 
-       /*
-        * For "nobh" option,  we can only work if we don't need to
-        * read-in the page - otherwise we create buffers to do the IO.
-        */
-       if (!page_has_buffers(page) && test_opt(inode->i_sb, NOBH) &&
-            ext3_should_writeback_data(inode) && PageUptodate(page)) {
-               zero_user(page, offset, length);
-               set_page_dirty(page);
-               goto unlock;
-       }
-
        if (!page_has_buffers(page))
                create_empty_buffers(page, blocksize, 0);
 
@@ -2283,27 +2285,6 @@ static void ext3_free_branches(handle_t *handle, struct inode *inode,
                                           (__le32*)bh->b_data + addr_per_block,
                                           depth);
 
-                       /*
-                        * We've probably journalled the indirect block several
-                        * times during the truncate.  But it's no longer
-                        * needed and we now drop it from the transaction via
-                        * journal_revoke().
-                        *
-                        * That's easy if it's exclusively part of this
-                        * transaction.  But if it's part of the committing
-                        * transaction then journal_forget() will simply
-                        * brelse() it.  That means that if the underlying
-                        * block is reallocated in ext3_get_block(),
-                        * unmap_underlying_metadata() will find this block
-                        * and will try to get rid of it.  damn, damn.
-                        *
-                        * If this block has already been committed to the
-                        * journal, a revoke record will be written.  And
-                        * revoke records must be emitted *before* clearing
-                        * this block's bit in the bitmaps.
-                        */
-                       ext3_forget(handle, 1, inode, bh, bh->b_blocknr);
-
                        /*
                         * Everything below this this pointer has been
                         * released.  Now let this top-of-subtree go.
@@ -2327,6 +2308,31 @@ static void ext3_free_branches(handle_t *handle, struct inode *inode,
                                truncate_restart_transaction(handle, inode);
                        }
 
+                       /*
+                        * We've probably journalled the indirect block several
+                        * times during the truncate.  But it's no longer
+                        * needed and we now drop it from the transaction via
+                        * journal_revoke().
+                        *
+                        * That's easy if it's exclusively part of this
+                        * transaction.  But if it's part of the committing
+                        * transaction then journal_forget() will simply
+                        * brelse() it.  That means that if the underlying
+                        * block is reallocated in ext3_get_block(),
+                        * unmap_underlying_metadata() will find this block
+                        * and will try to get rid of it.  damn, damn. Thus
+                        * we don't allow a block to be reallocated until
+                        * a transaction freeing it has fully committed.
+                        *
+                        * We also have to make sure journal replay after a
+                        * crash does not overwrite non-journaled data blocks
+                        * with old metadata when the block got reallocated for
+                        * data.  Thus we have to store a revoke record for a
+                        * block in the same transaction in which we free the
+                        * block.
+                        */
+                       ext3_forget(handle, 1, inode, bh, bh->b_blocknr);
+
                        ext3_free_blocks(handle, inode, nr, 1);
 
                        if (parent_bh) {
index ee184084ca427a08d58ec58d8b9266b3263751ca..2b35ddb70d65535a53f98268310ab377ea94e1f2 100644 (file)
@@ -1447,7 +1447,6 @@ static int ext3_add_entry (handle_t *handle, struct dentry *dentry,
        struct inode *inode)
 {
        struct inode *dir = dentry->d_parent->d_inode;
-       unsigned long offset;
        struct buffer_head * bh;
        struct ext3_dir_entry_2 *de;
        struct super_block * sb;
@@ -1469,7 +1468,7 @@ static int ext3_add_entry (handle_t *handle, struct dentry *dentry,
                ext3_mark_inode_dirty(handle, dir);
        }
        blocks = dir->i_size >> sb->s_blocksize_bits;
-       for (block = 0, offset = 0; block < blocks; block++) {
+       for (block = 0; block < blocks; block++) {
                bh = ext3_bread(handle, dir, block, 0, &retval);
                if(!bh)
                        return retval;
index 54351ac7cef92deba61a0473ee4ef01589c67c39..0ccd7b12b73cb4fa25918a6dcdc81ac47a92dce1 100644 (file)
@@ -964,7 +964,6 @@ int ext3_group_extend(struct super_block *sb, struct ext3_super_block *es,
                      ext3_fsblk_t n_blocks_count)
 {
        ext3_fsblk_t o_blocks_count;
-       unsigned long o_groups_count;
        ext3_grpblk_t last;
        ext3_grpblk_t add;
        struct buffer_head * bh;
@@ -976,7 +975,6 @@ int ext3_group_extend(struct super_block *sb, struct ext3_super_block *es,
         * yet: we're going to revalidate es->s_blocks_count after
         * taking the s_resize_lock below. */
        o_blocks_count = le32_to_cpu(es->s_blocks_count);
-       o_groups_count = EXT3_SB(sb)->s_groups_count;
 
        if (test_opt(sb, DEBUG))
                printk(KERN_DEBUG "EXT3-fs: extending last group from "E3FSBLK" uto "E3FSBLK" blocks\n",
index 6c953bb255e760d4109cb35871a42827f69c4a77..9650a956fd0e31ec0c104db1165efa9c565be8db 100644 (file)
@@ -661,9 +661,6 @@ static int ext3_show_options(struct seq_file *seq, struct vfsmount *vfs)
         */
        seq_puts(seq, ",barrier=");
        seq_puts(seq, test_opt(sb, BARRIER) ? "1" : "0");
-       if (test_opt(sb, NOBH))
-               seq_puts(seq, ",nobh");
-
        seq_printf(seq, ",data=%s", data_mode_string(test_opt(sb, DATA_FLAGS)));
        if (test_opt(sb, DATA_ERR_ABORT))
                seq_puts(seq, ",data_err=abort");
@@ -1255,10 +1252,12 @@ set_qf_format:
                        *n_blocks_count = option;
                        break;
                case Opt_nobh:
-                       set_opt(sbi->s_mount_opt, NOBH);
+                       ext3_msg(sb, KERN_WARNING,
+                               "warning: ignoring deprecated nobh option");
                        break;
                case Opt_bh:
-                       clear_opt(sbi->s_mount_opt, NOBH);
+                       ext3_msg(sb, KERN_WARNING,
+                               "warning: ignoring deprecated bh option");
                        break;
                default:
                        ext3_msg(sb, KERN_ERR,
@@ -2001,14 +2000,6 @@ static int ext3_fill_super (struct super_block *sb, void *data, int silent)
                break;
        }
 
-       if (test_opt(sb, NOBH)) {
-               if (!(test_opt(sb, DATA_FLAGS) == EXT3_MOUNT_WRITEBACK_DATA)) {
-                       ext3_msg(sb, KERN_WARNING,
-                               "warning: ignoring nobh option - "
-                               "it is supported only with writeback mode");
-                       clear_opt(sbi->s_mount_opt, NOBH);
-               }
-       }
        /*
         * The journal_load will have done any necessary log recovery,
         * so we can safely mount the rest of the filesystem now.
index 8bb643cb2658615cf7c00e7083850c619953875a..1bc6b5695e6dfb34870810b87bd09c819f25c93f 100644 (file)
@@ -1449,10 +1449,10 @@ static int gfs2_quota_get_xstate(struct super_block *sb,
 
        switch (sdp->sd_args.ar_quota) {
        case GFS2_QUOTA_ON:
-               fqs->qs_flags |= (XFS_QUOTA_UDQ_ENFD | XFS_QUOTA_GDQ_ENFD);
+               fqs->qs_flags |= (FS_QUOTA_UDQ_ENFD | FS_QUOTA_GDQ_ENFD);
                /*FALLTHRU*/
        case GFS2_QUOTA_ACCOUNT:
-               fqs->qs_flags |= (XFS_QUOTA_UDQ_ACCT | XFS_QUOTA_GDQ_ACCT);
+               fqs->qs_flags |= (FS_QUOTA_UDQ_ACCT | FS_QUOTA_GDQ_ACCT);
                break;
        case GFS2_QUOTA_OFF:
                break;
@@ -1498,7 +1498,7 @@ static int gfs2_get_dqblk(struct super_block *sb, int type, qid_t id,
 
        qlvb = (struct gfs2_quota_lvb *)qd->qd_gl->gl_lvb;
        fdq->d_version = FS_DQUOT_VERSION;
-       fdq->d_flags = (type == QUOTA_USER) ? XFS_USER_QUOTA : XFS_GROUP_QUOTA;
+       fdq->d_flags = (type == QUOTA_USER) ? FS_USER_QUOTA : FS_GROUP_QUOTA;
        fdq->d_id = id;
        fdq->d_blk_hardlimit = be64_to_cpu(qlvb->qb_limit);
        fdq->d_blk_softlimit = be64_to_cpu(qlvb->qb_warn);
@@ -1533,12 +1533,12 @@ static int gfs2_set_dqblk(struct super_block *sb, int type, qid_t id,
        switch(type) {
        case USRQUOTA:
                type = QUOTA_USER;
-               if (fdq->d_flags != XFS_USER_QUOTA)
+               if (fdq->d_flags != FS_USER_QUOTA)
                        return -EINVAL;
                break;
        case GRPQUOTA:
                type = QUOTA_GROUP;
-               if (fdq->d_flags != XFS_GROUP_QUOTA)
+               if (fdq->d_flags != FS_GROUP_QUOTA)
                        return -EINVAL;
                break;
        default:
index 93d1e47647bd48d0cd300358583a80b293ee1a77..f19ce94693d848e60ea9e34164a1c75cb56618ea 100644 (file)
@@ -1281,13 +1281,9 @@ int journal_check_used_features (journal_t *journal, unsigned long compat,
 int journal_check_available_features (journal_t *journal, unsigned long compat,
                                      unsigned long ro, unsigned long incompat)
 {
-       journal_superblock_t *sb;
-
        if (!compat && !ro && !incompat)
                return 1;
 
-       sb = journal->j_superblock;
-
        /* We can support any known requested features iff the
         * superblock is in version 2.  Otherwise we fail to support any
         * extended sb features. */
@@ -1481,7 +1477,6 @@ int journal_flush(journal_t *journal)
 
 int journal_wipe(journal_t *journal, int write)
 {
-       journal_superblock_t *sb;
        int err = 0;
 
        J_ASSERT (!(journal->j_flags & JFS_LOADED));
@@ -1490,8 +1485,6 @@ int journal_wipe(journal_t *journal, int write)
        if (err)
                return err;
 
-       sb = journal->j_superblock;
-
        if (!journal->j_tail)
                goto no_recovery;
 
index 54c9bc9e1b17e01487cca2eb81d5bfdf7a649585..81051dafebf5cadea98d14ab9deed5fabe068937 100644 (file)
@@ -283,12 +283,9 @@ int journal_recover(journal_t *journal)
 int journal_skip_recovery(journal_t *journal)
 {
        int                     err;
-       journal_superblock_t *  sb;
-
        struct recovery_info    info;
 
        memset (&info, 0, sizeof(info));
-       sb = journal->j_superblock;
 
        err = do_one_pass(journal, &info, PASS_SCAN);
 
@@ -297,7 +294,8 @@ int journal_skip_recovery(journal_t *journal)
                ++journal->j_transaction_sequence;
        } else {
 #ifdef CONFIG_JBD_DEBUG
-               int dropped = info.end_transaction - be32_to_cpu(sb->s_sequence);
+               int dropped = info.end_transaction -
+                             be32_to_cpu(journal->j_superblock->s_sequence);
 #endif
                jbd_debug(1,
                          "JBD: ignoring %d transaction%s from the journal.\n",
@@ -321,11 +319,6 @@ static int do_one_pass(journal_t *journal,
        unsigned int            sequence;
        int                     blocktype;
 
-       /* Precompute the maximum metadata descriptors in a descriptor block */
-       int                     MAX_BLOCKS_PER_DESC;
-       MAX_BLOCKS_PER_DESC = ((journal->j_blocksize-sizeof(journal_header_t))
-                              / sizeof(journal_block_tag_t));
-
        /*
         * First thing is to establish what we expect to find in the log
         * (in terms of transaction IDs), and where (in terms of log
index 437d2ca2de973d1027109b038e895e31a68b3a63..ef72b1699429e856f711504cf7c818642926483a 100644 (file)
@@ -132,6 +132,22 @@ static __cacheline_aligned_in_smp DEFINE_SPINLOCK(dq_state_lock);
 __cacheline_aligned_in_smp DEFINE_SPINLOCK(dq_data_lock);
 EXPORT_SYMBOL(dq_data_lock);
 
+void __quota_error(struct super_block *sb, const char *func,
+                 const char *fmt, ...)
+{
+       va_list args;
+
+       if (printk_ratelimit()) {
+               va_start(args, fmt);
+               printk(KERN_ERR "Quota error (device %s): %s: ",
+                      sb->s_id, func);
+               vprintk(fmt, args);
+               printk("\n");
+               va_end(args);
+       }
+}
+EXPORT_SYMBOL(__quota_error);
+
 #if defined(CONFIG_QUOTA_DEBUG) || defined(CONFIG_PRINT_QUOTA_WARNING)
 static char *quotatypes[] = INITQFNAMES;
 #endif
@@ -705,11 +721,8 @@ void dqput(struct dquot *dquot)
                return;
 #ifdef CONFIG_QUOTA_DEBUG
        if (!atomic_read(&dquot->dq_count)) {
-               printk("VFS: dqput: trying to free free dquot\n");
-               printk("VFS: device %s, dquot of %s %d\n",
-                       dquot->dq_sb->s_id,
-                       quotatypes[dquot->dq_type],
-                       dquot->dq_id);
+               quota_error(dquot->dq_sb, "trying to free free dquot of %s %d",
+                           quotatypes[dquot->dq_type], dquot->dq_id);
                BUG();
        }
 #endif
@@ -732,9 +745,9 @@ we_slept:
                /* Commit dquot before releasing */
                ret = dquot->dq_sb->dq_op->write_dquot(dquot);
                if (ret < 0) {
-                       printk(KERN_ERR "VFS: cannot write quota structure on "
-                               "device %s (error %d). Quota may get out of "
-                               "sync!\n", dquot->dq_sb->s_id, ret);
+                       quota_error(dquot->dq_sb, "Can't write quota structure"
+                                   " (error %d). Quota may get out of sync!",
+                                   ret);
                        /*
                         * We clear dirty bit anyway, so that we avoid
                         * infinite loop here
@@ -914,9 +927,9 @@ static void add_dquot_ref(struct super_block *sb, int type)
 
 #ifdef CONFIG_QUOTA_DEBUG
        if (reserved) {
-               printk(KERN_WARNING "VFS (%s): Writes happened before quota"
-                       " was turned on thus quota information is probably "
-                       "inconsistent. Please run quotacheck(8).\n", sb->s_id);
+               quota_error(sb, "Writes happened before quota was turned on "
+                       "thus quota information is probably inconsistent. "
+                       "Please run quotacheck(8)");
        }
 #endif
 }
@@ -947,7 +960,9 @@ static int remove_inode_dquot_ref(struct inode *inode, int type,
                if (dqput_blocks(dquot)) {
 #ifdef CONFIG_QUOTA_DEBUG
                        if (atomic_read(&dquot->dq_count) != 1)
-                               printk(KERN_WARNING "VFS: Adding dquot with dq_count %d to dispose list.\n", atomic_read(&dquot->dq_count));
+                               quota_error(inode->i_sb, "Adding dquot with "
+                                           "dq_count %d to dispose list",
+                                           atomic_read(&dquot->dq_count));
 #endif
                        spin_lock(&dq_list_lock);
                        /* As dquot must have currently users it can't be on
@@ -986,6 +1001,7 @@ static void remove_dquot_ref(struct super_block *sb, int type,
                struct list_head *tofree_head)
 {
        struct inode *inode;
+       int reserved = 0;
 
        spin_lock(&inode_lock);
        list_for_each_entry(inode, &sb->s_inodes, i_sb_list) {
@@ -995,10 +1011,20 @@ static void remove_dquot_ref(struct super_block *sb, int type,
                 *  only quota pointers and these have separate locking
                 *  (dqptr_sem).
                 */
-               if (!IS_NOQUOTA(inode))
+               if (!IS_NOQUOTA(inode)) {
+                       if (unlikely(inode_get_rsv_space(inode) > 0))
+                               reserved = 1;
                        remove_inode_dquot_ref(inode, type, tofree_head);
+               }
        }
        spin_unlock(&inode_lock);
+#ifdef CONFIG_QUOTA_DEBUG
+       if (reserved) {
+               printk(KERN_WARNING "VFS (%s): Writes happened after quota"
+                       " was disabled thus quota information is probably "
+                       "inconsistent. Please run quotacheck(8).\n", sb->s_id);
+       }
+#endif
 }
 
 /* Gather all references from inodes and drop them */
@@ -1304,6 +1330,15 @@ static int info_bdq_free(struct dquot *dquot, qsize_t space)
        return QUOTA_NL_NOWARN;
 }
 
+static int dquot_active(const struct inode *inode)
+{
+       struct super_block *sb = inode->i_sb;
+
+       if (IS_NOQUOTA(inode))
+               return 0;
+       return sb_any_quota_loaded(sb) & ~sb_any_quota_suspended(sb);
+}
+
 /*
  * Initialize quota pointers in inode
  *
@@ -1323,7 +1358,7 @@ static void __dquot_initialize(struct inode *inode, int type)
 
        /* First test before acquiring mutex - solves deadlocks when we
          * re-enter the quota code and are already holding the mutex */
-       if (!sb_any_quota_active(inode->i_sb) || IS_NOQUOTA(inode))
+       if (!dquot_active(inode))
                return;
 
        /* First get references to structures we might need. */
@@ -1507,7 +1542,7 @@ int __dquot_alloc_space(struct inode *inode, qsize_t number, int flags)
         * First test before acquiring mutex - solves deadlocks when we
         * re-enter the quota code and are already holding the mutex
         */
-       if (!sb_any_quota_active(inode->i_sb) || IS_NOQUOTA(inode)) {
+       if (!dquot_active(inode)) {
                inode_incr_space(inode, number, reserve);
                goto out;
        }
@@ -1559,7 +1594,7 @@ int dquot_alloc_inode(const struct inode *inode)
 
        /* First test before acquiring mutex - solves deadlocks when we
          * re-enter the quota code and are already holding the mutex */
-       if (!sb_any_quota_active(inode->i_sb) || IS_NOQUOTA(inode))
+       if (!dquot_active(inode))
                return 0;
        for (cnt = 0; cnt < MAXQUOTAS; cnt++)
                warntype[cnt] = QUOTA_NL_NOWARN;
@@ -1596,7 +1631,7 @@ int dquot_claim_space_nodirty(struct inode *inode, qsize_t number)
 {
        int cnt;
 
-       if (!sb_any_quota_active(inode->i_sb) || IS_NOQUOTA(inode)) {
+       if (!dquot_active(inode)) {
                inode_claim_rsv_space(inode, number);
                return 0;
        }
@@ -1629,7 +1664,7 @@ void __dquot_free_space(struct inode *inode, qsize_t number, int flags)
 
        /* First test before acquiring mutex - solves deadlocks when we
          * re-enter the quota code and are already holding the mutex */
-       if (!sb_any_quota_active(inode->i_sb) || IS_NOQUOTA(inode)) {
+       if (!dquot_active(inode)) {
                inode_decr_space(inode, number, reserve);
                return;
        }
@@ -1667,7 +1702,7 @@ void dquot_free_inode(const struct inode *inode)
 
        /* First test before acquiring mutex - solves deadlocks when we
          * re-enter the quota code and are already holding the mutex */
-       if (!sb_any_quota_active(inode->i_sb) || IS_NOQUOTA(inode))
+       if (!dquot_active(inode))
                return;
 
        down_read(&sb_dqopt(inode->i_sb)->dqptr_sem);
@@ -1790,7 +1825,7 @@ int dquot_transfer(struct inode *inode, struct iattr *iattr)
        struct super_block *sb = inode->i_sb;
        int ret;
 
-       if (!sb_any_quota_active(sb) || IS_NOQUOTA(inode))
+       if (!dquot_active(inode))
                return 0;
 
        if (iattr->ia_valid & ATTR_UID && iattr->ia_uid != inode->i_uid)
@@ -1957,7 +1992,7 @@ int dquot_disable(struct super_block *sb, int type, unsigned int flags)
                                truncate_inode_pages(&toputinode[cnt]->i_data,
                                                     0);
                                mutex_unlock(&toputinode[cnt]->i_mutex);
-                               mark_inode_dirty(toputinode[cnt]);
+                               mark_inode_dirty_sync(toputinode[cnt]);
                        }
                        mutex_unlock(&dqopt->dqonoff_mutex);
                }
@@ -2270,7 +2305,7 @@ static void do_get_dqblk(struct dquot *dquot, struct fs_disk_quota *di)
        memset(di, 0, sizeof(*di));
        di->d_version = FS_DQUOT_VERSION;
        di->d_flags = dquot->dq_type == USRQUOTA ?
-                       XFS_USER_QUOTA : XFS_GROUP_QUOTA;
+                       FS_USER_QUOTA : FS_GROUP_QUOTA;
        di->d_id = dquot->dq_id;
 
        spin_lock(&dq_data_lock);
index 24f03407eeb53317f9bbdf42323f2d1649f211ce..9e48874eabcc2008f5455d9dde3d51cfc861f33a 100644 (file)
@@ -65,8 +65,7 @@ static ssize_t write_blk(struct qtree_mem_dqinfo *info, uint blk, char *buf)
        ret = sb->s_op->quota_write(sb, info->dqi_type, buf,
               info->dqi_usable_bs, blk << info->dqi_blocksize_bits);
        if (ret != info->dqi_usable_bs) {
-               q_warn(KERN_WARNING "VFS: dquota write failed on "
-                       "dev %s\n", sb->s_id);
+               quota_error(sb, "dquota write failed");
                if (ret >= 0)
                        ret = -EIO;
        }
@@ -160,9 +159,8 @@ static int remove_free_dqentry(struct qtree_mem_dqinfo *info, char *buf,
        dh->dqdh_next_free = dh->dqdh_prev_free = cpu_to_le32(0);
        /* No matter whether write succeeds block is out of list */
        if (write_blk(info, blk, buf) < 0)
-               q_warn(KERN_ERR
-                      "VFS: Can't write block (%u) with free entries.\n",
-                      blk);
+               quota_error(info->dqi_sb, "Can't write block (%u) "
+                           "with free entries", blk);
        return 0;
 out_buf:
        kfree(tmpbuf);
@@ -252,9 +250,8 @@ static uint find_free_dqentry(struct qtree_mem_dqinfo *info,
        if (le16_to_cpu(dh->dqdh_entries) + 1 >= qtree_dqstr_in_blk(info)) {
                *err = remove_free_dqentry(info, buf, blk);
                if (*err < 0) {
-                       q_warn(KERN_ERR "VFS: find_free_dqentry(): Can't "
-                              "remove block (%u) from entry free list.\n",
-                              blk);
+                       quota_error(dquot->dq_sb, "Can't remove block (%u) "
+                                   "from entry free list", blk);
                        goto out_buf;
                }
        }
@@ -268,16 +265,15 @@ static uint find_free_dqentry(struct qtree_mem_dqinfo *info,
        }
 #ifdef __QUOTA_QT_PARANOIA
        if (i == qtree_dqstr_in_blk(info)) {
-               printk(KERN_ERR "VFS: find_free_dqentry(): Data block full "
-                               "but it shouldn't.\n");
+               quota_error(dquot->dq_sb, "Data block full but it shouldn't");
                *err = -EIO;
                goto out_buf;
        }
 #endif
        *err = write_blk(info, blk, buf);
        if (*err < 0) {
-               q_warn(KERN_ERR "VFS: find_free_dqentry(): Can't write quota "
-                               "data block %u.\n", blk);
+               quota_error(dquot->dq_sb, "Can't write quota data block %u",
+                           blk);
                goto out_buf;
        }
        dquot->dq_off = (blk << info->dqi_blocksize_bits) +
@@ -311,8 +307,8 @@ static int do_insert_tree(struct qtree_mem_dqinfo *info, struct dquot *dquot,
        } else {
                ret = read_blk(info, *treeblk, buf);
                if (ret < 0) {
-                       q_warn(KERN_ERR "VFS: Can't read tree quota block "
-                                       "%u.\n", *treeblk);
+                       quota_error(dquot->dq_sb, "Can't read tree quota "
+                                   "block %u", *treeblk);
                        goto out_buf;
                }
        }
@@ -323,9 +319,9 @@ static int do_insert_tree(struct qtree_mem_dqinfo *info, struct dquot *dquot,
        if (depth == info->dqi_qtree_depth - 1) {
 #ifdef __QUOTA_QT_PARANOIA
                if (newblk) {
-                       printk(KERN_ERR "VFS: Inserting already present quota "
-                                       "entry (block %u).\n",
-                              le32_to_cpu(ref[get_index(info,
+                       quota_error(dquot->dq_sb, "Inserting already present "
+                                   "quota entry (block %u)",
+                                   le32_to_cpu(ref[get_index(info,
                                                dquot->dq_id, depth)]));
                        ret = -EIO;
                        goto out_buf;
@@ -373,8 +369,8 @@ int qtree_write_dquot(struct qtree_mem_dqinfo *info, struct dquot *dquot)
        if (!dquot->dq_off) {
                ret = dq_insert_tree(info, dquot);
                if (ret < 0) {
-                       q_warn(KERN_ERR "VFS: Error %zd occurred while "
-                                       "creating quota.\n", ret);
+                       quota_error(sb, "Error %zd occurred while creating "
+                                   "quota", ret);
                        kfree(ddquot);
                        return ret;
                }
@@ -385,8 +381,7 @@ int qtree_write_dquot(struct qtree_mem_dqinfo *info, struct dquot *dquot)
        ret = sb->s_op->quota_write(sb, type, ddquot, info->dqi_entry_size,
                                    dquot->dq_off);
        if (ret != info->dqi_entry_size) {
-               q_warn(KERN_WARNING "VFS: dquota write failed on dev %s\n",
-                      sb->s_id);
+               quota_error(sb, "dquota write failed");
                if (ret >= 0)
                        ret = -ENOSPC;
        } else {
@@ -410,14 +405,15 @@ static int free_dqentry(struct qtree_mem_dqinfo *info, struct dquot *dquot,
        if (!buf)
                return -ENOMEM;
        if (dquot->dq_off >> info->dqi_blocksize_bits != blk) {
-               q_warn(KERN_ERR "VFS: Quota structure has offset to other "
-                 "block (%u) than it should (%u).\n", blk,
-                 (uint)(dquot->dq_off >> info->dqi_blocksize_bits));
+               quota_error(dquot->dq_sb, "Quota structure has offset to "
+                       "other block (%u) than it should (%u)", blk,
+                       (uint)(dquot->dq_off >> info->dqi_blocksize_bits));
                goto out_buf;
        }
        ret = read_blk(info, blk, buf);
        if (ret < 0) {
-               q_warn(KERN_ERR "VFS: Can't read quota data block %u\n", blk);
+               quota_error(dquot->dq_sb, "Can't read quota data block %u",
+                           blk);
                goto out_buf;
        }
        dh = (struct qt_disk_dqdbheader *)buf;
@@ -427,8 +423,8 @@ static int free_dqentry(struct qtree_mem_dqinfo *info, struct dquot *dquot,
                if (ret >= 0)
                        ret = put_free_dqblk(info, buf, blk);
                if (ret < 0) {
-                       q_warn(KERN_ERR "VFS: Can't move quota data block (%u) "
-                         "to free list.\n", blk);
+                       quota_error(dquot->dq_sb, "Can't move quota data block "
+                                   "(%u) to free list", blk);
                        goto out_buf;
                }
        } else {
@@ -440,15 +436,15 @@ static int free_dqentry(struct qtree_mem_dqinfo *info, struct dquot *dquot,
                        /* Insert will write block itself */
                        ret = insert_free_dqentry(info, buf, blk);
                        if (ret < 0) {
-                               q_warn(KERN_ERR "VFS: Can't insert quota data "
-                                      "block (%u) to free entry list.\n", blk);
+                               quota_error(dquot->dq_sb, "Can't insert quota "
+                                   "data block (%u) to free entry list", blk);
                                goto out_buf;
                        }
                } else {
                        ret = write_blk(info, blk, buf);
                        if (ret < 0) {
-                               q_warn(KERN_ERR "VFS: Can't write quota data "
-                                 "block %u\n", blk);
+                               quota_error(dquot->dq_sb, "Can't write quota "
+                                           "data block %u", blk);
                                goto out_buf;
                        }
                }
@@ -472,7 +468,8 @@ static int remove_tree(struct qtree_mem_dqinfo *info, struct dquot *dquot,
                return -ENOMEM;
        ret = read_blk(info, *blk, buf);
        if (ret < 0) {
-               q_warn(KERN_ERR "VFS: Can't read quota data block %u\n", *blk);
+               quota_error(dquot->dq_sb, "Can't read quota data "
+                           "block %u", blk);
                goto out_buf;
        }
        newblk = le32_to_cpu(ref[get_index(info, dquot->dq_id, depth)]);
@@ -496,8 +493,8 @@ static int remove_tree(struct qtree_mem_dqinfo *info, struct dquot *dquot,
                } else {
                        ret = write_blk(info, *blk, buf);
                        if (ret < 0)
-                               q_warn(KERN_ERR "VFS: Can't write quota tree "
-                                 "block %u.\n", *blk);
+                               quota_error(dquot->dq_sb, "Can't write quota "
+                                           "tree block %u", blk);
                }
        }
 out_buf:
@@ -529,7 +526,8 @@ static loff_t find_block_dqentry(struct qtree_mem_dqinfo *info,
                return -ENOMEM;
        ret = read_blk(info, blk, buf);
        if (ret < 0) {
-               q_warn(KERN_ERR "VFS: Can't read quota tree block %u.\n", blk);
+               quota_error(dquot->dq_sb, "Can't read quota tree "
+                           "block %u", blk);
                goto out_buf;
        }
        ddquot = buf + sizeof(struct qt_disk_dqdbheader);
@@ -539,8 +537,8 @@ static loff_t find_block_dqentry(struct qtree_mem_dqinfo *info,
                ddquot += info->dqi_entry_size;
        }
        if (i == qtree_dqstr_in_blk(info)) {
-               q_warn(KERN_ERR "VFS: Quota for id %u referenced "
-                 "but not present.\n", dquot->dq_id);
+               quota_error(dquot->dq_sb, "Quota for id %u referenced "
+                           "but not present", dquot->dq_id);
                ret = -EIO;
                goto out_buf;
        } else {
@@ -564,7 +562,8 @@ static loff_t find_tree_dqentry(struct qtree_mem_dqinfo *info,
                return -ENOMEM;
        ret = read_blk(info, blk, buf);
        if (ret < 0) {
-               q_warn(KERN_ERR "VFS: Can't read quota tree block %u.\n", blk);
+               quota_error(dquot->dq_sb, "Can't read quota tree block %u",
+                           blk);
                goto out_buf;
        }
        ret = 0;
@@ -598,7 +597,7 @@ int qtree_read_dquot(struct qtree_mem_dqinfo *info, struct dquot *dquot)
 #ifdef __QUOTA_QT_PARANOIA
        /* Invalidated quota? */
        if (!sb_dqopt(dquot->dq_sb)->files[type]) {
-               printk(KERN_ERR "VFS: Quota invalidated while reading!\n");
+               quota_error(sb, "Quota invalidated while reading!");
                return -EIO;
        }
 #endif
@@ -607,8 +606,8 @@ int qtree_read_dquot(struct qtree_mem_dqinfo *info, struct dquot *dquot)
                offset = find_dqentry(info, dquot);
                if (offset <= 0) {      /* Entry not present? */
                        if (offset < 0)
-                               q_warn(KERN_ERR "VFS: Can't read quota "
-                                 "structure for id %u.\n", dquot->dq_id);
+                               quota_error(sb, "Can't read quota structure "
+                                           "for id %u", dquot->dq_id);
                        dquot->dq_off = 0;
                        set_bit(DQ_FAKE_B, &dquot->dq_flags);
                        memset(&dquot->dq_dqb, 0, sizeof(struct mem_dqblk));
@@ -625,8 +624,8 @@ int qtree_read_dquot(struct qtree_mem_dqinfo *info, struct dquot *dquot)
        if (ret != info->dqi_entry_size) {
                if (ret >= 0)
                        ret = -EIO;
-               q_warn(KERN_ERR "VFS: Error while reading quota "
-                               "structure for id %u.\n", dquot->dq_id);
+               quota_error(sb, "Error while reading quota structure for id %u",
+                           dquot->dq_id);
                set_bit(DQ_FAKE_B, &dquot->dq_flags);
                memset(&dquot->dq_dqb, 0, sizeof(struct mem_dqblk));
                kfree(ddquot);
index ccc3e71fb1d8efa940227cb2e704c0f35a57a6e1..a1ab8db81a511b52c5471a7959493251eba88750 100644 (file)
@@ -22,10 +22,4 @@ struct qt_disk_dqdbheader {
 
 #define QT_TREEOFF     1               /* Offset of tree in file in blocks */
 
-#define q_warn(fmt, args...) \
-do { \
-       if (printk_ratelimit()) \
-               printk(fmt, ## args); \
-} while(0)
-
 #endif /* _LINUX_QUOTAIO_TREE_H */
index 4af344c5852a9e1cb53e4d8eb2fe70d51f5b10a4..34b37a67bb16c6c936bd725e5fa79e76ffb2ddc0 100644 (file)
@@ -95,8 +95,7 @@ static int v1_commit_dqblk(struct dquot *dquot)
                        (char *)&dqblk, sizeof(struct v1_disk_dqblk),
                        v1_dqoff(dquot->dq_id));
        if (ret != sizeof(struct v1_disk_dqblk)) {
-               printk(KERN_WARNING "VFS: dquota write failed on dev %s\n",
-                       dquot->dq_sb->s_id);
+               quota_error(dquot->dq_sb, "dquota write failed");
                if (ret >= 0)
                        ret = -EIO;
                goto out;
index 135206af1458629c3cc209f09a6b213133671bce..65444d29406bf3c782b2741dc25f9dd571691096 100644 (file)
@@ -63,9 +63,8 @@ static int v2_read_header(struct super_block *sb, int type,
        size = sb->s_op->quota_read(sb, type, (char *)dqhead,
                                    sizeof(struct v2_disk_dqheader), 0);
        if (size != sizeof(struct v2_disk_dqheader)) {
-               q_warn(KERN_WARNING "quota_v2: Failed header read:"
-                      " expected=%zd got=%zd\n",
-                       sizeof(struct v2_disk_dqheader), size);
+               quota_error(sb, "Failed header read: expected=%zd got=%zd",
+                           sizeof(struct v2_disk_dqheader), size);
                return 0;
        }
        return 1;
@@ -106,8 +105,7 @@ static int v2_read_file_info(struct super_block *sb, int type)
        size = sb->s_op->quota_read(sb, type, (char *)&dinfo,
               sizeof(struct v2_disk_dqinfo), V2_DQINFOOFF);
        if (size != sizeof(struct v2_disk_dqinfo)) {
-               q_warn(KERN_WARNING "quota_v2: Can't read info structure on device %s.\n",
-                       sb->s_id);
+               quota_error(sb, "Can't read info structure");
                return -1;
        }
        info->dqi_priv = kmalloc(sizeof(struct qtree_mem_dqinfo), GFP_NOFS);
@@ -167,8 +165,7 @@ static int v2_write_file_info(struct super_block *sb, int type)
        size = sb->s_op->quota_write(sb, type, (char *)&dinfo,
               sizeof(struct v2_disk_dqinfo), V2_DQINFOOFF);
        if (size != sizeof(struct v2_disk_dqinfo)) {
-               q_warn(KERN_WARNING "Can't write info structure on device %s.\n",
-                       sb->s_id);
+               quota_error(sb, "Can't write info structure");
                return -1;
        }
        return 0;
index bfd5ac9d1f6f774c49a58588ecc3d6f881bb04aa..29b9d642e93d08123ddf1db5a01e1edddd1ee17b 100644 (file)
@@ -68,15 +68,15 @@ xfs_fs_set_xstate(
        if (op != Q_XQUOTARM && !XFS_IS_QUOTA_RUNNING(mp))
                return -ENOSYS;
 
-       if (uflags & XFS_QUOTA_UDQ_ACCT)
+       if (uflags & FS_QUOTA_UDQ_ACCT)
                flags |= XFS_UQUOTA_ACCT;
-       if (uflags & XFS_QUOTA_PDQ_ACCT)
+       if (uflags & FS_QUOTA_PDQ_ACCT)
                flags |= XFS_PQUOTA_ACCT;
-       if (uflags & XFS_QUOTA_GDQ_ACCT)
+       if (uflags & FS_QUOTA_GDQ_ACCT)
                flags |= XFS_GQUOTA_ACCT;
-       if (uflags & XFS_QUOTA_UDQ_ENFD)
+       if (uflags & FS_QUOTA_UDQ_ENFD)
                flags |= XFS_UQUOTA_ENFD;
-       if (uflags & (XFS_QUOTA_PDQ_ENFD|XFS_QUOTA_GDQ_ENFD))
+       if (uflags & (FS_QUOTA_PDQ_ENFD|FS_QUOTA_GDQ_ENFD))
                flags |= XFS_OQUOTA_ENFD;
 
        switch (op) {
index d257eb8557c43a873644ea6481ec5611b9a0051f..45e5849df238c1b80f6ea19b438f065f1c185d79 100644 (file)
@@ -810,9 +810,9 @@ xfs_qm_export_dquot(
        }
 
 #ifdef DEBUG
-       if (((XFS_IS_UQUOTA_ENFORCED(mp) && dst->d_flags == XFS_USER_QUOTA) ||
+       if (((XFS_IS_UQUOTA_ENFORCED(mp) && dst->d_flags == FS_USER_QUOTA) ||
             (XFS_IS_OQUOTA_ENFORCED(mp) &&
-                       (dst->d_flags & (XFS_PROJ_QUOTA | XFS_GROUP_QUOTA)))) &&
+                       (dst->d_flags & (FS_PROJ_QUOTA | FS_GROUP_QUOTA)))) &&
            dst->d_id != 0) {
                if (((int) dst->d_bcount >= (int) dst->d_blk_softlimit) &&
                    (dst->d_blk_softlimit > 0)) {
@@ -833,17 +833,17 @@ xfs_qm_export_qtype_flags(
        /*
         * Can't be more than one, or none.
         */
-       ASSERT((flags & (XFS_PROJ_QUOTA | XFS_USER_QUOTA)) !=
-               (XFS_PROJ_QUOTA | XFS_USER_QUOTA));
-       ASSERT((flags & (XFS_PROJ_QUOTA | XFS_GROUP_QUOTA)) !=
-               (XFS_PROJ_QUOTA | XFS_GROUP_QUOTA));
-       ASSERT((flags & (XFS_USER_QUOTA | XFS_GROUP_QUOTA)) !=
-               (XFS_USER_QUOTA | XFS_GROUP_QUOTA));
-       ASSERT((flags & (XFS_PROJ_QUOTA|XFS_USER_QUOTA|XFS_GROUP_QUOTA)) != 0);
+       ASSERT((flags & (FS_PROJ_QUOTA | FS_USER_QUOTA)) !=
+               (FS_PROJ_QUOTA | FS_USER_QUOTA));
+       ASSERT((flags & (FS_PROJ_QUOTA | FS_GROUP_QUOTA)) !=
+               (FS_PROJ_QUOTA | FS_GROUP_QUOTA));
+       ASSERT((flags & (FS_USER_QUOTA | FS_GROUP_QUOTA)) !=
+               (FS_USER_QUOTA | FS_GROUP_QUOTA));
+       ASSERT((flags & (FS_PROJ_QUOTA|FS_USER_QUOTA|FS_GROUP_QUOTA)) != 0);
 
        return (flags & XFS_DQ_USER) ?
-               XFS_USER_QUOTA : (flags & XFS_DQ_PROJ) ?
-                       XFS_PROJ_QUOTA : XFS_GROUP_QUOTA;
+               FS_USER_QUOTA : (flags & XFS_DQ_PROJ) ?
+                       FS_PROJ_QUOTA : FS_GROUP_QUOTA;
 }
 
 STATIC uint
@@ -854,16 +854,16 @@ xfs_qm_export_flags(
 
        uflags = 0;
        if (flags & XFS_UQUOTA_ACCT)
-               uflags |= XFS_QUOTA_UDQ_ACCT;
+               uflags |= FS_QUOTA_UDQ_ACCT;
        if (flags & XFS_PQUOTA_ACCT)
-               uflags |= XFS_QUOTA_PDQ_ACCT;
+               uflags |= FS_QUOTA_PDQ_ACCT;
        if (flags & XFS_GQUOTA_ACCT)
-               uflags |= XFS_QUOTA_GDQ_ACCT;
+               uflags |= FS_QUOTA_GDQ_ACCT;
        if (flags & XFS_UQUOTA_ENFD)
-               uflags |= XFS_QUOTA_UDQ_ENFD;
+               uflags |= FS_QUOTA_UDQ_ENFD;
        if (flags & (XFS_OQUOTA_ENFD)) {
                uflags |= (flags & XFS_GQUOTA_ACCT) ?
-                       XFS_QUOTA_GDQ_ENFD : XFS_QUOTA_PDQ_ENFD;
+                       FS_QUOTA_GDQ_ENFD : FS_QUOTA_PDQ_ENFD;
        }
        return (uflags);
 }
index 4389ae72024e73cfc48e7389e988c2d15ce81b22..86552807aed949529fc34a3007658ede564f4e52 100644 (file)
@@ -49,7 +49,7 @@
 #define FS_DQUOT_VERSION       1       /* fs_disk_quota.d_version */
 typedef struct fs_disk_quota {
        __s8            d_version;      /* version of this structure */
-       __s8            d_flags;        /* XFS_{USER,PROJ,GROUP}_QUOTA */
+       __s8            d_flags;        /* FS_{USER,PROJ,GROUP}_QUOTA */
        __u16           d_fieldmask;    /* field specifier */
        __u32           d_id;           /* user, project, or group ID */
        __u64           d_blk_hardlimit;/* absolute limit on disk blks */
@@ -119,18 +119,18 @@ typedef struct fs_disk_quota {
 #define FS_DQ_ACCT_MASK                (FS_DQ_BCOUNT | FS_DQ_ICOUNT | FS_DQ_RTBCOUNT)
 
 /*
- * Various flags related to quotactl(2).  Only relevant to XFS filesystems.
+ * Various flags related to quotactl(2).
  */
-#define XFS_QUOTA_UDQ_ACCT     (1<<0)  /* user quota accounting */
-#define XFS_QUOTA_UDQ_ENFD     (1<<1)  /* user quota limits enforcement */
-#define XFS_QUOTA_GDQ_ACCT     (1<<2)  /* group quota accounting */
-#define XFS_QUOTA_GDQ_ENFD     (1<<3)  /* group quota limits enforcement */
-#define XFS_QUOTA_PDQ_ACCT     (1<<4)  /* project quota accounting */
-#define XFS_QUOTA_PDQ_ENFD     (1<<5)  /* project quota limits enforcement */
+#define FS_QUOTA_UDQ_ACCT      (1<<0)  /* user quota accounting */
+#define FS_QUOTA_UDQ_ENFD      (1<<1)  /* user quota limits enforcement */
+#define FS_QUOTA_GDQ_ACCT      (1<<2)  /* group quota accounting */
+#define FS_QUOTA_GDQ_ENFD      (1<<3)  /* group quota limits enforcement */
+#define FS_QUOTA_PDQ_ACCT      (1<<4)  /* project quota accounting */
+#define FS_QUOTA_PDQ_ENFD      (1<<5)  /* project quota limits enforcement */
 
-#define XFS_USER_QUOTA         (1<<0)  /* user quota type */
-#define XFS_PROJ_QUOTA         (1<<1)  /* project quota type */
-#define XFS_GROUP_QUOTA                (1<<2)  /* group quota type */
+#define FS_USER_QUOTA          (1<<0)  /* user quota type */
+#define FS_PROJ_QUOTA          (1<<1)  /* project quota type */
+#define FS_GROUP_QUOTA         (1<<2)  /* group quota type */
 
 /*
  * fs_quota_stat is the struct returned in Q_XGETQSTAT for a given file system.
@@ -151,7 +151,7 @@ typedef struct fs_qfilestat {
 
 typedef struct fs_quota_stat {
        __s8            qs_version;     /* version number for future changes */
-       __u16           qs_flags;       /* XFS_QUOTA_{U,P,G}DQ_{ACCT,ENFD} */
+       __u16           qs_flags;       /* FS_QUOTA_{U,P,G}DQ_{ACCT,ENFD} */
        __s8            qs_pad;         /* unused */
        fs_qfilestat_t  qs_uquota;      /* user quota storage information */
        fs_qfilestat_t  qs_gquota;      /* group quota storage information */
index 7fc62d4550b207ac682021ad01bd9ff3b644d788..3d3a9915dde29193895357edee90c8d3d13c81f3 100644 (file)
@@ -400,7 +400,6 @@ struct ext3_inode {
 #define EXT3_MOUNT_POSIX_ACL           0x08000 /* POSIX Access Control Lists */
 #define EXT3_MOUNT_RESERVATION         0x10000 /* Preallocation */
 #define EXT3_MOUNT_BARRIER             0x20000 /* Use block barriers */
-#define EXT3_MOUNT_NOBH                        0x40000 /* No bufferheads */
 #define EXT3_MOUNT_QUOTA               0x80000 /* Some quota option set */
 #define EXT3_MOUNT_USRQUOTA            0x100000 /* "old" user quota */
 #define EXT3_MOUNT_GRPQUOTA            0x200000 /* "old" group quota */
index aa36793b48bd11b80b4b33765c7b7d074a899e7f..d50ba858cfe0c15325ff5fcf410d7a18f1a8aad3 100644 (file)
@@ -28,6 +28,12 @@ static inline bool is_quota_modification(struct inode *inode, struct iattr *ia)
 
 #if defined(CONFIG_QUOTA)
 
+#define quota_error(sb, fmt, args...) \
+       __quota_error((sb), __func__, fmt , ## args)
+
+extern void __quota_error(struct super_block *sb, const char *func,
+                        const char *fmt, ...);
+
 /*
  * declaration of quota_function calls in kernel.
  */
@@ -145,11 +151,6 @@ static inline bool sb_has_quota_active(struct super_block *sb, int type)
               !sb_has_quota_suspended(sb, type);
 }
 
-static inline unsigned sb_any_quota_active(struct super_block *sb)
-{
-       return sb_any_quota_loaded(sb) & ~sb_any_quota_suspended(sb);
-}
-
 /*
  * Operations supported for diskquotas.
  */
@@ -194,11 +195,6 @@ static inline int sb_has_quota_active(struct super_block *sb, int type)
        return 0;
 }
 
-static inline int sb_any_quota_active(struct super_block *sb)
-{
-       return 0;
-}
-
 static inline void dquot_initialize(struct inode *inode)
 {
 }
@@ -270,7 +266,7 @@ static inline int dquot_alloc_space_nodirty(struct inode *inode, qsize_t nr)
 static inline void dquot_alloc_space_nofail(struct inode *inode, qsize_t nr)
 {
        __dquot_alloc_space(inode, nr, DQUOT_SPACE_WARN|DQUOT_SPACE_NOFAIL);
-       mark_inode_dirty(inode);
+       mark_inode_dirty_sync(inode);
 }
 
 static inline int dquot_alloc_space(struct inode *inode, qsize_t nr)
@@ -279,7 +275,7 @@ static inline int dquot_alloc_space(struct inode *inode, qsize_t nr)
 
        ret = dquot_alloc_space_nodirty(inode, nr);
        if (!ret)
-               mark_inode_dirty(inode);
+               mark_inode_dirty_sync(inode);
        return ret;
 }
 
@@ -309,7 +305,7 @@ static inline int dquot_prealloc_block(struct inode *inode, qsize_t nr)
 
        ret = dquot_prealloc_block_nodirty(inode, nr);
        if (!ret)
-               mark_inode_dirty(inode);
+               mark_inode_dirty_sync(inode);
        return ret;
 }
 
@@ -325,7 +321,7 @@ static inline int dquot_claim_block(struct inode *inode, qsize_t nr)
 
        ret = dquot_claim_space_nodirty(inode, nr << inode->i_blkbits);
        if (!ret)
-               mark_inode_dirty(inode);
+               mark_inode_dirty_sync(inode);
        return ret;
 }
 
@@ -337,7 +333,7 @@ static inline void dquot_free_space_nodirty(struct inode *inode, qsize_t nr)
 static inline void dquot_free_space(struct inode *inode, qsize_t nr)
 {
        dquot_free_space_nodirty(inode, nr);
-       mark_inode_dirty(inode);
+       mark_inode_dirty_sync(inode);
 }
 
 static inline void dquot_free_block_nodirty(struct inode *inode, qsize_t nr)