diff --git a/fs/ocfs2/acl.c b/fs/ocfs2/acl.c index 62464d194da3..d92eda1303f9 100644 --- a/fs/ocfs2/acl.c +++ b/fs/ocfs2/acl.c @@ -309,9 +309,9 @@ struct posix_acl *ocfs2_iop_get_acl(struct inode *inode, int type, bool rcu) if (had_lock < 0) return ERR_PTR(had_lock); - down_read(&OCFS2_I(inode)->ip_xattr_sem); + ocfs2_down_read(OCFS2_I(inode)); acl = ocfs2_get_acl_nolock(inode, type, di_bh); - up_read(&OCFS2_I(inode)->ip_xattr_sem); + ocfs2_up_read(OCFS2_I(inode)); ocfs2_inode_unlock_tracker(inode, 0, &oh, had_lock); brelse(di_bh); @@ -330,9 +330,9 @@ int ocfs2_acl_chmod(struct inode *inode, struct buffer_head *bh) if (!(osb->s_mount_opt & OCFS2_MOUNT_POSIX_ACL)) return 0; - down_read(&OCFS2_I(inode)->ip_xattr_sem); + ocfs2_down_read(OCFS2_I(inode)); acl = ocfs2_get_acl_nolock(inode, ACL_TYPE_ACCESS, bh); - up_read(&OCFS2_I(inode)->ip_xattr_sem); + ocfs2_up_read(OCFS2_I(inode)); if (IS_ERR_OR_NULL(acl)) return PTR_ERR_OR_ZERO(acl); ret = __posix_acl_chmod(&acl, GFP_KERNEL, inode->i_mode); @@ -363,10 +363,10 @@ int ocfs2_init_acl(handle_t *handle, if (!S_ISLNK(inode->i_mode)) { if (osb->s_mount_opt & OCFS2_MOUNT_POSIX_ACL) { - down_read(&OCFS2_I(dir)->ip_xattr_sem); + ocfs2_down_read(OCFS2_I(dir)); acl = ocfs2_get_acl_nolock(dir, ACL_TYPE_DEFAULT, dir_bh); - up_read(&OCFS2_I(dir)->ip_xattr_sem); + ocfs2_up_read(OCFS2_I(dir)); if (IS_ERR(acl)) return PTR_ERR(acl); } diff --git a/fs/ocfs2/aops.c b/fs/ocfs2/aops.c index 40b6bce12951..a96a1d0e51fa 100644 --- a/fs/ocfs2/aops.c +++ b/fs/ocfs2/aops.c @@ -117,9 +117,9 @@ static int ocfs2_lock_get_block(struct inode *inode, sector_t iblock, int ret = 0; struct ocfs2_inode_info *oi = OCFS2_I(inode); - down_read(&oi->ip_alloc_sem); + ocfs2_down_read(oi); ret = ocfs2_get_block(inode, iblock, bh_result, create); - up_read(&oi->ip_alloc_sem); + ocfs2_up_read(oi); return ret; } @@ -276,7 +276,7 @@ static int ocfs2_read_folio(struct file *file, struct folio *folio) goto out; } - if (down_read_trylock(&oi->ip_alloc_sem) == 0) { + if (ocfs2_down_read_trylock(oi) == 0) { /* * Unlock the folio and cycle ip_alloc_sem so that we don't * busyloop waiting for ip_alloc_sem to unlock @@ -284,8 +284,8 @@ static int ocfs2_read_folio(struct file *file, struct folio *folio) ret = AOP_TRUNCATED_PAGE; folio_unlock(folio); unlock = 0; - down_read(&oi->ip_alloc_sem); - up_read(&oi->ip_alloc_sem); + ocfs2_down_read(oi); + ocfs2_up_read(oi); goto out_inode_unlock; } @@ -313,7 +313,7 @@ static int ocfs2_read_folio(struct file *file, struct folio *folio) unlock = 0; out_alloc: - up_read(&oi->ip_alloc_sem); + ocfs2_up_read(oi); out_inode_unlock: ocfs2_inode_unlock(inode, 0); out: @@ -345,7 +345,7 @@ static void ocfs2_readahead(struct readahead_control *rac) if (ret) return; - if (down_read_trylock(&oi->ip_alloc_sem) == 0) + if (ocfs2_down_read_trylock(oi) == 0) goto out_unlock; /* @@ -365,7 +365,7 @@ static void ocfs2_readahead(struct readahead_control *rac) mpage_readahead(rac, ocfs2_get_block); out_up: - up_read(&oi->ip_alloc_sem); + ocfs2_up_read(oi); out_unlock: ocfs2_inode_unlock(inode, 0); } @@ -452,7 +452,7 @@ static sector_t ocfs2_bmap(struct address_space *mapping, sector_t block) mlog_errno(err); goto bail; } - down_read(&OCFS2_I(inode)->ip_alloc_sem); + ocfs2_down_read(OCFS2_I(inode)); } if (!(OCFS2_I(inode)->ip_dyn_features & OCFS2_INLINE_DATA_FL)) @@ -460,7 +460,7 @@ static sector_t ocfs2_bmap(struct address_space *mapping, sector_t block) NULL); if (!INODE_JOURNAL(inode)) { - up_read(&OCFS2_I(inode)->ip_alloc_sem); + ocfs2_up_read(OCFS2_I(inode)); ocfs2_inode_unlock(inode, 0); } @@ -1877,7 +1877,7 @@ static int ocfs2_write_begin(struct file *file, struct address_space *mapping, * should also serve to lock out allocation from a shared * writeable region. */ - down_write(&OCFS2_I(inode)->ip_alloc_sem); + ocfs2_down_write(OCFS2_I(inode)); ret = ocfs2_write_begin_nolock(mapping, pos, len, OCFS2_WRITE_BUFFER, foliop, fsdata, di_bh, NULL); @@ -1891,7 +1891,7 @@ static int ocfs2_write_begin(struct file *file, struct address_space *mapping, return 0; out_fail: - up_write(&OCFS2_I(inode)->ip_alloc_sem); + ocfs2_up_write(OCFS2_I(inode)); brelse(di_bh); ocfs2_inode_unlock(inode, 1); @@ -2056,7 +2056,7 @@ static int ocfs2_write_end(struct file *file, struct address_space *mapping, ret = ocfs2_write_end_nolock(mapping, pos, len, copied, fsdata); - up_write(&OCFS2_I(inode)->ip_alloc_sem); + ocfs2_up_write(OCFS2_I(inode)); ocfs2_inode_unlock(inode, 1); return ret; @@ -2194,7 +2194,7 @@ static int ocfs2_dio_wr_get_block(struct inode *inode, sector_t iblock, goto out; } - down_write(&oi->ip_alloc_sem); + ocfs2_down_write(oi); if (first_get_block) { if (ocfs2_sparse_alloc(osb)) @@ -2252,7 +2252,7 @@ static int ocfs2_dio_wr_get_block(struct inode *inode, sector_t iblock, BUG_ON(ret != len); ret = 0; unlock: - up_write(&oi->ip_alloc_sem); + ocfs2_up_write(oi); ocfs2_inode_unlock(inode, 1); brelse(di_bh); out: @@ -2292,7 +2292,7 @@ static int ocfs2_dio_end_io_write(struct inode *inode, goto out; } - down_write(&oi->ip_alloc_sem); + ocfs2_down_write(oi); /* Delete orphan before acquire i_rwsem. */ if (dwc->dw_orphaned) { @@ -2362,7 +2362,7 @@ static int ocfs2_dio_end_io_write(struct inode *inode, commit: ocfs2_commit_trans(osb, handle); unlock: - up_write(&oi->ip_alloc_sem); + ocfs2_up_write(oi); ocfs2_inode_unlock(inode, 1); brelse(di_bh); out: diff --git a/fs/ocfs2/dir.c b/fs/ocfs2/dir.c index 7799f4d16ce9..6d4b2b4ce878 100644 --- a/fs/ocfs2/dir.c +++ b/fs/ocfs2/dir.c @@ -2815,7 +2815,7 @@ static int ocfs2_expand_inline_dir(struct inode *dir, struct buffer_head *di_bh, alloc = ocfs2_clusters_for_bytes(sb, bytes); dx_alloc = 0; - down_write(&oi->ip_alloc_sem); + ocfs2_down_write(oi); if (ocfs2_supports_indexed_dirs(osb)) { credits += ocfs2_add_dir_index_credits(sb); @@ -3084,7 +3084,7 @@ static int ocfs2_expand_inline_dir(struct inode *dir, struct buffer_head *di_bh, ocfs2_commit_trans(osb, handle); out: - up_write(&oi->ip_alloc_sem); + ocfs2_up_write(oi); if (data_ac) ocfs2_free_alloc_context(data_ac); if (meta_ac) @@ -3227,14 +3227,14 @@ static int ocfs2_extend_dir(struct ocfs2_super *osb, brelse(new_bh); new_bh = NULL; - down_write(&OCFS2_I(dir)->ip_alloc_sem); + ocfs2_down_write(OCFS2_I(dir)); drop_alloc_sem = 1; dir_i_size = i_size_read(dir); credits = OCFS2_SIMPLE_DIR_EXTEND_CREDITS; goto do_extend; } - down_write(&OCFS2_I(dir)->ip_alloc_sem); + ocfs2_down_write(OCFS2_I(dir)); drop_alloc_sem = 1; dir_i_size = i_size_read(dir); trace_ocfs2_extend_dir((unsigned long long)OCFS2_I(dir)->ip_blkno, @@ -3345,7 +3345,7 @@ static int ocfs2_extend_dir(struct ocfs2_super *osb, if (handle) ocfs2_commit_trans(osb, handle); if (drop_alloc_sem) - up_write(&OCFS2_I(dir)->ip_alloc_sem); + ocfs2_up_write(OCFS2_I(dir)); if (data_ac) ocfs2_free_alloc_context(data_ac); diff --git a/fs/ocfs2/extent_map.c b/fs/ocfs2/extent_map.c index 930150ed5db1..02815aa64848 100644 --- a/fs/ocfs2/extent_map.c +++ b/fs/ocfs2/extent_map.c @@ -762,7 +762,7 @@ int ocfs2_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo, goto out; } - down_read(&OCFS2_I(inode)->ip_alloc_sem); + ocfs2_down_read(OCFS2_I(inode)); /* * Handle inline-data and fast symlink separately. @@ -817,7 +817,7 @@ int ocfs2_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo, out_unlock: brelse(di_bh); - up_read(&OCFS2_I(inode)->ip_alloc_sem); + ocfs2_up_read(OCFS2_I(inode)); ocfs2_inode_unlock(inode, 0); out: @@ -888,7 +888,7 @@ int ocfs2_seek_data_hole_offset(struct file *file, loff_t *offset, int whence) goto out; } - down_read(&OCFS2_I(inode)->ip_alloc_sem); + ocfs2_down_read(OCFS2_I(inode)); if (*offset >= i_size_read(inode)) { ret = -ENXIO; @@ -956,7 +956,7 @@ int ocfs2_seek_data_hole_offset(struct file *file, loff_t *offset, int whence) brelse(di_bh); - up_read(&OCFS2_I(inode)->ip_alloc_sem); + ocfs2_up_read(OCFS2_I(inode)); ocfs2_inode_unlock(inode, 0); out: @@ -983,7 +983,7 @@ int ocfs2_read_virt_blocks(struct inode *inode, u64 v_block, int nr, } while (done < nr) { - if (!down_read_trylock(&OCFS2_I(inode)->ip_alloc_sem)) { + if (!ocfs2_down_read_trylock(OCFS2_I(inode))) { rc = -EAGAIN; mlog(ML_ERROR, "Inode #%llu ip_alloc_sem is temporarily unavailable\n", @@ -992,7 +992,7 @@ int ocfs2_read_virt_blocks(struct inode *inode, u64 v_block, int nr, } rc = ocfs2_extent_map_get_blocks(inode, v_block + done, &p_block, &p_count, NULL); - up_read(&OCFS2_I(inode)->ip_alloc_sem); + ocfs2_up_read(OCFS2_I(inode)); if (rc) { mlog_errno(rc); break; diff --git a/fs/ocfs2/file.c b/fs/ocfs2/file.c index 2056cf08ac1e..3d897238d3c4 100644 --- a/fs/ocfs2/file.c +++ b/fs/ocfs2/file.c @@ -468,7 +468,7 @@ int ocfs2_truncate_file(struct inode *inode, goto bail; } - down_write(&OCFS2_I(inode)->ip_alloc_sem); + ocfs2_down_write(OCFS2_I(inode)); ocfs2_resv_discard(&osb->osb_la_resmap, &OCFS2_I(inode)->ip_la_data_resv); @@ -514,7 +514,7 @@ int ocfs2_truncate_file(struct inode *inode, /* TODO: orphan dir cleanup here. */ bail_unlock_sem: - up_write(&OCFS2_I(inode)->ip_alloc_sem); + ocfs2_up_write(OCFS2_I(inode)); bail: if (!status && OCFS2_I(inode)->ip_clusters == 0) @@ -1069,7 +1069,7 @@ static int ocfs2_extend_file(struct inode *inode, * here. We even have to hold it for sparse files because there * might be some tail zeroing. */ - down_write(&oi->ip_alloc_sem); + ocfs2_down_write(oi); if (oi->ip_dyn_features & OCFS2_INLINE_DATA_FL) { /* @@ -1077,13 +1077,13 @@ static int ocfs2_extend_file(struct inode *inode, * inline data. */ if (ocfs2_size_fits_inline_data(di_bh, new_i_size)) { - up_write(&oi->ip_alloc_sem); + ocfs2_up_write(oi); goto out_update_size; } ret = ocfs2_convert_inline_data_to_extents(inode, di_bh); if (ret) { - up_write(&oi->ip_alloc_sem); + ocfs2_up_write(oi); mlog_errno(ret); goto out; } @@ -1095,7 +1095,7 @@ static int ocfs2_extend_file(struct inode *inode, ret = ocfs2_extend_no_holes(inode, di_bh, new_i_size, new_i_size); - up_write(&oi->ip_alloc_sem); + ocfs2_up_write(oi); if (ret < 0) { mlog_errno(ret); @@ -1247,7 +1247,7 @@ int ocfs2_setattr(struct mnt_idmap *idmap, struct dentry *dentry, goto bail_unlock; } } - down_write(&OCFS2_I(inode)->ip_alloc_sem); + ocfs2_down_write(OCFS2_I(inode)); handle = ocfs2_start_trans(osb, OCFS2_INODE_UPDATE_CREDITS + 2 * ocfs2_quota_trans_credits(sb)); if (IS_ERR(handle)) { @@ -1259,7 +1259,7 @@ int ocfs2_setattr(struct mnt_idmap *idmap, struct dentry *dentry, if (status < 0) goto bail_commit; } else { - down_write(&OCFS2_I(inode)->ip_alloc_sem); + ocfs2_down_write(OCFS2_I(inode)); handle = ocfs2_start_trans(osb, OCFS2_INODE_UPDATE_CREDITS); if (IS_ERR(handle)) { status = PTR_ERR(handle); @@ -1278,7 +1278,7 @@ int ocfs2_setattr(struct mnt_idmap *idmap, struct dentry *dentry, bail_commit: ocfs2_commit_trans(osb, handle); bail_unlock_alloc: - up_write(&OCFS2_I(inode)->ip_alloc_sem); + ocfs2_up_write(OCFS2_I(inode)); bail_unlock: if (status && inode_locked) { ocfs2_inode_unlock_tracker(inode, 1, &oh, had_lock); @@ -2012,7 +2012,7 @@ static int __ocfs2_change_file_space(struct file *file, struct inode *inode, } } - down_write(&OCFS2_I(inode)->ip_alloc_sem); + ocfs2_down_write(OCFS2_I(inode)); switch (cmd) { case OCFS2_IOC_RESVSP: case OCFS2_IOC_RESVSP64: @@ -2040,7 +2040,7 @@ static int __ocfs2_change_file_space(struct file *file, struct inode *inode, if (!ret) i_size_write(inode, size); } - up_write(&OCFS2_I(inode)->ip_alloc_sem); + ocfs2_up_write(OCFS2_I(inode)); if (ret) { mlog_errno(ret); goto out_inode_unlock; @@ -2205,14 +2205,14 @@ static int ocfs2_inode_lock_for_extent_tree(struct inode *inode, if (wait) { if (write_sem) - down_write(&OCFS2_I(inode)->ip_alloc_sem); + ocfs2_down_write(OCFS2_I(inode)); else - down_read(&OCFS2_I(inode)->ip_alloc_sem); + ocfs2_down_read(OCFS2_I(inode)); } else { if (write_sem) - ret = down_write_trylock(&OCFS2_I(inode)->ip_alloc_sem); + ret = ocfs2_down_write_trylock(OCFS2_I(inode)); else - ret = down_read_trylock(&OCFS2_I(inode)->ip_alloc_sem); + ret = ocfs2_down_read_trylock(OCFS2_I(inode)); if (!ret) { ret = -EAGAIN; @@ -2236,9 +2236,9 @@ static void ocfs2_inode_unlock_for_extent_tree(struct inode *inode, int write_sem) { if (write_sem) - up_write(&OCFS2_I(inode)->ip_alloc_sem); + ocfs2_up_write(OCFS2_I(inode)); else - up_read(&OCFS2_I(inode)->ip_alloc_sem); + ocfs2_up_read(OCFS2_I(inode)); brelse(*di_bh); *di_bh = NULL; @@ -2727,10 +2727,9 @@ static loff_t ocfs2_remap_file_range(struct file *file_in, loff_t pos_in, goto out_unlock; /* Lock out changes to the allocation maps and remap. */ - down_write(&OCFS2_I(inode_in)->ip_alloc_sem); + ocfs2_down_write(OCFS2_I(inode_in)); if (!same_inode) - down_write_nested(&OCFS2_I(inode_out)->ip_alloc_sem, - SINGLE_DEPTH_NESTING); + ocfs2_down_write_nested(OCFS2_I(inode_out)); /* Zap any page cache for the destination file's range. */ truncate_inode_pages_range(&inode_out->i_data, @@ -2739,9 +2738,9 @@ static loff_t ocfs2_remap_file_range(struct file *file_in, loff_t pos_in, remapped = ocfs2_reflink_remap_blocks(inode_in, in_bh, pos_in, inode_out, out_bh, pos_out, len); - up_write(&OCFS2_I(inode_in)->ip_alloc_sem); + ocfs2_up_write(OCFS2_I(inode_in)); if (!same_inode) - up_write(&OCFS2_I(inode_out)->ip_alloc_sem); + ocfs2_up_write(OCFS2_I(inode_out)); if (remapped < 0) { ret = remapped; mlog_errno(ret); diff --git a/fs/ocfs2/inode.c b/fs/ocfs2/inode.c index 12e5d1f73325..548be2eb2fc1 100644 --- a/fs/ocfs2/inode.c +++ b/fs/ocfs2/inode.c @@ -1200,10 +1200,10 @@ static void ocfs2_clear_inode(struct inode *inode) * down_trylock() returns 0, down_write_trylock() returns 1 * kernel 1, world 0 */ - mlog_bug_on_msg(!down_write_trylock(&oi->ip_alloc_sem), + mlog_bug_on_msg(!ocfs2_down_write_trylock(oi), "Clear inode of %llu, alloc_sem is locked\n", (unsigned long long)oi->ip_blkno); - up_write(&oi->ip_alloc_sem); + ocfs2_up_write(oi); mlog_bug_on_msg(oi->ip_open_count, "Clear inode of %llu has open count %d\n", diff --git a/fs/ocfs2/inode.h b/fs/ocfs2/inode.h index accf03d4765e..6b6ae74a4f75 100644 --- a/fs/ocfs2/inode.h +++ b/fs/ocfs2/inode.h @@ -68,6 +68,60 @@ struct ocfs2_inode_info struct dquot __rcu *i_dquot[MAXQUOTAS]; }; +static inline void ocfs2_down_write(struct ocfs2_inode_info *oi) +{ + down_write(&oi->ip_xattr_sem); + down_write(&oi->ip_alloc_sem); +} + +static inline void ocfs2_up_write(struct ocfs2_inode_info *oi) +{ + up_write(&oi->ip_alloc_sem); + up_write(&oi->ip_xattr_sem); +} + +static inline int ocfs2_down_write_trylock(struct ocfs2_inode_info *oi) +{ + int rc = down_write_trylock(&oi->ip_xattr_sem); + + if (!rc) + return rc; + rc = down_write_trylock(&oi->ip_alloc_sem); + if (!rc) + up_write(&oi->ip_xattr_sem); + return rc; +} + +static inline void ocfs2_down_write_nested(struct ocfs2_inode_info *oi) +{ + down_write_nested(&oi->ip_xattr_sem, SINGLE_DEPTH_NESTING); + down_write_nested(&oi->ip_alloc_sem, SINGLE_DEPTH_NESTING); +} + +static inline void ocfs2_down_read(struct ocfs2_inode_info *oi) +{ + down_read(&oi->ip_xattr_sem); + down_read(&oi->ip_alloc_sem); +} + +static inline void ocfs2_up_read(struct ocfs2_inode_info *oi) +{ + up_read(&oi->ip_alloc_sem); + up_read(&oi->ip_xattr_sem); +} + +static inline int ocfs2_down_read_trylock(struct ocfs2_inode_info *oi) +{ + int rc = down_read_trylock(&oi->ip_xattr_sem); + + if (!rc) + return rc; + rc = down_read_trylock(&oi->ip_alloc_sem); + if (!rc) + up_read(&oi->ip_xattr_sem); + return rc; +} + /* * Flags for the ip_flags field */ diff --git a/fs/ocfs2/mmap.c b/fs/ocfs2/mmap.c index 6a314e9f2b49..f57db6c1771f 100644 --- a/fs/ocfs2/mmap.c +++ b/fs/ocfs2/mmap.c @@ -139,11 +139,11 @@ static vm_fault_t ocfs2_page_mkwrite(struct vm_fault *vmf) * ocfs2_truncate_file() changing i_size as well as any thread * modifying the inode btree. */ - down_write(&OCFS2_I(inode)->ip_alloc_sem); + ocfs2_down_write(OCFS2_I(inode)); ret = __ocfs2_page_mkwrite(vmf->vma->vm_file, di_bh, folio); - up_write(&OCFS2_I(inode)->ip_alloc_sem); + ocfs2_up_write(OCFS2_I(inode)); brelse(di_bh); ocfs2_inode_unlock(inode, 1); diff --git a/fs/ocfs2/move_extents.c b/fs/ocfs2/move_extents.c index 369c7d27befd..4ce2e40458bd 100644 --- a/fs/ocfs2/move_extents.c +++ b/fs/ocfs2/move_extents.c @@ -922,11 +922,11 @@ static int ocfs2_move_extents(struct ocfs2_move_extents_context *context) /* * remember ip_xattr_sem also needs to be held if necessary */ - down_write(&OCFS2_I(inode)->ip_alloc_sem); + ocfs2_down_write(OCFS2_I(inode)); status = __ocfs2_move_extents_range(di_bh, context); - up_write(&OCFS2_I(inode)->ip_alloc_sem); + ocfs2_up_write(OCFS2_I(inode)); if (status) { mlog_errno(status); goto out_inode_unlock; diff --git a/fs/ocfs2/ocfs2.h b/fs/ocfs2/ocfs2.h index 6aaa94c554c1..8bdeea60742a 100644 --- a/fs/ocfs2/ocfs2.h +++ b/fs/ocfs2/ocfs2.h @@ -494,8 +494,6 @@ struct ocfs2_super struct rb_root osb_rf_lock_tree; struct ocfs2_refcount_tree *osb_ref_tree_lru; - struct mutex system_file_mutex; - /* * OCFS2 needs to schedule several different types of work which * require cluster locking, disk I/O, recovery waits, etc. Since these diff --git a/fs/ocfs2/quota_global.c b/fs/ocfs2/quota_global.c index e85b1ccf81be..e669627c38e8 100644 --- a/fs/ocfs2/quota_global.c +++ b/fs/ocfs2/quota_global.c @@ -311,9 +311,9 @@ int ocfs2_lock_global_qf(struct ocfs2_mem_dqinfo *oinfo, int ex) spin_unlock(&dq_data_lock); if (ex) { inode_lock(oinfo->dqi_gqinode); - down_write(&OCFS2_I(oinfo->dqi_gqinode)->ip_alloc_sem); + ocfs2_down_write(OCFS2_I(oinfo->dqi_gqinode)); } else { - down_read(&OCFS2_I(oinfo->dqi_gqinode)->ip_alloc_sem); + ocfs2_down_read(OCFS2_I(oinfo->dqi_gqinode)); } return 0; } @@ -321,10 +321,10 @@ int ocfs2_lock_global_qf(struct ocfs2_mem_dqinfo *oinfo, int ex) void ocfs2_unlock_global_qf(struct ocfs2_mem_dqinfo *oinfo, int ex) { if (ex) { - up_write(&OCFS2_I(oinfo->dqi_gqinode)->ip_alloc_sem); + ocfs2_up_write(OCFS2_I(oinfo->dqi_gqinode)); inode_unlock(oinfo->dqi_gqinode); } else { - up_read(&OCFS2_I(oinfo->dqi_gqinode)->ip_alloc_sem); + ocfs2_up_read(OCFS2_I(oinfo->dqi_gqinode)); } ocfs2_inode_unlock(oinfo->dqi_gqinode, ex); brelse(oinfo->dqi_gqi_bh); diff --git a/fs/ocfs2/quota_local.c b/fs/ocfs2/quota_local.c index de7f12858729..9ad2dbdbad3b 100644 --- a/fs/ocfs2/quota_local.c +++ b/fs/ocfs2/quota_local.c @@ -1224,7 +1224,7 @@ int ocfs2_create_local_dquot(struct dquot *dquot) int status; u64 pcount; - down_write(&OCFS2_I(lqinode)->ip_alloc_sem); + ocfs2_down_write(OCFS2_I(lqinode)); chunk = ocfs2_find_free_entry(sb, type, &offset); if (!chunk) { chunk = ocfs2_extend_local_quota_file(sb, type, &offset); @@ -1263,7 +1263,7 @@ int ocfs2_create_local_dquot(struct dquot *dquot) goto out; } out: - up_write(&OCFS2_I(lqinode)->ip_alloc_sem); + ocfs2_up_write(OCFS2_I(lqinode)); return status; } diff --git a/fs/ocfs2/refcounttree.c b/fs/ocfs2/refcounttree.c index 8f732742b26e..578a8a834809 100644 --- a/fs/ocfs2/refcounttree.c +++ b/fs/ocfs2/refcounttree.c @@ -928,8 +928,7 @@ int ocfs2_try_remove_refcount_tree(struct inode *inode, struct ocfs2_inode_info *oi = OCFS2_I(inode); struct ocfs2_dinode *di = (struct ocfs2_dinode *)di_bh->b_data; - down_write(&oi->ip_xattr_sem); - down_write(&oi->ip_alloc_sem); + ocfs2_down_write(oi); if (oi->ip_clusters) goto out; @@ -945,8 +944,7 @@ int ocfs2_try_remove_refcount_tree(struct inode *inode, if (ret) mlog_errno(ret); out: - up_write(&oi->ip_alloc_sem); - up_write(&oi->ip_xattr_sem); + ocfs2_up_write(oi); return 0; } @@ -4263,12 +4261,10 @@ static int ocfs2_reflink(struct dentry *old_dentry, struct inode *dir, goto out; } - down_write(&OCFS2_I(inode)->ip_xattr_sem); - down_write(&OCFS2_I(inode)->ip_alloc_sem); + ocfs2_down_write(OCFS2_I(inode)); error = __ocfs2_reflink(old_dentry, old_bh, new_orphan_inode, preserve); - up_write(&OCFS2_I(inode)->ip_alloc_sem); - up_write(&OCFS2_I(inode)->ip_xattr_sem); + ocfs2_up_write(OCFS2_I(inode)); ocfs2_inode_unlock(inode, 1); ocfs2_rw_unlock(inode, 1); diff --git a/fs/ocfs2/super.c b/fs/ocfs2/super.c index 3d2533950bae..4461daf909cf 100644 --- a/fs/ocfs2/super.c +++ b/fs/ocfs2/super.c @@ -1997,8 +1997,6 @@ static int ocfs2_initialize_super(struct super_block *sb, spin_lock_init(&osb->osb_xattr_lock); ocfs2_init_steal_slots(osb); - mutex_init(&osb->system_file_mutex); - atomic_set(&osb->alloc_stats.moves, 0); atomic_set(&osb->alloc_stats.local_data, 0); atomic_set(&osb->alloc_stats.bitmap_data, 0); diff --git a/fs/ocfs2/sysfile.c b/fs/ocfs2/sysfile.c index 53a945da873b..b63af8d64904 100644 --- a/fs/ocfs2/sysfile.c +++ b/fs/ocfs2/sysfile.c @@ -98,11 +98,9 @@ struct inode *ocfs2_get_system_file_inode(struct ocfs2_super *osb, } else arr = get_local_system_inode(osb, type, slot); - mutex_lock(&osb->system_file_mutex); if (arr && ((inode = *arr) != NULL)) { /* get a ref in addition to the array ref */ inode = igrab(inode); - mutex_unlock(&osb->system_file_mutex); BUG_ON(!inode); return inode; @@ -112,11 +110,10 @@ struct inode *ocfs2_get_system_file_inode(struct ocfs2_super *osb, inode = _ocfs2_get_system_file_inode(osb, type, slot); /* add one more if putting into array for first time */ - if (arr && inode) { - *arr = igrab(inode); - BUG_ON(!*arr); + if (inode && arr && !*arr && !cmpxchg(&(*arr), NULL, inode)) { + inode = igrab(inode); + BUG_ON(!inode); } - mutex_unlock(&osb->system_file_mutex); return inode; } diff --git a/fs/ocfs2/xattr.c b/fs/ocfs2/xattr.c index d70a20d29e3e..3f79198094ed 100644 --- a/fs/ocfs2/xattr.c +++ b/fs/ocfs2/xattr.c @@ -624,11 +624,11 @@ int ocfs2_calc_xattr_init(struct inode *dir, si->value_len); if (osb->s_mount_opt & OCFS2_MOUNT_POSIX_ACL) { - down_read(&OCFS2_I(dir)->ip_xattr_sem); + ocfs2_down_read(OCFS2_I(dir)); acl_len = ocfs2_xattr_get_nolock(dir, dir_bh, OCFS2_XATTR_INDEX_POSIX_ACL_DEFAULT, "", NULL, 0); - up_read(&OCFS2_I(dir)->ip_xattr_sem); + ocfs2_up_read(OCFS2_I(dir)); if (acl_len > 0) { a_size = ocfs2_xattr_entry_real_size(0, acl_len); if (S_ISDIR(mode)) @@ -1040,7 +1040,7 @@ ssize_t ocfs2_listxattr(struct dentry *dentry, di = (struct ocfs2_dinode *)di_bh->b_data; - down_read(&oi->ip_xattr_sem); + ocfs2_down_read(oi); i_ret = ocfs2_xattr_ibody_list(d_inode(dentry), di, buffer, size); if (i_ret < 0) b_ret = 0; @@ -1054,7 +1054,7 @@ ssize_t ocfs2_listxattr(struct dentry *dentry, if (b_ret < 0) i_ret = 0; } - up_read(&oi->ip_xattr_sem); + ocfs2_up_read(oi); ocfs2_inode_unlock(d_inode(dentry), 0); brelse(di_bh); @@ -1335,10 +1335,10 @@ static int ocfs2_xattr_get(struct inode *inode, mlog_errno(had_lock); return had_lock; } - down_read(&OCFS2_I(inode)->ip_xattr_sem); + ocfs2_down_read(OCFS2_I(inode)); ret = ocfs2_xattr_get_nolock(inode, di_bh, name_index, name, buffer, buffer_size); - up_read(&OCFS2_I(inode)->ip_xattr_sem); + ocfs2_up_read(OCFS2_I(inode)); ocfs2_inode_unlock_tracker(inode, 0, &oh, had_lock); @@ -2682,13 +2682,14 @@ static int ocfs2_xattr_ibody_find(struct inode *inode, int ret; int has_space = 0; + lockdep_assert_held(&oi->ip_xattr_sem); + lockdep_assert_held(&oi->ip_alloc_sem); + if (inode->i_sb->s_blocksize == OCFS2_MIN_BLOCKSIZE) return 0; if (!(oi->ip_dyn_features & OCFS2_INLINE_XATTR_FL)) { - down_read(&oi->ip_alloc_sem); has_space = ocfs2_xattr_has_space_inline(inode, di); - up_read(&oi->ip_alloc_sem); if (!has_space) return 0; } @@ -2777,10 +2778,12 @@ static int ocfs2_xattr_ibody_set(struct inode *inode, struct ocfs2_inode_info *oi = OCFS2_I(inode); struct ocfs2_xa_loc loc; + lockdep_assert_held(&oi->ip_xattr_sem); + lockdep_assert_held_write(&oi->ip_alloc_sem); + if (inode->i_sb->s_blocksize == OCFS2_MIN_BLOCKSIZE) return -ENOSPC; - down_write(&oi->ip_alloc_sem); if (!(oi->ip_dyn_features & OCFS2_INLINE_XATTR_FL)) { ret = ocfs2_xattr_ibody_init(inode, xs->inode_bh, ctxt); if (ret) { @@ -2801,7 +2804,6 @@ static int ocfs2_xattr_ibody_set(struct inode *inode, xs->here = loc.xl_entry; out: - up_write(&oi->ip_alloc_sem); return ret; } @@ -3498,7 +3500,7 @@ int ocfs2_xattr_set_handle(handle_t *handle, xis.inode_bh = xbs.inode_bh = di_bh; di = (struct ocfs2_dinode *)di_bh->b_data; - down_write(&OCFS2_I(inode)->ip_xattr_sem); + ocfs2_down_write(OCFS2_I(inode)); ret = ocfs2_xattr_ibody_find(inode, name_index, name, &xis); if (ret) @@ -3512,7 +3514,7 @@ int ocfs2_xattr_set_handle(handle_t *handle, ret = __ocfs2_xattr_set_handle(inode, di, &xi, &xis, &xbs, &ctxt); cleanup: - up_write(&OCFS2_I(inode)->ip_xattr_sem); + ocfs2_up_write(OCFS2_I(inode)); brelse(xbs.xattr_bh); ocfs2_xattr_bucket_free(xbs.bucket); @@ -3580,7 +3582,7 @@ int ocfs2_xattr_set(struct inode *inode, xis.inode_bh = xbs.inode_bh = di_bh; di = (struct ocfs2_dinode *)di_bh->b_data; - down_write(&OCFS2_I(inode)->ip_xattr_sem); + ocfs2_down_write(OCFS2_I(inode)); /* * Scan inode and external block to find the same name * extended attribute and collect search information. @@ -3664,7 +3666,7 @@ int ocfs2_xattr_set(struct inode *inode, cleanup: if (ref_tree) ocfs2_unlock_refcount_tree(osb, ref_tree, 1); - up_write(&OCFS2_I(inode)->ip_xattr_sem); + ocfs2_up_write(OCFS2_I(inode)); if (!value && !ret) { ret = ocfs2_try_remove_refcount_tree(inode, di_bh); if (ret) @@ -4288,7 +4290,8 @@ static int ocfs2_xattr_create_index_block(struct inode *inode, * We can use this lock for now, and maybe move to a dedicated mutex * if performance becomes a problem later. */ - down_write(&oi->ip_alloc_sem); + lockdep_assert_held(&oi->ip_xattr_sem); + lockdep_assert_held_write(&oi->ip_alloc_sem); ret = ocfs2_journal_access_xb(handle, INODE_CACHE(inode), xb_bh, OCFS2_JOURNAL_ACCESS_WRITE); @@ -4351,7 +4354,6 @@ static int ocfs2_xattr_create_index_block(struct inode *inode, ocfs2_journal_dirty(handle, xb_bh); out: - up_write(&oi->ip_alloc_sem); return ret; }