Skip to content

Commit

Permalink
ocfs2: local mounts
Browse files Browse the repository at this point in the history
This allows users to format an ocfs2 file system with a special flag,
OCFS2_FEATURE_INCOMPAT_LOCAL_MOUNT. When the file system sees this flag, it
will not use any cluster services, nor will it require a cluster
configuration, thus acting like a 'local' file system.

Signed-off-by: Sunil Mushran <sunil.mushran@oracle.com>
Signed-off-by: Mark Fasheh <mark.fasheh@oracle.com>
  • Loading branch information
Sunil Mushran authored and Mark Fasheh committed Dec 8, 2006
1 parent c997679 commit c271c5c
Show file tree
Hide file tree
Showing 11 changed files with 193 additions and 66 deletions.
79 changes: 59 additions & 20 deletions fs/ocfs2/dlmglue.c
Original file line number Diff line number Diff line change
Expand Up @@ -770,7 +770,7 @@ static int ocfs2_lock_create(struct ocfs2_super *osb,
int dlm_flags)
{
int ret = 0;
enum dlm_status status;
enum dlm_status status = DLM_NORMAL;
unsigned long flags;

mlog_entry_void();
Expand Down Expand Up @@ -1138,6 +1138,7 @@ int ocfs2_rw_lock(struct inode *inode, int write)
{
int status, level;
struct ocfs2_lock_res *lockres;
struct ocfs2_super *osb = OCFS2_SB(inode->i_sb);

BUG_ON(!inode);

Expand All @@ -1147,6 +1148,9 @@ int ocfs2_rw_lock(struct inode *inode, int write)
(unsigned long long)OCFS2_I(inode)->ip_blkno,
write ? "EXMODE" : "PRMODE");

if (ocfs2_mount_local(osb))
return 0;

lockres = &OCFS2_I(inode)->ip_rw_lockres;

level = write ? LKM_EXMODE : LKM_PRMODE;
Expand All @@ -1164,14 +1168,16 @@ void ocfs2_rw_unlock(struct inode *inode, int write)
{
int level = write ? LKM_EXMODE : LKM_PRMODE;
struct ocfs2_lock_res *lockres = &OCFS2_I(inode)->ip_rw_lockres;
struct ocfs2_super *osb = OCFS2_SB(inode->i_sb);

mlog_entry_void();

mlog(0, "inode %llu drop %s RW lock\n",
(unsigned long long)OCFS2_I(inode)->ip_blkno,
write ? "EXMODE" : "PRMODE");

ocfs2_cluster_unlock(OCFS2_SB(inode->i_sb), lockres, level);
if (!ocfs2_mount_local(osb))
ocfs2_cluster_unlock(OCFS2_SB(inode->i_sb), lockres, level);

mlog_exit_void();
}
Expand All @@ -1182,6 +1188,7 @@ int ocfs2_data_lock_full(struct inode *inode,
{
int status = 0, level;
struct ocfs2_lock_res *lockres;
struct ocfs2_super *osb = OCFS2_SB(inode->i_sb);

BUG_ON(!inode);

Expand All @@ -1201,6 +1208,9 @@ int ocfs2_data_lock_full(struct inode *inode,
goto out;
}

if (ocfs2_mount_local(osb))
goto out;

lockres = &OCFS2_I(inode)->ip_data_lockres;

level = write ? LKM_EXMODE : LKM_PRMODE;
Expand Down Expand Up @@ -1269,14 +1279,16 @@ void ocfs2_data_unlock(struct inode *inode,
{
int level = write ? LKM_EXMODE : LKM_PRMODE;
struct ocfs2_lock_res *lockres = &OCFS2_I(inode)->ip_data_lockres;
struct ocfs2_super *osb = OCFS2_SB(inode->i_sb);

mlog_entry_void();

mlog(0, "inode %llu drop %s DATA lock\n",
(unsigned long long)OCFS2_I(inode)->ip_blkno,
write ? "EXMODE" : "PRMODE");

if (!ocfs2_is_hard_readonly(OCFS2_SB(inode->i_sb)))
if (!ocfs2_is_hard_readonly(OCFS2_SB(inode->i_sb)) &&
!ocfs2_mount_local(osb))
ocfs2_cluster_unlock(OCFS2_SB(inode->i_sb), lockres, level);

mlog_exit_void();
Expand Down Expand Up @@ -1467,8 +1479,9 @@ static int ocfs2_meta_lock_update(struct inode *inode,
{
int status = 0;
struct ocfs2_inode_info *oi = OCFS2_I(inode);
struct ocfs2_lock_res *lockres;
struct ocfs2_lock_res *lockres = NULL;
struct ocfs2_dinode *fe;
struct ocfs2_super *osb = OCFS2_SB(inode->i_sb);

mlog_entry_void();

Expand All @@ -1483,10 +1496,12 @@ static int ocfs2_meta_lock_update(struct inode *inode,
}
spin_unlock(&oi->ip_lock);

lockres = &oi->ip_meta_lockres;
if (!ocfs2_mount_local(osb)) {
lockres = &oi->ip_meta_lockres;

if (!ocfs2_should_refresh_lock_res(lockres))
goto bail;
if (!ocfs2_should_refresh_lock_res(lockres))
goto bail;
}

/* This will discard any caching information we might have had
* for the inode metadata. */
Expand All @@ -1496,7 +1511,7 @@ static int ocfs2_meta_lock_update(struct inode *inode,
* map (directories, bitmap files, etc) */
ocfs2_extent_map_trunc(inode, 0);

if (ocfs2_meta_lvb_is_trustable(inode, lockres)) {
if (lockres && ocfs2_meta_lvb_is_trustable(inode, lockres)) {
mlog(0, "Trusting LVB on inode %llu\n",
(unsigned long long)oi->ip_blkno);
ocfs2_refresh_inode_from_lvb(inode);
Expand Down Expand Up @@ -1543,7 +1558,8 @@ static int ocfs2_meta_lock_update(struct inode *inode,

status = 0;
bail_refresh:
ocfs2_complete_lock_res_refresh(lockres, status);
if (lockres)
ocfs2_complete_lock_res_refresh(lockres, status);
bail:
mlog_exit(status);
return status;
Expand Down Expand Up @@ -1585,7 +1601,7 @@ int ocfs2_meta_lock_full(struct inode *inode,
int arg_flags)
{
int status, level, dlm_flags, acquired;
struct ocfs2_lock_res *lockres;
struct ocfs2_lock_res *lockres = NULL;
struct ocfs2_super *osb = OCFS2_SB(inode->i_sb);
struct buffer_head *local_bh = NULL;

Expand All @@ -1607,6 +1623,9 @@ int ocfs2_meta_lock_full(struct inode *inode,
goto bail;
}

if (ocfs2_mount_local(osb))
goto local;

if (!(arg_flags & OCFS2_META_LOCK_RECOVERY))
wait_event(osb->recovery_event,
ocfs2_node_map_is_empty(osb, &osb->recovery_map));
Expand Down Expand Up @@ -1636,6 +1655,7 @@ int ocfs2_meta_lock_full(struct inode *inode,
wait_event(osb->recovery_event,
ocfs2_node_map_is_empty(osb, &osb->recovery_map));

local:
/*
* We only see this flag if we're being called from
* ocfs2_read_locked_inode(). It means we're locking an inode
Expand All @@ -1644,7 +1664,8 @@ int ocfs2_meta_lock_full(struct inode *inode,
*/
if (inode->i_state & I_NEW) {
status = 0;
ocfs2_complete_lock_res_refresh(lockres, 0);
if (lockres)
ocfs2_complete_lock_res_refresh(lockres, 0);
goto bail;
}

Expand Down Expand Up @@ -1767,14 +1788,16 @@ void ocfs2_meta_unlock(struct inode *inode,
{
int level = ex ? LKM_EXMODE : LKM_PRMODE;
struct ocfs2_lock_res *lockres = &OCFS2_I(inode)->ip_meta_lockres;
struct ocfs2_super *osb = OCFS2_SB(inode->i_sb);

mlog_entry_void();

mlog(0, "inode %llu drop %s META lock\n",
(unsigned long long)OCFS2_I(inode)->ip_blkno,
ex ? "EXMODE" : "PRMODE");

if (!ocfs2_is_hard_readonly(OCFS2_SB(inode->i_sb)))
if (!ocfs2_is_hard_readonly(OCFS2_SB(inode->i_sb)) &&
!ocfs2_mount_local(osb))
ocfs2_cluster_unlock(OCFS2_SB(inode->i_sb), lockres, level);

mlog_exit_void();
Expand All @@ -1783,7 +1806,7 @@ void ocfs2_meta_unlock(struct inode *inode,
int ocfs2_super_lock(struct ocfs2_super *osb,
int ex)
{
int status;
int status = 0;
int level = ex ? LKM_EXMODE : LKM_PRMODE;
struct ocfs2_lock_res *lockres = &osb->osb_super_lockres;
struct buffer_head *bh;
Expand All @@ -1794,6 +1817,9 @@ int ocfs2_super_lock(struct ocfs2_super *osb,
if (ocfs2_is_hard_readonly(osb))
return -EROFS;

if (ocfs2_mount_local(osb))
goto bail;

status = ocfs2_cluster_lock(osb, lockres, level, 0, 0);
if (status < 0) {
mlog_errno(status);
Expand Down Expand Up @@ -1832,7 +1858,8 @@ void ocfs2_super_unlock(struct ocfs2_super *osb,
int level = ex ? LKM_EXMODE : LKM_PRMODE;
struct ocfs2_lock_res *lockres = &osb->osb_super_lockres;

ocfs2_cluster_unlock(osb, lockres, level);
if (!ocfs2_mount_local(osb))
ocfs2_cluster_unlock(osb, lockres, level);
}

int ocfs2_rename_lock(struct ocfs2_super *osb)
Expand All @@ -1843,6 +1870,9 @@ int ocfs2_rename_lock(struct ocfs2_super *osb)
if (ocfs2_is_hard_readonly(osb))
return -EROFS;

if (ocfs2_mount_local(osb))
return 0;

status = ocfs2_cluster_lock(osb, lockres, LKM_EXMODE, 0, 0);
if (status < 0)
mlog_errno(status);
Expand All @@ -1854,7 +1884,8 @@ void ocfs2_rename_unlock(struct ocfs2_super *osb)
{
struct ocfs2_lock_res *lockres = &osb->osb_rename_lockres;

ocfs2_cluster_unlock(osb, lockres, LKM_EXMODE);
if (!ocfs2_mount_local(osb))
ocfs2_cluster_unlock(osb, lockres, LKM_EXMODE);
}

int ocfs2_dentry_lock(struct dentry *dentry, int ex)
Expand All @@ -1869,6 +1900,9 @@ int ocfs2_dentry_lock(struct dentry *dentry, int ex)
if (ocfs2_is_hard_readonly(osb))
return -EROFS;

if (ocfs2_mount_local(osb))
return 0;

ret = ocfs2_cluster_lock(osb, &dl->dl_lockres, level, 0, 0);
if (ret < 0)
mlog_errno(ret);
Expand All @@ -1882,7 +1916,8 @@ void ocfs2_dentry_unlock(struct dentry *dentry, int ex)
struct ocfs2_dentry_lock *dl = dentry->d_fsdata;
struct ocfs2_super *osb = OCFS2_SB(dentry->d_sb);

ocfs2_cluster_unlock(osb, &dl->dl_lockres, level);
if (!ocfs2_mount_local(osb))
ocfs2_cluster_unlock(osb, &dl->dl_lockres, level);
}

/* Reference counting of the dlm debug structure. We want this because
Expand Down Expand Up @@ -2145,12 +2180,15 @@ static void ocfs2_dlm_shutdown_debug(struct ocfs2_super *osb)

int ocfs2_dlm_init(struct ocfs2_super *osb)
{
int status;
int status = 0;
u32 dlm_key;
struct dlm_ctxt *dlm;
struct dlm_ctxt *dlm = NULL;

mlog_entry_void();

if (ocfs2_mount_local(osb))
goto local;

status = ocfs2_dlm_init_debug(osb);
if (status < 0) {
mlog_errno(status);
Expand Down Expand Up @@ -2178,11 +2216,12 @@ int ocfs2_dlm_init(struct ocfs2_super *osb)
goto bail;
}

dlm_register_eviction_cb(dlm, &osb->osb_eviction_cb);

local:
ocfs2_super_lock_res_init(&osb->osb_super_lockres, osb);
ocfs2_rename_lock_res_init(&osb->osb_rename_lockres, osb);

dlm_register_eviction_cb(dlm, &osb->osb_eviction_cb);

osb->dlm = dlm;

status = 0;
Expand Down
9 changes: 9 additions & 0 deletions fs/ocfs2/heartbeat.c
Original file line number Diff line number Diff line change
Expand Up @@ -154,6 +154,9 @@ int ocfs2_register_hb_callbacks(struct ocfs2_super *osb)
{
int status;

if (ocfs2_mount_local(osb))
return 0;

status = o2hb_register_callback(&osb->osb_hb_down);
if (status < 0) {
mlog_errno(status);
Expand All @@ -172,6 +175,9 @@ void ocfs2_clear_hb_callbacks(struct ocfs2_super *osb)
{
int status;

if (ocfs2_mount_local(osb))
return;

status = o2hb_unregister_callback(&osb->osb_hb_down);
if (status < 0)
mlog_errno(status);
Expand All @@ -186,6 +192,9 @@ void ocfs2_stop_heartbeat(struct ocfs2_super *osb)
int ret;
char *argv[5], *envp[3];

if (ocfs2_mount_local(osb))
return;

if (!osb->uuid_str) {
/* This can happen if we don't get far enough in mount... */
mlog(0, "No UUID with which to stop heartbeat!\n\n");
Expand Down
3 changes: 2 additions & 1 deletion fs/ocfs2/inode.c
Original file line number Diff line number Diff line change
Expand Up @@ -423,7 +423,8 @@ static int ocfs2_read_locked_inode(struct inode *inode,
* cluster lock before trusting anything anyway.
*/
can_lock = !(args->fi_flags & OCFS2_FI_FLAG_SYSFILE)
&& !(args->fi_flags & OCFS2_FI_FLAG_NOLOCK);
&& !(args->fi_flags & OCFS2_FI_FLAG_NOLOCK)
&& !ocfs2_mount_local(osb);

/*
* To maintain backwards compatibility with older versions of
Expand Down
46 changes: 33 additions & 13 deletions fs/ocfs2/journal.c
Original file line number Diff line number Diff line change
Expand Up @@ -144,8 +144,10 @@ handle_t *ocfs2_start_trans(struct ocfs2_super *osb, int max_buffs)
ocfs2_abort(osb->sb, "Detected aborted journal");
handle = ERR_PTR(-EROFS);
}
} else
atomic_inc(&(osb->journal->j_num_trans));
} else {
if (!ocfs2_mount_local(osb))
atomic_inc(&(osb->journal->j_num_trans));
}

return handle;
}
Expand Down Expand Up @@ -507,9 +509,23 @@ void ocfs2_journal_shutdown(struct ocfs2_super *osb)

BUG_ON(atomic_read(&(osb->journal->j_num_trans)) != 0);

status = ocfs2_journal_toggle_dirty(osb, 0);
if (status < 0)
mlog_errno(status);
if (ocfs2_mount_local(osb)) {
journal_lock_updates(journal->j_journal);
status = journal_flush(journal->j_journal);
journal_unlock_updates(journal->j_journal);
if (status < 0)
mlog_errno(status);
}

if (status == 0) {
/*
* Do not toggle if flush was unsuccessful otherwise
* will leave dirty metadata in a "clean" journal
*/
status = ocfs2_journal_toggle_dirty(osb, 0);
if (status < 0)
mlog_errno(status);
}

/* Shutdown the kernel journal system */
journal_destroy(journal->j_journal);
Expand Down Expand Up @@ -549,7 +565,7 @@ static void ocfs2_clear_journal_error(struct super_block *sb,
}
}

int ocfs2_journal_load(struct ocfs2_journal *journal)
int ocfs2_journal_load(struct ocfs2_journal *journal, int local)
{
int status = 0;
struct ocfs2_super *osb;
Expand All @@ -576,14 +592,18 @@ int ocfs2_journal_load(struct ocfs2_journal *journal)
}

/* Launch the commit thread */
osb->commit_task = kthread_run(ocfs2_commit_thread, osb, "ocfs2cmt");
if (IS_ERR(osb->commit_task)) {
status = PTR_ERR(osb->commit_task);
if (!local) {
osb->commit_task = kthread_run(ocfs2_commit_thread, osb,
"ocfs2cmt");
if (IS_ERR(osb->commit_task)) {
status = PTR_ERR(osb->commit_task);
osb->commit_task = NULL;
mlog(ML_ERROR, "unable to launch ocfs2commit thread, "
"error=%d", status);
goto done;
}
} else
osb->commit_task = NULL;
mlog(ML_ERROR, "unable to launch ocfs2commit thread, error=%d",
status);
goto done;
}

done:
mlog_exit(status);
Expand Down
Loading

0 comments on commit c271c5c

Please sign in to comment.