aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMark Fasheh <mark.fasheh@oracle.com>2007-10-18 18:23:46 -0400
committerMark Fasheh <mark.fasheh@oracle.com>2008-01-25 17:45:57 -0500
commitc934a92d05b549dd2f25db72c5fc3cb9dcf1b611 (patch)
tree57150c87d1d465db28fceaa14c9d5b220c7a3954
parentf1f540688eae66c274ff1c1133b5d9c687b28f58 (diff)
ocfs2: Remove data locks
The meta lock now covers both meta data and data, so this just removes the now-redundant data lock. Combining locks saves us a round of lock mastery per inode and one less lock to ping between nodes during read/write. We don't lose much - since meta locks were always held before a data lock (and at the same level) ordered writeout mode (the default) ensured that flushing for the meta data lock also pushed out data anyways. Signed-off-by: Mark Fasheh <mark.fasheh@oracle.com>
-rw-r--r--fs/ocfs2/aops.c44
-rw-r--r--fs/ocfs2/cluster/tcp_internal.h5
-rw-r--r--fs/ocfs2/dlmglue.c104
-rw-r--r--fs/ocfs2/dlmglue.h11
-rw-r--r--fs/ocfs2/file.c55
-rw-r--r--fs/ocfs2/inode.c6
-rw-r--r--fs/ocfs2/inode.h1
-rw-r--r--fs/ocfs2/mmap.c9
-rw-r--r--fs/ocfs2/super.c1
9 files changed, 22 insertions, 214 deletions
diff --git a/fs/ocfs2/aops.c b/fs/ocfs2/aops.c
index 56f7790cad46..5fc27cfaee50 100644
--- a/fs/ocfs2/aops.c
+++ b/fs/ocfs2/aops.c
@@ -305,21 +305,12 @@ static int ocfs2_readpage(struct file *file, struct page *page)
305 goto out_alloc; 305 goto out_alloc;
306 } 306 }
307 307
308 ret = ocfs2_data_lock_with_page(inode, 0, page);
309 if (ret != 0) {
310 if (ret == AOP_TRUNCATED_PAGE)
311 unlock = 0;
312 mlog_errno(ret);
313 goto out_alloc;
314 }
315
316 if (oi->ip_dyn_features & OCFS2_INLINE_DATA_FL) 308 if (oi->ip_dyn_features & OCFS2_INLINE_DATA_FL)
317 ret = ocfs2_readpage_inline(inode, page); 309 ret = ocfs2_readpage_inline(inode, page);
318 else 310 else
319 ret = block_read_full_page(page, ocfs2_get_block); 311 ret = block_read_full_page(page, ocfs2_get_block);
320 unlock = 0; 312 unlock = 0;
321 313
322 ocfs2_data_unlock(inode, 0);
323out_alloc: 314out_alloc:
324 up_read(&OCFS2_I(inode)->ip_alloc_sem); 315 up_read(&OCFS2_I(inode)->ip_alloc_sem);
325out_meta_unlock: 316out_meta_unlock:
@@ -638,34 +629,12 @@ static ssize_t ocfs2_direct_IO(int rw,
638 if (OCFS2_I(inode)->ip_dyn_features & OCFS2_INLINE_DATA_FL) 629 if (OCFS2_I(inode)->ip_dyn_features & OCFS2_INLINE_DATA_FL)
639 return 0; 630 return 0;
640 631
641 if (!ocfs2_sparse_alloc(OCFS2_SB(inode->i_sb))) {
642 /*
643 * We get PR data locks even for O_DIRECT. This
644 * allows concurrent O_DIRECT I/O but doesn't let
645 * O_DIRECT with extending and buffered zeroing writes
646 * race. If they did race then the buffered zeroing
647 * could be written back after the O_DIRECT I/O. It's
648 * one thing to tell people not to mix buffered and
649 * O_DIRECT writes, but expecting them to understand
650 * that file extension is also an implicit buffered
651 * write is too much. By getting the PR we force
652 * writeback of the buffered zeroing before
653 * proceeding.
654 */
655 ret = ocfs2_data_lock(inode, 0);
656 if (ret < 0) {
657 mlog_errno(ret);
658 goto out;
659 }
660 ocfs2_data_unlock(inode, 0);
661 }
662
663 ret = blockdev_direct_IO_no_locking(rw, iocb, inode, 632 ret = blockdev_direct_IO_no_locking(rw, iocb, inode,
664 inode->i_sb->s_bdev, iov, offset, 633 inode->i_sb->s_bdev, iov, offset,
665 nr_segs, 634 nr_segs,
666 ocfs2_direct_IO_get_blocks, 635 ocfs2_direct_IO_get_blocks,
667 ocfs2_dio_end_io); 636 ocfs2_dio_end_io);
668out: 637
669 mlog_exit(ret); 638 mlog_exit(ret);
670 return ret; 639 return ret;
671} 640}
@@ -1769,25 +1738,17 @@ static int ocfs2_write_begin(struct file *file, struct address_space *mapping,
1769 */ 1738 */
1770 down_write(&OCFS2_I(inode)->ip_alloc_sem); 1739 down_write(&OCFS2_I(inode)->ip_alloc_sem);
1771 1740
1772 ret = ocfs2_data_lock(inode, 1);
1773 if (ret) {
1774 mlog_errno(ret);
1775 goto out_fail;
1776 }
1777
1778 ret = ocfs2_write_begin_nolock(mapping, pos, len, flags, pagep, 1741 ret = ocfs2_write_begin_nolock(mapping, pos, len, flags, pagep,
1779 fsdata, di_bh, NULL); 1742 fsdata, di_bh, NULL);
1780 if (ret) { 1743 if (ret) {
1781 mlog_errno(ret); 1744 mlog_errno(ret);
1782 goto out_fail_data; 1745 goto out_fail;
1783 } 1746 }
1784 1747
1785 brelse(di_bh); 1748 brelse(di_bh);
1786 1749
1787 return 0; 1750 return 0;
1788 1751
1789out_fail_data:
1790 ocfs2_data_unlock(inode, 1);
1791out_fail: 1752out_fail:
1792 up_write(&OCFS2_I(inode)->ip_alloc_sem); 1753 up_write(&OCFS2_I(inode)->ip_alloc_sem);
1793 1754
@@ -1908,7 +1869,6 @@ static int ocfs2_write_end(struct file *file, struct address_space *mapping,
1908 1869
1909 ret = ocfs2_write_end_nolock(mapping, pos, len, copied, page, fsdata); 1870 ret = ocfs2_write_end_nolock(mapping, pos, len, copied, page, fsdata);
1910 1871
1911 ocfs2_data_unlock(inode, 1);
1912 up_write(&OCFS2_I(inode)->ip_alloc_sem); 1872 up_write(&OCFS2_I(inode)->ip_alloc_sem);
1913 ocfs2_meta_unlock(inode, 1); 1873 ocfs2_meta_unlock(inode, 1);
1914 1874
diff --git a/fs/ocfs2/cluster/tcp_internal.h b/fs/ocfs2/cluster/tcp_internal.h
index 79bd6665b3ca..b2e832aca567 100644
--- a/fs/ocfs2/cluster/tcp_internal.h
+++ b/fs/ocfs2/cluster/tcp_internal.h
@@ -38,6 +38,9 @@
38 * locking semantics of the file system using the protocol. It should 38 * locking semantics of the file system using the protocol. It should
39 * be somewhere else, I'm sure, but right now it isn't. 39 * be somewhere else, I'm sure, but right now it isn't.
40 * 40 *
41 * New in version 10:
42 * - Meta/data locks combined
43 *
41 * New in version 9: 44 * New in version 9:
42 * - All votes removed 45 * - All votes removed
43 * 46 *
@@ -63,7 +66,7 @@
63 * - full 64 bit i_size in the metadata lock lvbs 66 * - full 64 bit i_size in the metadata lock lvbs
64 * - introduction of "rw" lock and pushing meta/data locking down 67 * - introduction of "rw" lock and pushing meta/data locking down
65 */ 68 */
66#define O2NET_PROTOCOL_VERSION 9ULL 69#define O2NET_PROTOCOL_VERSION 10ULL
67struct o2net_handshake { 70struct o2net_handshake {
68 __be64 protocol_version; 71 __be64 protocol_version;
69 __be64 connector_id; 72 __be64 connector_id;
diff --git a/fs/ocfs2/dlmglue.c b/fs/ocfs2/dlmglue.c
index 7e36abea8f40..ecf58c6e2fa3 100644
--- a/fs/ocfs2/dlmglue.c
+++ b/fs/ocfs2/dlmglue.c
@@ -232,12 +232,6 @@ static struct ocfs2_lock_res_ops ocfs2_inode_meta_lops = {
232 .flags = LOCK_TYPE_REQUIRES_REFRESH|LOCK_TYPE_USES_LVB, 232 .flags = LOCK_TYPE_REQUIRES_REFRESH|LOCK_TYPE_USES_LVB,
233}; 233};
234 234
235static struct ocfs2_lock_res_ops ocfs2_inode_data_lops = {
236 .get_osb = ocfs2_get_inode_osb,
237 .downconvert_worker = ocfs2_data_convert_worker,
238 .flags = 0,
239};
240
241static struct ocfs2_lock_res_ops ocfs2_super_lops = { 235static struct ocfs2_lock_res_ops ocfs2_super_lops = {
242 .flags = LOCK_TYPE_REQUIRES_REFRESH, 236 .flags = LOCK_TYPE_REQUIRES_REFRESH,
243}; 237};
@@ -261,7 +255,6 @@ static struct ocfs2_lock_res_ops ocfs2_inode_open_lops = {
261static inline int ocfs2_is_inode_lock(struct ocfs2_lock_res *lockres) 255static inline int ocfs2_is_inode_lock(struct ocfs2_lock_res *lockres)
262{ 256{
263 return lockres->l_type == OCFS2_LOCK_TYPE_META || 257 return lockres->l_type == OCFS2_LOCK_TYPE_META ||
264 lockres->l_type == OCFS2_LOCK_TYPE_DATA ||
265 lockres->l_type == OCFS2_LOCK_TYPE_RW || 258 lockres->l_type == OCFS2_LOCK_TYPE_RW ||
266 lockres->l_type == OCFS2_LOCK_TYPE_OPEN; 259 lockres->l_type == OCFS2_LOCK_TYPE_OPEN;
267} 260}
@@ -405,9 +398,6 @@ void ocfs2_inode_lock_res_init(struct ocfs2_lock_res *res,
405 case OCFS2_LOCK_TYPE_META: 398 case OCFS2_LOCK_TYPE_META:
406 ops = &ocfs2_inode_meta_lops; 399 ops = &ocfs2_inode_meta_lops;
407 break; 400 break;
408 case OCFS2_LOCK_TYPE_DATA:
409 ops = &ocfs2_inode_data_lops;
410 break;
411 case OCFS2_LOCK_TYPE_OPEN: 401 case OCFS2_LOCK_TYPE_OPEN:
412 ops = &ocfs2_inode_open_lops; 402 ops = &ocfs2_inode_open_lops;
413 break; 403 break;
@@ -1154,12 +1144,6 @@ int ocfs2_create_new_inode_locks(struct inode *inode)
1154 goto bail; 1144 goto bail;
1155 } 1145 }
1156 1146
1157 ret = ocfs2_create_new_lock(osb, &OCFS2_I(inode)->ip_data_lockres, 1, 1);
1158 if (ret) {
1159 mlog_errno(ret);
1160 goto bail;
1161 }
1162
1163 ret = ocfs2_create_new_lock(osb, &OCFS2_I(inode)->ip_open_lockres, 0, 0); 1147 ret = ocfs2_create_new_lock(osb, &OCFS2_I(inode)->ip_open_lockres, 0, 0);
1164 if (ret) { 1148 if (ret) {
1165 mlog_errno(ret); 1149 mlog_errno(ret);
@@ -1312,67 +1296,6 @@ out:
1312 mlog_exit_void(); 1296 mlog_exit_void();
1313} 1297}
1314 1298
1315int ocfs2_data_lock_full(struct inode *inode,
1316 int write,
1317 int arg_flags)
1318{
1319 int status = 0, level;
1320 struct ocfs2_lock_res *lockres;
1321 struct ocfs2_super *osb = OCFS2_SB(inode->i_sb);
1322
1323 BUG_ON(!inode);
1324
1325 mlog_entry_void();
1326
1327 mlog(0, "inode %llu take %s DATA lock\n",
1328 (unsigned long long)OCFS2_I(inode)->ip_blkno,
1329 write ? "EXMODE" : "PRMODE");
1330
1331 /* We'll allow faking a readonly data lock for
1332 * rodevices. */
1333 if (ocfs2_is_hard_readonly(OCFS2_SB(inode->i_sb))) {
1334 if (write) {
1335 status = -EROFS;
1336 mlog_errno(status);
1337 }
1338 goto out;
1339 }
1340
1341 if (ocfs2_mount_local(osb))
1342 goto out;
1343
1344 lockres = &OCFS2_I(inode)->ip_data_lockres;
1345
1346 level = write ? LKM_EXMODE : LKM_PRMODE;
1347
1348 status = ocfs2_cluster_lock(OCFS2_SB(inode->i_sb), lockres, level,
1349 0, arg_flags);
1350 if (status < 0 && status != -EAGAIN)
1351 mlog_errno(status);
1352
1353out:
1354 mlog_exit(status);
1355 return status;
1356}
1357
1358/* see ocfs2_meta_lock_with_page() */
1359int ocfs2_data_lock_with_page(struct inode *inode,
1360 int write,
1361 struct page *page)
1362{
1363 int ret;
1364
1365 ret = ocfs2_data_lock_full(inode, write, OCFS2_LOCK_NONBLOCK);
1366 if (ret == -EAGAIN) {
1367 unlock_page(page);
1368 if (ocfs2_data_lock(inode, write) == 0)
1369 ocfs2_data_unlock(inode, write);
1370 ret = AOP_TRUNCATED_PAGE;
1371 }
1372
1373 return ret;
1374}
1375
1376static void ocfs2_downconvert_on_unlock(struct ocfs2_super *osb, 1299static void ocfs2_downconvert_on_unlock(struct ocfs2_super *osb,
1377 struct ocfs2_lock_res *lockres) 1300 struct ocfs2_lock_res *lockres)
1378{ 1301{
@@ -1404,26 +1327,6 @@ static void ocfs2_downconvert_on_unlock(struct ocfs2_super *osb,
1404 mlog_exit_void(); 1327 mlog_exit_void();
1405} 1328}
1406 1329
1407void ocfs2_data_unlock(struct inode *inode,
1408 int write)
1409{
1410 int level = write ? LKM_EXMODE : LKM_PRMODE;
1411 struct ocfs2_lock_res *lockres = &OCFS2_I(inode)->ip_data_lockres;
1412 struct ocfs2_super *osb = OCFS2_SB(inode->i_sb);
1413
1414 mlog_entry_void();
1415
1416 mlog(0, "inode %llu drop %s DATA lock\n",
1417 (unsigned long long)OCFS2_I(inode)->ip_blkno,
1418 write ? "EXMODE" : "PRMODE");
1419
1420 if (!ocfs2_is_hard_readonly(OCFS2_SB(inode->i_sb)) &&
1421 !ocfs2_mount_local(osb))
1422 ocfs2_cluster_unlock(OCFS2_SB(inode->i_sb), lockres, level);
1423
1424 mlog_exit_void();
1425}
1426
1427#define OCFS2_SEC_BITS 34 1330#define OCFS2_SEC_BITS 34
1428#define OCFS2_SEC_SHIFT (64 - 34) 1331#define OCFS2_SEC_SHIFT (64 - 34)
1429#define OCFS2_NSEC_MASK ((1ULL << OCFS2_SEC_SHIFT) - 1) 1332#define OCFS2_NSEC_MASK ((1ULL << OCFS2_SEC_SHIFT) - 1)
@@ -2592,13 +2495,6 @@ int ocfs2_drop_inode_locks(struct inode *inode)
2592 status = err; 2495 status = err;
2593 2496
2594 err = ocfs2_drop_lock(OCFS2_SB(inode->i_sb), 2497 err = ocfs2_drop_lock(OCFS2_SB(inode->i_sb),
2595 &OCFS2_I(inode)->ip_data_lockres);
2596 if (err < 0)
2597 mlog_errno(err);
2598 if (err < 0 && !status)
2599 status = err;
2600
2601 err = ocfs2_drop_lock(OCFS2_SB(inode->i_sb),
2602 &OCFS2_I(inode)->ip_meta_lockres); 2498 &OCFS2_I(inode)->ip_meta_lockres);
2603 if (err < 0) 2499 if (err < 0)
2604 mlog_errno(err); 2500 mlog_errno(err);
diff --git a/fs/ocfs2/dlmglue.h b/fs/ocfs2/dlmglue.h
index 931f6ee55146..3fd7729daeef 100644
--- a/fs/ocfs2/dlmglue.h
+++ b/fs/ocfs2/dlmglue.h
@@ -49,7 +49,7 @@ struct ocfs2_meta_lvb {
49 __be32 lvb_reserved2; 49 __be32 lvb_reserved2;
50}; 50};
51 51
52/* ocfs2_meta_lock_full() and ocfs2_data_lock_full() 'arg_flags' flags */ 52/* ocfs2_meta_lock_full() 'arg_flags' flags */
53/* don't wait on recovery. */ 53/* don't wait on recovery. */
54#define OCFS2_META_LOCK_RECOVERY (0x01) 54#define OCFS2_META_LOCK_RECOVERY (0x01)
55/* Instruct the dlm not to queue ourselves on the other node. */ 55/* Instruct the dlm not to queue ourselves on the other node. */
@@ -69,15 +69,6 @@ void ocfs2_dentry_lock_res_init(struct ocfs2_dentry_lock *dl,
69void ocfs2_lock_res_free(struct ocfs2_lock_res *res); 69void ocfs2_lock_res_free(struct ocfs2_lock_res *res);
70int ocfs2_create_new_inode_locks(struct inode *inode); 70int ocfs2_create_new_inode_locks(struct inode *inode);
71int ocfs2_drop_inode_locks(struct inode *inode); 71int ocfs2_drop_inode_locks(struct inode *inode);
72int ocfs2_data_lock_full(struct inode *inode,
73 int write,
74 int arg_flags);
75#define ocfs2_data_lock(inode, write) ocfs2_data_lock_full(inode, write, 0)
76int ocfs2_data_lock_with_page(struct inode *inode,
77 int write,
78 struct page *page);
79void ocfs2_data_unlock(struct inode *inode,
80 int write);
81int ocfs2_rw_lock(struct inode *inode, int write); 72int ocfs2_rw_lock(struct inode *inode, int write);
82void ocfs2_rw_unlock(struct inode *inode, int write); 73void ocfs2_rw_unlock(struct inode *inode, int write);
83int ocfs2_open_lock(struct inode *inode); 74int ocfs2_open_lock(struct inode *inode);
diff --git a/fs/ocfs2/file.c b/fs/ocfs2/file.c
index b75b2e1f0e42..c5c183ac41fe 100644
--- a/fs/ocfs2/file.c
+++ b/fs/ocfs2/file.c
@@ -382,18 +382,13 @@ static int ocfs2_truncate_file(struct inode *inode,
382 382
383 down_write(&OCFS2_I(inode)->ip_alloc_sem); 383 down_write(&OCFS2_I(inode)->ip_alloc_sem);
384 384
385 /* This forces other nodes to sync and drop their pages. Do 385 /*
386 * this even if we have a truncate without allocation change - 386 * The inode lock forced other nodes to sync and drop their
387 * ocfs2 cluster sizes can be much greater than page size, so 387 * pages, which (correctly) happens even if we have a truncate
388 * we have to truncate them anyway. */ 388 * without allocation change - ocfs2 cluster sizes can be much
389 status = ocfs2_data_lock(inode, 1); 389 * greater than page size, so we have to truncate them
390 if (status < 0) { 390 * anyway.
391 up_write(&OCFS2_I(inode)->ip_alloc_sem); 391 */
392
393 mlog_errno(status);
394 goto bail;
395 }
396
397 unmap_mapping_range(inode->i_mapping, new_i_size + PAGE_SIZE - 1, 0, 1); 392 unmap_mapping_range(inode->i_mapping, new_i_size + PAGE_SIZE - 1, 0, 1);
398 truncate_inode_pages(inode->i_mapping, new_i_size); 393 truncate_inode_pages(inode->i_mapping, new_i_size);
399 394
@@ -403,7 +398,7 @@ static int ocfs2_truncate_file(struct inode *inode,
403 if (status) 398 if (status)
404 mlog_errno(status); 399 mlog_errno(status);
405 400
406 goto bail_unlock_data; 401 goto bail_unlock_sem;
407 } 402 }
408 403
409 /* alright, we're going to need to do a full blown alloc size 404 /* alright, we're going to need to do a full blown alloc size
@@ -413,25 +408,23 @@ static int ocfs2_truncate_file(struct inode *inode,
413 status = ocfs2_orphan_for_truncate(osb, inode, di_bh, new_i_size); 408 status = ocfs2_orphan_for_truncate(osb, inode, di_bh, new_i_size);
414 if (status < 0) { 409 if (status < 0) {
415 mlog_errno(status); 410 mlog_errno(status);
416 goto bail_unlock_data; 411 goto bail_unlock_sem;
417 } 412 }
418 413
419 status = ocfs2_prepare_truncate(osb, inode, di_bh, &tc); 414 status = ocfs2_prepare_truncate(osb, inode, di_bh, &tc);
420 if (status < 0) { 415 if (status < 0) {
421 mlog_errno(status); 416 mlog_errno(status);
422 goto bail_unlock_data; 417 goto bail_unlock_sem;
423 } 418 }
424 419
425 status = ocfs2_commit_truncate(osb, inode, di_bh, tc); 420 status = ocfs2_commit_truncate(osb, inode, di_bh, tc);
426 if (status < 0) { 421 if (status < 0) {
427 mlog_errno(status); 422 mlog_errno(status);
428 goto bail_unlock_data; 423 goto bail_unlock_sem;
429 } 424 }
430 425
431 /* TODO: orphan dir cleanup here. */ 426 /* TODO: orphan dir cleanup here. */
432bail_unlock_data: 427bail_unlock_sem:
433 ocfs2_data_unlock(inode, 1);
434
435 up_write(&OCFS2_I(inode)->ip_alloc_sem); 428 up_write(&OCFS2_I(inode)->ip_alloc_sem);
436 429
437bail: 430bail:
@@ -917,7 +910,7 @@ static int ocfs2_extend_file(struct inode *inode,
917 struct buffer_head *di_bh, 910 struct buffer_head *di_bh,
918 u64 new_i_size) 911 u64 new_i_size)
919{ 912{
920 int ret = 0, data_locked = 0; 913 int ret = 0;
921 struct ocfs2_inode_info *oi = OCFS2_I(inode); 914 struct ocfs2_inode_info *oi = OCFS2_I(inode);
922 915
923 BUG_ON(!di_bh); 916 BUG_ON(!di_bh);
@@ -943,20 +936,6 @@ static int ocfs2_extend_file(struct inode *inode,
943 && ocfs2_sparse_alloc(OCFS2_SB(inode->i_sb))) 936 && ocfs2_sparse_alloc(OCFS2_SB(inode->i_sb)))
944 goto out_update_size; 937 goto out_update_size;
945 938
946 /*
947 * protect the pages that ocfs2_zero_extend is going to be
948 * pulling into the page cache.. we do this before the
949 * metadata extend so that we don't get into the situation
950 * where we've extended the metadata but can't get the data
951 * lock to zero.
952 */
953 ret = ocfs2_data_lock(inode, 1);
954 if (ret < 0) {
955 mlog_errno(ret);
956 goto out;
957 }
958 data_locked = 1;
959
960 /* 939 /*
961 * The alloc sem blocks people in read/write from reading our 940 * The alloc sem blocks people in read/write from reading our
962 * allocation until we're done changing it. We depend on 941 * allocation until we're done changing it. We depend on
@@ -980,7 +959,7 @@ static int ocfs2_extend_file(struct inode *inode,
980 up_write(&oi->ip_alloc_sem); 959 up_write(&oi->ip_alloc_sem);
981 960
982 mlog_errno(ret); 961 mlog_errno(ret);
983 goto out_unlock; 962 goto out;
984 } 963 }
985 } 964 }
986 965
@@ -991,7 +970,7 @@ static int ocfs2_extend_file(struct inode *inode,
991 970
992 if (ret < 0) { 971 if (ret < 0) {
993 mlog_errno(ret); 972 mlog_errno(ret);
994 goto out_unlock; 973 goto out;
995 } 974 }
996 975
997out_update_size: 976out_update_size:
@@ -999,10 +978,6 @@ out_update_size:
999 if (ret < 0) 978 if (ret < 0)
1000 mlog_errno(ret); 979 mlog_errno(ret);
1001 980
1002out_unlock:
1003 if (data_locked)
1004 ocfs2_data_unlock(inode, 1);
1005
1006out: 981out:
1007 return ret; 982 return ret;
1008} 983}
diff --git a/fs/ocfs2/inode.c b/fs/ocfs2/inode.c
index 86cf073996b5..8ff201d3705e 100644
--- a/fs/ocfs2/inode.c
+++ b/fs/ocfs2/inode.c
@@ -332,10 +332,6 @@ int ocfs2_populate_inode(struct inode *inode, struct ocfs2_dinode *fe,
332 OCFS2_LOCK_TYPE_RW, inode->i_generation, 332 OCFS2_LOCK_TYPE_RW, inode->i_generation,
333 inode); 333 inode);
334 334
335 ocfs2_inode_lock_res_init(&OCFS2_I(inode)->ip_data_lockres,
336 OCFS2_LOCK_TYPE_DATA, inode->i_generation,
337 inode);
338
339 ocfs2_set_inode_flags(inode); 335 ocfs2_set_inode_flags(inode);
340 336
341 status = 0; 337 status = 0;
@@ -1014,7 +1010,6 @@ void ocfs2_clear_inode(struct inode *inode)
1014 * the downconvert thread while waiting to destroy the locks. */ 1010 * the downconvert thread while waiting to destroy the locks. */
1015 ocfs2_mark_lockres_freeing(&oi->ip_rw_lockres); 1011 ocfs2_mark_lockres_freeing(&oi->ip_rw_lockres);
1016 ocfs2_mark_lockres_freeing(&oi->ip_meta_lockres); 1012 ocfs2_mark_lockres_freeing(&oi->ip_meta_lockres);
1017 ocfs2_mark_lockres_freeing(&oi->ip_data_lockres);
1018 ocfs2_mark_lockres_freeing(&oi->ip_open_lockres); 1013 ocfs2_mark_lockres_freeing(&oi->ip_open_lockres);
1019 1014
1020 /* We very well may get a clear_inode before all an inodes 1015 /* We very well may get a clear_inode before all an inodes
@@ -1038,7 +1033,6 @@ void ocfs2_clear_inode(struct inode *inode)
1038 1033
1039 ocfs2_lock_res_free(&oi->ip_rw_lockres); 1034 ocfs2_lock_res_free(&oi->ip_rw_lockres);
1040 ocfs2_lock_res_free(&oi->ip_meta_lockres); 1035 ocfs2_lock_res_free(&oi->ip_meta_lockres);
1041 ocfs2_lock_res_free(&oi->ip_data_lockres);
1042 ocfs2_lock_res_free(&oi->ip_open_lockres); 1036 ocfs2_lock_res_free(&oi->ip_open_lockres);
1043 1037
1044 ocfs2_metadata_cache_purge(inode); 1038 ocfs2_metadata_cache_purge(inode);
diff --git a/fs/ocfs2/inode.h b/fs/ocfs2/inode.h
index 70e881c55536..d1c54da687c9 100644
--- a/fs/ocfs2/inode.h
+++ b/fs/ocfs2/inode.h
@@ -35,7 +35,6 @@ struct ocfs2_inode_info
35 35
36 struct ocfs2_lock_res ip_rw_lockres; 36 struct ocfs2_lock_res ip_rw_lockres;
37 struct ocfs2_lock_res ip_meta_lockres; 37 struct ocfs2_lock_res ip_meta_lockres;
38 struct ocfs2_lock_res ip_data_lockres;
39 struct ocfs2_lock_res ip_open_lockres; 38 struct ocfs2_lock_res ip_open_lockres;
40 39
41 /* protects allocation changes on this inode. */ 40 /* protects allocation changes on this inode. */
diff --git a/fs/ocfs2/mmap.c b/fs/ocfs2/mmap.c
index 98756156d298..a7f0ccc6fdd8 100644
--- a/fs/ocfs2/mmap.c
+++ b/fs/ocfs2/mmap.c
@@ -181,17 +181,8 @@ static int ocfs2_page_mkwrite(struct vm_area_struct *vma, struct page *page)
181 */ 181 */
182 down_write(&OCFS2_I(inode)->ip_alloc_sem); 182 down_write(&OCFS2_I(inode)->ip_alloc_sem);
183 183
184 ret = ocfs2_data_lock(inode, 1);
185 if (ret < 0) {
186 mlog_errno(ret);
187 goto out_meta_unlock;
188 }
189
190 ret = __ocfs2_page_mkwrite(inode, di_bh, page); 184 ret = __ocfs2_page_mkwrite(inode, di_bh, page);
191 185
192 ocfs2_data_unlock(inode, 1);
193
194out_meta_unlock:
195 up_write(&OCFS2_I(inode)->ip_alloc_sem); 186 up_write(&OCFS2_I(inode)->ip_alloc_sem);
196 187
197 brelse(di_bh); 188 brelse(di_bh);
diff --git a/fs/ocfs2/super.c b/fs/ocfs2/super.c
index 1996820488cc..064eba074f1e 100644
--- a/fs/ocfs2/super.c
+++ b/fs/ocfs2/super.c
@@ -1020,7 +1020,6 @@ static void ocfs2_inode_init_once(struct kmem_cache *cachep, void *data)
1020 1020
1021 ocfs2_lock_res_init_once(&oi->ip_rw_lockres); 1021 ocfs2_lock_res_init_once(&oi->ip_rw_lockres);
1022 ocfs2_lock_res_init_once(&oi->ip_meta_lockres); 1022 ocfs2_lock_res_init_once(&oi->ip_meta_lockres);
1023 ocfs2_lock_res_init_once(&oi->ip_data_lockres);
1024 ocfs2_lock_res_init_once(&oi->ip_open_lockres); 1023 ocfs2_lock_res_init_once(&oi->ip_open_lockres);
1025 1024
1026 ocfs2_metadata_cache_init(&oi->vfs_inode); 1025 ocfs2_metadata_cache_init(&oi->vfs_inode);