aboutsummaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
authorChristoph Hellwig <hch@lst.de>2014-05-13 02:34:33 -0400
committerDave Chinner <david@fromorbit.com>2014-05-13 02:34:33 -0400
commit1bc426a76b1a8ecf00d9a3ec8e9765a21ab4082f (patch)
tree2f16df0736baff33656f6086f4d37d0977f9e799 /fs
parentb87d022c275bce66553a27b68790e7c91927875f (diff)
xfs: fold xfs_attr_remove_int into xfs_attr_remove
Also remove a useless ilock roundtrip for the first attr fork check, it's racy anyway and we redo it later under the ilock before we start the removal. Plus various minor style fixes to the new xfs_attr_remove. Signed-off-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Dave Chinner <dchinner@redhat.com> Reviewed-by: Brian Foster <bfoster@redhat.com> Signed-off-by: Dave Chinner <david@fromorbit.com>
Diffstat (limited to 'fs')
-rw-r--r--fs/xfs/xfs_attr.c97
1 files changed, 35 insertions, 62 deletions
diff --git a/fs/xfs/xfs_attr.c b/fs/xfs/xfs_attr.c
index 01f226710079..a96e27bfc58b 100644
--- a/fs/xfs/xfs_attr.c
+++ b/fs/xfs/xfs_attr.c
@@ -416,21 +416,34 @@ out:
416 * Generic handler routine to remove a name from an attribute list. 416 * Generic handler routine to remove a name from an attribute list.
417 * Transitions attribute list from Btree to shortform as necessary. 417 * Transitions attribute list from Btree to shortform as necessary.
418 */ 418 */
419STATIC int 419int
420xfs_attr_remove_int(xfs_inode_t *dp, struct xfs_name *name, int flags) 420xfs_attr_remove(
421 struct xfs_inode *dp,
422 const unsigned char *name,
423 int flags)
421{ 424{
422 xfs_da_args_t args; 425 struct xfs_mount *mp = dp->i_mount;
423 xfs_fsblock_t firstblock; 426 struct xfs_da_args args;
424 xfs_bmap_free_t flist; 427 struct xfs_bmap_free flist;
425 int error; 428 struct xfs_name xname;
426 xfs_mount_t *mp = dp->i_mount; 429 xfs_fsblock_t firstblock;
430 int error;
427 431
428 /* 432 XFS_STATS_INC(xs_attr_remove);
429 * Fill in the arg structure for this request. 433
430 */ 434 if (XFS_FORCED_SHUTDOWN(dp->i_mount))
431 memset((char *)&args, 0, sizeof(args)); 435 return EIO;
432 args.name = name->name; 436
433 args.namelen = name->len; 437 if (!xfs_inode_hasattr(dp))
438 return ENOATTR;
439
440 error = xfs_attr_name_to_xname(&xname, name);
441 if (error)
442 return error;
443
444 memset(&args, 0, sizeof(args));
445 args.name = xname.name;
446 args.namelen = xname.len;
434 args.flags = flags; 447 args.flags = flags;
435 args.hashval = xfs_da_hashname(args.name, args.namelen); 448 args.hashval = xfs_da_hashname(args.name, args.namelen);
436 args.dp = dp; 449 args.dp = dp;
@@ -446,9 +459,6 @@ xfs_attr_remove_int(xfs_inode_t *dp, struct xfs_name *name, int flags)
446 */ 459 */
447 args.op_flags = XFS_DA_OP_OKNOENT; 460 args.op_flags = XFS_DA_OP_OKNOENT;
448 461
449 /*
450 * Attach the dquots to the inode.
451 */
452 error = xfs_qm_dqattach(dp, 0); 462 error = xfs_qm_dqattach(dp, 0);
453 if (error) 463 if (error)
454 return error; 464 return error;
@@ -477,7 +487,7 @@ xfs_attr_remove_int(xfs_inode_t *dp, struct xfs_name *name, int flags)
477 XFS_ATTRRM_SPACE_RES(mp), 0); 487 XFS_ATTRRM_SPACE_RES(mp), 0);
478 if (error) { 488 if (error) {
479 xfs_trans_cancel(args.trans, 0); 489 xfs_trans_cancel(args.trans, 0);
480 return(error); 490 return error;
481 } 491 }
482 492
483 xfs_ilock(dp, XFS_ILOCK_EXCL); 493 xfs_ilock(dp, XFS_ILOCK_EXCL);
@@ -487,35 +497,26 @@ xfs_attr_remove_int(xfs_inode_t *dp, struct xfs_name *name, int flags)
487 */ 497 */
488 xfs_trans_ijoin(args.trans, dp, 0); 498 xfs_trans_ijoin(args.trans, dp, 0);
489 499
490 /*
491 * Decide on what work routines to call based on the inode size.
492 */
493 if (!xfs_inode_hasattr(dp)) { 500 if (!xfs_inode_hasattr(dp)) {
494 error = XFS_ERROR(ENOATTR); 501 error = XFS_ERROR(ENOATTR);
495 goto out; 502 } else if (dp->i_d.di_aformat == XFS_DINODE_FMT_LOCAL) {
496 }
497 if (dp->i_d.di_aformat == XFS_DINODE_FMT_LOCAL) {
498 ASSERT(dp->i_afp->if_flags & XFS_IFINLINE); 503 ASSERT(dp->i_afp->if_flags & XFS_IFINLINE);
499 error = xfs_attr_shortform_remove(&args); 504 error = xfs_attr_shortform_remove(&args);
500 if (error) {
501 goto out;
502 }
503 } else if (xfs_bmap_one_block(dp, XFS_ATTR_FORK)) { 505 } else if (xfs_bmap_one_block(dp, XFS_ATTR_FORK)) {
504 error = xfs_attr_leaf_removename(&args); 506 error = xfs_attr_leaf_removename(&args);
505 } else { 507 } else {
506 error = xfs_attr_node_removename(&args); 508 error = xfs_attr_node_removename(&args);
507 } 509 }
508 if (error) { 510
511 if (error)
509 goto out; 512 goto out;
510 }
511 513
512 /* 514 /*
513 * If this is a synchronous mount, make sure that the 515 * If this is a synchronous mount, make sure that the
514 * transaction goes to disk before returning to the user. 516 * transaction goes to disk before returning to the user.
515 */ 517 */
516 if (mp->m_flags & XFS_MOUNT_WSYNC) { 518 if (mp->m_flags & XFS_MOUNT_WSYNC)
517 xfs_trans_set_sync(args.trans); 519 xfs_trans_set_sync(args.trans);
518 }
519 520
520 if ((flags & ATTR_KERNOTIME) == 0) 521 if ((flags & ATTR_KERNOTIME) == 0)
521 xfs_trans_ichgtime(args.trans, dp, XFS_ICHGTIME_CHG); 522 xfs_trans_ichgtime(args.trans, dp, XFS_ICHGTIME_CHG);
@@ -527,45 +528,17 @@ xfs_attr_remove_int(xfs_inode_t *dp, struct xfs_name *name, int flags)
527 error = xfs_trans_commit(args.trans, XFS_TRANS_RELEASE_LOG_RES); 528 error = xfs_trans_commit(args.trans, XFS_TRANS_RELEASE_LOG_RES);
528 xfs_iunlock(dp, XFS_ILOCK_EXCL); 529 xfs_iunlock(dp, XFS_ILOCK_EXCL);
529 530
530 return(error); 531 return error;
531 532
532out: 533out:
533 if (args.trans) 534 if (args.trans) {
534 xfs_trans_cancel(args.trans, 535 xfs_trans_cancel(args.trans,
535 XFS_TRANS_RELEASE_LOG_RES|XFS_TRANS_ABORT); 536 XFS_TRANS_RELEASE_LOG_RES|XFS_TRANS_ABORT);
536 xfs_iunlock(dp, XFS_ILOCK_EXCL);
537 return(error);
538}
539
540int
541xfs_attr_remove(
542 xfs_inode_t *dp,
543 const unsigned char *name,
544 int flags)
545{
546 int error;
547 struct xfs_name xname;
548
549 XFS_STATS_INC(xs_attr_remove);
550
551 if (XFS_FORCED_SHUTDOWN(dp->i_mount))
552 return (EIO);
553
554 error = xfs_attr_name_to_xname(&xname, name);
555 if (error)
556 return error;
557
558 xfs_ilock(dp, XFS_ILOCK_SHARED);
559 if (!xfs_inode_hasattr(dp)) {
560 xfs_iunlock(dp, XFS_ILOCK_SHARED);
561 return XFS_ERROR(ENOATTR);
562 } 537 }
563 xfs_iunlock(dp, XFS_ILOCK_SHARED); 538 xfs_iunlock(dp, XFS_ILOCK_EXCL);
564 539 return error;
565 return xfs_attr_remove_int(dp, &xname, flags);
566} 540}
567 541
568
569/*======================================================================== 542/*========================================================================
570 * External routines when attribute list is inside the inode 543 * External routines when attribute list is inside the inode
571 *========================================================================*/ 544 *========================================================================*/