aboutsummaryrefslogtreecommitdiffstats
path: root/fs/ocfs2/inode.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/ocfs2/inode.c')
-rw-r--r--fs/ocfs2/inode.c29
1 files changed, 19 insertions, 10 deletions
diff --git a/fs/ocfs2/inode.c b/fs/ocfs2/inode.c
index abb0a95cc717..0492464916b1 100644
--- a/fs/ocfs2/inode.c
+++ b/fs/ocfs2/inode.c
@@ -969,7 +969,7 @@ static void ocfs2_cleanup_delete_inode(struct inode *inode,
969 truncate_inode_pages(&inode->i_data, 0); 969 truncate_inode_pages(&inode->i_data, 0);
970} 970}
971 971
972void ocfs2_delete_inode(struct inode *inode) 972static void ocfs2_delete_inode(struct inode *inode)
973{ 973{
974 int wipe, status; 974 int wipe, status;
975 sigset_t oldset; 975 sigset_t oldset;
@@ -1075,20 +1075,17 @@ bail_unlock_nfs_sync:
1075bail_unblock: 1075bail_unblock:
1076 ocfs2_unblock_signals(&oldset); 1076 ocfs2_unblock_signals(&oldset);
1077bail: 1077bail:
1078 clear_inode(inode);
1079 mlog_exit_void(); 1078 mlog_exit_void();
1080} 1079}
1081 1080
1082void ocfs2_clear_inode(struct inode *inode) 1081static void ocfs2_clear_inode(struct inode *inode)
1083{ 1082{
1084 int status; 1083 int status;
1085 struct ocfs2_inode_info *oi = OCFS2_I(inode); 1084 struct ocfs2_inode_info *oi = OCFS2_I(inode);
1086 1085
1087 mlog_entry_void(); 1086 mlog_entry_void();
1088 1087
1089 if (!inode) 1088 end_writeback(inode);
1090 goto bail;
1091
1092 mlog(0, "Clearing inode: %llu, nlink = %u\n", 1089 mlog(0, "Clearing inode: %llu, nlink = %u\n",
1093 (unsigned long long)OCFS2_I(inode)->ip_blkno, inode->i_nlink); 1090 (unsigned long long)OCFS2_I(inode)->ip_blkno, inode->i_nlink);
1094 1091
@@ -1180,16 +1177,27 @@ void ocfs2_clear_inode(struct inode *inode)
1180 jbd2_journal_release_jbd_inode(OCFS2_SB(inode->i_sb)->journal->j_journal, 1177 jbd2_journal_release_jbd_inode(OCFS2_SB(inode->i_sb)->journal->j_journal,
1181 &oi->ip_jinode); 1178 &oi->ip_jinode);
1182 1179
1183bail:
1184 mlog_exit_void(); 1180 mlog_exit_void();
1185} 1181}
1186 1182
1183void ocfs2_evict_inode(struct inode *inode)
1184{
1185 if (!inode->i_nlink ||
1186 (OCFS2_I(inode)->ip_flags & OCFS2_INODE_MAYBE_ORPHANED)) {
1187 ocfs2_delete_inode(inode);
1188 } else {
1189 truncate_inode_pages(&inode->i_data, 0);
1190 }
1191 ocfs2_clear_inode(inode);
1192}
1193
1187/* Called under inode_lock, with no more references on the 1194/* Called under inode_lock, with no more references on the
1188 * struct inode, so it's safe here to check the flags field 1195 * struct inode, so it's safe here to check the flags field
1189 * and to manipulate i_nlink without any other locks. */ 1196 * and to manipulate i_nlink without any other locks. */
1190void ocfs2_drop_inode(struct inode *inode) 1197int ocfs2_drop_inode(struct inode *inode)
1191{ 1198{
1192 struct ocfs2_inode_info *oi = OCFS2_I(inode); 1199 struct ocfs2_inode_info *oi = OCFS2_I(inode);
1200 int res;
1193 1201
1194 mlog_entry_void(); 1202 mlog_entry_void();
1195 1203
@@ -1197,11 +1205,12 @@ void ocfs2_drop_inode(struct inode *inode)
1197 (unsigned long long)oi->ip_blkno, inode->i_nlink, oi->ip_flags); 1205 (unsigned long long)oi->ip_blkno, inode->i_nlink, oi->ip_flags);
1198 1206
1199 if (oi->ip_flags & OCFS2_INODE_MAYBE_ORPHANED) 1207 if (oi->ip_flags & OCFS2_INODE_MAYBE_ORPHANED)
1200 generic_delete_inode(inode); 1208 res = 1;
1201 else 1209 else
1202 generic_drop_inode(inode); 1210 res = generic_drop_inode(inode);
1203 1211
1204 mlog_exit_void(); 1212 mlog_exit_void();
1213 return res;
1205} 1214}
1206 1215
1207/* 1216/*