|
@@ -1910,6 +1910,7 @@ int __dquot_transfer(struct inode *inode, struct dquot **transfer_to)
|
|
{
|
|
{
|
|
qsize_t space, cur_space;
|
|
qsize_t space, cur_space;
|
|
qsize_t rsv_space = 0;
|
|
qsize_t rsv_space = 0;
|
|
|
|
+ qsize_t inode_usage = 1;
|
|
struct dquot *transfer_from[MAXQUOTAS] = {};
|
|
struct dquot *transfer_from[MAXQUOTAS] = {};
|
|
int cnt, ret = 0;
|
|
int cnt, ret = 0;
|
|
char is_valid[MAXQUOTAS] = {};
|
|
char is_valid[MAXQUOTAS] = {};
|
|
@@ -1919,6 +1920,13 @@ int __dquot_transfer(struct inode *inode, struct dquot **transfer_to)
|
|
|
|
|
|
if (IS_NOQUOTA(inode))
|
|
if (IS_NOQUOTA(inode))
|
|
return 0;
|
|
return 0;
|
|
|
|
+
|
|
|
|
+ if (inode->i_sb->dq_op->get_inode_usage) {
|
|
|
|
+ ret = inode->i_sb->dq_op->get_inode_usage(inode, &inode_usage);
|
|
|
|
+ if (ret)
|
|
|
|
+ return ret;
|
|
|
|
+ }
|
|
|
|
+
|
|
/* Initialize the arrays */
|
|
/* Initialize the arrays */
|
|
for (cnt = 0; cnt < MAXQUOTAS; cnt++) {
|
|
for (cnt = 0; cnt < MAXQUOTAS; cnt++) {
|
|
warn_to[cnt].w_type = QUOTA_NL_NOWARN;
|
|
warn_to[cnt].w_type = QUOTA_NL_NOWARN;
|
|
@@ -1946,7 +1954,7 @@ int __dquot_transfer(struct inode *inode, struct dquot **transfer_to)
|
|
continue;
|
|
continue;
|
|
is_valid[cnt] = 1;
|
|
is_valid[cnt] = 1;
|
|
transfer_from[cnt] = i_dquot(inode)[cnt];
|
|
transfer_from[cnt] = i_dquot(inode)[cnt];
|
|
- ret = check_idq(transfer_to[cnt], 1, &warn_to[cnt]);
|
|
|
|
|
|
+ ret = check_idq(transfer_to[cnt], inode_usage, &warn_to[cnt]);
|
|
if (ret)
|
|
if (ret)
|
|
goto over_quota;
|
|
goto over_quota;
|
|
ret = check_bdq(transfer_to[cnt], space, 0, &warn_to[cnt]);
|
|
ret = check_bdq(transfer_to[cnt], space, 0, &warn_to[cnt]);
|
|
@@ -1963,7 +1971,7 @@ int __dquot_transfer(struct inode *inode, struct dquot **transfer_to)
|
|
/* Due to IO error we might not have transfer_from[] structure */
|
|
/* Due to IO error we might not have transfer_from[] structure */
|
|
if (transfer_from[cnt]) {
|
|
if (transfer_from[cnt]) {
|
|
int wtype;
|
|
int wtype;
|
|
- wtype = info_idq_free(transfer_from[cnt], 1);
|
|
|
|
|
|
+ wtype = info_idq_free(transfer_from[cnt], inode_usage);
|
|
if (wtype != QUOTA_NL_NOWARN)
|
|
if (wtype != QUOTA_NL_NOWARN)
|
|
prepare_warning(&warn_from_inodes[cnt],
|
|
prepare_warning(&warn_from_inodes[cnt],
|
|
transfer_from[cnt], wtype);
|
|
transfer_from[cnt], wtype);
|
|
@@ -1971,13 +1979,13 @@ int __dquot_transfer(struct inode *inode, struct dquot **transfer_to)
|
|
if (wtype != QUOTA_NL_NOWARN)
|
|
if (wtype != QUOTA_NL_NOWARN)
|
|
prepare_warning(&warn_from_space[cnt],
|
|
prepare_warning(&warn_from_space[cnt],
|
|
transfer_from[cnt], wtype);
|
|
transfer_from[cnt], wtype);
|
|
- dquot_decr_inodes(transfer_from[cnt], 1);
|
|
|
|
|
|
+ dquot_decr_inodes(transfer_from[cnt], inode_usage);
|
|
dquot_decr_space(transfer_from[cnt], cur_space);
|
|
dquot_decr_space(transfer_from[cnt], cur_space);
|
|
dquot_free_reserved_space(transfer_from[cnt],
|
|
dquot_free_reserved_space(transfer_from[cnt],
|
|
rsv_space);
|
|
rsv_space);
|
|
}
|
|
}
|
|
|
|
|
|
- dquot_incr_inodes(transfer_to[cnt], 1);
|
|
|
|
|
|
+ dquot_incr_inodes(transfer_to[cnt], inode_usage);
|
|
dquot_incr_space(transfer_to[cnt], cur_space);
|
|
dquot_incr_space(transfer_to[cnt], cur_space);
|
|
dquot_resv_space(transfer_to[cnt], rsv_space);
|
|
dquot_resv_space(transfer_to[cnt], rsv_space);
|
|
|
|
|