* [PATCH 0/3] reiser4: space grabbing fixes.
@ 2014-08-18 14:14 Ivan Shapovalov
2014-08-18 14:14 ` [PATCH 1/3] reiser4: block_alloc: improve error handling in reiser4_grab_reserved() Ivan Shapovalov
` (2 more replies)
0 siblings, 3 replies; 9+ messages in thread
From: Ivan Shapovalov @ 2014-08-18 14:14 UTC (permalink / raw)
To: reiserfs-devel; +Cc: edward.shishkin, Ivan Shapovalov
These are mostly equivalent transformations (aside from the first patch)
I've done when I was experimenting with rwsems at zero-th iteration of
batch discard support.
Ivan Shapovalov (3):
reiser4: block_alloc: improve error handling in reiser4_grab_reserved().
reiser4: block_alloc: sanitize grab_enabled modifications.
reiser4: do not mess with grab_enabled; instead, use BA_FORCE.
fs/reiser4/block_alloc.c | 57 +++++++++++++++++---------------
fs/reiser4/plugin/file/file.c | 12 +++----
fs/reiser4/plugin/file/file_conversion.c | 3 +-
fs/reiser4/plugin/file/tail_conversion.c | 11 +++---
fs/reiser4/plugin/item/extent_file_ops.c | 3 +-
fs/reiser4/plugin/item/tail.c | 3 +-
fs/reiser4/safe_link.c | 4 +--
7 files changed, 44 insertions(+), 49 deletions(-)
--
2.0.4
^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH 1/3] reiser4: block_alloc: improve error handling in reiser4_grab_reserved().
2014-08-18 14:14 [PATCH 0/3] reiser4: space grabbing fixes Ivan Shapovalov
@ 2014-08-18 14:14 ` Ivan Shapovalov
2014-10-18 17:43 ` Edward Shishkin
2014-08-18 14:14 ` [PATCH 2/3] reiser4: block_alloc: sanitize grab_enabled modifications Ivan Shapovalov
2014-08-18 14:14 ` [PATCH 3/3] reiser4: do not mess with grab_enabled; instead, use BA_FORCE Ivan Shapovalov
2 siblings, 1 reply; 9+ messages in thread
From: Ivan Shapovalov @ 2014-08-18 14:14 UTC (permalink / raw)
To: reiserfs-devel; +Cc: edward.shishkin, Ivan Shapovalov
In case of error in reiser4_grab_space(), return the original error code,
not -ENOSPC unconditionally.
Signed-off-by: Ivan Shapovalov <intelfx100@gmail.com>
---
fs/reiser4/block_alloc.c | 35 +++++++++++++++++++----------------
1 file changed, 19 insertions(+), 16 deletions(-)
diff --git a/fs/reiser4/block_alloc.c b/fs/reiser4/block_alloc.c
index 324b11c..7f9f910 100644
--- a/fs/reiser4/block_alloc.c
+++ b/fs/reiser4/block_alloc.c
@@ -360,37 +360,40 @@ int reiser4_grab_reserved(struct super_block *super,
__u64 count, reiser4_ba_flags_t flags)
{
reiser4_super_info_data *sbinfo = get_super_private(super);
+ int ret;
assert("nikita-3175", flags & BA_CAN_COMMIT);
/* Check the delete mutex already taken by us, we assume that
* reading of machine word is atomic. */
if (sbinfo->delete_mutex_owner == current) {
- if (reiser4_grab_space
- (count, (flags | BA_RESERVED) & ~BA_CAN_COMMIT)) {
+ ret = reiser4_grab_space (count, (flags | BA_RESERVED) & ~BA_CAN_COMMIT);
+
+ if (ret != 0) {
warning("zam-1003",
"nested call of grab_reserved fails count=(%llu)",
(unsigned long long)count);
reiser4_release_reserved(super);
- return RETERR(-ENOSPC);
}
- return 0;
- }
+ } else {
+ ret = reiser4_grab_space(count, flags);
- if (reiser4_grab_space(count, flags)) {
- mutex_lock(&sbinfo->delete_mutex);
- assert("nikita-2929", sbinfo->delete_mutex_owner == NULL);
- sbinfo->delete_mutex_owner = current;
+ if (ret != 0) {
+ mutex_lock(&sbinfo->delete_mutex);
+ assert("nikita-2929", sbinfo->delete_mutex_owner == NULL);
+ sbinfo->delete_mutex_owner = current;
+ ret = reiser4_grab_space(count, flags | BA_RESERVED);
- if (reiser4_grab_space(count, flags | BA_RESERVED)) {
- warning("zam-833",
- "reserved space is not enough (%llu)",
- (unsigned long long)count);
- reiser4_release_reserved(super);
- return RETERR(-ENOSPC);
+ if (ret != 0) {
+ warning("zam-833",
+ "reserved space is not enough (%llu)",
+ (unsigned long long)count);
+ reiser4_release_reserved(super);
+ }
}
}
- return 0;
+
+ return ret;
}
void reiser4_release_reserved(struct super_block *super)
--
2.0.4
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH 2/3] reiser4: block_alloc: sanitize grab_enabled modifications.
2014-08-18 14:14 [PATCH 0/3] reiser4: space grabbing fixes Ivan Shapovalov
2014-08-18 14:14 ` [PATCH 1/3] reiser4: block_alloc: improve error handling in reiser4_grab_reserved() Ivan Shapovalov
@ 2014-08-18 14:14 ` Ivan Shapovalov
2014-10-18 17:47 ` Edward Shishkin
2014-08-18 14:14 ` [PATCH 3/3] reiser4: do not mess with grab_enabled; instead, use BA_FORCE Ivan Shapovalov
2 siblings, 1 reply; 9+ messages in thread
From: Ivan Shapovalov @ 2014-08-18 14:14 UTC (permalink / raw)
To: reiserfs-devel; +Cc: edward.shishkin, Ivan Shapovalov
- move all grab_enabled checks and modifications into reiser4_grab_space();
- only disable grab if not BA_FORCE;
- do not re-enable grab before doing second attempt in BA_CAN_COMMIT sequence
(feels hackish and is unneeded after the first change).
Signed-off-by: Ivan Shapovalov <intelfx100@gmail.com>
---
fs/reiser4/block_alloc.c | 22 ++++++++++++----------
1 file changed, 12 insertions(+), 10 deletions(-)
diff --git a/fs/reiser4/block_alloc.c b/fs/reiser4/block_alloc.c
index 7f9f910..a30f7b9 100644
--- a/fs/reiser4/block_alloc.c
+++ b/fs/reiser4/block_alloc.c
@@ -270,12 +270,6 @@ reiser4_grab(reiser4_context * ctx, __u64 count, reiser4_ba_flags_t flags)
assert("vs-1276", ctx == get_current_context());
- /* Do not grab anything on ro-mounted fs. */
- if (rofs_super(ctx->super)) {
- ctx->grab_enabled = 0;
- return 0;
- }
-
sbinfo = get_super_private(ctx->super);
spin_lock_reiser4_super(sbinfo);
@@ -300,9 +294,6 @@ reiser4_grab(reiser4_context * ctx, __u64 count, reiser4_ba_flags_t flags)
assert("nikita-2986", reiser4_check_block_counters(ctx->super));
- /* disable grab space in current context */
- ctx->grab_enabled = 0;
-
unlock_and_ret:
spin_unlock_reiser4_super(sbinfo);
@@ -321,6 +312,12 @@ int reiser4_grab_space(__u64 count, reiser4_ba_flags_t flags)
if (!(flags & BA_FORCE) && !is_grab_enabled(ctx))
return 0;
+ /* Do not grab anything on ro-mounted fs. */
+ if (rofs_super(ctx->super)) {
+ ctx->grab_enabled = 0;
+ return 0;
+ }
+
ret = reiser4_grab(ctx, count, flags);
if (ret == -ENOSPC) {
@@ -328,10 +325,15 @@ int reiser4_grab_space(__u64 count, reiser4_ba_flags_t flags)
present */
if (flags & BA_CAN_COMMIT) {
txnmgr_force_commit_all(ctx->super, 0);
- ctx->grab_enabled = 1;
ret = reiser4_grab(ctx, count, flags);
}
}
+
+ if (!(flags & BA_FORCE) && (ret == 0)) {
+ /* disable grab space in current context */
+ ctx->grab_enabled = 0;
+ }
+
/*
* allocation from reserved pool cannot fail. This is severe error.
*/
--
2.0.4
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH 3/3] reiser4: do not mess with grab_enabled; instead, use BA_FORCE.
2014-08-18 14:14 [PATCH 0/3] reiser4: space grabbing fixes Ivan Shapovalov
2014-08-18 14:14 ` [PATCH 1/3] reiser4: block_alloc: improve error handling in reiser4_grab_reserved() Ivan Shapovalov
2014-08-18 14:14 ` [PATCH 2/3] reiser4: block_alloc: sanitize grab_enabled modifications Ivan Shapovalov
@ 2014-08-18 14:14 ` Ivan Shapovalov
2014-10-18 17:48 ` Edward Shishkin
2 siblings, 1 reply; 9+ messages in thread
From: Ivan Shapovalov @ 2014-08-18 14:14 UTC (permalink / raw)
To: reiserfs-devel; +Cc: edward.shishkin, Ivan Shapovalov
Signed-off-by: Ivan Shapovalov <intelfx100@gmail.com>
---
fs/reiser4/plugin/file/file.c | 12 ++++--------
fs/reiser4/plugin/file/file_conversion.c | 3 +--
fs/reiser4/plugin/file/tail_conversion.c | 11 +++++------
fs/reiser4/plugin/item/extent_file_ops.c | 3 +--
fs/reiser4/plugin/item/tail.c | 3 +--
fs/reiser4/safe_link.c | 4 +---
6 files changed, 13 insertions(+), 23 deletions(-)
diff --git a/fs/reiser4/plugin/file/file.c b/fs/reiser4/plugin/file/file.c
index 94029cd..b0bfa86 100644
--- a/fs/reiser4/plugin/file/file.c
+++ b/fs/reiser4/plugin/file/file.c
@@ -335,11 +335,10 @@ static int find_file_state(struct inode *inode, struct unix_file_info *uf_info)
*/
static int reserve_partial_page(reiser4_tree * tree)
{
- grab_space_enable();
return reiser4_grab_reserved(reiser4_get_current_sb(),
1 +
2 * estimate_one_insert_into_item(tree),
- BA_CAN_COMMIT);
+ BA_CAN_COMMIT | BA_FORCE);
}
/* estimate and reserve space needed to cut one item and update one stat data */
@@ -350,11 +349,10 @@ static int reserve_cut_iteration(reiser4_tree * tree)
assert("nikita-3172", lock_stack_isclean(get_current_lock_stack()));
- grab_space_enable();
/* We need to double our estimate now that we can delete more than one
node. */
return reiser4_grab_reserved(reiser4_get_current_sb(), estimate * 2,
- BA_CAN_COMMIT);
+ BA_CAN_COMMIT | BA_FORCE);
}
int reiser4_update_file_size(struct inode *inode, loff_t new_size,
@@ -875,10 +873,9 @@ static int capture_page_and_create_extent(struct page *page)
/* page capture may require extent creation (if it does not exist yet)
and stat data's update (number of blocks changes on extent
creation) */
- grab_space_enable();
result = reiser4_grab_space(2 * estimate_one_insert_into_item
(reiser4_tree_by_inode(inode)),
- BA_CAN_COMMIT);
+ BA_CAN_COMMIT | BA_FORCE);
if (likely(!result))
result = find_or_create_extent(page);
@@ -2421,9 +2418,8 @@ static int unpack(struct file *filp, struct inode *inode, int forever)
set_file_notail(inode);
- grab_space_enable();
tograb = inode_file_plugin(inode)->estimate.update(inode);
- result = reiser4_grab_space(tograb, BA_CAN_COMMIT);
+ result = reiser4_grab_space(tograb, BA_CAN_COMMIT | BA_FORCE);
result = reiser4_update_sd(inode);
}
diff --git a/fs/reiser4/plugin/file/file_conversion.c b/fs/reiser4/plugin/file/file_conversion.c
index 3ce4898..e01720f 100644
--- a/fs/reiser4/plugin/file/file_conversion.c
+++ b/fs/reiser4/plugin/file/file_conversion.c
@@ -388,14 +388,13 @@ static int reserve_cryptcompress2unixfile(struct inode *inode)
* 5. possible update of stat-data
*
*/
- grab_space_enable();
return reiser4_grab_space
(2 * tree->height +
unformatted_nodes +
unformatted_nodes * estimate_one_insert_into_item(tree) +
1 + estimate_one_insert_item(tree) +
inode_file_plugin(inode)->estimate.update(inode),
- BA_CAN_COMMIT);
+ BA_CAN_COMMIT | BA_FORCE);
}
/**
diff --git a/fs/reiser4/plugin/file/tail_conversion.c b/fs/reiser4/plugin/file/tail_conversion.c
index 1763cb1..22f30fd 100644
--- a/fs/reiser4/plugin/file/tail_conversion.c
+++ b/fs/reiser4/plugin/file/tail_conversion.c
@@ -221,13 +221,13 @@ static int reserve_tail2extent_iteration(struct inode *inode)
* 5. possible update of stat-data
*
*/
- grab_space_enable();
return reiser4_grab_space
(2 * tree->height +
TAIL2EXTENT_PAGE_NUM +
TAIL2EXTENT_PAGE_NUM * estimate_one_insert_into_item(tree) +
1 + estimate_one_insert_item(tree) +
- inode_file_plugin(inode)->estimate.update(inode), BA_CAN_COMMIT);
+ inode_file_plugin(inode)->estimate.update(inode),
+ BA_CAN_COMMIT | BA_FORCE);
}
/* clear stat data's flag indicating that conversion is being converted */
@@ -235,10 +235,9 @@ static int complete_conversion(struct inode *inode)
{
int result;
- grab_space_enable();
result =
reiser4_grab_space(inode_file_plugin(inode)->estimate.update(inode),
- BA_CAN_COMMIT);
+ BA_CAN_COMMIT | BA_FORCE);
if (result == 0) {
reiser4_inode_clr_flag(inode, REISER4_PART_MIXED);
result = reiser4_update_sd(inode);
@@ -552,12 +551,12 @@ static int reserve_extent2tail_iteration(struct inode *inode)
*
* 4. possible update of stat-data
*/
- grab_space_enable();
return reiser4_grab_space
(estimate_one_item_removal(tree) +
estimate_insert_flow(tree->height) +
1 + estimate_one_insert_item(tree) +
- inode_file_plugin(inode)->estimate.update(inode), BA_CAN_COMMIT);
+ inode_file_plugin(inode)->estimate.update(inode),
+ BA_CAN_COMMIT | BA_FORCE);
}
/* for every page of file: read page, cut part of extent pointing to this page,
diff --git a/fs/reiser4/plugin/item/extent_file_ops.c b/fs/reiser4/plugin/item/extent_file_ops.c
index cb57379..8086b5f 100644
--- a/fs/reiser4/plugin/item/extent_file_ops.c
+++ b/fs/reiser4/plugin/item/extent_file_ops.c
@@ -933,8 +933,7 @@ static int write_extent_reserve_space(struct inode *inode)
count = estimate_one_insert_item(tree) +
WRITE_GRANULARITY * (1 + estimate_one_insert_into_item(tree)) +
estimate_one_insert_item(tree);
- grab_space_enable();
- return reiser4_grab_space(count, 0 /* flags */);
+ return reiser4_grab_space(count, BA_FORCE);
}
/*
diff --git a/fs/reiser4/plugin/item/tail.c b/fs/reiser4/plugin/item/tail.c
index 7f4a101..67cb4ba 100644
--- a/fs/reiser4/plugin/item/tail.c
+++ b/fs/reiser4/plugin/item/tail.c
@@ -603,8 +603,7 @@ static int write_extent_reserve_space(struct inode *inode)
count = estimate_one_insert_item(tree) +
estimate_insert_flow(tree->height) +
estimate_one_insert_item(tree);
- grab_space_enable();
- return reiser4_grab_space(count, 0 /* flags */);
+ return reiser4_grab_space(count, BA_FORCE);
}
#define PAGE_PER_FLOW 4
diff --git a/fs/reiser4/safe_link.c b/fs/reiser4/safe_link.c
index d59f6f0..f4cff69 100644
--- a/fs/reiser4/safe_link.c
+++ b/fs/reiser4/safe_link.c
@@ -130,13 +130,11 @@ int safe_link_grab(reiser4_tree * tree, reiser4_ba_flags_t flags)
{
int result;
- grab_space_enable();
/* The sbinfo->delete_mutex can be taken here.
* safe_link_release() should be called before leaving reiser4
* context. */
result =
- reiser4_grab_reserved(tree->super, safe_link_tograb(tree), flags);
- grab_space_enable();
+ reiser4_grab_reserved(tree->super, safe_link_tograb(tree), flags | BA_FORCE);
return result;
}
--
2.0.4
^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH 1/3] reiser4: block_alloc: improve error handling in reiser4_grab_reserved().
2014-08-18 14:14 ` [PATCH 1/3] reiser4: block_alloc: improve error handling in reiser4_grab_reserved() Ivan Shapovalov
@ 2014-10-18 17:43 ` Edward Shishkin
0 siblings, 0 replies; 9+ messages in thread
From: Edward Shishkin @ 2014-10-18 17:43 UTC (permalink / raw)
To: Ivan Shapovalov; +Cc: reiserfs-devel
On 08/18/2014 04:14 PM, Ivan Shapovalov wrote:
> In case of error in reiser4_grab_space(), return the original error code,
> not -ENOSPC unconditionally.
>
> Signed-off-by: Ivan Shapovalov <intelfx100@gmail.com>
> ---
> fs/reiser4/block_alloc.c | 35 +++++++++++++++++++----------------
> 1 file changed, 19 insertions(+), 16 deletions(-)
>
> diff --git a/fs/reiser4/block_alloc.c b/fs/reiser4/block_alloc.c
> index 324b11c..7f9f910 100644
> --- a/fs/reiser4/block_alloc.c
> +++ b/fs/reiser4/block_alloc.c
> @@ -360,37 +360,40 @@ int reiser4_grab_reserved(struct super_block *super,
> __u64 count, reiser4_ba_flags_t flags)
> {
> reiser4_super_info_data *sbinfo = get_super_private(super);
> + int ret;
>
> assert("nikita-3175", flags & BA_CAN_COMMIT);
>
> /* Check the delete mutex already taken by us, we assume that
> * reading of machine word is atomic. */
> if (sbinfo->delete_mutex_owner == current) {
> - if (reiser4_grab_space
> - (count, (flags | BA_RESERVED) & ~BA_CAN_COMMIT)) {
> + ret = reiser4_grab_space (count, (flags | BA_RESERVED) & ~BA_CAN_COMMIT);
> +
> + if (ret != 0) {
> warning("zam-1003",
> "nested call of grab_reserved fails count=(%llu)",
> (unsigned long long)count);
> reiser4_release_reserved(super);
> - return RETERR(-ENOSPC);
> }
> - return 0;
> - }
> + } else {
> + ret = reiser4_grab_space(count, flags);
>
> - if (reiser4_grab_space(count, flags)) {
> - mutex_lock(&sbinfo->delete_mutex);
> - assert("nikita-2929", sbinfo->delete_mutex_owner == NULL);
> - sbinfo->delete_mutex_owner = current;
> + if (ret != 0) {
> + mutex_lock(&sbinfo->delete_mutex);
> + assert("nikita-2929", sbinfo->delete_mutex_owner == NULL);
> + sbinfo->delete_mutex_owner = current;
> + ret = reiser4_grab_space(count, flags | BA_RESERVED);
>
> - if (reiser4_grab_space(count, flags | BA_RESERVED)) {
> - warning("zam-833",
> - "reserved space is not enough (%llu)",
> - (unsigned long long)count);
> - reiser4_release_reserved(super);
> - return RETERR(-ENOSPC);
> + if (ret != 0) {
> + warning("zam-833",
> + "reserved space is not enough (%llu)",
> + (unsigned long long)count);
> + reiser4_release_reserved(super);
> + }
> }
> }
> - return 0;
> +
> + return ret;
> }
>
> void reiser4_release_reserved(struct super_block *super)
OK
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 2/3] reiser4: block_alloc: sanitize grab_enabled modifications.
2014-08-18 14:14 ` [PATCH 2/3] reiser4: block_alloc: sanitize grab_enabled modifications Ivan Shapovalov
@ 2014-10-18 17:47 ` Edward Shishkin
2014-10-20 9:43 ` Ivan Shapovalov
0 siblings, 1 reply; 9+ messages in thread
From: Edward Shishkin @ 2014-10-18 17:47 UTC (permalink / raw)
To: Ivan Shapovalov; +Cc: reiserfs-devel
On 08/18/2014 04:14 PM, Ivan Shapovalov wrote:
> - move all grab_enabled checks and modifications into reiser4_grab_space();
> - only disable grab if not BA_FORCE;
> - do not re-enable grab before doing second attempt in BA_CAN_COMMIT sequence
> (feels hackish and is unneeded after the first change).
>
> Signed-off-by: Ivan Shapovalov <intelfx100@gmail.com>
> ---
> fs/reiser4/block_alloc.c | 22 ++++++++++++----------
> 1 file changed, 12 insertions(+), 10 deletions(-)
>
> diff --git a/fs/reiser4/block_alloc.c b/fs/reiser4/block_alloc.c
> index 7f9f910..a30f7b9 100644
> --- a/fs/reiser4/block_alloc.c
> +++ b/fs/reiser4/block_alloc.c
> @@ -270,12 +270,6 @@ reiser4_grab(reiser4_context * ctx, __u64 count, reiser4_ba_flags_t flags)
>
> assert("vs-1276", ctx == get_current_context());
>
> - /* Do not grab anything on ro-mounted fs. */
> - if (rofs_super(ctx->super)) {
> - ctx->grab_enabled = 0;
> - return 0;
> - }
> -
> sbinfo = get_super_private(ctx->super);
>
> spin_lock_reiser4_super(sbinfo);
> @@ -300,9 +294,6 @@ reiser4_grab(reiser4_context * ctx, __u64 count, reiser4_ba_flags_t flags)
>
> assert("nikita-2986", reiser4_check_block_counters(ctx->super));
>
> - /* disable grab space in current context */
> - ctx->grab_enabled = 0;
> -
> unlock_and_ret:
> spin_unlock_reiser4_super(sbinfo);
>
> @@ -321,6 +312,12 @@ int reiser4_grab_space(__u64 count, reiser4_ba_flags_t flags)
> if (!(flags & BA_FORCE) && !is_grab_enabled(ctx))
> return 0;
>
> + /* Do not grab anything on ro-mounted fs. */
> + if (rofs_super(ctx->super)) {
> + ctx->grab_enabled = 0;
> + return 0;
> + }
> +
> ret = reiser4_grab(ctx, count, flags);
> if (ret == -ENOSPC) {
>
> @@ -328,10 +325,15 @@ int reiser4_grab_space(__u64 count, reiser4_ba_flags_t flags)
> present */
> if (flags & BA_CAN_COMMIT) {
> txnmgr_force_commit_all(ctx->super, 0);
> - ctx->grab_enabled = 1;
> ret = reiser4_grab(ctx, count, flags);
> }
> }
> +
> + if (!(flags & BA_FORCE) && (ret == 0)) {
Hmm, but we disabled it unconditionally in reiser4_grab().
Not sure, if this is equivalent...
> + /* disable grab space in current context */
> + ctx->grab_enabled = 0;
> + }
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 3/3] reiser4: do not mess with grab_enabled; instead, use BA_FORCE.
2014-08-18 14:14 ` [PATCH 3/3] reiser4: do not mess with grab_enabled; instead, use BA_FORCE Ivan Shapovalov
@ 2014-10-18 17:48 ` Edward Shishkin
0 siblings, 0 replies; 9+ messages in thread
From: Edward Shishkin @ 2014-10-18 17:48 UTC (permalink / raw)
To: Ivan Shapovalov; +Cc: reiserfs-devel
On 08/18/2014 04:14 PM, Ivan Shapovalov wrote:
> Signed-off-by: Ivan Shapovalov <intelfx100@gmail.com>
> ---
> fs/reiser4/plugin/file/file.c | 12 ++++--------
> fs/reiser4/plugin/file/file_conversion.c | 3 +--
> fs/reiser4/plugin/file/tail_conversion.c | 11 +++++------
> fs/reiser4/plugin/item/extent_file_ops.c | 3 +--
> fs/reiser4/plugin/item/tail.c | 3 +--
> fs/reiser4/safe_link.c | 4 +---
> 6 files changed, 13 insertions(+), 23 deletions(-)
>
> diff --git a/fs/reiser4/plugin/file/file.c b/fs/reiser4/plugin/file/file.c
> index 94029cd..b0bfa86 100644
> --- a/fs/reiser4/plugin/file/file.c
> +++ b/fs/reiser4/plugin/file/file.c
> @@ -335,11 +335,10 @@ static int find_file_state(struct inode *inode, struct unix_file_info *uf_info)
> */
> static int reserve_partial_page(reiser4_tree * tree)
> {
> - grab_space_enable();
> return reiser4_grab_reserved(reiser4_get_current_sb(),
> 1 +
> 2 * estimate_one_insert_into_item(tree),
> - BA_CAN_COMMIT);
> + BA_CAN_COMMIT | BA_FORCE);
> }
>
> /* estimate and reserve space needed to cut one item and update one stat data */
> @@ -350,11 +349,10 @@ static int reserve_cut_iteration(reiser4_tree * tree)
>
> assert("nikita-3172", lock_stack_isclean(get_current_lock_stack()));
>
> - grab_space_enable();
> /* We need to double our estimate now that we can delete more than one
> node. */
> return reiser4_grab_reserved(reiser4_get_current_sb(), estimate * 2,
> - BA_CAN_COMMIT);
> + BA_CAN_COMMIT | BA_FORCE);
> }
>
> int reiser4_update_file_size(struct inode *inode, loff_t new_size,
> @@ -875,10 +873,9 @@ static int capture_page_and_create_extent(struct page *page)
> /* page capture may require extent creation (if it does not exist yet)
> and stat data's update (number of blocks changes on extent
> creation) */
> - grab_space_enable();
> result = reiser4_grab_space(2 * estimate_one_insert_into_item
> (reiser4_tree_by_inode(inode)),
> - BA_CAN_COMMIT);
> + BA_CAN_COMMIT | BA_FORCE);
> if (likely(!result))
> result = find_or_create_extent(page);
>
> @@ -2421,9 +2418,8 @@ static int unpack(struct file *filp, struct inode *inode, int forever)
>
> set_file_notail(inode);
>
> - grab_space_enable();
> tograb = inode_file_plugin(inode)->estimate.update(inode);
> - result = reiser4_grab_space(tograb, BA_CAN_COMMIT);
> + result = reiser4_grab_space(tograb, BA_CAN_COMMIT | BA_FORCE);
> result = reiser4_update_sd(inode);
> }
>
> diff --git a/fs/reiser4/plugin/file/file_conversion.c b/fs/reiser4/plugin/file/file_conversion.c
> index 3ce4898..e01720f 100644
> --- a/fs/reiser4/plugin/file/file_conversion.c
> +++ b/fs/reiser4/plugin/file/file_conversion.c
> @@ -388,14 +388,13 @@ static int reserve_cryptcompress2unixfile(struct inode *inode)
> * 5. possible update of stat-data
> *
> */
> - grab_space_enable();
> return reiser4_grab_space
> (2 * tree->height +
> unformatted_nodes +
> unformatted_nodes * estimate_one_insert_into_item(tree) +
> 1 + estimate_one_insert_item(tree) +
> inode_file_plugin(inode)->estimate.update(inode),
> - BA_CAN_COMMIT);
> + BA_CAN_COMMIT | BA_FORCE);
> }
>
> /**
> diff --git a/fs/reiser4/plugin/file/tail_conversion.c b/fs/reiser4/plugin/file/tail_conversion.c
> index 1763cb1..22f30fd 100644
> --- a/fs/reiser4/plugin/file/tail_conversion.c
> +++ b/fs/reiser4/plugin/file/tail_conversion.c
> @@ -221,13 +221,13 @@ static int reserve_tail2extent_iteration(struct inode *inode)
> * 5. possible update of stat-data
> *
> */
> - grab_space_enable();
> return reiser4_grab_space
> (2 * tree->height +
> TAIL2EXTENT_PAGE_NUM +
> TAIL2EXTENT_PAGE_NUM * estimate_one_insert_into_item(tree) +
> 1 + estimate_one_insert_item(tree) +
> - inode_file_plugin(inode)->estimate.update(inode), BA_CAN_COMMIT);
> + inode_file_plugin(inode)->estimate.update(inode),
> + BA_CAN_COMMIT | BA_FORCE);
> }
>
> /* clear stat data's flag indicating that conversion is being converted */
> @@ -235,10 +235,9 @@ static int complete_conversion(struct inode *inode)
> {
> int result;
>
> - grab_space_enable();
> result =
> reiser4_grab_space(inode_file_plugin(inode)->estimate.update(inode),
> - BA_CAN_COMMIT);
> + BA_CAN_COMMIT | BA_FORCE);
> if (result == 0) {
> reiser4_inode_clr_flag(inode, REISER4_PART_MIXED);
> result = reiser4_update_sd(inode);
> @@ -552,12 +551,12 @@ static int reserve_extent2tail_iteration(struct inode *inode)
> *
> * 4. possible update of stat-data
> */
> - grab_space_enable();
> return reiser4_grab_space
> (estimate_one_item_removal(tree) +
> estimate_insert_flow(tree->height) +
> 1 + estimate_one_insert_item(tree) +
> - inode_file_plugin(inode)->estimate.update(inode), BA_CAN_COMMIT);
> + inode_file_plugin(inode)->estimate.update(inode),
> + BA_CAN_COMMIT | BA_FORCE);
> }
>
> /* for every page of file: read page, cut part of extent pointing to this page,
> diff --git a/fs/reiser4/plugin/item/extent_file_ops.c b/fs/reiser4/plugin/item/extent_file_ops.c
> index cb57379..8086b5f 100644
> --- a/fs/reiser4/plugin/item/extent_file_ops.c
> +++ b/fs/reiser4/plugin/item/extent_file_ops.c
> @@ -933,8 +933,7 @@ static int write_extent_reserve_space(struct inode *inode)
> count = estimate_one_insert_item(tree) +
> WRITE_GRANULARITY * (1 + estimate_one_insert_into_item(tree)) +
> estimate_one_insert_item(tree);
> - grab_space_enable();
> - return reiser4_grab_space(count, 0 /* flags */);
> + return reiser4_grab_space(count, BA_FORCE);
> }
>
> /*
> diff --git a/fs/reiser4/plugin/item/tail.c b/fs/reiser4/plugin/item/tail.c
> index 7f4a101..67cb4ba 100644
> --- a/fs/reiser4/plugin/item/tail.c
> +++ b/fs/reiser4/plugin/item/tail.c
> @@ -603,8 +603,7 @@ static int write_extent_reserve_space(struct inode *inode)
> count = estimate_one_insert_item(tree) +
> estimate_insert_flow(tree->height) +
> estimate_one_insert_item(tree);
> - grab_space_enable();
> - return reiser4_grab_space(count, 0 /* flags */);
> + return reiser4_grab_space(count, BA_FORCE);
> }
>
> #define PAGE_PER_FLOW 4
> diff --git a/fs/reiser4/safe_link.c b/fs/reiser4/safe_link.c
> index d59f6f0..f4cff69 100644
> --- a/fs/reiser4/safe_link.c
> +++ b/fs/reiser4/safe_link.c
> @@ -130,13 +130,11 @@ int safe_link_grab(reiser4_tree * tree, reiser4_ba_flags_t flags)
> {
> int result;
>
> - grab_space_enable();
> /* The sbinfo->delete_mutex can be taken here.
> * safe_link_release() should be called before leaving reiser4
> * context. */
> result =
> - reiser4_grab_reserved(tree->super, safe_link_tograb(tree), flags);
> - grab_space_enable();
> + reiser4_grab_reserved(tree->super, safe_link_tograb(tree), flags | BA_FORCE);
> return result;
> }
>
OK
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 2/3] reiser4: block_alloc: sanitize grab_enabled modifications.
2014-10-18 17:47 ` Edward Shishkin
@ 2014-10-20 9:43 ` Ivan Shapovalov
2014-11-16 5:39 ` Ivan Shapovalov
0 siblings, 1 reply; 9+ messages in thread
From: Ivan Shapovalov @ 2014-10-20 9:43 UTC (permalink / raw)
To: reiserfs-devel; +Cc: Edward Shishkin
[-- Attachment #1: Type: text/plain, Size: 2679 bytes --]
On Saturday 18 October 2014 at 19:47:29, Edward Shishkin wrote:
> On 08/18/2014 04:14 PM, Ivan Shapovalov wrote:
> > - move all grab_enabled checks and modifications into reiser4_grab_space();
> > - only disable grab if not BA_FORCE;
> > - do not re-enable grab before doing second attempt in BA_CAN_COMMIT sequence
> > (feels hackish and is unneeded after the first change).
> >
> > Signed-off-by: Ivan Shapovalov <intelfx100@gmail.com>
> > ---
> > fs/reiser4/block_alloc.c | 22 ++++++++++++----------
> > 1 file changed, 12 insertions(+), 10 deletions(-)
> >
> > diff --git a/fs/reiser4/block_alloc.c b/fs/reiser4/block_alloc.c
> > index 7f9f910..a30f7b9 100644
> > --- a/fs/reiser4/block_alloc.c
> > +++ b/fs/reiser4/block_alloc.c
> > @@ -270,12 +270,6 @@ reiser4_grab(reiser4_context * ctx, __u64 count, reiser4_ba_flags_t flags)
> >
> > assert("vs-1276", ctx == get_current_context());
> >
> > - /* Do not grab anything on ro-mounted fs. */
> > - if (rofs_super(ctx->super)) {
> > - ctx->grab_enabled = 0;
> > - return 0;
> > - }
> > -
> > sbinfo = get_super_private(ctx->super);
> >
> > spin_lock_reiser4_super(sbinfo);
> > @@ -300,9 +294,6 @@ reiser4_grab(reiser4_context * ctx, __u64 count, reiser4_ba_flags_t flags)
> >
> > assert("nikita-2986", reiser4_check_block_counters(ctx->super));
> >
> > - /* disable grab space in current context */
> > - ctx->grab_enabled = 0;
> > -
> > unlock_and_ret:
> > spin_unlock_reiser4_super(sbinfo);
> >
> > @@ -321,6 +312,12 @@ int reiser4_grab_space(__u64 count, reiser4_ba_flags_t flags)
> > if (!(flags & BA_FORCE) && !is_grab_enabled(ctx))
> > return 0;
> >
> > + /* Do not grab anything on ro-mounted fs. */
> > + if (rofs_super(ctx->super)) {
> > + ctx->grab_enabled = 0;
> > + return 0;
> > + }
> > +
> > ret = reiser4_grab(ctx, count, flags);
> > if (ret == -ENOSPC) {
> >
> > @@ -328,10 +325,15 @@ int reiser4_grab_space(__u64 count, reiser4_ba_flags_t flags)
> > present */
> > if (flags & BA_CAN_COMMIT) {
> > txnmgr_force_commit_all(ctx->super, 0);
> > - ctx->grab_enabled = 1;
> > ret = reiser4_grab(ctx, count, flags);
> > }
> > }
> > +
> > + if (!(flags & BA_FORCE) && (ret == 0)) {
>
>
> Hmm, but we disabled it unconditionally in reiser4_grab().
> Not sure, if this is equivalent...
Yes, you are right. I can't recall any particular justification for this
change... so it should probably say
if (ret == 0) {
--
Ivan Shapovalov / intelfx /
> > + /* disable grab space in current context */
> > + ctx->grab_enabled = 0;
> > + }
>
[-- Attachment #2: This is a digitally signed message part. --]
[-- Type: application/pgp-signature, Size: 213 bytes --]
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 2/3] reiser4: block_alloc: sanitize grab_enabled modifications.
2014-10-20 9:43 ` Ivan Shapovalov
@ 2014-11-16 5:39 ` Ivan Shapovalov
0 siblings, 0 replies; 9+ messages in thread
From: Ivan Shapovalov @ 2014-11-16 5:39 UTC (permalink / raw)
To: reiserfs-devel; +Cc: Edward Shishkin
[-- Attachment #1: Type: text/plain, Size: 2988 bytes --]
On Monday 20 October 2014 at 13:43:50, Ivan Shapovalov wrote:
> On Saturday 18 October 2014 at 19:47:29, Edward Shishkin wrote:
> > On 08/18/2014 04:14 PM, Ivan Shapovalov wrote:
> > > - move all grab_enabled checks and modifications into reiser4_grab_space();
> > > - only disable grab if not BA_FORCE;
> > > - do not re-enable grab before doing second attempt in BA_CAN_COMMIT sequence
> > > (feels hackish and is unneeded after the first change).
> > >
> > > Signed-off-by: Ivan Shapovalov <intelfx100@gmail.com>
> > > ---
> > > fs/reiser4/block_alloc.c | 22 ++++++++++++----------
> > > 1 file changed, 12 insertions(+), 10 deletions(-)
> > >
> > > diff --git a/fs/reiser4/block_alloc.c b/fs/reiser4/block_alloc.c
> > > index 7f9f910..a30f7b9 100644
> > > --- a/fs/reiser4/block_alloc.c
> > > +++ b/fs/reiser4/block_alloc.c
> > > @@ -270,12 +270,6 @@ reiser4_grab(reiser4_context * ctx, __u64 count, reiser4_ba_flags_t flags)
> > >
> > > assert("vs-1276", ctx == get_current_context());
> > >
> > > - /* Do not grab anything on ro-mounted fs. */
> > > - if (rofs_super(ctx->super)) {
> > > - ctx->grab_enabled = 0;
> > > - return 0;
> > > - }
> > > -
> > > sbinfo = get_super_private(ctx->super);
> > >
> > > spin_lock_reiser4_super(sbinfo);
> > > @@ -300,9 +294,6 @@ reiser4_grab(reiser4_context * ctx, __u64 count, reiser4_ba_flags_t flags)
> > >
> > > assert("nikita-2986", reiser4_check_block_counters(ctx->super));
> > >
> > > - /* disable grab space in current context */
> > > - ctx->grab_enabled = 0;
> > > -
> > > unlock_and_ret:
> > > spin_unlock_reiser4_super(sbinfo);
> > >
> > > @@ -321,6 +312,12 @@ int reiser4_grab_space(__u64 count, reiser4_ba_flags_t flags)
> > > if (!(flags & BA_FORCE) && !is_grab_enabled(ctx))
> > > return 0;
> > >
> > > + /* Do not grab anything on ro-mounted fs. */
> > > + if (rofs_super(ctx->super)) {
> > > + ctx->grab_enabled = 0;
> > > + return 0;
> > > + }
> > > +
> > > ret = reiser4_grab(ctx, count, flags);
> > > if (ret == -ENOSPC) {
> > >
> > > @@ -328,10 +325,15 @@ int reiser4_grab_space(__u64 count, reiser4_ba_flags_t flags)
> > > present */
> > > if (flags & BA_CAN_COMMIT) {
> > > txnmgr_force_commit_all(ctx->super, 0);
> > > - ctx->grab_enabled = 1;
> > > ret = reiser4_grab(ctx, count, flags);
> > > }
> > > }
> > > +
> > > + if (!(flags & BA_FORCE) && (ret == 0)) {
> >
> >
> > Hmm, but we disabled it unconditionally in reiser4_grab().
> > Not sure, if this is equivalent...
>
> Yes, you are right. I can't recall any particular justification for this
> change...
I've apparently "rediscovered" the justification. See my response to
PATCHv2 2/3...
--
Ivan Shapovalov / intelfx /
> so it should probably say
>
> if (ret == 0) {
>
> > > + /* disable grab space in current context */
> > > + ctx->grab_enabled = 0;
> > > + }
> >
[-- Attachment #2: This is a digitally signed message part. --]
[-- Type: application/pgp-signature, Size: 213 bytes --]
^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2014-11-16 5:39 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-08-18 14:14 [PATCH 0/3] reiser4: space grabbing fixes Ivan Shapovalov
2014-08-18 14:14 ` [PATCH 1/3] reiser4: block_alloc: improve error handling in reiser4_grab_reserved() Ivan Shapovalov
2014-10-18 17:43 ` Edward Shishkin
2014-08-18 14:14 ` [PATCH 2/3] reiser4: block_alloc: sanitize grab_enabled modifications Ivan Shapovalov
2014-10-18 17:47 ` Edward Shishkin
2014-10-20 9:43 ` Ivan Shapovalov
2014-11-16 5:39 ` Ivan Shapovalov
2014-08-18 14:14 ` [PATCH 3/3] reiser4: do not mess with grab_enabled; instead, use BA_FORCE Ivan Shapovalov
2014-10-18 17:48 ` Edward Shishkin
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).