Dell - Internal Use - Confidential > On Wed, 19 Sep 2018 12:33:37 +0100 > "Burton, Ross" <ross.bur...@intel.com> wrote: > > > Is anyone actually writing a patch? > > I have a tentative fix for this checked into master, I don't know > whether it actually works because I don't have any inodes over 2^63. > > It doesn't seem to have *broken* anything, though in casual testing. > It's not carefully tested. > > -s
My sincerest apologies, my "maths" failed me. Number was correct, bound were wrong. Any inodes above 0x7FFF FFFF (2147483647) fail... HOWEVER that's not 64-bits, that's 32-bits! (DUH JACK!) Okay, so I found the problem, and I have a patch for it. Throughout the pseudo_db.c code, the handling of the msg->ino objects is not consistent. Many get passed to the sqlite3_bind_int64 function, but NOT ALL. 9 instances in the code, including all of them in the xattr code use only sqlite3_bind_int which truncates the integers to signed 32-bits. Fixing those 9 entries resolves the issue. Patch follows: Index: git/pseudo_db.c =================================================================== --- git.orig/pseudo_db.c +++ git/pseudo_db.c @@ -1512,9 +1512,9 @@ pdb_clear_xattrs(pseudo_msg_t *msg) { } } sqlite3_bind_int(delete, 1, msg->dev); - sqlite3_bind_int(delete, 2, msg->ino); + sqlite3_bind_int64(delete, 2, msg->ino); sqlite3_bind_int(delete, 3, msg->dev); - sqlite3_bind_int(delete, 4, msg->ino); + sqlite3_bind_int64(delete, 4, msg->ino); rc = sqlite3_step(delete); if (rc != SQLITE_DONE) { dberr(file_db, "delete of unused xattrs may have failed"); @@ -1549,9 +1549,9 @@ pdb_copy_xattrs(pseudo_msg_t *oldmsg, ps } } sqlite3_bind_int(copy, 1, msg->dev); - sqlite3_bind_int(copy, 2, msg->ino); + sqlite3_bind_int64(copy, 2, msg->ino); sqlite3_bind_int(copy, 3, oldmsg->dev); - sqlite3_bind_int(copy, 4, oldmsg->ino); + sqlite3_bind_int64(copy, 4, oldmsg->ino); rc = sqlite3_step(copy); if (rc != SQLITE_DONE) { dberr(file_db, "copy of xattrs may have failed"); @@ -1581,7 +1581,7 @@ pdb_check_xattrs(pseudo_msg_t *msg) { } int existing; sqlite3_bind_int(scan, 1, msg->dev); - sqlite3_bind_int(scan, 2, msg->ino); + sqlite3_bind_int64(scan, 2, msg->ino); rc = sqlite3_step(scan); if (rc == SQLITE_ROW) { existing = (int) sqlite3_column_int64(scan, 0); @@ -2471,7 +2471,7 @@ pdb_get_xattr(pseudo_msg_t *msg, char ** } pseudo_debug(PDBGF_XATTR, "requested xattr named '%s' for ino %lld\n", *value, (long long) msg->ino); sqlite3_bind_int(select, 1, msg->dev); - sqlite3_bind_int(select, 2, msg->ino); + sqlite3_bind_int64(select, 2, msg->ino); rc = sqlite3_bind_text(select, 3, *value, -1, SQLITE_STATIC); if (rc) { dberr(file_db, "couldn't bind xattr name to SELECT."); @@ -2533,7 +2533,7 @@ pdb_list_xattr(pseudo_msg_t *msg, char * } } sqlite3_bind_int(select, 1, msg->dev); - sqlite3_bind_int(select, 2, msg->ino); + sqlite3_bind_int64(select, 2, msg->ino); do { rc = sqlite3_step(select); if (rc == SQLITE_ROW) { @@ -2587,7 +2587,7 @@ pdb_remove_xattr(pseudo_msg_t *msg, char } } sqlite3_bind_int(delete, 1, msg->dev); - sqlite3_bind_int(delete, 2, msg->ino); + sqlite3_bind_int64(delete, 2, msg->ino); rc = sqlite3_bind_text(delete, 3, value, len, SQLITE_STATIC); if (rc) { dberr(file_db, "couldn't bind xattr name to DELETE."); @@ -2628,7 +2628,7 @@ pdb_set_xattr(pseudo_msg_t *msg, char *v } } sqlite3_bind_int(select, 1, msg->dev); - sqlite3_bind_int(select, 2, msg->ino); + sqlite3_bind_int64(select, 2, msg->ino); rc = sqlite3_bind_text(select, 3, value, -1, SQLITE_STATIC); if (rc) { dberr(file_db, "couldn't bind xattr name to SELECT."); -- _______________________________________________ yocto mailing list yocto@yoctoproject.org https://lists.yoctoproject.org/listinfo/yocto