diff -NurpP --minimal linux-2.6.31.3-vs2.3.0.36.17/fs/ext2/ialloc.c linux-2.6.31.3-vs2.3.0.36.18/fs/ext2/ialloc.c --- linux-2.6.31.3-vs2.3.0.36.17/fs/ext2/ialloc.c 2009-06-11 17:13:03.000000000 +0200 +++ linux-2.6.31.3-vs2.3.0.36.18/fs/ext2/ialloc.c 2009-10-12 05:05:34.000000000 +0200 @@ -17,6 +17,7 @@ #include #include #include +#include #include "ext2.h" #include "xattr.h" #include "acl.h" @@ -560,6 +561,7 @@ got: } else inode->i_gid = current_fsgid(); inode->i_mode = mode; + inode->i_tag = dx_current_fstag(sb); inode->i_ino = ino; inode->i_blocks = 0; diff -NurpP --minimal linux-2.6.31.3-vs2.3.0.36.17/fs/ext3/ialloc.c linux-2.6.31.3-vs2.3.0.36.18/fs/ext3/ialloc.c --- linux-2.6.31.3-vs2.3.0.36.17/fs/ext3/ialloc.c 2009-09-10 15:26:21.000000000 +0200 +++ linux-2.6.31.3-vs2.3.0.36.18/fs/ext3/ialloc.c 2009-10-12 05:06:13.000000000 +0200 @@ -23,6 +23,7 @@ #include #include #include +#include #include @@ -548,6 +549,7 @@ got: } else inode->i_gid = current_fsgid(); inode->i_mode = mode; + inode->i_tag = dx_current_fstag(sb); inode->i_ino = ino; /* This is the optimal IO size (for stat), not the fs block size */ diff -NurpP --minimal linux-2.6.31.3-vs2.3.0.36.17/fs/ext4/ialloc.c linux-2.6.31.3-vs2.3.0.36.18/fs/ext4/ialloc.c --- linux-2.6.31.3-vs2.3.0.36.17/fs/ext4/ialloc.c 2009-09-10 15:26:21.000000000 +0200 +++ linux-2.6.31.3-vs2.3.0.36.18/fs/ext4/ialloc.c 2009-10-12 05:06:42.000000000 +0200 @@ -22,6 +22,7 @@ #include #include #include +#include #include #include "ext4.h" @@ -995,6 +996,7 @@ got: } else inode->i_gid = current_fsgid(); inode->i_mode = mode; + inode->i_tag = dx_current_fstag(sb); inode->i_ino = ino + group * EXT4_INODES_PER_GROUP(sb); /* This is the optimal IO size (for stat), not the fs block size */ diff -NurpP --minimal linux-2.6.31.3-vs2.3.0.36.17/fs/jfs/jfs_inode.c linux-2.6.31.3-vs2.3.0.36.18/fs/jfs/jfs_inode.c --- linux-2.6.31.3-vs2.3.0.36.17/fs/jfs/jfs_inode.c 2009-10-06 19:45:13.000000000 +0200 +++ linux-2.6.31.3-vs2.3.0.36.18/fs/jfs/jfs_inode.c 2009-10-12 05:07:16.000000000 +0200 @@ -18,6 +18,7 @@ #include #include +#include #include "jfs_incore.h" #include "jfs_inode.h" #include "jfs_filsys.h" @@ -127,6 +128,7 @@ struct inode *ialloc(struct inode *paren mode |= S_ISGID; } else inode->i_gid = current_fsgid(); + inode->i_tag = dx_current_fstag(sb); /* * New inodes need to save sane values on disk when diff -NurpP --minimal linux-2.6.31.3-vs2.3.0.36.17/include/linux/quotaops.h linux-2.6.31.3-vs2.3.0.36.18/include/linux/quotaops.h --- linux-2.6.31.3-vs2.3.0.36.17/include/linux/quotaops.h 2009-09-10 15:26:26.000000000 +0200 +++ linux-2.6.31.3-vs2.3.0.36.18/include/linux/quotaops.h 2009-10-12 02:07:55.000000000 +0200 @@ -8,6 +8,7 @@ #define _LINUX_QUOTAOPS_ #include +#include static inline struct quota_info *sb_dqopt(struct super_block *sb) { @@ -154,10 +155,14 @@ static inline void vfs_dq_init(struct in * a transaction (deadlocks possible otherwise) */ static inline int vfs_dq_prealloc_space_nodirty(struct inode *inode, qsize_t nr) { + if (dl_alloc_space(inode, nr)) + return 1; if (sb_any_quota_active(inode->i_sb)) { /* Used space is updated in alloc_space() */ - if (inode->i_sb->dq_op->alloc_space(inode, nr, 1) == NO_QUOTA) + if (inode->i_sb->dq_op->alloc_space(inode, nr, 1) == NO_QUOTA) { + dl_free_space(inode, nr); return 1; + } } else inode_add_bytes(inode, nr); @@ -174,10 +179,14 @@ static inline int vfs_dq_prealloc_space( static inline int vfs_dq_alloc_space_nodirty(struct inode *inode, qsize_t nr) { + if (dl_alloc_space(inode, nr)) + return 1; if (sb_any_quota_active(inode->i_sb)) { /* Used space is updated in alloc_space() */ - if (inode->i_sb->dq_op->alloc_space(inode, nr, 0) == NO_QUOTA) + if (inode->i_sb->dq_op->alloc_space(inode, nr, 0) == NO_QUOTA) { + dl_free_space(inode, nr); return 1; + } } else inode_add_bytes(inode, nr); @@ -194,20 +203,28 @@ static inline int vfs_dq_alloc_space(str static inline int vfs_dq_reserve_space(struct inode *inode, qsize_t nr) { + if (dl_reserve_space(inode, nr)) + return 1; if (sb_any_quota_active(inode->i_sb)) { /* Used space is updated in alloc_space() */ - if (inode->i_sb->dq_op->reserve_space(inode, nr, 0) == NO_QUOTA) + if (inode->i_sb->dq_op->reserve_space(inode, nr, 0) == NO_QUOTA) { + dl_release_space(inode, nr); return 1; + } } return 0; } static inline int vfs_dq_alloc_inode(struct inode *inode) { + if (dl_alloc_inode(inode)) + return 1; if (sb_any_quota_active(inode->i_sb)) { vfs_dq_init(inode); - if (inode->i_sb->dq_op->alloc_inode(inode, 1) == NO_QUOTA) + if (inode->i_sb->dq_op->alloc_inode(inode, 1) == NO_QUOTA) { + dl_free_inode(inode); return 1; + } } return 0; } @@ -217,9 +234,13 @@ static inline int vfs_dq_alloc_inode(str */ static inline int vfs_dq_claim_space(struct inode *inode, qsize_t nr) { + if (dl_claim_space(inode, nr)) + return 1; if (sb_any_quota_active(inode->i_sb)) { - if (inode->i_sb->dq_op->claim_space(inode, nr) == NO_QUOTA) + if (inode->i_sb->dq_op->claim_space(inode, nr) == NO_QUOTA) { + dl_release_space(inode, nr); return 1; + } } else inode_add_bytes(inode, nr); @@ -235,6 +256,7 @@ void vfs_dq_release_reservation_space(st { if (sb_any_quota_active(inode->i_sb)) inode->i_sb->dq_op->release_rsv(inode, nr); + dl_release_space(inode, nr); } static inline void vfs_dq_free_space_nodirty(struct inode *inode, qsize_t nr) @@ -243,6 +265,7 @@ static inline void vfs_dq_free_space_nod inode->i_sb->dq_op->free_space(inode, nr); else inode_sub_bytes(inode, nr); + dl_free_space(inode, nr); } static inline void vfs_dq_free_space(struct inode *inode, qsize_t nr) @@ -255,6 +278,7 @@ static inline void vfs_dq_free_inode(str { if (sb_any_quota_active(inode->i_sb)) inode->i_sb->dq_op->free_inode(inode, 1); + dl_free_inode(inode); } /* Cannot be called inside a transaction */ @@ -358,6 +382,8 @@ static inline int vfs_dq_transfer(struct static inline int vfs_dq_prealloc_space_nodirty(struct inode *inode, qsize_t nr) { + if (dl_alloc_space(inode, nr)) + return 1; inode_add_bytes(inode, nr); return 0; } @@ -371,6 +397,8 @@ static inline int vfs_dq_prealloc_space( static inline int vfs_dq_alloc_space_nodirty(struct inode *inode, qsize_t nr) { + if (dl_alloc_space(inode, nr)) + return 1; inode_add_bytes(inode, nr); return 0; } @@ -384,22 +412,28 @@ static inline int vfs_dq_alloc_space(str static inline int vfs_dq_reserve_space(struct inode *inode, qsize_t nr) { + if (dl_reserve_space(inode, nr)) + return 1; return 0; } static inline int vfs_dq_claim_space(struct inode *inode, qsize_t nr) { + if (dl_claim_space(inode, nr)) + return 1; return vfs_dq_alloc_space(inode, nr); } static inline int vfs_dq_release_reservation_space(struct inode *inode, qsize_t nr) { + dl_release_space(inode, nr); return 0; } static inline void vfs_dq_free_space_nodirty(struct inode *inode, qsize_t nr) { + dl_free_space(inode, nr); inode_sub_bytes(inode, nr); } diff -NurpP --minimal linux-2.6.31.3-vs2.3.0.36.17/include/linux/vs_dlimit.h linux-2.6.31.3-vs2.3.0.36.18/include/linux/vs_dlimit.h --- linux-2.6.31.3-vs2.3.0.36.17/include/linux/vs_dlimit.h 2009-09-10 16:11:43.000000000 +0200 +++ linux-2.6.31.3-vs2.3.0.36.18/include/linux/vs_dlimit.h 2009-10-12 02:50:50.000000000 +0200 @@ -176,33 +176,38 @@ static inline void __dl_adjust_block(str put_dl_info(dli); } -#define DLIMIT_ALLOC_SPACE(in, bytes) \ +#define dl_prealloc_space(in, bytes) \ __dl_alloc_space((in)->i_sb, (in)->i_tag, (dlsize_t)(bytes), \ __FILE__, __LINE__ ) -#define DLIMIT_FREE_SPACE(in, bytes) \ - __dl_free_space((in)->i_sb, (in)->i_tag, (dlsize_t)(bytes), \ +#define dl_alloc_space(in, bytes) \ + __dl_alloc_space((in)->i_sb, (in)->i_tag, (dlsize_t)(bytes), \ __FILE__, __LINE__ ) -#define DLIMIT_ALLOC_BLOCK(in, nr) \ - __dl_alloc_space((in)->i_sb, (in)->i_tag, \ - ((dlsize_t)(nr)) << (in)->i_sb->s_blocksize_bits, \ +#define dl_reserve_space(in, bytes) \ + __dl_alloc_space((in)->i_sb, (in)->i_tag, (dlsize_t)(bytes), \ __FILE__, __LINE__ ) -#define DLIMIT_FREE_BLOCK(in, nr) \ - __dl_free_space((in)->i_sb, (in)->i_tag, \ - ((dlsize_t)(nr)) << (in)->i_sb->s_blocksize_bits, \ +#define dl_claim_space(in, bytes) (0) + +#define dl_release_space(in, bytes) \ + __dl_free_space((in)->i_sb, (in)->i_tag, (dlsize_t)(bytes), \ __FILE__, __LINE__ ) +#define dl_free_space(in, bytes) \ + __dl_free_space((in)->i_sb, (in)->i_tag, (dlsize_t)(bytes), \ + __FILE__, __LINE__ ) -#define DLIMIT_ALLOC_INODE(in) \ + + +#define dl_alloc_inode(in) \ __dl_alloc_inode((in)->i_sb, (in)->i_tag, __FILE__, __LINE__ ) -#define DLIMIT_FREE_INODE(in) \ +#define dl_free_inode(in) \ __dl_free_inode((in)->i_sb, (in)->i_tag, __FILE__, __LINE__ ) -#define DLIMIT_ADJUST_BLOCK(sb, tag, fb, rb) \ +#define dl_adjust_block(sb, tag, fb, rb) \ __dl_adjust_block(sb, tag, fb, rb, __FILE__, __LINE__ )