Index: pvfs2_src/src/kernel/linux-2.6/inode.c =================================================================== --- pvfs2_src/src/kernel/linux-2.6/inode.c (revision 12177) +++ pvfs2_src/src/kernel/linux-2.6/inode.c (revision 12178) @@ -229,6 +229,7 @@ if (ret) { /* assume an I/O error and flag inode as bad */ + gossip_debug(GOSSIP_INODE_DEBUG, "%s:%s:%d calling make bad inode\n", __FILE__, __func__, __LINE__); pvfs2_make_bad_inode(inode); } return ret; @@ -277,6 +278,7 @@ else { /* assume an I/O error and flag inode as bad */ + gossip_debug(GOSSIP_INODE_DEBUG, "%s:%s:%d calling make bad inode\n", __FILE__, __func__, __LINE__); pvfs2_make_bad_inode(inode); } return ret; @@ -324,6 +326,7 @@ else { /* assume an I/O error and flag inode as bad */ + gossip_debug(GOSSIP_INODE_DEBUG, "%s:%s:%d calling make bad inode\n", __FILE__, __func__, __LINE__); pvfs2_make_bad_inode(inode); } return ret; Index: pvfs2_src/src/kernel/linux-2.6/pvfs2-utils.c =================================================================== --- pvfs2_src/src/kernel/linux-2.6/pvfs2-utils.c (revision 12177) +++ pvfs2_src/src/kernel/linux-2.6/pvfs2-utils.c (revision 12178) @@ -260,7 +260,7 @@ { /* special case: mark the root inode as sticky */ inode->i_mode |= S_ISVTX; - gossip_debug(GOSSIP_ACL_DEBUG, "Marking inode %llu as sticky\n", + gossip_debug(GOSSIP_UTILS_DEBUG, "Marking inode %llu as sticky\n", llu(get_handle_from_ino(inode))); } @@ -438,6 +438,7 @@ pvfs2_inode = PVFS2_I(inode); if (!pvfs2_inode) { + gossip_debug(GOSSIP_UTILS_DEBUG, "%s:%s:%d failed to resolve to pvfs2_inode\n", __FILE__, __func__, __LINE__); return ret; } @@ -567,7 +568,7 @@ new_op, "pvfs2_inode_setattr", get_interruptible_flag(inode)); - gossip_debug(GOSSIP_ACL_DEBUG, "pvfs2_inode_setattr: returning %d\n", ret); + gossip_debug(GOSSIP_UTILS_DEBUG, "pvfs2_inode_setattr: returning %d\n", ret); /* when request is serviced properly, free req op struct */ op_release(new_op); @@ -1183,7 +1198,7 @@ new_op, "pvfs2_create_file", get_interruptible_flag(dir)); - gossip_debug(GOSSIP_ACL_DEBUG, "Create Got PVFS2 handle %llu on fsid %d (ret=%d)\n", + gossip_debug(GOSSIP_UTILS_DEBUG, "Create Got PVFS2 handle %llu on fsid %d (ret=%d)\n", llu(new_op->downcall.resp.create.refn.handle), new_op->downcall.resp.create.refn.fs_id, ret); @@ -1208,14 +1223,14 @@ dentry->d_op = &pvfs2_dentry_operations; d_instantiate(dentry, inode); - gossip_debug(GOSSIP_ACL_DEBUG, "Inode (Regular File) %llu -> %s\n", + gossip_debug(GOSSIP_UTILS_DEBUG, "Inode (Regular File) %llu -> %s\n", llu(get_handle_from_ino(inode)), dentry->d_name.name); } else { *error_code = ret; - gossip_debug(GOSSIP_ACL_DEBUG, "pvfs2_create_file: failed with error code %d\n", + gossip_debug(GOSSIP_UTILS_DEBUG, "pvfs2_create_file: failed with error code %d\n", *error_code); } @@ -1295,7 +1310,7 @@ dentry->d_op = &pvfs2_dentry_operations; d_instantiate(dentry, inode); - gossip_debug(GOSSIP_ACL_DEBUG, "Inode (Directory) %llu -> %s\n", + gossip_debug(GOSSIP_UTILS_DEBUG, "Inode (Directory) %llu -> %s\n", llu(get_handle_from_ino(inode)), dentry->d_name.name); } else @@ -1391,7 +1406,7 @@ dentry->d_op = &pvfs2_dentry_operations; d_instantiate(dentry, inode); - gossip_debug(GOSSIP_ACL_DEBUG, "Inode (Symlink) %llu -> %s\n", + gossip_debug(GOSSIP_UTILS_DEBUG, "Inode (Symlink) %llu -> %s\n", llu(get_handle_from_ino(inode)), dentry->d_name.name); } else Index: pvfs2_src/src/kernel/linux-2.6/super.c =================================================================== --- pvfs2_src/src/kernel/linux-2.6/super.c (revision 12177) +++ pvfs2_src/src/kernel/linux-2.6/super.c (revision 12178) @@ -240,6 +240,8 @@ if (pvfs2_inode_getattr(inode, PVFS_ATTR_SYS_ALL_NOHINT) != 0) { /* assume an I/O error and mark the inode as bad */ + gossip_debug(GOSSIP_SUPER_DEBUG, "%s:%s:%d calling make bad inode - [%p] (inode = %llu | ct = %d)\n", + __FILE__, __func__, __LINE__, pvfs2_inode, llu(get_handle_from_ino(inode)), (int)atomic_read(&inode->i_count)); pvfs2_make_bad_inode(inode); } } @@ -282,6 +284,8 @@ #endif if (pvfs2_inode_getattr(inode, PVFS_ATTR_SYS_ALL_NOHINT) != 0) { + gossip_debug(GOSSIP_SUPER_DEBUG, "%s:%s:%d calling make bad inode - [%p] (inode = %llu | ct = %d)\n", + __FILE__, __func__, __LINE__, pvfs2_inode, llu(get_handle_from_ino(inode)), (int)atomic_read(&inode->i_count)); pvfs2_make_bad_inode(inode); } else { @@ -292,8 +296,9 @@ } else { - gossip_err("Could not allocate pvfs2_inode from " - "pvfs2_inode_cache\n"); + gossip_err("%s:%s:%d Could not allocate pvfs2_inode from pvfs2_inode_cache." + "calling make bad inode - [%p] (inode = %llu | ct = %d)\n", + __FILE__, __func__, __LINE__, pvfs2_inode, llu(get_handle_from_ino(inode)), (int)atomic_read(&inode->i_count)); pvfs2_make_bad_inode(inode); } } Index: pvfs2_src/src/kernel/linux-2.6/dcache.c =================================================================== --- pvfs2_src/src/kernel/linux-2.6/dcache.c (revision 12177) +++ pvfs2_src/src/kernel/linux-2.6/dcache.c (revision 12178) @@ -79,6 +79,9 @@ strncpy(new_op->upcall.req.lookup.d_name, dentry->d_name.name, PVFS2_NAME_LEN); + gossip_debug(GOSSIP_DCACHE_DEBUG, "%s:%s:%d interrupt flag [%d]\n", + __FILE__, __func__, __LINE__, get_interruptible_flag(parent_inode)); + ret = service_operation( new_op, "pvfs2_lookup", get_interruptible_flag(parent_inode)); @@ -88,12 +91,23 @@ { gossip_debug( GOSSIP_DCACHE_DEBUG, - "%s: lookup failure or no match.\n", __func__); + "%s:%s:%d lookup failure |%s| or no match |%s|.\n", __FILE__, __func__, __LINE__, + (new_op->downcall.status != 0) ? "true" : "false", + (!match_handle(new_op->downcall.resp.lookup.refn.handle, inode)) ? "true" : "false"); op_release(new_op); + /* The make_bad_inode sent the RHEL3 system into permission denied on a directory + * in some CTRL-C tests where the INTERRUPT signal would cause the directory path + * to be walked and all inodes marked as bad. We don't really want to mark as bad + * in all cases + */ + /* mark the inode as bad so that d_delete will be aggressive * about dropping the dentry */ - pvfs2_make_bad_inode(inode); + //pvfs2_make_bad_inode(inode); + gossip_debug(GOSSIP_DCACHE_DEBUG, "%s:%s:%d setting revalidate_failed = 1\n", __FILE__, __func__, __LINE__); + PVFS2_I(inode)->revalidate_failed = 1; + goto invalid_exit; } @@ -111,11 +125,12 @@ __func__, inode, llu(get_handle_from_ino(inode))); ret = pvfs2_inode_getattr(inode, PVFS_ATTR_SYS_ALL_NOHINT); gossip_debug(GOSSIP_DCACHE_DEBUG, - "%s: getattr %s (ret = %d), returning %s for dentry\n", + "%s: getattr %s (ret = %d), returning %s for dentry i_count=%d\n", __func__, (ret == 0 ? "succeeded" : "failed"), ret, - (ret == 0 ? "valid" : "INVALID")); + (ret == 0 ? "valid" : "INVALID"), + atomic_read(&inode->i_count)); if(ret != 0) { goto invalid_exit; @@ -132,7 +147,8 @@ { gossip_debug(GOSSIP_DCACHE_DEBUG, "%s: called on dentry %p.\n", __func__, dentry); - if(dentry->d_inode && is_bad_inode(dentry->d_inode)) + //if(dentry->d_inode && is_bad_inode(dentry->d_inode)) + if(dentry->d_inode && PVFS2_I(dentry->d_inode)->revalidate_failed == 1) { gossip_debug(GOSSIP_DCACHE_DEBUG, "%s: returning 1 (bad inode).\n", __func__); Index: pvfs2_src/src/kernel/linux-2.6/file.c =================================================================== --- pvfs2_src/src/kernel/linux-2.6/file.c (revision 12177) +++ pvfs2_src/src/kernel/linux-2.6/file.c (revision 12178) @@ -102,6 +102,7 @@ } else { + gossip_debug(GOSSIP_FILE_DEBUG, "%s:%s:%d calling make bad inode\n", __FILE__, __func__, __LINE__); pvfs2_make_bad_inode(inode); gossip_debug(GOSSIP_FILE_DEBUG, "pvfs2_file_open returning error: %d\n", ret); return(ret); @@ -3077,6 +3078,7 @@ ret = pvfs2_inode_getattr(inode, PVFS_ATTR_SYS_SIZE); if (ret) { + gossip_debug(GOSSIP_FILE_DEBUG, "%s:%s:%d calling make bad inode\n", __FILE__, __func__, __LINE__); pvfs2_make_bad_inode(inode); return ret; } Index: pvfs2_src/src/kernel/linux-2.6/pvfs2-kernel.h =================================================================== --- pvfs2_src/src/kernel/linux-2.6/pvfs2-kernel.h (revision 12177) +++ pvfs2_src/src/kernel/linux-2.6/pvfs2-kernel.h (revision 12178) @@ -384,6 +384,7 @@ #endif sector_t last_failed_block_index_read; int error_code; + int revalidate_failed; /* State of in-memory attributes not yet flushed to disk associated with this object */ unsigned long pinode_flags; Index: pvfs2_src/src/kernel/linux-2.6/xattr-default.c =================================================================== --- pvfs2_src/src/kernel/linux-2.6/xattr-default.c (revision 12177) +++ pvfs2_src/src/kernel/linux-2.6/xattr-default.c (revision 12178) @@ -29,7 +29,8 @@ if (!S_ISREG(inode->i_mode) && (!S_ISDIR(inode->i_mode) || inode->i_mode & S_ISVTX)) { - return -EPERM; + gossip_err("pvfs2_xattr_set_default: Returning EPERM for inode %p.\n", inode); + return -EPERM; } gossip_debug(GOSSIP_XATTR_DEBUG, "pvfs2_setxattr_default %s\n", name); internal_flag = convert_to_internal_xattr_flags(flags); Index: pvfs2_src/src/kernel/linux-2.6/namei.c =================================================================== --- pvfs2_src/src/kernel/linux-2.6/namei.c (revision 12177) +++ pvfs2_src/src/kernel/linux-2.6/namei.c (revision 12178) @@ -112,6 +112,8 @@ if (parent && parent->refn.handle != PVFS_HANDLE_NULL && parent->refn.fs_id != PVFS_FS_ID_NULL) { + gossip_debug(GOSSIP_NAME_DEBUG, "%s:%s:%d using parent %llu\n", + __FILE__, __func__, __LINE__, llu(parent->refn.handle)); new_op->upcall.req.lookup.parent_refn = parent->refn; } else @@ -198,6 +200,8 @@ inode = pvfs2_iget(sb, &new_op->downcall.resp.lookup.refn); if (inode && !is_bad_inode(inode)) { + gossip_debug(GOSSIP_NAME_DEBUG, "%s:%s:%d Found good inode [%lu] with count [%d]\n", + __FILE__, __func__, __LINE__, inode->i_ino, (int)atomic_read(&inode->i_count)); struct dentry *res; /* update dentry/inode pair into dcache */ @@ -219,6 +223,8 @@ } else if (inode && is_bad_inode(inode)) { + gossip_debug(GOSSIP_NAME_DEBUG, "%s:%s:%d Found bad inode [%lu] with count [%d]. Returning error [%d]", + __FILE__, __func__, __LINE__, inode->i_ino, (int)atomic_read(&inode->i_count), ret); ret = -EACCES; found_pvfs2_inode = PVFS2_I(inode); /* look for an error code, possibly set by pvfs2_read_inode(), @@ -237,7 +243,7 @@ * from pvfs2_iget was null...just return EACCESS */ op_release(new_op); - gossip_debug(GOSSIP_NAME_DEBUG, "Returning -EACCES\n"); + gossip_debug(GOSSIP_NAME_DEBUG, "Returning -EACCES for NULL inode\n"); return ERR_PTR(-EACCES); } Index: pvfs2_src/src/server/set-attr.sm =================================================================== --- pvfs2_src/src/server/set-attr.sm (revision 12177) +++ pvfs2_src/src/server/set-attr.sm (revision 12178) @@ -276,7 +276,7 @@ { if (dspace_a_p->perms != 0 && ((a_p->mask & PVFS_ATTR_COMMON_PERM) && (dspace_a_p->perms != a_p->perms))) { - gossip_debug(GOSSIP_SETATTR_DEBUG, "Cannot change perms of symlink: Permission denied\n"); + gossip_err("Cannot change perms of symlink: Permission denied\n"); js_p->error_code = -PVFS_EPERM; return SM_ACTION_COMPLETE; } Index: pvfs2_src/src/client/sysint/sys-truncate.sm =================================================================== --- pvfs2_src/src/client/sysint/sys-truncate.sm (revision 12177) +++ pvfs2_src/src/client/sysint/sys-truncate.sm (revision 12178) @@ -179,6 +179,7 @@ if ((attr->u.meta.hint.flags & PVFS_IMMUTABLE_FL) || (attr->u.meta.hint.flags & PVFS_APPEND_FL)) { + gossip_err("Cannot truncate an append-only or immutable file. Returning EPERM\n"); js_p->error_code = -PVFS_EPERM; return 1; } Index: pvfs2_src/src/client/sysint/sys-io.sm =================================================================== --- pvfs2_src/src/client/sysint/sys-io.sm (revision 12177) +++ pvfs2_src/src/client/sysint/sys-io.sm (revision 12178) @@ -441,6 +441,7 @@ if (sm_p->u.io.io_type == PVFS_IO_WRITE && (attr->u.meta.hint.flags & PVFS_IMMUTABLE_FL)) { + gossip_err("Cannot write to a immutable file. Returning EPERM\n"); js_p->error_code = -PVFS_EPERM; goto exit; }