[PATCH 3/3] XFS: Print error when unable to allocate inodes or out of free inodes.
Raghavendra D Prabhu
raghu.prabhu13 at gmail.com
Fri Sep 21 02:16:44 CDT 2012
Hi,
* On Wed, Sep 12, 2012 at 09:21:44AM +1000, Dave Chinner <david at fromorbit.com> wrote:
>On Wed, Sep 12, 2012 at 03:43:24AM +0530, raghu.prabhu13 at gmail.com wrote:
>> From: Raghavendra D Prabhu <rprabhu at wnohang.net>
>>
>> When xfs_dialloc is unable to allocate required number of inodes or there are no
>> AGs with free inodes, printk the error in ratelimited manner.
>>
>> Signed-off-by: Raghavendra D Prabhu <rprabhu at wnohang.net>
>> ---
>> fs/xfs/xfs_ialloc.c | 19 +++++++++++++++----
>> 1 file changed, 15 insertions(+), 4 deletions(-)
>>
>> diff --git a/fs/xfs/xfs_ialloc.c b/fs/xfs/xfs_ialloc.c
>> index e75a39d..034131b 100644
>> --- a/fs/xfs/xfs_ialloc.c
>> +++ b/fs/xfs/xfs_ialloc.c
>> @@ -990,8 +990,11 @@ xfs_dialloc(
>> goto out_error;
>>
>> xfs_perag_put(pag);
>> - *inop = NULLFSINO;
>> - return 0;
>> +
>> + xfs_err_ratelimited(mp,
>> + "Unable to allocate inodes in AG %d: Required %d, Current %llu, Maximum %llu",
>> + agno, XFS_IALLOC_INODES(mp), mp->m_sb.sb_icount, mp->m_maxicount);
>> + goto out_spc;
>
>This changes the error to be returned from 0 to ENOSPC. Adding error
>messages shouldn't change the logic of the code.
1) Yes, there is a confusion regarding that.
>
>Also, you might want tolook at how ENOSPC is returned from
>xfs_ialloc_ag_alloc(). it only occurs when:
>
> if (mp->m_maxicount &&
> mp->m_sb.sb_icount + newlen > mp->m_maxicount) {
>
>i.e. it is exactly the same error case as the "noroom" error below.
>It has nothing to do with being unable to allocate inodes in the
>specific AG - the global inode count is too high. IOWs, the error
>message is not correct.
Now, in xfs_dialloc
if (mp->m_maxicount &&
mp->m_sb.sb_icount + XFS_IALLOC_INODES(mp) > mp->m_maxicount) {
noroom = 1;
okalloc = 0;
}
why does it not make sense to bail out with ENOSPC then itself? I
mean, what is the point of the loop when there is no room
(noroom=1) and no allocations are allowed (okalloc = 0), also
since the xfs_ialloc_ag_alloc in the loop uses same global logic
to return.
>
>Also, 80 columns.
>
>> }
>>
>> if (ialloced) {
>> @@ -1016,11 +1019,19 @@ nextag:
>> if (++agno == mp->m_sb.sb_agcount)
>> agno = 0;
>> if (agno == start_agno) {
>> - *inop = NULLFSINO;
>> - return noroom ? ENOSPC : 0;
>> + if (noroom) {
>> + xfs_err_ratelimited(mp,
>> + "Out of AGs with free inodes: Required %d, Current %llu, Maximum %llu",
>> + XFS_IALLOC_INODES(mp), mp->m_sb.sb_icount, mp->m_maxicount);
>
>The error message here is misleading - the error is that we've
>exceeded the maximum inode count for the filesystem (same as the
>above error message case), so no further allocations are allowed.
>
>What about the !noroom case? Isn't that a real ENOSPC condition?
>i.e. we've tried to allocate inodes in every AG and yet we've failed
>in all of them because there is no aligned, contiguous free space in
>any of the AGs. Shouldn't that emit an appropriate warning?
The warning is already emitted in call to xfs_ialloc_ag_select.
Now, what does inop = NULLFSINO, noroom = 0 and return value of 0 mean,
from the call chain of xfs_dir_ialloc -> xfs_ialloc ->
xfs_dialloc
I see that, it is a true ENOSPC only if both the buffer pointed
by ialloc_context and the inode are NULL or there is an error
returned, in former case (noroom=0) xfs_dir_ialloc retries the
allocation (ie. when AGI buffer is non-NULL).
Now, in case of global inode exhaustion, it is hard error which
can be fixed only by remounting with inode64 and nothing else
will do, hence, I think ENOSPC must be returned as error instead
of 0. (also in case of point #1 above)
So, are the assumptions made above correct?
>
>> + goto out_spc;
>> + }
>> + return 0;
>> }
>> }
>>
>> +out_spc:
>> + *inop = NULLFSINO;
>> + return ENOSPC;
>> out_alloc:
>> *IO_agbp = NULL;
>> return xfs_dialloc_ag(tp, agbp, parent, inop);
>
>Default behaviour on a loop break is to allocate inodes, not return
>ENOSPC.
>
>BTW, there's no need to cc LKML for XFS specific patches. LKML is
>noisy enough as it is without unnecessary cross-posts....
>
>Cheers,
>
>Dave.
>--
>Dave Chinner
>david at fromorbit.com
>
Regards,
--
Raghavendra Prabhu
GPG Id : 0xD72BE977
Fingerprint: B93F EBCB 8E05 7039 CD3C A4B8 A616 DCA1 D72B E977
www: wnohang.net
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 490 bytes
Desc: not available
URL: <http://oss.sgi.com/pipermail/xfs/attachments/20120921/14a73fff/attachment.sig>
More information about the xfs
mailing list