Hi,
On 11/07/18 13:18, Dan Carpenter wrote:
Hello David Teigland,
The patch b3b94faa5fe5: "[GFS2] The core of GFS2" from Jan 16, 2006,
leads to the following static checker warning:
fs/gfs2/dir.c:1104 dir_split_leaf()
warn: 'new' can also be NULL
fs/gfs2/dir.c
1083 /* Copy the entries */
1084 dent = (struct gfs2_dirent *)(obh->b_data + sizeof(struct
gfs2_leaf));
1085
1086 do {
1087 next = dent;
1088 if (dirent_next(dip, obh, &next))
1089 next = NULL;
1090
1091 if (!gfs2_dirent_sentinel(dent) &&
1092 be32_to_cpu(dent->de_hash) < divider) {
1093 struct qstr str;
1094 void *ptr = ((char *)dent - obh->b_data) +
nbh->b_data;
1095 str.name = (char*)(dent+1);
1096 str.len = be16_to_cpu(dent->de_name_len);
1097 str.hash = be32_to_cpu(dent->de_hash);
1098 new = gfs2_dirent_split_alloc(inode, nbh,
&str, ptr);
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
This returns both NULL and error pointers. There is no documentation
so I have no idea what the the returns mean.
That can only happen in case the gfs2_dirent_scan does not find any free
space. Since the leaf block has been split immediately before we run
gfs2_dirent_scan, it can only happen if something has come along and
stomped on the newly split leaf block, which should be impossible, so it
looks like a false positive to me,
Steve.
1099 if (IS_ERR(new)) {
1100 error = PTR_ERR(new);
1101 break;
1102 }
1103
1104 new->de_inum = dent->de_inum; /* No endian
worries */
1105 new->de_type = dent->de_type; /* No endian
worries */
1106 be16_add_cpu(&nleaf->lf_entries, 1);
1107
1108 dirent_del(dip, obh, prev, dent);
1109
1110 if (!oleaf->lf_entries)
1111 gfs2_consist_inode(dip);
1112 be16_add_cpu(&oleaf->lf_entries, -1);
1113
1114 if (!prev)
1115 prev = dent;
1116
1117 moved = 1;
1118 } else {
1119 prev = dent;
1120 }
1121 dent = next;
1122 } while (dent);
1123
regards,
dan carpenter