aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMartin Brandenburg <martin@omnibond.com>2017-11-10 12:08:01 -0500
committerMike Marshall <hubcap@omnibond.com>2017-11-13 15:10:18 -0500
commitdb0267e7afc72e04d92b845a00928e39be211d6a (patch)
tree12c9297fc0cbd76d75a474f77b1b2428ec9e1f3d
parenta55f2d861585006f493e933ad32d65d71ba631fa (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.c24
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;
92out: 95out:
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;
347out: 352out:
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);
418out: 425out:
419 op_release(new_op);
420 return ret; 426 return ret;
421} 427}
422 428