summaryrefslogtreecommitdiffstats
path: root/fs/reiserfs/inode.c
diff options
context:
space:
mode:
authorJeff Mahoney <jeffm@suse.com>2013-08-08 17:27:19 -0400
committerJeff Mahoney <jeffm@suse.de>2013-08-08 17:27:19 -0400
commit4c05141df57f4ffc1a9a28f1925434924179bfe4 (patch)
treed210b251b6f46e50b27f4db4f15010f9b40aad45 /fs/reiserfs/inode.c
parentc095ba7224d8edc71dcef0d655911399a8bd4a3f (diff)
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 <jeffm@suse.com>
Diffstat (limited to 'fs/reiserfs/inode.c')
-rw-r--r--fs/reiserfs/inode.c38
1 files changed, 20 insertions, 18 deletions
diff --git a/fs/reiserfs/inode.c b/fs/reiserfs/inode.c
index 0048cc16a6a8..bf1331a0f04b 100644
--- a/fs/reiserfs/inode.c
+++ b/fs/reiserfs/inode.c
@@ -30,7 +30,6 @@ void reiserfs_evict_inode(struct inode *inode)
30 JOURNAL_PER_BALANCE_CNT * 2 + 30 JOURNAL_PER_BALANCE_CNT * 2 +
31 2 * REISERFS_QUOTA_INIT_BLOCKS(inode->i_sb); 31 2 * REISERFS_QUOTA_INIT_BLOCKS(inode->i_sb);
32 struct reiserfs_transaction_handle th; 32 struct reiserfs_transaction_handle th;
33 int depth;
34 int err; 33 int err;
35 34
36 if (!inode->i_nlink && !is_bad_inode(inode)) 35 if (!inode->i_nlink && !is_bad_inode(inode))
@@ -40,12 +39,14 @@ void reiserfs_evict_inode(struct inode *inode)
40 if (inode->i_nlink) 39 if (inode->i_nlink)
41 goto no_delete; 40 goto no_delete;
42 41
43 depth = reiserfs_write_lock_once(inode->i_sb);
44
45 /* The = 0 happens when we abort creating a new inode for some reason like lack of space.. */ 42 /* The = 0 happens when we abort creating a new inode for some reason like lack of space.. */
46 if (!(inode->i_state & I_NEW) && INODE_PKEY(inode)->k_objectid != 0) { /* also handles bad_inode case */ 43 if (!(inode->i_state & I_NEW) && INODE_PKEY(inode)->k_objectid != 0) { /* also handles bad_inode case */
44 int depth;
45
47 reiserfs_delete_xattrs(inode); 46 reiserfs_delete_xattrs(inode);
48 47
48 depth = reiserfs_write_lock_once(inode->i_sb);
49
49 if (journal_begin(&th, inode->i_sb, jbegin_count)) 50 if (journal_begin(&th, inode->i_sb, jbegin_count))
50 goto out; 51 goto out;
51 reiserfs_update_inode_transaction(inode); 52 reiserfs_update_inode_transaction(inode);
@@ -72,12 +73,12 @@ void reiserfs_evict_inode(struct inode *inode)
72 /* all items of file are deleted, so we can remove "save" link */ 73 /* all items of file are deleted, so we can remove "save" link */
73 remove_save_link(inode, 0 /* not truncate */ ); /* we can't do anything 74 remove_save_link(inode, 0 /* not truncate */ ); /* we can't do anything
74 * about an error here */ 75 * about an error here */
76out:
77 reiserfs_write_unlock_once(inode->i_sb, depth);
75 } else { 78 } else {
76 /* no object items are in the tree */ 79 /* no object items are in the tree */
77 ; 80 ;
78 } 81 }
79 out:
80 reiserfs_write_unlock_once(inode->i_sb, depth);
81 clear_inode(inode); /* note this must go after the journal_end to prevent deadlock */ 82 clear_inode(inode); /* note this must go after the journal_end to prevent deadlock */
82 dquot_drop(inode); 83 dquot_drop(inode);
83 inode->i_blocks = 0; 84 inode->i_blocks = 0;
@@ -1941,7 +1942,9 @@ int reiserfs_new_inode(struct reiserfs_transaction_handle *th,
1941 } 1942 }
1942 1943
1943 if (reiserfs_posixacl(inode->i_sb)) { 1944 if (reiserfs_posixacl(inode->i_sb)) {
1945 reiserfs_write_unlock(inode->i_sb);
1944 retval = reiserfs_inherit_default_acl(th, dir, dentry, inode); 1946 retval = reiserfs_inherit_default_acl(th, dir, dentry, inode);
1947 reiserfs_write_lock(inode->i_sb);
1945 if (retval) { 1948 if (retval) {
1946 err = retval; 1949 err = retval;
1947 reiserfs_check_path(&path_to_key); 1950 reiserfs_check_path(&path_to_key);
@@ -1956,7 +1959,9 @@ int reiserfs_new_inode(struct reiserfs_transaction_handle *th,
1956 inode->i_flags |= S_PRIVATE; 1959 inode->i_flags |= S_PRIVATE;
1957 1960
1958 if (security->name) { 1961 if (security->name) {
1962 reiserfs_write_unlock(inode->i_sb);
1959 retval = reiserfs_security_write(th, inode, security); 1963 retval = reiserfs_security_write(th, inode, security);
1964 reiserfs_write_lock(inode->i_sb);
1960 if (retval) { 1965 if (retval) {
1961 err = retval; 1966 err = retval;
1962 reiserfs_check_path(&path_to_key); 1967 reiserfs_check_path(&path_to_key);
@@ -3129,6 +3134,7 @@ int reiserfs_setattr(struct dentry *dentry, struct iattr *attr)
3129 */ 3134 */
3130 if (get_inode_item_key_version(inode) == KEY_FORMAT_3_5 && 3135 if (get_inode_item_key_version(inode) == KEY_FORMAT_3_5 &&
3131 attr->ia_size > MAX_NON_LFS) { 3136 attr->ia_size > MAX_NON_LFS) {
3137 reiserfs_write_unlock_once(inode->i_sb, depth);
3132 error = -EFBIG; 3138 error = -EFBIG;
3133 goto out; 3139 goto out;
3134 } 3140 }
@@ -3150,8 +3156,10 @@ int reiserfs_setattr(struct dentry *dentry, struct iattr *attr)
3150 if (err) 3156 if (err)
3151 error = err; 3157 error = err;
3152 } 3158 }
3153 if (error) 3159 if (error) {
3160 reiserfs_write_unlock_once(inode->i_sb, depth);
3154 goto out; 3161 goto out;
3162 }
3155 /* 3163 /*
3156 * file size is changed, ctime and mtime are 3164 * file size is changed, ctime and mtime are
3157 * to be updated 3165 * to be updated
@@ -3159,6 +3167,7 @@ int reiserfs_setattr(struct dentry *dentry, struct iattr *attr)
3159 attr->ia_valid |= (ATTR_MTIME | ATTR_CTIME); 3167 attr->ia_valid |= (ATTR_MTIME | ATTR_CTIME);
3160 } 3168 }
3161 } 3169 }
3170 reiserfs_write_unlock_once(inode->i_sb, depth);
3162 3171
3163 if ((((attr->ia_valid & ATTR_UID) && (from_kuid(&init_user_ns, attr->ia_uid) & ~0xffff)) || 3172 if ((((attr->ia_valid & ATTR_UID) && (from_kuid(&init_user_ns, attr->ia_uid) & ~0xffff)) ||
3164 ((attr->ia_valid & ATTR_GID) && (from_kgid(&init_user_ns, attr->ia_gid) & ~0xffff))) && 3173 ((attr->ia_valid & ATTR_GID) && (from_kgid(&init_user_ns, attr->ia_gid) & ~0xffff))) &&
@@ -3183,14 +3192,16 @@ int reiserfs_setattr(struct dentry *dentry, struct iattr *attr)
3183 return error; 3192 return error;
3184 3193
3185 /* (user+group)*(old+new) structure - we count quota info and , inode write (sb, inode) */ 3194 /* (user+group)*(old+new) structure - we count quota info and , inode write (sb, inode) */
3195 depth = reiserfs_write_lock_once(inode->i_sb);
3186 error = journal_begin(&th, inode->i_sb, jbegin_count); 3196 error = journal_begin(&th, inode->i_sb, jbegin_count);
3197 reiserfs_write_unlock_once(inode->i_sb, depth);
3187 if (error) 3198 if (error)
3188 goto out; 3199 goto out;
3189 reiserfs_write_unlock_once(inode->i_sb, depth);
3190 error = dquot_transfer(inode, attr); 3200 error = dquot_transfer(inode, attr);
3191 depth = reiserfs_write_lock_once(inode->i_sb); 3201 depth = reiserfs_write_lock_once(inode->i_sb);
3192 if (error) { 3202 if (error) {
3193 journal_end(&th, inode->i_sb, jbegin_count); 3203 journal_end(&th, inode->i_sb, jbegin_count);
3204 reiserfs_write_unlock_once(inode->i_sb, depth);
3194 goto out; 3205 goto out;
3195 } 3206 }
3196 3207
@@ -3202,17 +3213,11 @@ int reiserfs_setattr(struct dentry *dentry, struct iattr *attr)
3202 inode->i_gid = attr->ia_gid; 3213 inode->i_gid = attr->ia_gid;
3203 mark_inode_dirty(inode); 3214 mark_inode_dirty(inode);
3204 error = journal_end(&th, inode->i_sb, jbegin_count); 3215 error = journal_end(&th, inode->i_sb, jbegin_count);
3216 reiserfs_write_unlock_once(inode->i_sb, depth);
3205 if (error) 3217 if (error)
3206 goto out; 3218 goto out;
3207 } 3219 }
3208 3220
3209 /*
3210 * Relax the lock here, as it might truncate the
3211 * inode pages and wait for inode pages locks.
3212 * To release such page lock, the owner needs the
3213 * reiserfs lock
3214 */
3215 reiserfs_write_unlock_once(inode->i_sb, depth);
3216 if ((attr->ia_valid & ATTR_SIZE) && 3221 if ((attr->ia_valid & ATTR_SIZE) &&
3217 attr->ia_size != i_size_read(inode)) { 3222 attr->ia_size != i_size_read(inode)) {
3218 error = inode_newsize_ok(inode, attr->ia_size); 3223 error = inode_newsize_ok(inode, attr->ia_size);
@@ -3226,16 +3231,13 @@ int reiserfs_setattr(struct dentry *dentry, struct iattr *attr)
3226 setattr_copy(inode, attr); 3231 setattr_copy(inode, attr);
3227 mark_inode_dirty(inode); 3232 mark_inode_dirty(inode);
3228 } 3233 }
3229 depth = reiserfs_write_lock_once(inode->i_sb);
3230 3234
3231 if (!error && reiserfs_posixacl(inode->i_sb)) { 3235 if (!error && reiserfs_posixacl(inode->i_sb)) {
3232 if (attr->ia_valid & ATTR_MODE) 3236 if (attr->ia_valid & ATTR_MODE)
3233 error = reiserfs_acl_chmod(inode); 3237 error = reiserfs_acl_chmod(inode);
3234 } 3238 }
3235 3239
3236 out: 3240out:
3237 reiserfs_write_unlock_once(inode->i_sb, depth);
3238
3239 return error; 3241 return error;
3240} 3242}
3241 3243