diff options
author | Martin Brandenburg <martin@omnibond.com> | 2017-11-10 12:08:01 -0500 |
---|---|---|
committer | Mike Marshall <hubcap@omnibond.com> | 2017-11-13 15:10:18 -0500 |
commit | db0267e7afc72e04d92b845a00928e39be211d6a (patch) | |
tree | 12c9297fc0cbd76d75a474f77b1b2428ec9e1f3d | |
parent | a55f2d861585006f493e933ad32d65d71ba631fa (diff) |
orangefs: call op_release sooner when creating inodes
Prevents holding an unnecessary op while the kernel processes another op
and yields the CPU.
Signed-off-by: Martin Brandenburg <martin@omnibond.com>
Signed-off-by: Mike Marshall <hubcap@omnibond.com>
-rw-r--r-- | fs/orangefs/namei.c | 24 |
1 files changed, 15 insertions, 9 deletions
diff --git a/fs/orangefs/namei.c b/fs/orangefs/namei.c index ea6ae68e8a27..c98bba2dbc94 100644 --- a/fs/orangefs/namei.c +++ b/fs/orangefs/namei.c | |||
@@ -22,6 +22,7 @@ static int orangefs_create(struct inode *dir, | |||
22 | { | 22 | { |
23 | struct orangefs_inode_s *parent = ORANGEFS_I(dir); | 23 | struct orangefs_inode_s *parent = ORANGEFS_I(dir); |
24 | struct orangefs_kernel_op_s *new_op; | 24 | struct orangefs_kernel_op_s *new_op; |
25 | struct orangefs_object_kref ref; | ||
25 | struct inode *inode; | 26 | struct inode *inode; |
26 | struct iattr iattr; | 27 | struct iattr iattr; |
27 | int ret; | 28 | int ret; |
@@ -56,8 +57,10 @@ static int orangefs_create(struct inode *dir, | |||
56 | if (ret < 0) | 57 | if (ret < 0) |
57 | goto out; | 58 | goto out; |
58 | 59 | ||
59 | inode = orangefs_new_inode(dir->i_sb, dir, S_IFREG | mode, 0, | 60 | ref = new_op->downcall.resp.create.refn; |
60 | &new_op->downcall.resp.create.refn); | 61 | op_release(new_op); |
62 | |||
63 | inode = orangefs_new_inode(dir->i_sb, dir, S_IFREG | mode, 0, &ref); | ||
61 | if (IS_ERR(inode)) { | 64 | if (IS_ERR(inode)) { |
62 | gossip_err("%s: Failed to allocate inode for file :%pd:\n", | 65 | gossip_err("%s: Failed to allocate inode for file :%pd:\n", |
63 | __func__, | 66 | __func__, |
@@ -90,7 +93,6 @@ static int orangefs_create(struct inode *dir, | |||
90 | mark_inode_dirty_sync(dir); | 93 | mark_inode_dirty_sync(dir); |
91 | ret = 0; | 94 | ret = 0; |
92 | out: | 95 | out: |
93 | op_release(new_op); | ||
94 | gossip_debug(GOSSIP_NAME_DEBUG, | 96 | gossip_debug(GOSSIP_NAME_DEBUG, |
95 | "%s: %pd: returning %d\n", | 97 | "%s: %pd: returning %d\n", |
96 | __func__, | 98 | __func__, |
@@ -272,6 +274,7 @@ static int orangefs_symlink(struct inode *dir, | |||
272 | { | 274 | { |
273 | struct orangefs_inode_s *parent = ORANGEFS_I(dir); | 275 | struct orangefs_inode_s *parent = ORANGEFS_I(dir); |
274 | struct orangefs_kernel_op_s *new_op; | 276 | struct orangefs_kernel_op_s *new_op; |
277 | struct orangefs_object_kref ref; | ||
275 | struct inode *inode; | 278 | struct inode *inode; |
276 | struct iattr iattr; | 279 | struct iattr iattr; |
277 | int mode = 755; | 280 | int mode = 755; |
@@ -314,8 +317,10 @@ static int orangefs_symlink(struct inode *dir, | |||
314 | goto out; | 317 | goto out; |
315 | } | 318 | } |
316 | 319 | ||
317 | inode = orangefs_new_inode(dir->i_sb, dir, S_IFLNK | mode, 0, | 320 | ref = new_op->downcall.resp.sym.refn; |
318 | &new_op->downcall.resp.sym.refn); | 321 | op_release(new_op); |
322 | |||
323 | inode = orangefs_new_inode(dir->i_sb, dir, S_IFLNK | mode, 0, &ref); | ||
319 | if (IS_ERR(inode)) { | 324 | if (IS_ERR(inode)) { |
320 | gossip_err | 325 | gossip_err |
321 | ("*** Failed to allocate orangefs symlink inode\n"); | 326 | ("*** Failed to allocate orangefs symlink inode\n"); |
@@ -345,7 +350,6 @@ static int orangefs_symlink(struct inode *dir, | |||
345 | mark_inode_dirty_sync(dir); | 350 | mark_inode_dirty_sync(dir); |
346 | ret = 0; | 351 | ret = 0; |
347 | out: | 352 | out: |
348 | op_release(new_op); | ||
349 | return ret; | 353 | return ret; |
350 | } | 354 | } |
351 | 355 | ||
@@ -353,6 +357,7 @@ static int orangefs_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode | |||
353 | { | 357 | { |
354 | struct orangefs_inode_s *parent = ORANGEFS_I(dir); | 358 | struct orangefs_inode_s *parent = ORANGEFS_I(dir); |
355 | struct orangefs_kernel_op_s *new_op; | 359 | struct orangefs_kernel_op_s *new_op; |
360 | struct orangefs_object_kref ref; | ||
356 | struct inode *inode; | 361 | struct inode *inode; |
357 | struct iattr iattr; | 362 | struct iattr iattr; |
358 | int ret; | 363 | int ret; |
@@ -383,8 +388,10 @@ static int orangefs_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode | |||
383 | goto out; | 388 | goto out; |
384 | } | 389 | } |
385 | 390 | ||
386 | inode = orangefs_new_inode(dir->i_sb, dir, S_IFDIR | mode, 0, | 391 | ref = new_op->downcall.resp.mkdir.refn; |
387 | &new_op->downcall.resp.mkdir.refn); | 392 | op_release(new_op); |
393 | |||
394 | inode = orangefs_new_inode(dir->i_sb, dir, S_IFDIR | mode, 0, &ref); | ||
388 | if (IS_ERR(inode)) { | 395 | if (IS_ERR(inode)) { |
389 | gossip_err("*** Failed to allocate orangefs dir inode\n"); | 396 | gossip_err("*** Failed to allocate orangefs dir inode\n"); |
390 | ret = PTR_ERR(inode); | 397 | ret = PTR_ERR(inode); |
@@ -416,7 +423,6 @@ static int orangefs_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode | |||
416 | orangefs_inode_setattr(dir, &iattr); | 423 | orangefs_inode_setattr(dir, &iattr); |
417 | mark_inode_dirty_sync(dir); | 424 | mark_inode_dirty_sync(dir); |
418 | out: | 425 | out: |
419 | op_release(new_op); | ||
420 | return ret; | 426 | return ret; |
421 | } | 427 | } |
422 | 428 | ||