Commit 3939fda4 authored by Tristan Ye's avatar Tristan Ye Committed by Joel Becker

Ocfs2: Journaling i_flags and i_orphaned_slot when adding inode to orphan dir.

Currently, some callers were missing to journal the dirty inode after
adding it to orphan dir.

Now we're going to journal such modifications within the ocfs2_orphan_add()
itself, It's safe to do so, though some existing caller may duplicate this,
and it makes the logic look more straightforward anyway.
Signed-off-by: default avatarTristan Ye <tristan.ye@oracle.com>
Signed-off-by: default avatarJoel Becker <joel.becker@oracle.com>
parent b4414eea
...@@ -84,7 +84,7 @@ static int ocfs2_prepare_orphan_dir(struct ocfs2_super *osb, ...@@ -84,7 +84,7 @@ static int ocfs2_prepare_orphan_dir(struct ocfs2_super *osb,
static int ocfs2_orphan_add(struct ocfs2_super *osb, static int ocfs2_orphan_add(struct ocfs2_super *osb,
handle_t *handle, handle_t *handle,
struct inode *inode, struct inode *inode,
struct ocfs2_dinode *fe, struct buffer_head *fe_bh,
char *name, char *name,
struct ocfs2_dir_lookup_result *lookup, struct ocfs2_dir_lookup_result *lookup,
struct inode *orphan_dir_inode); struct inode *orphan_dir_inode);
...@@ -879,7 +879,7 @@ static int ocfs2_unlink(struct inode *dir, ...@@ -879,7 +879,7 @@ static int ocfs2_unlink(struct inode *dir,
fe = (struct ocfs2_dinode *) fe_bh->b_data; fe = (struct ocfs2_dinode *) fe_bh->b_data;
if (inode_is_unlinkable(inode)) { if (inode_is_unlinkable(inode)) {
status = ocfs2_orphan_add(osb, handle, inode, fe, orphan_name, status = ocfs2_orphan_add(osb, handle, inode, fe_bh, orphan_name,
&orphan_insert, orphan_dir); &orphan_insert, orphan_dir);
if (status < 0) { if (status < 0) {
mlog_errno(status); mlog_errno(status);
...@@ -1300,7 +1300,7 @@ static int ocfs2_rename(struct inode *old_dir, ...@@ -1300,7 +1300,7 @@ static int ocfs2_rename(struct inode *old_dir,
if (S_ISDIR(new_inode->i_mode) || if (S_ISDIR(new_inode->i_mode) ||
(ocfs2_read_links_count(newfe) == 1)) { (ocfs2_read_links_count(newfe) == 1)) {
status = ocfs2_orphan_add(osb, handle, new_inode, status = ocfs2_orphan_add(osb, handle, new_inode,
newfe, orphan_name, newfe_bh, orphan_name,
&orphan_insert, orphan_dir); &orphan_insert, orphan_dir);
if (status < 0) { if (status < 0) {
mlog_errno(status); mlog_errno(status);
...@@ -1911,7 +1911,7 @@ static int ocfs2_prepare_orphan_dir(struct ocfs2_super *osb, ...@@ -1911,7 +1911,7 @@ static int ocfs2_prepare_orphan_dir(struct ocfs2_super *osb,
static int ocfs2_orphan_add(struct ocfs2_super *osb, static int ocfs2_orphan_add(struct ocfs2_super *osb,
handle_t *handle, handle_t *handle,
struct inode *inode, struct inode *inode,
struct ocfs2_dinode *fe, struct buffer_head *fe_bh,
char *name, char *name,
struct ocfs2_dir_lookup_result *lookup, struct ocfs2_dir_lookup_result *lookup,
struct inode *orphan_dir_inode) struct inode *orphan_dir_inode)
...@@ -1919,6 +1919,7 @@ static int ocfs2_orphan_add(struct ocfs2_super *osb, ...@@ -1919,6 +1919,7 @@ static int ocfs2_orphan_add(struct ocfs2_super *osb,
struct buffer_head *orphan_dir_bh = NULL; struct buffer_head *orphan_dir_bh = NULL;
int status = 0; int status = 0;
struct ocfs2_dinode *orphan_fe; struct ocfs2_dinode *orphan_fe;
struct ocfs2_dinode *fe = (struct ocfs2_dinode *) fe_bh->b_data;
mlog_entry("(inode->i_ino = %lu)\n", inode->i_ino); mlog_entry("(inode->i_ino = %lu)\n", inode->i_ino);
...@@ -1959,6 +1960,21 @@ static int ocfs2_orphan_add(struct ocfs2_super *osb, ...@@ -1959,6 +1960,21 @@ static int ocfs2_orphan_add(struct ocfs2_super *osb,
goto leave; 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;
}
le32_add_cpu(&fe->i_flags, OCFS2_ORPHANED_FL); le32_add_cpu(&fe->i_flags, OCFS2_ORPHANED_FL);
/* Record which orphan dir our inode now resides /* Record which orphan dir our inode now resides
...@@ -1966,6 +1982,8 @@ static int ocfs2_orphan_add(struct ocfs2_super *osb, ...@@ -1966,6 +1982,8 @@ static int ocfs2_orphan_add(struct ocfs2_super *osb,
* dir to lock. */ * dir to lock. */
fe->i_orphaned_slot = cpu_to_le16(osb->slot_num); fe->i_orphaned_slot = cpu_to_le16(osb->slot_num);
ocfs2_journal_dirty(handle, fe_bh);
mlog(0, "Inode %llu orphaned in slot %d\n", mlog(0, "Inode %llu orphaned in slot %d\n",
(unsigned long long)OCFS2_I(inode)->ip_blkno, osb->slot_num); (unsigned long long)OCFS2_I(inode)->ip_blkno, osb->slot_num);
...@@ -2123,7 +2141,7 @@ int ocfs2_create_inode_in_orphan(struct inode *dir, ...@@ -2123,7 +2141,7 @@ int ocfs2_create_inode_in_orphan(struct inode *dir,
} }
di = (struct ocfs2_dinode *)new_di_bh->b_data; di = (struct ocfs2_dinode *)new_di_bh->b_data;
status = ocfs2_orphan_add(osb, handle, inode, di, orphan_name, status = ocfs2_orphan_add(osb, handle, inode, new_di_bh, orphan_name,
&orphan_insert, orphan_dir); &orphan_insert, orphan_dir);
if (status < 0) { if (status < 0) {
mlog_errno(status); mlog_errno(status);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment