|
@@ -2012,6 +2012,21 @@ static int ocfs2_orphan_add(struct ocfs2_super *osb,
|
|
|
goto leave;
|
|
|
}
|
|
|
|
|
|
+ /*
|
|
|
+ * We're going to journal the change of i_flags and i_orphaned_slot.
|
|
|
+ * It's safe anyway, though some callers may duplicate the journaling.
|
|
|
+ * Journaling within the func just make the logic look more
|
|
|
+ * straightforward.
|
|
|
+ */
|
|
|
+ status = ocfs2_journal_access_di(handle,
|
|
|
+ INODE_CACHE(inode),
|
|
|
+ fe_bh,
|
|
|
+ OCFS2_JOURNAL_ACCESS_WRITE);
|
|
|
+ if (status < 0) {
|
|
|
+ mlog_errno(status);
|
|
|
+ goto leave;
|
|
|
+ }
|
|
|
+
|
|
|
/* we're a cluster, and nlink can change on disk from
|
|
|
* underneath us... */
|
|
|
orphan_fe = (struct ocfs2_dinode *) orphan_dir_bh->b_data;
|
|
@@ -2026,22 +2041,7 @@ static int ocfs2_orphan_add(struct ocfs2_super *osb,
|
|
|
orphan_dir_bh, lookup);
|
|
|
if (status < 0) {
|
|
|
mlog_errno(status);
|
|
|
- goto leave;
|
|
|
- }
|
|
|
-
|
|
|
- /*
|
|
|
- * We're going to journal the change of i_flags and i_orphaned_slot.
|
|
|
- * It's safe anyway, though some callers may duplicate the journaling.
|
|
|
- * Journaling within the func just make the logic look more
|
|
|
- * straightforward.
|
|
|
- */
|
|
|
- status = ocfs2_journal_access_di(handle,
|
|
|
- INODE_CACHE(inode),
|
|
|
- fe_bh,
|
|
|
- OCFS2_JOURNAL_ACCESS_WRITE);
|
|
|
- if (status < 0) {
|
|
|
- mlog_errno(status);
|
|
|
- goto leave;
|
|
|
+ goto rollback;
|
|
|
}
|
|
|
|
|
|
fe->i_flags |= cpu_to_le32(OCFS2_ORPHANED_FL);
|
|
@@ -2057,11 +2057,16 @@ static int ocfs2_orphan_add(struct ocfs2_super *osb,
|
|
|
trace_ocfs2_orphan_add_end((unsigned long long)OCFS2_I(inode)->ip_blkno,
|
|
|
osb->slot_num);
|
|
|
|
|
|
+rollback:
|
|
|
+ if (status < 0) {
|
|
|
+ if (S_ISDIR(inode->i_mode))
|
|
|
+ ocfs2_add_links_count(orphan_fe, -1);
|
|
|
+ set_nlink(orphan_dir_inode, ocfs2_read_links_count(orphan_fe));
|
|
|
+ }
|
|
|
+
|
|
|
leave:
|
|
|
brelse(orphan_dir_bh);
|
|
|
|
|
|
- if (status)
|
|
|
- mlog_errno(status);
|
|
|
return status;
|
|
|
}
|
|
|
|