reiserfs: locking, push write lock out of xattr code
PATCH 1/1 reiserfs: locking, push write lock out of xattr code
The reiserfs xattr code doesn't need the write lock and sleeps all over the place. We can simplify the locking by releasing it and reacquiring after the xattr call.
Signed-off-by Jeff Mahoney <[email protected]>
--- fs/reiserfs/inode.c | 38 ++++++++++++++++++++------------------ fs/reiserfs/super.c | 48 +++++++++++++++++++++++------------------------- fs/reiserfs/xattr.c | 46 +++++++++++++++++----------------------------- fs/reiserfs/xattr_acl.c | 16 ++++++++++------ 4 files changed, 70 insertions(+), 78 deletions(-)
fs/reiserfs/inode.c +20 -18
@@ -30,7 +30,6 @@ void reiserfs_evict_inode(struct inode *JOURNAL_PER_BALANCE_CNT *2 +2 *REISERFS_QUOTA_INIT_BLOCKS (inode->i_sb);struct reiserfs_transaction_handle th; -int depth;int err;if (!inode->i_nlink && !is_bad_inode (inode))
@@ -40,12 +39,14 @@ void reiserfs_evict_inode(struct inode *if (inode->i_nlink) goto no_delete; - depth =reiserfs_write_lock_once (inode->i_sb); -/* The = 0 happens when we abort creating a new inode for some reason like lack of space.. */ if (!(inode->i_state &I_NEW ) &&INODE_PKEY (inode)->k_objectid !=0 ) {/* also handles bad_inode case */ +int depth; +reiserfs_delete_xattrs (inode); + depth =reiserfs_write_lock_once (inode->i_sb); +if (journal_begin (&th, inode->i_sb, jbegin_count)) goto out;reiserfs_update_inode_transaction (inode);
@@ -72,12 +73,12 @@ void reiserfs_evict_inode(struct inode */* all items of file are deleted, so we can remove "save" link */ remove_save_link (inode,0 /* not truncate */ );/* we can't do anything * about an error here */ +out: +reiserfs_write_unlock_once (inode->i_sb, depth); }else {/* no object items are in the tree */ ; } - out: -reiserfs_write_unlock_once (inode->i_sb, depth);clear_inode (inode);/* note this must go after the journal_end to prevent deadlock */ dquot_drop (inode); inode->i_blocks =0 ;
@@ -1941,7 +1942,9 @@ int reiserfs_new_inode(struct reiserfs_t }if (reiserfs_posixacl (inode->i_sb)) { +reiserfs_write_unlock (inode->i_sb); retval =reiserfs_inherit_default_acl (th, dir, dentry, inode); +reiserfs_write_lock (inode->i_sb);if (retval) { err = retval;reiserfs_check_path (&path_to_key);
@@ -1956,7 +1959,9 @@ int reiserfs_new_inode(struct reiserfs_t inode->i_flags |=S_PRIVATE ;if (security->name) { +reiserfs_write_unlock (inode->i_sb); retval =reiserfs_security_write (th, inode, security); +reiserfs_write_lock (inode->i_sb);if (retval) { err = retval;reiserfs_check_path (&path_to_key);
@@ -3129,6 +3134,7 @@ int reiserfs_setattr(struct dentry *dent*/ if (get_inode_item_key_version (inode) ==KEY_FORMAT_3_5 && attr->ia_size >MAX_NON_LFS ) { +reiserfs_write_unlock_once (inode->i_sb, depth); error = -EFBIG ; goto out; }
@@ -3150,8 +3156,10 @@ int reiserfs_setattr(struct dentry *dentif (err) error = err; } -if (error) +if (error) { +reiserfs_write_unlock_once (inode->i_sb, depth); goto out; + }/* * file size is changed, ctime and mtime are * to be updated
@@ -3159,6 +3167,7 @@ int reiserfs_setattr(struct dentry *dent attr->ia_valid |= (ATTR_MTIME |ATTR_CTIME ); } } +reiserfs_write_unlock_once (inode->i_sb, depth); if ((((attr->ia_valid & ATTR_UID) && (from_kuid(&init_user_ns, attr->ia_uid) & ~0xffff)) || ((attr->ia_valid & ATTR_GID) && (from_kgid(&init_user_ns, attr->ia_gid) & ~0xffff))) &&
@@ -3183,14 +3192,16 @@ int reiserfs_setattr(struct dentry *dentreturn error;/* (user+group)*(old+new) structure - we count quota info and , inode write (sb, inode) */ + depth =reiserfs_write_lock_once (inode->i_sb); error =journal_begin (&th, inode->i_sb, jbegin_count); +reiserfs_write_unlock_once (inode->i_sb, depth);if (error) goto out; -reiserfs_write_unlock_once (inode->i_sb, depth); error =dquot_transfer (inode, attr); depth =reiserfs_write_lock_once (inode->i_sb);if (error) {journal_end (&th, inode->i_sb, jbegin_count); +reiserfs_write_unlock_once (inode->i_sb, depth); goto out; }
@@ -3202,17 +3213,11 @@ int reiserfs_setattr(struct dentry *dent inode->i_gid = attr->ia_gid;mark_inode_dirty (inode); error =journal_end (&th, inode->i_sb, jbegin_count); +reiserfs_write_unlock_once (inode->i_sb, depth);if (error) goto out; } -/* -* Relax the lock here, as it might truncate the -* inode pages and wait for inode pages locks. -* To release such page lock, the owner needs the -* reiserfs lock -*/ -reiserfs_write_unlock_once (inode->i_sb, depth);if ((attr->ia_valid &ATTR_SIZE ) && attr->ia_size !=i_size_read (inode)) { error =inode_newsize_ok (inode, attr->ia_size);
@@ -3226,16 +3231,13 @@ int reiserfs_setattr(struct dentry *dentsetattr_copy (inode, attr);mark_inode_dirty (inode); } - depth =reiserfs_write_lock_once (inode->i_sb);if (!error &&reiserfs_posixacl (inode->i_sb)) {if (attr->ia_valid &ATTR_MODE ) error =reiserfs_acl_chmod (inode); } - out: -reiserfs_write_unlock_once (inode->i_sb, depth); - +out:return error; }
fs/reiserfs/super.c +23 -25
135 lines not on this page · raw message
fs/reiserfs/xattr.c +17 -29
163 lines not on this page · raw message
fs/reiserfs/xattr_acl.c +10 -6
@@ -49,13 +49,15 @@ posix_acl_set(struct dentry *dentry, conreiserfs_write_lock (inode->i_sb); error =journal_begin (&th, inode->i_sb, jcreate_blocks); +reiserfs_write_unlock (inode->i_sb);if (error ==0 ) { error =reiserfs_set_acl (&th, inode, type, acl); +reiserfs_write_lock (inode->i_sb); error2 =journal_end (&th, inode->i_sb, jcreate_blocks); +reiserfs_write_unlock (inode->i_sb);if (error2) error = error2; } -reiserfs_write_unlock (inode->i_sb); release_and_out:posix_acl_release (acl);
@@ -435,12 +437,14 @@ int reiserfs_cache_default_acl(struct inreturn nblocks; } +/* +* Called under i_mutex +*/ int reiserfs_acl_chmod (struct inode *inode) {struct reiserfs_transaction_handle th;struct posix_acl *acl;size_t size; -int depth;int error;if (IS_PRIVATE (inode))
@@ -454,9 +458,7 @@ int reiserfs_acl_chmod(struct inode *inoreturn 0 ; } -reiserfs_write_unlock (inode->i_sb); acl =reiserfs_get_acl (inode,ACL_TYPE_ACCESS ); -reiserfs_write_lock (inode->i_sb);if (!acl)return 0 ;if (IS_ERR (acl))
@@ -466,16 +468,18 @@ int reiserfs_acl_chmod(struct inode *inoreturn error; size =reiserfs_xattr_nblocks (inode,reiserfs_acl_size (acl->a_count)); - depth =reiserfs_write_lock_once (inode->i_sb); +reiserfs_write_lock (inode->i_sb); error =journal_begin (&th, inode->i_sb, size *2 ); +reiserfs_write_unlock (inode->i_sb);if (!error) {int error2; error =reiserfs_set_acl (&th, inode,ACL_TYPE_ACCESS , acl); +reiserfs_write_lock (inode->i_sb); error2 =journal_end (&th, inode->i_sb, size *2 ); +reiserfs_write_unlock (inode->i_sb);if (error2) error = error2; } -reiserfs_write_unlock_once (inode->i_sb, depth);posix_acl_release (acl);return error; }
Signature · 2 lines
Jeff Mahoney SUSE Labs