diff options
-rw-r--r-- | fs/xfs/xfs_attr.c | 51 |
1 files changed, 23 insertions, 28 deletions
diff --git a/fs/xfs/xfs_attr.c b/fs/xfs/xfs_attr.c index 9d91af4929b1..49fac8d6db12 100644 --- a/fs/xfs/xfs_attr.c +++ b/fs/xfs/xfs_attr.c | |||
@@ -111,6 +111,17 @@ xfs_attr_name_to_xname( | |||
111 | return 0; | 111 | return 0; |
112 | } | 112 | } |
113 | 113 | ||
114 | STATIC int | ||
115 | xfs_inode_hasattr( | ||
116 | struct xfs_inode *ip) | ||
117 | { | ||
118 | if (!XFS_IFORK_Q(ip) || | ||
119 | (ip->i_d.di_aformat == XFS_DINODE_FMT_EXTENTS && | ||
120 | ip->i_d.di_anextents == 0)) | ||
121 | return 0; | ||
122 | return 1; | ||
123 | } | ||
124 | |||
114 | /*======================================================================== | 125 | /*======================================================================== |
115 | * Overall external interface routines. | 126 | * Overall external interface routines. |
116 | *========================================================================*/ | 127 | *========================================================================*/ |
@@ -122,10 +133,8 @@ xfs_attr_fetch(xfs_inode_t *ip, struct xfs_name *name, | |||
122 | xfs_da_args_t args; | 133 | xfs_da_args_t args; |
123 | int error; | 134 | int error; |
124 | 135 | ||
125 | if ((XFS_IFORK_Q(ip) == 0) || | 136 | if (!xfs_inode_hasattr(ip)) |
126 | (ip->i_d.di_aformat == XFS_DINODE_FMT_EXTENTS && | 137 | return ENOATTR; |
127 | ip->i_d.di_anextents == 0)) | ||
128 | return(ENOATTR); | ||
129 | 138 | ||
130 | /* | 139 | /* |
131 | * Fill in the arg structure for this request. | 140 | * Fill in the arg structure for this request. |
@@ -143,11 +152,7 @@ xfs_attr_fetch(xfs_inode_t *ip, struct xfs_name *name, | |||
143 | /* | 152 | /* |
144 | * Decide on what work routines to call based on the inode size. | 153 | * Decide on what work routines to call based on the inode size. |
145 | */ | 154 | */ |
146 | if (XFS_IFORK_Q(ip) == 0 || | 155 | if (ip->i_d.di_aformat == XFS_DINODE_FMT_LOCAL) { |
147 | (ip->i_d.di_aformat == XFS_DINODE_FMT_EXTENTS && | ||
148 | ip->i_d.di_anextents == 0)) { | ||
149 | error = XFS_ERROR(ENOATTR); | ||
150 | } else if (ip->i_d.di_aformat == XFS_DINODE_FMT_LOCAL) { | ||
151 | error = xfs_attr_shortform_getvalue(&args); | 156 | error = xfs_attr_shortform_getvalue(&args); |
152 | } else if (xfs_bmap_one_block(ip, XFS_ATTR_FORK)) { | 157 | } else if (xfs_bmap_one_block(ip, XFS_ATTR_FORK)) { |
153 | error = xfs_attr_leaf_get(&args); | 158 | error = xfs_attr_leaf_get(&args); |
@@ -523,9 +528,7 @@ xfs_attr_remove_int(xfs_inode_t *dp, struct xfs_name *name, int flags) | |||
523 | /* | 528 | /* |
524 | * Decide on what work routines to call based on the inode size. | 529 | * Decide on what work routines to call based on the inode size. |
525 | */ | 530 | */ |
526 | if (XFS_IFORK_Q(dp) == 0 || | 531 | if (!xfs_inode_hasattr(dp)) { |
527 | (dp->i_d.di_aformat == XFS_DINODE_FMT_EXTENTS && | ||
528 | dp->i_d.di_anextents == 0)) { | ||
529 | error = XFS_ERROR(ENOATTR); | 532 | error = XFS_ERROR(ENOATTR); |
530 | goto out; | 533 | goto out; |
531 | } | 534 | } |
@@ -595,11 +598,9 @@ xfs_attr_remove( | |||
595 | return error; | 598 | return error; |
596 | 599 | ||
597 | xfs_ilock(dp, XFS_ILOCK_SHARED); | 600 | xfs_ilock(dp, XFS_ILOCK_SHARED); |
598 | if (XFS_IFORK_Q(dp) == 0 || | 601 | if (!xfs_inode_hasattr(dp)) { |
599 | (dp->i_d.di_aformat == XFS_DINODE_FMT_EXTENTS && | ||
600 | dp->i_d.di_anextents == 0)) { | ||
601 | xfs_iunlock(dp, XFS_ILOCK_SHARED); | 602 | xfs_iunlock(dp, XFS_ILOCK_SHARED); |
602 | return(XFS_ERROR(ENOATTR)); | 603 | return XFS_ERROR(ENOATTR); |
603 | } | 604 | } |
604 | xfs_iunlock(dp, XFS_ILOCK_SHARED); | 605 | xfs_iunlock(dp, XFS_ILOCK_SHARED); |
605 | 606 | ||
@@ -615,9 +616,7 @@ xfs_attr_list_int(xfs_attr_list_context_t *context) | |||
615 | /* | 616 | /* |
616 | * Decide on what work routines to call based on the inode size. | 617 | * Decide on what work routines to call based on the inode size. |
617 | */ | 618 | */ |
618 | if (XFS_IFORK_Q(dp) == 0 || | 619 | if (!xfs_inode_hasattr(dp)) { |
619 | (dp->i_d.di_aformat == XFS_DINODE_FMT_EXTENTS && | ||
620 | dp->i_d.di_anextents == 0)) { | ||
621 | error = 0; | 620 | error = 0; |
622 | } else if (dp->i_d.di_aformat == XFS_DINODE_FMT_LOCAL) { | 621 | } else if (dp->i_d.di_aformat == XFS_DINODE_FMT_LOCAL) { |
623 | error = xfs_attr_shortform_list(context); | 622 | error = xfs_attr_shortform_list(context); |
@@ -810,12 +809,10 @@ xfs_attr_inactive(xfs_inode_t *dp) | |||
810 | ASSERT(! XFS_NOT_DQATTACHED(mp, dp)); | 809 | ASSERT(! XFS_NOT_DQATTACHED(mp, dp)); |
811 | 810 | ||
812 | xfs_ilock(dp, XFS_ILOCK_SHARED); | 811 | xfs_ilock(dp, XFS_ILOCK_SHARED); |
813 | if ((XFS_IFORK_Q(dp) == 0) || | 812 | if (!xfs_inode_hasattr(dp) || |
814 | (dp->i_d.di_aformat == XFS_DINODE_FMT_LOCAL) || | 813 | dp->i_d.di_aformat == XFS_DINODE_FMT_LOCAL) { |
815 | (dp->i_d.di_aformat == XFS_DINODE_FMT_EXTENTS && | ||
816 | dp->i_d.di_anextents == 0)) { | ||
817 | xfs_iunlock(dp, XFS_ILOCK_SHARED); | 814 | xfs_iunlock(dp, XFS_ILOCK_SHARED); |
818 | return(0); | 815 | return 0; |
819 | } | 816 | } |
820 | xfs_iunlock(dp, XFS_ILOCK_SHARED); | 817 | xfs_iunlock(dp, XFS_ILOCK_SHARED); |
821 | 818 | ||
@@ -848,10 +845,8 @@ xfs_attr_inactive(xfs_inode_t *dp) | |||
848 | /* | 845 | /* |
849 | * Decide on what work routines to call based on the inode size. | 846 | * Decide on what work routines to call based on the inode size. |
850 | */ | 847 | */ |
851 | if ((XFS_IFORK_Q(dp) == 0) || | 848 | if (!xfs_inode_hasattr(dp) || |
852 | (dp->i_d.di_aformat == XFS_DINODE_FMT_LOCAL) || | 849 | dp->i_d.di_aformat == XFS_DINODE_FMT_LOCAL) { |
853 | (dp->i_d.di_aformat == XFS_DINODE_FMT_EXTENTS && | ||
854 | dp->i_d.di_anextents == 0)) { | ||
855 | error = 0; | 850 | error = 0; |
856 | goto out; | 851 | goto out; |
857 | } | 852 | } |