[LU-5770] wrong tx credit calculations in mdd_declare_links_add() Created: 20/Oct/14  Updated: 31/Jul/16  Resolved: 30/Oct/15

Status: Resolved
Project: Lustre
Component/s: None
Affects Version/s: Lustre 2.6.0, Lustre 2.5.1
Fix Version/s: Lustre 2.8.0

Type: Bug Priority: Critical
Reporter: Alexander Zarochentsev Assignee: Alex Zhuravlev
Resolution: Fixed Votes: 0
Labels: patch

Issue Links:
Related
is related to LU-7332 LustreError: 201113:0:(osd_internal.h... Resolved
is related to LU-5794 improve credit checks in osd-ldiskfs Resolved
Severity: 3
Rank (Obsolete): 16192

 Description   

looking for a reason of

 kernel BUG at fs/jbd2/transaction.c:1033! 

in sanityN test 12, I ran a simple debugging code

diff --git a/lustre/osd-ldiskfs/osd_handler.c b/lustre/osd-ldiskfs/osd_handler.c
index 0da56c0..59efd5b 100644
--- a/lustre/osd-ldiskfs/osd_handler.c
+++ b/lustre/osd-ldiskfs/osd_handler.c
@@ -2988,6 +2988,8 @@ static int osd_declare_xattr_set(const struct lu_env *env,
                        credits *= (buf->lb_len + sb->s_blocksize - 1) >>
                                        sb->s_blocksize_bits;
                }
+               if (buf) 
+                       printk("osd_declare_xattr_set: buflen = %ld\n", buf->lb_len);
                /*
                 * xattr set may involve inode quota change, reserve credits for
                 * dquot_initialize()
@@ -3071,6 +3073,8 @@ static int osd_xattr_set(const struct lu_env *env, struct dt_object *dt,
                if (rc != 0)
                        RETURN(rc);
        }
+       if (buf) 
+               printk("osd_xattr_set: buflen = %ld\n", buf->lb_len);
 
        rc = __osd_xattr_set(info, inode, name, buf->lb_buf, buf->lb_len,
                               fs_flags);

got the following output:

osd_xattr_set: buflen = 256280
osd_declare_xattr_set: buflen = 4096
osd_xattr_set: buflen = 256310
osd_declare_xattr_set: buflen = 4096
osd_xattr_set: buflen = 256340
osd_declare_xattr_set: buflen = 4096
osd_xattr_set: buflen = 256370
osd_declare_xattr_set: buflen = 4096
osd_xattr_set: buflen = 256400
osd_declare_xattr_set: buflen = 4096
osd_xattr_set: buflen = 256430
osd_declare_xattr_set: buflen = 4096
osd_xattr_set: buflen = 256460
osd_declare_xattr_set: buflen = 4096
osd_xattr_set: buflen = 256490
osd_declare_xattr_set: buflen = 4096
osd_xattr_set: buflen = 256520
osd_declare_xattr_set: buflen = 4096
osd_xattr_set: buflen = 256550

from

REFORMAT=y MDSSIZE=400000 ONLY=12 LDISKFS_MKFS_OPTS="-O large_xattr" sh sanityn.sh

mdd_declare_links_add() always uses DEFAULT_LINKEA_SIZE (4096) because linkea_data not yet initialised at the moment of mdd_declare_links_add() call. With really large LinkEA the difference between allocated and used transaction credits can cause that kernel BUG() in jbd2 code.



 Comments   
Comment by Alexander Zarochentsev [ 24/Oct/14 ]

patch http://review.whamcloud.com/#/c/12412/

Comment by Gerrit Updater [ 30/Oct/15 ]

Oleg Drokin (oleg.drokin@intel.com) merged in patch http://review.whamcloud.com/12412/
Subject: LU-5770 osd: find bufsize in declare_xattr_set
Project: fs/lustre-release
Branch: master
Current Patch Set:
Commit: f6e7cc6d3a640e02192096584f4c6625b99e4678

Comment by Joseph Gmitter (Inactive) [ 30/Oct/15 ]

Landed for 2.8

Generated at Sat Feb 10 01:54:22 UTC 2024 using Jira 9.4.14#940014-sha1:734e6822bbf0d45eff9af51f82432957f73aa32c.