--- a/fs/gfs2/rgrp.c +++ b/fs/gfs2/rgrp.c @@ -871,11 +871,15 @@ static int rgd_insert(struct gfs2_rgrpd *rgd) rd_node); parent = *newn; - if (rgd->rd_addr < cur->rd_addr) + if (rgd->rd_addr < cur->rd_addr) { + if (rgd->rd_data0 + rgd->rd_data > cur->rd_addr) + return -EUCLEAN; newn = &((*newn)->rb_left); - else if (rgd->rd_addr > cur->rd_addr) + } else if (rgd->rd_addr > cur->rd_addr) { + if (rgd->rd_addr < cur->rd_data0) + return -EUCLEAN; newn = &((*newn)->rb_right); - else + } else return -EEXIST; } @@ -944,7 +948,8 @@ static int read_rindex_entry(struct gfs2_inode *ip) return 0; } - error = 0; /* someone else read in the rgrp; free it and ignore it */ + if (error == -EEXIST) + error = 0; /* someone else read in the rgrp; free it and ignore it */ fail_glock: gfs2_glock_put(rgd->rd_gl);