|
@@ -1186,6 +1186,7 @@ int reiserfs_delete_item(struct reiserfs_transaction_handle *th,
|
|
|
struct item_head *q_ih;
|
|
|
int quota_cut_bytes;
|
|
|
int ret_value, del_size, removed;
|
|
|
+ int depth;
|
|
|
|
|
|
#ifdef CONFIG_REISERFS_CHECK
|
|
|
char mode;
|
|
@@ -1295,7 +1296,9 @@ int reiserfs_delete_item(struct reiserfs_transaction_handle *th,
|
|
|
"reiserquota delete_item(): freeing %u, id=%u type=%c",
|
|
|
quota_cut_bytes, inode->i_uid, head2type(&s_ih));
|
|
|
#endif
|
|
|
+ depth = reiserfs_write_unlock_nested(inode->i_sb);
|
|
|
dquot_free_space_nodirty(inode, quota_cut_bytes);
|
|
|
+ reiserfs_write_lock_nested(inode->i_sb, depth);
|
|
|
|
|
|
/* Return deleted body length */
|
|
|
return ret_value;
|
|
@@ -1321,6 +1324,7 @@ int reiserfs_delete_item(struct reiserfs_transaction_handle *th,
|
|
|
void reiserfs_delete_solid_item(struct reiserfs_transaction_handle *th,
|
|
|
struct inode *inode, struct reiserfs_key *key)
|
|
|
{
|
|
|
+ struct super_block *sb = th->t_super;
|
|
|
struct tree_balance tb;
|
|
|
INITIALIZE_PATH(path);
|
|
|
int item_len = 0;
|
|
@@ -1373,14 +1377,17 @@ void reiserfs_delete_solid_item(struct reiserfs_transaction_handle *th,
|
|
|
if (retval == CARRY_ON) {
|
|
|
do_balance(&tb, NULL, NULL, M_DELETE);
|
|
|
if (inode) { /* Should we count quota for item? (we don't count quotas for save-links) */
|
|
|
+ int depth;
|
|
|
#ifdef REISERQUOTA_DEBUG
|
|
|
reiserfs_debug(th->t_super, REISERFS_DEBUG_CODE,
|
|
|
"reiserquota delete_solid_item(): freeing %u id=%u type=%c",
|
|
|
quota_cut_bytes, inode->i_uid,
|
|
|
key2type(key));
|
|
|
#endif
|
|
|
+ depth = reiserfs_write_unlock_nested(sb);
|
|
|
dquot_free_space_nodirty(inode,
|
|
|
quota_cut_bytes);
|
|
|
+ reiserfs_write_lock_nested(sb, depth);
|
|
|
}
|
|
|
break;
|
|
|
}
|
|
@@ -1557,6 +1564,7 @@ int reiserfs_cut_from_item(struct reiserfs_transaction_handle *th,
|
|
|
int retval2 = -1;
|
|
|
int quota_cut_bytes;
|
|
|
loff_t tail_pos = 0;
|
|
|
+ int depth;
|
|
|
|
|
|
BUG_ON(!th->t_trans_id);
|
|
|
|
|
@@ -1729,7 +1737,9 @@ int reiserfs_cut_from_item(struct reiserfs_transaction_handle *th,
|
|
|
"reiserquota cut_from_item(): freeing %u id=%u type=%c",
|
|
|
quota_cut_bytes, inode->i_uid, '?');
|
|
|
#endif
|
|
|
+ depth = reiserfs_write_unlock_nested(sb);
|
|
|
dquot_free_space_nodirty(inode, quota_cut_bytes);
|
|
|
+ reiserfs_write_lock_nested(sb, depth);
|
|
|
return ret_value;
|
|
|
}
|
|
|
|
|
@@ -1949,9 +1959,11 @@ int reiserfs_paste_into_item(struct reiserfs_transaction_handle *th, struct tree
|
|
|
const char *body, /* Pointer to the bytes to paste. */
|
|
|
int pasted_size)
|
|
|
{ /* Size of pasted bytes. */
|
|
|
+ struct super_block *sb = inode->i_sb;
|
|
|
struct tree_balance s_paste_balance;
|
|
|
int retval;
|
|
|
int fs_gen;
|
|
|
+ int depth;
|
|
|
|
|
|
BUG_ON(!th->t_trans_id);
|
|
|
|
|
@@ -1964,9 +1976,9 @@ int reiserfs_paste_into_item(struct reiserfs_transaction_handle *th, struct tree
|
|
|
key2type(&(key->on_disk_key)));
|
|
|
#endif
|
|
|
|
|
|
- reiserfs_write_unlock(inode->i_sb);
|
|
|
+ depth = reiserfs_write_unlock_nested(sb);
|
|
|
retval = dquot_alloc_space_nodirty(inode, pasted_size);
|
|
|
- reiserfs_write_lock(inode->i_sb);
|
|
|
+ reiserfs_write_lock_nested(sb, depth);
|
|
|
if (retval) {
|
|
|
pathrelse(search_path);
|
|
|
return retval;
|
|
@@ -2023,7 +2035,9 @@ int reiserfs_paste_into_item(struct reiserfs_transaction_handle *th, struct tree
|
|
|
pasted_size, inode->i_uid,
|
|
|
key2type(&(key->on_disk_key)));
|
|
|
#endif
|
|
|
+ depth = reiserfs_write_unlock_nested(sb);
|
|
|
dquot_free_space_nodirty(inode, pasted_size);
|
|
|
+ reiserfs_write_lock_nested(sb, depth);
|
|
|
return retval;
|
|
|
}
|
|
|
|
|
@@ -2046,6 +2060,7 @@ int reiserfs_insert_item(struct reiserfs_transaction_handle *th,
|
|
|
BUG_ON(!th->t_trans_id);
|
|
|
|
|
|
if (inode) { /* Do we count quotas for item? */
|
|
|
+ int depth;
|
|
|
fs_gen = get_generation(inode->i_sb);
|
|
|
quota_bytes = ih_item_len(ih);
|
|
|
|
|
@@ -2059,11 +2074,11 @@ int reiserfs_insert_item(struct reiserfs_transaction_handle *th,
|
|
|
"reiserquota insert_item(): allocating %u id=%u type=%c",
|
|
|
quota_bytes, inode->i_uid, head2type(ih));
|
|
|
#endif
|
|
|
- reiserfs_write_unlock(inode->i_sb);
|
|
|
/* We can't dirty inode here. It would be immediately written but
|
|
|
* appropriate stat item isn't inserted yet... */
|
|
|
+ depth = reiserfs_write_unlock_nested(inode->i_sb);
|
|
|
retval = dquot_alloc_space_nodirty(inode, quota_bytes);
|
|
|
- reiserfs_write_lock(inode->i_sb);
|
|
|
+ reiserfs_write_lock_nested(inode->i_sb, depth);
|
|
|
if (retval) {
|
|
|
pathrelse(path);
|
|
|
return retval;
|
|
@@ -2114,7 +2129,10 @@ int reiserfs_insert_item(struct reiserfs_transaction_handle *th,
|
|
|
"reiserquota insert_item(): freeing %u id=%u type=%c",
|
|
|
quota_bytes, inode->i_uid, head2type(ih));
|
|
|
#endif
|
|
|
- if (inode)
|
|
|
+ if (inode) {
|
|
|
+ int depth = reiserfs_write_unlock_nested(inode->i_sb);
|
|
|
dquot_free_space_nodirty(inode, quota_bytes);
|
|
|
+ reiserfs_write_lock_nested(inode->i_sb, depth);
|
|
|
+ }
|
|
|
return retval;
|
|
|
}
|