|
@@ -770,7 +770,7 @@ static int ocfs2_lock_create(struct ocfs2_super *osb,
|
|
int dlm_flags)
|
|
int dlm_flags)
|
|
{
|
|
{
|
|
int ret = 0;
|
|
int ret = 0;
|
|
- enum dlm_status status;
|
|
|
|
|
|
+ enum dlm_status status = DLM_NORMAL;
|
|
unsigned long flags;
|
|
unsigned long flags;
|
|
|
|
|
|
mlog_entry_void();
|
|
mlog_entry_void();
|
|
@@ -1138,6 +1138,7 @@ int ocfs2_rw_lock(struct inode *inode, int write)
|
|
{
|
|
{
|
|
int status, level;
|
|
int status, level;
|
|
struct ocfs2_lock_res *lockres;
|
|
struct ocfs2_lock_res *lockres;
|
|
|
|
+ struct ocfs2_super *osb = OCFS2_SB(inode->i_sb);
|
|
|
|
|
|
BUG_ON(!inode);
|
|
BUG_ON(!inode);
|
|
|
|
|
|
@@ -1147,6 +1148,9 @@ int ocfs2_rw_lock(struct inode *inode, int write)
|
|
(unsigned long long)OCFS2_I(inode)->ip_blkno,
|
|
(unsigned long long)OCFS2_I(inode)->ip_blkno,
|
|
write ? "EXMODE" : "PRMODE");
|
|
write ? "EXMODE" : "PRMODE");
|
|
|
|
|
|
|
|
+ if (ocfs2_mount_local(osb))
|
|
|
|
+ return 0;
|
|
|
|
+
|
|
lockres = &OCFS2_I(inode)->ip_rw_lockres;
|
|
lockres = &OCFS2_I(inode)->ip_rw_lockres;
|
|
|
|
|
|
level = write ? LKM_EXMODE : LKM_PRMODE;
|
|
level = write ? LKM_EXMODE : LKM_PRMODE;
|
|
@@ -1164,6 +1168,7 @@ void ocfs2_rw_unlock(struct inode *inode, int write)
|
|
{
|
|
{
|
|
int level = write ? LKM_EXMODE : LKM_PRMODE;
|
|
int level = write ? LKM_EXMODE : LKM_PRMODE;
|
|
struct ocfs2_lock_res *lockres = &OCFS2_I(inode)->ip_rw_lockres;
|
|
struct ocfs2_lock_res *lockres = &OCFS2_I(inode)->ip_rw_lockres;
|
|
|
|
+ struct ocfs2_super *osb = OCFS2_SB(inode->i_sb);
|
|
|
|
|
|
mlog_entry_void();
|
|
mlog_entry_void();
|
|
|
|
|
|
@@ -1171,7 +1176,8 @@ void ocfs2_rw_unlock(struct inode *inode, int write)
|
|
(unsigned long long)OCFS2_I(inode)->ip_blkno,
|
|
(unsigned long long)OCFS2_I(inode)->ip_blkno,
|
|
write ? "EXMODE" : "PRMODE");
|
|
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();
|
|
mlog_exit_void();
|
|
}
|
|
}
|
|
@@ -1182,6 +1188,7 @@ int ocfs2_data_lock_full(struct inode *inode,
|
|
{
|
|
{
|
|
int status = 0, level;
|
|
int status = 0, level;
|
|
struct ocfs2_lock_res *lockres;
|
|
struct ocfs2_lock_res *lockres;
|
|
|
|
+ struct ocfs2_super *osb = OCFS2_SB(inode->i_sb);
|
|
|
|
|
|
BUG_ON(!inode);
|
|
BUG_ON(!inode);
|
|
|
|
|
|
@@ -1201,6 +1208,9 @@ int ocfs2_data_lock_full(struct inode *inode,
|
|
goto out;
|
|
goto out;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ if (ocfs2_mount_local(osb))
|
|
|
|
+ goto out;
|
|
|
|
+
|
|
lockres = &OCFS2_I(inode)->ip_data_lockres;
|
|
lockres = &OCFS2_I(inode)->ip_data_lockres;
|
|
|
|
|
|
level = write ? LKM_EXMODE : LKM_PRMODE;
|
|
level = write ? LKM_EXMODE : LKM_PRMODE;
|
|
@@ -1269,6 +1279,7 @@ void ocfs2_data_unlock(struct inode *inode,
|
|
{
|
|
{
|
|
int level = write ? LKM_EXMODE : LKM_PRMODE;
|
|
int level = write ? LKM_EXMODE : LKM_PRMODE;
|
|
struct ocfs2_lock_res *lockres = &OCFS2_I(inode)->ip_data_lockres;
|
|
struct ocfs2_lock_res *lockres = &OCFS2_I(inode)->ip_data_lockres;
|
|
|
|
+ struct ocfs2_super *osb = OCFS2_SB(inode->i_sb);
|
|
|
|
|
|
mlog_entry_void();
|
|
mlog_entry_void();
|
|
|
|
|
|
@@ -1276,7 +1287,8 @@ void ocfs2_data_unlock(struct inode *inode,
|
|
(unsigned long long)OCFS2_I(inode)->ip_blkno,
|
|
(unsigned long long)OCFS2_I(inode)->ip_blkno,
|
|
write ? "EXMODE" : "PRMODE");
|
|
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);
|
|
ocfs2_cluster_unlock(OCFS2_SB(inode->i_sb), lockres, level);
|
|
|
|
|
|
mlog_exit_void();
|
|
mlog_exit_void();
|
|
@@ -1467,8 +1479,9 @@ static int ocfs2_meta_lock_update(struct inode *inode,
|
|
{
|
|
{
|
|
int status = 0;
|
|
int status = 0;
|
|
struct ocfs2_inode_info *oi = OCFS2_I(inode);
|
|
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_dinode *fe;
|
|
|
|
+ struct ocfs2_super *osb = OCFS2_SB(inode->i_sb);
|
|
|
|
|
|
mlog_entry_void();
|
|
mlog_entry_void();
|
|
|
|
|
|
@@ -1483,10 +1496,12 @@ static int ocfs2_meta_lock_update(struct inode *inode,
|
|
}
|
|
}
|
|
spin_unlock(&oi->ip_lock);
|
|
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
|
|
/* This will discard any caching information we might have had
|
|
* for the inode metadata. */
|
|
* for the inode metadata. */
|
|
@@ -1496,7 +1511,7 @@ static int ocfs2_meta_lock_update(struct inode *inode,
|
|
* map (directories, bitmap files, etc) */
|
|
* map (directories, bitmap files, etc) */
|
|
ocfs2_extent_map_trunc(inode, 0);
|
|
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",
|
|
mlog(0, "Trusting LVB on inode %llu\n",
|
|
(unsigned long long)oi->ip_blkno);
|
|
(unsigned long long)oi->ip_blkno);
|
|
ocfs2_refresh_inode_from_lvb(inode);
|
|
ocfs2_refresh_inode_from_lvb(inode);
|
|
@@ -1543,7 +1558,8 @@ static int ocfs2_meta_lock_update(struct inode *inode,
|
|
|
|
|
|
status = 0;
|
|
status = 0;
|
|
bail_refresh:
|
|
bail_refresh:
|
|
- ocfs2_complete_lock_res_refresh(lockres, status);
|
|
|
|
|
|
+ if (lockres)
|
|
|
|
+ ocfs2_complete_lock_res_refresh(lockres, status);
|
|
bail:
|
|
bail:
|
|
mlog_exit(status);
|
|
mlog_exit(status);
|
|
return status;
|
|
return status;
|
|
@@ -1585,7 +1601,7 @@ int ocfs2_meta_lock_full(struct inode *inode,
|
|
int arg_flags)
|
|
int arg_flags)
|
|
{
|
|
{
|
|
int status, level, dlm_flags, acquired;
|
|
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 ocfs2_super *osb = OCFS2_SB(inode->i_sb);
|
|
struct buffer_head *local_bh = NULL;
|
|
struct buffer_head *local_bh = NULL;
|
|
|
|
|
|
@@ -1607,6 +1623,9 @@ int ocfs2_meta_lock_full(struct inode *inode,
|
|
goto bail;
|
|
goto bail;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ if (ocfs2_mount_local(osb))
|
|
|
|
+ goto local;
|
|
|
|
+
|
|
if (!(arg_flags & OCFS2_META_LOCK_RECOVERY))
|
|
if (!(arg_flags & OCFS2_META_LOCK_RECOVERY))
|
|
wait_event(osb->recovery_event,
|
|
wait_event(osb->recovery_event,
|
|
ocfs2_node_map_is_empty(osb, &osb->recovery_map));
|
|
ocfs2_node_map_is_empty(osb, &osb->recovery_map));
|
|
@@ -1636,6 +1655,7 @@ int ocfs2_meta_lock_full(struct inode *inode,
|
|
wait_event(osb->recovery_event,
|
|
wait_event(osb->recovery_event,
|
|
ocfs2_node_map_is_empty(osb, &osb->recovery_map));
|
|
ocfs2_node_map_is_empty(osb, &osb->recovery_map));
|
|
|
|
|
|
|
|
+local:
|
|
/*
|
|
/*
|
|
* We only see this flag if we're being called from
|
|
* We only see this flag if we're being called from
|
|
* ocfs2_read_locked_inode(). It means we're locking an inode
|
|
* ocfs2_read_locked_inode(). It means we're locking an inode
|
|
@@ -1644,7 +1664,8 @@ int ocfs2_meta_lock_full(struct inode *inode,
|
|
*/
|
|
*/
|
|
if (inode->i_state & I_NEW) {
|
|
if (inode->i_state & I_NEW) {
|
|
status = 0;
|
|
status = 0;
|
|
- ocfs2_complete_lock_res_refresh(lockres, 0);
|
|
|
|
|
|
+ if (lockres)
|
|
|
|
+ ocfs2_complete_lock_res_refresh(lockres, 0);
|
|
goto bail;
|
|
goto bail;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -1767,6 +1788,7 @@ void ocfs2_meta_unlock(struct inode *inode,
|
|
{
|
|
{
|
|
int level = ex ? LKM_EXMODE : LKM_PRMODE;
|
|
int level = ex ? LKM_EXMODE : LKM_PRMODE;
|
|
struct ocfs2_lock_res *lockres = &OCFS2_I(inode)->ip_meta_lockres;
|
|
struct ocfs2_lock_res *lockres = &OCFS2_I(inode)->ip_meta_lockres;
|
|
|
|
+ struct ocfs2_super *osb = OCFS2_SB(inode->i_sb);
|
|
|
|
|
|
mlog_entry_void();
|
|
mlog_entry_void();
|
|
|
|
|
|
@@ -1774,7 +1796,8 @@ void ocfs2_meta_unlock(struct inode *inode,
|
|
(unsigned long long)OCFS2_I(inode)->ip_blkno,
|
|
(unsigned long long)OCFS2_I(inode)->ip_blkno,
|
|
ex ? "EXMODE" : "PRMODE");
|
|
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);
|
|
ocfs2_cluster_unlock(OCFS2_SB(inode->i_sb), lockres, level);
|
|
|
|
|
|
mlog_exit_void();
|
|
mlog_exit_void();
|
|
@@ -1783,7 +1806,7 @@ void ocfs2_meta_unlock(struct inode *inode,
|
|
int ocfs2_super_lock(struct ocfs2_super *osb,
|
|
int ocfs2_super_lock(struct ocfs2_super *osb,
|
|
int ex)
|
|
int ex)
|
|
{
|
|
{
|
|
- int status;
|
|
|
|
|
|
+ int status = 0;
|
|
int level = ex ? LKM_EXMODE : LKM_PRMODE;
|
|
int level = ex ? LKM_EXMODE : LKM_PRMODE;
|
|
struct ocfs2_lock_res *lockres = &osb->osb_super_lockres;
|
|
struct ocfs2_lock_res *lockres = &osb->osb_super_lockres;
|
|
struct buffer_head *bh;
|
|
struct buffer_head *bh;
|
|
@@ -1794,6 +1817,9 @@ int ocfs2_super_lock(struct ocfs2_super *osb,
|
|
if (ocfs2_is_hard_readonly(osb))
|
|
if (ocfs2_is_hard_readonly(osb))
|
|
return -EROFS;
|
|
return -EROFS;
|
|
|
|
|
|
|
|
+ if (ocfs2_mount_local(osb))
|
|
|
|
+ goto bail;
|
|
|
|
+
|
|
status = ocfs2_cluster_lock(osb, lockres, level, 0, 0);
|
|
status = ocfs2_cluster_lock(osb, lockres, level, 0, 0);
|
|
if (status < 0) {
|
|
if (status < 0) {
|
|
mlog_errno(status);
|
|
mlog_errno(status);
|
|
@@ -1832,7 +1858,8 @@ void ocfs2_super_unlock(struct ocfs2_super *osb,
|
|
int level = ex ? LKM_EXMODE : LKM_PRMODE;
|
|
int level = ex ? LKM_EXMODE : LKM_PRMODE;
|
|
struct ocfs2_lock_res *lockres = &osb->osb_super_lockres;
|
|
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)
|
|
int ocfs2_rename_lock(struct ocfs2_super *osb)
|
|
@@ -1843,6 +1870,9 @@ int ocfs2_rename_lock(struct ocfs2_super *osb)
|
|
if (ocfs2_is_hard_readonly(osb))
|
|
if (ocfs2_is_hard_readonly(osb))
|
|
return -EROFS;
|
|
return -EROFS;
|
|
|
|
|
|
|
|
+ if (ocfs2_mount_local(osb))
|
|
|
|
+ return 0;
|
|
|
|
+
|
|
status = ocfs2_cluster_lock(osb, lockres, LKM_EXMODE, 0, 0);
|
|
status = ocfs2_cluster_lock(osb, lockres, LKM_EXMODE, 0, 0);
|
|
if (status < 0)
|
|
if (status < 0)
|
|
mlog_errno(status);
|
|
mlog_errno(status);
|
|
@@ -1854,7 +1884,8 @@ void ocfs2_rename_unlock(struct ocfs2_super *osb)
|
|
{
|
|
{
|
|
struct ocfs2_lock_res *lockres = &osb->osb_rename_lockres;
|
|
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)
|
|
int ocfs2_dentry_lock(struct dentry *dentry, int ex)
|
|
@@ -1869,6 +1900,9 @@ int ocfs2_dentry_lock(struct dentry *dentry, int ex)
|
|
if (ocfs2_is_hard_readonly(osb))
|
|
if (ocfs2_is_hard_readonly(osb))
|
|
return -EROFS;
|
|
return -EROFS;
|
|
|
|
|
|
|
|
+ if (ocfs2_mount_local(osb))
|
|
|
|
+ return 0;
|
|
|
|
+
|
|
ret = ocfs2_cluster_lock(osb, &dl->dl_lockres, level, 0, 0);
|
|
ret = ocfs2_cluster_lock(osb, &dl->dl_lockres, level, 0, 0);
|
|
if (ret < 0)
|
|
if (ret < 0)
|
|
mlog_errno(ret);
|
|
mlog_errno(ret);
|
|
@@ -1882,7 +1916,8 @@ void ocfs2_dentry_unlock(struct dentry *dentry, int ex)
|
|
struct ocfs2_dentry_lock *dl = dentry->d_fsdata;
|
|
struct ocfs2_dentry_lock *dl = dentry->d_fsdata;
|
|
struct ocfs2_super *osb = OCFS2_SB(dentry->d_sb);
|
|
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
|
|
/* Reference counting of the dlm debug structure. We want this because
|
|
@@ -2145,12 +2180,15 @@ static void ocfs2_dlm_shutdown_debug(struct ocfs2_super *osb)
|
|
|
|
|
|
int ocfs2_dlm_init(struct ocfs2_super *osb)
|
|
int ocfs2_dlm_init(struct ocfs2_super *osb)
|
|
{
|
|
{
|
|
- int status;
|
|
|
|
|
|
+ int status = 0;
|
|
u32 dlm_key;
|
|
u32 dlm_key;
|
|
- struct dlm_ctxt *dlm;
|
|
|
|
|
|
+ struct dlm_ctxt *dlm = NULL;
|
|
|
|
|
|
mlog_entry_void();
|
|
mlog_entry_void();
|
|
|
|
|
|
|
|
+ if (ocfs2_mount_local(osb))
|
|
|
|
+ goto local;
|
|
|
|
+
|
|
status = ocfs2_dlm_init_debug(osb);
|
|
status = ocfs2_dlm_init_debug(osb);
|
|
if (status < 0) {
|
|
if (status < 0) {
|
|
mlog_errno(status);
|
|
mlog_errno(status);
|
|
@@ -2178,11 +2216,12 @@ int ocfs2_dlm_init(struct ocfs2_super *osb)
|
|
goto bail;
|
|
goto bail;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ dlm_register_eviction_cb(dlm, &osb->osb_eviction_cb);
|
|
|
|
+
|
|
|
|
+local:
|
|
ocfs2_super_lock_res_init(&osb->osb_super_lockres, osb);
|
|
ocfs2_super_lock_res_init(&osb->osb_super_lockres, osb);
|
|
ocfs2_rename_lock_res_init(&osb->osb_rename_lockres, osb);
|
|
ocfs2_rename_lock_res_init(&osb->osb_rename_lockres, osb);
|
|
|
|
|
|
- dlm_register_eviction_cb(dlm, &osb->osb_eviction_cb);
|
|
|
|
-
|
|
|
|
osb->dlm = dlm;
|
|
osb->dlm = dlm;
|
|
|
|
|
|
status = 0;
|
|
status = 0;
|